{"version":3,"sources":["assets/images/token-logo.png","assets/images/big_unicorn.png","assets/images/xl_uni.png","assets/images/noise.png","assets/images/coinbaseWalletIcon.svg","assets/images/fortmaticIcon.png","assets/images/portisIcon.png","assets/images/walletConnectIcon.svg","assets/images sync /^/.//.*$","assets/images/metamask.png","assets/images/ethereum-logo.png","assets/svg/logo.png","assets/svg/logo_white.png","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/circle-grey.svg","assets/images/circle.svg","assets/images/dropdown-blue.svg","assets/images/dropdown.svg","assets/images/dropup-blue.svg","assets/images/link.svg","assets/images/magnifying-glass.svg","assets/images/menu.svg","assets/images/plus-blue.svg","assets/images/plus-grey.svg","assets/images/question-mark.svg","assets/images/question.svg","assets/images/spinner.svg","assets/images/token-list-logo.png","assets/images/token-list/lists-dark.png","assets/images/token-list/lists-light.png","assets/images/trustWallet.png","assets/images/x.svg","connectors/Fortmatic.ts","connectors/NetworkConnector.ts","connectors/index.ts","constants/proposals/index.ts","constants/proposals/uniswap_grants.ts","constants/index.ts","hooks/index.ts","components/Blocklist/index.tsx","i18n.ts","components/analytics/GoogleAnalyticsReporter.tsx","components/Modal/index.tsx","components/Column/index.tsx","components/earn/styled.ts","components/Row/index.tsx","constants/flashLoan/index.ts","data/Pool.ts","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","constants/abis/erc20.ts","constants/multicall/index.ts","constants/v1/index.ts","constants/lend/index.ts","utils/index.ts","hooks/useContract.ts","data/CToken.ts","components/SearchModal/filtering.ts","hooks/Tokens.ts","state/user/actions.ts","state/user/hooks.tsx","theme/components.tsx","theme/index.tsx","components/Button/index.tsx","state/transactions/actions.ts","state/transactions/hooks.tsx","state/claim/hooks.ts","utils/isZero.ts","hooks/useDebounce.ts","hooks/useENSName.ts","hooks/useENS.ts","hooks/useENSAddress.ts","components/AddressInputPanel/index.tsx","hooks/useWindowSize.ts","components/Confetti/index.tsx","components/claim/AddressClaimModal.tsx","hooks/useToggledVersion.ts","constants/abis/staking-rewards.ts","hooks/useParsedQueryString.ts","data/V1.ts","utils/wrappedCurrency.ts","data/Reserves.ts","hooks/Trades.ts","state/swap/actions.ts","utils/prices.ts","state/swap/hooks.ts","hooks/useCurrentBlockTimestamp.ts","state/stake/hooks.ts","state/wallet/hooks.ts","components/Card/index.tsx","webpack:///./src/assets/images/menu.svg?4992","hooks/useOnClickOutside.tsx","components/Menu/index.tsx","hooks/useSocksBalance.ts","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/WalletModal/Option.tsx","components/WalletModal/PendingView.tsx","components/WalletModal/index.tsx","components/Web3Status/index.tsx","components/claim/ClaimModal.tsx","components/swap/styleds.tsx","data/TotalSupply.ts","utils/computeUniCirculation.ts","utils/useUSDCPrice.ts","components/Header/UniBalanceContent.tsx","components/Header/index.tsx","components/Header/Polling.tsx","components/Header/URLWarning.tsx","components/Web3ReactManager/index.tsx","theme/DarkModeQueryParamReader.tsx","components/TransactionConfirmationModal/index.tsx","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/SearchModal/ImportToken.tsx","state/lists/actions.ts","utils/getTokenList.ts","utils/resolveENSContentHash.ts","hooks/useFetchListCallback.ts","hooks/useColor.ts","components/Toggle/ListToggle.tsx","components/SearchModal/ManageLists.tsx","utils/listVersionLabel.ts","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/TransactionSettings/FlashLoanTransactionSettings.tsx","components/Settings/FlashLoanSettings.tsx","state/mint/actions.ts","components/NavigationTabs/index.tsx","utils/currencyId.ts","components/FlashLoanPositionCard/index.tsx","data/Allowances.ts","hooks/useApproveCallback.ts","state/flashLoanMint/actions.ts","hooks/useTransactionDeadline.ts","state/flashLoanMint/hooks.ts","utils/maxAmountSpend.ts","pages/AppBody.tsx","pages/Pool/styleds.tsx","pages/AddFlashLoanLiquidity/ConfirmAddModalBottom.tsx","pages/AddFlashLoanLiquidity/PoolPriceBar.tsx","components/swap/UnsupportedCurrencyFooter.tsx","pages/AddFlashLoanLiquidity/index.tsx","pages/AddFlashLoanLiquidity/redirects.tsx","components/deerEarn/styled.ts","components/deerEarn/PoolCard.tsx","pages/DeerEarn/Countdown.tsx","pages/DeerEarn/index.tsx","hooks/useIsArgentWallet.ts","constants/abis/argent-wallet-detector.ts","components/ProgressSteps/index.tsx","components/ModalViews/index.tsx","components/deerEarn/StakingDeerModal.tsx","components/FormattedCurrencyAmount/index.tsx","components/deerEarn/UnstakingDeerModal.tsx","components/deerEarn/ClaimDeerRewardModal.tsx","pages/DeerEarn/Manage.tsx","pages/FlashLoanPool/index.tsx","pages/FlashLoanPoolFinder/index.tsx","components/Slider/index.tsx","state/flashLoanBurn/actions.ts","state/flashLoanBurn/hooks.ts","pages/RemoveFlashLoanLiquidity/index.tsx","utils/useDebouncedChangeHandler.tsx","pages/DeerVote/styled.tsx","state/governance/hooks.ts","components/deerVote/DelegateModal.tsx","pages/DeerVote/index.tsx","components/deerVote/VoteModal.tsx","pages/DeerVote/VotePage.tsx","pages/FlashLoanPool/redirects.tsx","components/flashLoan/styleds.tsx","components/flashLoan/FlashLoanModalFooter.tsx","components/flashLoan/FlashLoanModalHeader.tsx","components/flashLoan/ConfirmFlashLoanModal.tsx","components/flashLoan/AdvancedFlashLoanDetails.tsx","components/flashLoan/AdvancedFlashLoanDetailsDropdown.tsx","components/TokenWarningModal/index.tsx","components/flashLoan/FlashLoanHeader.tsx","hooks/useSwapCallback.ts","state/flashLoan/actions.ts","state/flashLoan/hooks.ts","components/DataInputPanel/index.tsx","pages/FlashLoan/index.tsx","components/MarketBar/index.tsx","components/Summary/index.tsx","components/Switch/index.tsx","components/CurrencyIcon/index.tsx","components/LendInputPanel/index.tsx","state/lending/actions.ts","state/application/reducer.ts","state/global/actions.ts","state/user/reducer.ts","state/burn/actions.ts","state/transactions/reducer.ts","state/swap/reducer.ts","state/flashLoan/reducer.ts","state/mint/reducer.ts","state/flashLoanMint/reducer.ts","state/lists/reducer.ts","state/burn/reducer.ts","state/flashLoanBurn/reducer.ts","state/multicall/reducer.ts","state/lending/reducer.ts","state/index.ts","state/lending/hooks.ts","components/DoubleAssetLogo/index.tsx","components/Skeleton/index.tsx","components/BorrowMarkets/index.tsx","components/LendModal/index.tsx","components/SupplyMarkets/index.tsx","pages/Lend/index.tsx","pages/App.tsx","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/blue-loader.svg"],"names":["module","exports","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","CHAIN_ID_NETWORK_ARGUMENT","ChainId","MAINNET","undefined","ROPSTEN","RINKEBY","KOVAN","FortmaticConnector","this","fortmatic","Fortmatic","default","apiKey","chainId","provider","getProvider","pollForOverlayReady","Promise","interval","setInterval","overlayReady","clearInterval","emit","all","enable","then","accounts","account","FortmaticConnectorCore","RequestError","message","data","MiniRpcProvider","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","jsonrpc","catch","toString","promise","push","setTimeout","parsed","URL","pathname","NetworkConnector","urls","defaultChainId","invariant","length","supportedChainIds","k","Number","providers","currentChainId","accumulator","AbstractConnector","NETWORK_URL","process","FORMATIC_KEY","PORTIS_ID","NETWORK_CHAIN_ID","parseInt","networkLibrary","network","injected","InjectedConnector","walletconnect","WalletConnectConnector","rpc","1","bridge","qrcode","pollingInterval","portis","PortisConnector","dAppId","networks","walletlink","WalletLinkConnector","appName","appLogoUrl","PRELOADED_PROPOSALS","Map","ZERO_ADDRESS","USDC","Token","USDT","COMP","AMPL","WBTC","MKR","DAI","GOVERNANCE_ADDRESS","UNI_ADDRESS","UNI","GÖRLI","DEER_ADDRESS","DEER","COMMON_CONTRACT_NAMES","MERKLE_DISTRIBUTOR_ADDRESS","WETH_ONLY","WETH","SUGGESTED_BASES","address","PINNED_POOLS","SUPPORTED_WALLETS","INJECTED","connector","name","iconName","description","href","color","primary","METAMASK","WALLET_CONNECT","mobile","WALLET_LINK","COINBASE_LINK","mobileOnly","FORTMATIC","Portis","BIG_INT_SECONDS_IN_WEEK","JSBI","BigInt","BIG_INT_ZERO","ONE_BIPS","Percent","BIPS_BASE","MIN_ETH","exponentiate","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","AnimatedDialogOverlay","animated","DialogOverlay","StyledDialogOverlay","styled","theme","modalBG","AnimatedDialogContent","DialogContent","StyledDialogContent","minHeight","maxHeight","isOpen","rest","attrs","bg1","transparentize","shadow1","css","mediaWidth","upToMedium","upToSmall","Modal","onDismiss","initialFocusRef","fadeTransition","useTransition","config","duration","from","opacity","enter","leave","useSpring","y","mass","tension","friction","set","bind","useGesture","onDrag","state","down","movement","velocity","direction","key","props","style","isMobile","transform","interpolate","aria-label","tabIndex","Column","div","ColumnCenter","AutoColumn","gap","justify","DataCard","CardBGImage","span","uImage","desaturate","CardBGImageSmaller","xlUnicorn","CardNoise","noise","CardSection","disabled","Break","Row","Box","width","align","padding","border","borderRadius","RowBetween","RowFlat","AutoRow","RowFixed","ROUTER_ADDRESS","ZERO","FIVE","POOL_ADDRESS_CACHE","parseBigintIsh","bigintIsh","Pool","tokenAmount","liquidityToken","token","getAddress","getCreate2Address","keccak256","pack","equals","totalSupply","liquidity","equal","raw","subtract","MINIMUM_LIQUIDITY","divide","multiply","reserve","greaterThan","InsufficientInputAmountError","TokenAmount","totalSupplyAdjusted","feeOn","kLast","involvesToken","lessThanOrEqual","kLastParsed","numerator","denominator","add","feeLiquidity","UNSUPPORTED_LIST_URLS","DEFAULT_LIST_OF_LISTS","DEFAULT_ACTIVE_LIST_URLS","sortByListPriority","urlA","urlB","first","includes","MAX_SAFE_INTEGER","second","WrappedTokenInfo","tokenInfo","tags","decimals","symbol","logoURI","EMPTY_LIST","listCache","WeakMap","listToTokenMap","list","get","tokens","tokenMap","tagId","filter","x","useAllLists","useSelector","lists","byUrl","combineMaps","map1","map2","3","4","5","42","useCombinedTokenMapFromUrls","slice","sort","allTokens","currentUrl","assign","useActiveListUrls","activeListUrls","useCombinedActiveList","DEFAULT_TOKEN_LIST","useCombinedInactiveList","allActiveListUrls","useInactiveListUrls","ApplicationModal","updateBlockNumber","createAction","setOpenModal","addPopup","removePopup","useBlockNumber","application","blockNumber","useModalOpen","modal","openModal","useToggleModal","open","dispatch","useDispatch","useCallback","useWalletModalToggle","WALLET","useToggleSelfClaimModal","SELF_CLAIM","useToggleDelegateModal","DELEGATE","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","ERC20_INTERFACE","Interface","ERC20_ABI","ERC20_BYTES32_ABI","MULTICALL_NETWORKS","V1_FACTORY_ADDRESSES","V1_FACTORY_ABI","V1_EXCHANGE_ABI","COMPTROLLER_ADDRESSES","ORACLE_ADDRESSES","MAXIMILLION_ADDRESSES","CTOKEN_LISTS","COMPTROLLER_ABI","CHAINLINK_PRICE_ORACLE_PROXY_ABI","isAddress","value","ETHERSCAN_PREFIXES","getEtherscanLink","type","prefix","shortenAddress","chars","substring","calculateGasMargin","mul","BigNumber","getContract","ABI","library","AddressZero","Contract","getSigner","connectUnchecked","getProviderOrSigner","getFlashLoanRouterContract","_","FLASH_LOAN_ROUTER_ADDRESS","IFlashLoanV1Router01ABI","getCERC20Contract","cTokenAddress","ICERC20ABI","getCEtherContract","ICEtherABI","getMaximillionContract","IMaximillionABI","getComptrollerContract","geGovContract","GOVERNANCE_ABI","ONE","ZERO_FRACTION","Fraction","ONE_HUNDRED","ONE_THOUSAND","ONE_MILLION","ONE_BILLION","ONE_TRILLION","APY_BASE","EXA_BASE","THOUSAND_BASE","MILLION_BASE","BILLION_BASE","LIMIT_BASE","ONE_THOUSAND_VALUE","ONE_MILLION_VALUE","ONE_BILLION_VALUE","ONE_TRILLION_VALUE","getSupplyTotalBalance","allMarketsAsset","supplyTotalBalance","i","getSupplyBalanceJSBI","getBorrowTotalBalance","borrowTotalBalance","getBorrowBalanceJSBI","formatData","val","getNetApy","allBorrowUnderlyingAssets","sumAssets","sumUnderlyingAssets","supplyAssets","getSupplyApy","borrowAssets","getBorrowApy","lessThan","showDollarValue","toFixed","greaterThanOrEqual","useContract","withSignerIfPossible","useV1FactoryContract","useTokenContract","tokenAddress","useENSRegistrarContract","ENS_ABI","useENSResolverContract","ENS_PUBLIC_RESOLVER_ABI","useFlashLoanPoolContract","poolAddress","IFlashLoanV1PoolABI","useMulticallContract","MULTICALL_ABI","useMerkleDistributorContract","MERKLE_DISTRIBUTOR_ABI","useGovernanceContract","useUniContract","UNI_ABI","useDeerContract","useStakingContract","stakingAddress","STAKING_REWARDS_ABI","CTokenState","CTOKEN_INTERFACE","ICTokenABI","EIGHT","COLLATERAL_FACTOR_MANTISSA","UNDERLYING_PRICE_BASE","CToken","Math","pow","cAddress","cSymbol","cName","supplyRatePerBlock","borrowRatePerBlock","balanceUnderlying","supplyBalance","borrowBalance","exchangeRateMantissa","canBeCollateral","underlyingPrice","isListed","collateralFactorMantissa","logo0","logo1","cDecimals","other","totalRate","floor","DAYS_PER_YEAR","getSupplyBalanceAmount","getTotalSupplyBalanceAmount","useCTokens","cTokenList","accountArg","accountSnapshotaccountArg","cTokenAddresses","cTokenInfo","hasAccountMembershipArgs","membershipArgs","comptroller","useComptrollerContract","oracle","useOracleContract","supplyRatePerBlockResults","borrowRatePerBlockResults","balanceOfUnderlyingResults","borrowBalanceCurrentResults","accountSnapshotResults","totalSupplyResults","cashResults","membershipResults","underlyingPriceResults","marketsResults","supplyRatePerBlockResult","supplyRatePerBlockValue","supplyRatePerBlockResultLoading","borrowRatePerBlockValue","borrowRatePerBlockResultLoading","balanceUnderlyingValue","balanceUnderlyingResultLoading","borrowBalanceValue","borrowBalanceResultLoading","accountSnapshotValue","accountSnapshotResultLoading","totalSupplyValue","totalSupplyResultLoading","cashValue","cashResultLoading","membershipValue","membershipLoading","underlyingPriceValue","underlyingPriceLoading","marketsValue","marketsResultLoading","LOADING","EXISTS","NOT_EXISTS","filterTokens","searchingAddress","lowerSearchParts","toLowerCase","s","matchesSearch","sParts","p","some","sp","startsWith","endsWith","useTokensFromMap","includeUserAdded","userAddedTokens","useUserAddedTokens","mapWithoutUrls","newMap","useAllTokens","useAllInactiveTokens","inactiveTokens","activeTokensAddresses","useUnsupportedTokens","UNSUPPORTED_TOKEN_LIST","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","updateUserSingleHopOnly","updateUserSlippageTolerance","updateUserDeadline","addSerializedToken","removeSerializedToken","addSerializedPair","addSerializedPool","removeSerializedPair","toggleURLWarning","serializeToken","deserializeToken","serializedToken","useIsDarkMode","user","matchesDarkMode","userDarkMode","shallowEqual","useIsExpertMode","userExpertMode","serializedTokensMap","values","serializePool","pool","ButtonText","button","CloseIcon","warning","backgroundColor","red1","primary1","white","darken","text4","X","IconWrapper","size","marginRight","marginLeft","stroke","blue1","LinkStyledButton","text2","StyledInternalLink","Link","StyledLink","LinkIconWrapper","LinkIcon","LinkIconFeather","TrashIcon","Trash","text3","rotateImg","keyframes","UniTokenAnimated","img","ExternalLink","target","rel","handleClick","event","ctrlKey","metaKey","outboundLink","label","preventDefault","window","onClick","ExternalLinkIcon","rotate","Spinner","text1","CustomLightSpinner","HideSmall","upToExtraSmall","MEDIA_WIDTHS","upToLarge","mediaWidthTemplates","b","colors","darkMode","black","text5","bg2","bg3","bg4","bg5","advancedBG","primary2","primary3","primary4","primary5","primaryText1","secondary1","secondary2","secondary3","red2","red3","green1","yellow1","yellow2","SkeletonBG","ThemeProvider","themeObject","grids","sm","md","lg","flexColumnNoWrap","flexRowNoWrap","TextWrapper","Text","TYPE","fontWeight","fontSize","FixedGlobalStyle","createGlobalStyle","ThemedGlobalStyle","Base","RebassButton","ButtonPrimary","altDisabledStyle","ButtonLight","ButtonSecondary","ButtonOutlined","ButtonEmpty","ButtonConfirmedStyle","lighten","ButtonErrorStyle","ButtonConfirmed","confirmed","ButtonError","ButtonDropdownLight","display","alignItems","addTransaction","clearAllTransactions","finalizeTransaction","checkedTransaction","useTransactionAdder","summary","approval","claim","hash","useAllTransactions","transactions","isTransactionRecent","tx","Date","getTime","addedTime","useHasPendingApproval","spender","allTransactions","receipt","useUserHasSubmittedClaim","claimTxn","txnIndex","recipient","claimSubmitted","CLAIM_PROMISES","useUserClaimData","useState","claimInfo","setClaimInfo","formatted","res","fetchClaim","accountClaimInfo","useUserHasAvailableClaim","userClaimData","isClaimedResult","index","useUserUnclaimedAmount","canClaim","uni","amount","useClaimCallback","claimData","unClaimedAmount","distributorContract","claimCallback","args","proof","estimateGas","estimatedGasLimit","gasLimit","toSignificant","isZero","hexNumberString","useDebounce","delay","debouncedValue","setDebouncedValue","handler","clearTimeout","useENSName","debouncedAddress","ensNodeArgument","namehash","substr","resolverAddress","resolverAddressResult","changed","ENSName","useENS","nameOrAddress","validated","reverseLookup","lookup","ensName","debouncedName","addr","useENSAddress","InputPanel","ContainerRow","InputContainer","Input","input","AddressInputPanel","onChange","useContext","ThemeContext","t","useTranslation","handleInput","withoutSpaces","replace","className","autoComplete","autoCorrect","autoCapitalize","spellCheck","placeholder","pattern","isClient","getSize","innerWidth","height","innerHeight","Confetti","start","variant","windowSize","setWindowSize","handleResize","addEventListener","removeEventListener","useWindowSize","_variant","zIndex","numberOfPieces","recycle","run","confettiSource","h","w","initialVelocityX","initialVelocityY","gravity","tweenDuration","wind","ContentWrapper","ModalUpper","ConfirmOrLoadingWrapper","activeBG","ConfirmedIcon","AddressClaimModal","typed","setTyped","parsedAddress","attempting","setAttempting","unclaimedAmount","hasAvailableClaim","setHash","claimPending","transactionHash","useIsTransactionPending","claimConfirmed","wrappedOnDismiss","groupSeparator","paddingTop","mt","log","src","tokenLogo","Circle","alt","role","Version","STAKING_REWARDS_INTERFACE","STAKING_REWARDS_FACTORY_ABI","useParsedQueryString","useLocation","parseArrays","ignoreQueryPrefix","v2","Pair","useUserHasLiquidityInAllTokens","exchanges","factory","ix","useAllTokenV1Exchanges","balances","useTokenBalances","wrappedCurrency","wrappedCurrencyAmount","currencyAmount","unwrappedToken","PairState","PAIR_INTERFACE","IUniswapV2PairABI","POOL_INTERFACE","usePairs","currencies","currencyA","currencyB","tokenA","tokenB","reserves","INVALID","reserve0","reserve1","sortsBefore","token0","token1","usePools","usePool","Field","useIsFlashLoanTransactionUnsupported","currencyIn","unsupportedToken","tokenIn","selectCurrency","switchCurrencies","typeInput","replaceSwapState","setRecipient","BASE_FEE","FLASH_LOAN_BASE_FEE","ONE_HUNDRED_PERCENT","computeFlashLoanFee","realizedLPFee","quotient","CurrencyAmount","ether","tryParseAmount","typedValueParsed","parseUnits","useCurrentBlockTimestamp","STAKING_REWARDS_INFO","stakingRewardAddress","FLASH_LOAN_STAKING_REWARDS_INFO","useFlashLoanStakingInfo","poolToFilterBy","currentBlockTimestamp","info","stakingRewardInfo","deer","rewardsAddresses","earnedAmounts","totalSupplies","rewardRates","periodFinishes","rewardsAddress","balanceState","earnedAmountState","totalSupplyState","rewardRateState","periodFinishState","dummyPair","stakedAmount","totalStakedAmount","totalRewardRate","getHypotheticalRewardRate","individualRewardRate","periodFinishSeconds","toNumber","periodFinishMs","periodFinish","earnedAmount","rewardRate","useTotalUniEarned","stakingInfos","pairToFilterBy","useStakingInfo","stakingInfo","useETHBalances","uncheckedAddresses","multicallContract","useTokenBalancesWithLoadingIndicator","validatedTokens","vt","anyLoading","callState","useCTokenBalances","validatedTokenAddresses","ethBalance","useCTokenBalancesWithLoadingIndicator","useTokenBalance","tokenBalances","useCurrencyBalances","useCurrencyBalance","Card","LightCard","GreyCard","OutlineCard","YellowCard","BlueCardStyled","BlueCard","_extends","arguments","source","prototype","hasOwnProperty","apply","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","createElement","d","strokeWidth","strokeLinecap","strokeLinejoin","_ref","svgRef","title","viewBox","fill","ref","ForwardRef","forwardRef","useOnClickOutside","node","handlerRef","useRef","handleClickOutside","contains","document","StyledMenuIcon","MenuIcon","StyledMenuButton","StyledMenu","MenuFlyout","MenuItem","Menu","MENU","toggle","useSocksBalance","UNISOCKS_ABI","StyledIdenticonContainer","Identicon","innerHTML","appendChild","Jazzicon","StyledSVG","svg","Loader","xmlns","x1","y1","x2","y2","usePrevious","CopyIcon","TransactionStatusText","CopyHelper","timeout","isCopied","setIsCopied","staticCopy","text","didCopy","copy","hide","useCopyClipboard","setCopied","toCopy","TransactionWrapper","TransactionState","pending","Transaction","HeaderRow","UpperSection","InfoCard","AccountGroupingRow","AccountSection","YourAccount","LowerSection","AccountControl","AddressLink","CloseColor","Close","WalletName","TransactionListWrapper","WalletAction","MainWalletAction","renderTransactions","AccountDetails","toggleWalletModal","pendingTransactions","confirmedTransactions","openOptions","getStatusIcon","WalletConnectIcon","CoinbaseWalletIcon","FortmaticIcon","PortisIcon","showPortis","clearAllTransactionsCallback","ethereum","formatConnectorName","close","hasENS","isENS","mb","justifyContent","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","Blurb","OptionGrid","HoverText","WALLET_VIEWS","WalletModal","useWeb3React","activate","walletView","setWalletView","pendingWallet","setPendingWallet","pendingError","walletModalOpen","previousAccount","activePrevious","connectorPrevious","category","action","walletConnectProvider","wc","uri","UnsupportedChainIdError","on","web3","MetamaskIcon","getOptions","Web3StatusGeneric","Web3StatusError","Web3StatusConnect","faded","Web3StatusConnected","NetworkIcon","Activity","newTransactionsFirst","SOCK","marginTop","marginBottom","StatusIcon","Web3StatusInner","hasPendingTransactions","hasSocks","balance","useHasSocks","Web3Status","sortedRecentTransactions","ClaimModal","toggleClaimModal","nonLPAmount","flags","isSOCKS","isUser","isLP","ArrowWrapper","SectionBreak","BottomGrouping","Dots","severity","SwapCallbackErrorInner","SwapCallbackErrorInnerAlertTriangle","SwapCallbackError","useTotalSupply","withVesting","before","time","end","cliff","gt","gte","sub","useUSDCPrice","wrapped","ethPairState","ethPair","usdcPairState","usdcPair","usdcEthPairState","usdcEthPair","price","priceOf","Price","ethPairETHAmount","reserveOf","ethPairETHUSDCValue","quote","ethUsdcPrice","currencyEthPrice","usdcPrice","invert","StyledClose","UniBalanceContent","setShowUniBalanceModal","total","uniBalance","uniUnclaimed","uniUnHarvested","useAggregateUniBalance","uniToClaim","uniPrice","blockTimestamp","unclaimedUni","circulation","wholeAmount","STAKING_GENESIS","TREASURY_BEGIN_YEAR_1","TREASURY_BEGIN_YEAR_2","TREASURY_BEGIN_YEAR_3","TREASURY_BEGIN_YEAR_4","computeUniCirculation","to","HeaderFrame","HeaderControls","HeaderElement","HeaderElementWrap","HeaderLinks","AccountElement","UNIAmount","UNIWrapper","NetworkCard","BalanceText","Title","UniIcon","StyledNavLink","NavLink","activeClassName","StyledExternalLink","smallHide","NETWORK_LABELS","Header","userEthBalance","toggleSetDarkMode","useDarkModeManager","toggleDarkMode","availableClaim","showUniBalanceModal","showClaimPopup","CLAIM_POPUP","LogoDark","Logo","isActive","match","pointerEvents","flexShrink","pl","pr","StyledPolling","StyledPollingDot","rotate360","Polling","isMounted","setIsMounted","timer1","PhishAlert","URLWarning","useURLWarningToggle","showURLWarning","URLWarningVisible","hostname","MessageWrapper","Message","h2","Web3ReactManager","networkActive","networkError","activateNetwork","triedEager","tried","setTried","isAuthorized","useEagerConnect","suppress","handleChainChanged","handleAccountsChanged","removeListener","useInactiveListener","showLoader","setShowLoader","DarkModeQueryParamReader","Section","BottomSection","ConfirmationPendingContent","pendingText","textAlign","TransactionSubmittedContent","margin","ConfirmationModalContent","bottomContent","topContent","TransactionErrorContent","TransactionConfirmationModal","attemptingTxn","useLast","filterFn","last","setLast","useInterval","leading","savedCallback","tick","PopoverContainer","show","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","trim","ENS_NAME_REGEX","parseENSAddress","ensAddress","ensPath","uriToHttp","useHttpLocations","ens","resolvedContentHash","useENSContentHash","BAD_SRCS","srcs","refresh","onError","getTokenLogoURL","StyledEthereumLogo","StyledLogo","CurrencyLogo","uriLocations","EthereumLogo","BaseWrapper","disable","CommonBases","onSelect","selectedCurrency","selected","TextDot","Checkbox","PaddedColumn","SearchInput","Separator","SeparatorDark","StyledListLogo","ListLogo","useTheme","TokenSection","dim","CheckIcon","CheckCircle","NameOverflow","ImportRow","showImportView","setImportToken","inactiveTokenList","isAdded","activeTokens","useIsTokenActive","ml","mr","minWidth","currencyKey","StyledBalanceText","Tag","Balance","toExact","TagContainer","TokenTags","tag","join","CurrencyRow","isSelected","otherSelected","isOnSelectedList","defaultTokens","isTokenOnList","customAdded","justifySelf","CurrencyList","onCurrencySelect","otherCurrency","fixedListRef","showETH","itemData","Currency","itemKey","itemCount","itemSize","useTokenComparator","inverted","useAllTokenBalances","comparator","balanceComp","balanceA","balanceB","equalTo","balanceComparator","getTokenComparator","useToggle","initialState","setState","Footer","CurrencySearch","otherSelectedCurrency","showCommonBases","showManageView","fixedList","searchQuery","setSearchQuery","invertSearchOrder","isAddressSearch","searchToken","searchTokenIsAdded","tokenComparator","filteredTokens","filteredSortedTokens","sorted","symbolMatch","handleCurrencySelect","inputRef","checksummedInput","scrollTo","handleEnter","showExpanded","setShowExpanded","useFoundOnInactiveList","onKeyDown","flex","disableWidth","concat","position","bottom","left","WarningWrapper","highWarning","AddressText","ImportToken","onBack","setConfirmed","addToken","useAddUserToken","fromLists","cursor","checked","fetchTokenList","fulfilled","rejected","addList","removeList","enableList","disableList","acceptListUpdate","tokenListValidator","Ajv","allErrors","compile","schema","getTokenList","listUrl","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","ListRow","listsByUrl","pendingUpdate","listColor","useIsListActive","version","handleAcceptListUpdate","handleRemoveList","prompt","handleEnableList","handleDisableList","major","minor","patch","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","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","React","onUserInput","nextUserInput","inputMode","minLength","maxLength","DeadlineError","InputRow","CurrencySelect","LabelRow","Aligner","StyledDropDown","DropDown","hideInput","Container","StyledTokenName","StyledBalanceMax","CurrencyInputPanel","onMax","showMaxButton","disableCurrencySelect","hideBalance","pair","customBalanceText","modalOpen","setModalOpen","selectedCurrencyBalance","handleDismissSearch","FancyButton","OptionCustom","SlippageTabs","deadlineError","deadline","setDeadline","deadlineInput","setDeadlineInput","deadlineInputIsValid","parseCustomDeadline","valueAsInt","isNaN","InvalidInput","onBlur","paddingLeft","Settings","SettingsTab","SETTINGS","userDeadline","useUserTransactionTTL","ttl","setTtl","resetMintState","Tabs","ActiveText","StyledArrowLeft","ArrowLeft","FlashLoanPoolTabs","FindPoolTabs","AddRemoveTabs","creating","FixedHeightRow","StyledPositionCard","MinimalPositionCard","showUnwrapped","showMore","setShowMore","userPoolBalance","totalPoolTokens","poolTokenPercentage","tokenDeposited","getLiquidityValue","FullPositionCard","stakedBalance","userDefaultPoolBalance","as","useTokenAllowance","owner","allowance","ApprovalState","useApproveCallback","amountToApprove","currentAllowance","pendingApproval","approvalState","APPROVED","PENDING","NOT_APPROVED","UNKNOWN","approve","useExact","MaxUint256","estimatedGas","useCTokenApproveCallback","walletBalances","setAttemptingTxn","approveTokenWalletBalance","approveHash","setApproveHash","approvePendingText","setApprovePendingText","useTransactionDeadline","useMintState","flashLoanMint","maxAmountSpend","BodyWrapper","AppBody","ClickableText","MaxButton","ConfirmAddModalBottom","noLiquidity","parsedAmounts","onAdd","CURRENCY","PoolPriceBar","pt","DetailsFooter","UnsupportedCurrencyFooter","showDetails","setShowDetails","unsupportedTokens","AddFlashLoanLiquidity","history","oneCurrencyIsWETH","expertMode","independentField","typedValue","pairState","currencyBalances","independentAmount","liquidityMinted","getLiquidityMinted","useDerivedMintInfo","onFieldInput","field","useMintActionHandlers","isValid","showConfirm","setShowConfirm","txHash","setTxHash","formattedAmounts","maxAmounts","atMaxAmounts","approveCallback","router","parsedAmount","estimate","addLiquidityETH","toHexString","addLiquidity","modalHeader","lineHeight","modalBottom","newCurrencyId","toCurrencyId","handleDismissConfirmation","isCreate","addIsUnsupported","maxWidth","RedirectToAddLiquidity","RedirectFlashLoanAddLiquidity","StatContainer","showBackground","TopSection","DeerPoolCard","valueOfTotalStakedAmountInToken","isStaking","totalSupplyOfStakingToken","stakingTokenPool","USDPrice","valueOfTotalStakedAmountInUSDC","Countdown","exactEnd","begin","DAY","now","setTime","timeRemaining","timeUntilGenesis","timeUntilEnd","days","HOUR","hours","MINUTE","minutes","seconds","isFinite","padStart","PageWrapper","PoolSection","DataRow","DeerEarn","flashLoanStakingInfos","stakingRewardsExist","useIsArgentWallet","ARGENT_WALLET_DETECTOR_ABI","Grouping","CircleRow","Connector","prevConfirmed","ProgressCircles","steps","step","LoadingView","SubmittedView","HypotheticalRewardRate","StakingModal","userLiquidityUnstaked","setTypedValue","stakingToken","parsedInput","useDerivedStakeInfo","parsedAmountWrapped","hypotheticalRewardRate","dummyPool","pairContract","signatureData","setSignatureData","isArgentWallet","stakingContract","stake","stakeWithPermit","v","r","maxAmountInput","atMaxAmount","handleMax","liquidityAmount","nonces","nonce","EIP712Domain","domain","verifyingContract","Permit","types","primaryType","send","splitSignature","signature","CURRENCY_AMOUNT_MIN","FormattedCurrencyAmount","significantDigits","UnstakingModal","wrappedOndismiss","exit","ClaimRewardModal","getReward","PositionInfo","StyledDataCard","StyledBottomCard","PoolData","VoteCard","showAddLiquidityButton","showStakingModal","setShowStakingModal","showUnstakingModal","setShowUnstakingModal","showClaimRewardModal","setShowClaimRewardModal","disableTop","countUpAmount","countUpAmountPrevious","handleDepositClick","notEqual","isCounting","decimalPlaces","parseFloat","thousandsSeparator","TitleRow","ButtonRow","ResponsiveButtonPrimary","ResponsiveButtonSecondary","EmptyProposals","trackedTokenPools","pinnedPools","generatedPools","flatMap","savedSerializedPools","pools","userPools","forChain","poolId","combinedList","keyed","useTrackedTokenPools","tokenPoolsWithLiquidityTokens","tpwlt","v1PoolsBalances","fetchingV1PoolBalances","liquidityTokensWithBalances","v1Pools","v1IsLoading","V1Pool","allV1PoolsWithLiquidity","v1Pool","hasV1Liquidity","stakingInfosWithBalance","stakingPools","v1PoolsWithoutStakedAmount","stakingPool","FlashLoanPoolFider","showSearch","setShowSearch","setCurrency","poolState","addPool","serializedPool","usePoolAdder","validPoolNoLiquidity","hasPosition","handleSearchDismiss","prerequisiteMessage","justifyItems","StyledRangeInput","Slider","min","max","changeCallback","aria-labelledby","useBurnState","flashLoanBurn","RemoveFlashLoanLiquidity","relevantTokenBalances","userLiquidity","LIQUIDITY","liquidityValue","liquidityValues","percentToRemove","LIQUIDITY_PERCENT","useDerivedBurnInfo","_onUserInput","useBurnActionHandlers","showDetailed","setShowDetailed","poolContract","onLiquidityInput","onCurrencyInput","onRemove","oneCurrencyIsETH","methodNames","safeGasEstimates","indexOfSuccessfulEstimation","findIndex","safeGasEstimate","isBigNumber","liquidityPercentChangeCallback","handleSelectCurrency","debouncedMs","inner","setInner","timer","onChangeInner","newValue","useDebouncedChangeHandler","innerLiquidityPercentage","setInnerLiquidityPercentage","handleColorType","ProposalStatus","useAllProposalData","proposalCount","useProposalCount","govContract","proposalIndexes","formattedEvents","setFormattedEvents","filters","fromBlock","toBlock","eventParser","ethers","utils","GOV_ABI","getLogs","pastEvents","formattedEventData","eventParsed","parseLog","details","targets","signatures","calldata","calldatas","functionSig","defaultAbiCoder","reverse","fetchData","useDataFromEventLogs","allProposals","allProposalStates","proposer","forCount","formatUnits","forVotes","againstCount","againstVotes","startBlock","endBlock","StyledClosed","TextButton","DelegateModal","usingDelegate","setUsingDelegate","deerBalance","delegateCallback","deerContract","delegatee","delegate","useDeerDelegateCallback","Proposal","Button","ProposalNumber","ProposalTitle","WrapSmall","AddressButton","DeerVote","showDelegateModal","toggleDelegateModal","availableVotes","uniContract","votes","useUserVotes","userDelegatee","useDeerUserDelegatee","showUnlockVoting","propose","VoteModal","proposalId","support","voteCallback","castVote","useVoteCallback","useDeerUserVotes","ProposalInfo","CardWrapper","ProgressWrapper","Progress","percentageString","MarkDownWrapper","DetailText","ProposerAddressLink","VotePage","proposalData","allProposalData","useProposalData","setSupport","showVoteModal","VOTE","toggleVoteModal","currentTimestamp","currentBlock","endDate","DateTime","fromSeconds","local","totalVotes","forPercentage","againstPercentage","block","useUserDeerVotesAsOfBlock","showVotingButtons","useUserDelegatee","showLinkForUnlock","linkIfAddress","commonName","toLocaleString","DATETIME_FULL","maximumFractionDigits","RedirectPathToPoolOnly","TruncatedText","FlashLoanModalFooter","onConfirm","swapErrorMessage","disabledConfirm","FlashLoanModalHeader","ConfirmFlashLoanModal","confirmationContent","InfoLink","FlashLoanSummary","AdvancedFlashLoanDetails","AdvancedDetailsFooter","AdvancedFlashLoanDetailsDropdown","TokenWarningModal","handleDismiss","SwapCallbackState","StyledFlashLoanHeader","FlashLoanHeader","useFlashLoanCallback","recipientAddressOrName","swapCalls","recipientAddress","flashLoanMethods","toHex","flashLoanCallParameters","parameters","useFlashLoanCallArguments","VALID","gasEstimate","gasError","callStatic","callError","reason","estimatedCalls","successfulEstimation","el","errorCalls","inputSymbol","inputAmount","base","withRecipient","replaceFlashLoanState","setData","useFlashLoanState","flashLoan","BAD_RECIPIENT_ADDRESSES","useDerivedFlashLoanInfo","inputError","inputCurrencyId","INPUT","inputCurrency","recipientLookup","currencyBalance","noEnoughLiquidity","formattedTo","parseCurrencyFromURLParameter","urlParam","DATA_REGEX","queryParametersToSwapState","parsedQs","outputCurrency","validatedRecipient","validatedData","exactAmount","FlashLoan","loadedUrlParams","setResult","useDefaultsFromURLSearch","loadedInputCurrency","dismissTokenWarning","setDismissTokenWarning","urlLoadedTokens","handleConfirmTokenWarning","importTokensNotInDefault","swapInputError","parsedToken","parsedTokenAmount","onCurrencySelection","onChangeRecipient","onChangeData","useFlashLoanActionHandlers","handleTypeInput","tradeToConfirm","flashLoanErrorMessage","setFlashLoanState","userHasSpecifiedInputOutput","atMaxAmountInput","flashLoanCallback","flashLoanCallbackError","handleFlashLoan","handleConfirmDismiss","handleInputSelect","handleMaxInput","flashLoanIsUnsupported","MarketBarWrap","barColor","RateWrap","FillBar","fillColor","rate","MarketBar","showRate","SummaryCard","SummaryFrame","SummaryElement","SummaryTitle","SummaryContent","DotIcon","MarketBarTitle","Summary","limit","usedLimit","netApy","totalMarketSize","formaterSupplyTotalBalance","formaterNetAPY","formaterBorrowTotalBalance","formaterMarketSize","formaterRate","formaterLimit","paddingRight","ToggleWrap","StyledToggle","Switch","stopPropagation","LendField","safeMax","updateLendingToken","createReducer","popupList","builder","addCase","payload","removeAfterMs","popup","updateVersion","pairKey","token0Address","token1Address","userSingleHopOnly","userSlippageTolerance","pairs","timestamp","lastUpdateVersionTimestamp","serializedPair","tokenAAddress","tokenBAddress","txs","lastCheckedBlockNumber","confirmedTime","OUTPUT","outputCurrencyId","otherField","CURRENCY_A","otherTypedValue","NEW_LIST_STATE","lastInitializedDefaultListOfLists","getVersionUpgrade","VersionUpgrade","NONE","u","lastInitializedSet","l","Set","newListOfListsSet","has","listeners","callListeners","fetchingBlockNumber","lending","markets","PERSISTED_KEYS","store","configureStore","reducer","swap","mint","burn","middleware","getDefaultMiddleware","thunk","serializableCheck","save","states","preloadedState","load","useAllLendingMarket","getState","_hex","listToCTokenMap","DoubleAssetLogo","SkeletonWrap","Skeleton","MarketsCard","MarketsCardHeader","AssetWrap","AssetWrapLabels","AssetLabel","mobileHide","AssetItemWrap","AssetItem","AssetLogo","ItemWrap","ItemBottomWrap","MobileWrap","SymbolWrap","ItemPannel","marketCToken","ctoken","BorrowMarkets","allMarketCTokens","lendToken","setLendToken","showLendConfirmation","setShowLendConfirmation","TokenLoadState","setTokenLoadState","borrowedAsset","lt","borrowAsset","eq","lendMarket","BORROW","getBorrowBalanceAmount","TEN","StyledCloseIcon","ModalContentWrapper","ApproveWrap","TabWrap","TabItem","RateTitle","RatePanel","RateCalculation","LendModal","walletBalanceAmount","tabItemActive","setTabItemActive","lendInputValue","setLendInputValue","setPendingText","approvalTokenStatus","changedBorrowLimit","getUnderlyingPrice","parseInputAmount","SUPPLY","borrowLimit","getCollateralFactorMantissa","changedBorrowLimitUsed","fraOne","onSupplyMax","cTokenMaxAmountSpend","onWithdrawMax","safe","suppliedValue","getSuppliedValue","otherSuppliedTotalValue","expectTotalBalnce","remainValue","owedValue","safeValue","onBorrowMax","borrowMaxValue","getLiquidity","borrowMaxAmount","lendingInfoWithdrawMax","lendingInfoOnBorrowMax","withdrawMax","borrowMax","walletBalance","inputText","parseInputValue","protocolBorrowBalance","protocolSuppleyBalance","WITHDRAW","REPAY","useLendingInfo","cToken","cTokenContract","supplyBalanceAmount","redeem","redeemUnderlying","borrow","borrowBlanceAmount","borrowAmount","maximillionContract","repayBehalf","repayBorrow","overflowY","onRepayMax","onMint","onRepayBorrow","toLocaleUpperCase","onRedeem","onBorrow","SupplyMarkets","enterMarkets","exitMarket","showCollateralConfirmation","setShowCollateralConfirmation","collateralToken","setCollateralToken","isSuppliedMarkets","setIsSuppliedMarkets","suppliedAsset","supplyAsset","canExitMarkets","onExitMarket","onEnterMarkets","MarketsWrap","Lend","allMarkets","curr","getMarketSize","getTotalMarketSize","totalLimit","getLimit","usedLimtPercent","AppWrapper","HeaderWrapper","Marginer","TopLevelModals","ADDRESS_CLAIM","App","fallback","component","exact","strict","FlashLoanPoolFinder","FlashLoanPool","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","txn","darkHandler","matches","matchMedia","addListener","getLibrary","Web3ProviderNetwork","createWeb3ReactRoot","autoRefreshOnNetworkChange","Updaters","initialize","customBrowserType","exception","filename","lineno","colno","fatal","ReactDOM","render","getElementById"],"mappings":"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I1DJ,IAAQiI,WAAQ,8CAJ0C,eAK1DjI,IAAQK,MAAQ,8CAL0C,IAQvDwc,IAEL,qBACE7c,IAAQC,QAAU,CACjB,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,QACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,aACA,MACA,UACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,cACA,OACA,WACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,cACA,OACA,aACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,WACA,iBACA,UACA,aACA,8IACA,+IAEF,CACE,6CACA,6CACA,GACA,aACA,mBACA,YACA,eACA,8IACA,+IAEF,CACE,6CACA,6CACA,GACA,YACA,kBACA,WACA,cACA,8IACA,+IAEF,CACE,6CACA,6CACA,GACA,YACA,kBACA,WACA,cACA,8IACA,iJAxFL,eA2FED,IAAQG,QAAU,CACjB,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,wBACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,iBACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,QACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,UACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,WACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,aACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,cACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,cACA,MACA,KACA,8IACA,MAlLL,eAqLEH,IAAQI,QAAU,CACjB,CACE,6CACA,6CACA,GACA,OACA,aACA,MACA,iBACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,aACA,MACA,QACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,WACA,iBACA,UACA,aACA,8IACA,+IAEF,CACE,6CACA,6CACA,GACA,aACA,mBACA,YACA,eACA,8IACA,+IAEF,CACE,6CACA,6CACA,EACA,QACA,cACA,OACA,YACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,cACA,OACA,YACA,8IACA,MAtPL,eAyPEJ,IAAQiI,WAAQ,CACf,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,MACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,iBACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,QACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,WACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,cACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,KACA,8IACA,MA1TL,eA6TEjI,IAAQK,MAAQ,CACf,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,QACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,wBACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,WACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,iBACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,aACA,8IACA,IAEF,CACE,6CACA,6CACA,EACA,QACA,gBACA,OACA,cACA,8IACA,IAEF,CACE,6CACA,6CACA,GACA,OACA,eACA,MACA,oBACA,8IACA,MAzYL,I,IA8Y6B,IAAI8b,aAAUW,IACP,IAAIX,aAAUY,I,0EC3Z5C,SAASC,GAAUC,GACxB,IACE,OAAO9K,sBAAW8K,GAClB,SACA,OAAO,GAIX,IAAMC,GAAuD,CAC3D3W,EAAG,GACHyP,EAAG,WACHC,EAAG,WACHC,EAAG,UACHC,GAAI,UAGC,SAASgH,GACdvc,EACAkB,EACAsb,GAEA,IAAMC,EAAM,kBAAcH,GAAmBtc,IAAYsc,GAAmB,GAAhE,gBAEZ,OAAQE,GACN,IAAK,cACH,MAAM,GAAN,OAAUC,EAAV,eAAuBvb,GAEzB,IAAK,Q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","file":"static/js/main.4b79bce7.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/big_unicorn.3de55567.png\";","module.exports = __webpack_public_path__ + \"static/media/xl_uni.ed12c533.png\";","module.exports = __webpack_public_path__ + \"static/media/noise.17ab2292.png\";","module.exports = __webpack_public_path__ + \"static/media/coinbaseWalletIcon.62578f59.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/portisIcon.b234b2bf.png\";","module.exports = __webpack_public_path__ + \"static/media/walletConnectIcon.8215855c.svg\";","var map = {\n\t\"./arrow-down-blue.svg\": 474,\n\t\"./arrow-down-grey.svg\": 475,\n\t\"./arrow-right-white.png\": 476,\n\t\"./arrow-right.svg\": 477,\n\t\"./big_unicorn.png\": 132,\n\t\"./blue-loader.svg\": 75,\n\t\"./circle-grey.svg\": 478,\n\t\"./circle.svg\": 479,\n\t\"./coinbaseWalletIcon.svg\": 137,\n\t\"./dropdown-blue.svg\": 480,\n\t\"./dropdown.svg\": 481,\n\t\"./dropup-blue.svg\": 482,\n\t\"./ethereum-logo.png\": 219,\n\t\"./fortmaticIcon.png\": 138,\n\t\"./link.svg\": 483,\n\t\"./magnifying-glass.svg\": 484,\n\t\"./menu.svg\": 485,\n\t\"./metamask.png\": 218,\n\t\"./noise.png\": 134,\n\t\"./plus-blue.svg\": 486,\n\t\"./plus-grey.svg\": 487,\n\t\"./portisIcon.png\": 139,\n\t\"./question-mark.svg\": 488,\n\t\"./question.svg\": 489,\n\t\"./spinner.svg\": 490,\n\t\"./token-list-logo.png\": 491,\n\t\"./token-list/lists-dark.png\": 492,\n\t\"./token-list/lists-light.png\": 493,\n\t\"./token-logo.png\": 105,\n\t\"./trustWallet.png\": 494,\n\t\"./walletConnectIcon.svg\": 140,\n\t\"./x.svg\": 495,\n\t\"./xl_uni.png\": 133\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 = 184;","module.exports = __webpack_public_path__ + \"static/media/metamask.023762b6.png\";","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,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAIRlWElmTU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAACCgAwAEAAAAAQAAACAAAAAAX7wP8AAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAABspJREFUWAmdlm1IlWcYx59zPL6l4tJRzRGNBRZFvmxgDSpqA6GtnEFukCzTXtS2iCXs24Z9GKwgthVEVh8M+rD0k4LbImZ+WAtcy2W0yoGzmaZFZlm+nLdnv//t8xyOr9kuuM993df9v/7XdV/3y3MsCykrK0vZu3fvbxUVFTs1LioqilEvkV5eXp49Ppr7r3wm88gbe6li7du3L1ljr35iY2O/SU9PfycUCpnxypUrPa7z/Pnzv7dt+2fhXkbkg+938hGXOKWHw2GPYgUCgcMae8nmNcCVjx49ujs4OHhORiRcX18f2rVrV5rP5/vU4/H8IuOGDRt8dJ7q6mqTqGyuODaPg7Hkg+9n4hAXuLCwikGsf5mvVGwRFaampnpIogagH2NsS0uLCeD1ejcmJCQo6zo5Q67OJpgh08AVx2Y7GOMjX3EII05xKwaxTiom8qGXn/fHxsaU8QUBMzIyQpmZmaZcDLeOjIxYlKtVc4gJDNGFPXv2FIybLEu6bM7YYNjWVvnCWyi7OMUtXbEUE/nASzY5fr/fCgaDfbJQnthTp04F2LdEOXMuumtra/v2798fr1US7KPk5OR8oPeFd+S+bJoTRtgTJ0704XuP+a07d+5MEKe4hVcsxVRslXoRZbJiYmIqNXn8+HGTGgeoOi4uLgnTqxDnuHbGXz979qzj9OnTv6OrUh7p2P7WHM1wyIcFpIuDdsi1q6c6lYqJLPRQujsclkyyVUa3ad04LqKtYu/99HEAB7D/hL5k3rx5a4eHh8+xok9YrQ6lRR8k4LmkpKRi5n4FexfsJqbS0P0Ei6O/QevDvpi2nAVbxLzjY/A5rYkktDfLAS8XqRJyHGVPi4+PLx4dHVX5NK3STpZ7mmO1azl8a7XHBJRvHAtRhVfhoEUZu+N80FdTU/Pj7t27NxLsC4xvAtQ+DZFQF85/Yb/LIRwcGhpKhbCCCuSyf48dgkgHdkCLoAJt4E/C84RSv4LPEjhWYHsDcAoLC9B3ksiRM2fOtPi4Nj4pGFtIJpWXyo8+QpsiVVVVbQRqTUxMNBuYn59vDpW2gMRilEBKSkr50aNHdT6mk0RixBHjiSYV24C2bdv2XnFx8QCD7oaGBp2Dy6zkh+fPn39F29TZ2bnQAC1rcWlpqb169epvnXGkk01zGBbLKB/5chW/FJc46+rqbjPVrViKKZyRkpKSw+vWrbN5JMBNFfZzkNLV3rp1a8uxY8dCTU1NSrKEM3FQTbps3JRgR0fHZmHlM5XJts+fP2+vX7/e3rFjxxE3vpWbm1t14MABm30awynE/gTpAzS/oxsuiG0OmuzTiuaEccXx1csXcPSQYihWdnZ2VSSBwsLCvJ6eHvkFowlcIpzCrCjA4QvTbHQRofr1gxrwy6Y5msHKx/V3e4c72Nvba2/fvj3PJMABMgeKDC87QFUhInKCXMQv1eQzzWIMt2IpuGLrIxTDyVb2b3Ft/tAENl0VzB4bsBeiGGzuvdaEYFNkMoarGOIKqhJysPEzt4ZD+TaP1jXs4/87UMx14EBtIZF+xhOE1YTd1ZDQtBXRijUncao2ZQvEzTnZrMyBmZiRpWAwlaBPhOBd+iwI48Gu4HUrevDgQbixsdGbl5dnZWVlWZBFKgFWL6DV3t5utba2WgUFBeEFCxZ4wdTjr8dsjNW3U5Fm+hE3lhKZIJqYYGDw9OnTZdjts2fP6lNqc2Dt/v5+d5WmGlqxbJoTRlj5PHz4cNlkPswTYpgD6ILITo6eS5cu+W7evKmPkMVjogfqcU5OjnfNmjV2V1eX1dzcrO+EORPgjS6b5oQRVj6UW76WuMQpbsWQbU4iBwEpZRu6zRcwuHTpUvvKlSsamtVr7yWyaU4YjbG3yRc1ss0av5TgbA4KZHpKbZ7VAGfBlJ+kJlxLbYPmhBFWPgqGOv7ezxB5whbMgJH5hn742Nj8o3U/yTJFhHJbmhNGRraoPTI5izJrdvgZMk7vNXHoTaBFTn80L3vrJmYWRUXMFrgc0dho/UUVMAlQ7nae1hES0VU1NpEoGTVXNCcM1RjmD8x1xx7Bu7joftYEINRj4uVb34PTn3DLVzbDQRBLTeLYwsKgX8e3V77iMIAZfmZNwPExGMganXEYUu21dfHiRdOky4aYYOgN0b6O/v86rUKevN+vsxWjOv1ImO+/uXa6etJlc27GKHqGfOjnskBBZxeIzGHlih1Ct69evTqKR4BnOaQmXTbNCSM21BcdcMHM/3qjzPYDGVUdP3zodQMDA0V69zmYxo2vqPk+pKWl1YH7WMZon9m45zwnQheMXkZrof3jNOllUfMRrGubqf8PyJrpO7G2R1sAAAAASUVORK5CYII=\"","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/circle-grey.ed2a1dad.svg\";","module.exports = __webpack_public_path__ + \"static/media/circle.2d975615.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 = __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/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/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 { ChainId } from '@uniswap/sdk'\nimport { FortmaticConnector as FortmaticConnectorCore } from '@web3-react/fortmatic-connector'\n\nexport const OVERLAY_READY = 'OVERLAY_READY'\n\ntype FormaticSupportedChains = Extract\n\nconst CHAIN_ID_NETWORK_ARGUMENT: { readonly [chainId in FormaticSupportedChains]: string | undefined } = {\n [ChainId.MAINNET]: undefined,\n [ChainId.ROPSTEN]: 'ropsten',\n [ChainId.RINKEBY]: 'rinkeby',\n [ChainId.KOVAN]: 'kovan'\n}\n\nexport class FortmaticConnector extends FortmaticConnectorCore {\n async activate() {\n if (!this.fortmatic) {\n const { default: Fortmatic } = await import('fortmatic')\n\n const { apiKey, chainId } = this as any\n if (chainId in CHAIN_ID_NETWORK_ARGUMENT) {\n this.fortmatic = new Fortmatic(apiKey, CHAIN_ID_NETWORK_ARGUMENT[chainId as FormaticSupportedChains])\n } else {\n throw new Error(`Unsupported network ID: ${chainId}`)\n }\n }\n\n const provider = this.fortmatic.getProvider()\n\n const pollForOverlayReady = new Promise(resolve => {\n const interval = setInterval(() => {\n if (provider.overlayReady) {\n clearInterval(interval)\n this.emit(OVERLAY_READY)\n resolve()\n }\n }, 200)\n })\n\n const [account] = await Promise.all([\n provider.enable().then((accounts: string[]) => accounts[0]),\n pollForOverlayReady\n ])\n\n return { provider: this.fortmatic.getProvider(), chainId: (this as any).chainId, account }\n }\n}\n","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'\nimport { InjectedConnector } from '@web3-react/injected-connector'\nimport { WalletConnectConnector } from '@web3-react/walletconnect-connector'\nimport { WalletLinkConnector } from '@web3-react/walletlink-connector'\nimport { PortisConnector } from '@web3-react/portis-connector'\n\nimport { FortmaticConnector } from './Fortmatic'\nimport { NetworkConnector } from './NetworkConnector'\n\nconst NETWORK_URL = process.env.REACT_APP_NETWORK_URL\nconst FORMATIC_KEY = process.env.REACT_APP_FORTMATIC_KEY\nconst PORTIS_ID = process.env.REACT_APP_PORTIS_ID\n\nexport const NETWORK_CHAIN_ID: number = parseInt(process.env.REACT_APP_CHAIN_ID ?? '1')\n\nif (typeof NETWORK_URL === 'undefined') {\n throw new Error(`REACT_APP_NETWORK_URL must be a defined environment variable`)\n}\n\nexport const network = new NetworkConnector({\n urls: { [NETWORK_CHAIN_ID]: NETWORK_URL }\n})\n\nlet networkLibrary: Web3Provider | undefined\nexport function getNetworkLibrary(): Web3Provider {\n return (networkLibrary = networkLibrary ?? new Web3Provider(network.provider as any))\n}\n\nexport const injected = new InjectedConnector({\n supportedChainIds: [1, 3, 4, 5, 42]\n})\n\n// mainnet only\nexport const walletconnect = new WalletConnectConnector({\n rpc: { 1: NETWORK_URL },\n bridge: 'https://bridge.walletconnect.org',\n qrcode: true,\n pollingInterval: 15000\n})\n\n// mainnet only\nexport const fortmatic = new FortmaticConnector({\n apiKey: FORMATIC_KEY ?? '',\n chainId: 1\n})\n\n// mainnet only\nexport const portis = new PortisConnector({\n dAppId: PORTIS_ID ?? '',\n networks: [1]\n})\n\n// mainnet only\nexport const walletlink = new WalletLinkConnector({\n url: NETWORK_URL,\n appName: 'Uniswap',\n appLogoUrl:\n 'https://mpng.pngfly.com/20181202/bex/kisspng-emoji-domain-unicorn-pin-badges-sticker-unicorn-tumblr-emoji-unicorn-iphoneemoji-5c046729264a77.5671679315437924251569.jpg'\n})\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\n\n*co-authored with [Ken Ng](https://twitter.com/nkennethk?lang=en)*\n\n## Summary:\n\n**This post outlines a framework for funding Uniswap ecosystem development with grants from the[ UNI Community Treasury](https://uniswap.org/blog/uni/).** The program starts small—sponsoring hackathons, [for example](https://gov.uniswap.org/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.\n\n**Purpose:**\n\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.\n\n**Quarterly Budget:**\n\n* Max quarterly budget of up to $750k\n* Budget and caps to be assessed every six months\n\n**Grant Allocation Committee:**\n\n* Of 6 committee members: 1 lead and 5 reviewers\n* Each committee has a term of 2 quarters (6 months) after which the program needs to be renewed by UNI governance\n* Committee functions as a 4 of 5 multi-sig\n\n**Committee Members**\n\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.**\n\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.\n\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.\n\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.\n\n**Program Lead:** [Ken Ng](https://twitter.com/nkennethk?lang=en) (HL Creative Corp)\n*Ecosystem Support Program at the Ethereum Foundation*\n\n1. Reviewer: [Jesse Walden](https://twitter.com/jessewldn) (o/b/o Unofficial LLC dba [Variant Fund](http://twitter.com/variantfund))\n*Founder and Investor at Variant Fund (holds UNI)*\n\n2. Reviewer: [Monet Supply](https://twitter.com/MonetSupply)\n*Risk Analyst at MakerDAO*\n\n3. Reviewer: [Robert Leshner](https://twitter.com/rleshner)\n*Founder and CEO of Compound Finance*\n\n4. Reviewer: [Kain Warwick](https://twitter.com/kaiynne)\n*Founder of Synthetix*\n\n5. Reviewer: [Ashleigh Schap](https://twitter.com/ashleighschap)\n*Growth Lead, Uniswap (Company)*\n\n## Methodology\n\n**1.1 Budget**\n\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).\n\nThe UGP will be funded by the UNI treasury according to the[ release schedule](https://uniswap.org/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).\n\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.\n\n**1.2 Committee Compensation**\n\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.\n\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 .\n\n**2.1 Priorities**\n\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.\n\n![|624x199](upload://vNP0APCOjiwQMurCmYI47cTLklc.png)\n\nWith the initial priorities in mind, some effective measures for quick successes might look like:\n\n* Total number of projects funded\n* Quarterly increase in applications\n* Project engagement post-event/funding\n* Overall community engagement/sentiment\n\n**2.2 Timeline**\n\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.\n\n**![|624x245](upload://n56TSh5X3mt4TSqVVMFhbnZM0eM.png)**\n\n**Rolling Wave 1 & 2 Applications**\n\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\n\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\n\n**Wave 3 & Beyond**\n\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.\n\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\n\n## Conclusion:\n\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.\n\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.**\n\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.\n`\n","import { ChainId, JSBI, Percent, Token, WETH } from '@uniswap/sdk'\nimport { AbstractConnector } from '@web3-react/abstract-connector'\n\nimport { fortmatic, injected, portis, walletconnect, walletlink } from '../connectors'\n\nexport const ROUTER_ADDRESS = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D'\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n\nexport { PRELOADED_PROPOSALS } from './proposals'\n\n// a list of tokens by chain\ntype ChainTokenList = {\n readonly [chainId in ChainId]: Token[]\n}\n\n// export const DAI = new Token(ChainId.MAINNET, '0x6B175474E89094C44Da98b954EedeAC495271d0F', 18, 'DAI', 'Dai Stablecoin')\nexport const USDC = new Token(ChainId.MAINNET, '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 6, 'USDC', 'USD//C')\nexport const USDT = new Token(ChainId.MAINNET, '0xdAC17F958D2ee523a2206206994597C13D831ec7', 6, 'USDT', 'Tether USD')\nexport const COMP = new Token(ChainId.MAINNET, '0xc00e94Cb662C3520282E6f5717214004A7f26888', 18, 'COMP', 'Compound')\n// export const MKR = new Token(ChainId.MAINNET, '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2', 18, 'MKR', 'Maker')\nexport const AMPL = new Token(ChainId.MAINNET, '0xD46bA6D942050d489DBd938a2C909A5d5039A161', 9, 'AMPL', 'Ampleforth')\nexport const WBTC = new Token(ChainId.MAINNET, '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', 8, 'WBTC', 'Wrapped BTC')\n\nexport const MKR = new Token(ChainId.KOVAN, '0xAaF64BFCC32d0F15873a02163e7E500671a4ffcD', 18, 'MKR', 'Maker')\nexport const DAI = new Token(ChainId.KOVAN, '0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa', 18, 'DAI', 'Dai Stablecoin')\n\n// Block time here is slightly higher (~1s) than average in order to avoid ongoing proposals past the displayed time\nexport const AVERAGE_BLOCK_TIME_IN_SECS = 13\nexport const PROPOSAL_LENGTH_IN_BLOCKS = 20\nexport const PROPOSAL_LENGTH_IN_SECS = AVERAGE_BLOCK_TIME_IN_SECS * PROPOSAL_LENGTH_IN_BLOCKS\n\nexport const GOVERNANCE_ADDRESS = '0x1d057068C248D38167390475Eda67d750d2DaC7d' // kovan\n\nexport const TIMELOCK_ADDRESS = '0xbf7b83AcAfd5040d6af80b7ed2d61699Db0a7D4D' // kovan\n\nconst UNI_ADDRESS = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'\nexport const UNI: { [chainId in ChainId]: Token } = {\n [ChainId.MAINNET]: new Token(ChainId.MAINNET, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\n [ChainId.RINKEBY]: new Token(ChainId.RINKEBY, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\n [ChainId.ROPSTEN]: new Token(ChainId.ROPSTEN, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\n [ChainId.GÖRLI]: new Token(ChainId.GÖRLI, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\n [ChainId.KOVAN]: new Token(ChainId.KOVAN, UNI_ADDRESS, 18, 'UNI', 'Uniswap')\n}\n\nconst DEER_ADDRESS = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'\nconst DEER_ADDRESS_KOVAN = '0xbed87AdAcc517EbC5a6aa321a5afA3532f16380a'\n\nexport const DEER: { [chainId in ChainId]: Token } = {\n [ChainId.MAINNET]: new Token(ChainId.MAINNET, DEER_ADDRESS, 18, 'DEER', 'Deerfi'),\n [ChainId.RINKEBY]: new Token(ChainId.RINKEBY, DEER_ADDRESS, 18, 'DEER', 'Deerfi'),\n [ChainId.ROPSTEN]: new Token(ChainId.ROPSTEN, DEER_ADDRESS, 18, 'DEER', 'Deerfi'),\n [ChainId.GÖRLI]: new Token(ChainId.GÖRLI, DEER_ADDRESS, 18, 'DEER', 'Deerfi'),\n [ChainId.KOVAN]: new Token(ChainId.KOVAN, DEER_ADDRESS_KOVAN, 18, 'DEER', 'Deerfi')\n}\n\nexport const COMMON_CONTRACT_NAMES: { [address: string]: string } = {\n [UNI_ADDRESS]: 'UNI',\n [DEER_ADDRESS]: 'DEER',\n [DEER_ADDRESS_KOVAN]: 'DEER',\n [GOVERNANCE_ADDRESS]: 'Governance',\n [TIMELOCK_ADDRESS]: 'Timelock'\n}\n\n// TODO: specify merkle distributor for mainnet\nexport const MERKLE_DISTRIBUTOR_ADDRESS: { [chainId in ChainId]?: string } = {\n [ChainId.MAINNET]: '0x090D4613473dEE047c3f2706764f49E0821D256e'\n}\n\nconst WETH_ONLY: ChainTokenList = {\n [ChainId.MAINNET]: [WETH[ChainId.MAINNET]],\n [ChainId.ROPSTEN]: [WETH[ChainId.ROPSTEN]],\n [ChainId.RINKEBY]: [WETH[ChainId.RINKEBY]],\n [ChainId.GÖRLI]: [WETH[ChainId.GÖRLI]],\n [ChainId.KOVAN]: [WETH[ChainId.KOVAN]]\n}\n\n// used to construct intermediary pairs for trading\nexport const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\n ...WETH_ONLY,\n [ChainId.MAINNET]: [...WETH_ONLY[ChainId.MAINNET], DAI, USDC, USDT, COMP, MKR, WBTC]\n}\n\n/**\n * Some tokens can only be swapped via certain pairs, so we override the list of bases that are considered for these\n * tokens.\n */\nexport const CUSTOM_BASES: { [chainId in ChainId]?: { [tokenAddress: string]: Token[] } } = {\n [ChainId.MAINNET]: {\n [AMPL.address]: [DAI, WETH[ChainId.MAINNET]]\n }\n}\n\n// used for display in the default list when adding liquidity\nexport const SUGGESTED_BASES: ChainTokenList = {\n ...WETH_ONLY,\n [ChainId.MAINNET]: [...WETH_ONLY[ChainId.MAINNET], DAI, USDC, USDT, WBTC]\n}\n\n// used to construct the list of all pairs we consider by default in the frontend\nexport const BASES_TO_TRACK_LIQUIDITY_FOR: ChainTokenList = {\n ...WETH_ONLY,\n [ChainId.MAINNET]: [...WETH_ONLY[ChainId.MAINNET], DAI, USDC, USDT, WBTC]\n}\n\nexport const PINNED_PAIRS: { readonly [chainId in ChainId]?: [Token, Token][] } = {\n [ChainId.MAINNET]: [\n [\n new Token(ChainId.MAINNET, '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643', 8, 'cDAI', 'Compound Dai'),\n new Token(ChainId.MAINNET, '0x39AA39c021dfbaE8faC545936693aC917d5E7563', 8, 'cUSDC', 'Compound USD Coin')\n ],\n [USDC, USDT],\n [DAI, USDT]\n ]\n}\n\nexport const PINNED_POOLS: { readonly [chainId in ChainId]?: Token[] } = {\n [ChainId.MAINNET]: [\n new Token(ChainId.MAINNET, '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643', 8, 'cDAI', 'Compound Dai'),\n new Token(ChainId.MAINNET, '0x39AA39c021dfbaE8faC545936693aC917d5E7563', 8, 'cUSDC', 'Compound USD Coin'),\n USDC,\n USDT,\n DAI\n ]\n}\n\nexport interface WalletInfo {\n connector?: AbstractConnector\n name: string\n iconName: string\n description: string\n href: string | null\n color: string\n primary?: true\n mobile?: true\n mobileOnly?: true\n}\n\nexport const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {\n INJECTED: {\n connector: injected,\n name: 'Injected',\n iconName: 'arrow-right.svg',\n description: 'Injected web3 provider.',\n href: null,\n color: '#010101',\n primary: true\n },\n METAMASK: {\n connector: injected,\n name: 'MetaMask',\n iconName: 'metamask.png',\n description: 'Easy-to-use browser extension.',\n href: null,\n color: '#E8831D'\n },\n WALLET_CONNECT: {\n connector: walletconnect,\n name: 'WalletConnect',\n iconName: 'walletConnectIcon.svg',\n description: 'Connect to Trust Wallet, Rainbow Wallet and more...',\n href: null,\n color: '#4196FC',\n mobile: true\n },\n WALLET_LINK: {\n connector: walletlink,\n name: 'Coinbase Wallet',\n iconName: 'coinbaseWalletIcon.svg',\n description: 'Use Coinbase Wallet app on mobile device',\n href: null,\n color: '#315CF5'\n },\n COINBASE_LINK: {\n name: 'Open in Coinbase Wallet',\n iconName: 'coinbaseWalletIcon.svg',\n description: 'Open in Coinbase Wallet app.',\n href: 'https://go.cb-w.com/mtUDhEZPy1',\n color: '#315CF5',\n mobile: true,\n mobileOnly: true\n },\n FORTMATIC: {\n connector: fortmatic,\n name: 'Fortmatic',\n iconName: 'fortmaticIcon.png',\n description: 'Login using Fortmatic hosted wallet',\n href: null,\n color: '#6748FF',\n mobile: true\n },\n Portis: {\n connector: portis,\n name: 'Portis',\n iconName: 'portisIcon.png',\n description: 'Login using Portis hosted wallet',\n href: null,\n color: '#4A6C9B',\n mobile: true\n }\n}\n\nexport const NetworkContextName = 'NETWORK'\n\n// default allowed slippage, in bips\nexport const INITIAL_ALLOWED_SLIPPAGE = 50\n// 20 minutes, denominated in seconds\nexport const DEFAULT_DEADLINE_FROM_NOW = 60 * 20\n\n// used for rewards deadlines\nexport const BIG_INT_SECONDS_IN_WEEK = JSBI.BigInt(60 * 60 * 24 * 7)\n\nexport const BIG_INT_ZERO = JSBI.BigInt(0)\n\n// one basis point\nexport const ONE_BIPS = new Percent(JSBI.BigInt(1), JSBI.BigInt(10000))\nexport const BIPS_BASE = JSBI.BigInt(10000)\n// used for warning states\nexport const ALLOWED_PRICE_IMPACT_LOW: Percent = new Percent(JSBI.BigInt(100), BIPS_BASE) // 1%\nexport const ALLOWED_PRICE_IMPACT_MEDIUM: Percent = new Percent(JSBI.BigInt(300), BIPS_BASE) // 3%\nexport const ALLOWED_PRICE_IMPACT_HIGH: Percent = new Percent(JSBI.BigInt(500), BIPS_BASE) // 5%\n// if the price slippage exceeds this number, force the user to type 'confirm' to execute\nexport const PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN: Percent = new Percent(JSBI.BigInt(1000), BIPS_BASE) // 10%\n// for non expert mode disable swaps above this\nexport const BLOCKED_PRICE_IMPACT_NON_EXPERT: Percent = new Percent(JSBI.BigInt(1500), BIPS_BASE) // 15%\n\n// used to ensure the user doesn't send so much ETH so they end up with <.01\nexport const MIN_ETH: JSBI = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(16)) // .01 ETH\nexport const BETTER_TRADE_LESS_HOPS_THRESHOLD = new Percent(JSBI.BigInt(50), JSBI.BigInt(10000))\n\nexport const ZERO_PERCENT = new Percent('0')\nexport const ONE_HUNDRED_PERCENT = new Percent('1')\n\n// SDN OFAC addresses\nexport const BLOCKED_ADDRESSES: string[] = [\n '0x7F367cC41522cE07553e823bf3be79A889DEbe1B',\n '0xd882cFc20F52f2599D84b8e8D58C7FB62cfE344b',\n '0x901bb9583b24D97e995513C6778dc6888AB6870e',\n '0xA7e5d5A720f06526557c513402f2e6B5fA20b008'\n]\n","import { Web3Provider } from '@ethersproject/providers'\nimport { ChainId } from '@uniswap/sdk'\nimport { useWeb3React as useWeb3ReactCore } from '@web3-react/core'\nimport { Web3ReactContextInterface } from '@web3-react/core/dist/types'\nimport { useEffect, useState } from 'react'\nimport { isMobile } from 'react-device-detect'\nimport { injected } from '../connectors'\nimport { NetworkContextName } from '../constants'\n\nexport function useActiveWeb3React(): Web3ReactContextInterface & { chainId?: ChainId } {\n const context = useWeb3ReactCore()\n const contextNetwork = useWeb3ReactCore(NetworkContextName)\n return context.active ? context : contextNetwork\n}\n\nexport function useEagerConnect() {\n const { activate, active } = useWeb3ReactCore() // specifically using useWeb3ReactCore because of what this hook does\n const [tried, setTried] = useState(false)\n\n useEffect(() => {\n injected.isAuthorized().then(isAuthorized => {\n if (isAuthorized) {\n activate(injected, undefined, true).catch(() => {\n setTried(true)\n })\n } else {\n if (isMobile && window.ethereum) {\n activate(injected, undefined, true).catch(() => {\n setTried(true)\n })\n } else {\n setTried(true)\n }\n }\n })\n }, [activate]) // intentionally only running on mount (make sure it's only mounted once :))\n\n // if the connection worked, wait until we get confirmation of that to flip the flag\n useEffect(() => {\n if (active) {\n setTried(true)\n }\n }, [active])\n\n return tried\n}\n\n/**\n * Use for network and injected - logs user in\n * and out after checking what network theyre on\n */\nexport function useInactiveListener(suppress = false) {\n const { active, error, activate } = useWeb3ReactCore() // specifically using useWeb3React because of what this hook does\n\n useEffect(() => {\n const { ethereum } = window\n\n if (ethereum && ethereum.on && !active && !error && !suppress) {\n const handleChainChanged = () => {\n // eat errors\n activate(injected, undefined, true).catch(error => {\n console.error('Failed to activate after chain changed', error)\n })\n }\n\n const handleAccountsChanged = (accounts: string[]) => {\n if (accounts.length > 0) {\n // eat errors\n activate(injected, undefined, true).catch(error => {\n console.error('Failed to activate after accounts changed', error)\n })\n }\n }\n\n ethereum.on('chainChanged', handleChainChanged)\n ethereum.on('accountsChanged', handleAccountsChanged)\n\n return () => {\n if (ethereum.removeListener) {\n ethereum.removeListener('chainChanged', handleChainChanged)\n ethereum.removeListener('accountsChanged', handleAccountsChanged)\n }\n }\n }\n return undefined\n }, [active, error, suppress, activate])\n}\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","import React from 'react'\nimport styled, { css } from 'styled-components'\nimport { animated, useTransition, useSpring } from 'react-spring'\nimport { DialogOverlay, DialogContent } from '@reach/dialog'\nimport { isMobile } from 'react-device-detect'\nimport '@reach/dialog/styles.css'\nimport { transparentize } from 'polished'\nimport { useGesture } from 'react-use-gesture'\n\nconst AnimatedDialogOverlay = animated(DialogOverlay)\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst StyledDialogOverlay = styled(AnimatedDialogOverlay)`\n &[data-reach-dialog-overlay] {\n z-index: 2;\n background-color: transparent;\n overflow: hidden;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n background-color: ${({ theme }) => theme.modalBG};\n }\n`\n\nconst AnimatedDialogContent = animated(DialogContent)\n// destructure to not pass custom props to Dialog DOM element\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst StyledDialogContent = styled(({ minHeight, maxHeight, mobile, isOpen, ...rest }) => (\n \n)).attrs({\n 'aria-label': 'dialog'\n})`\n overflow-y: ${({ mobile }) => (mobile ? 'scroll' : 'hidden')};\n\n &[data-reach-dialog-content] {\n margin: 0 0 2rem 0;\n background-color: ${({ theme }) => theme.bg1};\n box-shadow: 0 4px 8px 0 ${({ theme }) => transparentize(0.95, theme.shadow1)};\n padding: 0px;\n width: 50vw;\n overflow-y: ${({ mobile }) => (mobile ? 'scroll' : 'hidden')};\n overflow-x: hidden;\n\n align-self: ${({ mobile }) => (mobile ? 'flex-end' : 'center')};\n\n max-width: 420px;\n ${({ maxHeight }) =>\n maxHeight &&\n css`\n max-height: ${maxHeight}vh;\n `}\n ${({ minHeight }) =>\n minHeight &&\n css`\n min-height: ${minHeight}vh;\n `}\n display: flex;\n border-radius: 20px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n width: 65vw;\n margin: 0;\n `}\n ${({ theme, mobile }) => theme.mediaWidth.upToSmall`\n width: 85vw;\n ${mobile &&\n css`\n width: 100vw;\n border-radius: 20px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n `}\n `}\n }\n`\n\ninterface ModalProps {\n isOpen: boolean\n onDismiss: () => void\n minHeight?: number | false\n maxHeight?: number\n initialFocusRef?: React.RefObject\n children?: React.ReactNode\n}\n\nexport default function Modal({\n isOpen,\n onDismiss,\n minHeight = false,\n maxHeight = 90,\n initialFocusRef,\n children\n}: ModalProps) {\n const fadeTransition = useTransition(isOpen, null, {\n config: { duration: 200 },\n from: { opacity: 0 },\n enter: { opacity: 1 },\n leave: { opacity: 0 }\n })\n\n const [{ y }, set] = useSpring(() => ({ y: 0, config: { mass: 1, tension: 210, friction: 20 } }))\n const bind = useGesture({\n onDrag: state => {\n set({\n y: state.down ? state.movement[1] : 0\n })\n if (state.movement[1] > 300 || (state.velocity > 3 && state.direction[1] > 0)) {\n onDismiss()\n }\n }\n })\n\n return (\n <>\n {fadeTransition.map(\n ({ item, key, props }) =>\n item && (\n \n `translateY(${y > 0 ? y : 0}px)`) }\n }\n : {})}\n aria-label=\"dialog content\"\n minHeight={minHeight}\n maxHeight={maxHeight}\n mobile={isMobile}\n >\n {/* prevents the automatic focusing of inputs on mobile by the reach dialog */}\n {!initialFocusRef && isMobile ?
: null}\n {children}\n \n \n )\n )}\n \n )\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 styled from 'styled-components'\nimport { AutoColumn } from '../Column'\n\nimport uImage from '../../assets/images/big_unicorn.png'\nimport xlUnicorn from '../../assets/images/xl_uni.png'\nimport noise from '../../assets/images/noise.png'\n\nexport const TextBox = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px 12px;\n border: 1px solid rgba(255, 255, 255, 0.4);\n border-radius: 20px;\n width: fit-content;\n justify-self: flex-end;\n`\n\nexport const DataCard = styled(AutoColumn)<{ disabled?: boolean }>`\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #ff007a 0%, #2172e5 100%);\n border-radius: 12px;\n width: 100%;\n position: relative;\n overflow: hidden;\n`\n\nexport const CardBGImage = styled.span<{ desaturate?: boolean }>`\n background: url(${uImage});\n width: 1000px;\n height: 600px;\n position: absolute;\n border-radius: 12px;\n opacity: 0.4;\n top: -100px;\n left: -100px;\n transform: rotate(-15deg);\n user-select: none;\n\n ${({ desaturate }) => desaturate && `filter: saturate(0)`}\n`\n\nexport const CardBGImageSmaller = styled.span<{ desaturate?: boolean }>`\n background: url(${xlUnicorn});\n width: 1200px;\n height: 1200px;\n position: absolute;\n border-radius: 12px;\n top: -300px;\n left: -300px;\n opacity: 0.4;\n user-select: none;\n\n ${({ desaturate }) => desaturate && `filter: saturate(0)`}\n`\n\nexport const CardNoise = styled.span`\n background: url(${noise});\n background-size: cover;\n mix-blend-mode: overlay;\n border-radius: 12px;\n width: 100%;\n height: 100%;\n opacity: 0.15;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n`\n\nexport const CardSection = styled(AutoColumn)<{ disabled?: boolean }>`\n padding: 1rem;\n z-index: 1;\n opacity: ${({ disabled }) => disabled && '0.4'};\n`\n\nexport const Break = styled.div`\n width: 100%;\n background-color: rgba(255, 255, 255, 0.2);\n height: 1px;\n`\n","import styled from 'styled-components'\nimport { Box } from 'rebass/styled-components'\n\nconst Row = styled(Box)<{\n width?: string\n align?: string\n justify?: string\n padding?: string\n border?: string\n borderRadius?: string\n}>`\n width: ${({ width }) => width ?? '100%'};\n display: flex;\n padding: 0;\n align-items: ${({ align }) => align ?? 'center'};\n justify-content: ${({ justify }) => justify ?? 'flex-start'};\n padding: ${({ padding }) => padding};\n border: ${({ border }) => border};\n border-radius: ${({ borderRadius }) => borderRadius};\n`\n\nexport const RowBetween = styled(Row)`\n justify-content: space-between;\n`\n\nexport const RowFlat = styled.div`\n display: flex;\n align-items: flex-end;\n`\n\nexport const AutoRow = styled(Row)<{ gap?: string; justify?: string }>`\n flex-wrap: wrap;\n margin: ${({ gap }) => gap && `-${gap}`};\n justify-content: ${({ justify }) => justify && justify};\n\n & > * {\n margin: ${({ gap }) => gap} !important;\n }\n`\n\nexport const RowFixed = styled(Row)<{ gap?: string; justify?: string }>`\n width: fit-content;\n margin: ${({ gap }) => gap && `-${gap}`};\n`\n\nexport default Row\n","export const FACTORY_ADDRESS = '0xa22F8cf50D9827Daef24dCb5BAC92C147a9D342e'\n\nexport const INIT_CODE_HASH = '0x6c57ed802dc5d4d6ce04dc39f66e6d2a6cebf8b7efbc068ce7b0419f5ee4ade1'\n\nexport const ROUTER_ADDRESS = '0x0A8015b1647bc133F25681da0996307839eD64FD'\n","import { TokenAmount } from '@uniswap/sdk'\nimport invariant from 'tiny-invariant'\nimport JSBI from 'jsbi'\nimport { pack, keccak256 } from '@ethersproject/solidity'\nimport { getCreate2Address } from '@ethersproject/address'\n\nimport { BigintIsh, MINIMUM_LIQUIDITY, ChainId } from '@uniswap/sdk'\nimport { InsufficientInputAmountError } from '@uniswap/sdk'\nimport { Token } from '@uniswap/sdk'\nimport { FACTORY_ADDRESS, INIT_CODE_HASH } from 'constants/flashLoan'\n\nexport const ZERO = JSBI.BigInt(0)\nexport const FIVE = JSBI.BigInt(5)\nexport const _997 = JSBI.BigInt(997)\nexport const _1000 = JSBI.BigInt(1000)\n\nlet POOL_ADDRESS_CACHE: { [tokenAddress: string]: string } = {}\n\nexport function parseBigintIsh(bigintIsh: BigintIsh): JSBI {\n return bigintIsh instanceof JSBI\n ? bigintIsh\n : typeof bigintIsh === 'bigint'\n ? JSBI.BigInt(bigintIsh.toString())\n : JSBI.BigInt(bigintIsh)\n}\n\nexport class Pool {\n public readonly liquidityToken: Token\n private readonly tokenAmount: TokenAmount\n\n public static getAddress(token: Token): string {\n if (POOL_ADDRESS_CACHE?.[token.address] === undefined) {\n POOL_ADDRESS_CACHE = {\n ...POOL_ADDRESS_CACHE,\n [token.address]: getCreate2Address(\n FACTORY_ADDRESS,\n keccak256(['bytes'], [pack(['address'], [token.address])]),\n INIT_CODE_HASH\n )\n }\n }\n\n return POOL_ADDRESS_CACHE[token.address]\n }\n\n public constructor(tokenAmount: TokenAmount) {\n this.liquidityToken = new Token(\n tokenAmount.token.chainId,\n Pool.getAddress(tokenAmount.token),\n 18,\n 'FL-V1',\n 'FlashLoan V1'\n )\n this.tokenAmount = tokenAmount as TokenAmount\n }\n\n /**\n * Returns true if the token is either token0 or token1\n * @param token to check\n */\n public involvesToken(token: Token): boolean {\n return token.equals(this.token)\n }\n\n /**\n * Returns the chain ID of the tokens in the pair.\n */\n public get chainId(): ChainId {\n return this.token.chainId\n }\n\n public get token(): Token {\n return this.tokenAmount.token\n }\n\n public get reserve(): TokenAmount {\n return this.tokenAmount\n }\n\n public getLiquidityMinted(totalSupply: TokenAmount, tokenAmount: TokenAmount): TokenAmount {\n invariant(totalSupply.token.equals(this.liquidityToken), 'LIQUIDITY')\n invariant(tokenAmount.token.equals(this.token), 'TOKEN')\n\n let liquidity: JSBI\n if (JSBI.equal(totalSupply.raw, ZERO)) {\n liquidity = JSBI.subtract(tokenAmount.raw, MINIMUM_LIQUIDITY)\n } else {\n const amount = JSBI.divide(JSBI.multiply(tokenAmount.raw, totalSupply.raw), this.reserve.raw)\n liquidity = amount\n }\n if (!JSBI.greaterThan(liquidity, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n return new TokenAmount(this.liquidityToken, liquidity)\n }\n\n public getLiquidityValue(\n token: Token,\n totalSupply: TokenAmount,\n liquidity: TokenAmount,\n feeOn = false,\n kLast?: BigintIsh\n ): TokenAmount {\n invariant(this.involvesToken(token), 'TOKEN')\n invariant(totalSupply.token.equals(this.liquidityToken), 'TOTAL_SUPPLY')\n invariant(liquidity.token.equals(this.liquidityToken), 'LIQUIDITY')\n invariant(JSBI.lessThanOrEqual(liquidity.raw, totalSupply.raw), 'LIQUIDITY')\n\n let totalSupplyAdjusted: TokenAmount\n if (!feeOn) {\n totalSupplyAdjusted = totalSupply\n } else {\n invariant(!!kLast, 'K_LAST')\n const kLastParsed = parseBigintIsh(kLast)\n if (!JSBI.equal(kLastParsed, ZERO)) {\n const k = this.reserve.raw\n if (JSBI.greaterThan(k, kLastParsed)) {\n const numerator = JSBI.multiply(totalSupply.raw, JSBI.subtract(k, kLastParsed))\n const denominator = JSBI.add(JSBI.multiply(k, FIVE), kLastParsed)\n const feeLiquidity = JSBI.divide(numerator, denominator)\n totalSupplyAdjusted = totalSupply.add(new TokenAmount(this.liquidityToken, feeLiquidity))\n } else {\n totalSupplyAdjusted = totalSupply\n }\n } else {\n totalSupplyAdjusted = totalSupply\n }\n }\n\n return new TokenAmount(token, JSBI.divide(JSBI.multiply(liquidity.raw, this.reserve.raw), totalSupplyAdjusted.raw))\n }\n}\n","// used to mark unsupported tokens, these are hosted lists of unsupported tokens\n/**\n * @TODO add list from blockchain association\n */\nexport const UNSUPPORTED_LIST_URLS: string[] = []\n\nconst COMPOUND_LIST = 'https://raw.githubusercontent.com/compound-finance/token-list/master/compound.tokenlist.json'\nconst UMA_LIST = 'https://umaproject.org/uma.tokenlist.json'\nconst AAVE_LIST = 'tokenlist.aave.eth'\nconst SYNTHETIX_LIST = 'synths.snx.eth'\nconst WRAPPED_LIST = 'wrapped.tokensoft.eth'\nconst SET_LIST = 'https://raw.githubusercontent.com/SetProtocol/uniswap-tokenlist/main/set.tokenlist.json'\nconst OPYN_LIST = 'https://raw.githubusercontent.com/opynfinance/opyn-tokenlist/master/opyn-v1.tokenlist.json'\nconst ROLL_LIST = 'https://app.tryroll.com/tokens.json'\nconst COINGECKO_LIST = 'https://tokens.coingecko.com/uniswap/all.json'\nconst CMC_ALL_LIST = 'defi.cmc.eth'\nconst CMC_STABLECOIN = 'stablecoin.cmc.eth'\nconst KLEROS_LIST = 't2crtokens.eth'\n\n// lower index == higher priority for token import\nexport const DEFAULT_LIST_OF_LISTS: string[] = [\n COMPOUND_LIST,\n AAVE_LIST,\n SYNTHETIX_LIST,\n UMA_LIST,\n WRAPPED_LIST,\n SET_LIST,\n OPYN_LIST,\n ROLL_LIST,\n COINGECKO_LIST,\n CMC_ALL_LIST,\n CMC_STABLECOIN,\n KLEROS_LIST,\n ...UNSUPPORTED_LIST_URLS // need to load unsupported tokens as well\n]\n\n// default lists to be 'active' aka searched across\nexport const DEFAULT_ACTIVE_LIST_URLS: string[] = []\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'\nimport DEFAULT_TOKEN_LIST from 'constants/tokenLists/uniswap-default.tokenlist.json'\nimport { ChainId, Token } from '@uniswap/sdk'\nimport { Tags, TokenInfo, TokenList } from '@uniswap/token-lists'\nimport { useMemo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { AppState } from '../index'\nimport sortByListPriority from 'utils/listSort'\nimport UNSUPPORTED_TOKEN_LIST from '../../constants/tokenLists/uniswap-v2-unsupported.tokenlist.json'\n\ntype TagDetails = Tags[keyof Tags]\nexport interface TagInfo extends TagDetails {\n id: string\n}\n\n/**\n * Token instances created from token info.\n */\nexport class WrappedTokenInfo extends Token {\n public readonly tokenInfo: TokenInfo\n public readonly tags: TagInfo[]\n constructor(tokenInfo: TokenInfo, tags: TagInfo[]) {\n super(tokenInfo.chainId, tokenInfo.address, tokenInfo.decimals, tokenInfo.symbol, tokenInfo.name)\n this.tokenInfo = tokenInfo\n this.tags = tags\n }\n public get logoURI(): string | undefined {\n return this.tokenInfo.logoURI\n }\n}\n\nexport type TokenAddressMap = Readonly<\n { [chainId in ChainId]: Readonly<{ [tokenAddress: string]: { token: WrappedTokenInfo; list: TokenList } }> }\n>\n\n/**\n * An empty result, useful as a default.\n */\nconst EMPTY_LIST: TokenAddressMap = {\n [ChainId.KOVAN]: {},\n [ChainId.RINKEBY]: {},\n [ChainId.ROPSTEN]: {},\n [ChainId.GÖRLI]: {},\n [ChainId.MAINNET]: {}\n}\n\nconst listCache: WeakMap | null =\n typeof WeakMap !== 'undefined' ? new WeakMap() : null\n\nexport function listToTokenMap(list: TokenList): TokenAddressMap {\n const result = listCache?.get(list)\n if (result) return result\n\n const map = list.tokens.reduce(\n (tokenMap, tokenInfo) => {\n const tags: TagInfo[] =\n tokenInfo.tags\n ?.map(tagId => {\n if (!list.tags?.[tagId]) return undefined\n return { ...list.tags[tagId], id: tagId }\n })\n ?.filter((x): x is TagInfo => Boolean(x)) ?? []\n const token = new WrappedTokenInfo(tokenInfo, tags)\n if (tokenMap[token.chainId][token.address] !== undefined) throw Error('Duplicate tokens.')\n return {\n ...tokenMap,\n [token.chainId]: {\n ...tokenMap[token.chainId],\n [token.address]: {\n token,\n list: list\n }\n }\n }\n },\n { ...EMPTY_LIST }\n )\n listCache?.set(list, map)\n return map\n}\n\nexport function useAllLists(): {\n readonly [url: string]: {\n readonly current: TokenList | null\n readonly pendingUpdate: TokenList | null\n readonly loadingRequestId: string | null\n readonly error: string | null\n }\n} {\n return useSelector(state => state.lists.byUrl)\n}\n\nfunction combineMaps(map1: TokenAddressMap, map2: TokenAddressMap): TokenAddressMap {\n return {\n 1: { ...map1[1], ...map2[1] },\n 3: { ...map1[3], ...map2[3] },\n 4: { ...map1[4], ...map2[4] },\n 5: { ...map1[5], ...map2[5] },\n 42: { ...map1[42], ...map2[42] }\n }\n}\n\n// merge tokens contained within lists from urls\nfunction useCombinedTokenMapFromUrls(urls: string[] | undefined): TokenAddressMap {\n const lists = useAllLists()\n\n return useMemo(() => {\n if (!urls) return EMPTY_LIST\n\n return (\n urls\n .slice()\n // sort by priority so top priority goes last\n .sort(sortByListPriority)\n .reduce((allTokens, currentUrl) => {\n const current = lists[currentUrl]?.current\n if (!current) return allTokens\n try {\n const newTokens = Object.assign(listToTokenMap(current))\n return combineMaps(allTokens, newTokens)\n } catch (error) {\n console.error('Could not show token list due to error', error)\n return allTokens\n }\n }, EMPTY_LIST)\n )\n }, [lists, urls])\n}\n\n// filter out unsupported lists\nexport function useActiveListUrls(): string[] | undefined {\n return useSelector(state => state.lists.activeListUrls)?.filter(\n url => !UNSUPPORTED_LIST_URLS.includes(url)\n )\n}\n\nexport function useInactiveListUrls(): string[] {\n const lists = useAllLists()\n const allActiveListUrls = useActiveListUrls()\n return Object.keys(lists).filter(url => !allActiveListUrls?.includes(url) && !UNSUPPORTED_LIST_URLS.includes(url))\n}\n\n// get all the tokens from active lists, combine with local default tokens\nexport function useCombinedActiveList(): TokenAddressMap {\n const activeListUrls = useActiveListUrls()\n const activeTokens = useCombinedTokenMapFromUrls(activeListUrls)\n const defaultTokenMap = listToTokenMap(DEFAULT_TOKEN_LIST)\n return combineMaps(activeTokens, defaultTokenMap)\n}\n\n// all tokens from inactive lists\nexport function useCombinedInactiveList(): TokenAddressMap {\n const allInactiveListUrls: string[] = useInactiveListUrls()\n return useCombinedTokenMapFromUrls(allInactiveListUrls)\n}\n\n// used to hide warnings on import for default tokens\nexport function useDefaultTokenList(): TokenAddressMap {\n return listToTokenMap(DEFAULT_TOKEN_LIST)\n}\n\n// list of tokens not supported on interface, used to show warnings and prevent swaps and adds\nexport function useUnsupportedTokenList(): TokenAddressMap {\n // get hard coded unsupported tokens\n const localUnsupportedListMap = listToTokenMap(UNSUPPORTED_TOKEN_LIST)\n\n // get any loaded unsupported tokens\n const loadedUnsupportedListMap = useCombinedTokenMapFromUrls(UNSUPPORTED_LIST_URLS)\n\n // format into one token address map\n return combineMaps(localUnsupportedListMap, loadedUnsupportedListMap)\n}\n\nexport function useIsListActive(url: string): boolean {\n const activeListUrls = useActiveListUrls()\n return Boolean(activeListUrls?.includes(url))\n}\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 VOTE\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\nexport function useShowClaimPopup(): boolean {\n return useModalOpen(ApplicationModal.CLAIM_POPUP)\n}\n\nexport function useToggleShowClaimPopup(): () => void {\n return useToggleModal(ApplicationModal.CLAIM_POPUP)\n}\n\nexport function useToggleSelfClaimModal(): () => void {\n return useToggleModal(ApplicationModal.SELF_CLAIM)\n}\n\nexport function useToggleDelegateModal(): () => void {\n return useToggleModal(ApplicationModal.DELEGATE)\n}\n\nexport function useToggleVoteModal(): () => void {\n return useToggleModal(ApplicationModal.VOTE)\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 { 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 { ChainId } from '@uniswap/sdk'\nimport MULTICALL_ABI from './abi.json'\n\nconst MULTICALL_NETWORKS: { [chainId in ChainId]: string } = {\n [ChainId.MAINNET]: '0xeefBa1e63905eF1D7ACbA5a8513c70307C1cE441',\n [ChainId.ROPSTEN]: '0x53C43764255c17BD724F74c4eF150724AC50a3ed',\n [ChainId.KOVAN]: '0x2cc8688C5f75E365aaEEb4ea8D6a480405A48D2A',\n [ChainId.RINKEBY]: '0x42Ad527de7d4e9d9d011aC45B31D8551f8Fe9821',\n [ChainId.GÖRLI]: '0x77dCa2C955b15e9dE4dbBCf1246B4B85b651e50e'\n}\n\nexport { MULTICALL_ABI, MULTICALL_NETWORKS }\n","import { Interface } from '@ethersproject/abi'\nimport { ChainId } from '@uniswap/sdk'\nimport V1_EXCHANGE_ABI from './v1_exchange.json'\nimport V1_FACTORY_ABI from './v1_factory.json'\n\nconst V1_FACTORY_ADDRESSES: { [chainId in ChainId]: string } = {\n [ChainId.MAINNET]: '0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95',\n [ChainId.ROPSTEN]: '0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351',\n [ChainId.RINKEBY]: '0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36',\n [ChainId.GÖRLI]: '0x6Ce570d02D73d4c384b46135E87f8C592A8c86dA',\n [ChainId.KOVAN]: '0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30'\n}\n\nconst V1_FACTORY_INTERFACE = new Interface(V1_FACTORY_ABI)\nconst V1_EXCHANGE_INTERFACE = new Interface(V1_EXCHANGE_ABI)\n\nexport { V1_FACTORY_ADDRESSES, V1_FACTORY_INTERFACE, V1_FACTORY_ABI, V1_EXCHANGE_INTERFACE, V1_EXCHANGE_ABI }\n","import { Interface } from '@ethersproject/abi'\nimport { ChainId } from '@uniswap/sdk'\nimport COMPTROLLER_ABI from './comptroller.json'\nimport CHAINLINK_PRICE_ORACLE_PROXY_ABI from './chainlink_price_oracle_proxy.json'\n\nconst COMPTROLLER_ADDRESSES: { [chainId in ChainId]: string } = {\n [ChainId.MAINNET]: '0x28830892870c8eC4EFE47B6d176E57c3c4aCc558', // deerfi unitroller\n [ChainId.ROPSTEN]: '0x54188bbedd7b68228fa89cbdda5e3e930459c6c6',\n [ChainId.RINKEBY]: '0x94b796C701B65F840d819365055b865dA1Fcb099', // deerfi unitroller\n [ChainId.GÖRLI]: '0x627ea49279fd0de89186a58b8758ad02b6be2867',\n [ChainId.KOVAN]: '0x5eae89dc1c671724a672ff0630122ee834098657'\n}\n\nconst ORACLE_ADDRESSES: { [chainId in ChainId]: string } = {\n [ChainId.MAINNET]: '0x46eF26bBbEdF4ac8002520eb951bD01fF0C4b06F', // deerfi oracle\n [ChainId.ROPSTEN]: '0xb2b3d5b4e35881d518fa2062325f118a6ebb6c4a',\n [ChainId.RINKEBY]: '0x536426d7768b6E2E8815Fa42357FD47094071c1D', // deerfi oracle\n [ChainId.GÖRLI]: '0x9A536Ed5C97686988F93C9f7C2A390bF3B59c0ec', // not working due to lack of oracle\n [ChainId.KOVAN]: '0xbBdE93962Ca9fe39537eeA7380550ca6845F8db7'\n}\n\nconst MAXIMILLION_ADDRESSES: { [chainId in ChainId]: string } = {\n [ChainId.MAINNET]: '0xd4b2474044836D8E10239cF2A0D18C92fBd49222',\n [ChainId.ROPSTEN]: '0x0000000000000000000000000000000000000000',\n [ChainId.RINKEBY]: '0xFdC42cE083c54aB50f61518CED9CFB9504A42389', // deerfi maximillion\n [ChainId.GÖRLI]: '0x0000000000000000000000000000000000000000', // not working due to lack of oracle\n [ChainId.KOVAN]: '0xC363f83902Ac614F318b04771d21D25aC0d73be5'\n}\n\nconst CTOKEN_LISTS: {\n [chainId in ChainId]: [string, string, number, string, string, string, string, string, string][]\n} = {\n [ChainId.MAINNET]: [\n [\n '0x171edAAf4D85dC9BeD709297Ad402db68ECF7Fe9',\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n 18,\n 'dETH',\n 'Deerfi Ether',\n 'ETH',\n 'Ether',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n ''\n ],\n [\n '0x453bED86c774a7c00EbBB1F74A0Ff1a38C8812ae',\n '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984',\n 18,\n 'dUNI',\n 'Deerfi UNI',\n 'UNI',\n 'Uniswap',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984/logo.png',\n ''\n ],\n [\n '0x9c0ADd57D18Bf1cc5C5790330D95D600f0B571Ba',\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n 6,\n 'dUSDC',\n 'Deerfi USDC',\n 'USDC',\n 'USD Coin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n ''\n ],\n [\n '0xB9D7e2835D4157E8Ff1119007Bce5295a7e503E5',\n '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n 6,\n 'dUSDT',\n 'Deerfi USDT',\n 'USDT',\n 'Tether USD',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png',\n ''\n ],\n [\n '0x14387D32df1381445bDD1b8E8916598367523A8a',\n '0xd3d2E2692501A5c9Ca623199D38826e513033a17',\n 18,\n 'dETH-UNI',\n 'Deerfi ETH-UNI',\n 'ETH-UNI',\n 'ETH-UNI LP',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984/logo.png'\n ],\n [\n '0x906E8893ae417860A4B4fA1Cf70682429d7d523F',\n '0x3041CbD36888bECc7bbCBc0045E3B1f144466f5f',\n 18,\n 'dUSDC-USDT',\n 'Deerfi USDC-USDT',\n 'USDC-USDT',\n 'USDC-USDT LP',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png'\n ],\n [\n '0x37dbf0C87457A18C872633577526833CfB4688a0',\n '0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc',\n 18,\n 'dETH-USDC',\n 'Deerfi ETH-USDC',\n 'ETH-USDC',\n 'ETH-USDC LP',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png'\n ],\n [\n '0x7427e678E8231589126411c393BDa8c85D70387f',\n '0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852',\n 18,\n 'dETH-USDT',\n 'Deerfi ETH-USDT',\n 'ETH-USDT',\n 'ETH-USDT LP',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png'\n ]\n ],\n [ChainId.ROPSTEN]: [\n [\n '0x9e95c0b2412ce50c37a121622308e7a6177f819d',\n '0x443Fd8D5766169416aE42B8E050fE9422f628419',\n 18,\n 'cBAT',\n 'Compound BAT',\n 'BAT',\n 'Basic Attention Token',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0D8775F648430679A709E98d2b0Cb6250d2887EF/logo.png',\n ''\n ],\n [\n '0x8354c3a332ffb24e3a27be252e01acfe65a33b35',\n '0x31f42841c2db5173425b5223809cf3a38fede360',\n 18,\n 'cDAI',\n 'Compound DAI',\n 'DAI',\n 'Dai Stablecoin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png',\n ''\n ],\n [\n '0xbe839b6d93e3ea47effcca1f27841c917a8794f3',\n '0xc778417E063141139Fce010982780140Aa0cD5Ab',\n 18,\n 'cETH',\n 'Compound ETH',\n 'ETH',\n 'Ether',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n ''\n ],\n [\n '0x22531f0f3a9c36bfc3b04c4c60df5168a1cfcec3',\n '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984',\n 18,\n 'cUNI',\n 'Compound UNI',\n 'UNI',\n 'Uniswap',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984/logo.png',\n ''\n ],\n [\n '0x8af93cae804cc220d1a608d4fa54d1b6ca5eb361',\n '0x0d9c8723b343a8368bebe0b5e89273ff8d712e3c',\n 6,\n 'cUSDC',\n 'Compound USDC',\n 'USDC',\n 'USD Coin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n ''\n ],\n [\n '0x135669c2dcbd63f639582b313883f101a4497f76',\n '0x516de3a7a567d81737e3a46ec4ff9cfd1fcb0136',\n 6,\n 'cUSDT',\n 'Compound USDT',\n 'USDT',\n 'Tether USD',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png',\n ''\n ],\n [\n '0x58145bc5407d63daf226e4870beeb744c588f149',\n '0xbde8bb00a7ef67007a96945b3a3621177b615c44',\n 8,\n 'cWBTC',\n 'Compound WBTC',\n 'WBTC',\n 'Wrapped BTC',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/logo.png',\n ''\n ],\n [\n '0x00e02a5200ce3d5b5743f5369deb897946c88121',\n '0xe4c6182ea459e63b8f1be7c428381994ccc2d49c',\n 18,\n 'cZRX',\n 'Compound 0x',\n 'ZRX',\n '0x',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xE41d2489571d322189246DaFA5ebDe1F4699F498/logo.png',\n ''\n ]\n ],\n [ChainId.RINKEBY]: [\n [\n '0x5aE6e29b6d886CaA2958516fAf9A149D3883017e',\n '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735',\n 18,\n 'dDAI',\n 'Deerfi DAI',\n 'DAI',\n 'Dai Stablecoin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png',\n ''\n ],\n [\n '0x0Adf34a06EFAd1cB072c9864fa871f2b8289d355',\n '0xc778417E063141139Fce010982780140Aa0cD5Ab',\n 18,\n 'dETH',\n 'Deerfi ETH',\n 'ETH',\n 'Ether',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n ''\n ],\n [\n '0x63d82F481fE776A0767D1ce0D0B218dAbF37Ca4A',\n '0x8B22F85d0c844Cf793690F6D9DFE9F11Ddb35449',\n 18,\n 'dETH-DAI',\n 'Deerfi ETH-DAI',\n 'ETH-DAI',\n 'ETH-DAI LP',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png'\n ],\n [\n '0x709a3b48536d766E4A57887aBe7fB47c1428a178',\n '0x0Af7f38fE8C9F98d132D4fBf27FeC89a648451f9',\n 18,\n 'dUS8D-US6D',\n 'Deerfi US8D-US6D',\n 'US8D-US6D',\n 'US8D-US6D LP',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png'\n ],\n [\n '0xE1f5597282F62e392f48DfEFd85C10c0C6221898',\n '0xFf62E93152FE5865810dCC982bBA715297339E5E',\n 8,\n 'dUS8D',\n 'Deerfi US8D',\n 'US8D',\n 'US8D Coin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n ''\n ],\n [\n '0xa222f7E9B40E8bddC35e9839f2CDaFfE6AF7AEa7',\n '0xC788f6d4b8722da2C6E27a0E30C348ec93349dc3',\n 6,\n 'dUS6D',\n 'Deerfi US6D',\n 'US6D',\n 'US6D Coin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png',\n ''\n ]\n ],\n [ChainId.GÖRLI]: [\n [\n '0xccaf265e7492c0d9b7c2f0018bf6382ba7f0148d',\n '0x70cba46d2e933030e2f274ae58c951c800548aef',\n 18,\n 'cBAT',\n 'Compound BAT',\n 'BAT',\n 'BAT',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0D8775F648430679A709E98d2b0Cb6250d2887EF/logo.png',\n ''\n ],\n [\n '0x822397d9a55d0fefd20f5c4bcab33c5f65bd28eb',\n '0xdc31ee1784292379fbb2964b3b9c4124d8f89c60',\n 18,\n 'cDAI',\n 'Compound DAI',\n 'DAI',\n 'Dai Stablecoin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png',\n ''\n ],\n [\n '0x20572e4c090f15667cf7378e16fad2ea0e2f3eff',\n '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',\n 18,\n 'cETH',\n 'Compound ETH',\n 'ETH',\n 'Ether',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n ''\n ],\n [\n '0xcec4a43ebb02f9b80916f1c718338169d6d5c1f0',\n '0xd87ba7a50b2e7e660f678a895e4b72e7cb4ccd9c',\n 6,\n 'cUSDC',\n 'Compound USDC',\n 'USDC',\n 'USD Coin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n ''\n ],\n [\n '0x6ce27497a64fffb5517aa4aee908b1e7eb63b9ff',\n '0xc04b0d3107736c32e19f1c62b2af67be61d63a05',\n 8,\n 'cWBTC',\n 'Compound WBTC',\n 'WBTC',\n 'Wrapped BTC',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/logo.png',\n ''\n ],\n [\n '0xa253295ec2157b8b69c44b2cb35360016daa25b1',\n '0xe4e81fa6b16327d4b78cfeb83aade04ba7075165',\n 18,\n 'cZRX',\n 'Compound ZRX',\n 'ZRX',\n '0x',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xE41d2489571d322189246DaFA5ebDe1F4699F498/logo.png',\n ''\n ]\n ],\n [ChainId.KOVAN]: [\n [\n '0x41b5844f4680a8c38fbb695b7f9cfd1f64474a72',\n '0xd0A1E359811322d97991E03f863a0C30C2cF029C',\n 18,\n 'cETH',\n 'Compound ETH',\n 'ETH',\n 'Ether',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png',\n ''\n ],\n [\n '0x4a77faee9650b09849ff459ea1476eab01606c7a',\n '0x482dC9bB08111CB875109B075A40881E48aE02Cd',\n 18,\n 'cBAT',\n 'Compound BAT',\n 'BAT',\n 'Basic Attention Token',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0D8775F648430679A709E98d2b0Cb6250d2887EF/logo.png',\n ''\n ],\n [\n '0x4a92e71227d294f041bd82dd8f78591b75140d63',\n '0xb7a4F3E9097C08dA09517b5aB877F7a917224ede',\n 6,\n 'cUSDC',\n 'Compound USDC',\n 'USDC',\n 'USD Coin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n ''\n ],\n [\n '0xf0d0eb522cfa50b716b3b1604c4f0fa6f04376ad',\n '0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa',\n 18,\n 'cDAI',\n 'Compound DAI',\n 'DAI',\n 'Dai Stablecoin',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png',\n ''\n ],\n [\n '0x3f0a0ea2f86bae6362cf9799b523ba06647da018',\n '0x07de306FF27a2B630B1141956844eB1552B956B5',\n 6,\n 'cUSDT',\n 'Compound USDT',\n 'USDT',\n 'Tether USD',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png',\n ''\n ],\n [\n '0xa1faa15655b0e7b6b6470ed3d096390e6ad93abb',\n '0xd3A691C852CDB01E281545A27064741F0B7f6825',\n 8,\n 'cWBTC',\n 'Compound WBTC',\n 'WBTC',\n 'Wrapped BTC',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/logo.png',\n ''\n ],\n [\n '0xaf45ae737514c8427d373d50cd979a242ec59e5a',\n '0x162c44e53097e7B5aaE939b297ffFD6Bf90D1EE3',\n 18,\n 'cZRX',\n 'Compound ZRX',\n 'ZRX',\n '0x Protocol Token',\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xE41d2489571d322189246DaFA5ebDe1F4699F498/logo.png',\n ''\n ]\n ]\n}\n\nconst COMPTROLLER_INTERFACE = new Interface(COMPTROLLER_ABI)\nconst CHAINLINK_PRICE_ORACLE_PROXY = new Interface(CHAINLINK_PRICE_ORACLE_PROXY_ABI)\n\nexport {\n COMPTROLLER_ADDRESSES,\n ORACLE_ADDRESSES,\n MAXIMILLION_ADDRESSES,\n CTOKEN_LISTS,\n COMPTROLLER_INTERFACE,\n CHAINLINK_PRICE_ORACLE_PROXY,\n COMPTROLLER_ABI,\n CHAINLINK_PRICE_ORACLE_PROXY_ABI\n}\n","import { Contract } from '@ethersproject/contracts'\nimport { getAddress } from '@ethersproject/address'\nimport { AddressZero } from '@ethersproject/constants'\nimport { JsonRpcSigner, Web3Provider } from '@ethersproject/providers'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { abi as IUniswapV2Router02ABI } from '@uniswap/v2-periphery/build/IUniswapV2Router02.json'\nimport { abi as IFlashLoanV1Router01ABI } from '../constants/flashLoan/IFlashLoanV1Router01.json'\nimport { abi as ICERC20ABI } from '../constants/lend/c_erc20_interface.json'\nimport { abi as ICEtherABI } from '../constants/lend/c_ether.json'\nimport { abi as IMaximillionABI } from '../constants/lend/maximillion.json'\nimport { GOVERNANCE_ADDRESS, ROUTER_ADDRESS } from '../constants'\nimport { ROUTER_ADDRESS as FLASH_LOAN_ROUTER_ADDRESS } from '../constants/flashLoan'\nimport { ChainId, JSBI, Percent, Token, CurrencyAmount, Currency, ETHER, Fraction } from '@uniswap/sdk'\nimport { TokenAddressMap } from '../state/lists/hooks'\nimport { COMPTROLLER_ABI, COMPTROLLER_ADDRESSES, MAXIMILLION_ADDRESSES } from '../constants/lend'\nimport { CToken } from '../data/CToken'\nimport { abi as GOVERNANCE_ABI } from '@uniswap/governance/build/GovernorAlpha.json'\n\n// returns the checksummed address if the address is valid, otherwise returns false\nexport function isAddress(value: any): string | false {\n try {\n return getAddress(value)\n } catch {\n return false\n }\n}\n\nconst ETHERSCAN_PREFIXES: { [chainId in ChainId]: string } = {\n 1: '',\n 3: 'ropsten.',\n 4: 'rinkeby.',\n 5: 'goerli.',\n 42: 'kovan.'\n}\n\nexport function getEtherscanLink(\n chainId: ChainId,\n data: string,\n type: 'transaction' | 'token' | 'address' | 'block'\n): string {\n const prefix = `https://${ETHERSCAN_PREFIXES[chainId] || ETHERSCAN_PREFIXES[1]}etherscan.io`\n\n switch (type) {\n case 'transaction': {\n return `${prefix}/tx/${data}`\n }\n case 'token': {\n return `${prefix}/token/${data}`\n }\n case 'block': {\n return `${prefix}/block/${data}`\n }\n case 'address':\n default: {\n return `${prefix}/address/${data}`\n }\n }\n}\n\n// shorten the checksummed version of the input address to have 0x + 4 characters at start and end\nexport function shortenAddress(address: string, chars = 4): string {\n const parsed = isAddress(address)\n if (!parsed) {\n throw Error(`Invalid 'address' parameter '${address}'.`)\n }\n return `${parsed.substring(0, chars + 2)}...${parsed.substring(42 - chars)}`\n}\n\n// add 10%\nexport function calculateGasMargin(value: BigNumber): BigNumber {\n return value.mul(BigNumber.from(10000).add(BigNumber.from(1000))).div(BigNumber.from(10000))\n}\n\n// converts a basis points value to a sdk percent\nexport function basisPointsToPercent(num: number): Percent {\n return new Percent(JSBI.BigInt(num), JSBI.BigInt(10000))\n}\n\nexport function calculateSlippageAmount(value: CurrencyAmount, slippage: number): [JSBI, JSBI] {\n if (slippage < 0 || slippage > 10000) {\n throw Error(`Unexpected slippage value: ${slippage}`)\n }\n return [\n JSBI.divide(JSBI.multiply(value.raw, JSBI.BigInt(10000 - slippage)), JSBI.BigInt(10000)),\n JSBI.divide(JSBI.multiply(value.raw, JSBI.BigInt(10000 + slippage)), JSBI.BigInt(10000))\n ]\n}\n\n// account is not optional\nexport function getSigner(library: Web3Provider, account: string): JsonRpcSigner {\n return library.getSigner(account).connectUnchecked()\n}\n\n// account is optional\nexport function getProviderOrSigner(library: Web3Provider, account?: string): Web3Provider | JsonRpcSigner {\n return account ? getSigner(library, account) : library\n}\n\n// account is optional\nexport function getContract(address: string, ABI: any, library: Web3Provider, account?: string): Contract {\n if (!isAddress(address) || address === AddressZero) {\n throw Error(`Invalid 'address' parameter '${address}'.`)\n }\n\n return new Contract(address, ABI, getProviderOrSigner(library, account) as any)\n}\n\n// account is optional\nexport function getRouterContract(_: number, library: Web3Provider, account?: string): Contract {\n return getContract(ROUTER_ADDRESS, IUniswapV2Router02ABI, library, account)\n}\n\n// account is optional\nexport function getFlashLoanRouterContract(_: number, library: Web3Provider, account?: string): Contract {\n return getContract(FLASH_LOAN_ROUTER_ADDRESS, IFlashLoanV1Router01ABI, library, account)\n}\n\nexport function getCERC20Contract(_: number, cTokenAddress: string, library: Web3Provider, account?: string): Contract {\n return getContract(cTokenAddress, ICERC20ABI, library, account)\n}\n\nexport function getCEtherContract(_: number, cTokenAddress: string, library: Web3Provider, account?: string): Contract {\n return getContract(cTokenAddress, ICEtherABI, library, account)\n}\n\nexport function getMaximillionContract(chainId: number, library: Web3Provider, account?: string): Contract {\n return getContract(MAXIMILLION_ADDRESSES[chainId as ChainId], IMaximillionABI, library, account)\n}\n\nexport function getComptrollerContract(chainId: number, library: Web3Provider, account?: string): Contract {\n return getContract(COMPTROLLER_ADDRESSES[chainId as ChainId], COMPTROLLER_ABI, library, account)\n}\n\nexport function geGovContract(chainId: number, library: Web3Provider, account?: string): Contract {\n return getContract(GOVERNANCE_ADDRESS, GOVERNANCE_ABI, library, account)\n}\n\nexport function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // $& means the whole matched string\n}\n\nexport function isTokenOnList(defaultTokens: TokenAddressMap, currency?: Currency): boolean {\n if (currency === ETHER) return true\n return Boolean(currency instanceof Token && defaultTokens[currency.chainId]?.[currency.address])\n}\n\nexport const ETH_MANTISSA = 1e18\nexport const BLOCKS_PER_DAY = 4 * 60 * 24\nexport const DAYS_PER_YEAR = 365\nconst ZERO = JSBI.BigInt(0)\nexport const ONE = JSBI.BigInt(1)\nconst ZERO_FRACTION = new Fraction(ZERO, ONE)\nexport const ONE_HUNDRED = JSBI.BigInt(100)\nexport const ONE_THOUSAND = JSBI.BigInt(1000)\nexport const ONE_MILLION = JSBI.BigInt(1000000)\nexport const ONE_BILLION = JSBI.BigInt(1000000000)\nexport const ONE_TRILLION = JSBI.BigInt(1000000000000)\n\nexport const APY_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(16))\nexport const EXA_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const THOUSAND_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(21))\nexport const MILLION_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(24))\nexport const BILLION_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(27))\nexport const TRILLION_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(30))\n\nexport const LIMIT_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(36))\nexport const EXCHANGE_RATE_MANTISSA = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const COLLATERAL_FACTOR_MANTISSA = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const LIQUIDITY = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const UNDERLYING_ASSETS_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(36))\nexport const ONE_THOUSAND_VALUE = JSBI.multiply(ONE_THOUSAND, EXA_BASE)\nexport const ONE_MILLION_VALUE = JSBI.multiply(ONE_MILLION, EXA_BASE)\nexport const ONE_BILLION_VALUE = JSBI.multiply(ONE_BILLION, EXA_BASE)\nexport const ONE_TRILLION_VALUE = JSBI.multiply(ONE_TRILLION, EXA_BASE)\n\nexport function getSupplyTotalBalance(allMarketsAsset: CToken[]): JSBI {\n let supplyTotalBalance = JSBI.BigInt(0)\n for (let i = 0; i < allMarketsAsset.length; i++) {\n supplyTotalBalance = JSBI.add(supplyTotalBalance, allMarketsAsset[i].getSupplyBalanceJSBI())\n }\n return supplyTotalBalance\n}\n\nexport function getBorrowTotalBalance(allMarketsAsset: CToken[]): JSBI {\n let borrowTotalBalance = JSBI.BigInt(0)\n for (let i = 0; i < allMarketsAsset.length; i++) {\n borrowTotalBalance = JSBI.add(borrowTotalBalance, allMarketsAsset[i].getBorrowBalanceJSBI())\n }\n return borrowTotalBalance\n}\n\nexport function getLimit(allMarketsAsset: CToken[]): JSBI {\n let totalLimit = JSBI.BigInt(0)\n\n for (let i = 0; i < allMarketsAsset.length; i++) {\n if (allMarketsAsset[i].canBeCollateral) {\n totalLimit = JSBI.add(totalLimit, allMarketsAsset[i].getSuppliedValue())\n }\n }\n\n return totalLimit\n}\n\nexport function sumUnderlyingAssets(allMarketsAsset: CToken[]): JSBI {\n let sumUnderlyingAssets = ZERO\n for (let i = 0; i < allMarketsAsset.length; i++) {\n const supplyAssets: JSBI = JSBI.multiply(\n getSupplyTotalBalance([allMarketsAsset[i]]),\n allMarketsAsset[i].getSupplyApy()\n )\n const borrowAssets: JSBI = JSBI.multiply(\n getBorrowTotalBalance([allMarketsAsset[i]]),\n allMarketsAsset[i].getBorrowApy()\n )\n\n sumUnderlyingAssets = JSBI.add(sumUnderlyingAssets, JSBI.subtract(supplyAssets, borrowAssets))\n }\n return JSBI.divide(sumUnderlyingAssets, APY_BASE)\n}\n\nexport function formatData(val: JSBI): Fraction {\n return new Fraction(val, EXA_BASE)\n}\n\nexport function getNetApy(allMarketsAsset: CToken[]): Fraction {\n let allBorrowUnderlyingAssets = ZERO\n\n for (let i = 0; i < allMarketsAsset.length; i++) {\n allBorrowUnderlyingAssets = JSBI.add(allBorrowUnderlyingAssets, getBorrowTotalBalance([allMarketsAsset[i]]))\n }\n\n const sumAssets = sumUnderlyingAssets(allMarketsAsset)\n const supplyTotalBalance = getSupplyTotalBalance(allMarketsAsset)\n\n if (JSBI.greaterThan(sumAssets, ZERO)) {\n return new Fraction(sumAssets, supplyTotalBalance)\n } else if (JSBI.lessThan(sumAssets, ZERO)) {\n return new Fraction(sumAssets, allBorrowUnderlyingAssets)\n } else {\n return ZERO_FRACTION\n }\n}\n\nexport function showDollarValue(val: JSBI): string {\n if (JSBI.lessThan(val, ONE_THOUSAND_VALUE)) {\n return new Fraction(val, EXA_BASE).toFixed(2)\n } else if (JSBI.greaterThanOrEqual(val, ONE_THOUSAND_VALUE) && JSBI.lessThan(val, ONE_MILLION_VALUE)) {\n return new Fraction(val, THOUSAND_BASE).toFixed(2) + 'K'\n } else if (JSBI.greaterThanOrEqual(val, ONE_MILLION_VALUE) && JSBI.lessThan(val, ONE_BILLION_VALUE)) {\n return new Fraction(val, MILLION_BASE).toFixed(2) + 'M'\n } else if (JSBI.greaterThanOrEqual(val, ONE_BILLION_VALUE) && JSBI.lessThan(val, ONE_TRILLION_VALUE)) {\n return new Fraction(val, BILLION_BASE).toFixed(2) + 'B'\n } else if (JSBI.greaterThanOrEqual(val, ONE_TRILLION_VALUE)) {\n return ' > 1T'\n } else {\n return '0'\n }\n}\n\nexport function getTotalMarketSize(allMarketsAsset: CToken[]): JSBI {\n let totalMarketSize = JSBI.BigInt(0)\n\n for (let i = 0; i < allMarketsAsset.length; i++) {\n totalMarketSize = JSBI.add(totalMarketSize, allMarketsAsset[i].getMarketSize())\n }\n return totalMarketSize\n}\n","import { Contract } from '@ethersproject/contracts'\nimport { abi as GOVERNANCE_ABI } from '@uniswap/governance/build/GovernorAlpha.json'\nimport { abi as UNI_ABI } from '@uniswap/governance/build/Uni.json'\nimport { abi as STAKING_REWARDS_ABI } from '@uniswap/liquidity-staker/build/StakingRewards.json'\nimport { abi as MERKLE_DISTRIBUTOR_ABI } from '@uniswap/merkle-distributor/build/MerkleDistributor.json'\nimport { ChainId, WETH } from '@uniswap/sdk'\nimport { abi as IUniswapV2PairABI } from '@uniswap/v2-core/build/IUniswapV2Pair.json'\nimport { abi as IFlashLoanV1PoolABI } from '../constants/flashLoan/IFlashLoanV1Pool.json'\nimport { useMemo } from 'react'\nimport { DEER, GOVERNANCE_ADDRESS, MERKLE_DISTRIBUTOR_ADDRESS, UNI } from '../constants'\nimport {\n ARGENT_WALLET_DETECTOR_ABI,\n ARGENT_WALLET_DETECTOR_MAINNET_ADDRESS\n} from '../constants/abis/argent-wallet-detector'\nimport ENS_PUBLIC_RESOLVER_ABI from '../constants/abis/ens-public-resolver.json'\nimport ENS_ABI from '../constants/abis/ens-registrar.json'\nimport { ERC20_BYTES32_ABI } from '../constants/abis/erc20'\nimport ERC20_ABI from '../constants/abis/erc20.json'\nimport { MIGRATOR_ABI, MIGRATOR_ADDRESS } from '../constants/abis/migrator'\nimport UNISOCKS_ABI from '../constants/abis/unisocks.json'\nimport WETH_ABI from '../constants/abis/weth.json'\nimport { MULTICALL_ABI, MULTICALL_NETWORKS } from '../constants/multicall'\nimport { V1_EXCHANGE_ABI, V1_FACTORY_ABI, V1_FACTORY_ADDRESSES } from '../constants/v1'\nimport {\n COMPTROLLER_ABI,\n CHAINLINK_PRICE_ORACLE_PROXY_ABI,\n COMPTROLLER_ADDRESSES,\n ORACLE_ADDRESSES\n} from '../constants/lend'\nimport { getContract } from '../utils'\nimport { useActiveWeb3React } from './index'\n\n// returns null on errors\nfunction useContract(address: string | undefined, ABI: any, withSignerIfPossible = true): Contract | null {\n const { library, account } = useActiveWeb3React()\n\n return useMemo(() => {\n if (!address || !ABI || !library) return null\n try {\n return getContract(address, ABI, library, withSignerIfPossible && account ? account : undefined)\n } catch (error) {\n console.error('Failed to get contract', error)\n return null\n }\n }, [address, ABI, library, withSignerIfPossible, account])\n}\n\nexport function useComptrollerContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId && COMPTROLLER_ADDRESSES[chainId], COMPTROLLER_ABI, false)\n}\n\nexport function useOracleContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId && ORACLE_ADDRESSES[chainId], CHAINLINK_PRICE_ORACLE_PROXY_ABI, false)\n}\n\nexport function useV1FactoryContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId && V1_FACTORY_ADDRESSES[chainId], V1_FACTORY_ABI, false)\n}\n\nexport function useV2MigratorContract(): Contract | null {\n return useContract(MIGRATOR_ADDRESS, MIGRATOR_ABI, true)\n}\n\nexport function useV1ExchangeContract(address?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(address, V1_EXCHANGE_ABI, withSignerIfPossible)\n}\n\nexport function useTokenContract(tokenAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(tokenAddress, ERC20_ABI, withSignerIfPossible)\n}\n\nexport function useWETHContract(withSignerIfPossible?: boolean): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId ? WETH[chainId].address : undefined, WETH_ABI, withSignerIfPossible)\n}\n\nexport function useArgentWalletDetectorContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(\n chainId === ChainId.MAINNET ? ARGENT_WALLET_DETECTOR_MAINNET_ADDRESS : undefined,\n ARGENT_WALLET_DETECTOR_ABI,\n false\n )\n}\n\nexport function useENSRegistrarContract(withSignerIfPossible?: boolean): Contract | null {\n const { chainId } = useActiveWeb3React()\n let address: string | undefined\n if (chainId) {\n switch (chainId) {\n case ChainId.MAINNET:\n case ChainId.GÖRLI:\n case ChainId.ROPSTEN:\n case ChainId.RINKEBY:\n address = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'\n break\n }\n }\n return useContract(address, ENS_ABI, withSignerIfPossible)\n}\n\nexport function useENSResolverContract(address: string | undefined, withSignerIfPossible?: boolean): Contract | null {\n return useContract(address, ENS_PUBLIC_RESOLVER_ABI, withSignerIfPossible)\n}\n\nexport function useBytes32TokenContract(tokenAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(tokenAddress, ERC20_BYTES32_ABI, withSignerIfPossible)\n}\n\nexport function usePairContract(pairAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(pairAddress, IUniswapV2PairABI, withSignerIfPossible)\n}\n\nexport function useFlashLoanPoolContract(poolAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(poolAddress, IFlashLoanV1PoolABI, withSignerIfPossible)\n}\n\nexport function useMulticallContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId && MULTICALL_NETWORKS[chainId], MULTICALL_ABI, false)\n}\n\nexport function useMerkleDistributorContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId ? MERKLE_DISTRIBUTOR_ADDRESS[chainId] : undefined, MERKLE_DISTRIBUTOR_ABI, true)\n}\n\nexport function useGovernanceContract(): Contract | null {\n return useContract(GOVERNANCE_ADDRESS, GOVERNANCE_ABI, true)\n}\n\nexport function useUniContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId ? UNI[chainId].address : undefined, UNI_ABI, true)\n}\n\nexport function useDeerContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId ? DEER[chainId].address : undefined, UNI_ABI, true)\n}\n\nexport function useStakingContract(stakingAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(stakingAddress, STAKING_REWARDS_ABI, withSignerIfPossible)\n}\n\nexport function useSocksController(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(\n chainId === ChainId.MAINNET ? '0x65770b5283117639760beA3F867b69b3697a91dd' : undefined,\n UNISOCKS_ABI,\n false\n )\n}\n","import { ChainId, JSBI, Token } from '@uniswap/sdk'\nimport { useMemo } from 'react'\nimport { useActiveWeb3React } from '../hooks'\nimport { useMultipleContractSingleData, useSingleContractMultipleData } from '../state/multicall/hooks'\nimport { abi as ICTokenABI } from '../constants/abis/ctoken.json'\nimport { Interface } from '@ethersproject/abi'\nimport { useComptrollerContract, useOracleContract } from '../hooks/useContract'\nimport { CTOKEN_LISTS } from '../constants/lend'\nimport { EXA_BASE } from '../utils'\nimport { BigNumber } from 'ethers'\n\nconst CTOKEN_INTERFACE = new Interface(ICTokenABI)\n\nexport enum CTokenState {\n LOADING,\n NOT_EXISTS,\n EXISTS,\n INVALID\n}\n\nexport const ETH_MANTISSA = 1e18\nexport const BLOCKS_PER_DAY = 5760 // 4 * 60 * 24\nexport const DAYS_PER_YEAR = 365\n\nexport const ONE = JSBI.BigInt(1)\nexport const EIGHT = JSBI.BigInt(8)\nexport const EXCHANGE_RATE_MANTISSA = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const COLLATERAL_FACTOR_MANTISSA = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const UNDERLYING_PRICE_BASE = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const LIQUIDITY = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nexport const ZERO_POINT_EIGHT = JSBI.multiply(EIGHT, JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(17)))\nexport const APY_BASE_NUMBER = Math.pow(10, 38)\n\nexport class CToken extends Token {\n public readonly cAddress: string\n public readonly cDecimals: number\n public readonly cSymbol?: string\n public readonly cName?: string\n public readonly supplyRatePerBlock?: number | BigNumber\n public readonly borrowRatePerBlock?: number | BigNumber\n public readonly balanceUnderlying?: number | BigNumber\n public readonly supplyBalance?: number | BigNumber\n public readonly borrowBalance?: number | BigNumber\n public readonly exchangeRateMantissa?: number | BigNumber\n public readonly totalSupply?: number | BigNumber\n public readonly liquidity?: number | BigNumber\n public readonly canBeCollateral?: boolean\n public readonly underlyingPrice?: number | BigNumber\n public readonly isListed?: boolean\n public readonly collateralFactorMantissa?: number | BigNumber\n public readonly logo0?: string\n public readonly logo1?: string\n\n constructor(\n chainId: ChainId,\n cAddress: string,\n address: string,\n decimals: number,\n cSymbol?: string,\n cName?: string,\n symbol?: string,\n name?: string,\n supplyRatePerBlock?: number | BigNumber,\n borrowRatePerBlock?: number | BigNumber,\n balanceUnderlying?: number | BigNumber,\n supplyBalance?: number | BigNumber,\n borrowBalance?: number | BigNumber,\n exchangeRateMantissa?: number | BigNumber,\n totalSupply?: number | BigNumber,\n liquidity?: number | BigNumber,\n canBeCollateral?: boolean,\n underlyingPrice?: number | BigNumber,\n isListed?: boolean,\n collateralFactorMantissa?: number | BigNumber,\n logo0?: string,\n logo1?: string\n ) {\n super(chainId, address, decimals, symbol, name)\n\n this.cAddress = cAddress\n this.cDecimals = 8\n this.cSymbol = cSymbol\n this.cName = cName\n this.supplyRatePerBlock = supplyRatePerBlock\n this.borrowRatePerBlock = borrowRatePerBlock\n this.balanceUnderlying = balanceUnderlying\n this.supplyBalance = supplyBalance\n this.borrowBalance = borrowBalance\n this.exchangeRateMantissa = exchangeRateMantissa\n this.totalSupply = totalSupply\n this.liquidity = liquidity\n this.canBeCollateral = canBeCollateral\n this.underlyingPrice = underlyingPrice\n this.isListed = isListed\n this.collateralFactorMantissa = collateralFactorMantissa\n this.logo0 = logo0\n this.logo1 = logo1\n }\n\n public equals(other: CToken): boolean {\n if (this === other) {\n return true\n }\n return this.chainId === other.chainId && this.cAddress === other.cAddress\n }\n\n public isETH(): boolean {\n return this.chainId && this.symbol === 'ETH'\n }\n\n public getBorrowBalanceAmount() {\n return JSBI.BigInt(this.borrowBalance ?? 0)\n }\n\n public getSupplyApy(): JSBI {\n const totalRate = Math.floor(\n Math.pow((((this.supplyRatePerBlock as number) ?? 0) / ETH_MANTISSA) * BLOCKS_PER_DAY + 1, DAYS_PER_YEAR - 1) *\n ETH_MANTISSA\n )\n\n return JSBI.subtract(JSBI.BigInt(totalRate), EXA_BASE)\n }\n\n public getBorrowApy(): JSBI {\n const totalRate = Math.floor(\n Math.pow((((this.borrowRatePerBlock as number) ?? 0) / ETH_MANTISSA) * BLOCKS_PER_DAY + 1, DAYS_PER_YEAR - 1) *\n ETH_MANTISSA\n )\n\n return JSBI.subtract(JSBI.BigInt(totalRate), EXA_BASE)\n }\n\n public getSupplyBalanceAmount(): JSBI {\n return JSBI.divide(\n JSBI.multiply(JSBI.BigInt(this.supplyBalance ?? 0), JSBI.BigInt(this.exchangeRateMantissa ?? 0)),\n EXA_BASE\n )\n }\n\n public getSupplyBalanceJSBI(): JSBI {\n return JSBI.divide(\n JSBI.multiply(this.getSupplyBalanceAmount(), JSBI.BigInt(this.underlyingPrice ?? 0)),\n UNDERLYING_PRICE_BASE\n )\n }\n\n public getTotalSupplyBalanceAmount(): JSBI {\n return JSBI.divide(\n JSBI.multiply(JSBI.BigInt(this.totalSupply ?? 0), JSBI.BigInt(this.exchangeRateMantissa ?? 0)),\n EXA_BASE\n )\n }\n\n public getMarketSize(): JSBI {\n return JSBI.divide(\n JSBI.multiply(this.getTotalSupplyBalanceAmount(), JSBI.BigInt(this.underlyingPrice ?? 0)),\n UNDERLYING_PRICE_BASE\n )\n }\n\n public getSuppliedValue(): JSBI {\n return JSBI.divide(\n JSBI.multiply(this.getSupplyBalanceJSBI(), JSBI.BigInt(this.collateralFactorMantissa ?? 0)),\n COLLATERAL_FACTOR_MANTISSA\n )\n }\n\n public getBorrowBalanceJSBI(): JSBI {\n return JSBI.divide(\n JSBI.multiply(JSBI.BigInt(this.borrowBalance ?? 0), JSBI.BigInt(this.underlyingPrice ?? 0)),\n UNDERLYING_PRICE_BASE\n )\n }\n\n public getLiquidity(): JSBI {\n return JSBI.BigInt(this.liquidity ?? 0)\n }\n\n public getLiquidityValue(): JSBI {\n return JSBI.divide(\n JSBI.multiply(JSBI.BigInt(this.liquidity ?? 0), JSBI.BigInt(this.underlyingPrice ?? 0)),\n EXA_BASE\n )\n }\n\n public getUnderlyingPrice(): JSBI {\n return JSBI.BigInt(this.underlyingPrice ?? 0)\n }\n\n public getCollateralFactorMantissa(): JSBI {\n return JSBI.BigInt(this.collateralFactorMantissa ?? 0)\n }\n}\n\nexport function useCTokens(): [CTokenState, CToken | null][] {\n const { chainId, account } = useActiveWeb3React()\n\n const cTokenList = CTOKEN_LISTS[chainId ?? ChainId.MAINNET]\n\n const accountArg = useMemo(() => [account ?? undefined], [account])\n\n const accountSnapshotaccountArg = useMemo(() => [account ?? '0x0000000000000000000000000000000000000000'], [account])\n\n const cTokenAddresses = useMemo(\n () =>\n cTokenList.map(cTokenInfo => {\n return cTokenInfo[0]\n }),\n [cTokenList]\n )\n\n const hasAccountMembershipArgs = useMemo(\n () =>\n cTokenAddresses.map(cTokenAddress => {\n return [account ?? undefined, cTokenAddress]\n }),\n [cTokenAddresses, account]\n )\n\n const membershipArgs = useMemo(() => (account ? hasAccountMembershipArgs : []), [account, hasAccountMembershipArgs])\n const comptroller = useComptrollerContract()\n const oracle = useOracleContract()\n\n const supplyRatePerBlockResults = useMultipleContractSingleData(\n cTokenAddresses,\n CTOKEN_INTERFACE,\n 'supplyRatePerBlock'\n )\n const borrowRatePerBlockResults = useMultipleContractSingleData(\n cTokenAddresses,\n CTOKEN_INTERFACE,\n 'borrowRatePerBlock'\n )\n const balanceOfUnderlyingResults = useMultipleContractSingleData(\n cTokenAddresses,\n CTOKEN_INTERFACE,\n 'balanceOfUnderlying',\n accountArg\n )\n const borrowBalanceCurrentResults = useMultipleContractSingleData(\n cTokenAddresses,\n CTOKEN_INTERFACE,\n 'borrowBalanceCurrent',\n accountArg\n )\n const accountSnapshotResults = useMultipleContractSingleData(\n cTokenAddresses,\n CTOKEN_INTERFACE,\n 'getAccountSnapshot',\n accountSnapshotaccountArg\n )\n const totalSupplyResults = useMultipleContractSingleData(cTokenAddresses, CTOKEN_INTERFACE, 'totalSupply')\n const cashResults = useMultipleContractSingleData(cTokenAddresses, CTOKEN_INTERFACE, 'getCash')\n const membershipResults = useSingleContractMultipleData(comptroller, 'checkMembership', membershipArgs)\n const underlyingPriceResults = useSingleContractMultipleData(\n oracle,\n 'getUnderlyingPrice',\n cTokenAddresses.map(cTokenAddress => [cTokenAddress])\n )\n const marketsResults = useSingleContractMultipleData(\n comptroller,\n 'markets',\n cTokenAddresses.map(cTokenAddress => [cTokenAddress])\n )\n\n return useMemo(() => {\n return supplyRatePerBlockResults.map((supplyRatePerBlockResult, i) => {\n const { result: supplyRatePerBlockValue, loading: supplyRatePerBlockResultLoading } = supplyRatePerBlockResult\n const { result: borrowRatePerBlockValue, loading: borrowRatePerBlockResultLoading } = borrowRatePerBlockResults[i]\n const { result: balanceUnderlyingValue, loading: balanceUnderlyingResultLoading } =\n balanceOfUnderlyingResults.length !== 0 ? balanceOfUnderlyingResults[i] : { result: [0], loading: false }\n const { result: borrowBalanceValue, loading: borrowBalanceResultLoading } =\n borrowBalanceCurrentResults.length !== 0 ? borrowBalanceCurrentResults[i] : { result: [0], loading: false }\n const { result: accountSnapshotValue, loading: accountSnapshotResultLoading } =\n accountSnapshotResults.length !== 0 ? accountSnapshotResults[i] : { result: [0, 0, 0, 0], loading: false }\n const { result: totalSupplyValue, loading: totalSupplyResultLoading } = totalSupplyResults[i]\n const { result: cashValue, loading: cashResultLoading } = cashResults[i]\n const { result: membershipValue, loading: membershipLoading } =\n membershipResults.length !== 0 ? membershipResults[i] : { result: [0], loading: false }\n const { result: underlyingPriceValue, loading: underlyingPriceLoading } = underlyingPriceResults[i]\n const { result: marketsValue, loading: marketsResultLoading } =\n marketsResults.length !== 0 ? marketsResults[i] : { result: [0, 0, 0], loading: false }\n\n if (supplyRatePerBlockResultLoading) return [CTokenState.LOADING, null]\n if (borrowRatePerBlockResultLoading) return [CTokenState.LOADING, null]\n if (balanceUnderlyingResultLoading) return [CTokenState.LOADING, null]\n if (borrowBalanceResultLoading) return [CTokenState.LOADING, null]\n if (accountSnapshotResultLoading) return [CTokenState.LOADING, null]\n if (cashResultLoading) return [CTokenState.LOADING, null]\n if (totalSupplyResultLoading) return [CTokenState.LOADING, null]\n if (membershipLoading) return [CTokenState.LOADING, null]\n if (underlyingPriceLoading) return [CTokenState.LOADING, null]\n if (marketsResultLoading) return [CTokenState.LOADING, null]\n\n if (!supplyRatePerBlockValue) return [CTokenState.NOT_EXISTS, null]\n if (!borrowRatePerBlockValue) return [CTokenState.NOT_EXISTS, null]\n if (!balanceUnderlyingValue) return [CTokenState.NOT_EXISTS, null]\n if (!borrowBalanceValue) return [CTokenState.NOT_EXISTS, null]\n if (!accountSnapshotValue) return [CTokenState.NOT_EXISTS, null]\n if (!totalSupplyValue) return [CTokenState.NOT_EXISTS, null]\n if (!cashValue) return [CTokenState.NOT_EXISTS, null]\n if (!membershipValue) return [CTokenState.NOT_EXISTS, null]\n if (!underlyingPriceValue) return [CTokenState.NOT_EXISTS, null]\n if (!marketsValue) return [CTokenState.NOT_EXISTS, null]\n\n return [\n CTokenState.EXISTS,\n new CToken(\n chainId ?? ChainId.MAINNET,\n cTokenList[i][0],\n cTokenList[i][1],\n cTokenList[i][2],\n cTokenList[i][3],\n cTokenList[i][4],\n cTokenList[i][5],\n cTokenList[i][6],\n supplyRatePerBlockValue[0],\n borrowRatePerBlockValue[0],\n balanceUnderlyingValue[0],\n accountSnapshotValue[1],\n borrowBalanceValue[0],\n accountSnapshotValue[3],\n totalSupplyValue[0],\n cashValue[0],\n membershipValue[0],\n underlyingPriceValue[0],\n marketsValue[0],\n marketsValue[1],\n cTokenList[i][7],\n cTokenList[i][8]\n )\n ]\n })\n }, [\n supplyRatePerBlockResults,\n borrowRatePerBlockResults,\n balanceOfUnderlyingResults,\n borrowBalanceCurrentResults,\n accountSnapshotResults,\n totalSupplyResults,\n cashResults,\n membershipResults,\n underlyingPriceResults,\n marketsResults,\n chainId,\n cTokenList\n ])\n}\n","import { isAddress } from '../../utils'\nimport { Token } from '@uniswap/sdk'\n\nexport function filterTokens(tokens: Token[], search: string): Token[] {\n if (search.length === 0) return tokens\n\n const searchingAddress = isAddress(search)\n\n if (searchingAddress) {\n return tokens.filter(token => token.address === searchingAddress)\n }\n\n const lowerSearchParts = search\n .toLowerCase()\n .split(/\\s+/)\n .filter(s => s.length > 0)\n\n if (lowerSearchParts.length === 0) {\n return tokens\n }\n\n const matchesSearch = (s: string): boolean => {\n const sParts = s\n .toLowerCase()\n .split(/\\s+/)\n .filter(s => s.length > 0)\n\n return lowerSearchParts.every(p => p.length === 0 || sParts.some(sp => sp.startsWith(p) || sp.endsWith(p)))\n }\n\n return tokens.filter(token => {\n const { symbol, name } = token\n return (symbol && matchesSearch(symbol)) || (name && matchesSearch(name))\n })\n // .sort((t0: Token, t1: Token) => {\n // if (t0.symbol && matchesSearch(t0.symbol) && t1.symbol && !matchesSearch(t1.symbol)) {\n // return -1\n // }\n // if (t0.symbol && !matchesSearch(t0.symbol) && t1.symbol && matchesSearch(t1.symbol)) {\n // return 1\n // }\n // return 0\n // })\n}\n","import { TokenAddressMap, useDefaultTokenList, useUnsupportedTokenList } from './../state/lists/hooks'\nimport { parseBytes32String } from '@ethersproject/strings'\nimport { Currency, ETHER, Token, currencyEquals } from '@uniswap/sdk'\nimport { useMemo } from 'react'\nimport { useCombinedActiveList, useCombinedInactiveList } from '../state/lists/hooks'\nimport { CToken, useCTokens } from '../data/CToken'\nimport { NEVER_RELOAD, useSingleCallResult } from '../state/multicall/hooks'\nimport { useUserAddedTokens } from '../state/user/hooks'\nimport { isAddress } from '../utils'\n\nimport { useActiveWeb3React } from './index'\nimport { useBytes32TokenContract, useTokenContract } from './useContract'\nimport { filterTokens } from '../components/SearchModal/filtering'\nimport { arrayify } from 'ethers/lib/utils'\n\n// reduce token map into standard address <-> Token mapping, optionally include user added tokens\nfunction useTokensFromMap(tokenMap: TokenAddressMap, includeUserAdded: boolean): { [address: string]: Token } {\n const { chainId } = useActiveWeb3React()\n const userAddedTokens = useUserAddedTokens()\n\n return useMemo(() => {\n if (!chainId) return {}\n\n // reduce to just tokens\n const mapWithoutUrls = Object.keys(tokenMap[chainId]).reduce<{ [address: string]: Token }>((newMap, address) => {\n newMap[address] = tokenMap[chainId][address].token\n return newMap\n }, {})\n\n if (includeUserAdded) {\n return (\n userAddedTokens\n // reduce into all ALL_TOKENS filtered by the current chain\n .reduce<{ [address: string]: Token }>(\n (tokenMap, token) => {\n tokenMap[token.address] = token\n return tokenMap\n },\n // must make a copy because reduce modifies the map, and we do not\n // want to make a copy in every iteration\n { ...mapWithoutUrls }\n )\n )\n }\n\n return mapWithoutUrls\n }, [chainId, userAddedTokens, tokenMap, includeUserAdded])\n}\n\nexport function useDefaultTokens(): { [address: string]: Token } {\n const defaultList = useDefaultTokenList()\n return useTokensFromMap(defaultList, false)\n}\n\nexport function useAllTokens(): { [address: string]: Token } {\n const allTokens = useCombinedActiveList()\n return useTokensFromMap(allTokens, true)\n}\n\nexport function useAllInactiveTokens(): { [address: string]: Token } {\n // get inactive tokens\n const inactiveTokensMap = useCombinedInactiveList()\n const inactiveTokens = useTokensFromMap(inactiveTokensMap, false)\n\n // filter out any token that are on active list\n const activeTokensAddresses = Object.keys(useAllTokens())\n const filteredInactive = activeTokensAddresses\n ? Object.keys(inactiveTokens).reduce<{ [address: string]: Token }>((newMap, address) => {\n if (!activeTokensAddresses.includes(address)) {\n newMap[address] = inactiveTokens[address]\n }\n return newMap\n }, {})\n : inactiveTokens\n\n return filteredInactive\n}\n\nexport function useUnsupportedTokens(): { [address: string]: Token } {\n const unsupportedTokensMap = useUnsupportedTokenList()\n return useTokensFromMap(unsupportedTokensMap, false)\n}\n\nexport function useIsTokenActive(token: Token | undefined | null): boolean {\n const activeTokens = useAllTokens()\n\n if (!activeTokens || !token) {\n return false\n }\n\n return !!activeTokens[token.address]\n}\n\n// used to detect extra search results\nexport function useFoundOnInactiveList(searchQuery: string): Token[] | undefined {\n const { chainId } = useActiveWeb3React()\n const inactiveTokens = useAllInactiveTokens()\n\n return useMemo(() => {\n if (!chainId || searchQuery === '') {\n return undefined\n } else {\n const tokens = filterTokens(Object.values(inactiveTokens), searchQuery)\n return tokens\n }\n }, [chainId, inactiveTokens, searchQuery])\n}\n\nexport function useAllCTokens(): { [address: string]: CToken } {\n const { chainId } = useActiveWeb3React()\n const allCTokens = useCTokens()\n\n return useMemo(() => {\n if (!chainId) return {}\n const data = allCTokens.map((item: any) => {\n return {\n ...item?.[1]\n }\n })\n const allData: any = {}\n data.forEach((item: CToken) => {\n allData[item.address] = { ...item }\n })\n return allData\n }, [chainId, allCTokens])\n}\n\n// Check if currency is included in custom list from user storage\nexport function useIsUserAddedToken(currency: Currency | undefined | null): boolean {\n const userAddedTokens = useUserAddedTokens()\n\n if (!currency) {\n return false\n }\n\n return !!userAddedTokens.find(token => currencyEquals(currency, token))\n}\n\n// parse a name or symbol from a token response\nconst BYTES32_REGEX = /^0x[a-fA-F0-9]{64}$/\n\nfunction parseStringOrBytes32(str: string | undefined, bytes32: string | undefined, defaultValue: string): string {\n return str && str.length > 0\n ? str\n : // need to check for proper bytes string and valid terminator\n bytes32 && BYTES32_REGEX.test(bytes32) && arrayify(bytes32)[31] === 0\n ? parseBytes32String(bytes32)\n : defaultValue\n}\n\n// undefined if invalid or does not exist\n// null if loading\n// otherwise returns the token\nexport function useToken(tokenAddress?: string): Token | undefined | null {\n const { chainId } = useActiveWeb3React()\n const tokens = useAllTokens()\n\n const address = isAddress(tokenAddress)\n\n const tokenContract = useTokenContract(address ? address : undefined, false)\n const tokenContractBytes32 = useBytes32TokenContract(address ? address : undefined, false)\n const token: Token | undefined = address ? tokens[address] : undefined\n\n const tokenName = useSingleCallResult(token ? undefined : tokenContract, 'name', undefined, NEVER_RELOAD)\n const tokenNameBytes32 = useSingleCallResult(\n token ? undefined : tokenContractBytes32,\n 'name',\n undefined,\n NEVER_RELOAD\n )\n const symbol = useSingleCallResult(token ? undefined : tokenContract, 'symbol', undefined, NEVER_RELOAD)\n const symbolBytes32 = useSingleCallResult(token ? undefined : tokenContractBytes32, 'symbol', undefined, NEVER_RELOAD)\n const decimals = useSingleCallResult(token ? undefined : tokenContract, 'decimals', undefined, NEVER_RELOAD)\n\n return useMemo(() => {\n if (token) return token\n if (!chainId || !address) return undefined\n if (decimals.loading || symbol.loading || tokenName.loading) return null\n if (decimals.result) {\n return new Token(\n chainId,\n address,\n decimals.result[0],\n parseStringOrBytes32(symbol.result?.[0], symbolBytes32.result?.[0], 'UNKNOWN'),\n parseStringOrBytes32(tokenName.result?.[0], tokenNameBytes32.result?.[0], 'Unknown Token')\n )\n }\n return undefined\n }, [\n address,\n chainId,\n decimals.loading,\n decimals.result,\n symbol.loading,\n symbol.result,\n symbolBytes32.result,\n token,\n tokenName.loading,\n tokenName.result,\n tokenNameBytes32.result\n ])\n}\n\nexport function useCurrency(currencyId: string | undefined): Currency | null | undefined {\n const isETH = currencyId?.toUpperCase() === 'ETH'\n const token = useToken(isETH ? undefined : currencyId)\n return isETH ? ETHER : token\n}\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 interface SerializedPool {\n token: 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 updateUserSingleHopOnly = createAction<{ userSingleHopOnly: boolean }>('user/updateUserSingleHopOnly')\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 addSerializedPool = createAction<{ serializedPool: SerializedPool }>('user/addSerializedPool')\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 '@uniswap/sdk'\nimport { Pool } from 'data/Pool'\nimport flatMap from 'lodash.flatmap'\nimport ReactGA from 'react-ga'\nimport { useCallback, useMemo } from 'react'\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux'\nimport { BASES_TO_TRACK_LIQUIDITY_FOR, PINNED_PAIRS, PINNED_POOLS } from '../../constants'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAllTokens } from '../../hooks/Tokens'\nimport { AppDispatch, AppState } from '../index'\nimport {\n addSerializedPair,\n addSerializedPool,\n addSerializedToken,\n removeSerializedToken,\n SerializedPair,\n SerializedPool,\n SerializedToken,\n updateUserDarkMode,\n updateUserDeadline,\n updateUserExpertMode,\n updateUserSlippageTolerance,\n toggleURLWarning,\n updateUserSingleHopOnly\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 useUserSingleHopOnly(): [boolean, (newSingleHopOnly: boolean) => void] {\n const dispatch = useDispatch()\n\n const singleHopOnly = useSelector(\n state => state.user.userSingleHopOnly\n )\n\n const setSingleHopOnly = useCallback(\n (newSingleHopOnly: boolean) => {\n ReactGA.event({\n category: 'Routing',\n action: newSingleHopOnly ? 'enable single hop' : 'disable single hop'\n })\n dispatch(updateUserSingleHopOnly({ userSingleHopOnly: newSingleHopOnly }))\n },\n [dispatch]\n )\n\n return [singleHopOnly, setSingleHopOnly]\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\nfunction serializePool(pool: Pool): SerializedPool {\n return {\n token: serializeToken(pool.token)\n }\n}\n\nexport function usePoolAdder(): (pool: Pool) => void {\n const dispatch = useDispatch()\n\n return useCallback(\n (pool: Pool) => {\n dispatch(addSerializedPool({ serializedPool: serializePool(pool) }))\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\n/**\n * Given the tokensreturn the liquidity token that represents its liquidity shares\n * @param token\n */\nexport function toFlashLoanV1LiquidityToken(token: Token): Token {\n return new Token(token.chainId, Pool.getAddress(token), 18, 'DEER-V1', 'Deer FlashLoan V1')\n}\n\n/**\n * Returns all the pools of tokens that are tracked by the user for the current chain ID.\n */\nexport function useTrackedTokenPools(): Token[] {\n const { chainId } = useActiveWeb3React()\n const tokens = useAllTokens()\n\n // pinned pools\n const pinnedPools = useMemo(() => (chainId ? PINNED_POOLS[chainId] ?? [] : []), [chainId])\n\n // pools for every token against every base\n const generatedPools: 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 [token]\n })\n : [],\n [tokens, chainId]\n )\n\n // pairs saved by users\n const savedSerializedPools = useSelector(({ user: { pools } }) => pools)\n\n const userPools: Token[] = useMemo(() => {\n if (!chainId || !savedSerializedPools) return []\n const forChain = savedSerializedPools[chainId]\n if (!forChain) return []\n\n return Object.keys(forChain).map(poolId => {\n return deserializeToken(forChain[poolId].token)\n })\n }, [savedSerializedPools, chainId])\n\n const combinedList = useMemo(() => userPools.concat(generatedPools).concat(pinnedPools), [\n generatedPools,\n pinnedPools,\n userPools\n ])\n\n return useMemo(() => {\n // dedupes pairs of tokens in the combined list\n const keyed = combinedList.reduce<{ [key: string]: Token }>((memo, token) => {\n const key = `${token.address}`\n if (memo[key]) return memo\n memo[key] = token\n return memo\n }, {})\n\n return Object.keys(keyed).map(key => keyed[key])\n }, [combinedList])\n}\n","import React, { HTMLProps, useCallback } from 'react'\nimport ReactGA from 'react-ga'\nimport { Link } from 'react-router-dom'\nimport styled, { keyframes } from 'styled-components'\nimport { darken } from 'polished'\nimport { ArrowLeft, X, ExternalLink as LinkIconFeather, Trash } from 'react-feather'\n\nexport const ButtonText = styled.button`\n outline: none;\n border: none;\n font-size: inherit;\n padding: 0;\n margin: 0;\n background: none;\n cursor: pointer;\n\n :hover {\n opacity: 0.7;\n }\n\n :focus {\n text-decoration: underline;\n }\n`\n\nexport const Button = styled.button.attrs<{ warning: boolean }, { backgroundColor: string }>(({ warning, theme }) => ({\n backgroundColor: warning ? theme.red1 : theme.primary1\n}))`\n padding: 1rem 2rem 1rem 2rem;\n border-radius: 3rem;\n cursor: pointer;\n user-select: none;\n font-size: 1rem;\n border: none;\n outline: none;\n background-color: ${({ backgroundColor }) => backgroundColor};\n color: ${({ theme }) => theme.white};\n width: 100%;\n\n :hover,\n :focus {\n background-color: ${({ backgroundColor }) => darken(0.05, backgroundColor)};\n }\n\n :active {\n background-color: ${({ backgroundColor }) => darken(0.1, backgroundColor)};\n }\n\n :disabled {\n background-color: ${({ theme }) => theme.bg1};\n color: ${({ theme }) => theme.text4};\n cursor: auto;\n }\n`\n\nexport const CloseIcon = styled(X)<{ onClick: () => void }>`\n cursor: pointer;\n`\n\n// for wrapper react feather icons\nexport const IconWrapper = styled.div<{ stroke?: string; size?: string; marginRight?: string; marginLeft?: string }>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${({ size }) => size ?? '20px'};\n height: ${({ size }) => size ?? '20px'};\n margin-right: ${({ marginRight }) => marginRight ?? 0};\n margin-left: ${({ marginLeft }) => marginLeft ?? 0};\n & > * {\n stroke: ${({ theme, stroke }) => stroke ?? theme.blue1};\n }\n`\n\n// A button that triggers some onClick result, but looks like a link.\nexport const LinkStyledButton = styled.button<{ disabled?: boolean }>`\n border: none;\n text-decoration: none;\n background: none;\n\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\n color: ${({ theme, disabled }) => (disabled ? theme.text2 : theme.primary1)};\n font-weight: 500;\n\n :hover {\n text-decoration: ${({ disabled }) => (disabled ? null : 'underline')};\n }\n\n :focus {\n outline: none;\n text-decoration: ${({ disabled }) => (disabled ? null : 'underline')};\n }\n\n :active {\n text-decoration: none;\n }\n`\n\n// An internal link from the react-router-dom library that is correctly styled\nexport const StyledInternalLink = styled(Link)`\n text-decoration: none;\n cursor: pointer;\n color: ${({ theme }) => theme.primary1};\n font-weight: 500;\n\n :hover {\n text-decoration: underline;\n }\n\n :focus {\n outline: none;\n text-decoration: underline;\n }\n\n :active {\n text-decoration: none;\n }\n`\n\nconst StyledLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n color: ${({ theme }) => theme.primary1};\n font-weight: 500;\n\n :hover {\n text-decoration: underline;\n }\n\n :focus {\n outline: none;\n text-decoration: underline;\n }\n\n :active {\n text-decoration: none;\n }\n`\n\nconst LinkIconWrapper = styled.a`\n text-decoration: none;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n display: flex;\n\n :hover {\n text-decoration: none;\n opacity: 0.7;\n }\n\n :focus {\n outline: none;\n text-decoration: none;\n }\n\n :active {\n text-decoration: none;\n }\n`\n\nexport const LinkIcon = styled(LinkIconFeather)`\n height: 16px;\n width: 18px;\n margin-left: 10px;\n stroke: ${({ theme }) => theme.blue1};\n`\n\nexport const TrashIcon = styled(Trash)`\n height: 16px;\n width: 18px;\n margin-left: 10px;\n stroke: ${({ theme }) => theme.text3};\n\n cursor: pointer;\n align-items: center;\n justify-content: center;\n display: flex;\n\n :hover {\n opacity: 0.7;\n }\n`\n\nconst rotateImg = keyframes`\n 0% {\n transform: perspective(1000px) rotateY(0deg);\n }\n\n 100% {\n transform: perspective(1000px) rotateY(360deg);\n }\n`\n\nexport const UniTokenAnimated = styled.img`\n animation: ${rotateImg} 5s cubic-bezier(0.83, 0, 0.17, 1) infinite;\n padding: 2rem 0 0 0;\n filter: drop-shadow(0px 2px 4px rgba(0, 0, 0, 0.15));\n`\n\n/**\n * Outbound link that handles firing google analytics events\n */\nexport function ExternalLink({\n target = '_blank',\n href,\n rel = 'noopener noreferrer',\n ...rest\n}: Omit, 'as' | 'ref' | 'onClick'> & { href: string }) {\n const handleClick = useCallback(\n (event: React.MouseEvent) => {\n // don't prevent default, don't redirect if it's a new tab\n if (target === '_blank' || event.ctrlKey || event.metaKey) {\n ReactGA.outboundLink({ label: href }, () => {\n console.debug('Fired outbound link event', href)\n })\n } else {\n event.preventDefault()\n // send a ReactGA event and then trigger a location change\n ReactGA.outboundLink({ label: href }, () => {\n window.location.href = href\n })\n }\n },\n [href, target]\n )\n return \n}\n\nexport function ExternalLinkIcon({\n target = '_blank',\n href,\n rel = 'noopener noreferrer',\n ...rest\n}: Omit, 'as' | 'ref' | 'onClick'> & { href: string }) {\n const handleClick = useCallback(\n (event: React.MouseEvent) => {\n // don't prevent default, don't redirect if it's a new tab\n if (target === '_blank' || event.ctrlKey || event.metaKey) {\n ReactGA.outboundLink({ label: href }, () => {\n console.debug('Fired outbound link event', href)\n })\n } else {\n event.preventDefault()\n // send a ReactGA event and then trigger a location change\n ReactGA.outboundLink({ label: href }, () => {\n window.location.href = href\n })\n }\n },\n [href, target]\n )\n return (\n \n \n \n )\n}\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`\n\nexport const Spinner = styled.img`\n animation: 2s ${rotate} linear infinite;\n width: 16px;\n height: 16px;\n`\n\nconst BackArrowLink = styled(StyledInternalLink)`\n color: ${({ theme }) => theme.text1};\n`\nexport function BackArrow({ to }: { to: string }) {\n return (\n \n \n \n )\n}\n\nexport const CustomLightSpinner = styled(Spinner)<{ size: string }>`\n height: ${({ size }) => size};\n width: ${({ size }) => size};\n`\n\nexport const HideSmall = styled.span`\n ${({ theme }) => theme.mediaWidth.upToSmall`\n display: none;\n `};\n`\n\nexport const HideExtraSmall = styled.span`\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\n display: none;\n `};\n`\n\nexport const ExtraSmallOnly = styled.span`\n display: none;\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\n display: block;\n `};\n`\n","import { transparentize } from 'polished'\nimport React, { useMemo } from 'react'\nimport styled, {\n ThemeProvider as StyledComponentsThemeProvider,\n createGlobalStyle,\n css,\n DefaultTheme\n} from 'styled-components'\nimport { useIsDarkMode } from '../state/user/hooks'\nimport { Text, TextProps } from 'rebass'\nimport { Colors } from './styled'\n\nexport * from './components'\n\nconst MEDIA_WIDTHS = {\n upToExtraSmall: 500,\n upToSmall: 720,\n upToMedium: 960,\n upToLarge: 1280\n}\n\nconst mediaWidthTemplates: { [width in keyof typeof MEDIA_WIDTHS]: typeof css } = Object.keys(MEDIA_WIDTHS).reduce(\n (accumulator, size) => {\n ;(accumulator as any)[size] = (a: any, b: any, c: any) => css`\n @media (max-width: ${(MEDIA_WIDTHS as any)[size]}px) {\n ${css(a, b, c)}\n }\n `\n return accumulator\n },\n {}\n) as any\n\nconst white = '#FFFFFF'\nconst black = '#000000'\n\nexport function colors(darkMode: boolean): Colors {\n return {\n // base\n white,\n black,\n\n // text\n text1: darkMode ? '#FFFFFF' : '#000000',\n text2: darkMode ? '#C3C5CB' : '#565A69',\n text3: darkMode ? '#6C7284' : '#888D9B',\n text4: darkMode ? '#565A69' : '#C3C5CB',\n text5: darkMode ? '#2C2F36' : '#EDEEF2',\n\n // backgrounds / greys\n bg1: darkMode ? '#212429' : '#FFFFFF',\n bg2: darkMode ? '#2C2F36' : '#F7F8FA',\n bg3: darkMode ? '#40444F' : '#EDEEF2',\n bg4: darkMode ? '#565A69' : '#CED0D9',\n bg5: darkMode ? '#6C7284' : '#888D9B',\n\n //specialty colors\n modalBG: darkMode ? 'rgba(0,0,0,.425)' : 'rgba(0,0,0,0.3)',\n advancedBG: darkMode ? 'rgba(0,0,0,0.1)' : 'rgba(255,255,255,0.6)',\n\n //primary colors\n primary1: darkMode ? '#2172E5' : '#ff007a',\n primary2: darkMode ? '#3680E7' : '#FF8CC3',\n primary3: darkMode ? '#4D8FEA' : '#FF99C9',\n primary4: darkMode ? '#376bad70' : '#F6DDE8',\n primary5: darkMode ? '#153d6f70' : '#FDEAF1',\n\n // color text\n primaryText1: darkMode ? '#6da8ff' : '#ff007a',\n\n // secondary colors\n secondary1: darkMode ? '#2172E5' : '#ff007a',\n secondary2: darkMode ? '#17000b26' : '#F6DDE8',\n secondary3: darkMode ? '#17000b26' : '#FDEAF1',\n\n // other\n red1: '#FD4040',\n red2: '#F82D3A',\n red3: '#D60000',\n green1: '#27AE60',\n yellow1: '#FFE270',\n yellow2: '#F3841E',\n blue1: '#2172E5',\n\n // dont wanna forget these blue yet\n // blue4: darkMode ? '#153d6f70' : '#C4D9F8',\n // blue5: darkMode ? '#153d6f70' : '#EBF4FF',\n\n // skeleton screen\n SkeletonBG: darkMode\n ? 'linear-gradient(to right, rgba(20, 30, 39, 0.7) 8%, #141e27 18%, rgba(20, 30, 39, 0.7) 33%)'\n : 'linear-gradient(to right, #f6f6f6 8%, #f0f0f0 18%, #f6f6f6 33%)'\n }\n}\n\nexport function theme(darkMode: boolean): DefaultTheme {\n return {\n ...colors(darkMode),\n\n grids: {\n sm: 8,\n md: 12,\n lg: 24\n },\n\n //shadows\n shadow1: darkMode ? '#000' : '#2F80ED',\n\n // media queries\n mediaWidth: mediaWidthTemplates,\n\n // css snippets\n flexColumnNoWrap: css`\n display: flex;\n flex-flow: column nowrap;\n `,\n flexRowNoWrap: css`\n display: flex;\n flex-flow: row nowrap;\n `\n }\n}\n\nexport default function ThemeProvider({ children }: { children: React.ReactNode }) {\n const darkMode = useIsDarkMode()\n\n const themeObject = useMemo(() => theme(darkMode), [darkMode])\n\n return {children}\n}\n\nconst TextWrapper = styled(Text)<{ color: keyof Colors }>`\n color: ${({ color, theme }) => (theme as any)[color]};\n`\n\nexport const TYPE = {\n main(props: TextProps) {\n return \n },\n link(props: TextProps) {\n return \n },\n black(props: TextProps) {\n return \n },\n white(props: TextProps) {\n return \n },\n body(props: TextProps) {\n return \n },\n largeHeader(props: TextProps) {\n return \n },\n mediumHeader(props: TextProps) {\n return \n },\n subHeader(props: TextProps) {\n return \n },\n small(props: TextProps) {\n return \n },\n blue(props: TextProps) {\n return \n },\n yellow(props: TextProps) {\n return \n },\n darkGray(props: TextProps) {\n return \n },\n gray(props: TextProps) {\n return \n },\n italic(props: TextProps) {\n return \n },\n error({ error, ...props }: { error: boolean } & TextProps) {\n return \n }\n}\n\nexport const FixedGlobalStyle = createGlobalStyle`\nhtml, input, textarea, button {\n font-family: 'Inter', sans-serif;\n font-display: fallback;\n}\n@supports (font-variation-settings: normal) {\n html, input, textarea, button {\n font-family: 'Inter var', sans-serif;\n }\n}\n\nhtml,\nbody {\n margin: 0;\n padding: 0;\n}\n\n a {\n color: ${colors(false).blue1}; \n }\n\n* {\n box-sizing: border-box;\n}\n\nbutton {\n user-select: none;\n}\n\nhtml {\n font-size: 16px;\n font-variant: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n font-feature-settings: 'ss01' on, 'ss02' on, 'cv01' on, 'cv03' on;\n \n}\n`\n\nexport const ThemedGlobalStyle = createGlobalStyle`\nhtml {\n color: ${({ theme }) => theme.text1};\n background-color: ${({ theme }) => theme.bg2};\n}\n\nbody {\n min-height: 100vh;\n background-position: 0 -30vh;\n background-repeat: no-repeat;\n background-image: ${({ theme }) =>\n `radial-gradient(50% 50% at 50% 50%, ${transparentize(0.9, theme.primary1)} 0%, ${transparentize(\n 1,\n theme.bg1\n )} 100%)`};\n}\n`\n","import React from 'react'\nimport styled from 'styled-components'\nimport { darken, lighten } from 'polished'\n\nimport { RowBetween } from '../Row'\nimport { ChevronDown } from 'react-feather'\nimport { Button as RebassButton, ButtonProps } from 'rebass/styled-components'\n\nconst Base = styled(RebassButton)<{\n padding?: string\n width?: string\n borderRadius?: string\n altDisabledStyle?: boolean\n}>`\n padding: ${({ padding }) => (padding ? padding : '18px')};\n width: ${({ width }) => (width ? width : '100%')};\n font-weight: 500;\n text-align: center;\n border-radius: 20px;\n border-radius: ${({ borderRadius }) => borderRadius && borderRadius};\n outline: none;\n border: 1px solid transparent;\n color: white;\n text-decoration: none;\n display: flex;\n justify-content: center;\n flex-wrap: nowrap;\n align-items: center;\n cursor: pointer;\n position: relative;\n z-index: 1;\n &:disabled {\n cursor: auto;\n }\n\n > * {\n user-select: none;\n }\n`\n\nexport const ButtonPrimary = styled(Base)`\n background-color: ${({ theme }) => theme.primary1};\n color: white;\n &:focus {\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.05, theme.primary1)};\n background-color: ${({ theme }) => darken(0.05, theme.primary1)};\n }\n &:hover {\n background-color: ${({ theme }) => darken(0.05, theme.primary1)};\n }\n &:active {\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.1, theme.primary1)};\n background-color: ${({ theme }) => darken(0.1, theme.primary1)};\n }\n &:disabled {\n background-color: ${({ theme, altDisabledStyle, disabled }) =>\n altDisabledStyle ? (disabled ? theme.bg3 : theme.primary1) : theme.bg3};\n color: ${({ theme, altDisabledStyle, disabled }) =>\n altDisabledStyle ? (disabled ? theme.text3 : 'white') : theme.text3};\n cursor: auto;\n box-shadow: none;\n border: 1px solid transparent;\n outline: none;\n opacity: ${({ altDisabledStyle }) => (altDisabledStyle ? '0.5' : '1')};\n }\n`\n\nexport const ButtonLight = styled(Base)`\n background-color: ${({ theme }) => theme.primary5};\n color: ${({ theme }) => theme.primaryText1};\n font-size: 16px;\n font-weight: 500;\n &:focus {\n box-shadow: 0 0 0 1pt ${({ theme, disabled }) => !disabled && darken(0.03, theme.primary5)};\n background-color: ${({ theme, disabled }) => !disabled && darken(0.03, theme.primary5)};\n }\n &:hover {\n background-color: ${({ theme, disabled }) => !disabled && darken(0.03, theme.primary5)};\n }\n &:active {\n box-shadow: 0 0 0 1pt ${({ theme, disabled }) => !disabled && darken(0.05, theme.primary5)};\n background-color: ${({ theme, disabled }) => !disabled && darken(0.05, theme.primary5)};\n }\n :disabled {\n opacity: 0.4;\n :hover {\n cursor: auto;\n background-color: ${({ theme }) => theme.primary5};\n box-shadow: none;\n border: 1px solid transparent;\n outline: none;\n }\n }\n`\n\nexport const ButtonGray = styled(Base)`\n background-color: ${({ theme }) => theme.bg3};\n color: ${({ theme }) => theme.text2};\n font-size: 16px;\n font-weight: 500;\n &:focus {\n background-color: ${({ theme, disabled }) => !disabled && darken(0.05, theme.bg4)};\n }\n &:hover {\n background-color: ${({ theme, disabled }) => !disabled && darken(0.05, theme.bg4)};\n }\n &:active {\n background-color: ${({ theme, disabled }) => !disabled && darken(0.1, theme.bg4)};\n }\n`\n\nexport const ButtonSecondary = styled(Base)`\n border: 1px solid ${({ theme }) => theme.primary4};\n color: ${({ theme }) => theme.primary1};\n background-color: transparent;\n font-size: 16px;\n border-radius: 12px;\n padding: ${({ padding }) => (padding ? padding : '10px')};\n\n &:focus {\n box-shadow: 0 0 0 1pt ${({ theme }) => theme.primary4};\n border: 1px solid ${({ theme }) => theme.primary3};\n }\n &:hover {\n border: 1px solid ${({ theme }) => theme.primary3};\n }\n &:active {\n box-shadow: 0 0 0 1pt ${({ theme }) => theme.primary4};\n border: 1px solid ${({ theme }) => theme.primary3};\n }\n &:disabled {\n opacity: 50%;\n cursor: auto;\n }\n a:hover {\n text-decoration: none;\n }\n`\n\nexport const ButtonPink = styled(Base)`\n background-color: ${({ theme }) => theme.primary1};\n color: white;\n\n &:focus {\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.05, theme.primary1)};\n background-color: ${({ theme }) => darken(0.05, theme.primary1)};\n }\n &:hover {\n background-color: ${({ theme }) => darken(0.05, theme.primary1)};\n }\n &:active {\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.1, theme.primary1)};\n background-color: ${({ theme }) => darken(0.1, theme.primary1)};\n }\n &:disabled {\n background-color: ${({ theme }) => theme.primary1};\n opacity: 50%;\n cursor: auto;\n }\n`\n\nexport const ButtonUNIGradient = styled(ButtonPrimary)`\n color: white;\n padding: 4px 8px;\n height: 36px;\n font-weight: 500;\n background-color: ${({ theme }) => theme.bg3};\n background: radial-gradient(174.47% 188.91% at 1.84% 0%, #ff007a 0%, #2172e5 100%), #edeef2;\n width: fit-content;\n position: relative;\n cursor: pointer;\n border: none;\n white-space: no-wrap;\n :hover {\n opacity: 0.8;\n }\n :active {\n opacity: 0.9;\n }\n`\n\nexport const ButtonOutlined = styled(Base)`\n border: 1px solid ${({ theme }) => theme.bg2};\n background-color: transparent;\n color: ${({ theme }) => theme.text1};\n\n &:focus {\n box-shadow: 0 0 0 1px ${({ theme }) => theme.bg4};\n }\n &:hover {\n box-shadow: 0 0 0 1px ${({ theme }) => theme.bg4};\n }\n &:active {\n box-shadow: 0 0 0 1px ${({ theme }) => theme.bg4};\n }\n &:disabled {\n opacity: 50%;\n cursor: auto;\n }\n`\n\nexport const ButtonEmpty = styled(Base)`\n background-color: transparent;\n color: ${({ theme }) => theme.primary1};\n display: flex;\n justify-content: center;\n align-items: center;\n\n &:focus {\n text-decoration: underline;\n }\n &:hover {\n text-decoration: none;\n }\n &:active {\n text-decoration: none;\n }\n &:disabled {\n opacity: 50%;\n cursor: auto;\n }\n`\n\nexport const ButtonWhite = styled(Base)`\n border: 1px solid #edeef2;\n background-color: ${({ theme }) => theme.bg1};\n color: black;\n\n &:focus {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n box-shadow: 0 0 0 1pt ${darken(0.05, '#edeef2')};\n }\n &:hover {\n box-shadow: 0 0 0 1pt ${darken(0.1, '#edeef2')};\n }\n &:active {\n box-shadow: 0 0 0 1pt ${darken(0.1, '#edeef2')};\n }\n &:disabled {\n opacity: 50%;\n cursor: auto;\n }\n`\n\nconst ButtonConfirmedStyle = styled(Base)`\n background-color: ${({ theme }) => lighten(0.5, theme.green1)};\n color: ${({ theme }) => theme.green1};\n border: 1px solid ${({ theme }) => theme.green1};\n\n &:disabled {\n opacity: 50%;\n cursor: auto;\n }\n`\n\nconst ButtonErrorStyle = styled(Base)`\n background-color: ${({ theme }) => theme.red1};\n border: 1px solid ${({ theme }) => theme.red1};\n\n &:focus {\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.05, theme.red1)};\n background-color: ${({ theme }) => darken(0.05, theme.red1)};\n }\n &:hover {\n background-color: ${({ theme }) => darken(0.05, theme.red1)};\n }\n &:active {\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.1, theme.red1)};\n background-color: ${({ theme }) => darken(0.1, theme.red1)};\n }\n &:disabled {\n opacity: 50%;\n cursor: auto;\n box-shadow: none;\n background-color: ${({ theme }) => theme.red1};\n border: 1px solid ${({ theme }) => theme.red1};\n }\n`\n\nexport function ButtonConfirmed({\n confirmed,\n altDisabledStyle,\n ...rest\n}: { confirmed?: boolean; altDisabledStyle?: boolean } & ButtonProps) {\n if (confirmed) {\n return \n } else {\n return \n }\n}\n\nexport function ButtonError({ error, ...rest }: { error?: boolean } & ButtonProps) {\n if (error) {\n return \n } else {\n return \n }\n}\n\nexport function ButtonDropdown({ disabled = false, children, ...rest }: { disabled?: boolean } & ButtonProps) {\n return (\n \n \n
{children}
\n \n
\n
\n )\n}\n\nexport function ButtonDropdownGrey({ disabled = false, children, ...rest }: { disabled?: boolean } & ButtonProps) {\n return (\n \n \n
{children}
\n \n
\n
\n )\n}\n\nexport function ButtonDropdownLight({ disabled = false, children, ...rest }: { disabled?: boolean } & ButtonProps) {\n return (\n \n \n
{children}
\n \n
\n
\n )\n}\n\nexport function ButtonRadio({ active, ...rest }: { active?: boolean } & ButtonProps) {\n if (!active) {\n return \n } else {\n return \n }\n}\n","import { createAction } from '@reduxjs/toolkit'\nimport { ChainId } from '@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 { UNI } from './../../constants/index'\nimport { TokenAmount, JSBI, ChainId } from '@uniswap/sdk'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { useEffect, useState } from 'react'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useMerkleDistributorContract } from '../../hooks/useContract'\nimport { useSingleCallResult } from '../multicall/hooks'\nimport { calculateGasMargin, isAddress } from '../../utils'\nimport { useTransactionAdder } from '../transactions/hooks'\n\ninterface UserClaimData {\n index: number\n amount: string\n proof: string[]\n flags?: {\n isSOCKS: boolean\n isLP: boolean\n isUser: boolean\n }\n}\n\nconst CLAIM_PROMISES: { [key: string]: Promise } = {}\n\n// returns the claim for the given address, or null if not valid\nfunction fetchClaim(account: string, chainId: ChainId): Promise {\n const formatted = isAddress(account)\n if (!formatted) return Promise.reject(new Error('Invalid address'))\n const key = `${chainId}:${account}`\n\n return (CLAIM_PROMISES[key] =\n CLAIM_PROMISES[key] ??\n fetch(`https://gentle-frost-9e74.uniswap.workers.dev/${chainId}/${formatted}`)\n .then(res => {\n if (res.status === 200) {\n return res.json()\n } else {\n console.debug(`No claim for account ${formatted} on chain ID ${chainId}`)\n return null\n }\n })\n .catch(error => {\n console.error('Failed to get claim data', error)\n }))\n}\n\n// parse distributorContract blob and detect if user has claim data\n// null means we know it does not\nexport function useUserClaimData(account: string | null | undefined): UserClaimData | null | undefined {\n const { chainId } = useActiveWeb3React()\n\n const key = `${chainId}:${account}`\n const [claimInfo, setClaimInfo] = useState<{ [key: string]: UserClaimData | null }>({})\n\n useEffect(() => {\n if (!account || !chainId) return\n fetchClaim(account, chainId).then(accountClaimInfo =>\n setClaimInfo(claimInfo => {\n return {\n ...claimInfo,\n [key]: accountClaimInfo\n }\n })\n )\n }, [account, chainId, key])\n\n return account && chainId ? claimInfo[key] : undefined\n}\n\n// check if user is in blob and has not yet claimed UNI\nexport function useUserHasAvailableClaim(account: string | null | undefined): boolean {\n const userClaimData = useUserClaimData(account)\n const distributorContract = useMerkleDistributorContract()\n const isClaimedResult = useSingleCallResult(distributorContract, 'isClaimed', [userClaimData?.index])\n // user is in blob and contract marks as unclaimed\n return Boolean(userClaimData && !isClaimedResult.loading && isClaimedResult.result?.[0] === false)\n}\n\nexport function useUserUnclaimedAmount(account: string | null | undefined): TokenAmount | undefined {\n const { chainId } = useActiveWeb3React()\n const userClaimData = useUserClaimData(account)\n const canClaim = useUserHasAvailableClaim(account)\n\n const uni = chainId ? UNI[chainId] : undefined\n if (!uni) return undefined\n if (!canClaim || !userClaimData) {\n return new TokenAmount(uni, JSBI.BigInt(0))\n }\n return new TokenAmount(uni, JSBI.BigInt(userClaimData.amount))\n}\n\nexport function useClaimCallback(\n account: string | null | undefined\n): {\n claimCallback: () => Promise\n} {\n // get claim data for this account\n const { library, chainId } = useActiveWeb3React()\n const claimData = useUserClaimData(account)\n\n // used for popup summary\n const unClaimedAmount: TokenAmount | undefined = useUserUnclaimedAmount(account)\n const addTransaction = useTransactionAdder()\n const distributorContract = useMerkleDistributorContract()\n\n const claimCallback = async function() {\n if (!claimData || !account || !library || !chainId || !distributorContract) return\n\n const args = [claimData.index, account, claimData.amount, claimData.proof]\n\n return distributorContract.estimateGas['claim'](...args, {}).then(estimatedGasLimit => {\n return distributorContract\n .claim(...args, { value: null, gasLimit: calculateGasMargin(estimatedGasLimit) })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Claimed ${unClaimedAmount?.toSignificant(4)} UNI`,\n claim: { recipient: account }\n })\n return response.hash\n })\n })\n }\n\n return { claimCallback }\n}\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 { 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 { 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 React, { useContext, useCallback } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport useENS from '../../hooks/useENS'\nimport { useActiveWeb3React } from '../../hooks'\nimport { ExternalLink, TYPE } from '../../theme'\nimport { AutoColumn } from '../Column'\nimport { RowBetween } from '../Row'\nimport { getEtherscanLink } from '../../utils'\nimport { useTranslation } from 'react-i18next'\n\nconst InputPanel = styled.div`\n ${({ theme }) => theme.flexColumnNoWrap}\n position: relative;\n border-radius: 1.25rem;\n background-color: ${({ theme }) => theme.bg1};\n z-index: 1;\n width: 100%;\n`\n\nconst ContainerRow = styled.div<{ error: boolean }>`\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 1.25rem;\n border: 1px solid ${({ error, theme }) => (error ? theme.red1 : theme.bg2)};\n transition: border-color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')},\n color 500ms ${({ error }) => (error ? 'step-end' : 'step-start')};\n background-color: ${({ theme }) => theme.bg1};\n`\n\nconst InputContainer = styled.div`\n flex: 1;\n padding: 1rem;\n`\n\nconst Input = styled.input<{ error?: boolean }>`\n font-size: 1.25rem;\n outline: none;\n border: none;\n flex: 1 1 auto;\n width: 0;\n background-color: ${({ theme }) => theme.bg1};\n transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};\n color: ${({ error, theme }) => (error ? theme.red1 : theme.primary1)};\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 500;\n width: 100%;\n ::placeholder {\n color: ${({ theme }) => theme.text4};\n }\n padding: 0px;\n -webkit-appearance: textfield;\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\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\nexport default function AddressInputPanel({\n id,\n value,\n onChange\n}: {\n id?: string\n // the typed string value\n value: string\n // triggers whenever the typed value changes\n onChange: (value: string) => void\n}) {\n const { chainId } = useActiveWeb3React()\n const theme = useContext(ThemeContext)\n const { t } = useTranslation()\n\n const { address, loading, name } = useENS(value)\n\n const handleInput = useCallback(\n event => {\n const input = event.target.value\n const withoutSpaces = input.replace(/\\s+/g, '')\n onChange(withoutSpaces)\n },\n [onChange]\n )\n\n const error = Boolean(value.length > 0 && !loading && !address)\n\n return (\n \n \n \n \n \n \n Recipient\n \n {address && chainId && (\n \n ({t('viewOnEtherscan')})\n \n )}\n \n \n \n \n \n \n )\n}\n","import { useEffect, useState } from 'react'\n\nconst isClient = typeof window === 'object'\n\nfunction getSize() {\n return {\n width: isClient ? window.innerWidth : undefined,\n height: isClient ? window.innerHeight : undefined\n }\n}\n\n// https://usehooks.com/useWindowSize/\nexport function useWindowSize() {\n const [windowSize, setWindowSize] = useState(getSize)\n\n useEffect(() => {\n function handleResize() {\n setWindowSize(getSize())\n }\n\n if (isClient) {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n return undefined\n }, [])\n\n return windowSize\n}\n","import React from 'react'\nimport ReactConfetti from 'react-confetti'\nimport { useWindowSize } from '../../hooks/useWindowSize'\n\n// eslint-disable-next-line react/prop-types\nexport default function Confetti({ start, variant }: { start: boolean; variant?: string }) {\n const { width, height } = useWindowSize()\n\n const _variant = variant ? variant : height && width && height > 1.5 * width ? 'bottom' : variant\n\n return start && width && height ? (\n \n ) : null\n}\n","import React, { useState } from 'react'\nimport Modal from '../Modal'\nimport { AutoColumn, ColumnCenter } from '../Column'\nimport styled from 'styled-components'\nimport { DataCard, CardSection, Break } from '../earn/styled'\nimport { RowBetween } from '../Row'\nimport { TYPE, ExternalLink, CloseIcon, CustomLightSpinner, UniTokenAnimated } from '../../theme'\nimport { ButtonPrimary } from '../Button'\nimport { useClaimCallback, useUserUnclaimedAmount, useUserHasAvailableClaim } from '../../state/claim/hooks'\nimport tokenLogo from '../../assets/images/token-logo.png'\nimport Circle from '../../assets/images/blue-loader.svg'\nimport { Text } from 'rebass'\nimport AddressInputPanel from '../AddressInputPanel'\nimport useENS from '../../hooks/useENS'\nimport { useActiveWeb3React } from '../../hooks'\nimport { isAddress } from 'ethers/lib/utils'\nimport Confetti from '../Confetti'\nimport { CardNoise, CardBGImage, CardBGImageSmaller } from '../earn/styled'\nimport { useIsTransactionPending } from '../../state/transactions/hooks'\nimport { TokenAmount } from '@uniswap/sdk'\nimport { getEtherscanLink, shortenAddress } from '../../utils'\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n`\n\nconst ModalUpper = styled(DataCard)`\n box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #ff007a 0%, #021d43 100%);\n`\n\nconst ConfirmOrLoadingWrapper = styled.div<{ activeBG: boolean }>`\n width: 100%;\n padding: 24px;\n position: relative;\n background: ${({ activeBG }) =>\n activeBG &&\n 'radial-gradient(76.02% 75.41% at 1.84% 0%, rgba(255, 0, 122, 0.2) 0%, rgba(33, 114, 229, 0.2) 100%), #FFFFFF;'};\n`\n\nconst ConfirmedIcon = styled(ColumnCenter)`\n padding: 60px 0;\n`\n\nexport default function AddressClaimModal({ isOpen, onDismiss }: { isOpen: boolean; onDismiss: () => void }) {\n const { chainId } = useActiveWeb3React()\n\n // state for smart contract input\n const [typed, setTyped] = useState('')\n function handleRecipientType(val: string) {\n setTyped(val)\n }\n\n // monitor for third party recipient of claim\n const { address: parsedAddress } = useENS(typed)\n\n // used for UI loading states\n const [attempting, setAttempting] = useState(false)\n\n // monitor the status of the claim from contracts and txns\n const { claimCallback } = useClaimCallback(parsedAddress)\n const unclaimedAmount: TokenAmount | undefined = useUserUnclaimedAmount(parsedAddress)\n\n // check if the user has something available\n const hasAvailableClaim = useUserHasAvailableClaim(parsedAddress)\n\n const [hash, setHash] = useState()\n\n // monitor the status of the claim from contracts and txns\n const claimPending = useIsTransactionPending(hash ?? '')\n const claimConfirmed = hash && !claimPending\n\n // use the hash to monitor this txn\n\n function onClaim() {\n setAttempting(true)\n claimCallback()\n .then(hash => {\n setHash(hash)\n })\n // reset modal and log error\n .catch(error => {\n setAttempting(false)\n console.log(error)\n })\n }\n\n function wrappedOnDismiss() {\n setAttempting(false)\n setHash(undefined)\n setTyped('')\n onDismiss()\n }\n\n return (\n \n \n {!attempting && (\n \n \n \n \n \n \n Claim UNI Token\n \n \n \n {unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI\n \n \n \n \n \n \n Enter an address to trigger a UNI claim. If the address has any claimable UNI it will be sent to them on\n submission.\n \n \n {parsedAddress && !hasAvailableClaim && (\n Address has no available claim\n )}\n \n Claim UNI\n \n \n \n )}\n {(attempting || claimConfirmed) && (\n \n \n \n \n
\n \n \n \n {!claimConfirmed ? (\n \n ) : (\n \n )}\n \n \n \n \n {claimConfirmed ? 'Claimed' : 'Claiming'}\n \n {!claimConfirmed && (\n \n {unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI\n \n )}\n {parsedAddress && (\n \n for {shortenAddress(parsedAddress)}\n \n )}\n \n {claimConfirmed && (\n <>\n \n \n 🎉{' '}\n \n Welcome to team Unicorn :){' '}\n \n 🎉\n \n \n \n )}\n {attempting && !hash && (\n Confirm this transaction in your wallet\n )}\n {attempting && hash && !claimConfirmed && chainId && hash && (\n \n View transaction on Etherscan\n \n )}\n \n \n )}\n \n )\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 { 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 { 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 ETHER,\n JSBI,\n Pair,\n Route,\n Token,\n TokenAmount,\n Trade,\n TradeType,\n WETH\n} from '@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","import { ChainId, Currency, CurrencyAmount, ETHER, Token, TokenAmount, WETH } from '@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 { TokenAmount, Pair, Currency } from '@uniswap/sdk'\nimport { Pool } from './Pool'\nimport { useMemo } from 'react'\nimport { abi as IUniswapV2PairABI } from '@uniswap/v2-core/build/IUniswapV2Pair.json'\nimport { abi as IFlashLoanV1PoolABI } from '../constants/flashLoan/IFlashLoanV1Pool.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)\nconst POOL_INTERFACE = new Interface(IFlashLoanV1PoolABI)\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\nexport function usePools(currencies: (Currency | undefined)[]): [PairState, Pool | null][] {\n const { chainId } = useActiveWeb3React()\n\n const tokens = useMemo(() => currencies.map(currency => wrappedCurrency(currency, chainId)), [chainId, currencies])\n\n const poolAddresses = useMemo(\n () =>\n tokens.map(token => {\n return token ? Pool.getAddress(token) : undefined\n }),\n [tokens]\n )\n\n const results = useMultipleContractSingleData(poolAddresses, POOL_INTERFACE, 'reserve')\n\n return useMemo(() => {\n return results.map((result, i) => {\n const { result: reserve, loading } = result\n const token = tokens[i]\n\n if (loading) return [PairState.LOADING, null]\n if (!token) return [PairState.INVALID, null]\n if (!reserve) return [PairState.NOT_EXISTS, null]\n return [PairState.EXISTS, new Pool(new TokenAmount(token, reserve.toString()))]\n })\n }, [results, tokens])\n}\n\nexport function usePool(token?: Currency): [PairState, Pool | null] {\n return usePools([token])[0]\n}\n","import { isTradeBetter } from 'utils/trades'\nimport { Currency, CurrencyAmount, Pair, Token, Trade } from '@uniswap/sdk'\nimport flatMap from 'lodash.flatmap'\nimport { useMemo } from 'react'\n\nimport { BASES_TO_CHECK_TRADES_AGAINST, CUSTOM_BASES, BETTER_TRADE_LESS_HOPS_THRESHOLD } from '../constants'\nimport { PairState, usePairs } from '../data/Reserves'\nimport { wrappedCurrency } from '../utils/wrappedCurrency'\n\nimport { useActiveWeb3React } from './index'\nimport { useUnsupportedTokens } from './Tokens'\nimport { useUserSingleHopOnly } from 'state/user/hooks'\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\nconst MAX_HOPS = 3\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\n const [singleHopOnly] = useUserSingleHopOnly()\n\n return useMemo(() => {\n if (currencyAmountIn && currencyOut && allowedPairs.length > 0) {\n if (singleHopOnly) {\n return (\n Trade.bestTradeExactIn(allowedPairs, currencyAmountIn, currencyOut, { maxHops: 1, maxNumResults: 1 })[0] ??\n null\n )\n }\n // search through trades with varying hops, find best trade out of them\n let bestTradeSoFar: Trade | null = null\n for (let i = 1; i <= MAX_HOPS; i++) {\n const currentTrade: Trade | null =\n Trade.bestTradeExactIn(allowedPairs, currencyAmountIn, currencyOut, { maxHops: i, maxNumResults: 1 })[0] ??\n null\n // if current trade is best yet, save it\n if (isTradeBetter(bestTradeSoFar, currentTrade, BETTER_TRADE_LESS_HOPS_THRESHOLD)) {\n bestTradeSoFar = currentTrade\n }\n }\n return bestTradeSoFar\n }\n\n return null\n }, [allowedPairs, currencyAmountIn, currencyOut, singleHopOnly])\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 const [singleHopOnly] = useUserSingleHopOnly()\n\n return useMemo(() => {\n if (currencyIn && currencyAmountOut && allowedPairs.length > 0) {\n if (singleHopOnly) {\n return (\n Trade.bestTradeExactOut(allowedPairs, currencyIn, currencyAmountOut, { maxHops: 1, maxNumResults: 1 })[0] ??\n null\n )\n }\n // search through trades with varying hops, find best trade out of them\n let bestTradeSoFar: Trade | null = null\n for (let i = 1; i <= MAX_HOPS; i++) {\n const currentTrade =\n Trade.bestTradeExactOut(allowedPairs, currencyIn, currencyAmountOut, { maxHops: i, maxNumResults: 1 })[0] ??\n null\n if (isTradeBetter(bestTradeSoFar, currentTrade, BETTER_TRADE_LESS_HOPS_THRESHOLD)) {\n bestTradeSoFar = currentTrade\n }\n }\n return bestTradeSoFar\n }\n return null\n }, [currencyIn, currencyAmountOut, allowedPairs, singleHopOnly])\n}\n\nexport function useIsTransactionUnsupported(currencyIn?: Currency, currencyOut?: Currency): boolean {\n const unsupportedToken: { [address: string]: Token } = useUnsupportedTokens()\n const { chainId } = useActiveWeb3React()\n\n const tokenIn = wrappedCurrency(currencyIn, chainId)\n const tokenOut = wrappedCurrency(currencyOut, chainId)\n\n // if unsupported list loaded & either token on list, mark as unsupported\n if (unsupportedToken) {\n if (tokenIn && Object.keys(unsupportedToken).includes(tokenIn.address)) {\n return true\n }\n if (tokenOut && Object.keys(unsupportedToken).includes(tokenOut.address)) {\n return true\n }\n }\n\n return false\n}\n\nexport function useIsFlashLoanTransactionUnsupported(currencyIn?: Currency): boolean {\n const unsupportedToken: { [address: string]: Token } = useUnsupportedTokens()\n const { chainId } = useActiveWeb3React()\n\n const tokenIn = wrappedCurrency(currencyIn, chainId)\n\n // if unsupported list loaded & either token on list, mark as unsupported\n if (unsupportedToken) {\n if (tokenIn && Object.keys(unsupportedToken).includes(tokenIn.address)) {\n return true\n }\n }\n\n return false\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 { BLOCKED_PRICE_IMPACT_NON_EXPERT } from '../constants'\nimport { CurrencyAmount, Fraction, JSBI, Percent, TokenAmount, Trade } from '@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 FLASH_LOAN_BASE_FEE = new Percent(JSBI.BigInt(5), 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 | null\n): { priceImpactWithoutFee: Percent | undefined; realizedLPFee: CurrencyAmount | undefined | null } {\n // for each hop in our trade, take away the x*y=k price impact from 0.3% 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 price breakdown for the trade\nexport function computeFlashLoanFee(\n currencyAmount?: CurrencyAmount | null\n): { realizedLPFee: CurrencyAmount | undefined | null } {\n // for each hop in our trade, take away the x*y=k price impact from 0.3% fees\n // e.g. for 3 tokens/2 hops: 1 - ((1 - .03) * (1-.03))\n const realizedLPFee = !currencyAmount\n ? undefined\n : FLASH_LOAN_BASE_FEE\n\n // the amount of the input that accrues to LPs\n const realizedLPFeeAmount =\n realizedLPFee &&\n currencyAmount &&\n (currencyAmount instanceof TokenAmount\n ? new TokenAmount(currencyAmount.token, realizedLPFee.multiply(currencyAmount.raw).quotient)\n : CurrencyAmount.ether(realizedLPFee.multiply(currencyAmount.raw).quotient))\n\n return { 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 useENS from '../../hooks/useENS'\nimport { Version } from '../../hooks/useToggledVersion'\nimport { parseUnits } from '@ethersproject/units'\nimport { Currency, CurrencyAmount, ETHER, JSBI, Token, TokenAmount, Trade } from '@uniswap/sdk'\nimport { ParsedQs } from 'qs'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useV1Trade } from '../../data/V1'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency } from '../../hooks/Tokens'\nimport { useTradeExactIn, useTradeExactOut } from '../../hooks/Trades'\nimport useParsedQueryString from '../../hooks/useParsedQueryString'\nimport { isAddress } from '../../utils'\nimport { AppDispatch, AppState } from '../index'\nimport { useCurrencyBalances } from '../wallet/hooks'\nimport { Field, replaceSwapState, selectCurrency, setRecipient, switchCurrencies, typeInput } from './actions'\nimport { SwapState } from './reducer'\nimport useToggledVersion from '../../hooks/useToggledVersion'\nimport { useUserSlippageTolerance } from '../user/hooks'\nimport { computeSlippageAdjustedAmounts } from '../../utils/prices'\n\nexport function useSwapState(): AppState['swap'] {\n return useSelector(state => state.swap)\n}\n\nexport function useSwapActionHandlers(): {\n onCurrencySelection: (field: Field, currency: Currency) => void\n onSwitchTokens: () => void\n onUserInput: (field: Field, typedValue: string) => void\n onChangeRecipient: (recipient: string | null) => void\n} {\n const dispatch = useDispatch()\n const onCurrencySelection = useCallback(\n (field: Field, currency: Currency) => {\n dispatch(\n selectCurrency({\n field,\n currencyId: currency instanceof Token ? currency.address : currency === ETHER ? 'ETH' : ''\n })\n )\n },\n [dispatch]\n )\n\n const onSwitchTokens = useCallback(() => {\n dispatch(switchCurrencies())\n }, [dispatch])\n\n const onUserInput = useCallback(\n (field: Field, typedValue: string) => {\n dispatch(typeInput({ field, typedValue }))\n },\n [dispatch]\n )\n\n const onChangeRecipient = useCallback(\n (recipient: string | null) => {\n dispatch(setRecipient({ recipient }))\n },\n [dispatch]\n )\n\n return {\n onSwitchTokens,\n onCurrencySelection,\n onUserInput,\n onChangeRecipient\n }\n}\n\n// try to parse a user entered amount for a given token\nexport function tryParseAmount(value?: string, currency?: Currency): CurrencyAmount | undefined {\n if (!value || !currency) {\n return undefined\n }\n try {\n const typedValueParsed = parseUnits(value, currency.decimals).toString()\n if (typedValueParsed !== '0') {\n return currency instanceof Token\n ? new TokenAmount(currency, JSBI.BigInt(typedValueParsed))\n : CurrencyAmount.ether(JSBI.BigInt(typedValueParsed))\n }\n } catch (error) {\n // should fail if the user specifies too many decimal places of precision (or maybe exceed max uint?)\n console.debug(`Failed to parse input amount: \"${value}\"`, error)\n }\n // necessary for all paths to return a value\n return undefined\n}\n\nconst BAD_RECIPIENT_ADDRESSES: string[] = [\n '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', // v2 factory\n '0xf164fC0Ec4E93095b804a4795bBe1e041497b92a', // v2 router 01\n '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D' // v2 router 02\n]\n\n/**\n * Returns true if any of the pairs or tokens in a trade have the given checksummed address\n * @param trade to check for the given address\n * @param checksummedAddress address to check in the pairs and tokens\n */\nfunction involvesAddress(trade: Trade, checksummedAddress: string): boolean {\n return (\n trade.route.path.some(token => token.address === checksummedAddress) ||\n trade.route.pairs.some(pair => pair.liquidityToken.address === checksummedAddress)\n )\n}\n\n// from the current swap inputs, compute the best trade and return it.\nexport function useDerivedSwapInfo(): {\n currencies: { [field in Field]?: Currency }\n currencyBalances: { [field in Field]?: CurrencyAmount }\n parsedAmount: CurrencyAmount | undefined\n v2Trade: Trade | undefined\n inputError?: string\n v1Trade: Trade | undefined\n} {\n const { account } = useActiveWeb3React()\n\n const toggledVersion = useToggledVersion()\n\n const {\n independentField,\n typedValue,\n [Field.INPUT]: { currencyId: inputCurrencyId },\n [Field.OUTPUT]: { currencyId: outputCurrencyId },\n recipient\n } = useSwapState()\n\n const inputCurrency = useCurrency(inputCurrencyId)\n const outputCurrency = useCurrency(outputCurrencyId)\n const recipientLookup = useENS(recipient ?? undefined)\n const to: string | null = (recipient === null ? account : recipientLookup.address) ?? null\n\n const relevantTokenBalances = useCurrencyBalances(account ?? undefined, [\n inputCurrency ?? undefined,\n outputCurrency ?? undefined\n ])\n\n const isExactIn: boolean = independentField === Field.INPUT\n const parsedAmount = tryParseAmount(typedValue, (isExactIn ? inputCurrency : outputCurrency) ?? undefined)\n\n const bestTradeExactIn = useTradeExactIn(isExactIn ? parsedAmount : undefined, outputCurrency ?? undefined)\n const bestTradeExactOut = useTradeExactOut(inputCurrency ?? undefined, !isExactIn ? parsedAmount : undefined)\n\n const v2Trade = isExactIn ? bestTradeExactIn : bestTradeExactOut\n\n const currencyBalances = {\n [Field.INPUT]: relevantTokenBalances[0],\n [Field.OUTPUT]: relevantTokenBalances[1]\n }\n\n const currencies: { [field in Field]?: Currency } = {\n [Field.INPUT]: inputCurrency ?? undefined,\n [Field.OUTPUT]: outputCurrency ?? undefined\n }\n\n // get link to trade on v1, if a better rate exists\n const v1Trade = useV1Trade(isExactIn, currencies[Field.INPUT], currencies[Field.OUTPUT], parsedAmount)\n\n let inputError: string | undefined\n if (!account) {\n inputError = 'Connect Wallet'\n }\n\n if (!parsedAmount) {\n inputError = inputError ?? 'Enter an amount'\n }\n\n if (!currencies[Field.INPUT] || !currencies[Field.OUTPUT]) {\n inputError = inputError ?? 'Select a token'\n }\n\n const formattedTo = isAddress(to)\n if (!to || !formattedTo) {\n inputError = inputError ?? 'Enter a recipient'\n } else {\n if (\n BAD_RECIPIENT_ADDRESSES.indexOf(formattedTo) !== -1 ||\n (bestTradeExactIn && involvesAddress(bestTradeExactIn, formattedTo)) ||\n (bestTradeExactOut && involvesAddress(bestTradeExactOut, formattedTo))\n ) {\n inputError = inputError ?? 'Invalid recipient'\n }\n }\n\n const [allowedSlippage] = useUserSlippageTolerance()\n\n const slippageAdjustedAmounts = v2Trade && allowedSlippage && computeSlippageAdjustedAmounts(v2Trade, allowedSlippage)\n\n const slippageAdjustedAmountsV1 =\n v1Trade && allowedSlippage && computeSlippageAdjustedAmounts(v1Trade, allowedSlippage)\n\n // compare input balance to max input based on version\n const [balanceIn, amountIn] = [\n currencyBalances[Field.INPUT],\n toggledVersion === Version.v1\n ? slippageAdjustedAmountsV1\n ? slippageAdjustedAmountsV1[Field.INPUT]\n : null\n : slippageAdjustedAmounts\n ? slippageAdjustedAmounts[Field.INPUT]\n : null\n ]\n\n if (balanceIn && amountIn && balanceIn.lessThan(amountIn)) {\n inputError = 'Insufficient ' + amountIn.currency.symbol + ' balance'\n }\n\n return {\n currencies,\n currencyBalances,\n parsedAmount,\n v2Trade: v2Trade ?? undefined,\n inputError,\n v1Trade\n }\n}\n\nfunction parseCurrencyFromURLParameter(urlParam: any): string {\n if (typeof urlParam === 'string') {\n const valid = isAddress(urlParam)\n if (valid) return valid\n if (urlParam.toUpperCase() === 'ETH') return 'ETH'\n if (valid === false) return 'ETH'\n }\n return 'ETH' ?? ''\n}\n\nfunction parseTokenAmountURLParameter(urlParam: any): string {\n return typeof urlParam === 'string' && !isNaN(parseFloat(urlParam)) ? urlParam : ''\n}\n\nfunction parseIndependentFieldURLParameter(urlParam: any): Field {\n return typeof urlParam === 'string' && urlParam.toLowerCase() === 'output' ? Field.OUTPUT : Field.INPUT\n}\n\nconst ENS_NAME_REGEX = /^[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)?$/\nconst ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\nfunction validatedRecipient(recipient: any): string | null {\n if (typeof recipient !== 'string') return null\n const address = isAddress(recipient)\n if (address) return address\n if (ENS_NAME_REGEX.test(recipient)) return recipient\n if (ADDRESS_REGEX.test(recipient)) return recipient\n return null\n}\n\nexport function queryParametersToSwapState(parsedQs: ParsedQs): SwapState {\n let inputCurrency = parseCurrencyFromURLParameter(parsedQs.inputCurrency)\n let outputCurrency = parseCurrencyFromURLParameter(parsedQs.outputCurrency)\n if (inputCurrency === outputCurrency) {\n if (typeof parsedQs.outputCurrency === 'string') {\n inputCurrency = ''\n } else {\n outputCurrency = ''\n }\n }\n\n const recipient = validatedRecipient(parsedQs.recipient)\n\n return {\n [Field.INPUT]: {\n currencyId: inputCurrency\n },\n [Field.OUTPUT]: {\n currencyId: outputCurrency\n },\n typedValue: parseTokenAmountURLParameter(parsedQs.exactAmount),\n independentField: parseIndependentFieldURLParameter(parsedQs.exactField),\n recipient\n }\n}\n\n// updates the swap state to use the defaults for a given network\nexport function useDefaultsFromURLSearch():\n | { inputCurrencyId: string | undefined; outputCurrencyId: string | undefined }\n | undefined {\n const { chainId } = useActiveWeb3React()\n const dispatch = useDispatch()\n const parsedQs = useParsedQueryString()\n const [result, setResult] = useState<\n { inputCurrencyId: string | undefined; outputCurrencyId: string | undefined } | undefined\n >()\n\n useEffect(() => {\n if (!chainId) return\n const parsed = queryParametersToSwapState(parsedQs)\n\n dispatch(\n replaceSwapState({\n typedValue: parsed.typedValue,\n field: parsed.independentField,\n inputCurrencyId: parsed[Field.INPUT].currencyId,\n outputCurrencyId: parsed[Field.OUTPUT].currencyId,\n recipient: parsed.recipient\n })\n )\n\n setResult({ inputCurrencyId: parsed[Field.INPUT].currencyId, outputCurrencyId: parsed[Field.OUTPUT].currencyId })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dispatch, chainId])\n\n return result\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 { ChainId, CurrencyAmount, JSBI, Token, TokenAmount, WETH, Pair } from '@uniswap/sdk'\nimport { useMemo } from 'react'\nimport { DAI, UNI, DEER, USDC, USDT, WBTC, MKR } from '../../constants'\nimport { STAKING_REWARDS_INTERFACE } from '../../constants/abis/staking-rewards'\nimport { useActiveWeb3React } from '../../hooks'\nimport { NEVER_RELOAD, useMultipleContractSingleData } from '../multicall/hooks'\nimport { tryParseAmount } from '../swap/hooks'\nimport useCurrentBlockTimestamp from 'hooks/useCurrentBlockTimestamp'\nimport { Pool } from 'data/Pool'\n\nexport const STAKING_GENESIS = 1600387200\n\nexport const REWARDS_DURATION_DAYS = 60\n\n// TODO add staking rewards addresses here\nexport const STAKING_REWARDS_INFO: {\n [chainId in ChainId]?: {\n tokens: [Token, Token]\n stakingRewardAddress: string\n }[]\n} = {\n [ChainId.MAINNET]: [\n {\n tokens: [WETH[ChainId.MAINNET], DAI],\n stakingRewardAddress: '0xa1484C3aa22a66C62b77E0AE78E15258bd0cB711'\n },\n {\n tokens: [WETH[ChainId.MAINNET], USDC],\n stakingRewardAddress: '0x7FBa4B8Dc5E7616e59622806932DBea72537A56b'\n },\n {\n tokens: [WETH[ChainId.MAINNET], USDT],\n stakingRewardAddress: '0x6C3e4cb2E96B01F4b866965A91ed4437839A121a'\n },\n {\n tokens: [WETH[ChainId.MAINNET], WBTC],\n stakingRewardAddress: '0xCA35e32e7926b96A9988f61d510E038108d8068e'\n }\n ]\n}\n\n// TODO add staking rewards addresses here\nexport const FLASH_LOAN_STAKING_REWARDS_INFO: {\n [chainId in ChainId]?: {\n token: Token\n stakingRewardAddress: string\n }[]\n} = {\n [ChainId.KOVAN]: [\n {\n token: WETH[ChainId.KOVAN],\n stakingRewardAddress: '0x7b9AF79C95605DfBc9b2381d7765De1BD55100CF'\n },\n {\n token: DAI,\n stakingRewardAddress: '0x08beEb7785241B214C3e084C217f606e0c1FAB72'\n },\n {\n token: MKR,\n stakingRewardAddress: '0xbeC9710AA1Fa883424f3D53F8B92c3cca5284F15'\n },\n {\n token: UNI[ChainId.KOVAN],\n stakingRewardAddress: '0x7421EF341b072AA40C6178744080E84c7CA7e134'\n }\n ]\n}\n\nexport interface StakingInfo {\n // the address of the reward contract\n stakingRewardAddress: string\n // the tokens involved in this pair\n tokens: [Token, Token]\n // the amount of token currently staked, or undefined if no account\n stakedAmount: TokenAmount\n // the amount of reward token earned by the active account, or undefined if no account\n earnedAmount: TokenAmount\n // the total amount of token staked in the contract\n totalStakedAmount: TokenAmount\n // the amount of token distributed per second to all LPs, constant\n totalRewardRate: TokenAmount\n // the current amount of token distributed to the active account per second.\n // equivalent to percent of total supply * reward rate\n rewardRate: TokenAmount\n // when the period ends\n periodFinish: Date | undefined\n // if pool is active\n active: boolean\n // calculates a hypothetical amount of token distributed to the active account per second.\n getHypotheticalRewardRate: (\n stakedAmount: TokenAmount,\n totalStakedAmount: TokenAmount,\n totalRewardRate: TokenAmount\n ) => TokenAmount\n}\n\nexport interface FlashLoanStakingInfo {\n // the address of the reward contract\n stakingRewardAddress: string\n // the tokens involved in this pair\n token: Token\n // the amount of token currently staked, or undefined if no account\n stakedAmount: TokenAmount\n // the amount of reward token earned by the active account, or undefined if no account\n earnedAmount: TokenAmount\n // the total amount of token staked in the contract\n totalStakedAmount: TokenAmount\n // the amount of token distributed per second to all LPs, constant\n totalRewardRate: TokenAmount\n // the current amount of token distributed to the active account per second.\n // equivalent to percent of total supply * reward rate\n rewardRate: TokenAmount\n // when the period ends\n periodFinish: Date | undefined\n // if pool is active\n active: boolean\n // calculates a hypothetical amount of token distributed to the active account per second.\n getHypotheticalRewardRate: (\n stakedAmount: TokenAmount,\n totalStakedAmount: TokenAmount,\n totalRewardRate: TokenAmount\n ) => TokenAmount\n}\n\n// gets the staking info from the network for the active chain id\nexport function useStakingInfo(pairToFilterBy?: Pair | null): StakingInfo[] {\n const { chainId, account } = useActiveWeb3React()\n\n // detect if staking is ended\n const currentBlockTimestamp = useCurrentBlockTimestamp()\n\n const info = useMemo(\n () =>\n chainId\n ? STAKING_REWARDS_INFO[chainId]?.filter(stakingRewardInfo =>\n pairToFilterBy === undefined\n ? true\n : pairToFilterBy === null\n ? false\n : pairToFilterBy.involvesToken(stakingRewardInfo.tokens[0]) &&\n pairToFilterBy.involvesToken(stakingRewardInfo.tokens[1])\n ) ?? []\n : [],\n [chainId, pairToFilterBy]\n )\n\n const uni = chainId ? UNI[chainId] : undefined\n\n const rewardsAddresses = useMemo(() => info.map(({ stakingRewardAddress }) => stakingRewardAddress), [info])\n\n const accountArg = useMemo(() => [account ?? undefined], [account])\n\n // get all the info from the staking rewards contracts\n const balances = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'balanceOf', accountArg)\n const earnedAmounts = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'earned', accountArg)\n const totalSupplies = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'totalSupply')\n\n // tokens per second, constants\n const rewardRates = useMultipleContractSingleData(\n rewardsAddresses,\n STAKING_REWARDS_INTERFACE,\n 'rewardRate',\n undefined,\n NEVER_RELOAD\n )\n const periodFinishes = useMultipleContractSingleData(\n rewardsAddresses,\n STAKING_REWARDS_INTERFACE,\n 'periodFinish',\n undefined,\n NEVER_RELOAD\n )\n\n return useMemo(() => {\n if (!chainId || !uni) return []\n\n return rewardsAddresses.reduce((memo, rewardsAddress, index) => {\n // these two are dependent on account\n const balanceState = balances[index]\n const earnedAmountState = earnedAmounts[index]\n\n // these get fetched regardless of account\n const totalSupplyState = totalSupplies[index]\n const rewardRateState = rewardRates[index]\n const periodFinishState = periodFinishes[index]\n\n if (\n // these may be undefined if not logged in\n !balanceState?.loading &&\n !earnedAmountState?.loading &&\n // always need these\n totalSupplyState &&\n !totalSupplyState.loading &&\n rewardRateState &&\n !rewardRateState.loading &&\n periodFinishState &&\n !periodFinishState.loading\n ) {\n if (\n balanceState?.error ||\n earnedAmountState?.error ||\n totalSupplyState.error ||\n rewardRateState.error ||\n periodFinishState.error\n ) {\n console.error('Failed to load staking rewards info')\n return memo\n }\n\n // get the LP token\n const tokens = info[index].tokens\n const dummyPair = new Pair(new TokenAmount(tokens[0], '0'), new TokenAmount(tokens[1], '0'))\n\n // check for account, if no account set to 0\n\n const stakedAmount = new TokenAmount(dummyPair.liquidityToken, JSBI.BigInt(balanceState?.result?.[0] ?? 0))\n const totalStakedAmount = new TokenAmount(dummyPair.liquidityToken, JSBI.BigInt(totalSupplyState.result?.[0]))\n const totalRewardRate = new TokenAmount(uni, JSBI.BigInt(rewardRateState.result?.[0]))\n\n const getHypotheticalRewardRate = (\n stakedAmount: TokenAmount,\n totalStakedAmount: TokenAmount,\n totalRewardRate: TokenAmount\n ): TokenAmount => {\n return new TokenAmount(\n uni,\n JSBI.greaterThan(totalStakedAmount.raw, JSBI.BigInt(0))\n ? JSBI.divide(JSBI.multiply(totalRewardRate.raw, stakedAmount.raw), totalStakedAmount.raw)\n : JSBI.BigInt(0)\n )\n }\n\n const individualRewardRate = getHypotheticalRewardRate(stakedAmount, totalStakedAmount, totalRewardRate)\n\n const periodFinishSeconds = periodFinishState.result?.[0]?.toNumber()\n const periodFinishMs = periodFinishSeconds * 1000\n\n // compare period end timestamp vs current block timestamp (in seconds)\n const active =\n periodFinishSeconds && currentBlockTimestamp ? periodFinishSeconds > currentBlockTimestamp.toNumber() : true\n\n memo.push({\n stakingRewardAddress: rewardsAddress,\n tokens: info[index].tokens,\n periodFinish: periodFinishMs > 0 ? new Date(periodFinishMs) : undefined,\n earnedAmount: new TokenAmount(uni, JSBI.BigInt(earnedAmountState?.result?.[0] ?? 0)),\n rewardRate: individualRewardRate,\n totalRewardRate: totalRewardRate,\n stakedAmount: stakedAmount,\n totalStakedAmount: totalStakedAmount,\n getHypotheticalRewardRate,\n active\n })\n }\n return memo\n }, [])\n }, [\n balances,\n chainId,\n currentBlockTimestamp,\n earnedAmounts,\n info,\n periodFinishes,\n rewardRates,\n rewardsAddresses,\n totalSupplies,\n uni\n ])\n}\n\n// gets the staking info from the network for the active chain id\nexport function useFlashLoanStakingInfo(poolToFilterBy?: Pool | null): FlashLoanStakingInfo[] {\n const { chainId, account } = useActiveWeb3React()\n\n // detect if staking is ended\n const currentBlockTimestamp = useCurrentBlockTimestamp()\n\n const info = useMemo(\n () =>\n chainId\n ? FLASH_LOAN_STAKING_REWARDS_INFO[chainId]?.filter(stakingRewardInfo =>\n poolToFilterBy === undefined\n ? true\n : poolToFilterBy === null\n ? false\n : poolToFilterBy.involvesToken(stakingRewardInfo.token)\n ) ?? []\n : [],\n [chainId, poolToFilterBy]\n )\n\n const deer = chainId ? DEER[chainId] : undefined\n\n const rewardsAddresses = useMemo(() => info.map(({ stakingRewardAddress }) => stakingRewardAddress), [info])\n\n const accountArg = useMemo(() => [account ?? undefined], [account])\n\n // get all the info from the staking rewards contracts\n const balances = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'balanceOf', accountArg)\n const earnedAmounts = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'earned', accountArg)\n const totalSupplies = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'totalSupply')\n\n // tokens per second, constants\n const rewardRates = useMultipleContractSingleData(\n rewardsAddresses,\n STAKING_REWARDS_INTERFACE,\n 'rewardRate',\n undefined,\n NEVER_RELOAD\n )\n const periodFinishes = useMultipleContractSingleData(\n rewardsAddresses,\n STAKING_REWARDS_INTERFACE,\n 'periodFinish',\n undefined,\n NEVER_RELOAD\n )\n\n return useMemo(() => {\n if (!chainId || !deer) return []\n\n return rewardsAddresses.reduce((memo, rewardsAddress, index) => {\n // these two are dependent on account\n const balanceState = balances[index]\n const earnedAmountState = earnedAmounts[index]\n\n // these get fetched regardless of account\n const totalSupplyState = totalSupplies[index]\n const rewardRateState = rewardRates[index]\n const periodFinishState = periodFinishes[index]\n\n if (\n // these may be undefined if not logged in\n !balanceState?.loading &&\n !earnedAmountState?.loading &&\n // always need these\n totalSupplyState &&\n !totalSupplyState.loading &&\n rewardRateState &&\n !rewardRateState.loading &&\n periodFinishState &&\n !periodFinishState.loading\n ) {\n if (\n balanceState?.error ||\n earnedAmountState?.error ||\n totalSupplyState.error ||\n rewardRateState.error ||\n periodFinishState.error\n ) {\n console.error('Failed to load staking rewards info')\n return memo\n }\n\n // get the LP token\n const token = info[index].token\n const dummyPair = new Pool(new TokenAmount(token, '0'))\n\n // check for account, if no account set to 0\n\n const stakedAmount = new TokenAmount(dummyPair.liquidityToken, JSBI.BigInt(balanceState?.result?.[0] ?? 0))\n const totalStakedAmount = new TokenAmount(dummyPair.liquidityToken, JSBI.BigInt(totalSupplyState.result?.[0]))\n const totalRewardRate = new TokenAmount(deer, JSBI.BigInt(rewardRateState.result?.[0]))\n\n const getHypotheticalRewardRate = (\n stakedAmount: TokenAmount,\n totalStakedAmount: TokenAmount,\n totalRewardRate: TokenAmount\n ): TokenAmount => {\n return new TokenAmount(\n deer,\n JSBI.greaterThan(totalStakedAmount.raw, JSBI.BigInt(0))\n ? JSBI.divide(JSBI.multiply(totalRewardRate.raw, stakedAmount.raw), totalStakedAmount.raw)\n : JSBI.BigInt(0)\n )\n }\n\n const individualRewardRate = getHypotheticalRewardRate(stakedAmount, totalStakedAmount, totalRewardRate)\n\n const periodFinishSeconds = periodFinishState.result?.[0]?.toNumber()\n const periodFinishMs = periodFinishSeconds * 1000\n\n // compare period end timestamp vs current block timestamp (in seconds)\n const active =\n periodFinishSeconds && currentBlockTimestamp ? periodFinishSeconds > currentBlockTimestamp.toNumber() : true\n\n memo.push({\n stakingRewardAddress: rewardsAddress,\n token: info[index].token,\n periodFinish: periodFinishMs > 0 ? new Date(periodFinishMs) : undefined,\n earnedAmount: new TokenAmount(deer, JSBI.BigInt(earnedAmountState?.result?.[0] ?? 0)),\n rewardRate: individualRewardRate,\n totalRewardRate: totalRewardRate,\n stakedAmount: stakedAmount,\n totalStakedAmount: totalStakedAmount,\n getHypotheticalRewardRate,\n active\n })\n }\n return memo\n }, [])\n }, [\n balances,\n chainId,\n currentBlockTimestamp,\n earnedAmounts,\n info,\n periodFinishes,\n rewardRates,\n rewardsAddresses,\n totalSupplies,\n deer\n ])\n}\n\nexport function useTotalUniEarned(): TokenAmount | undefined {\n const { chainId } = useActiveWeb3React()\n const uni = chainId ? UNI[chainId] : undefined\n const stakingInfos = useStakingInfo()\n\n return useMemo(() => {\n if (!uni) return undefined\n return (\n stakingInfos?.reduce(\n (accumulator, stakingInfo) => accumulator.add(stakingInfo.earnedAmount),\n new TokenAmount(uni, '0')\n ) ?? new TokenAmount(uni, '0')\n )\n }, [stakingInfos, uni])\n}\n\n// based on typed value\nexport function useDerivedStakeInfo(\n typedValue: string,\n stakingToken: Token,\n userLiquidityUnstaked: TokenAmount | undefined\n): {\n parsedAmount?: CurrencyAmount\n error?: string\n} {\n const { account } = useActiveWeb3React()\n\n const parsedInput: CurrencyAmount | undefined = tryParseAmount(typedValue, stakingToken)\n\n const parsedAmount =\n parsedInput && userLiquidityUnstaked && JSBI.lessThanOrEqual(parsedInput.raw, userLiquidityUnstaked.raw)\n ? parsedInput\n : undefined\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n if (!parsedAmount) {\n error = error ?? 'Enter an amount'\n }\n\n return {\n parsedAmount,\n error\n }\n}\n\n// based on typed value\nexport function useDerivedUnstakeInfo(\n typedValue: string,\n stakingAmount: TokenAmount\n): {\n parsedAmount?: CurrencyAmount\n error?: string\n} {\n const { account } = useActiveWeb3React()\n\n const parsedInput: CurrencyAmount | undefined = tryParseAmount(typedValue, stakingAmount.token)\n\n const parsedAmount = parsedInput && JSBI.lessThanOrEqual(parsedInput.raw, stakingAmount.raw) ? parsedInput : undefined\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n if (!parsedAmount) {\n error = error ?? 'Enter an amount'\n }\n\n return {\n parsedAmount,\n error\n }\n}\n","import { UNI } from './../../constants/index'\nimport { Currency, CurrencyAmount, ETHER, JSBI, Token, TokenAmount } from '@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'\nimport { useUserUnclaimedAmount } from '../claim/hooks'\nimport { useTotalUniEarned } from '../stake/hooks'\nimport { CToken } from '../../data/CToken'\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 useCTokenBalancesWithLoadingIndicator(\n address?: string,\n tokens?: (CToken | undefined)[]\n): [{ [tokenAddress: string]: TokenAmount | undefined }, boolean] {\n const multicallContract = useMulticallContract()\n\n const uncheckedAddresses = address ? [address] : []\n\n const accounts: 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 validatedTokens: CToken[] = useMemo(\n () => tokens?.filter((t?: CToken): t is CToken => isAddress(t?.address) !== false) ?? [],\n [tokens]\n )\n\n const validatedTokenAddresses = useMemo(() => validatedTokens.map(vt => vt.address), [validatedTokens])\n\n const ethBalance = useSingleContractMultipleData(\n multicallContract,\n 'getEthBalance',\n accounts.map(account => [account])\n )\n\n const balances = useMultipleContractSingleData(validatedTokenAddresses, ERC20_INTERFACE, 'balanceOf', [address])\n\n const anyLoading: boolean = useMemo(\n () => ethBalance.some(callState => callState.loading) && balances.some(callState => callState.loading),\n [balances, ethBalance]\n )\n\n return [\n useMemo(\n () =>\n address && validatedTokens.length > 0\n ? validatedTokens.reduce<{ [tokenAddress: string]: TokenAmount | undefined }>((memo, token, i) => {\n const value = token.isETH() ? ethBalance?.[0]?.result?.[0] : 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, ethBalance, 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\nexport function useCTokenBalances(\n address?: string,\n tokens?: (CToken | undefined)[]\n): { [tokenAddress: string]: TokenAmount | undefined } {\n return useCTokenBalancesWithLoadingIndicator(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\nexport function useAllCTokenBalances(cTokens?: (CToken | undefined)[]): (CurrencyAmount | undefined)[] {\n const { account } = useActiveWeb3React()\n\n const notETHctokens = useMemo(() => cTokens?.filter((ctoken): ctoken is CToken => !ctoken?.isETH() ?? false) ?? [], [\n cTokens\n ])\n\n const tokenBalances = useTokenBalances(account ?? undefined, notETHctokens)\n const containsETH: boolean = useMemo(() => cTokens?.some(item => item?.isETH()) ?? false, [cTokens])\n const ethBalance = useETHBalances(containsETH ? [account ?? undefined] : [])\n\n return useMemo(\n () =>\n cTokens?.map(cToken => {\n if (!account || !cToken) return undefined\n if (cToken.isETH()) return ethBalance[account]\n if (cToken instanceof CToken) return tokenBalances[cToken.address]\n return undefined\n }) ?? [],\n [account, cTokens, ethBalance, tokenBalances]\n )\n}\n\nexport function useCTokenBalance(ctoken?: CToken): CurrencyAmount | undefined {\n return useAllCTokenBalances([ctoken])[0]\n}\n\n// get the total owned, unclaimed, and unharvested UNI for account\nexport 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'\nimport styled from 'styled-components'\nimport { CardProps, Text } from 'rebass'\nimport { Box } from 'rebass/styled-components'\n\nconst Card = styled(Box)<{ width?: string; padding?: string; border?: string; borderRadius?: string }>`\n width: ${({ width }) => width ?? '100%'};\n border-radius: 16px;\n padding: 1.25rem;\n padding: ${({ padding }) => padding};\n border: ${({ border }) => border};\n border-radius: ${({ borderRadius }) => borderRadius};\n`\nexport default Card\n\nexport const LightCard = styled(Card)`\n border: 1px solid ${({ theme }) => theme.bg2};\n background-color: ${({ theme }) => theme.bg1};\n`\n\nexport const GreyCard = styled(Card)`\n background-color: ${({ theme }) => theme.bg3};\n`\n\nexport const OutlineCard = styled(Card)`\n border: 1px solid ${({ theme }) => theme.bg3};\n`\n\nexport const YellowCard = styled(Card)`\n background-color: rgba(243, 132, 30, 0.05);\n color: ${({ theme }) => theme.yellow2};\n font-weight: 500;\n`\n\nexport const PinkCard = styled(Card)`\n background-color: rgba(255, 0, 122, 0.03);\n color: ${({ theme }) => theme.primary1};\n font-weight: 500;\n`\n\nconst BlueCardStyled = styled(Card)`\n background-color: ${({ theme }) => theme.primary5};\n color: ${({ theme }) => theme.primary1};\n border-radius: 12px;\n width: fit-content;\n`\n\nexport const BlueCard = ({ children, ...rest }: CardProps) => {\n return (\n \n \n {children}\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(\"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, { useRef } from 'react'\nimport { Code, Globe, MessageCircle, BookOpen } from 'react-feather'\nimport styled from 'styled-components'\nimport { ReactComponent as MenuIcon } from '../../assets/images/menu.svg'\nimport { useOnClickOutside } from '../../hooks/useOnClickOutside'\nimport { ApplicationModal } from '../../state/application/actions'\nimport { useModalOpen, useToggleModal } from '../../state/application/hooks'\n\nimport { ExternalLink } from '../../theme'\n\nconst StyledMenuIcon = styled(MenuIcon)`\n path {\n stroke: ${({ theme }) => theme.text1};\n }\n`\n\nconst StyledMenuButton = styled.button`\n width: 100%;\n height: 100%;\n border: none;\n background-color: transparent;\n margin: 0;\n padding: 0;\n height: 35px;\n background-color: ${({ theme }) => theme.bg3};\n\n padding: 0.15rem 0.5rem;\n border-radius: 0.5rem;\n\n :hover,\n :focus {\n cursor: pointer;\n outline: none;\n background-color: ${({ theme }) => theme.bg4};\n }\n\n svg {\n margin-top: 2px;\n }\n`\n\nconst StyledMenu = styled.div`\n margin-left: 0.5rem;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n border: none;\n text-align: left;\n`\n\nconst MenuFlyout = styled.span`\n min-width: 8.125rem;\n background-color: ${({ 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 border-radius: 12px;\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n font-size: 1rem;\n position: absolute;\n top: 4rem;\n right: 0rem;\n z-index: 100;\n\n ${({ theme }) => theme.mediaWidth.upToMedium`\n top: -17.25rem;\n `};\n`\n\nconst MenuItem = styled(ExternalLink)`\n flex: 1;\n padding: 0.5rem 0.5rem;\n color: ${({ theme }) => theme.text2};\n :hover {\n color: ${({ theme }) => theme.text1};\n cursor: pointer;\n text-decoration: none;\n }\n > svg {\n margin-right: 8px;\n }\n`\n\nconst CODE_LINK = 'https://github.com/deerfi'\n\nexport default function Menu() {\n const node = useRef()\n const open = useModalOpen(ApplicationModal.MENU)\n const toggle = useToggleModal(ApplicationModal.MENU)\n useOnClickOutside(node, open ? toggle : undefined)\n\n return (\n // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451\n \n \n \n \n\n {open && (\n \n \n \n Code\n \n \n \n Twitter\n \n \n \n Discord\n \n \n \n Telegram\n \n \n \n Medium\n \n \n \n Long\n \n \n )}\n \n )\n}\n","import { JSBI } from '@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 React, { useEffect, useRef } from 'react'\n\nimport styled from 'styled-components'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport Jazzicon from 'jazzicon'\n\nconst StyledIdenticonContainer = styled.div`\n height: 1rem;\n width: 1rem;\n border-radius: 1.125rem;\n background-color: ${({ theme }) => theme.bg4};\n`\n\nexport default function Identicon() {\n const ref = useRef()\n\n const { account } = useActiveWeb3React()\n\n useEffect(() => {\n if (account && ref.current) {\n ref.current.innerHTML = ''\n ref.current.appendChild(Jazzicon(16, parseInt(account.slice(2, 10), 16)))\n }\n }, [account])\n\n // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451\n return \n}\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'\nimport styled from 'styled-components'\nimport { CheckCircle, Triangle } from 'react-feather'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { getEtherscanLink } from '../../utils'\nimport { ExternalLink } from '../../theme'\nimport { useAllTransactions } from '../../state/transactions/hooks'\nimport { RowFixed } from '../Row'\nimport Loader from '../Loader'\n\nconst TransactionWrapper = styled.div``\n\nconst TransactionStatusText = styled.div`\n margin-right: 0.5rem;\n display: flex;\n align-items: center;\n :hover {\n text-decoration: underline;\n }\n`\n\nconst TransactionState = styled(ExternalLink)<{ pending: boolean; success?: boolean }>`\n display: flex;\n justify-content: space-between;\n align-items: center;\n text-decoration: none !important;\n border-radius: 0.5rem;\n padding: 0.25rem 0rem;\n font-weight: 500;\n font-size: 0.825rem;\n color: ${({ theme }) => theme.primary1};\n`\n\nconst IconWrapper = styled.div<{ pending: boolean; success?: boolean }>`\n color: ${({ pending, success, theme }) => (pending ? theme.primary1 : success ? theme.green1 : theme.red1)};\n`\n\nexport default function Transaction({ hash }: { hash: string }) {\n const { chainId } = useActiveWeb3React()\n const allTransactions = useAllTransactions()\n\n const tx = allTransactions?.[hash]\n const summary = tx?.summary\n const pending = !tx?.receipt\n const success = !pending && tx && (tx.receipt?.status === 1 || typeof tx.receipt?.status === 'undefined')\n\n if (!chainId) return null\n\n return (\n \n \n \n {summary ?? hash} ↗\n \n \n {pending ? : success ? : }\n \n \n \n )\n}\n","import React, { useCallback, useContext } from 'react'\nimport { useDispatch } from 'react-redux'\nimport styled, { ThemeContext } from 'styled-components'\nimport { useActiveWeb3React } from '../../hooks'\nimport { AppDispatch } from '../../state'\nimport { clearAllTransactions } from '../../state/transactions/actions'\nimport { shortenAddress } from '../../utils'\nimport { AutoRow } from '../Row'\nimport Copy from './Copy'\nimport Transaction from './Transaction'\n\nimport { SUPPORTED_WALLETS } from '../../constants'\nimport { ReactComponent as Close } from '../../assets/images/x.svg'\nimport { getEtherscanLink } from '../../utils'\nimport { injected, walletconnect, walletlink, fortmatic, portis } from '../../connectors'\nimport CoinbaseWalletIcon from '../../assets/images/coinbaseWalletIcon.svg'\nimport WalletConnectIcon from '../../assets/images/walletConnectIcon.svg'\nimport FortmaticIcon from '../../assets/images/fortmaticIcon.png'\nimport PortisIcon from '../../assets/images/portisIcon.png'\nimport Identicon from '../Identicon'\nimport { ButtonSecondary } from '../Button'\nimport { ExternalLink as LinkIcon } from 'react-feather'\nimport { ExternalLink, LinkStyledButton, TYPE } from '../../theme'\nimport { useTranslation } from 'react-i18next'\n\nconst HeaderRow = styled.div`\n ${({ theme }) => theme.flexRowNoWrap};\n padding: 1rem 1rem;\n font-weight: 500;\n color: ${props => (props.color === 'blue' ? ({ theme }) => theme.primary1 : 'inherit')};\n ${({ theme }) => theme.mediaWidth.upToMedium`\n padding: 1rem;\n `};\n`\n\nconst UpperSection = styled.div`\n position: relative;\n\n h5 {\n margin: 0;\n margin-bottom: 0.5rem;\n font-size: 1rem;\n font-weight: 400;\n }\n\n h5:last-child {\n margin-bottom: 0px;\n }\n\n h4 {\n margin-top: 0;\n font-weight: 500;\n }\n`\n\nconst InfoCard = styled.div`\n padding: 1rem;\n border: 1px solid ${({ theme }) => theme.bg3};\n border-radius: 20px;\n position: relative;\n display: grid;\n grid-row-gap: 12px;\n margin-bottom: 20px;\n`\n\nconst AccountGroupingRow = styled.div`\n ${({ theme }) => theme.flexRowNoWrap};\n justify-content: space-between;\n align-items: center;\n font-weight: 400;\n color: ${({ theme }) => theme.text1};\n\n div {\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n }\n`\n\nconst AccountSection = styled.div`\n background-color: ${({ theme }) => theme.bg1};\n padding: 0rem 1rem;\n ${({ theme }) => theme.mediaWidth.upToMedium`padding: 0rem 1rem 1.5rem 1rem;`};\n`\n\nconst YourAccount = styled.div`\n h5 {\n margin: 0 0 1rem 0;\n font-weight: 400;\n }\n\n h4 {\n margin: 0;\n font-weight: 500;\n }\n`\n\nconst LowerSection = styled.div`\n ${({ theme }) => theme.flexColumnNoWrap}\n padding: 1.5rem;\n flex-grow: 1;\n overflow: auto;\n background-color: ${({ theme }) => theme.bg2};\n border-bottom-left-radius: 20px;\n border-bottom-right-radius: 20px;\n\n h5 {\n margin: 0;\n font-weight: 400;\n color: ${({ theme }) => theme.text3};\n }\n`\n\nconst AccountControl = styled.div`\n display: flex;\n justify-content: space-between;\n min-width: 0;\n width: 100%;\n\n font-weight: 500;\n font-size: 1.25rem;\n\n a:hover {\n text-decoration: underline;\n }\n\n p {\n min-width: 0;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n`\n\nconst AddressLink = styled(ExternalLink)<{ hasENS: boolean; isENS: boolean }>`\n font-size: 0.825rem;\n color: ${({ theme }) => theme.text3};\n margin-left: 1rem;\n font-size: 0.825rem;\n display: flex;\n :hover {\n color: ${({ theme }) => theme.text2};\n }\n`\n\nconst CloseIcon = styled.div`\n position: absolute;\n right: 1rem;\n top: 14px;\n &:hover {\n cursor: pointer;\n opacity: 0.6;\n }\n`\n\nconst CloseColor = styled(Close)`\n path {\n stroke: ${({ theme }) => theme.text4};\n }\n`\n\nconst WalletName = styled.div`\n width: initial;\n font-size: 0.825rem;\n font-weight: 500;\n color: ${({ theme }) => theme.text3};\n`\n\nconst IconWrapper = styled.div<{ size?: number }>`\n ${({ theme }) => theme.flexColumnNoWrap};\n align-items: center;\n justify-content: center;\n margin-right: 8px;\n & > img,\n span {\n height: ${({ size }) => (size ? size + 'px' : '32px')};\n width: ${({ size }) => (size ? size + 'px' : '32px')};\n }\n ${({ theme }) => theme.mediaWidth.upToMedium`\n align-items: flex-end;\n `};\n`\n\nconst TransactionListWrapper = styled.div`\n ${({ theme }) => theme.flexColumnNoWrap};\n`\n\nconst WalletAction = styled(ButtonSecondary)`\n width: fit-content;\n font-weight: 400;\n margin-left: 8px;\n font-size: 0.825rem;\n padding: 4px 6px;\n :hover {\n cursor: pointer;\n text-decoration: underline;\n }\n`\n\nconst MainWalletAction = styled(WalletAction)`\n color: ${({ theme }) => theme.primary1};\n`\n\nfunction renderTransactions(transactions: string[]) {\n return (\n \n {transactions.map((hash, i) => {\n return \n })}\n \n )\n}\n\ninterface AccountDetailsProps {\n toggleWalletModal: () => void\n pendingTransactions: string[]\n confirmedTransactions: string[]\n ENSName?: string\n openOptions: () => void\n}\n\nexport default function AccountDetails({\n toggleWalletModal,\n pendingTransactions,\n confirmedTransactions,\n ENSName,\n openOptions\n}: AccountDetailsProps) {\n const { chainId, account, connector } = useActiveWeb3React()\n const theme = useContext(ThemeContext)\n const dispatch = useDispatch()\n const { t } = useTranslation()\n\n function formatConnectorName() {\n const { ethereum } = window\n const isMetaMask = !!(ethereum && ethereum.isMetaMask)\n const name = Object.keys(SUPPORTED_WALLETS)\n .filter(\n k =>\n SUPPORTED_WALLETS[k].connector === connector && (connector !== injected || isMetaMask === (k === 'METAMASK'))\n )\n .map(k => SUPPORTED_WALLETS[k].name)[0]\n return (\n \n {t('connectedWith')} {name}\n \n )\n }\n\n function getStatusIcon() {\n if (connector === injected) {\n return (\n \n \n \n )\n } else if (connector === walletconnect) {\n return (\n \n {'wallet\n \n )\n } else if (connector === walletlink) {\n return (\n \n {'coinbase\n \n )\n } else if (connector === fortmatic) {\n return (\n \n {'fortmatic\n \n )\n } else if (connector === portis) {\n return (\n <>\n \n {'portis\n {\n portis.portis.showPortis()\n }}\n >\n Show Portis\n \n \n \n )\n }\n return null\n }\n\n const clearAllTransactionsCallback = useCallback(() => {\n if (chainId) dispatch(clearAllTransactions({ chainId }))\n }, [dispatch, chainId])\n\n return (\n <>\n \n \n \n \n {t('account')}\n \n \n \n \n {formatConnectorName()}\n
\n {connector !== injected && connector !== walletlink && (\n {\n ;(connector as any).close()\n }}\n >\n {t('disconnect')}\n \n )}\n {\n openOptions()\n }}\n >\n {t('change')}\n \n
\n
\n \n \n {ENSName ? (\n <>\n
\n {getStatusIcon()}\n

{ENSName}

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

{account && shortenAddress(account)}

\n
\n \n )}\n
\n
\n \n {ENSName ? (\n <>\n \n
\n {account && (\n \n {t('copyAddress')}\n \n )}\n {chainId && account && (\n \n \n {t('viewOnEtherscan')}\n \n )}\n
\n
\n \n ) : (\n <>\n \n
\n {account && (\n \n {t('copyAddress')}\n \n )}\n {chainId && account && (\n \n \n {t('viewOnEtherscan')}\n \n )}\n
\n
\n \n )}\n
\n
\n
\n
\n
\n {!!pendingTransactions.length || !!confirmedTransactions.length ? (\n \n \n {t('recentTransactions')}\n ({t('clearAll')})\n \n {renderTransactions(pendingTransactions)}\n {renderTransactions(confirmedTransactions)}\n \n ) : (\n \n {t('transactionsAppear')}\n \n )}\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { ExternalLink } from '../../theme'\n\nconst InfoCard = styled.button<{ active?: boolean }>`\n background-color: ${({ theme, active }) => (active ? theme.bg3 : theme.bg2)};\n padding: 1rem;\n outline: none;\n border: 1px solid;\n border-radius: 12px;\n width: 100% !important;\n &:focus {\n box-shadow: 0 0 0 1px ${({ theme }) => theme.primary1};\n }\n border-color: ${({ theme, active }) => (active ? 'transparent' : theme.bg3)};\n`\n\nconst OptionCard = styled(InfoCard as any)`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-top: 2rem;\n padding: 1rem;\n`\n\nconst OptionCardLeft = styled.div`\n ${({ theme }) => theme.flexColumnNoWrap};\n justify-content: center;\n height: 100%;\n`\n\nconst OptionCardClickable = styled(OptionCard as any)<{ clickable?: boolean }>`\n margin-top: 0;\n &:hover {\n cursor: ${({ clickable }) => (clickable ? 'pointer' : '')};\n border: ${({ clickable, theme }) => (clickable ? `1px solid ${theme.primary1}` : ``)};\n }\n opacity: ${({ disabled }) => (disabled ? '0.5' : '1')};\n`\n\nconst GreenCircle = styled.div`\n ${({ theme }) => theme.flexRowNoWrap}\n justify-content: center;\n align-items: center;\n\n &:first-child {\n height: 8px;\n width: 8px;\n margin-right: 8px;\n background-color: ${({ theme }) => theme.green1};\n border-radius: 50%;\n }\n`\n\nconst CircleWrapper = styled.div`\n color: ${({ theme }) => theme.green1};\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nconst HeaderText = styled.div`\n ${({ theme }) => theme.flexRowNoWrap};\n color: ${props => (props.color === 'blue' ? ({ theme }) => theme.primary1 : ({ theme }) => theme.text1)};\n font-size: 1rem;\n font-weight: 500;\n`\n\nconst SubHeader = styled.div`\n color: ${({ theme }) => theme.text1};\n margin-top: 10px;\n font-size: 12px;\n`\n\nconst IconWrapper = styled.div<{ size?: number | null }>`\n ${({ theme }) => theme.flexColumnNoWrap};\n align-items: center;\n justify-content: center;\n & > img,\n span {\n height: ${({ size }) => (size ? size + 'px' : '24px')};\n width: ${({ size }) => (size ? size + 'px' : '24px')};\n }\n ${({ theme }) => theme.mediaWidth.upToMedium`\n align-items: flex-end;\n `};\n`\n\nexport default function Option({\n link = null,\n clickable = true,\n size,\n onClick = null,\n color,\n header,\n subheader = null,\n icon,\n active = false,\n id\n}: {\n link?: string | null\n clickable?: boolean\n size?: number | null\n onClick?: null | (() => void)\n color: string\n header: React.ReactNode\n subheader: React.ReactNode | null\n icon: string\n active?: boolean\n id: string\n}) {\n const content = (\n \n \n \n {active ? (\n \n \n
\n \n \n ) : (\n ''\n )}\n {header}\n \n {subheader && {subheader}}\n \n \n {'Icon'}\n \n \n )\n if (link) {\n return {content}\n }\n\n return content\n}\n","import { AbstractConnector } from '@web3-react/abstract-connector'\nimport React from 'react'\nimport styled from 'styled-components'\nimport Option from './Option'\nimport { SUPPORTED_WALLETS } from '../../constants'\nimport { injected } from '../../connectors'\nimport { darken } from 'polished'\nimport Loader from '../Loader'\nimport { useTranslation } from 'react-i18next'\n\nconst PendingSection = styled.div`\n ${({ theme }) => theme.flexColumnNoWrap};\n align-items: center;\n justify-content: center;\n width: 100%;\n & > * {\n width: 100%;\n }\n`\n\nconst StyledLoader = styled(Loader)`\n margin-right: 1rem;\n`\n\nconst LoadingMessage = styled.div<{ error?: boolean }>`\n ${({ theme }) => theme.flexRowNoWrap};\n align-items: center;\n justify-content: flex-start;\n border-radius: 12px;\n margin-bottom: 20px;\n color: ${({ theme, error }) => (error ? theme.red1 : 'inherit')};\n border: 1px solid ${({ theme, error }) => (error ? theme.red1 : theme.text4)};\n\n & > * {\n padding: 1rem;\n }\n`\n\nconst ErrorGroup = styled.div`\n ${({ theme }) => theme.flexRowNoWrap};\n align-items: center;\n justify-content: flex-start;\n`\n\nconst ErrorButton = styled.div`\n border-radius: 8px;\n font-size: 12px;\n color: ${({ theme }) => theme.text1};\n background-color: ${({ theme }) => theme.bg4};\n margin-left: 1rem;\n padding: 0.5rem;\n font-weight: 600;\n user-select: none;\n\n &:hover {\n cursor: pointer;\n background-color: ${({ theme }) => darken(0.1, theme.text4)};\n }\n`\n\nconst LoadingWrapper = styled.div`\n ${({ theme }) => theme.flexRowNoWrap};\n align-items: center;\n justify-content: center;\n`\n\nexport default function PendingView({\n connector,\n error = false,\n setPendingError,\n tryActivation\n}: {\n connector?: AbstractConnector\n error?: boolean\n setPendingError: (error: boolean) => void\n tryActivation: (connector: AbstractConnector) => void\n}) {\n const isMetamask = window?.ethereum?.isMetaMask\n const { t } = useTranslation()\n\n return (\n \n \n \n {error ? (\n \n
{t('errorConnect')}
\n {\n setPendingError(false)\n connector && tryActivation(connector)\n }}\n >\n {t('tryAgain')}\n \n
\n ) : (\n <>\n \n {t('initializing')}\n \n )}\n
\n
\n {Object.keys(SUPPORTED_WALLETS).map(key => {\n const option = SUPPORTED_WALLETS[key]\n if (option.connector === connector) {\n if (option.connector === injected) {\n if (isMetamask && option.name !== 'MetaMask') {\n return null\n }\n if (!isMetamask && option.name === 'MetaMask') {\n return null\n }\n }\n return (\n \n )\n }\n return null\n })}\n
\n )\n}\n","import { AbstractConnector } from '@web3-react/abstract-connector'\nimport { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'\nimport { WalletConnectConnector } from '@web3-react/walletconnect-connector'\nimport React, { useEffect, useState } from 'react'\nimport { isMobile } from 'react-device-detect'\nimport ReactGA from 'react-ga'\nimport { useTranslation } from 'react-i18next'\nimport styled from 'styled-components'\nimport MetamaskIcon from '../../assets/images/metamask.png'\nimport { ReactComponent as Close } from '../../assets/images/x.svg'\nimport { fortmatic, injected, portis } from '../../connectors'\nimport { OVERLAY_READY } from '../../connectors/Fortmatic'\nimport { SUPPORTED_WALLETS } from '../../constants'\nimport usePrevious from '../../hooks/usePrevious'\nimport { ApplicationModal } from '../../state/application/actions'\nimport { useModalOpen, useWalletModalToggle } from '../../state/application/hooks'\nimport { ExternalLink } from '../../theme'\nimport AccountDetails from '../AccountDetails'\n\nimport Modal from '../Modal'\nimport Option from './Option'\nimport PendingView from './PendingView'\n\nconst CloseIcon = styled.div`\n position: absolute;\n right: 1rem;\n top: 14px;\n &:hover {\n cursor: pointer;\n opacity: 0.6;\n }\n`\n\nconst CloseColor = styled(Close)`\n path {\n stroke: ${({ theme }) => theme.text4};\n }\n`\n\nconst Wrapper = styled.div`\n ${({ theme }) => theme.flexColumnNoWrap}\n margin: 0;\n padding: 0;\n width: 100%;\n`\n\nconst HeaderRow = styled.div`\n ${({ theme }) => theme.flexRowNoWrap};\n padding: 1rem 1rem;\n font-weight: 500;\n color: ${props => (props.color === 'blue' ? ({ theme }) => theme.primary1 : 'inherit')};\n ${({ theme }) => theme.mediaWidth.upToMedium`\n padding: 1rem;\n `};\n`\n\nconst ContentWrapper = styled.div`\n background-color: ${({ theme }) => theme.bg2};\n padding: 2rem;\n border-bottom-left-radius: 20px;\n border-bottom-right-radius: 20px;\n\n ${({ theme }) => theme.mediaWidth.upToMedium`padding: 1rem`};\n`\n\nconst UpperSection = styled.div`\n position: relative;\n\n h5 {\n margin: 0;\n margin-bottom: 0.5rem;\n font-size: 1rem;\n font-weight: 400;\n }\n\n h5:last-child {\n margin-bottom: 0px;\n }\n\n h4 {\n margin-top: 0;\n font-weight: 500;\n }\n`\n\nconst Blurb = styled.div`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n margin-top: 2rem;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n margin: 1rem;\n font-size: 12px;\n `};\n`\n\nconst OptionGrid = styled.div`\n display: grid;\n grid-gap: 10px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n grid-template-columns: 1fr;\n grid-gap: 10px;\n `};\n`\n\nconst HoverText = styled.div`\n :hover {\n cursor: pointer;\n }\n`\n\nconst WALLET_VIEWS = {\n OPTIONS: 'options',\n OPTIONS_SECONDARY: 'options_secondary',\n ACCOUNT: 'account',\n PENDING: 'pending'\n}\n\nexport default function WalletModal({\n pendingTransactions,\n confirmedTransactions,\n ENSName\n}: {\n pendingTransactions: string[] // hashes of pending\n confirmedTransactions: string[] // hashes of confirmed\n ENSName?: string\n}) {\n // important that these are destructed from the account-specific web3-react context\n const { active, account, connector, activate, error } = useWeb3React()\n\n const [walletView, setWalletView] = useState(WALLET_VIEWS.ACCOUNT)\n\n const [pendingWallet, setPendingWallet] = useState()\n\n const [pendingError, setPendingError] = useState()\n\n const walletModalOpen = useModalOpen(ApplicationModal.WALLET)\n const toggleWalletModal = useWalletModalToggle()\n\n const previousAccount = usePrevious(account)\n\n const { t } = useTranslation()\n\n // close on connection, when logged out before\n useEffect(() => {\n if (account && !previousAccount && walletModalOpen) {\n toggleWalletModal()\n }\n }, [account, previousAccount, toggleWalletModal, walletModalOpen])\n\n // always reset to account view\n useEffect(() => {\n if (walletModalOpen) {\n setPendingError(false)\n setWalletView(WALLET_VIEWS.ACCOUNT)\n }\n }, [walletModalOpen])\n\n // close modal when a connection is successful\n const activePrevious = usePrevious(active)\n const connectorPrevious = usePrevious(connector)\n useEffect(() => {\n if (walletModalOpen && ((active && !activePrevious) || (connector && connector !== connectorPrevious && !error))) {\n setWalletView(WALLET_VIEWS.ACCOUNT)\n }\n }, [setWalletView, active, error, connector, walletModalOpen, activePrevious, connectorPrevious])\n\n const tryActivation = async (connector: AbstractConnector | undefined) => {\n let name = ''\n Object.keys(SUPPORTED_WALLETS).map(key => {\n if (connector === SUPPORTED_WALLETS[key].connector) {\n return (name = SUPPORTED_WALLETS[key].name)\n }\n return true\n })\n // log selected wallet\n ReactGA.event({\n category: 'Wallet',\n action: 'Change Wallet',\n label: name\n })\n setPendingWallet(connector) // set wallet for pending view\n setWalletView(WALLET_VIEWS.PENDING)\n\n // if the connector is walletconnect and the user has already tried to connect, manually reset the connector\n if (connector instanceof WalletConnectConnector && connector.walletConnectProvider?.wc?.uri) {\n connector.walletConnectProvider = undefined\n }\n\n connector &&\n activate(connector, undefined, true).catch(error => {\n if (error instanceof UnsupportedChainIdError) {\n activate(connector) // a little janky...can't use setError because the connector isn't set\n } else {\n setPendingError(true)\n }\n })\n }\n\n // close wallet modal if fortmatic modal is active\n useEffect(() => {\n fortmatic.on(OVERLAY_READY, () => {\n toggleWalletModal()\n })\n }, [toggleWalletModal])\n\n // get wallets user can switch too, depending on device/browser\n function getOptions() {\n const isMetamask = window.ethereum && window.ethereum.isMetaMask\n return Object.keys(SUPPORTED_WALLETS).map(key => {\n const option = SUPPORTED_WALLETS[key]\n // check for mobile options\n if (isMobile) {\n //disable portis on mobile for now\n if (option.connector === portis) {\n return null\n }\n\n if (!window.web3 && !window.ethereum && option.mobile) {\n return (\n {\n option.connector !== connector && !option.href && tryActivation(option.connector)\n }}\n id={`connect-${key}`}\n key={key}\n active={option.connector && option.connector === connector}\n color={option.color}\n link={option.href}\n header={option.name}\n subheader={null}\n icon={require('../../assets/images/' + option.iconName)}\n />\n )\n }\n return null\n }\n\n // overwrite injected when needed\n if (option.connector === injected) {\n // don't show injected if there's no injected provider\n if (!(window.web3 || window.ethereum)) {\n if (option.name === 'MetaMask') {\n return (\n \n )\n } else {\n return null //dont want to return install twice\n }\n }\n // don't return metamask if injected provider isn't metamask\n else if (option.name === 'MetaMask' && !isMetamask) {\n return null\n }\n // likewise for generic\n else if (option.name === 'Injected' && isMetamask) {\n return null\n }\n }\n\n // return rest of options\n return (\n !isMobile &&\n !option.mobileOnly && (\n {\n option.connector === connector\n ? setWalletView(WALLET_VIEWS.ACCOUNT)\n : !option.href && tryActivation(option.connector)\n }}\n key={key}\n active={option.connector === connector}\n color={option.color}\n link={option.href}\n header={option.name}\n subheader={null} //use option.descriptio to bring back multi-line\n icon={require('../../assets/images/' + option.iconName)}\n />\n )\n )\n })\n }\n\n function getModalContent() {\n if (error) {\n return (\n \n \n \n \n {error instanceof UnsupportedChainIdError ? 'Wrong Network' : 'Error connecting'}\n \n {error instanceof UnsupportedChainIdError ? (\n
Please connect to the appropriate Ethereum network.
\n ) : (\n 'Error connecting. Try refreshing the page.'\n )}\n
\n
\n )\n }\n if (account && walletView === WALLET_VIEWS.ACCOUNT) {\n return (\n setWalletView(WALLET_VIEWS.OPTIONS)}\n />\n )\n }\n return (\n \n \n \n \n {walletView !== WALLET_VIEWS.ACCOUNT ? (\n \n {\n setPendingError(false)\n setWalletView(WALLET_VIEWS.ACCOUNT)\n }}\n >\n {t('back')}\n \n \n ) : (\n \n {t('connectToWallet')}\n \n )}\n \n {walletView === WALLET_VIEWS.PENDING ? (\n \n ) : (\n {getOptions()}\n )}\n {walletView !== WALLET_VIEWS.PENDING && (\n \n {t('newToEthereum')}  {' '}\n {t('learnMoreWallets')}\n \n )}\n \n \n )\n }\n\n return (\n \n {getModalContent()}\n \n )\n}\n","import { AbstractConnector } from '@web3-react/abstract-connector'\nimport { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'\nimport { darken, lighten } from 'polished'\nimport React, { useMemo } from 'react'\nimport { Activity } from 'react-feather'\nimport { useTranslation } from 'react-i18next'\nimport styled, { css } from 'styled-components'\nimport CoinbaseWalletIcon from '../../assets/images/coinbaseWalletIcon.svg'\nimport FortmaticIcon from '../../assets/images/fortmaticIcon.png'\nimport PortisIcon from '../../assets/images/portisIcon.png'\nimport WalletConnectIcon from '../../assets/images/walletConnectIcon.svg'\nimport { fortmatic, injected, portis, walletconnect, walletlink } from '../../connectors'\nimport { NetworkContextName } from '../../constants'\nimport useENSName from '../../hooks/useENSName'\nimport { useHasSocks } from '../../hooks/useSocksBalance'\nimport { useWalletModalToggle } from '../../state/application/hooks'\nimport { isTransactionRecent, useAllTransactions } from '../../state/transactions/hooks'\nimport { TransactionDetails } from '../../state/transactions/reducer'\nimport { shortenAddress } from '../../utils'\nimport { ButtonSecondary } from '../Button'\n\nimport Identicon from '../Identicon'\nimport Loader from '../Loader'\n\nimport { RowBetween } from '../Row'\nimport WalletModal from '../WalletModal'\n\nconst IconWrapper = styled.div<{ size?: number }>`\n ${({ theme }) => theme.flexColumnNoWrap};\n align-items: center;\n justify-content: center;\n & > * {\n height: ${({ size }) => (size ? size + 'px' : '32px')};\n width: ${({ size }) => (size ? size + 'px' : '32px')};\n }\n`\n\nconst Web3StatusGeneric = styled(ButtonSecondary)`\n ${({ theme }) => theme.flexRowNoWrap}\n width: 100%;\n align-items: center;\n padding: 0.5rem;\n border-radius: 12px;\n cursor: pointer;\n user-select: none;\n :focus {\n outline: none;\n }\n`\nconst Web3StatusError = styled(Web3StatusGeneric)`\n background-color: ${({ theme }) => theme.red1};\n border: 1px solid ${({ theme }) => theme.red1};\n color: ${({ theme }) => theme.white};\n font-weight: 500;\n :hover,\n :focus {\n background-color: ${({ theme }) => darken(0.1, theme.red1)};\n }\n`\n\nconst Web3StatusConnect = styled(Web3StatusGeneric)<{ faded?: boolean }>`\n background-color: ${({ theme }) => theme.primary4};\n border: none;\n color: ${({ theme }) => theme.primaryText1};\n font-weight: 500;\n\n :hover,\n :focus {\n border: 1px solid ${({ theme }) => darken(0.05, theme.primary4)};\n color: ${({ theme }) => theme.primaryText1};\n }\n\n ${({ faded }) =>\n faded &&\n css`\n background-color: ${({ theme }) => theme.primary5};\n border: 1px solid ${({ theme }) => theme.primary5};\n color: ${({ theme }) => theme.primaryText1};\n\n :hover,\n :focus {\n border: 1px solid ${({ theme }) => darken(0.05, theme.primary4)};\n color: ${({ theme }) => darken(0.05, theme.primaryText1)};\n }\n `}\n`\n\nconst Web3StatusConnected = styled(Web3StatusGeneric)<{ pending?: boolean }>`\n background-color: ${({ pending, theme }) => (pending ? theme.primary1 : theme.bg2)};\n border: 1px solid ${({ pending, theme }) => (pending ? theme.primary1 : theme.bg3)};\n color: ${({ pending, theme }) => (pending ? theme.white : theme.text1)};\n font-weight: 500;\n :hover,\n :focus {\n background-color: ${({ pending, theme }) => (pending ? darken(0.05, theme.primary1) : lighten(0.05, theme.bg2))};\n\n :focus {\n border: 1px solid ${({ pending, theme }) => (pending ? darken(0.1, theme.primary1) : darken(0.1, theme.bg3))};\n }\n }\n`\n\nconst Text = styled.p`\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0 0.5rem 0 0.25rem;\n font-size: 1rem;\n width: fit-content;\n font-weight: 500;\n`\n\nconst NetworkIcon = styled(Activity)`\n margin-left: 0.25rem;\n margin-right: 0.5rem;\n width: 16px;\n height: 16px;\n`\n\n// we want the latest one to come first, so return negative if a is after b\nfunction newTransactionsFirst(a: TransactionDetails, b: TransactionDetails) {\n return b.addedTime - a.addedTime\n}\n\nconst SOCK = (\n \n 🧦\n \n)\n\n// eslint-disable-next-line react/prop-types\nfunction StatusIcon({ connector }: { connector: AbstractConnector }) {\n if (connector === injected) {\n return \n } else if (connector === walletconnect) {\n return (\n \n {''}\n \n )\n } else if (connector === walletlink) {\n return (\n \n {''}\n \n )\n } else if (connector === fortmatic) {\n return (\n \n {''}\n \n )\n } else if (connector === portis) {\n return (\n \n {''}\n \n )\n }\n return null\n}\n\nfunction Web3StatusInner() {\n const { t } = useTranslation()\n const { account, connector, error } = useWeb3React()\n\n const { ENSName } = useENSName(account ?? undefined)\n\n const allTransactions = useAllTransactions()\n\n const sortedRecentTransactions = useMemo(() => {\n const txs = Object.values(allTransactions)\n return txs.filter(isTransactionRecent).sort(newTransactionsFirst)\n }, [allTransactions])\n\n const pending = sortedRecentTransactions.filter(tx => !tx.receipt).map(tx => tx.hash)\n\n const hasPendingTransactions = !!pending.length\n const hasSocks = useHasSocks()\n const toggleWalletModal = useWalletModalToggle()\n\n if (account) {\n return (\n \n {hasPendingTransactions ? (\n \n \n {pending?.length} {t('pending')}\n {' '}\n \n \n ) : (\n <>\n {hasSocks ? SOCK : null}\n {ENSName || shortenAddress(account)}\n \n )}\n {!hasPendingTransactions && connector && }\n \n )\n } else if (error) {\n return (\n \n \n {error instanceof UnsupportedChainIdError ? 'Wrong Network' : 'Error'}\n \n )\n } else {\n return (\n \n {t('connectToWallet')}\n \n )\n }\n}\n\nexport default function Web3Status() {\n const { active, account } = useWeb3React()\n const contextNetwork = useWeb3React(NetworkContextName)\n\n const { ENSName } = useENSName(account ?? undefined)\n\n const allTransactions = useAllTransactions()\n\n const sortedRecentTransactions = useMemo(() => {\n const txs = Object.values(allTransactions)\n return txs.filter(isTransactionRecent).sort(newTransactionsFirst)\n }, [allTransactions])\n\n const pending = sortedRecentTransactions.filter(tx => !tx.receipt).map(tx => tx.hash)\n const confirmed = sortedRecentTransactions.filter(tx => tx.receipt).map(tx => tx.hash)\n\n if (!contextNetwork.active && !active) {\n return null\n }\n\n return (\n <>\n \n \n \n )\n}\n","import { JSBI, TokenAmount } from '@uniswap/sdk'\nimport { isAddress } from 'ethers/lib/utils'\nimport React, { useEffect, useState } from 'react'\nimport { Text } from 'rebass'\nimport styled from 'styled-components'\nimport Circle from '../../assets/images/blue-loader.svg'\nimport tokenLogo from '../../assets/images/token-logo.png'\nimport { useActiveWeb3React } from '../../hooks'\nimport { ApplicationModal } from '../../state/application/actions'\nimport { useModalOpen, useToggleSelfClaimModal } from '../../state/application/hooks'\nimport { useClaimCallback, useUserClaimData, useUserUnclaimedAmount } from '../../state/claim/hooks'\nimport { useUserHasSubmittedClaim } from '../../state/transactions/hooks'\nimport { CloseIcon, CustomLightSpinner, ExternalLink, TYPE, UniTokenAnimated } from '../../theme'\nimport { getEtherscanLink } from '../../utils'\nimport { ButtonPrimary } from '../Button'\nimport { AutoColumn, ColumnCenter } from '../Column'\nimport Confetti from '../Confetti'\nimport { Break, CardBGImage, CardBGImageSmaller, CardNoise, CardSection, DataCard } from '../earn/styled'\n\nimport Modal from '../Modal'\nimport { RowBetween } from '../Row'\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n`\n\nconst ModalUpper = styled(DataCard)`\n box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #ff007a 0%, #021d43 100%);\n`\n\nconst ConfirmOrLoadingWrapper = styled.div<{ activeBG: boolean }>`\n width: 100%;\n padding: 24px;\n position: relative;\n background: ${({ activeBG }) =>\n activeBG &&\n 'radial-gradient(76.02% 75.41% at 1.84% 0%, rgba(255, 0, 122, 0.2) 0%, rgba(33, 114, 229, 0.2) 100%), #FFFFFF;'};\n`\n\nconst ConfirmedIcon = styled(ColumnCenter)`\n padding: 60px 0;\n`\n\nconst SOCKS_AMOUNT = 1000\nconst USER_AMOUNT = 400\n\nexport default function ClaimModal() {\n const isOpen = useModalOpen(ApplicationModal.SELF_CLAIM)\n const toggleClaimModal = useToggleSelfClaimModal()\n\n const { account, chainId } = useActiveWeb3React()\n\n // used for UI loading states\n const [attempting, setAttempting] = useState(false)\n\n // get user claim data\n const userClaimData = useUserClaimData(account)\n\n // monitor the status of the claim from contracts and txns\n const { claimCallback } = useClaimCallback(account)\n const unclaimedAmount: TokenAmount | undefined = useUserUnclaimedAmount(account)\n const { claimSubmitted, claimTxn } = useUserHasSubmittedClaim(account ?? undefined)\n const claimConfirmed = Boolean(claimTxn?.receipt)\n\n function onClaim() {\n setAttempting(true)\n claimCallback()\n // reset modal and log error\n .catch(error => {\n setAttempting(false)\n console.log(error)\n })\n }\n\n // once confirmed txn is found, if modal is closed open, mark as not attempting regradless\n useEffect(() => {\n if (claimConfirmed && claimSubmitted && attempting) {\n setAttempting(false)\n if (!isOpen) {\n toggleClaimModal()\n }\n }\n }, [attempting, claimConfirmed, claimSubmitted, isOpen, toggleClaimModal])\n\n const nonLPAmount = JSBI.multiply(\n JSBI.BigInt((userClaimData?.flags?.isSOCKS ? SOCKS_AMOUNT : 0) + (userClaimData?.flags?.isUser ? USER_AMOUNT : 0)),\n JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\n )\n\n return (\n \n \n {!attempting && !claimConfirmed && (\n \n \n \n \n \n \n Claim UNI\n \n \n \n {unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI\n \n \n \n \n {userClaimData?.flags?.isSOCKS && (\n \n SOCKS\n {SOCKS_AMOUNT} UNI\n \n )}\n {userClaimData?.flags?.isLP &&\n unclaimedAmount &&\n JSBI.greaterThanOrEqual(unclaimedAmount.raw, nonLPAmount) && (\n \n Liquidity\n \n {unclaimedAmount\n .subtract(new TokenAmount(unclaimedAmount.token, nonLPAmount))\n .toFixed(0, { groupSeparator: ',' })}{' '}\n UNI\n \n \n )}\n {userClaimData?.flags?.isUser && (\n \n User\n {USER_AMOUNT} UNI\n \n )}\n \n \n \n \n As a member of the Uniswap community you may claim UNI to be used for voting and governance.

\n Read more about UNI\n
\n \n Claim UNI\n \n
\n
\n )}\n {(attempting || claimConfirmed) && (\n \n \n \n \n
\n \n \n \n {!claimConfirmed ? (\n \n ) : (\n \n )}\n \n \n \n \n {claimConfirmed ? 'Claimed!' : 'Claiming'}\n \n {!claimConfirmed && (\n \n {unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI\n \n )}\n \n {claimConfirmed && (\n <>\n \n \n 🎉{' '}\n \n Welcome to team Unicorn :){' '}\n \n 🎉\n \n \n \n )}\n {attempting && !claimSubmitted && (\n Confirm this transaction in your wallet\n )}\n {attempting && claimSubmitted && !claimConfirmed && chainId && claimTxn?.hash && (\n \n View transaction on Etherscan\n \n )}\n \n \n )}\n \n )\n}\n","import { transparentize } from 'polished'\nimport React from 'react'\nimport { AlertTriangle } from 'react-feather'\nimport styled, { css } from 'styled-components'\nimport { Text } from 'rebass'\nimport { AutoColumn } from '../Column'\n\nexport const Wrapper = styled.div`\n position: relative;\n padding: 1rem;\n`\n\nexport const ArrowWrapper = styled.div<{ clickable: boolean }>`\n padding: 2px;\n\n ${({ clickable }) =>\n clickable\n ? css`\n :hover {\n cursor: pointer;\n opacity: 0.8;\n }\n `\n : null}\n`\n\nexport const SectionBreak = styled.div`\n height: 1px;\n width: 100%;\n background-color: ${({ theme }) => theme.bg3};\n`\n\nexport const BottomGrouping = styled.div`\n margin-top: 1rem;\n`\n\nexport const ErrorText = styled(Text)<{ severity?: 0 | 1 | 2 | 3 | 4 }>`\n color: ${({ theme, severity }) =>\n severity === 3 || severity === 4\n ? theme.red1\n : severity === 2\n ? theme.yellow2\n : severity === 1\n ? theme.text1\n : theme.green1};\n`\n\nexport const StyledBalanceMaxMini = styled.button`\n height: 22px;\n width: 22px;\n background-color: ${({ theme }) => theme.bg2};\n border: none;\n border-radius: 50%;\n padding: 0.2rem;\n font-size: 0.875rem;\n font-weight: 400;\n margin-left: 0.4rem;\n cursor: pointer;\n color: ${({ theme }) => theme.text2};\n display: flex;\n justify-content: center;\n align-items: center;\n float: right;\n\n :hover {\n background-color: ${({ theme }) => theme.bg3};\n }\n :focus {\n background-color: ${({ theme }) => theme.bg3};\n outline: none;\n }\n`\n\nexport const TruncatedText = styled(Text)`\n text-overflow: ellipsis;\n width: 220px;\n overflow: hidden;\n`\n\n// styles\nexport const Dots = styled.span`\n &::after {\n display: inline-block;\n animation: ellipsis 1.25s infinite;\n content: '.';\n width: 1em;\n text-align: left;\n }\n @keyframes ellipsis {\n 0% {\n content: '.';\n }\n 33% {\n content: '..';\n }\n 66% {\n content: '...';\n }\n }\n`\n\nconst SwapCallbackErrorInner = styled.div`\n background-color: ${({ theme }) => transparentize(0.9, theme.red1)};\n border-radius: 1rem;\n display: flex;\n align-items: center;\n font-size: 0.825rem;\n width: 100%;\n padding: 3rem 1.25rem 1rem 1rem;\n margin-top: -2rem;\n color: ${({ theme }) => theme.red1};\n z-index: -1;\n p {\n padding: 0;\n margin: 0;\n font-weight: 500;\n }\n`\n\nconst SwapCallbackErrorInnerAlertTriangle = styled.div`\n background-color: ${({ theme }) => transparentize(0.9, theme.red1)};\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n border-radius: 12px;\n min-width: 48px;\n height: 48px;\n`\n\nexport function SwapCallbackError({ error }: { error: string }) {\n return (\n \n \n \n \n

{error}

\n
\n )\n}\n\nexport const SwapShowAcceptChanges = styled(AutoColumn)`\n background-color: ${({ theme }) => transparentize(0.9, theme.primary1)};\n color: ${({ theme }) => theme.primary1};\n padding: 0.5rem;\n border-radius: 12px;\n margin-top: 8px;\n`\nexport const Separator = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.bg2};\n`\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Token, TokenAmount } from '@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 { JSBI, Token, TokenAmount } from '@uniswap/sdk'\nimport { BigNumber } from 'ethers'\nimport { STAKING_GENESIS } from '../state/stake/hooks'\n\nconst STAKING_END = STAKING_GENESIS + 60 * 60 * 24 * 60\n\nconst TREASURY_VESTING_GENESIS = 1600387200\n\n// 30 days\nconst TREASURY_VESTING_CLIFF: number = 60 * 60 * 24 * 30\n\nconst ONE_YEAR: number = 60 * 60 * 24 * 365\nconst TREASURY_BEGIN_YEAR_1 = TREASURY_VESTING_GENESIS\nconst TREASURY_CLIFF_YEAR_1 = TREASURY_BEGIN_YEAR_1 + TREASURY_VESTING_CLIFF\nconst TREASURY_END_YEAR_1 = TREASURY_BEGIN_YEAR_1 + ONE_YEAR\n\nconst TREASURY_BEGIN_YEAR_2 = TREASURY_END_YEAR_1\nconst TREASURY_END_YEAR_2 = TREASURY_BEGIN_YEAR_2 + ONE_YEAR\n\nconst TREASURY_BEGIN_YEAR_3 = TREASURY_END_YEAR_2\nconst TREASURY_END_YEAR_3 = TREASURY_BEGIN_YEAR_3 + ONE_YEAR\n\nconst TREASURY_BEGIN_YEAR_4 = TREASURY_END_YEAR_3\nconst TREASURY_END_YEAR_4 = TREASURY_BEGIN_YEAR_4 + ONE_YEAR\n\nconst USERS_AMOUNT = 150_000_000\nconst STAKING_REWARDS_AMOUNT = 20_000_000\nconst TREASURY_YEAR_1_AMOUNT = 172_000_000\nconst TREASURY_YEAR_2_AMOUNT = 129_000_00\nconst TREASURY_YEAR_3_AMOUNT = 86_000_00\nconst TREASURY_YEAR_4_AMOUNT = 43_000_00\nconst TEAM_YEAR_1_AMOUNT = 160_000_000\nconst TEAM_YEAR_2_AMOUNT = 120_000_00\nconst TEAM_YEAR_3_AMOUNT = 80_000_00\nconst TEAM_YEAR_4_AMOUNT = 40_000_00\n\nfunction withVesting(before: JSBI, time: BigNumber, amount: number, start: number, end: number, cliff?: number) {\n if (time.gt(start)) {\n if (time.gte(end)) {\n return JSBI.add(before, JSBI.BigInt(amount))\n } else {\n if ((typeof cliff === 'number' && time.gte(cliff)) || typeof cliff === 'undefined') {\n return JSBI.add(\n before,\n JSBI.divide(\n JSBI.multiply(JSBI.BigInt(amount), JSBI.BigInt(time.sub(start).toString())),\n JSBI.subtract(JSBI.BigInt(end), JSBI.BigInt(start))\n )\n )\n }\n }\n }\n return before\n}\n\nexport function computeUniCirculation(\n uni: Token,\n blockTimestamp: BigNumber,\n unclaimedUni: TokenAmount | undefined\n): TokenAmount {\n let wholeAmount = JSBI.BigInt(USERS_AMOUNT)\n\n // staking rewards\n wholeAmount = withVesting(wholeAmount, blockTimestamp, STAKING_REWARDS_AMOUNT, STAKING_GENESIS, STAKING_END)\n\n // treasury vesting\n wholeAmount = withVesting(\n wholeAmount,\n blockTimestamp,\n TREASURY_YEAR_1_AMOUNT,\n TREASURY_BEGIN_YEAR_1,\n TREASURY_END_YEAR_1,\n TREASURY_CLIFF_YEAR_1\n )\n wholeAmount = withVesting(\n wholeAmount,\n blockTimestamp,\n TREASURY_YEAR_2_AMOUNT,\n TREASURY_BEGIN_YEAR_2,\n TREASURY_END_YEAR_2\n )\n wholeAmount = withVesting(\n wholeAmount,\n blockTimestamp,\n TREASURY_YEAR_3_AMOUNT,\n TREASURY_BEGIN_YEAR_3,\n TREASURY_END_YEAR_3\n )\n wholeAmount = withVesting(\n wholeAmount,\n blockTimestamp,\n TREASURY_YEAR_4_AMOUNT,\n TREASURY_BEGIN_YEAR_4,\n TREASURY_END_YEAR_4\n )\n\n // team\n wholeAmount = withVesting(\n wholeAmount,\n blockTimestamp,\n TEAM_YEAR_1_AMOUNT,\n TREASURY_BEGIN_YEAR_1,\n TREASURY_END_YEAR_1,\n TREASURY_CLIFF_YEAR_1\n )\n wholeAmount = withVesting(wholeAmount, blockTimestamp, TEAM_YEAR_2_AMOUNT, TREASURY_BEGIN_YEAR_2, TREASURY_END_YEAR_2)\n wholeAmount = withVesting(wholeAmount, blockTimestamp, TEAM_YEAR_3_AMOUNT, TREASURY_BEGIN_YEAR_3, TREASURY_END_YEAR_3)\n wholeAmount = withVesting(wholeAmount, blockTimestamp, TEAM_YEAR_4_AMOUNT, TREASURY_BEGIN_YEAR_4, TREASURY_END_YEAR_4)\n\n const total = new TokenAmount(uni, JSBI.multiply(wholeAmount, JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))))\n return unclaimedUni ? total.subtract(unclaimedUni) : total\n}\n","import { ChainId, Currency, currencyEquals, JSBI, Price, WETH } from '@uniswap/sdk'\nimport { useMemo } from 'react'\nimport { USDC } from '../constants'\nimport { PairState, usePairs } from '../data/Reserves'\nimport { useActiveWeb3React } from '../hooks'\nimport { wrappedCurrency } from './wrappedCurrency'\n\n/**\n * Returns the price in USDC of the input currency\n * @param currency currency to compute the USDC price of\n */\nexport default function useUSDCPrice(currency?: Currency): Price | undefined {\n const { chainId } = useActiveWeb3React()\n const wrapped = wrappedCurrency(currency, chainId)\n const tokenPairs: [Currency | undefined, Currency | undefined][] = useMemo(\n () => [\n [\n chainId && wrapped && currencyEquals(WETH[chainId], wrapped) ? undefined : currency,\n chainId ? WETH[chainId] : undefined\n ],\n [wrapped?.equals(USDC) ? undefined : wrapped, chainId === ChainId.MAINNET ? USDC : undefined],\n [chainId ? WETH[chainId] : undefined, chainId === ChainId.MAINNET ? USDC : undefined]\n ],\n [chainId, currency, wrapped]\n )\n const [[ethPairState, ethPair], [usdcPairState, usdcPair], [usdcEthPairState, usdcEthPair]] = usePairs(tokenPairs)\n\n return useMemo(() => {\n if (!currency || !wrapped || !chainId) {\n return undefined\n }\n // handle weth/eth\n if (wrapped.equals(WETH[chainId])) {\n if (usdcPair) {\n const price = usdcPair.priceOf(WETH[chainId])\n return new Price(currency, USDC, price.denominator, price.numerator)\n } else {\n return undefined\n }\n }\n // handle usdc\n if (wrapped.equals(USDC)) {\n return new Price(USDC, USDC, '1', '1')\n }\n\n const ethPairETHAmount = ethPair?.reserveOf(WETH[chainId])\n const ethPairETHUSDCValue: JSBI =\n ethPairETHAmount && usdcEthPair ? usdcEthPair.priceOf(WETH[chainId]).quote(ethPairETHAmount).raw : JSBI.BigInt(0)\n\n // all other tokens\n // first try the usdc pair\n if (usdcPairState === PairState.EXISTS && usdcPair && usdcPair.reserveOf(USDC).greaterThan(ethPairETHUSDCValue)) {\n const price = usdcPair.priceOf(wrapped)\n return new Price(currency, USDC, price.denominator, price.numerator)\n }\n if (ethPairState === PairState.EXISTS && ethPair && usdcEthPairState === PairState.EXISTS && usdcEthPair) {\n if (usdcEthPair.reserveOf(USDC).greaterThan('0') && ethPair.reserveOf(WETH[chainId]).greaterThan('0')) {\n const ethUsdcPrice = usdcEthPair.priceOf(USDC)\n const currencyEthPrice = ethPair.priceOf(WETH[chainId])\n const usdcPrice = ethUsdcPrice.multiply(currencyEthPrice).invert()\n return new Price(currency, USDC, usdcPrice.denominator, usdcPrice.numerator)\n }\n }\n return undefined\n }, [chainId, currency, ethPair, ethPairState, usdcEthPair, usdcEthPairState, usdcPair, usdcPairState, wrapped])\n}\n","import { ChainId, TokenAmount } from '@uniswap/sdk'\nimport React, { useMemo } from 'react'\nimport { X } from 'react-feather'\nimport styled from 'styled-components'\nimport tokenLogo from '../../assets/images/token-logo.png'\nimport { UNI } from '../../constants'\nimport { useTotalSupply } from '../../data/TotalSupply'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useMerkleDistributorContract } from '../../hooks/useContract'\nimport useCurrentBlockTimestamp from '../../hooks/useCurrentBlockTimestamp'\nimport { useTotalUniEarned } from '../../state/stake/hooks'\nimport { useAggregateUniBalance, useTokenBalance } from '../../state/wallet/hooks'\nimport { ExternalLink, StyledInternalLink, TYPE, UniTokenAnimated } from '../../theme'\nimport { computeUniCirculation } from '../../utils/computeUniCirculation'\nimport useUSDCPrice from '../../utils/useUSDCPrice'\nimport { AutoColumn } from '../Column'\nimport { RowBetween } from '../Row'\nimport { Break, CardBGImage, CardNoise, CardSection, DataCard } from '../earn/styled'\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n`\n\nconst ModalUpper = styled(DataCard)`\n box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #ff007a 0%, #021d43 100%);\n padding: 0.5rem;\n`\n\nconst StyledClose = styled(X)`\n position: absolute;\n right: 16px;\n top: 16px;\n\n :hover {\n cursor: pointer;\n }\n`\n\n/**\n * Content for balance stats modal\n */\nexport default function UniBalanceContent({ setShowUniBalanceModal }: { setShowUniBalanceModal: any }) {\n const { account, chainId } = useActiveWeb3React()\n const uni = chainId ? UNI[chainId] : undefined\n\n const total = useAggregateUniBalance()\n const uniBalance: TokenAmount | undefined = useTokenBalance(account ?? undefined, uni)\n const uniToClaim: TokenAmount | undefined = useTotalUniEarned()\n\n const totalSupply: TokenAmount | undefined = useTotalSupply(uni)\n const uniPrice = useUSDCPrice(uni)\n const blockTimestamp = useCurrentBlockTimestamp()\n const unclaimedUni = useTokenBalance(useMerkleDistributorContract()?.address, uni)\n const circulation: TokenAmount | undefined = useMemo(\n () =>\n blockTimestamp && uni && chainId === ChainId.MAINNET\n ? computeUniCirculation(uni, blockTimestamp, unclaimedUni)\n : totalSupply,\n [blockTimestamp, chainId, totalSupply, unclaimedUni, uni]\n )\n\n return (\n \n \n \n \n \n \n Your UNI Breakdown\n setShowUniBalanceModal(false)} />\n \n \n \n {account && (\n <>\n \n \n {' '}\n \n {total?.toFixed(2, { groupSeparator: ',' })}\n \n \n \n \n Balance:\n {uniBalance?.toFixed(2, { groupSeparator: ',' })}\n \n \n Unclaimed:\n \n {uniToClaim?.toFixed(4, { groupSeparator: ',' })}{' '}\n {uniToClaim && uniToClaim.greaterThan('0') && (\n setShowUniBalanceModal(false)} to=\"/uni\">\n (claim)\n \n )}\n \n \n \n \n \n \n )}\n \n \n \n UNI price:\n ${uniPrice?.toFixed(2) ?? '-'}\n \n \n UNI in circulation:\n {circulation?.toFixed(0, { groupSeparator: ',' })}\n \n \n Total Supply\n {totalSupply?.toFixed(0, { groupSeparator: ',' })}\n \n {uni && uni.chainId === ChainId.MAINNET ? (\n View UNI Analytics\n ) : null}\n \n \n \n \n )\n}\n","import { ChainId } from '@uniswap/sdk'\nimport React, { useState } from 'react'\nimport { Text } from 'rebass'\nimport { NavLink } from 'react-router-dom'\nimport { darken } from 'polished'\nimport { useTranslation } from 'react-i18next'\n\nimport styled from 'styled-components'\n\nimport Logo from '../../assets/svg/logo.png'\nimport LogoDark from '../../assets/svg/logo_white.png'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useDarkModeManager } from '../../state/user/hooks'\nimport { useETHBalances } from '../../state/wallet/hooks'\nimport { CardNoise } from '../earn/styled'\nimport { TYPE, ExternalLink } from '../../theme'\n\nimport { YellowCard } from '../Card'\nimport { Moon, Sun } from 'react-feather'\nimport Menu from '../Menu'\n\nimport Row, { RowFixed } from '../Row'\nimport Web3Status from '../Web3Status'\nimport ClaimModal from '../claim/ClaimModal'\nimport { useToggleSelfClaimModal, useShowClaimPopup } from '../../state/application/hooks'\nimport { useUserHasAvailableClaim } from '../../state/claim/hooks'\nimport { useUserHasSubmittedClaim } from '../../state/transactions/hooks'\nimport { Dots } from '../swap/styleds'\nimport Modal from '../Modal'\nimport UniBalanceContent from './UniBalanceContent'\n\nconst HeaderFrame = styled.div`\n display: grid;\n grid-template-columns: 1fr 120px;\n align-items: center;\n justify-content: space-between;\n align-items: center;\n flex-direction: row;\n width: 100%;\n top: 0;\n position: relative;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n padding: 1rem;\n z-index: 2;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n grid-template-columns: 1fr;\n padding: 0 1rem;\n width: calc(100%);\n position: relative;\n `};\n\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\n padding: 0.5rem 1rem;\n `}\n`\n\nconst HeaderControls = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-self: flex-end;\n\n ${({ theme }) => theme.mediaWidth.upToMedium`\n flex-direction: row;\n justify-content: space-between;\n justify-self: center;\n width: 100%;\n max-width: 960px;\n padding: 1rem;\n position: fixed;\n bottom: 0px;\n left: 0px;\n width: 100%;\n z-index: 99;\n height: 72px;\n border-radius: 12px 12px 0 0;\n background-color: ${({ theme }) => theme.bg1};\n `};\n`\n\nconst HeaderElement = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n\n ${({ theme }) => theme.mediaWidth.upToMedium`\n flex-direction: row-reverse;\n align-items: center;\n `};\n`\n\nconst HeaderElementWrap = styled.div`\n display: flex;\n align-items: center;\n`\n\nconst HeaderRow = styled(RowFixed)`\n ${({ theme }) => theme.mediaWidth.upToMedium`\n width: 100%;\n `};\n`\n\nconst HeaderLinks = styled(Row)`\n justify-content: center;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n padding: 1rem 0 1rem 1rem;\n justify-content: flex-end;\n`};\n`\n\nconst AccountElement = styled.div<{ active: boolean }>`\n display: flex;\n flex-direction: row;\n align-items: center;\n background-color: ${({ theme, active }) => (!active ? theme.bg1 : theme.bg3)};\n border-radius: 12px;\n white-space: nowrap;\n width: 100%;\n cursor: pointer;\n\n :focus {\n border: 1px solid blue;\n }\n`\n\nconst UNIAmount = styled(AccountElement)`\n color: white;\n padding: 4px 8px;\n height: 36px;\n font-weight: 500;\n background-color: ${({ theme }) => theme.bg3};\n background: radial-gradient(174.47% 188.91% at 1.84% 0%, #ff007a 0%, #2172e5 100%), #edeef2;\n`\n\nconst UNIWrapper = styled.span`\n width: fit-content;\n position: relative;\n cursor: pointer;\n\n :hover {\n opacity: 0.8;\n }\n\n :active {\n opacity: 0.9;\n }\n`\n\nconst HideSmall = styled.span`\n ${({ theme }) => theme.mediaWidth.upToSmall`\n display: none;\n `};\n`\n\nconst NetworkCard = styled(YellowCard)`\n border-radius: 12px;\n padding: 8px 12px;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n margin: 0;\n margin-right: 0.5rem;\n width: initial;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 1;\n `};\n`\n\nconst BalanceText = styled(Text)`\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\n display: none;\n `};\n`\n\nconst Title = styled.a`\n display: flex;\n align-items: center;\n pointer-events: auto;\n justify-self: flex-start;\n margin-right: 12px;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n justify-self: center;\n `};\n :hover {\n cursor: pointer;\n }\n`\n\nconst UniIcon = styled.div`\n transition: transform 0.3s ease;\n :hover {\n transform: rotate(-5deg);\n }\n`\n\nconst activeClassName = 'ACTIVE'\n\nconst StyledNavLink = styled(NavLink).attrs({\n activeClassName\n})`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: left;\n border-radius: 3rem;\n outline: none;\n cursor: pointer;\n text-decoration: none;\n color: ${({ theme }) => theme.text2};\n font-size: 1rem;\n width: fit-content;\n margin: 0 12px;\n font-weight: 500;\n\n &.${activeClassName} {\n border-radius: 12px;\n font-weight: 600;\n color: ${({ theme }) => theme.text1};\n }\n\n :hover,\n :focus {\n color: ${({ theme }) => darken(0.1, theme.text1)};\n }\n`\n\nconst StyledExternalLink = styled(ExternalLink).attrs({\n activeClassName\n})<{ isActive?: boolean; smallHide?: boolean }>`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: left;\n border-radius: 3rem;\n outline: none;\n cursor: pointer;\n text-decoration: none;\n color: ${({ theme }) => theme.text2};\n font-size: 1rem;\n width: fit-content;\n margin: 0 12px;\n font-weight: 500;\n\n &.${activeClassName} {\n border-radius: 12px;\n font-weight: 600;\n color: ${({ theme }) => theme.text1};\n }\n\n :hover,\n :focus {\n color: ${({ theme }) => darken(0.1, theme.text1)};\n }\n\n ${({ theme, smallHide }) => theme.mediaWidth.upToExtraSmall`\n display: ${smallHide ? 'none' : 'block'};\n `}\n`\n\nexport const StyledMenuButton = styled.button`\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n background-color: transparent;\n margin: 0;\n padding: 0;\n height: 35px;\n background-color: ${({ theme }) => theme.bg3};\n margin-left: 8px;\n padding: 0.15rem 0.5rem;\n border-radius: 0.5rem;\n\n :hover,\n :focus {\n cursor: pointer;\n outline: none;\n background-color: ${({ theme }) => theme.bg4};\n }\n\n svg {\n margin-top: 2px;\n }\n > * {\n stroke: ${({ theme }) => theme.text1};\n }\n`\n\nconst NETWORK_LABELS: { [chainId in ChainId]?: string } = {\n [ChainId.RINKEBY]: 'Rinkeby',\n [ChainId.ROPSTEN]: 'Ropsten',\n [ChainId.GÖRLI]: 'Görli',\n [ChainId.KOVAN]: 'Kovan'\n}\n\nexport default function Header() {\n const { account, chainId } = useActiveWeb3React()\n const { t } = useTranslation()\n\n const userEthBalance = useETHBalances(account ? [account] : [])?.[account ?? '']\n // const [isDark] = useDarkModeManager()\n const [darkMode, toggleDarkMode] = useDarkModeManager()\n\n const toggleClaimModal = useToggleSelfClaimModal()\n\n const availableClaim: boolean = useUserHasAvailableClaim(account)\n\n const { claimTxn } = useUserHasSubmittedClaim(account ?? undefined)\n\n // const aggregateBalance: TokenAmount | undefined = useAggregateUniBalance()\n\n const [showUniBalanceModal, setShowUniBalanceModal] = useState(false)\n const showClaimPopup = useShowClaimPopup()\n\n // const countUpValue = aggregateBalance?.toFixed(0) ?? '0'\n // const countUpValuePrevious = usePrevious(countUpValue) ?? '0'\n\n return (\n \n \n setShowUniBalanceModal(false)}>\n \n \n \n \n <UniIcon>\n <img width={'24px'} src={darkMode ? LogoDark : Logo} alt=\"logo\" />\n </UniIcon>\n \n \n \n Boolean(match) ||\n pathname.startsWith('/add') ||\n pathname.startsWith('/remove') ||\n pathname.startsWith('/create') ||\n pathname.startsWith('/find')\n }\n >\n {t('pool')}\n \n \n {t('flashLoan')}\n \n \n {t('lending')}\n \n \n DEER\n \n \n Vote\n \n \n Charts \n \n \n \n \n \n \n {chainId && NETWORK_LABELS[chainId] && (\n {NETWORK_LABELS[chainId]}\n )}\n \n {availableClaim && !showClaimPopup && (\n \n \n \n {claimTxn && !claimTxn?.receipt ? Claiming UNI : 'Claim UNI'}\n \n \n \n \n )}\n {/* \n {!availableClaim && aggregateBalance && (\n setShowUniBalanceModal(true)}>\n \n {account && (\n \n \n \n \n \n )}\n UNI\n \n \n \n )}\n */}\n \n {account && userEthBalance ? (\n \n {userEthBalance?.toSignificant(4)} ETH\n \n ) : null}\n \n \n \n \n toggleDarkMode()}>\n {darkMode ? : }\n \n \n \n \n \n )\n}\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.deerfi.com\n
\n \n
\n ) : window.location.hostname === 'app.deerfi.com' ? (\n \n
\n Always make sure the URL is\n app.deerfi.com - bookmark it to\n be safe.\n
\n \n
\n ) : null\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 } from '@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 } from '../Row'\nimport { AlertTriangle, ArrowUpCircle } from 'react-feather'\nimport { ButtonPrimary } from '../Button'\nimport { AutoColumn, ColumnCenter } from '../Column'\nimport Circle from '../../assets/images/blue-loader.svg'\n\nimport { getEtherscanLink } from '../../utils'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useTranslation } from 'react-i18next'\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\nfunction ConfirmationPendingContent({ onDismiss, pendingText }: { onDismiss: () => void; pendingText: string }) {\n const { t } = useTranslation()\n\n return (\n \n
\n \n
\n \n \n \n \n \n \n \n {t('waitingConfirmation')}\n \n \n \n {pendingText}\n \n \n \n {t('confirmTransaction')}\n \n \n
\n
\n )\n}\n\nfunction TransactionSubmittedContent({\n onDismiss,\n chainId,\n hash\n}: {\n onDismiss: () => void\n hash: string | undefined\n chainId: ChainId\n}) {\n const theme = useContext(ThemeContext)\n const { t } = useTranslation()\n\n return (\n \n
\n \n
\n \n \n \n \n \n \n \n {t('transactionSubmitted')}\n \n {chainId && hash && (\n \n \n {t('viewOnEtherscan')}\n \n \n )}\n \n \n {t('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 const { t } = useTranslation()\n\n return (\n \n
\n \n \n {t('error')}\n \n \n \n \n \n \n {message}\n \n \n
\n \n {t('dismissLowercase')}\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}\n\nexport default function TransactionConfirmationModal({\n isOpen,\n onDismiss,\n attemptingTxn,\n hash,\n pendingText,\n content\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 { 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'\nimport { transparentize } from 'polished'\nimport React, { useCallback, useState } from 'react'\nimport { usePopper } from 'react-popper'\nimport styled from 'styled-components'\nimport useInterval from '../../hooks/useInterval'\nimport Portal from '@reach/portal'\n\nconst PopoverContainer = styled.div<{ show: boolean }>`\n z-index: 9999;\n\n visibility: ${props => (props.show ? 'visible' : 'hidden')};\n opacity: ${props => (props.show ? 1 : 0)};\n transition: visibility 150ms linear, opacity 150ms linear;\n\n background: ${({ theme }) => theme.bg2};\n border: 1px solid ${({ theme }) => theme.bg3};\n box-shadow: 0 4px 8px 0 ${({ theme }) => transparentize(0.9, theme.shadow1)};\n color: ${({ theme }) => theme.text2};\n border-radius: 8px;\n`\n\nconst ReferenceElement = styled.div`\n display: inline-block;\n`\n\nconst Arrow = styled.div`\n width: 8px;\n height: 8px;\n z-index: 9998;\n\n ::before {\n position: absolute;\n width: 8px;\n height: 8px;\n z-index: 9998;\n\n content: '';\n border: 1px solid ${({ theme }) => theme.bg3};\n transform: rotate(45deg);\n background: ${({ theme }) => theme.bg2};\n }\n\n &.arrow-top {\n bottom: -5px;\n ::before {\n border-top: none;\n border-left: none;\n }\n }\n\n &.arrow-bottom {\n top: -5px;\n ::before {\n border-bottom: none;\n border-right: none;\n }\n }\n\n &.arrow-left {\n right: -5px;\n\n ::before {\n border-bottom: none;\n border-left: none;\n }\n }\n\n &.arrow-right {\n left: -5px;\n ::before {\n border-right: none;\n border-top: none;\n }\n }\n`\n\nexport interface PopoverProps {\n content: React.ReactNode\n show: boolean\n children: React.ReactNode\n placement?: Placement\n}\n\nexport default function Popover({ content, show, children, placement = 'auto' }: PopoverProps) {\n const [referenceElement, setReferenceElement] = useState(null)\n const [popperElement, setPopperElement] = useState(null)\n const [arrowElement, setArrowElement] = useState(null)\n const { styles, update, attributes } = usePopper(referenceElement, popperElement, {\n placement,\n strategy: 'fixed',\n modifiers: [\n { name: 'offset', options: { offset: [8, 8] } },\n { name: 'arrow', options: { element: arrowElement } }\n ]\n })\n const updateCallback = useCallback(() => {\n update && update()\n }, [update])\n useInterval(updateCallback, show ? 100 : null)\n\n return (\n <>\n {children}\n \n \n {content}\n \n \n \n \n )\n}\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'\nimport { HelpCircle as Question } from 'react-feather'\nimport styled from 'styled-components'\nimport Tooltip from '../Tooltip'\n\nconst QuestionWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.2rem;\n border: none;\n background: none;\n outline: none;\n cursor: default;\n border-radius: 36px;\n background-color: ${({ theme }) => theme.bg2};\n color: ${({ theme }) => theme.text2};\n\n :hover,\n :focus {\n opacity: 0.7;\n }\n`\n\nconst LightQuestionWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.2rem;\n border: none;\n background: none;\n outline: none;\n cursor: default;\n border-radius: 36px;\n width: 24px;\n height: 24px;\n background-color: rgba(255, 255, 255, 0.1);\n color: ${({ theme }) => theme.white};\n\n :hover,\n :focus {\n opacity: 0.7;\n }\n`\n\nconst QuestionMark = styled.span`\n font-size: 1rem;\n`\n\nexport default function QuestionHelper({ text }: { text: string }) {\n const [show, setShow] = useState(false)\n\n const open = useCallback(() => setShow(true), [setShow])\n const close = useCallback(() => setShow(false), [setShow])\n\n return (\n \n \n \n \n \n \n \n )\n}\n\nexport function LightQuestionHelper({ text }: { text: string }) {\n const [show, setShow] = useState(false)\n\n const open = useCallback(() => setShow(true), [setShow])\n const close = useCallback(() => setShow(false), [setShow])\n\n return (\n \n \n \n ?\n \n \n \n )\n}\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, Token } from '@uniswap/sdk'\nimport React, { useMemo } from 'react'\nimport styled from 'styled-components'\n\nimport EthereumLogo from '../../assets/images/ethereum-logo.png'\nimport useHttpLocations from '../../hooks/useHttpLocations'\nimport { WrappedTokenInfo } from '../../state/lists/hooks'\nimport Logo from '../Logo'\n\nconst getTokenLogoURL = (address: string) =>\n `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/${address}/logo.png`\n\nconst StyledEthereumLogo = styled.img<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n box-shadow: 0px 6px 10px rgba(0, 0, 0, 0.075);\n border-radius: 24px;\n`\n\nconst StyledLogo = styled(Logo)<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n border-radius: ${({ size }) => size};\n box-shadow: 0px 6px 10px rgba(0, 0, 0, 0.075);\n background-color: ${({ theme }) => theme.white};\n`\n\nexport default function CurrencyLogo({\n currency,\n size = '24px',\n style\n}: {\n currency?: Currency\n size?: string\n style?: React.CSSProperties\n}) {\n const uriLocations = useHttpLocations(currency instanceof WrappedTokenInfo ? currency.logoURI : undefined)\n\n const srcs: string[] = useMemo(() => {\n if (currency === ETHER) return []\n\n if (currency instanceof Token) {\n if (currency instanceof WrappedTokenInfo) {\n return [...uriLocations, getTokenLogoURL(currency.address)]\n }\n\n return [getTokenLogoURL(currency.address)]\n }\n return []\n }, [currency, uriLocations])\n\n if (currency === ETHER) {\n return \n }\n\n return \n}\n","import React from 'react'\nimport { Text } from 'rebass'\nimport { ChainId, Currency, currencyEquals, ETHER, Token } from '@uniswap/sdk'\nimport styled from 'styled-components'\n\nimport { SUGGESTED_BASES } from '../../constants'\nimport { AutoColumn } from '../Column'\nimport QuestionHelper from '../QuestionHelper'\nimport { AutoRow } from '../Row'\nimport CurrencyLogo from '../CurrencyLogo'\n\nconst BaseWrapper = styled.div<{ disable?: boolean }>`\n border: 1px solid ${({ theme, disable }) => (disable ? 'transparent' : theme.bg3)};\n border-radius: 10px;\n display: flex;\n padding: 6px;\n\n align-items: center;\n :hover {\n cursor: ${({ disable }) => !disable && 'pointer'};\n background-color: ${({ theme, disable }) => !disable && theme.bg2};\n }\n\n background-color: ${({ theme, disable }) => disable && theme.bg3};\n opacity: ${({ disable }) => disable && '0.4'};\n`\n\nexport default function CommonBases({\n chainId,\n onSelect,\n selectedCurrency\n}: {\n chainId?: ChainId\n selectedCurrency?: Currency | null\n onSelect: (currency: Currency) => void\n}) {\n return (\n \n \n \n Common bases\n \n \n \n \n {\n if (!selectedCurrency || !currencyEquals(selectedCurrency, ETHER)) {\n onSelect(ETHER)\n }\n }}\n disable={selectedCurrency === ETHER}\n >\n \n \n ETH\n \n \n {(chainId ? SUGGESTED_BASES[chainId] : []).map((token: Token) => {\n const selected = selectedCurrency instanceof Token && selectedCurrency.address === token.address\n return (\n !selected && onSelect(token)} disable={selected} key={token.address}>\n \n \n {token.symbol}\n \n \n )\n })}\n \n \n )\n}\n","import styled from 'styled-components'\nimport { AutoColumn } from '../Column'\nimport { RowBetween, RowFixed } from '../Row'\n\nexport const ModalInfo = styled.div`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n padding: 1rem 1rem;\n margin: 0.25rem 0.5rem;\n justify-content: center;\n flex: 1;\n user-select: none;\n`\nexport const StyledMenu = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n border: none;\n`\n\nexport const 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 top: 80px;\n`\n\nexport const TextDot = styled.div`\n height: 3px;\n width: 3px;\n background-color: ${({ theme }) => theme.text2};\n border-radius: 50%;\n`\n\nexport const FadedSpan = styled(RowFixed)`\n color: ${({ theme }) => theme.primary1};\n font-size: 14px;\n`\nexport const Checkbox = styled.input`\n border: 1px solid ${({ theme }) => theme.red3};\n height: 20px;\n margin: 0;\n`\n\nexport const PaddedColumn = styled(AutoColumn)`\n padding: 20px;\n`\n\nexport const MenuItem = styled(RowBetween)`\n padding: 4px 20px;\n height: 56px;\n display: grid;\n grid-template-columns: auto minmax(auto, 1fr) auto minmax(0, 72px);\n grid-gap: 16px;\n cursor: ${({ disabled }) => !disabled && 'pointer'};\n pointer-events: ${({ disabled }) => disabled && 'none'};\n :hover {\n background-color: ${({ theme, disabled }) => !disabled && theme.bg2};\n }\n opacity: ${({ disabled, selected }) => (disabled || selected ? 0.5 : 1)};\n`\n\nexport const SearchInput = styled.input`\n position: relative;\n display: flex;\n padding: 16px;\n align-items: center;\n width: 100%;\n white-space: nowrap;\n background: none;\n border: none;\n outline: none;\n border-radius: 20px;\n color: ${({ theme }) => theme.text1};\n border-style: solid;\n border: 1px solid ${({ theme }) => theme.bg3};\n -webkit-appearance: none;\n\n font-size: 18px;\n\n ::placeholder {\n color: ${({ theme }) => theme.text3};\n }\n transition: border 100ms;\n :focus {\n border: 1px solid ${({ theme }) => theme.primary1};\n outline: none;\n }\n`\nexport const Separator = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.bg2};\n`\n\nexport const SeparatorDark = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.bg3};\n`\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 '@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 useTheme from 'hooks/useTheme'\nimport { ButtonPrimary } from 'components/Button'\nimport styled from 'styled-components'\nimport { useIsUserAddedToken, useIsTokenActive } from 'hooks/Tokens'\nimport { CheckCircle } from 'react-feather'\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.6' : '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}\n","import { Currency, CurrencyAmount, currencyEquals, ETHER, Token } from '@uniswap/sdk'\nimport React, { CSSProperties, MutableRefObject, useCallback, useMemo } from 'react'\nimport { FixedSizeList } from 'react-window'\nimport { Text } from 'rebass'\nimport styled from 'styled-components'\nimport { useActiveWeb3React } from '../../hooks'\nimport { WrappedTokenInfo, useCombinedActiveList } from '../../state/lists/hooks'\nimport { useCurrencyBalance } from '../../state/wallet/hooks'\nimport { TYPE } from '../../theme'\nimport { useIsUserAddedToken, useAllInactiveTokens } from '../../hooks/Tokens'\nimport Column from '../Column'\nimport { RowFixed } from '../Row'\nimport CurrencyLogo from '../CurrencyLogo'\nimport { MouseoverTooltip } from '../Tooltip'\nimport { MenuItem } from './styleds'\nimport Loader from '../Loader'\nimport { isTokenOnList } from '../../utils'\nimport ImportRow from './ImportRow'\nimport { wrappedCurrency } from 'utils/wrappedCurrency'\n\nfunction currencyKey(currency: Currency): string {\n return currency instanceof Token ? currency.address : currency === ETHER ? 'ETHER' : ''\n}\n\nconst StyledBalanceText = styled(Text)`\n white-space: nowrap;\n overflow: hidden;\n max-width: 5rem;\n text-overflow: ellipsis;\n`\n\nconst Tag = styled.div`\n background-color: ${({ theme }) => theme.bg3};\n color: ${({ theme }) => theme.text2};\n font-size: 14px;\n border-radius: 4px;\n padding: 0.25rem 0.3rem 0.25rem 0.3rem;\n max-width: 6rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n justify-self: flex-end;\n margin-right: 4px;\n`\n\nfunction Balance({ balance }: { balance: CurrencyAmount }) {\n return {balance.toSignificant(4)}\n}\n\nconst TagContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n`\n\nfunction TokenTags({ currency }: { currency: Currency }) {\n if (!(currency instanceof WrappedTokenInfo)) {\n return \n }\n\n const tags = currency.tags\n if (!tags || tags.length === 0) return \n\n const tag = tags[0]\n\n return (\n \n \n {tag.name}\n \n {tags.length > 1 ? (\n `${name}: ${description}`)\n .join('; \\n')}\n >\n ...\n \n ) : null}\n \n )\n}\n\nfunction CurrencyRow({\n currency,\n onSelect,\n isSelected,\n otherSelected,\n style\n}: {\n currency: Currency\n onSelect: () => void\n isSelected: boolean\n otherSelected: boolean\n style: CSSProperties\n}) {\n const { account } = useActiveWeb3React()\n const key = currencyKey(currency)\n const selectedTokenList = useCombinedActiveList()\n const isOnSelectedList = isTokenOnList(selectedTokenList, currency)\n const customAdded = useIsUserAddedToken(currency)\n const balance = useCurrencyBalance(account ?? undefined, currency)\n\n // only show add or remove buttons if not on selected list\n return (\n (isSelected ? null : onSelect())}\n disabled={isSelected}\n selected={otherSelected}\n >\n \n \n \n {currency.symbol}\n \n \n {currency.name} {!isOnSelectedList && customAdded && '• Added by user'}\n \n \n \n \n {balance ? : account ? : null}\n \n \n )\n}\n\nexport default function CurrencyList({\n height,\n currencies,\n selectedCurrency,\n onCurrencySelect,\n otherCurrency,\n fixedListRef,\n showETH,\n showImportView,\n setImportToken\n}: {\n height: number\n currencies: Currency[]\n selectedCurrency?: Currency | null\n onCurrencySelect: (currency: Currency) => void\n otherCurrency?: Currency | null\n fixedListRef?: MutableRefObject\n showETH: boolean\n showImportView: () => void\n setImportToken: (token: Token) => void\n}) {\n const itemData = useMemo(() => (showETH ? [Currency.ETHER, ...currencies] : currencies), [currencies, showETH])\n\n const { chainId } = useActiveWeb3React()\n\n const inactiveTokens: {\n [address: string]: Token\n } = useAllInactiveTokens()\n\n const Row = useCallback(\n ({ data, index, style }) => {\n const currency: Currency = data[index]\n const isSelected = Boolean(selectedCurrency && currencyEquals(selectedCurrency, currency))\n const otherSelected = Boolean(otherCurrency && currencyEquals(otherCurrency, currency))\n const handleSelect = () => onCurrencySelect(currency)\n\n const token = wrappedCurrency(currency, chainId)\n\n const showImport = inactiveTokens && token && Object.keys(inactiveTokens).includes(token.address)\n\n if (showImport && token) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n },\n [chainId, inactiveTokens, onCurrencySelect, otherCurrency, selectedCurrency, setImportToken, showImportView]\n )\n\n const itemKey = useCallback((index: number, data: any) => currencyKey(data[index]), [])\n\n return (\n \n {Row}\n \n )\n}\n","import { Token, TokenAmount } from '@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 '@uniswap/sdk'\nimport React, { KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport ReactGA from 'react-ga'\nimport { useTranslation } from 'react-i18next'\nimport { FixedSizeList } from 'react-window'\nimport { Text } from 'rebass'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAllTokens, useToken, useIsUserAddedToken, useFoundOnInactiveList } from '../../hooks/Tokens'\nimport { CloseIcon, TYPE, ButtonText, IconWrapper } from '../../theme'\nimport { isAddress } from '../../utils'\nimport Column from '../Column'\nimport Row, { RowBetween, RowFixed } from '../Row'\nimport CommonBases from './CommonBases'\nimport CurrencyList from './CurrencyList'\nimport { filterTokens } from './filtering'\nimport { useTokenComparator } from './sorting'\nimport { PaddedColumn, SearchInput, Separator } from './styleds'\nimport AutoSizer from 'react-virtualized-auto-sizer'\nimport styled from 'styled-components'\nimport useToggle from 'hooks/useToggle'\nimport { useOnClickOutside } from 'hooks/useOnClickOutside'\nimport useTheme from 'hooks/useTheme'\nimport ImportRow from './ImportRow'\nimport { Edit } from 'react-feather'\nimport { ButtonLight } from 'components/Button'\n\nconst ContentWrapper = styled(Column)`\n width: 100%;\n flex: 1 1;\n position: relative;\n`\n\nconst Footer = styled.div`\n width: 100%;\n border-radius: 20px;\n padding: 20px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n background-color: ${({ theme }) => theme.bg1};\n border-top: 1px solid ${({ theme }) => theme.bg2};\n`\n\ninterface CurrencySearchProps {\n isOpen: boolean\n onDismiss: () => void\n selectedCurrency?: Currency | null\n onCurrencySelect: (currency: Currency) => void\n otherSelectedCurrency?: Currency | null\n showCommonBases?: boolean\n showManageView: () => void\n showImportView: () => void\n setImportToken: (token: Token) => void\n}\n\nexport function CurrencySearch({\n selectedCurrency,\n onCurrencySelect,\n otherSelectedCurrency,\n showCommonBases,\n onDismiss,\n isOpen,\n showManageView,\n showImportView,\n setImportToken\n}: CurrencySearchProps) {\n const { t } = useTranslation()\n const { chainId } = useActiveWeb3React()\n const theme = useTheme()\n\n // refs for fixed size lists\n const fixedList = useRef()\n\n const [searchQuery, setSearchQuery] = useState('')\n const [invertSearchOrder] = useState(false)\n\n const allTokens = useAllTokens()\n // const inactiveTokens: Token[] | undefined = useFoundOnInactiveList(searchQuery)\n\n // if they input an address, use it\n const isAddressSearch = isAddress(searchQuery)\n const searchToken = useToken(searchQuery)\n const searchTokenIsAdded = useIsUserAddedToken(searchToken)\n\n useEffect(() => {\n if (isAddressSearch) {\n ReactGA.event({\n category: 'Currency Select',\n action: 'Search by address',\n label: isAddressSearch\n })\n }\n }, [isAddressSearch])\n\n const showETH: boolean = useMemo(() => {\n const s = searchQuery.toLowerCase().trim()\n return s === '' || s === 'e' || s === 'et' || s === 'eth'\n }, [searchQuery])\n\n const tokenComparator = useTokenComparator(invertSearchOrder)\n\n const filteredTokens: Token[] = useMemo(() => {\n return filterTokens(Object.values(allTokens), searchQuery)\n }, [allTokens, searchQuery])\n\n const filteredSortedTokens: Token[] = useMemo(() => {\n const sorted = filteredTokens.sort(tokenComparator)\n const symbolMatch = searchQuery\n .toLowerCase()\n .split(/\\s+/)\n .filter(s => s.length > 0)\n\n if (symbolMatch.length > 1) {\n return sorted\n }\n\n return [\n // sort any exact symbol matches first\n ...sorted.filter(token => token.symbol?.toLowerCase() === symbolMatch[0]),\n\n // sort by tokens whos symbols start with search substrng\n ...sorted.filter(\n token =>\n token.symbol?.toLowerCase().startsWith(searchQuery.toLowerCase().trim()) &&\n token.symbol?.toLowerCase() !== symbolMatch[0]\n ),\n\n // rest that dont match upove\n ...sorted.filter(\n token =>\n !token.symbol?.toLowerCase().startsWith(searchQuery.toLowerCase().trim()) &&\n token.symbol?.toLowerCase() !== symbolMatch[0]\n )\n ]\n }, [filteredTokens, searchQuery, tokenComparator])\n\n const handleCurrencySelect = useCallback(\n (currency: Currency) => {\n onCurrencySelect(currency)\n onDismiss()\n },\n [onDismiss, onCurrencySelect]\n )\n\n // clear the input on open\n useEffect(() => {\n if (isOpen) setSearchQuery('')\n }, [isOpen])\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 fixedList.current?.scrollTo(0)\n }, [])\n\n const handleEnter = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n const s = searchQuery.toLowerCase().trim()\n if (s === 'eth') {\n handleCurrencySelect(ETHER)\n } else if (filteredSortedTokens.length > 0) {\n if (\n filteredSortedTokens[0].symbol?.toLowerCase() === searchQuery.trim().toLowerCase() ||\n filteredSortedTokens.length === 1\n ) {\n handleCurrencySelect(filteredSortedTokens[0])\n }\n }\n }\n },\n [filteredSortedTokens, handleCurrencySelect, searchQuery]\n )\n\n // menu ui\n const [open, toggle] = useToggle(false)\n const node = useRef()\n useOnClickOutside(node, open ? toggle : undefined)\n\n // if no results on main list, show option to expand into inactive\n const [showExpanded, setShowExpanded] = useState(false)\n const inactiveTokens = useFoundOnInactiveList(searchQuery)\n\n // reset expanded results on query reset\n useEffect(() => {\n if (searchQuery === '') {\n setShowExpanded(false)\n }\n }, [setShowExpanded, searchQuery])\n\n return (\n \n \n \n \n Select a token\n \n \n \n \n }\n onChange={handleInput}\n onKeyDown={handleEnter}\n />\n \n {showCommonBases && (\n \n )}\n \n \n {searchToken && !searchTokenIsAdded ? (\n \n \n \n ) : filteredSortedTokens?.length > 0 || (showExpanded && inactiveTokens && inactiveTokens.length > 0) ? (\n
\n \n {({ height }) => (\n \n )}\n \n
\n ) : (\n \n \n No results found in active lists.\n \n {inactiveTokens &&\n inactiveTokens.length > 0 &&\n !(searchToken && !searchTokenIsAdded) &&\n searchQuery.length > 1 &&\n filteredSortedTokens?.length === 0 && (\n // expand button in line with no results\n \n setShowExpanded(!showExpanded)}\n >\n {!showExpanded\n ? `Show ${inactiveTokens.length} more inactive ${inactiveTokens.length === 1 ? 'token' : 'tokens'}`\n : 'Hide expanded search'}\n \n \n )}\n \n )}\n\n {inactiveTokens &&\n inactiveTokens.length > 0 &&\n !(searchToken && !searchTokenIsAdded) &&\n (searchQuery.length > 1 || showExpanded) &&\n (filteredSortedTokens?.length !== 0 || showExpanded) && (\n // button fixed to bottom\n \n setShowExpanded(!showExpanded)}\n >\n {!showExpanded\n ? `Show ${inactiveTokens.length} more inactive ${inactiveTokens.length === 1 ? 'token' : 'tokens'}`\n : 'Hide expanded search'}\n \n \n )}\n
\n \n \n \n \n \n \n Manage\n \n \n \n
\n
\n )\n}\n","import React, { useState } from 'react'\nimport { Token, Currency } from '@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 useTheme from 'hooks/useTheme'\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'\n\nconst Wrapper = styled.div`\n position: relative;\n width: 100%;\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 Unkown 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 { ActionCreatorWithPayload, createAction } from '@reduxjs/toolkit'\nimport { TokenList, Version } from '@uniswap/token-lists'\n\nexport const fetchTokenList: Readonly<{\n pending: ActionCreatorWithPayload<{ url: string; requestId: string }>\n fulfilled: ActionCreatorWithPayload<{ url: string; tokenList: TokenList; requestId: string }>\n rejected: ActionCreatorWithPayload<{ url: string; errorMessage: string; requestId: string }>\n}> = {\n pending: createAction('lists/fetchTokenList/pending'),\n fulfilled: createAction('lists/fetchTokenList/fulfilled'),\n rejected: createAction('lists/fetchTokenList/rejected')\n}\n// add and remove from list options\nexport const addList = createAction('lists/addList')\nexport const removeList = createAction('lists/removeList')\n\n// select which lists to search across from loaded lists\nexport const enableList = createAction('lists/enableList')\nexport const disableList = createAction('lists/disableList')\n\n// versioning\nexport const acceptListUpdate = createAction('lists/acceptListUpdate')\nexport const rejectVersionUpdate = createAction('lists/rejectVersionUpdate')\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'\nimport { ChainId } from '@uniswap/sdk'\nimport { TokenList } from '@uniswap/token-lists'\nimport { useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { getNetworkLibrary, NETWORK_CHAIN_ID } from '../connectors'\nimport { AppDispatch } from '../state'\nimport { fetchTokenList } from '../state/lists/actions'\nimport getTokenList from '../utils/getTokenList'\nimport resolveENSContentHash from '../utils/resolveENSContentHash'\nimport { useActiveWeb3React } from './index'\n\nexport function useFetchListCallback(): (listUrl: string, sendDispatch?: boolean) => Promise {\n const { chainId, library } = useActiveWeb3React()\n const dispatch = useDispatch()\n\n const ensResolver = useCallback(\n (ensName: string) => {\n if (!library || chainId !== ChainId.MAINNET) {\n if (NETWORK_CHAIN_ID === ChainId.MAINNET) {\n const networkLibrary = getNetworkLibrary()\n if (networkLibrary) {\n return resolveENSContentHash(ensName, networkLibrary)\n }\n }\n throw new Error('Could not construct mainnet ENS resolver')\n }\n return resolveENSContentHash(ensName, library)\n },\n [chainId, library]\n )\n\n // note: prevent dispatch if using for list search or unsupported list\n return useCallback(\n async (listUrl: string, sendDispatch = true) => {\n const requestId = nanoid()\n sendDispatch && dispatch(fetchTokenList.pending({ requestId, url: listUrl }))\n return getTokenList(listUrl, ensResolver)\n .then(tokenList => {\n sendDispatch && dispatch(fetchTokenList.fulfilled({ url: listUrl, tokenList, requestId }))\n return tokenList\n })\n .catch(error => {\n console.debug(`Failed to get list at url ${listUrl}`, error)\n sendDispatch && dispatch(fetchTokenList.rejected({ url: listUrl, requestId, errorMessage: error.message }))\n throw error\n })\n },\n [dispatch, ensResolver]\n )\n}\n","import { useState, useLayoutEffect } from 'react'\nimport { shade } from 'polished'\nimport Vibrant from 'node-vibrant'\nimport { hex } from 'wcag-contrast'\nimport { Token, ChainId } from '@uniswap/sdk'\nimport uriToHttp from 'utils/uriToHttp'\n\nasync function getColorFromToken(token: Token): Promise {\n if (token.chainId === ChainId.RINKEBY && token.address === '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735') {\n return Promise.resolve('#FAAB14')\n }\n\n const path = `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/${token.address}/logo.png`\n\n return Vibrant.from(path)\n .getPalette()\n .then(palette => {\n if (palette?.Vibrant) {\n let detectedHex = palette.Vibrant.hex\n let AAscore = hex(detectedHex, '#FFF')\n while (AAscore < 3) {\n detectedHex = shade(0.005, detectedHex)\n AAscore = hex(detectedHex, '#FFF')\n }\n return detectedHex\n }\n return null\n })\n .catch(() => null)\n}\n\nasync function getColorFromUriPath(uri: string): Promise {\n const formattedPath = uriToHttp(uri)[0]\n\n return Vibrant.from(formattedPath)\n .getPalette()\n .then(palette => {\n if (palette?.Vibrant) {\n return palette.Vibrant.hex\n }\n return null\n })\n .catch(() => null)\n}\n\nexport function useColor(token?: Token) {\n const [color, setColor] = useState('#2172E5')\n\n useLayoutEffect(() => {\n let stale = false\n\n if (token) {\n getColorFromToken(token).then(tokenColor => {\n if (!stale && tokenColor !== null) {\n setColor(tokenColor)\n }\n })\n }\n\n return () => {\n stale = true\n setColor('#2172E5')\n }\n }, [token])\n\n return color\n}\n\nexport function useListColor(listImageUri?: string) {\n const [color, setColor] = useState('#2172E5')\n\n useLayoutEffect(() => {\n let stale = false\n\n if (listImageUri) {\n getColorFromUriPath(listImageUri).then(color => {\n if (!stale && color !== null) {\n setColor(color)\n }\n })\n }\n\n return () => {\n stale = true\n setColor('#2172E5')\n }\n }, [listImageUri])\n\n return color\n}\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'\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 useTheme from '../../hooks/useTheme'\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 { 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 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 '@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 '@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 useTheme from 'hooks/useTheme'\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'\n\nconst Wrapper = styled.div`\n position: relative;\n width: 100%;\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 '@uniswap/sdk'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport useLast from '../../hooks/useLast'\nimport Modal from '../Modal'\nimport { CurrencySearch } from './CurrencySearch'\nimport { ImportToken } from './ImportToken'\nimport usePrevious from 'hooks/usePrevious'\nimport Manage from './Manage'\nimport { TokenList } from '@uniswap/token-lists'\nimport { ImportList } from './ImportList'\n\ninterface CurrencySearchModalProps {\n isOpen: boolean\n onDismiss: () => void\n selectedCurrency?: Currency | null\n onCurrencySelect: (currency: Currency) => void\n otherSelectedCurrency?: Currency | null\n showCommonBases?: boolean\n}\n\nexport enum CurrencyModalView {\n search,\n manage,\n importToken,\n importList\n}\n\nexport default function CurrencySearchModal({\n isOpen,\n onDismiss,\n onCurrencySelect,\n selectedCurrency,\n otherSelectedCurrency,\n showCommonBases = false\n}: CurrencySearchModalProps) {\n const [modalView, setModalView] = useState(CurrencyModalView.manage)\n const lastOpen = useLast(isOpen)\n\n useEffect(() => {\n if (isOpen && !lastOpen) {\n setModalView(CurrencyModalView.search)\n }\n }, [isOpen, lastOpen])\n\n const handleCurrencySelect = useCallback(\n (currency: Currency) => {\n onCurrencySelect(currency)\n onDismiss()\n },\n [onDismiss, onCurrencySelect]\n )\n\n // for token import view\n const prevView = usePrevious(modalView)\n\n // used for import token flow\n const [importToken, setImportToken] = useState()\n\n // used for import list\n const [importList, setImportList] = useState()\n const [listURL, setListUrl] = useState()\n\n // change min height if not searching\n const minHeight = modalView === CurrencyModalView.importToken || modalView === CurrencyModalView.importList ? 40 : 80\n\n return (\n \n {modalView === CurrencyModalView.search ? (\n setModalView(CurrencyModalView.importToken)}\n setImportToken={setImportToken}\n showManageView={() => setModalView(CurrencyModalView.manage)}\n />\n ) : modalView === CurrencyModalView.importToken && importToken ? (\n \n setModalView(prevView && prevView !== CurrencyModalView.importToken ? prevView : CurrencyModalView.search)\n }\n handleCurrencySelect={handleCurrencySelect}\n />\n ) : modalView === CurrencyModalView.importList && importList && listURL ? (\n \n ) : modalView === CurrencyModalView.manage ? (\n \n ) : (\n ''\n )}\n \n )\n}\n","import { Currency } from '@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 '@uniswap/sdk'\nimport React, { useState, useCallback } from 'react'\nimport styled from 'styled-components'\nimport { darken } from 'polished'\nimport { useCurrencyBalance } from '../../state/wallet/hooks'\nimport CurrencySearchModal from '../SearchModal/CurrencySearchModal'\nimport CurrencyLogo from '../CurrencyLogo'\nimport DoubleCurrencyLogo from '../DoubleLogo'\nimport { RowBetween } from '../Row'\nimport { TYPE } from '../../theme'\nimport { Input as NumericalInput } from '../NumericalInput'\nimport { ReactComponent as DropDown } from '../../assets/images/dropdown.svg'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { useTranslation } from 'react-i18next'\nimport useTheme from '../../hooks/useTheme'\nimport { Pool } from 'data/Pool'\n\nconst InputRow = styled.div<{ selected: boolean }>`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n padding: ${({ selected }) => (selected ? '0.75rem 0.5rem 0.75rem 1rem' : '0.75rem 0.75rem 0.75rem 1rem')};\n`\n\nconst CurrencySelect = styled.button<{ selected: boolean }>`\n align-items: center;\n height: 2.2rem;\n font-size: 20px;\n font-weight: 500;\n background-color: ${({ selected, theme }) => (selected ? theme.bg1 : theme.primary1)};\n color: ${({ selected, theme }) => (selected ? theme.text1 : theme.white)};\n border-radius: 12px;\n box-shadow: ${({ selected }) => (selected ? 'none' : '0px 6px 10px rgba(0, 0, 0, 0.075)')};\n outline: none;\n cursor: pointer;\n user-select: none;\n border: none;\n padding: 0 0.5rem;\n\n :focus,\n :hover {\n background-color: ${({ selected, theme }) => (selected ? theme.bg2 : darken(0.05, theme.primary1))};\n }\n`\n\nconst LabelRow = styled.div`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n color: ${({ theme }) => theme.text1};\n font-size: 0.75rem;\n line-height: 1rem;\n padding: 0.75rem 1rem 0 1rem;\n span:hover {\n cursor: pointer;\n color: ${({ theme }) => darken(0.2, theme.text2)};\n }\n`\n\nconst Aligner = styled.span`\n display: flex;\n align-items: center;\n justify-content: space-between;\n`\n\nconst StyledDropDown = styled(DropDown)<{ selected: boolean }>`\n margin: 0 0.25rem 0 0.5rem;\n height: 35%;\n\n path {\n stroke: ${({ selected, theme }) => (selected ? theme.text1 : theme.white)};\n stroke-width: 1.5px;\n }\n`\n\nconst InputPanel = styled.div<{ hideInput?: boolean }>`\n ${({ theme }) => theme.flexColumnNoWrap}\n position: relative;\n border-radius: ${({ hideInput }) => (hideInput ? '8px' : '20px')};\n background-color: ${({ theme }) => theme.bg2};\n z-index: 1;\n`\n\nconst Container = styled.div<{ hideInput: boolean }>`\n border-radius: ${({ hideInput }) => (hideInput ? '8px' : '20px')};\n border: 1px solid ${({ theme }) => theme.bg2};\n background-color: ${({ theme }) => theme.bg1};\n`\n\nconst StyledTokenName = styled.span<{ active?: boolean }>`\n ${({ active }) => (active ? ' margin: 0 0.25rem 0 0.75rem;' : ' margin: 0 0.25rem 0 0.25rem;')}\n font-size: ${({ active }) => (active ? '20px' : '16px')};\n\n`\n\nconst StyledBalanceMax = styled.button`\n height: 28px;\n background-color: ${({ theme }) => theme.primary5};\n border: 1px solid ${({ theme }) => theme.primary5};\n border-radius: 0.5rem;\n font-size: 0.875rem;\n\n font-weight: 500;\n cursor: pointer;\n margin-right: 0.5rem;\n color: ${({ theme }) => theme.primaryText1};\n :hover {\n border: 1px solid ${({ theme }) => theme.primary1};\n }\n :focus {\n border: 1px solid ${({ theme }) => theme.primary1};\n outline: none;\n }\n\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\n margin-right: 0.5rem;\n `};\n`\n\ninterface CurrencyInputPanelProps {\n value: string\n onUserInput: (value: string) => void\n onMax?: () => void\n showMaxButton: boolean\n label?: string\n onCurrencySelect?: (currency: Currency) => void\n currency?: Currency | null\n disableCurrencySelect?: boolean\n hideBalance?: boolean\n pair?: Pair | null\n pool?: Pool | null\n hideInput?: boolean\n otherCurrency?: Currency | null\n id: string\n showCommonBases?: boolean\n customBalanceText?: string\n}\n\nexport default function CurrencyInputPanel({\n value,\n onUserInput,\n onMax,\n showMaxButton,\n label = 'Input',\n onCurrencySelect,\n currency,\n disableCurrencySelect = false,\n hideBalance = false,\n pair = null, // used for double token logo\n pool = null, // used for pool token logo\n hideInput = false,\n otherCurrency,\n id,\n showCommonBases,\n customBalanceText\n}: CurrencyInputPanelProps) {\n const { t } = useTranslation()\n\n const [modalOpen, setModalOpen] = useState(false)\n const { account } = useActiveWeb3React()\n const selectedCurrencyBalance = useCurrencyBalance(account ?? undefined, currency ?? undefined)\n const theme = useTheme()\n\n const handleDismissSearch = useCallback(() => {\n setModalOpen(false)\n }, [setModalOpen])\n\n return (\n \n \n {!hideInput && (\n \n \n \n {label}\n \n {account && (\n \n {!hideBalance && !!currency && selectedCurrencyBalance\n ? (customBalanceText ?? 'Balance: ') + selectedCurrencyBalance?.toSignificant(6)\n : ' -'}\n \n )}\n \n \n )}\n \n {!hideInput && (\n <>\n {\n onUserInput(val)\n }}\n />\n {account && currency && showMaxButton && label !== 'To' && (\n MAX\n )}\n \n )}\n {\n if (!disableCurrencySelect) {\n setModalOpen(true)\n }\n }}\n >\n \n {pair ? (\n \n ) : pool ? (\n \n ) : currency ? (\n \n ) : null}\n {pair ? (\n \n {pair?.token0.symbol}:{pair?.token1.symbol}\n \n ) : pool ? (\n FL-{pool?.token.symbol}\n ) : (\n \n {(currency && currency.symbol && currency.symbol.length > 20\n ? currency.symbol.slice(0, 4) +\n '...' +\n currency.symbol.slice(currency.symbol.length - 5, currency.symbol.length)\n : currency?.symbol) || t('selectToken')}\n \n )}\n {!disableCurrencySelect && }\n \n \n \n \n {!disableCurrencySelect && onCurrencySelect && (\n \n )}\n \n )\n}\n","import React, { useState } from 'react'\nimport styled from 'styled-components'\n\nimport { TYPE } from '../../theme'\nimport { AutoColumn } from '../Column'\nimport { RowFixed } from '../Row'\n\nimport { darken } from 'polished'\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 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\nexport interface SlippageTabsProps {\n deadline: number\n setDeadline: (deadline: number) => void\n}\n\nexport default function SlippageTabs({ deadline, setDeadline }: SlippageTabsProps) {\n const [deadlineInput, setDeadlineInput] = useState('')\n\n const deadlineInputIsValid = deadlineInput === '' || (deadline / 60).toString() === deadlineInput\n\n let deadlineError: DeadlineError | undefined\n if (deadlineInput !== '' && !deadlineInputIsValid) {\n deadlineError = DeadlineError.InvalidInput\n } else {\n deadlineError = undefined\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 {\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 QuestionHelper from 'components/QuestionHelper'\nimport { AutoRow } from 'components/Row'\nimport React, { useRef } from 'react'\nimport { Settings } from 'react-feather'\nimport { Text } from 'rebass'\nimport styled from 'styled-components'\nimport { useOnClickOutside } from '../../hooks/useOnClickOutside'\nimport { ApplicationModal } from '../../state/application/actions'\nimport { useModalOpen, useToggleSettingsMenu } from '../../state/application/hooks'\nimport { useUserTransactionTTL } from '../../state/user/hooks'\nimport TransactionSettings from '../TransactionSettings/FlashLoanTransactionSettings'\n\nconst StyledMenuIcon = styled(Settings)`\n height: 20px;\n width: 20px;\n\n > * {\n stroke: ${({ theme }) => theme.text2};\n }\n\n :hover {\n opacity: 0.7;\n }\n`\n\nconst StyledMenuButton = styled.button`\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n background-color: transparent;\n margin: 0;\n padding: 0;\n height: 35px;\n\n padding: 0.15rem 0.5rem;\n border-radius: 0.5rem;\n\n :hover,\n :focus {\n cursor: pointer;\n outline: none;\n }\n\n svg {\n margin-top: 2px;\n }\n`\n\nconst StyledMenu = styled.div`\n margin-left: 0.5rem;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n border: none;\n text-align: left;\n`\n\nconst MenuFlyout = styled.span`\n min-width: 20.125rem;\n background-color: ${({ theme }) => theme.bg2};\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 border-radius: 12px;\n display: flex;\n flex-direction: column;\n font-size: 1rem;\n position: absolute;\n top: 3rem;\n right: 0rem;\n z-index: 100;\n\n ${({ theme }) => theme.mediaWidth.upToMedium`\n min-width: 18.125rem;\n `};\n`\n\nexport default function SettingsTab() {\n const node = useRef()\n const open = useModalOpen(ApplicationModal.SETTINGS)\n const toggle = useToggleSettingsMenu()\n\n const [ttl, setTtl] = useUserTransactionTTL()\n\n useOnClickOutside(node, open ? toggle : undefined)\n\n return (\n \n \n \n \n {open && (\n \n \n \n Transaction Deadline\n \n \n \n \n \n )}\n \n )\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 React from 'react'\nimport styled from 'styled-components'\nimport { darken } from 'polished'\nimport { useTranslation } from 'react-i18next'\nimport { NavLink, Link as HistoryLink } from 'react-router-dom'\n\nimport { ArrowLeft } from 'react-feather'\nimport { RowBetween } from '../Row'\n// import QuestionHelper from '../QuestionHelper'\nimport Settings from '../Settings/FlashLoanSettings'\nimport { useDispatch } from 'react-redux'\nimport { AppDispatch } from 'state'\nimport { resetMintState } from 'state/mint/actions'\n\nconst Tabs = styled.div`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n border-radius: 3rem;\n justify-content: space-evenly;\n`\n\nconst activeClassName = 'ACTIVE'\n\nconst StyledNavLink = styled(NavLink).attrs({\n activeClassName\n})`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n justify-content: center;\n height: 3rem;\n border-radius: 3rem;\n outline: none;\n cursor: pointer;\n text-decoration: none;\n color: ${({ theme }) => theme.text3};\n font-size: 20px;\n\n &.${activeClassName} {\n border-radius: 12px;\n font-weight: 500;\n color: ${({ theme }) => theme.text1};\n }\n\n :hover,\n :focus {\n color: ${({ theme }) => darken(0.1, theme.text1)};\n }\n`\n\nconst ActiveText = styled.div`\n font-weight: 500;\n font-size: 20px;\n`\n\nconst StyledArrowLeft = styled(ArrowLeft)`\n color: ${({ theme }) => theme.text1};\n`\n\nexport function SwapPoolTabs({ active }: { active: 'flashloan' | 'pool' }) {\n const { t } = useTranslation()\n return (\n \n active === 'swap'}>\n {t('swap')}\n \n active === 'pool'}>\n {t('pool')}\n \n \n )\n}\n\nexport function FlashLoanPoolTabs({ active }: { active: 'flashloan' | 'pool' }) {\n const { t } = useTranslation()\n return (\n \n active === 'pool'}>\n {t('pool')}\n \n active === 'flashloan'}>\n {t('flashloan')}\n \n \n )\n}\n\nexport function FindPoolTabs() {\n return (\n \n \n \n \n \n Import Pool\n \n \n \n )\n}\n\nexport function AddRemoveTabs({ adding, creating }: { adding: boolean; creating: boolean }) {\n // reset states on back\n const dispatch = useDispatch()\n\n return (\n \n \n {\n adding && dispatch(resetMintState())\n }}\n >\n \n \n {creating ? 'Create a pair' : adding ? 'Add Liquidity' : 'Remove Liquidity'}\n \n \n \n )\n}\n","import { Currency, ETHER, Token } from '@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 { JSBI, Percent, TokenAmount } from '@uniswap/sdk'\nimport { Pool } from 'data/Pool'\nimport { darken } from 'polished'\nimport React, { useState } from 'react'\nimport { ChevronDown, ChevronUp } from 'react-feather'\nimport { Link } from 'react-router-dom'\nimport { Text } from 'rebass'\nimport styled from 'styled-components'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { useTokenBalance } from '../../state/wallet/hooks'\nimport { ExternalLink, TYPE } from '../../theme'\nimport { currencyId } from '../../utils/currencyId'\nimport { unwrappedToken } from '../../utils/wrappedCurrency'\nimport { ButtonPrimary, ButtonSecondary, ButtonEmpty } from '../Button'\nimport { transparentize } from 'polished'\nimport { CardNoise } from '../earn/styled'\n\nimport { useColor } from '../../hooks/useColor'\n\nimport Card, { GreyCard, LightCard } from '../Card'\nimport { AutoColumn } from '../Column'\nimport CurrencyLogo from '../CurrencyLogo'\nimport { RowBetween, RowFixed, AutoRow } from '../Row'\nimport { Dots } from '../swap/styleds'\nimport { BIG_INT_ZERO } from '../../constants'\n\nexport const FixedHeightRow = styled(RowBetween)`\n height: 24px;\n`\n\nexport const HoverCard = styled(Card)`\n border: 1px solid transparent;\n :hover {\n border: 1px solid ${({ theme }) => darken(0.06, theme.bg2)};\n }\n`\nconst StyledPositionCard = styled(LightCard)<{ bgColor: any }>`\n border: none;\n background: ${({ theme, bgColor }) =>\n `radial-gradient(91.85% 100% at 1.84% 0%, ${transparentize(0.8, bgColor)} 0%, ${theme.bg3} 100%) `};\n position: relative;\n overflow: hidden;\n`\n\ninterface PositionCardProps {\n pool: Pool\n showUnwrapped?: boolean\n border?: string\n stakedBalance?: TokenAmount // optional balance to indicate that liquidity is deposited in mining pool\n}\n\nexport function MinimalPositionCard({ pool, showUnwrapped = false, border }: PositionCardProps) {\n const { account } = useActiveWeb3React()\n\n const currency = showUnwrapped ? pool.token : unwrappedToken(pool.token)\n\n const [showMore, setShowMore] = useState(false)\n\n const userPoolBalance = useTokenBalance(account ?? undefined, pool.liquidityToken)\n const totalPoolTokens = useTotalSupply(pool.liquidityToken)\n\n const poolTokenPercentage =\n !!userPoolBalance && !!totalPoolTokens && JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\n ? new Percent(userPoolBalance.raw, totalPoolTokens.raw)\n : undefined\n\n const tokenDeposited =\n !!pool &&\n !!totalPoolTokens &&\n !!userPoolBalance &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\n ? pool.getLiquidityValue(pool.token, totalPoolTokens, userPoolBalance, false)\n : undefined\n\n return (\n <>\n {userPoolBalance && JSBI.greaterThan(userPoolBalance.raw, JSBI.BigInt(0)) ? (\n \n \n \n \n \n Your position\n \n \n \n setShowMore(!showMore)}>\n \n \n \n {currency.symbol}\n \n \n \n \n {userPoolBalance ? userPoolBalance.toSignificant(4) : '-'}\n \n \n \n \n \n \n Your pool share:\n \n \n {poolTokenPercentage ? poolTokenPercentage.toFixed(6) + '%' : '-'}\n \n \n \n \n {currency.symbol}:\n \n {tokenDeposited ? (\n \n \n {tokenDeposited?.toSignificant(6)}\n \n \n ) : (\n '-'\n )}\n \n \n \n \n ) : (\n \n \n \n ⭐️\n {' '}\n By adding liquidity you'll earn 0.3% of all trades on this pair proportional to your share of the pool.\n Fees are added to the pool, accrue in real time and can be claimed by withdrawing your liquidity.\n \n \n )}\n \n )\n}\n\nexport default function FullPositionCard({ pool, border, stakedBalance }: PositionCardProps) {\n const { account } = useActiveWeb3React()\n\n const currency = unwrappedToken(pool.token)\n\n const [showMore, setShowMore] = useState(false)\n\n const userDefaultPoolBalance = useTokenBalance(account ?? undefined, pool.liquidityToken)\n const totalPoolTokens = useTotalSupply(pool.liquidityToken)\n\n // if staked balance balance provided, add to standard liquidity amount\n const userPoolBalance = stakedBalance ? userDefaultPoolBalance?.add(stakedBalance) : userDefaultPoolBalance\n\n const poolTokenPercentage =\n !!userPoolBalance && !!totalPoolTokens && JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\n ? new Percent(userPoolBalance.raw, totalPoolTokens.raw)\n : undefined\n\n const tokenDeposited =\n !!pool &&\n !!totalPoolTokens &&\n !!userPoolBalance &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\n ? pool.getLiquidityValue(pool.token, totalPoolTokens, userPoolBalance, false)\n : undefined\n\n const backgroundColor = useColor(pool?.token)\n\n return (\n \n \n \n \n \n \n \n {!currency ? Loading : `${currency.symbol}`}\n \n \n \n setShowMore(!showMore)}\n >\n {showMore ? (\n <>\n Manage\n \n \n ) : (\n <>\n Manage\n \n \n )}\n \n \n \n\n {showMore && (\n \n \n \n Your total pool tokens:\n \n \n {userPoolBalance ? userPoolBalance.toSignificant(4) : '-'}\n \n \n {stakedBalance && (\n \n \n Pool tokens in rewards pool:\n \n \n {stakedBalance.toSignificant(4)}\n \n \n )}\n \n \n \n Pooled {currency.symbol}:\n \n \n {tokenDeposited ? (\n \n \n {tokenDeposited?.toSignificant(6)}\n \n \n \n ) : (\n '-'\n )}\n \n\n \n \n Your pool share:\n \n \n {poolTokenPercentage\n ? (poolTokenPercentage.toFixed(2) === '0.00' ? '<0.01' : poolTokenPercentage.toFixed(2)) + '%'\n : '-'}\n \n \n\n \n \n View accrued fees and analytics\n \n \n {userDefaultPoolBalance && JSBI.greaterThan(userDefaultPoolBalance.raw, BIG_INT_ZERO) && (\n \n \n Add\n \n \n Remove\n \n \n )}\n {stakedBalance && JSBI.greaterThan(stakedBalance.raw, BIG_INT_ZERO) && (\n \n Manage Liquidity in Rewards Pool\n \n )}\n \n )}\n \n \n )\n}\n","import { Token, TokenAmount } from '@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 { MaxUint256 } from '@ethersproject/constants'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { Trade, TokenAmount, CurrencyAmount, ETHER, JSBI } from '@uniswap/sdk'\nimport { useCallback, useMemo, useState } 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'\nimport { CToken } from '../data/CToken'\n\nconst ZERO = JSBI.BigInt(0)\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\nexport function useCTokenApproveCallback(\n amountToApprove?: CToken,\n walletBalances?: {\n [tokenAddress: string]: TokenAmount | undefined\n },\n spender?: string,\n setAttemptingTxn?: (value: boolean) => void\n): [ApprovalState, () => Promise, string, string] {\n const { account } = useActiveWeb3React()\n const token = amountToApprove instanceof CToken ? amountToApprove : undefined\n const currentAllowance = useTokenAllowance(token, account ?? undefined, spender)\n const pendingApproval = useHasPendingApproval(token?.address, spender)\n const approveTokenWalletBalance = walletBalances?.[amountToApprove?.address ?? '']\n\n // check the current approval status\n const approvalState: ApprovalState = useMemo(() => {\n if (!amountToApprove || !spender || !approveTokenWalletBalance) return ApprovalState.UNKNOWN\n if (amountToApprove.isETH()) 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 return pendingApproval\n ? ApprovalState.PENDING\n : currentAllowance.equalTo(ZERO) || currentAllowance.lessThan(approveTokenWalletBalance)\n ? ApprovalState.NOT_APPROVED\n : ApprovalState.APPROVED\n }, [amountToApprove, approveTokenWalletBalance, currentAllowance, pendingApproval, spender])\n\n const tokenContract = useTokenContract(token?.address)\n const addTransaction = useTransactionAdder()\n const [approveHash, setApproveHash] = useState('')\n const [approvePendingText, setApprovePendingText] = useState('')\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 setApprovePendingText('Approve ' + amountToApprove.symbol)\n setAttemptingTxn?.(true)\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, MaxUint256.toString())\n })\n\n return tokenContract\n .approve(spender, useExact ? MaxUint256.toString() : MaxUint256, {\n gasLimit: calculateGasMargin(estimatedGas)\n })\n .then((response: TransactionResponse) => {\n setApproveHash(response.hash)\n setAttemptingTxn?.(false)\n addTransaction(response, {\n summary: 'Approve ' + amountToApprove.symbol,\n approval: { tokenAddress: token.address, spender: spender }\n })\n })\n .catch((error: Error) => {\n setAttemptingTxn?.(false)\n console.debug('Failed to approve token', error)\n throw error\n })\n }, [approvalState, token, tokenContract, amountToApprove, spender, setAttemptingTxn, addTransaction])\n\n return [approvalState, approve, approveHash, approvePendingText]\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 = 'CURRENCY'\n}\n\nexport const typeInput = createAction<{ field: Field; typedValue: string; noLiquidity: boolean }>(\n 'flashLoanMint/typeInputMint'\n)\nexport const resetMintState = createAction('flashLoanMint/resetMintState')\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 { Currency, CurrencyAmount, JSBI, Percent, TokenAmount } from '@uniswap/sdk'\nimport { Pool } from 'data/Pool'\nimport { useCallback, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { PairState, usePool } from '../../data/Reserves'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { 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['flashLoanMint'] {\n return useSelector(state => state.flashLoanMint)\n}\n\nexport function useMintActionHandlers(\n noLiquidity: boolean | undefined\n): {\n onFieldInput: (typedValue: string) => void\n} {\n const dispatch = useDispatch()\n\n const onFieldInput = useCallback(\n (typedValue: string) => {\n dispatch(typeInput({ field: Field.CURRENCY, typedValue, noLiquidity: noLiquidity === true }))\n },\n [dispatch, noLiquidity]\n )\n\n return {\n onFieldInput\n }\n}\n\nexport function useDerivedMintInfo(\n currency: Currency | undefined\n): {\n currencies: { [field in Field]?: Currency }\n pool?: Pool | null\n pairState: PairState\n currencyBalances: { [field in Field]?: CurrencyAmount }\n parsedAmounts: { [field in Field]?: CurrencyAmount }\n noLiquidity?: boolean\n liquidityMinted?: TokenAmount\n poolTokenPercentage?: Percent\n error?: string\n} {\n const { account, chainId } = useActiveWeb3React()\n\n const { independentField, typedValue } = useMintState()\n\n // tokens\n const currencies: { [field in Field]?: Currency } = useMemo(\n () => ({\n [Field.CURRENCY]: currency ?? undefined\n }),\n [currency]\n )\n\n // pool\n const [pairState, pool] = usePool(currencies[Field.CURRENCY])\n const totalSupply = useTotalSupply(pool?.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, [currencies[Field.CURRENCY]])\n const currencyBalances: { [field in Field]?: CurrencyAmount } = {\n [Field.CURRENCY]: balances[0]\n }\n\n // amounts\n const independentAmount: CurrencyAmount | undefined = tryParseAmount(typedValue, currencies[independentField])\n const parsedAmounts: { [field in Field]: CurrencyAmount | undefined } = {\n [Field.CURRENCY]: independentAmount\n }\n\n // liquidity minted\n const liquidityMinted = useMemo(() => {\n const { [Field.CURRENCY]: currencyAmount } = parsedAmounts\n const tokenAmount = wrappedCurrencyAmount(currencyAmount, chainId)\n if (pool && totalSupply && tokenAmount) {\n return pool.getLiquidityMinted(totalSupply, tokenAmount)\n } else {\n return undefined\n }\n }, [parsedAmounts, chainId, pool, 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]) {\n error = error ?? 'Enter an amount'\n }\n\n const { [Field.CURRENCY]: currencyAmount } = parsedAmounts\n\n if (currencyAmount && currencyBalances?.[Field.CURRENCY]?.lessThan(currencyAmount)) {\n error = 'Insufficient ' + currencies[Field.CURRENCY]?.symbol + ' balance'\n }\n\n return {\n currencies,\n pool: pool,\n pairState,\n currencyBalances,\n parsedAmounts,\n noLiquidity,\n liquidityMinted,\n poolTokenPercentage,\n error\n }\n}\n","import { CurrencyAmount, ETHER, JSBI } from '@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\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 cTokenMaxAmountSpend(currencyAmount?: CurrencyAmount): CurrencyAmount | undefined {\n if (!currencyAmount) return undefined\n if (currencyAmount.currency.symbol === 'ETH') {\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'\nimport styled from 'styled-components'\n\nexport const BodyWrapper = styled.div`\n position: relative;\n max-width: 420px;\n width: 100%;\n background: ${({ theme }) => theme.bg1};\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 border-radius: 30px;\n /* padding: 1rem; */\n`\n\n/**\n * The styled container element that wraps the content of most pages and the tabs.\n */\nexport default function AppBody({ children }: { children: React.ReactNode }) {\n return {children}\n}\n","import { Text } from 'rebass'\nimport styled from 'styled-components'\n\nexport const Wrapper = styled.div`\n position: relative;\n padding: 1rem;\n`\n\nexport const ClickableText = styled(Text)`\n :hover {\n cursor: pointer;\n }\n color: ${({ theme }) => theme.primary1};\n`\nexport const MaxButton = styled.button<{ width: string }>`\n padding: 0.5rem 1rem;\n background-color: ${({ theme }) => theme.primary5};\n border: 1px solid ${({ theme }) => theme.primary5};\n border-radius: 0.5rem;\n font-size: 1rem;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n padding: 0.25rem 0.5rem;\n `};\n font-weight: 500;\n cursor: pointer;\n margin: 0.25rem;\n overflow: hidden;\n color: ${({ theme }) => theme.primary1};\n :hover {\n border: 1px solid ${({ theme }) => theme.primary1};\n }\n :focus {\n border: 1px solid ${({ theme }) => theme.primary1};\n outline: none;\n }\n`\n\nexport const Dots = styled.span`\n &::after {\n display: inline-block;\n animation: ellipsis 1.25s infinite;\n content: '.';\n width: 1em;\n text-align: left;\n }\n @keyframes ellipsis {\n 0% {\n content: '.';\n }\n 33% {\n content: '..';\n }\n 66% {\n content: '...';\n }\n }\n`\n","import { Currency, CurrencyAmount, Percent } from '@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/flashLoanMint/actions'\nimport { TYPE } from '../../theme'\n\nexport function ConfirmAddModalBottom({\n noLiquidity,\n currencies,\n parsedAmounts,\n poolTokenPercentage,\n onAdd\n}: {\n noLiquidity?: boolean\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]?.symbol} Deposited\n \n \n {parsedAmounts[Field.CURRENCY]?.toSignificant(6)}\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 } from '@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/flashLoanMint/actions'\nimport { TYPE } from '../../theme'\n\nexport function PoolPriceBar({\n currencies,\n noLiquidity,\n poolTokenPercentage\n}: {\n currencies: { [field in Field]?: Currency }\n noLiquidity?: boolean\n poolTokenPercentage?: Percent\n}) {\n const theme = useContext(ThemeContext)\n return (\n \n \n \n \n {noLiquidity\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 React, { useState } from 'react'\nimport styled from 'styled-components'\nimport { TYPE, CloseIcon, ExternalLink } from 'theme'\nimport { ButtonEmpty } from 'components/Button'\nimport Modal from 'components/Modal'\nimport Card, { OutlineCard } from 'components/Card'\nimport { RowBetween, AutoRow } from 'components/Row'\nimport { AutoColumn } from 'components/Column'\nimport CurrencyLogo from 'components/CurrencyLogo'\nimport { useActiveWeb3React } from 'hooks'\nimport { getEtherscanLink } from 'utils'\nimport { Currency, Token } from '@uniswap/sdk'\nimport { wrappedCurrency } from 'utils/wrappedCurrency'\nimport { useUnsupportedTokens } from '../../hooks/Tokens'\n\nconst DetailsFooter = 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 text-align: center;\n`\n\nconst AddressText = styled(TYPE.blue)`\n font-size: 12px;\n\n ${({ theme }) => theme.mediaWidth.upToSmall`\n font-size: 10px;\n`}\n`\n\nexport default function UnsupportedCurrencyFooter({\n show,\n currencies\n}: {\n show: boolean\n currencies: (Currency | undefined)[]\n}) {\n const { chainId } = useActiveWeb3React()\n const [showDetails, setShowDetails] = useState(false)\n\n const tokens =\n chainId && currencies\n ? currencies.map(currency => {\n return wrappedCurrency(currency, chainId)\n })\n : []\n\n const unsupportedTokens: { [address: string]: Token } = useUnsupportedTokens()\n\n return (\n \n setShowDetails(false)}>\n \n \n \n Unsupported Assets\n\n setShowDetails(false)} />\n \n {tokens.map(token => {\n return (\n token &&\n unsupportedTokens &&\n Object.keys(unsupportedTokens).includes(token.address) && (\n \n \n \n \n {token.symbol}\n \n {chainId && (\n \n {token.address}\n \n )}\n \n \n )\n )\n })}\n \n \n Some assets are not available through this interface because they may not work well with our smart\n contract or we are unable to allow trading for legal reasons.\n \n \n \n \n \n setShowDetails(true)}>\n Read more about unsupported assets\n \n \n )\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { Currency, currencyEquals, ETHER, TokenAmount, WETH } from '@uniswap/sdk'\nimport React, { useCallback, useState } from 'react'\nimport ReactGA from 'react-ga'\nimport { RouteComponentProps } from 'react-router-dom'\nimport { Text } from 'rebass'\nimport { ButtonError, ButtonLight, ButtonPrimary } from '../../components/Button'\nimport { BlueCard, LightCard } from '../../components/Card'\nimport { AutoColumn, ColumnCenter } from '../../components/Column'\nimport TransactionConfirmationModal, { ConfirmationModalContent } from '../../components/TransactionConfirmationModal'\nimport CurrencyInputPanel from '../../components/CurrencyInputPanel'\nimport { AddRemoveTabs } from '../../components/NavigationTabs'\nimport { MinimalPositionCard } from '../../components/FlashLoanPositionCard'\nimport Row, { RowBetween, RowFlat } from '../../components/Row'\n\nimport { ROUTER_ADDRESS } from '../../constants/flashLoan'\nimport { PairState } from '../../data/Reserves'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency } from '../../hooks/Tokens'\nimport { ApprovalState, useApproveCallback } from '../../hooks/useApproveCallback'\nimport useTransactionDeadline from '../../hooks/useTransactionDeadline'\nimport { useWalletModalToggle } from '../../state/application/hooks'\nimport { Field } from '../../state/flashLoanMint/actions'\nimport { useDerivedMintInfo, useMintActionHandlers, useMintState } from '../../state/flashLoanMint/hooks'\n\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport { useIsExpertMode } from '../../state/user/hooks'\nimport { TYPE } from '../../theme'\nimport { calculateGasMargin, getFlashLoanRouterContract } from '../../utils'\nimport { maxAmountSpend } from '../../utils/maxAmountSpend'\nimport { wrappedCurrency } from '../../utils/wrappedCurrency'\nimport AppBody from '../AppBody'\nimport { Dots, Wrapper } from '../Pool/styleds'\nimport { ConfirmAddModalBottom } from './ConfirmAddModalBottom'\nimport { currencyId as toCurrencyId } from '../../utils/currencyId'\nimport { PoolPriceBar } from './PoolPriceBar'\nimport { useIsFlashLoanTransactionUnsupported } from 'hooks/Trades'\nimport UnsupportedCurrencyFooter from 'components/swap/UnsupportedCurrencyFooter'\nimport CurrencyLogo from 'components/CurrencyLogo'\n\nexport default function AddFlashLoanLiquidity({\n match: {\n params: { currencyId }\n },\n history\n}: RouteComponentProps<{ currencyId?: string }>) {\n const { account, chainId, library } = useActiveWeb3React()\n\n const currency = useCurrency(currencyId)\n\n const oneCurrencyIsWETH = Boolean(chainId && currency && currencyEquals(currency, WETH[chainId]))\n\n const toggleWalletModal = useWalletModalToggle() // toggle wallet when disconnected\n\n const expertMode = useIsExpertMode()\n\n // mint state\n const { independentField, typedValue } = useMintState()\n const {\n currencies,\n pool,\n pairState,\n currencyBalances,\n parsedAmounts,\n noLiquidity,\n liquidityMinted,\n poolTokenPercentage,\n error\n } = useDerivedMintInfo(currency ?? undefined)\n\n const { onFieldInput } = useMintActionHandlers(noLiquidity)\n\n const isValid = !error\n\n // modal and loading\n const [showConfirm, setShowConfirm] = useState(false)\n const [attemptingTxn, setAttemptingTxn] = useState(false) // clicked confirm\n\n // txn values\n const deadline = useTransactionDeadline() // custom from users settings\n const [txHash, setTxHash] = useState('')\n\n // get formatted amounts\n const formattedAmounts = {\n [independentField]: typedValue\n }\n\n // get the max amounts user can add\n const maxAmounts: { [field in Field]?: TokenAmount } = [Field.CURRENCY].reduce((accumulator, field) => {\n return {\n ...accumulator,\n [field]: maxAmountSpend(currencyBalances[field])\n }\n }, {})\n\n const atMaxAmounts: { [field in Field]?: TokenAmount } = [Field.CURRENCY].reduce((accumulator, field) => {\n return {\n ...accumulator,\n [field]: maxAmounts[field]?.equalTo(parsedAmounts[field] ?? '0')\n }\n }, {})\n\n // check whether the user has approved the router on the tokens\n const [approval, approveCallback] = useApproveCallback(parsedAmounts[Field.CURRENCY], ROUTER_ADDRESS)\n\n const addTransaction = useTransactionAdder()\n\n async function onAdd() {\n if (!chainId || !library || !account) return\n const router = getFlashLoanRouterContract(chainId, library, account)\n\n const { [Field.CURRENCY]: parsedAmount } = parsedAmounts\n if (!parsedAmount || !currency || !deadline) {\n return\n }\n\n let estimate,\n method: (...args: any) => Promise,\n args: Array,\n value: BigNumber | null\n if (currency === ETHER) {\n estimate = router.estimateGas.addLiquidityETH\n method = router.addLiquidityETH\n args = [account, deadline.toHexString()]\n value = BigNumber.from(parsedAmount.raw.toString())\n } else {\n estimate = router.estimateGas.addLiquidity\n method = router.addLiquidity\n args = [\n wrappedCurrency(currency, chainId)?.address ?? '',\n parsedAmount.raw.toString(),\n account,\n deadline.toHexString()\n ]\n value = null\n }\n\n setAttemptingTxn(true)\n await estimate(...args, value ? { value } : {})\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: 'Add ' + parsedAmounts[Field.CURRENCY]?.toSignificant(3) + ' ' + currencies[Field.CURRENCY]?.symbol\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Liquidity',\n action: 'Add',\n label: currencies[Field.CURRENCY]?.symbol\n })\n })\n )\n .catch(error => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n const modalHeader = () => {\n return noLiquidity ? (\n \n \n \n \n {currencies[Field.CURRENCY]?.symbol}\n \n \n \n \n \n ) : (\n \n \n \n {liquidityMinted?.toSignificant(6)}\n \n \n \n \n {currencies[Field.CURRENCY]?.symbol + ' Pool Tokens'}\n \n \n )\n }\n\n const modalBottom = () => {\n return (\n \n )\n }\n\n const pendingText = `Supplying ${parsedAmounts[Field.CURRENCY]?.toSignificant(6)} ${\n currencies[Field.CURRENCY]?.symbol\n }`\n\n const handleCurrencySelect = useCallback(\n (currency: Currency) => {\n const newCurrencyId = toCurrencyId(currency)\n history.push(`/add/${newCurrencyId}`)\n },\n [history]\n )\n\n const handleDismissConfirmation = useCallback(() => {\n setShowConfirm(false)\n // if there was a tx hash, we want to clear the input\n if (txHash) {\n onFieldInput('')\n }\n setTxHash('')\n }, [onFieldInput, txHash])\n\n const isCreate = history.location.pathname.includes('/create')\n\n const addIsUnsupported = useIsFlashLoanTransactionUnsupported(currencies?.CURRENCY)\n\n return (\n <>\n \n \n \n (\n \n )}\n pendingText={pendingText}\n />\n \n {noLiquidity ||\n (isCreate ? (\n \n \n \n \n You are the first liquidity provider.\n \n \n The ratio of tokens you add will set the price of this pool.\n \n \n Once you are happy with the rate click supply to review.\n \n \n \n \n ) : (\n \n \n \n \n Tip: When you add liquidity, you will receive pool tokens representing your position.\n These tokens automatically earn fees proportional to your share of the pool, and can be redeemed\n at any time.\n \n \n \n \n ))}\n {\n onFieldInput(maxAmounts[Field.CURRENCY]?.toExact() ?? '')\n }}\n onCurrencySelect={handleCurrencySelect}\n showMaxButton={!atMaxAmounts[Field.CURRENCY]}\n currency={currencies[Field.CURRENCY]}\n id=\"add-liquidity-input-tokena\"\n showCommonBases\n />\n {currencies[Field.CURRENCY] && pairState !== PairState.INVALID && (\n <>\n \n \n \n {noLiquidity ? 'Initial prices' : 'Prices'} and pool share\n \n {' '}\n \n \n \n \n \n )}\n\n {addIsUnsupported ? (\n \n Unsupported Asset\n \n ) : !account ? (\n Connect Wallet\n ) : (\n \n {(approval === ApprovalState.NOT_APPROVED || approval === ApprovalState.PENDING) && isValid && (\n \n {\n \n {approval === ApprovalState.PENDING ? (\n Approving {currencies[Field.CURRENCY]?.symbol}\n ) : (\n 'Approve ' + currencies[Field.CURRENCY]?.symbol\n )}\n \n }\n \n )}\n {\n expertMode ? onAdd() : setShowConfirm(true)\n }}\n disabled={!isValid || approval !== ApprovalState.APPROVED}\n error={!isValid && !!parsedAmounts[Field.CURRENCY]}\n >\n \n {error ?? 'Supply'}\n \n \n \n )}\n \n \n \n {!addIsUnsupported ? (\n pool && !noLiquidity && pairState !== PairState.INVALID ? (\n \n \n \n ) : null\n ) : (\n \n )}\n \n )\n}\n","import React from 'react'\nimport { Redirect, RouteComponentProps } from 'react-router-dom'\nimport AddFlashLoanLiquidity from './index'\n\nexport function RedirectToAddLiquidity() {\n return \n}\n\nexport function RedirectFlashLoanAddLiquidity(props: RouteComponentProps<{ currencyId: string }>) {\n return \n}\n","import styled from 'styled-components'\nimport { AutoColumn } from '../Column'\n\nimport uImage from '../../assets/images/big_unicorn.png'\nimport xlUnicorn from '../../assets/images/xl_uni.png'\nimport noise from '../../assets/images/noise.png'\n\nexport const TextBox = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px 12px;\n border: 1px solid rgba(255, 255, 255, 0.4);\n border-radius: 20px;\n width: fit-content;\n justify-self: flex-end;\n`\n\nexport const DataCard = styled(AutoColumn)<{ disabled?: boolean }>`\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #ff007a 0%, #2172e5 100%);\n border-radius: 12px;\n width: 100%;\n position: relative;\n overflow: hidden;\n`\n\nexport const CardBGImage = styled.span<{ desaturate?: boolean }>`\n background: url(${uImage});\n width: 1000px;\n height: 600px;\n position: absolute;\n border-radius: 12px;\n opacity: 0.4;\n top: -100px;\n left: -100px;\n transform: rotate(-15deg);\n user-select: none;\n\n ${({ desaturate }) => desaturate && `filter: saturate(0)`}\n`\n\nexport const CardBGImageSmaller = styled.span<{ desaturate?: boolean }>`\n background: url(${xlUnicorn});\n width: 1200px;\n height: 1200px;\n position: absolute;\n border-radius: 12px;\n top: -300px;\n left: -300px;\n opacity: 0.4;\n user-select: none;\n\n ${({ desaturate }) => desaturate && `filter: saturate(0)`}\n`\n\nexport const CardNoise = styled.span`\n background: url(${noise});\n background-size: cover;\n mix-blend-mode: overlay;\n border-radius: 12px;\n width: 100%;\n height: 100%;\n opacity: 0.15;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n`\n\nexport const CardSection = styled(AutoColumn)<{ disabled?: boolean }>`\n padding: 1rem;\n z-index: 1;\n opacity: ${({ disabled }) => disabled && '0.4'};\n`\n\nexport const Break = styled.div`\n width: 100%;\n background-color: rgba(255, 255, 255, 0.2);\n height: 1px;\n`\n","import React from 'react'\nimport { AutoColumn } from '../Column'\nimport { RowBetween } from '../Row'\nimport styled from 'styled-components'\nimport { TYPE, StyledInternalLink } from '../../theme'\nimport { ChainId, JSBI, TokenAmount, WETH } from '@uniswap/sdk'\nimport { ButtonPrimary } from '../Button'\nimport { FlashLoanStakingInfo } from '../../state/stake/hooks'\nimport { useColor } from '../../hooks/useColor'\nimport { currencyId } from '../../utils/currencyId'\nimport { Break, CardNoise, CardBGImage } from './styled'\nimport { unwrappedToken, wrappedCurrency } from '../../utils/wrappedCurrency'\nimport { useTotalSupply } from '../../data/TotalSupply'\nimport { usePool } from '../../data/Reserves'\nimport useUSDCPrice from '../../utils/useUSDCPrice'\nimport { BIG_INT_SECONDS_IN_WEEK } from '../../constants'\nimport CurrencyLogo from 'components/CurrencyLogo'\nimport { useActiveWeb3React } from 'hooks'\n\nconst StatContainer = styled.div`\n display: flex;\n justify-content: space-between;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 1rem;\n margin-right: 1rem;\n margin-left: 1rem;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n display: none;\n`};\n`\n\nconst Wrapper = styled(AutoColumn)<{ showBackground: boolean; bgColor: any }>`\n border-radius: 12px;\n width: 100%;\n overflow: hidden;\n position: relative;\n opacity: ${({ showBackground }) => (showBackground ? '1' : '1')};\n background: ${({ theme, bgColor, showBackground }) =>\n `radial-gradient(91.85% 100% at 1.84% 0%, ${bgColor} 0%, ${showBackground ? theme.black : theme.bg5} 100%) `};\n color: ${({ theme, showBackground }) => (showBackground ? theme.white : theme.text1)} !important;\n\n ${({ showBackground }) =>\n showBackground &&\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`\n\nconst TopSection = styled.div`\n display: grid;\n grid-template-columns: 48px 1fr 120px;\n grid-gap: 0px;\n align-items: center;\n padding: 1rem;\n z-index: 1;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n grid-template-columns: 48px 1fr 96px;\n `};\n`\n\nconst BottomSection = styled.div<{ showBackground: boolean }>`\n padding: 12px 16px;\n opacity: ${({ showBackground }) => (showBackground ? '1' : '0.4')};\n border-radius: 0 0 12px 12px;\n display: flex;\n flex-direction: row;\n align-items: baseline;\n justify-content: space-between;\n z-index: 1;\n`\n\nexport default function DeerPoolCard({ stakingInfo }: { stakingInfo: FlashLoanStakingInfo }) {\n const { chainId } = useActiveWeb3React()\n\n const currency = unwrappedToken(stakingInfo.token)\n const token = wrappedCurrency(currency ?? undefined, chainId)\n\n const isStaking = Boolean(stakingInfo.stakedAmount.greaterThan('0'))\n\n // get the color of the token\n const backgroundColor = useColor(token)\n\n const totalSupplyOfStakingToken = useTotalSupply(stakingInfo.stakedAmount.token)\n const [, stakingTokenPool] = usePool(stakingInfo.token)\n\n // let returnOverMonth: Percent = new Percent('0')\n let valueOfTotalStakedAmountInToken: TokenAmount | undefined\n if (totalSupplyOfStakingToken && stakingTokenPool && token) {\n // take the total amount of LP tokens staked, multiply by ETH value of all LP tokens, divide by all LP tokens\n valueOfTotalStakedAmountInToken = new TokenAmount(\n token,\n JSBI.divide(\n JSBI.multiply(\n JSBI.multiply(stakingInfo.totalStakedAmount.raw, stakingTokenPool.reserve.raw),\n JSBI.BigInt(1) // this is b/c the value of LP shares are ~one the value of the token they entitle owner to\n ),\n totalSupplyOfStakingToken.raw\n )\n )\n }\n\n // get the USD value of staked WETH\n const USDPrice = useUSDCPrice(WETH[ChainId.KOVAN])\n const valueOfTotalStakedAmountInUSDC =\n valueOfTotalStakedAmountInToken && USDPrice?.quote(valueOfTotalStakedAmountInToken)\n\n return (\n \n \n \n\n \n \n \n {currency.symbol}\n \n\n \n \n {isStaking ? 'Manage' : 'Deposit'}\n \n \n \n\n \n \n Total deposited\n \n {valueOfTotalStakedAmountInUSDC\n ? `$${valueOfTotalStakedAmountInUSDC.toFixed(0, { groupSeparator: ',' })}`\n : `${valueOfTotalStakedAmountInToken?.toSignificant(4, { groupSeparator: ',' }) ?? '-'} ${token?.symbol}`}\n \n \n \n Pool rate \n \n {stakingInfo\n ? stakingInfo.active\n ? `${stakingInfo.totalRewardRate\n ?.multiply(BIG_INT_SECONDS_IN_WEEK)\n ?.toFixed(0, { groupSeparator: ',' })} DEER / week`\n : '0 DEER / week'\n : '-'}\n \n \n \n\n {isStaking && (\n <>\n \n \n \n Your rate\n \n\n \n \n ⚡\n \n {stakingInfo\n ? stakingInfo.active\n ? `${stakingInfo.rewardRate\n ?.multiply(BIG_INT_SECONDS_IN_WEEK)\n ?.toSignificant(4, { groupSeparator: ',' })} DEER / week`\n : '0 DEER / week'\n : '-'}\n \n \n \n )}\n \n )\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { STAKING_GENESIS, REWARDS_DURATION_DAYS } from '../../state/stake/hooks'\nimport { TYPE } from '../../theme'\n\nconst MINUTE = 60\nconst HOUR = MINUTE * 60\nconst DAY = HOUR * 24\nconst REWARDS_DURATION = DAY * REWARDS_DURATION_DAYS\n\nexport function Countdown({ exactEnd }: { exactEnd?: Date }) {\n // get end/beginning times\n const end = useMemo(() => (exactEnd ? Math.floor(exactEnd.getTime() / 1000) : STAKING_GENESIS + REWARDS_DURATION), [\n exactEnd\n ])\n const begin = useMemo(() => end - REWARDS_DURATION, [end])\n\n // get current time\n const [time, setTime] = useState(() => Math.floor(Date.now() / 1000))\n useEffect((): (() => void) | void => {\n // we only need to tick if rewards haven't ended yet\n if (time <= end) {\n const timeout = setTimeout(() => setTime(Math.floor(Date.now() / 1000)), 1000)\n return () => {\n clearTimeout(timeout)\n }\n }\n }, [time, end])\n\n const timeUntilGenesis = begin - time\n const timeUntilEnd = end - time\n\n let timeRemaining: number\n let message: string\n if (timeUntilGenesis >= 0) {\n message = 'Rewards begin in'\n timeRemaining = timeUntilGenesis\n } else {\n const ongoing = timeUntilEnd >= 0\n if (ongoing) {\n message = 'Rewards end in'\n timeRemaining = timeUntilEnd\n } else {\n message = 'Rewards coming soon!'\n timeRemaining = Infinity\n }\n }\n\n const days = (timeRemaining - (timeRemaining % DAY)) / DAY\n timeRemaining -= days * DAY\n const hours = (timeRemaining - (timeRemaining % HOUR)) / HOUR\n timeRemaining -= hours * HOUR\n const minutes = (timeRemaining - (timeRemaining % MINUTE)) / MINUTE\n timeRemaining -= minutes * MINUTE\n const seconds = timeRemaining\n\n return (\n \n {message}{' '}\n {Number.isFinite(timeRemaining) && (\n \n {`${days}:${hours.toString().padStart(2, '0')}:${minutes\n .toString()\n .padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`}\n \n )}\n \n )\n}\n","import React from 'react'\nimport { AutoColumn } from '../../components/Column'\nimport styled from 'styled-components'\nimport { useFlashLoanStakingInfo, FLASH_LOAN_STAKING_REWARDS_INFO } from '../../state/stake/hooks'\nimport { TYPE } from '../../theme'\nimport PoolCard from '../../components/deerEarn/PoolCard'\nimport { RowBetween } from '../../components/Row'\nimport { CardSection, DataCard, CardNoise, CardBGImage } from '../../components/earn/styled'\nimport { Countdown } from './Countdown'\nimport Loader from '../../components/Loader'\nimport { useActiveWeb3React } from '../../hooks'\n\nconst PageWrapper = styled(AutoColumn)`\n max-width: 640px;\n width: 100%;\n`\n\nconst TopSection = styled(AutoColumn)`\n max-width: 720px;\n width: 100%;\n`\n\nconst PoolSection = styled.div`\n display: grid;\n grid-template-columns: 1fr;\n column-gap: 10px;\n row-gap: 15px;\n width: 100%;\n justify-self: center;\n`\n\nconst DataRow = styled(RowBetween)`\n ${({ theme }) => theme.mediaWidth.upToSmall`\nflex-direction: column;\n`};\n`\n\nexport default function DeerEarn() {\n const { chainId } = useActiveWeb3React()\n\n // staking info for connected account\n\n const flashLoanStakingInfos = useFlashLoanStakingInfo()\n /**\n * only show staking cards with balance\n * @todo only account for this if rewards are inactive\n */\n\n // toggle copy if rewards are inactive\n const stakingRewardsExist = Boolean(typeof chainId === 'number' && (FLASH_LOAN_STAKING_REWARDS_INFO[chainId]?.length ?? 0) > 0)\n\n return (\n \n \n \n \n \n \n \n \n Deerfi liquidity mining\n \n \n \n Deposit your Liquidity Provider tokens to receive DEER, the Deerfi protocol governance token.\n \n {' '}\n \n \n \n \n \n \n\n \n \n Participating pools\n \n \n\n \n {stakingRewardsExist && flashLoanStakingInfos?.length === 0 ? (\n \n ) : !stakingRewardsExist ? (\n 'No active rewards'\n ) : (\n flashLoanStakingInfos?.map(stakingInfo => {\n // need to sort by added liquidity here\n return \n })\n )}\n \n \n \n )\n}\n","import { NEVER_RELOAD, useSingleCallResult } from '../state/multicall/hooks'\nimport { useActiveWeb3React } from './index'\nimport { useArgentWalletDetectorContract } from './useContract'\n\nexport default function useIsArgentWallet(): boolean {\n const { account } = useActiveWeb3React()\n const argentWalletDetector = useArgentWalletDetectorContract()\n const call = useSingleCallResult(argentWalletDetector, 'isArgentWallet', [account ?? undefined], NEVER_RELOAD)\n return call?.result?.[0] ?? false\n}\n","import ARGENT_WALLET_DETECTOR_ABI from './argent-wallet-detector.json'\n\nconst ARGENT_WALLET_DETECTOR_MAINNET_ADDRESS = '0xeca4B0bDBf7c55E9b7925919d03CbF8Dc82537E8'\n\nexport { ARGENT_WALLET_DETECTOR_ABI, ARGENT_WALLET_DETECTOR_MAINNET_ADDRESS }\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 React, { useContext } from 'react'\nimport { useActiveWeb3React } from '../../hooks'\n\nimport { AutoColumn, ColumnCenter } from '../Column'\nimport styled, { ThemeContext } from 'styled-components'\nimport { RowBetween } from '../Row'\nimport { TYPE, CloseIcon, CustomLightSpinner } from '../../theme'\nimport { ArrowUpCircle } from 'react-feather'\n\nimport Circle from '../../assets/images/blue-loader.svg'\nimport { getEtherscanLink } from '../../utils'\nimport { ExternalLink } from '../../theme/components'\n\nconst ConfirmOrLoadingWrapper = styled.div`\n width: 100%;\n padding: 24px;\n`\n\nconst ConfirmedIcon = styled(ColumnCenter)`\n padding: 60px 0;\n`\n\nexport function LoadingView({ children, onDismiss }: { children: any; onDismiss: () => void }) {\n return (\n \n \n
\n \n \n \n \n \n \n {children}\n Confirm this transaction in your wallet\n \n \n )\n}\n\nexport function SubmittedView({\n children,\n onDismiss,\n hash\n}: {\n children: any\n onDismiss: () => void\n hash: string | undefined\n}) {\n const theme = useContext(ThemeContext)\n const { chainId } = useActiveWeb3React()\n\n return (\n \n \n
\n \n \n \n \n \n \n {children}\n {chainId && hash && (\n \n View transaction on Etherscan\n \n )}\n \n \n )\n}\n","import React, { useState, useCallback } from 'react'\nimport useIsArgentWallet from '../../hooks/useIsArgentWallet'\nimport useTransactionDeadline from '../../hooks/useTransactionDeadline'\nimport Modal from '../Modal'\nimport { AutoColumn } from '../Column'\nimport styled from 'styled-components'\nimport { RowBetween } from '../Row'\nimport { TYPE, CloseIcon } from '../../theme'\nimport { ButtonConfirmed, ButtonError } from '../Button'\nimport ProgressCircles from '../ProgressSteps'\nimport CurrencyInputPanel from '../CurrencyInputPanel'\nimport { TokenAmount } from '@uniswap/sdk'\nimport { useActiveWeb3React } from '../../hooks'\nimport { maxAmountSpend } from '../../utils/maxAmountSpend'\nimport { useFlashLoanPoolContract, useStakingContract } from '../../hooks/useContract'\nimport { useApproveCallback, ApprovalState } from '../../hooks/useApproveCallback'\nimport { splitSignature } from 'ethers/lib/utils'\nimport { FlashLoanStakingInfo, useDerivedStakeInfo } from '../../state/stake/hooks'\nimport { wrappedCurrencyAmount } from '../../utils/wrappedCurrency'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport { LoadingView, SubmittedView } from '../ModalViews'\nimport { Pool } from 'data/Pool'\n\nconst HypotheticalRewardRate = styled.div<{ dim: boolean }>`\n display: flex;\n justify-content: space-between;\n padding-right: 20px;\n padding-left: 20px;\n\n opacity: ${({ dim }) => (dim ? 0.5 : 1)};\n`\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n padding: 1rem;\n`\n\ninterface StakingModalProps {\n isOpen: boolean\n onDismiss: () => void\n stakingInfo: FlashLoanStakingInfo\n userLiquidityUnstaked: TokenAmount | undefined\n}\n\nexport default function StakingModal({ isOpen, onDismiss, stakingInfo, userLiquidityUnstaked }: StakingModalProps) {\n const { account, chainId, library } = useActiveWeb3React()\n\n // track and parse user input\n const [typedValue, setTypedValue] = useState('')\n const { parsedAmount, error } = useDerivedStakeInfo(typedValue, stakingInfo.stakedAmount.token, userLiquidityUnstaked)\n const parsedAmountWrapped = wrappedCurrencyAmount(parsedAmount, chainId)\n\n let hypotheticalRewardRate: TokenAmount = new TokenAmount(stakingInfo.rewardRate.token, '0')\n if (parsedAmountWrapped?.greaterThan('0')) {\n hypotheticalRewardRate = stakingInfo.getHypotheticalRewardRate(\n stakingInfo.stakedAmount.add(parsedAmountWrapped),\n stakingInfo.totalStakedAmount.add(parsedAmountWrapped),\n stakingInfo.totalRewardRate\n )\n }\n\n // state for pending and submitted txn views\n const addTransaction = useTransactionAdder()\n const [attempting, setAttempting] = useState(false)\n const [hash, setHash] = useState()\n const wrappedOnDismiss = useCallback(() => {\n setHash(undefined)\n setAttempting(false)\n onDismiss()\n }, [onDismiss])\n\n // pair contract for this token to be staked\n const dummyPool = new Pool(new TokenAmount(stakingInfo.token, '0'))\n const pairContract = useFlashLoanPoolContract(dummyPool.liquidityToken.address)\n\n // approval data for stake\n const deadline = useTransactionDeadline()\n const [signatureData, setSignatureData] = useState<{ v: number; r: string; s: string; deadline: number } | null>(null)\n const [approval, approveCallback] = useApproveCallback(parsedAmount, stakingInfo.stakingRewardAddress)\n\n const isArgentWallet = useIsArgentWallet()\n const stakingContract = useStakingContract(stakingInfo.stakingRewardAddress)\n async function onStake() {\n setAttempting(true)\n if (stakingContract && parsedAmount && deadline) {\n if (approval === ApprovalState.APPROVED) {\n await stakingContract.stake(`0x${parsedAmount.raw.toString(16)}`, { gasLimit: 350000 })\n } else if (signatureData) {\n stakingContract\n .stakeWithPermit(\n `0x${parsedAmount.raw.toString(16)}`,\n signatureData.deadline,\n signatureData.v,\n signatureData.r,\n signatureData.s,\n { gasLimit: 350000 }\n )\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Deposit liquidity`\n })\n setHash(response.hash)\n })\n .catch((error: any) => {\n setAttempting(false)\n console.log(error)\n })\n } else {\n setAttempting(false)\n throw new Error('Attempting to stake without approval or a signature. Please contact support.')\n }\n }\n }\n\n // wrapped onUserInput to clear signatures\n const onUserInput = useCallback((typedValue: string) => {\n setSignatureData(null)\n setTypedValue(typedValue)\n }, [])\n\n // used for max input button\n const maxAmountInput = maxAmountSpend(userLiquidityUnstaked)\n const atMaxAmount = Boolean(maxAmountInput && parsedAmount?.equalTo(maxAmountInput))\n const handleMax = useCallback(() => {\n maxAmountInput && onUserInput(maxAmountInput.toExact())\n }, [maxAmountInput, onUserInput])\n\n async function onAttemptToApprove() {\n if (!pairContract || !library || !deadline) throw new Error('missing dependencies')\n const liquidityAmount = parsedAmount\n if (!liquidityAmount) throw new Error('missing liquidity amount')\n\n if (isArgentWallet) {\n return approveCallback()\n }\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: 'Deer FlashLoan V1',\n version: '1',\n chainId: chainId,\n verifyingContract: pairContract.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: stakingInfo.stakingRewardAddress,\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 }\n\n return (\n \n {!attempting && !hash && (\n \n \n Deposit\n \n \n \n\n \n
\n Weekly Rewards\n
\n\n \n {hypotheticalRewardRate.multiply((60 * 60 * 24 * 7).toString()).toSignificant(4, { groupSeparator: ',' })}{' '}\n UNI / week\n \n
\n\n \n \n Approve\n \n \n {error ?? 'Deposit'}\n \n \n \n
\n )}\n {attempting && !hash && (\n \n \n Depositing Liquidity\n {parsedAmount?.toSignificant(4)} UNI-V2\n \n \n )}\n {attempting && hash && (\n \n \n Transaction Submitted\n Deposited {parsedAmount?.toSignificant(4)} UNI-V2\n \n \n )}\n
\n )\n}\n","import React from 'react'\nimport { CurrencyAmount, Fraction, JSBI } from '@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 React, { useState } from 'react'\nimport Modal from '../Modal'\nimport { AutoColumn } from '../Column'\nimport styled from 'styled-components'\nimport { RowBetween } from '../Row'\nimport { TYPE, CloseIcon } from '../../theme'\nimport { ButtonError } from '../Button'\nimport { FlashLoanStakingInfo } from '../../state/stake/hooks'\nimport { useStakingContract } from '../../hooks/useContract'\nimport { SubmittedView, LoadingView } from '../ModalViews'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport FormattedCurrencyAmount from '../FormattedCurrencyAmount'\nimport { useActiveWeb3React } from '../../hooks'\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n padding: 1rem;\n`\n\ninterface StakingModalProps {\n isOpen: boolean\n onDismiss: () => void\n stakingInfo: FlashLoanStakingInfo\n}\n\nexport default function UnstakingModal({ isOpen, onDismiss, stakingInfo }: StakingModalProps) {\n const { account } = useActiveWeb3React()\n\n // monitor call to help UI loading state\n const addTransaction = useTransactionAdder()\n const [hash, setHash] = useState()\n const [attempting, setAttempting] = useState(false)\n\n function wrappedOndismiss() {\n setHash(undefined)\n setAttempting(false)\n onDismiss()\n }\n\n const stakingContract = useStakingContract(stakingInfo.stakingRewardAddress)\n\n async function onWithdraw() {\n if (stakingContract && stakingInfo?.stakedAmount) {\n setAttempting(true)\n await stakingContract\n .exit({ gasLimit: 300000 })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Withdraw deposited liquidity`\n })\n setHash(response.hash)\n })\n .catch((error: any) => {\n setAttempting(false)\n console.log(error)\n })\n }\n }\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n if (!stakingInfo?.stakedAmount) {\n error = error ?? 'Enter an amount'\n }\n\n return (\n \n {!attempting && !hash && (\n \n \n Withdraw\n \n \n {stakingInfo?.stakedAmount && (\n \n \n {}\n \n Deposited liquidity:\n \n )}\n {stakingInfo?.earnedAmount && (\n \n \n {}\n \n Unclaimed DEER\n \n )}\n \n When you withdraw, your desaturate is claimed and your liquidity is removed from the mining pool.\n \n \n {error ?? 'Withdraw & Claim'}\n \n \n )}\n {attempting && !hash && (\n \n \n Withdrawing {stakingInfo?.stakedAmount?.toSignificant(4)} DEER-V1\n Claiming {stakingInfo?.earnedAmount?.toSignificant(4)} DEER\n \n \n )}\n {hash && (\n \n \n Transaction Submitted\n Withdrew DEER-V1!\n Claimed DEER!\n \n \n )}\n \n )\n}\n","import React, { useState } from 'react'\nimport Modal from '../Modal'\nimport { AutoColumn } from '../Column'\nimport styled from 'styled-components'\nimport { RowBetween } from '../Row'\nimport { TYPE, CloseIcon } from '../../theme'\nimport { ButtonError } from '../Button'\nimport { FlashLoanStakingInfo } from '../../state/stake/hooks'\nimport { useStakingContract } from '../../hooks/useContract'\nimport { SubmittedView, LoadingView } from '../ModalViews'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport { useActiveWeb3React } from '../../hooks'\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n padding: 1rem;\n`\n\ninterface StakingModalProps {\n isOpen: boolean\n onDismiss: () => void\n stakingInfo: FlashLoanStakingInfo\n}\n\nexport default function ClaimRewardModal({ isOpen, onDismiss, stakingInfo }: StakingModalProps) {\n const { account } = useActiveWeb3React()\n\n // monitor call to help UI loading state\n const addTransaction = useTransactionAdder()\n const [hash, setHash] = useState()\n const [attempting, setAttempting] = useState(false)\n\n function wrappedOnDismiss() {\n setHash(undefined)\n setAttempting(false)\n onDismiss()\n }\n\n const stakingContract = useStakingContract(stakingInfo.stakingRewardAddress)\n\n async function onClaimReward() {\n if (stakingContract && stakingInfo?.stakedAmount) {\n setAttempting(true)\n await stakingContract\n .getReward({ gasLimit: 350000 })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Claim accumulated UNI rewards`\n })\n setHash(response.hash)\n })\n .catch((error: any) => {\n setAttempting(false)\n console.log(error)\n })\n }\n }\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n if (!stakingInfo?.stakedAmount) {\n error = error ?? 'Enter an amount'\n }\n\n return (\n \n {!attempting && !hash && (\n \n \n Claim\n \n \n {stakingInfo?.earnedAmount && (\n \n \n {stakingInfo?.earnedAmount?.toSignificant(6)}\n \n Unclaimed UNI\n \n )}\n \n When you claim without withdrawing your liquidity remains in the mining pool.\n \n \n {error ?? 'Claim'}\n \n \n )}\n {attempting && !hash && (\n \n \n Claiming {stakingInfo?.earnedAmount?.toSignificant(6)} UNI\n \n \n )}\n {hash && (\n \n \n Transaction Submitted\n Claimed UNI!\n \n \n )}\n \n )\n}\n","import React, { useCallback, useState } from 'react'\nimport { AutoColumn } from '../../components/Column'\nimport styled from 'styled-components'\nimport { Link } from 'react-router-dom'\n\nimport { JSBI, TokenAmount } from '@uniswap/sdk'\nimport { RouteComponentProps } from 'react-router-dom'\nimport { useCurrency } from '../../hooks/Tokens'\nimport { useWalletModalToggle } from '../../state/application/hooks'\nimport { TYPE } from '../../theme'\n\nimport { RowBetween } from '../../components/Row'\nimport { CardSection, DataCard, CardNoise, CardBGImage } from '../../components/earn/styled'\nimport { ButtonPrimary, ButtonEmpty } from '../../components/Button'\nimport StakingDeerModal from '../../components/deerEarn/StakingDeerModal'\nimport { useFlashLoanStakingInfo } from '../../state/stake/hooks'\nimport UnstakingDeerModal from '../../components/deerEarn/UnstakingDeerModal'\nimport ClaimDeerRewardModal from '../../components/deerEarn/ClaimDeerRewardModal'\nimport { useTokenBalance } from '../../state/wallet/hooks'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useColor } from '../../hooks/useColor'\nimport { CountUp } from 'use-count-up'\n\nimport { wrappedCurrency } from '../../utils/wrappedCurrency'\nimport { currencyId as toCurrencyId } from '../../utils/currencyId'\nimport { useTotalSupply } from '../../data/TotalSupply'\nimport { usePool } from '../../data/Reserves'\nimport usePrevious from '../../hooks/usePrevious'\nimport { BIG_INT_ZERO, BIG_INT_SECONDS_IN_WEEK } from '../../constants'\nimport CurrencyLogo from 'components/CurrencyLogo'\n\nconst PageWrapper = styled(AutoColumn)`\n max-width: 640px;\n width: 100%;\n`\n\nconst PositionInfo = styled(AutoColumn)<{ dim: any }>`\n position: relative;\n max-width: 640px;\n width: 100%;\n opacity: ${({ dim }) => (dim ? 0.6 : 1)};\n`\n\nconst BottomSection = styled(AutoColumn)`\n border-radius: 12px;\n width: 100%;\n position: relative;\n`\n\nconst StyledDataCard = styled(DataCard)<{ bgColor?: any; showBackground?: any }>`\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #1e1a31 0%, #3d51a5 100%);\n z-index: 2;\n box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);\n background: ${({ theme, bgColor, showBackground }) =>\n `radial-gradient(91.85% 100% at 1.84% 0%, ${bgColor} 0%, ${showBackground ? theme.black : theme.bg5} 100%) `};\n`\n\nconst StyledBottomCard = styled(DataCard)<{ dim: any }>`\n background: ${({ theme }) => theme.bg3};\n opacity: ${({ dim }) => (dim ? 0.4 : 1)};\n margin-top: -40px;\n padding: 0 1.25rem 1rem 1.25rem;\n padding-top: 32px;\n z-index: 1;\n`\n\nconst PoolData = styled(DataCard)`\n background: none;\n border: 1px solid ${({ theme }) => theme.bg4};\n padding: 1rem;\n z-index: 1;\n`\n\nconst VoteCard = styled(DataCard)`\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #27ae60 0%, #000000 100%);\n overflow: hidden;\n`\n\nconst DataRow = styled(RowBetween)`\n justify-content: center;\n gap: 12px;\n\n ${({ theme }) => theme.mediaWidth.upToSmall`\n flex-direction: column;\n gap: 12px;\n `};\n`\n\nexport default function Manage({\n match: {\n params: { currencyId }\n }\n}: RouteComponentProps<{ currencyId: string }>) {\n const { account, chainId } = useActiveWeb3React()\n\n // get currencies and pool\n const currency = useCurrency(currencyId)\n const token = wrappedCurrency(currency ?? undefined, chainId)\n\n const [, stakingTokenPool] = usePool(token)\n const stakingInfo = useFlashLoanStakingInfo(stakingTokenPool)?.[0]\n\n // detect existing unstaked LP position to show add button if none found\n const userLiquidityUnstaked = useTokenBalance(account ?? undefined, stakingInfo?.stakedAmount?.token)\n const showAddLiquidityButton = Boolean(stakingInfo?.stakedAmount?.equalTo('0') && userLiquidityUnstaked?.equalTo('0'))\n\n // toggle for staking modal and unstaking modal\n const [showStakingModal, setShowStakingModal] = useState(false)\n const [showUnstakingModal, setShowUnstakingModal] = useState(false)\n const [showClaimRewardModal, setShowClaimRewardModal] = useState(false)\n\n // fade cards if nothing staked or nothing earned yet\n const disableTop = !stakingInfo?.stakedAmount || stakingInfo.stakedAmount.equalTo(JSBI.BigInt(0))\n\n const backgroundColor = useColor(token)\n\n // get token value of staked LP tokens\n const totalSupplyOfStakingToken = useTotalSupply(stakingInfo?.stakedAmount?.token)\n let valueOfTotalStakedAmountInToken: TokenAmount | undefined\n if (totalSupplyOfStakingToken && stakingTokenPool && stakingInfo && token) {\n // take the total amount of LP tokens staked, multiply by ETH value of all LP tokens, divide by all LP tokens\n valueOfTotalStakedAmountInToken = new TokenAmount(\n token,\n JSBI.divide(\n JSBI.multiply(stakingInfo.totalStakedAmount.raw, stakingTokenPool.reserve.raw),\n totalSupplyOfStakingToken.raw\n )\n )\n }\n\n const countUpAmount = stakingInfo?.earnedAmount?.toFixed(6) ?? '0'\n const countUpAmountPrevious = usePrevious(countUpAmount) ?? '0'\n\n const toggleWalletModal = useWalletModalToggle()\n\n const handleDepositClick = useCallback(() => {\n if (account) {\n setShowStakingModal(true)\n } else {\n toggleWalletModal()\n }\n }, [account, toggleWalletModal])\n\n return (\n \n \n {currency?.symbol} Liquidity Mining\n \n \n\n \n \n \n Total deposits\n \n {`${valueOfTotalStakedAmountInToken?.toSignificant(4, { groupSeparator: ',' }) ?? '-'} ${\n currency?.symbol\n }`}\n \n \n \n \n \n Pool Rate\n \n {stakingInfo?.active\n ? stakingInfo?.totalRewardRate\n ?.multiply(BIG_INT_SECONDS_IN_WEEK)\n ?.toFixed(0, { groupSeparator: ',' }) ?? '-'\n : '0'}\n {' DEER / week'}\n \n \n \n \n\n {showAddLiquidityButton && (\n \n \n \n \n \n \n Step 1. Get DEER-V1 Liquidity tokens\n \n \n \n {`DEER-V1 LP tokens are required. Once you've added liquidity to the ${currency?.symbol} pool you can stake your liquidity tokens on this page.`}\n \n \n \n {`Add ${currency?.symbol} liquidity`}\n \n \n \n \n \n \n )}\n\n {stakingInfo && (\n <>\n setShowStakingModal(false)}\n stakingInfo={stakingInfo}\n userLiquidityUnstaked={userLiquidityUnstaked}\n />\n setShowUnstakingModal(false)}\n stakingInfo={stakingInfo}\n />\n setShowClaimRewardModal(false)}\n stakingInfo={stakingInfo}\n />\n \n )}\n\n \n \n \n \n \n \n \n \n Your liquidity deposits\n \n \n \n {stakingInfo?.stakedAmount?.toSignificant(6) ?? '-'}\n \n DEER-V1 {currency?.symbol}\n \n \n \n \n \n \n \n \n \n
\n Your unclaimed DEER\n
\n {stakingInfo?.earnedAmount && JSBI.notEqual(BIG_INT_ZERO, stakingInfo?.earnedAmount?.raw) && (\n setShowClaimRewardModal(true)}\n >\n Claim\n \n )}\n
\n \n \n \n \n \n \n ⚡\n \n {stakingInfo?.active\n ? stakingInfo?.rewardRate\n ?.multiply(BIG_INT_SECONDS_IN_WEEK)\n ?.toSignificant(4, { groupSeparator: ',' }) ?? '-'\n : '0'}\n {' DEER / week'}\n \n \n
\n
\n
\n \n \n ⭐️\n \n When you withdraw, the contract will automagically claim DEER on your behalf!\n \n\n {!showAddLiquidityButton && (\n \n {stakingInfo && stakingInfo.active && (\n \n {stakingInfo?.stakedAmount?.greaterThan(JSBI.BigInt(0)) ? 'Deposit' : 'Deposit DEER-V1 LP Tokens'}\n \n )}\n\n {stakingInfo?.stakedAmount?.greaterThan(JSBI.BigInt(0)) && (\n <>\n setShowUnstakingModal(true)}\n >\n Withdraw\n \n \n )}\n \n )}\n {!userLiquidityUnstaked ? null : userLiquidityUnstaked.equalTo('0') ? null : !stakingInfo?.active ? null : (\n {userLiquidityUnstaked.toSignificant(6)} DEER-V1 LP tokens available\n )}\n
\n
\n )\n}\n","import React, { useContext, useMemo } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport { JSBI } from '@uniswap/sdk'\nimport { Pool as FlashLoanPool } from 'data/Pool'\nimport { Link } from 'react-router-dom'\nimport { FlashLoanPoolTabs } from '../../components/NavigationTabs'\n\nimport FullPositionCard from '../../components/FlashLoanPositionCard'\nimport { useUserHasLiquidityInAllTokens } from '../../data/V1'\nimport { useTokenBalancesWithLoadingIndicator } from '../../state/wallet/hooks'\nimport { StyledInternalLink, ExternalLink, TYPE, HideSmall } from '../../theme'\nimport { Text } from 'rebass'\nimport Card from '../../components/Card'\nimport { RowBetween, RowFixed } from '../../components/Row'\nimport { ButtonPrimary, ButtonSecondary } from '../../components/Button'\nimport { AutoColumn } from '../../components/Column'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { usePools } from '../../data/Reserves'\nimport { toFlashLoanV1LiquidityToken, useTrackedTokenPools } from '../../state/user/hooks'\nimport { Dots } from '../../components/swap/styleds'\nimport { CardSection, DataCard, CardNoise, CardBGImage } from '../../components/earn/styled'\nimport { useFlashLoanStakingInfo } from '../../state/stake/hooks'\nimport { BIG_INT_ZERO } from '../../constants'\n\nconst PageWrapper = styled(AutoColumn)`\n max-width: 640px;\n width: 100%;\n`\n\nconst VoteCard = styled(DataCard)`\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #27ae60 0%, #000000 100%);\n overflow: hidden;\n`\n\nconst TitleRow = styled(RowBetween)`\n ${({ theme }) => theme.mediaWidth.upToSmall`\n flex-wrap: wrap;\n gap: 12px;\n width: 100%;\n flex-direction: column-reverse;\n `};\n`\n\nconst ButtonRow = styled(RowFixed)`\n gap: 8px;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n width: 100%;\n flex-direction: row-reverse;\n justify-content: space-between;\n `};\n`\n\nconst ResponsiveButtonPrimary = styled(ButtonPrimary)`\n width: fit-content;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n width: 48%;\n `};\n`\n\nconst ResponsiveButtonSecondary = styled(ButtonSecondary)`\n width: fit-content;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n width: 48%;\n `};\n`\n\nconst EmptyProposals = styled.div`\n border: 1px solid ${({ theme }) => theme.text4};\n padding: 16px 12px;\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`\n\nexport default function Pool() {\n const theme = useContext(ThemeContext)\n const { account } = useActiveWeb3React()\n\n // fetch the user's balances of all tracked V2 LP tokens\n const trackedTokenPools = useTrackedTokenPools()\n const tokenPoolsWithLiquidityTokens = useMemo(\n () => trackedTokenPools.map(tokens => ({ liquidityToken: toFlashLoanV1LiquidityToken(tokens), tokens })),\n [trackedTokenPools]\n )\n const liquidityTokens = useMemo(() => tokenPoolsWithLiquidityTokens.map(tpwlt => tpwlt.liquidityToken), [\n tokenPoolsWithLiquidityTokens\n ])\n const [v1PoolsBalances, fetchingV1PoolBalances] = useTokenBalancesWithLoadingIndicator(\n account ?? undefined,\n liquidityTokens\n )\n\n // fetch the reserves for all V2 pools in which the user has a balance\n const liquidityTokensWithBalances = useMemo(\n () =>\n tokenPoolsWithLiquidityTokens.filter(({ liquidityToken }) =>\n v1PoolsBalances[liquidityToken.address]?.greaterThan('0')\n ),\n [tokenPoolsWithLiquidityTokens, v1PoolsBalances]\n )\n\n const v1Pools = usePools(liquidityTokensWithBalances.map(({ tokens }) => tokens))\n const v1IsLoading =\n fetchingV1PoolBalances || v1Pools?.length < liquidityTokensWithBalances.length || v1Pools?.some(V1Pool => !V1Pool)\n\n const allV1PoolsWithLiquidity = v1Pools\n .map(([, pool]) => pool)\n .filter((v1Pool): v1Pool is FlashLoanPool => Boolean(v1Pool))\n\n const hasV1Liquidity = useUserHasLiquidityInAllTokens()\n\n // show liquidity even if its deposited in rewards contract\n const stakingInfo = useFlashLoanStakingInfo()\n const stakingInfosWithBalance = stakingInfo?.filter(pool => JSBI.greaterThan(pool.stakedAmount.raw, BIG_INT_ZERO))\n const stakingPools = usePools(stakingInfosWithBalance?.map(stakingInfo => stakingInfo.token))\n\n // remove any pools that also are included in pools with stake in mining pool\n const v1PoolsWithoutStakedAmount = allV1PoolsWithLiquidity.filter(v1Pool => {\n return (\n stakingPools\n ?.map(stakingPool => stakingPool[1])\n .filter(stakingPool => stakingPool?.liquidityToken.address === v1Pool.liquidityToken.address).length === 0\n )\n })\n\n return (\n <>\n \n \n \n \n \n \n \n \n Liquidity provider rewards\n \n \n \n {`FlashLoan liquidity providers earn a 0.05% 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.`}\n \n \n \n \n \n \n \n\n \n \n \n \n \n Your liquidity\n \n \n \n \n Create a pool\n \n \n \n Add Liquidity\n \n \n \n \n\n {!account ? (\n \n \n Connect to a wallet to view your liquidity.\n \n \n ) : v1IsLoading ? (\n \n \n Loading\n \n \n ) : allV1PoolsWithLiquidity?.length > 0 || stakingPools?.length > 0 ? (\n <>\n \n \n \n Account analytics and accrued fees\n \n \n \n \n {v1PoolsWithoutStakedAmount.map(v1Pool => (\n \n ))}\n {stakingPools.map(\n (stakingPool, i) =>\n stakingPool[1] && ( // skip pools that arent loaded\n \n )\n )}\n \n ) : (\n \n \n No liquidity found.\n \n \n )}\n\n \n \n {hasV1Liquidity ? 'Uniswap V1 liquidity found!' : \"Don't see a pool you joined?\"}{' '}\n \n {hasV1Liquidity ? 'Migrate now.' : 'Import it.'}\n \n \n \n \n \n \n \n )\n}\n","import { Currency, ETHER, JSBI, TokenAmount } from '@uniswap/sdk'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport { Text } from 'rebass'\nimport { ButtonDropdownLight } from '../../components/Button'\nimport { LightCard } from '../../components/Card'\nimport { AutoColumn, ColumnCenter } from '../../components/Column'\nimport CurrencyLogo from '../../components/CurrencyLogo'\nimport { FindPoolTabs } from '../../components/NavigationTabs'\nimport { MinimalPositionCard } from '../../components/FlashLoanPositionCard'\nimport Row from '../../components/Row'\nimport CurrencySearchModal from '../../components/SearchModal/CurrencySearchModal'\nimport { PairState, usePool } from '../../data/Reserves'\nimport { useActiveWeb3React } from '../../hooks'\nimport { usePoolAdder } from '../../state/user/hooks'\nimport { useTokenBalance } from '../../state/wallet/hooks'\nimport { StyledInternalLink } from '../../theme'\nimport { currencyId } from '../../utils/currencyId'\nimport AppBody from '../AppBody'\nimport { Dots } from '../Pool/styleds'\nimport { BlueCard } from '../../components/Card'\nimport { TYPE } from '../../theme'\n\nexport default function FlashLoanPoolFider() {\n const { account } = useActiveWeb3React()\n\n const [showSearch, setShowSearch] = useState(false)\n\n const [currency, setCurrency] = useState(ETHER)\n\n const [poolState, pool] = usePool(currency ?? undefined)\n const addPool = usePoolAdder()\n useEffect(() => {\n if (pool) {\n addPool(pool)\n }\n }, [pool, addPool])\n\n const validPoolNoLiquidity: boolean =\n poolState === PairState.NOT_EXISTS ||\n Boolean(poolState === PairState.EXISTS && pool && JSBI.equal(pool.reserve.raw, JSBI.BigInt(0)))\n\n const position: TokenAmount | undefined = useTokenBalance(account ?? undefined, pool?.liquidityToken)\n const hasPosition = Boolean(position && JSBI.greaterThan(position.raw, JSBI.BigInt(0)))\n\n const handleCurrencySelect = useCallback((currency: Currency) => {\n setCurrency(currency)\n }, [])\n\n const handleSearchDismiss = useCallback(() => {\n setShowSearch(false)\n }, [setShowSearch])\n\n const prerequisiteMessage = (\n \n \n {!account ? 'Connect to a wallet to find pools' : 'Select a token to find your liquidity.'}\n \n \n )\n\n return (\n \n \n \n \n \n \n Tip: Use this tool to find pairs that don't automatically appear in the interface.\n \n \n \n {\n setShowSearch(true)\n }}\n >\n {currency ? (\n \n \n \n {currency.symbol}\n \n \n ) : (\n \n Select a Token\n \n )}\n \n\n {hasPosition && (\n \n \n Pool Found!\n \n \n Manage this pool.\n \n \n )}\n\n {currency ? (\n poolState === PairState.EXISTS ? (\n hasPosition && pool ? (\n \n ) : (\n \n \n You don’t have liquidity in this pool yet.\n \n Add liquidity.\n \n \n \n )\n ) : validPoolNoLiquidity ? (\n \n \n No pool found.\n Create pool.\n \n \n ) : poolState === PairState.INVALID ? (\n \n \n \n Invalid pair.\n \n \n \n ) : poolState === PairState.LOADING ? (\n \n \n \n Loading\n \n \n \n \n ) : null\n ) : (\n prerequisiteMessage\n )}\n \n\n \n \n )\n}\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 = 'CURRENCY'\n}\n\nexport const typeInput = createAction<{ field: Field; typedValue: string }>('flashLoanBurn/typeInputBurn')\n","import { Currency, CurrencyAmount, JSBI, Percent, TokenAmount } from '@uniswap/sdk'\nimport { Pool } from 'data/Pool'\nimport { useCallback } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { usePool } 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['flashLoanBurn'] {\n return useSelector(state => state.flashLoanBurn)\n}\n\nexport function useDerivedBurnInfo(\n currency: Currency | undefined\n): {\n pool?: Pool | null\n parsedAmounts: {\n [Field.LIQUIDITY_PERCENT]: Percent\n [Field.LIQUIDITY]?: TokenAmount\n [Field.CURRENCY]?: CurrencyAmount\n }\n error?: string\n} {\n const { account, chainId } = useActiveWeb3React()\n\n const { independentField, typedValue } = useBurnState()\n\n // pair + totalsupply\n const [, pool] = usePool(currency)\n\n // balances\n const relevantTokenBalances = useTokenBalances(account ?? undefined, [pool?.liquidityToken])\n const userLiquidity: undefined | TokenAmount = relevantTokenBalances?.[pool?.liquidityToken?.address ?? '']\n\n const token = wrappedCurrency(currency, chainId)\n const tokens = {\n [Field.CURRENCY]: token,\n [Field.LIQUIDITY]: pool?.liquidityToken\n }\n\n // liquidity values\n const totalSupply = useTotalSupply(pool?.liquidityToken)\n const liquidityValue =\n pool &&\n totalSupply &&\n userLiquidity &&\n token &&\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(token, pool.getLiquidityValue(token, totalSupply, userLiquidity, false).raw)\n : undefined\n const liquidityValues: { [Field.CURRENCY]?: TokenAmount } = {\n [Field.CURRENCY]: liquidityValue\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 (pool?.liquidityToken) {\n const independentAmount = tryParseAmount(typedValue, pool.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\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]?: 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]:\n token && percentToRemove && percentToRemove.greaterThan('0') && liquidityValue\n ? new TokenAmount(token, percentToRemove.multiply(liquidityValue.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]) {\n error = error ?? 'Enter an amount'\n }\n\n return { pool: pool, 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 '@uniswap/sdk'\nimport React, { useCallback, useContext, useMemo, useState } from 'react'\nimport { ArrowDown } 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 { BlueCard, LightCard } from '../../components/Card'\nimport { AutoColumn, ColumnCenter } from '../../components/Column'\nimport TransactionConfirmationModal, { ConfirmationModalContent } from '../../components/TransactionConfirmationModal'\nimport CurrencyInputPanel from '../../components/CurrencyInputPanel'\nimport { AddRemoveTabs } from '../../components/NavigationTabs'\nimport { MinimalPositionCard } from '../../components/FlashLoanPositionCard'\nimport Row, { RowBetween, RowFixed } from '../../components/Row'\n\nimport Slider from '../../components/Slider'\nimport CurrencyLogo from '../../components/CurrencyLogo'\nimport { ROUTER_ADDRESS } from '../../constants/flashLoan'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency } from '../../hooks/Tokens'\nimport { useFlashLoanPoolContract } from '../../hooks/useContract'\nimport useIsArgentWallet from '../../hooks/useIsArgentWallet'\nimport useTransactionDeadline from '../../hooks/useTransactionDeadline'\n\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport { StyledInternalLink, TYPE } from '../../theme'\nimport { calculateGasMargin, getFlashLoanRouterContract } from '../../utils'\nimport { currencyId as toCurrencyId } 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/flashLoanBurn/hooks'\nimport { useDerivedBurnInfo, useBurnState } from '../../state/flashLoanBurn/hooks'\nimport { Field } from '../../state/flashLoanBurn/actions'\nimport { useWalletModalToggle } from '../../state/application/hooks'\nimport { BigNumber } from '@ethersproject/bignumber'\n\nexport default function RemoveFlashLoanLiquidity({\n history,\n match: {\n params: { currencyId }\n }\n}: RouteComponentProps<{ currencyId: string }>) {\n const currency = useCurrency(currencyId) ?? undefined\n const { account, chainId, library } = useActiveWeb3React()\n const token = useMemo(() => wrappedCurrency(currency, chainId), [currency, chainId])\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 { pool, parsedAmounts, error } = useDerivedBurnInfo(currency ?? 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\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]:\n independentField === Field.CURRENCY ? typedValue : parsedAmounts[Field.CURRENCY]?.toSignificant(6) ?? ''\n }\n\n const atMaxAmount = parsedAmounts[Field.LIQUIDITY_PERCENT]?.equalTo(new Percent('1'))\n\n // pair contract\n const poolContract: Contract | null = useFlashLoanPoolContract(pool?.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 const isArgentWallet = useIsArgentWallet()\n\n async function onAttemptToApprove() {\n if (!poolContract || !pool || !library || !deadline) throw new Error('missing dependencies')\n const liquidityAmount = parsedAmounts[Field.LIQUIDITY]\n if (!liquidityAmount) throw new Error('missing liquidity amount')\n\n if (isArgentWallet) {\n return approveCallback()\n }\n\n // try to gather a signature for permission\n const nonce = await poolContract.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: 'Deer FlashLoan V1',\n version: '1',\n chainId: chainId,\n verifyingContract: pool.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 }\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 onCurrencyInput = useCallback((typedValue: string): void => onUserInput(Field.CURRENCY, 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]: currencyAmount } = parsedAmounts\n if (!currencyAmount) {\n throw new Error('missing currency amounts')\n }\n const router = getFlashLoanRouterContract(chainId, library, account)\n\n if (!currency) throw new Error('missing tokens')\n const liquidityAmount = parsedAmounts[Field.LIQUIDITY]\n if (!liquidityAmount) throw new Error('missing liquidity amount')\n\n const oneCurrencyIsETH = currency === ETHER\n\n if (!token) 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']\n args = [liquidityAmount.raw.toString(), account, deadline.toHexString()]\n }\n // removeLiquidity\n else {\n methodNames = ['removeLiquidity']\n args = [token.address, liquidityAmount.raw.toString(), account, deadline.toHexString()]\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']\n args = [\n liquidityAmount.raw.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 token.address,\n liquidityAmount.raw.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: 'Remove ' + parsedAmounts[Field.CURRENCY]?.toSignificant(3) + ' ' + currency?.symbol\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Liquidity',\n action: 'Remove',\n label: currency?.symbol\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]?.toSignificant(6)}\n \n \n \n \n {currency?.symbol}\n \n \n \n \n )\n }\n\n function modalBottom() {\n return (\n <>\n \n \n {'DEER ' + currency?.symbol} Burned\n \n \n \n \n {parsedAmounts[Field.LIQUIDITY]?.toSignificant(6)}\n \n \n \n \n \n Confirm\n \n \n \n )\n }\n\n const pendingText = `Removing ${parsedAmounts[Field.CURRENCY]?.toSignificant(6)} ${currency?.symbol}`\n\n const liquidityPercentChangeCallback = useCallback(\n (value: number) => {\n onUserInput(Field.LIQUIDITY_PERCENT, value.toString())\n },\n [onUserInput]\n )\n\n const oneCurrencyIsETH = currency === ETHER\n const oneCurrencyIsWETH = Boolean(chainId && currency && currencyEquals(WETH[chainId], currency))\n\n const handleSelectCurrency = useCallback(\n (currency: Currency) => {\n history.push(`/remove/${toCurrencyId(currency)}`)\n },\n [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 Tip: Removing pool tokens converts your position back into underlying tokens at the current\n rate, proportional to your share of the pool. Accrued fees are included in the amounts you receive.\n \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] || '-'}\n \n \n \n \n {currency?.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={pool?.liquidityToken}\n pool={pool}\n id=\"liquidity-amount\"\n />\n \n \n \n onUserInput(Field.LIQUIDITY_PERCENT, '100')}\n showMaxButton={!atMaxAmount}\n currency={currency}\n label={'Output'}\n onCurrencySelect={handleSelectCurrency}\n id=\"remove-liquidity-tokena\"\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]}\n >\n \n {error || 'Remove'}\n \n \n \n )}\n
\n
\n
\n
\n\n {pool ? (\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 styled from 'styled-components'\n\nconst handleColorType = (status?: any, theme?: any) => {\n switch (status) {\n case 'pending':\n return theme.blue1\n case 'active':\n return theme.blue1\n case 'succeeded':\n return theme.green1\n case 'defeated':\n return theme.red1\n case 'queued':\n return theme.text3\n case 'executed':\n return theme.green1\n case 'canceled':\n return theme.text3\n case 'expired':\n return theme.text3\n default:\n return theme.text3\n }\n}\n\nexport const ProposalStatus = styled.span<{ status: string }>`\n font-size: 0.825rem;\n font-weight: 600;\n padding: 0.5rem;\n border-radius: 8px;\n color: ${({ status, theme }) => handleColorType(status, theme)};\n border: 1px solid ${({ status, theme }) => handleColorType(status, theme)};\n width: fit-content;\n justify-self: flex-end;\n text-transform: uppercase;\n`\n","import { UNI, PRELOADED_PROPOSALS, DEER } from './../../constants/index'\nimport { TokenAmount } from '@uniswap/sdk'\nimport { isAddress } from 'ethers/lib/utils'\nimport { useDeerContract, useGovernanceContract, useUniContract } from '../../hooks/useContract'\nimport { useSingleCallResult, useSingleContractMultipleData } from '../multicall/hooks'\nimport { useActiveWeb3React } from '../../hooks'\nimport { ethers, utils } from 'ethers'\nimport { calculateGasMargin } from '../../utils'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { useTransactionAdder } from '../transactions/hooks'\nimport { useState, useEffect, useCallback } from 'react'\nimport { abi as GOV_ABI } from '@uniswap/governance/build/GovernorAlpha.json'\n\ninterface ProposalDetail {\n target: string\n functionSig: string\n callData: string\n}\n\nexport interface ProposalData {\n id: string\n title: string\n description: string\n proposer: string\n status: string\n forCount: number\n againstCount: number\n startBlock: number\n endBlock: number\n details: ProposalDetail[]\n}\n\nconst enumerateProposalState = (state: number) => {\n const proposalStates = ['pending', 'active', 'canceled', 'defeated', 'succeeded', 'queued', 'expired', 'executed']\n return proposalStates[state]\n}\n\n// get count of all proposals made\nexport function useProposalCount(): number | undefined {\n const gov = useGovernanceContract()\n const res = useSingleCallResult(gov, 'proposalCount')\n if (res.result && !res.loading) {\n return parseInt(res.result[0])\n }\n return undefined\n}\n\n/**\n * Need proposal events to get description data emitted from\n * new proposal event.\n */\nexport function useDataFromEventLogs() {\n const { library } = useActiveWeb3React()\n const [formattedEvents, setFormattedEvents] = useState()\n const govContract = useGovernanceContract()\n\n // create filter for these specific events\n const filter = { ...govContract?.filters?.['ProposalCreated'](), fromBlock: 0, toBlock: 'latest' }\n const eventParser = new ethers.utils.Interface(GOV_ABI)\n\n useEffect(() => {\n async function fetchData() {\n const pastEvents = await library?.getLogs(filter)\n // reverse events to get them from newest to odlest\n const formattedEventData = pastEvents\n ?.map(event => {\n const eventParsed = eventParser.parseLog(event).args\n return {\n description: eventParsed.description,\n details: eventParsed.targets.map((target: string, i: number) => {\n const signature = eventParsed.signatures[i]\n const [name, types] = signature.substr(0, signature.length - 1).split('(')\n\n const calldata = eventParsed.calldatas[i]\n const decoded = utils.defaultAbiCoder.decode(types.split(','), calldata)\n\n return {\n target,\n functionSig: name,\n callData: decoded.join(', ')\n }\n })\n }\n })\n .reverse()\n setFormattedEvents(formattedEventData)\n }\n if (!formattedEvents) {\n fetchData()\n }\n }, [eventParser, filter, library, formattedEvents])\n\n return formattedEvents\n}\n\n// get data for all past and active proposals\nexport function useAllProposalData() {\n const proposalCount = useProposalCount()\n const govContract = useGovernanceContract()\n\n const proposalIndexes = []\n for (let i = 1; i <= (proposalCount ?? 0); i++) {\n proposalIndexes.push([i])\n }\n\n // get metadata from past events\n const formattedEvents = useDataFromEventLogs()\n\n // get all proposal entities\n const allProposals = useSingleContractMultipleData(govContract, 'proposals', proposalIndexes)\n\n // get all proposal states\n const allProposalStates = useSingleContractMultipleData(govContract, 'state', proposalIndexes)\n\n if (formattedEvents && allProposals && allProposalStates) {\n allProposals.reverse()\n allProposalStates.reverse()\n\n return allProposals\n .filter((p, i) => {\n return Boolean(p.result) && Boolean(allProposalStates[i]?.result) && Boolean(formattedEvents[i])\n })\n .map((p, i) => {\n const description = PRELOADED_PROPOSALS.get(allProposals.length - i - 1) || formattedEvents[i].description\n const formattedProposal: ProposalData = {\n id: allProposals[i]?.result?.id.toString(),\n title: description?.split(/# |\\n/g)[1] || 'Untitled',\n description: description || 'No description.',\n proposer: allProposals[i]?.result?.proposer,\n status: enumerateProposalState(allProposalStates[i]?.result?.[0]) ?? 'Undetermined',\n forCount: parseFloat(ethers.utils.formatUnits(allProposals[i]?.result?.forVotes.toString(), 18)),\n againstCount: parseFloat(ethers.utils.formatUnits(allProposals[i]?.result?.againstVotes.toString(), 18)),\n startBlock: parseInt(allProposals[i]?.result?.startBlock?.toString()),\n endBlock: parseInt(allProposals[i]?.result?.endBlock?.toString()),\n details: formattedEvents[i].details\n }\n return formattedProposal\n })\n } else {\n return []\n }\n}\n\nexport function useProposalData(id: string): ProposalData | undefined {\n const allProposalData = useAllProposalData()\n return allProposalData?.find(p => p.id === id)\n}\n\n// get the users delegatee if it exists\nexport function useUserDelegatee(): string {\n const { account } = useActiveWeb3React()\n const uniContract = useUniContract()\n const { result } = useSingleCallResult(uniContract, 'delegates', [account ?? undefined])\n return result?.[0] ?? undefined\n}\n\nexport function useDeerUserDelegatee(): string {\n const { account } = useActiveWeb3React()\n const deerContract = useDeerContract()\n const { result } = useSingleCallResult(deerContract, 'delegates', [account ?? undefined])\n return result?.[0] ?? undefined\n}\n\n// gets the users current votes\nexport function useUserVotes(): TokenAmount | undefined {\n const { account, chainId } = useActiveWeb3React()\n const uniContract = useUniContract()\n\n // check for available votes\n const uni = chainId ? UNI[chainId] : undefined\n const votes = useSingleCallResult(uniContract, 'getCurrentVotes', [account ?? undefined])?.result?.[0]\n return votes && uni ? new TokenAmount(uni, votes) : undefined\n}\n\nexport function useDeerUserVotes(): TokenAmount | undefined {\n const { account, chainId } = useActiveWeb3React()\n const deerContract = useDeerContract()\n\n // check for available votes\n const deer = chainId ? DEER[chainId] : undefined\n const votes = useSingleCallResult(deerContract, 'getCurrentVotes', [account ?? undefined])?.result?.[0]\n return votes && deer ? new TokenAmount(deer, votes) : undefined\n}\n\n// fetch available votes as of block (usually proposal start block)\nexport function useUserVotesAsOfBlock(block: number | undefined): TokenAmount | undefined {\n const { account, chainId } = useActiveWeb3React()\n const uniContract = useUniContract()\n\n // check for available votes\n const uni = chainId ? UNI[chainId] : undefined\n const votes = useSingleCallResult(uniContract, 'getPriorVotes', [account ?? undefined, block ?? undefined])\n ?.result?.[0]\n return votes && uni ? new TokenAmount(uni, votes) : undefined\n}\n\n// fetch available votes as of block (usually proposal start block)\nexport function useUserDeerVotesAsOfBlock(block: number | undefined): TokenAmount | undefined {\n const { account, chainId } = useActiveWeb3React()\n const deerContract = useDeerContract()\n\n // check for available votes\n const deer = chainId ? DEER[chainId] : undefined\n const votes = useSingleCallResult(deerContract, 'getPriorVotes', [account ?? undefined, block ?? undefined])\n ?.result?.[0]\n return votes && deer ? new TokenAmount(deer, votes) : undefined\n}\n\nexport function useDelegateCallback(): (delegatee: string | undefined) => undefined | Promise {\n const { account, chainId, library } = useActiveWeb3React()\n const addTransaction = useTransactionAdder()\n\n const uniContract = useUniContract()\n\n return useCallback(\n (delegatee: string | undefined) => {\n if (!library || !chainId || !account || !isAddress(delegatee ?? '')) return undefined\n const args = [delegatee]\n if (!uniContract) throw new Error('No UNI Contract!')\n return uniContract.estimateGas.delegate(...args, {}).then(estimatedGasLimit => {\n return uniContract\n .delegate(...args, { value: null, gasLimit: calculateGasMargin(estimatedGasLimit) })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Delegated votes`\n })\n return response.hash\n })\n })\n },\n [account, addTransaction, chainId, library, uniContract]\n )\n}\n\nexport function useDeerDelegateCallback(): (delegatee: string | undefined) => undefined | Promise {\n const { account, chainId, library } = useActiveWeb3React()\n const addTransaction = useTransactionAdder()\n\n const deerContract = useDeerContract()\n\n return useCallback(\n (delegatee: string | undefined) => {\n if (!library || !chainId || !account || !isAddress(delegatee ?? '')) return undefined\n const args = [delegatee]\n if (!deerContract) throw new Error('No DEER Contract!')\n return deerContract.estimateGas.delegate(...args, {}).then(estimatedGasLimit => {\n return deerContract\n .delegate(...args, { value: null, gasLimit: calculateGasMargin(estimatedGasLimit) })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Delegated votes`\n })\n return response.hash\n })\n })\n },\n [account, addTransaction, chainId, library, deerContract]\n )\n}\n\nexport function useVoteCallback(): {\n voteCallback: (proposalId: string | undefined, support: boolean) => undefined | Promise\n} {\n const { account } = useActiveWeb3React()\n\n const govContract = useGovernanceContract()\n const addTransaction = useTransactionAdder()\n\n const voteCallback = useCallback(\n (proposalId: string | undefined, support: boolean) => {\n if (!account || !govContract || !proposalId) return\n const args = [proposalId, support]\n return govContract.estimateGas.castVote(...args, {}).then(estimatedGasLimit => {\n return govContract\n .castVote(...args, { value: null, gasLimit: calculateGasMargin(estimatedGasLimit) })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Voted ${support ? 'for ' : 'against'} proposal ${proposalId}`\n })\n return response.hash\n })\n })\n },\n [account, addTransaction, govContract]\n )\n return { voteCallback }\n}\n","import React, { useState } from 'react'\n\nimport Modal from '../Modal'\nimport { AutoColumn } from '../Column'\nimport styled from 'styled-components'\nimport { RowBetween } from '../Row'\nimport { TYPE } from '../../theme'\nimport { X } from 'react-feather'\nimport { ButtonPrimary } from '../Button'\nimport { useActiveWeb3React } from '../../hooks'\nimport AddressInputPanel from '../AddressInputPanel'\nimport { isAddress } from 'ethers/lib/utils'\nimport useENS from '../../hooks/useENS'\nimport { useDeerDelegateCallback } from '../../state/governance/hooks'\nimport { useTokenBalance } from '../../state/wallet/hooks'\nimport { DEER } from '../../constants'\nimport { LoadingView, SubmittedView } from '../ModalViews'\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n padding: 24px;\n`\n\nconst StyledClosed = styled(X)`\n :hover {\n cursor: pointer;\n }\n`\n\nconst TextButton = styled.div`\n :hover {\n cursor: pointer;\n }\n`\n\ninterface VoteModalProps {\n isOpen: boolean\n onDismiss: () => void\n title: string\n}\n\nexport default function DelegateModal({ isOpen, onDismiss, title }: VoteModalProps) {\n const { account, chainId } = useActiveWeb3React()\n\n // state for delegate input\n const [usingDelegate, setUsingDelegate] = useState(false)\n const [typed, setTyped] = useState('')\n function handleRecipientType(val: string) {\n setTyped(val)\n }\n\n // monitor for self delegation or input for third part delegate\n // default is self delegation\n const activeDelegate = usingDelegate ? typed : account\n const { address: parsedAddress } = useENS(activeDelegate)\n\n // get the number of votes available to delegate\n const deerBalance = useTokenBalance(account ?? undefined, chainId ? DEER[chainId] : undefined)\n\n const delegateCallback = useDeerDelegateCallback()\n\n // monitor call to help UI loading state\n const [hash, setHash] = useState()\n const [attempting, setAttempting] = useState(false)\n\n // wrapper to reset state on modal close\n function wrappedOndismiss() {\n setHash(undefined)\n setAttempting(false)\n onDismiss()\n }\n\n async function onDelegate() {\n setAttempting(true)\n\n // if callback not returned properly ignore\n if (!delegateCallback) return\n\n // try delegation and store hash\n const hash = await delegateCallback(parsedAddress ?? undefined)?.catch(error => {\n setAttempting(false)\n console.log(error)\n })\n\n if (hash) {\n setHash(hash)\n }\n }\n\n return (\n \n {!attempting && !hash && (\n \n \n \n {title}\n \n \n Earned DEER tokens represent voting shares in Uniswap governance.\n \n You can either vote on each proposal yourself or delegate your votes to a third party.\n \n {usingDelegate && }\n \n {usingDelegate ? 'Delegate Votes' : 'Self Delegate'}\n \n setUsingDelegate(!usingDelegate)}>\n \n {usingDelegate ? 'Remove' : 'Add'} Delegate {!usingDelegate && '+'}\n \n \n \n \n )}\n {attempting && !hash && (\n \n \n {usingDelegate ? 'Delegating votes' : 'Unlocking Votes'}\n {deerBalance?.toSignificant(4)}\n \n \n )}\n {hash && (\n \n \n Transaction Submitted\n {deerBalance?.toSignificant(4)}\n \n \n )}\n \n )\n}\n","import React from 'react'\nimport { AutoColumn } from '../../components/Column'\nimport styled from 'styled-components'\nimport { TYPE, ExternalLink } from '../../theme'\nimport { RowBetween, RowFixed } from '../../components/Row'\nimport { Link } from 'react-router-dom'\nimport { ProposalStatus } from './styled'\nimport { ButtonPrimary } from '../../components/Button'\n\nimport { Button } from 'rebass/styled-components'\nimport { darken } from 'polished'\nimport { CardSection, DataCard, CardNoise, CardBGImage } from '../../components/earn/styled'\nimport { ProposalData, useUserVotes, useDeerUserDelegatee, useAllProposalData } from '../../state/governance/hooks'\nimport DelegateModal from '../../components/deerVote/DelegateModal'\nimport { useTokenBalance } from '../../state/wallet/hooks'\nimport { useActiveWeb3React } from '../../hooks'\nimport { DEER, ZERO_ADDRESS } from '../../constants'\nimport { JSBI, TokenAmount, ChainId } from '@uniswap/sdk'\nimport { shortenAddress, getEtherscanLink, geGovContract, calculateGasMargin } from '../../utils'\nimport Loader from '../../components/Loader'\nimport FormattedCurrencyAmount from '../../components/FormattedCurrencyAmount'\nimport { useModalOpen, useToggleDelegateModal } from '../../state/application/hooks'\nimport { ApplicationModal } from '../../state/application/actions'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { BigNumber } from '@ethersproject/bignumber'\n\nconst PageWrapper = styled(AutoColumn)``\n\nconst TopSection = styled(AutoColumn)`\n max-width: 640px;\n width: 100%;\n`\n\nconst Proposal = styled(Button)`\n padding: 0.75rem 1rem;\n width: 100%;\n margin-top: 1rem;\n border-radius: 12px;\n display: grid;\n grid-template-columns: 48px 1fr 120px;\n align-items: center;\n text-align: left;\n outline: none;\n cursor: pointer;\n color: ${({ theme }) => theme.text1};\n text-decoration: none;\n background-color: ${({ theme }) => theme.bg1};\n &:focus {\n background-color: ${({ theme }) => darken(0.05, theme.bg1)};\n }\n &:hover {\n background-color: ${({ theme }) => darken(0.05, theme.bg1)};\n }\n`\n\nconst ProposalNumber = styled.span`\n opacity: 0.6;\n`\n\nconst ProposalTitle = styled.span`\n font-weight: 600;\n`\n\nconst VoteCard = styled(DataCard)`\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #27ae60 0%, #000000 100%);\n overflow: hidden;\n`\n\nconst WrapSmall = styled(RowBetween)`\n ${({ theme }) => theme.mediaWidth.upToSmall`\n flex-wrap: wrap;\n \n `};\n`\n\nconst TextButton = styled(TYPE.main)`\n color: ${({ theme }) => theme.primary1};\n :hover {\n cursor: pointer;\n text-decoration: underline;\n }\n`\n\nconst AddressButton = styled.div`\n border: 1px solid ${({ theme }) => theme.bg3};\n padding: 2px 4px;\n border-radius: 8px;\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nconst StyledExternalLink = styled(ExternalLink)`\n color: ${({ theme }) => theme.text1};\n`\n\nconst EmptyProposals = styled.div`\n border: 1px solid ${({ theme }) => theme.text4};\n padding: 16px 12px;\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`\n\nexport default function DeerVote() {\n const { account, chainId, library } = useActiveWeb3React()\n\n // toggle for showing delegation modal\n const showDelegateModal = useModalOpen(ApplicationModal.DELEGATE)\n const toggleDelegateModal = useToggleDelegateModal()\n\n // get data to list all proposals\n const allProposals: ProposalData[] = useAllProposalData()\n\n // user data\n const availableVotes: TokenAmount | undefined = useUserVotes()\n const deerBalance: TokenAmount | undefined = useTokenBalance(account ?? undefined, chainId ? DEER[chainId] : undefined)\n const userDelegatee: string | undefined = useDeerUserDelegatee()\n\n // show delegation option if they have have a balance, but have not delegated\n const showUnlockVoting = Boolean(\n deerBalance && JSBI.notEqual(deerBalance.raw, JSBI.BigInt(0)) && userDelegatee === ZERO_ADDRESS\n )\n\n async function createPropose() {\n if (!chainId || !library || !account) return\n \n const govContract = geGovContract(chainId, library, account)\n const estimate = govContract.estimateGas.propose\n const method: (...args: any) => Promise = govContract.propose\n\n// const reduceUni = \n// `# Reduce UNI Governance Proposal & Quorum Thresholds\n\n// Uniswap's governance system currently has high thresholds for proposal submission and quorum relative to total delegated UNI. Since the launch of the governance system, there have been [discussions](https://gov.uniswap.org/t/proposal-reduce-amount-of-unis-required-to-submit-governance-proposal/3320) on [lowering these thresholds](https://gov.uniswap.org/t/proposal-reduce-amount-of-unis-required-to-submit-governance-proposal/3320/29) to make governance more accessible.\n\n// Having followed these discussions from the beginning, Dharma has prepared a proposal that we think achieves the goal of making governance more accessible, while still ensuring that Uniswap governance is not subject to unilateral deleterious actors. _We propose a threshold of 3m UNI for proposal submission, and 30m UNI as quorum._\n\n// In order to achieve this reduction in thresholds, a new \\`GovernorAlpha\\` contract is required. To that end, we have [deployed a new contract](https://etherscan.io/address/0xeca491e162d157760f167c4dd92b45ae6e5cf0f1#code) which contains the following changes:\n// - \\`quorumVotes\\` has been changed from \\`40_000_000e18\\` to \\`30_000_000e18\\`, i.e. from 4% to 3%.\n// - \\`proposalThreshold\\` has been modified from \\`10_000_000e18\\` to \\`3_000_000e18\\`, i.e. from 1% to 0.3%.\n// - a public \\`__acceptAdmin()\\` function has been added, allowing the contract to claim ownership over the \\`Timelock\\` contract once \\`setPendingAdmin\\` has been executed.\n// - \\`timelock\\` and \\`uni\\` are now declared as \\`constant\\` instead of via assignment to storage slots during contract construction, as their values are not modifiable after deployment (and use of \\`immutable\\` would necessitate a major Solidity version bump and corresponding refactor of already well-audited code).\n\n// We believe this proposal will help foster a vibrant Uniswap governance process, and we are excited to participate in these governance decisions.`\n\n// const retroactiveAirdropDescription = \n// `# Retroactive Proxy Contract Airdrop — Phase One\n\n// ## Context\n\n// - Why: [Retroactive Airdrop Excludes Proxy Contract Users)](https://gov.uniswap.org/t/retroactive-airdrop-excludes-proxy-contract-users-e-g-dharma-matcha-etc/1222)\n// - How: [Application For Retroactive Proxy Contract Airdrop [For Projects / Apps]](https://gov.uniswap.org/t/application-for-retroactive-proxy-contract-airdrop-for-projects-apps/3221)\n// - Phase 1 Details: [[Proposal] Excluded Proxy Contract Airdrop — Phase 1](https://gov.uniswap.org/t/proposal-excluded-proxy-contract-airdrop-phase-1/)\n// - Intention-to-Submit Announcement: [Announcing Dharma’s Intention to Propose the Retroactive UNI Distribution](https://gov.uniswap.org/t/announcing-dharmas-intention-to-propose-the-retroactive-uni-distribution/7450)\n// - Code: [https://github.com/dharmaprotocol/excluded-uni-airdrop-users](https://github.com/dharmaprotocol/excluded-uni-airdrop-users)\n// - Contract: [RetroactiveMerkleDistributorPhaseOne](https://etherscan.io/address/0x967f2c0826af779a09e42eff7bfadad7618b55e5#code)\n// - Merkle Root and claims: [phase-one-merkle-root-and-claims.json](https://raw.githubusercontent.com/dharmaprotocol/excluded-uni-airdrop-users/master/merkle-roots-and-claims/phase-one-merkle-root-and-claims.json)\n\n// ## Description\n\n// This proposal brings to a formal vote the Retroactive Distribution, discussed at length in the above links.\n\n// This proposal retroactively distributes 400 UNI to 12,619 distinct addresses who interacted with Uniswap via a proxy contract. These 12,619 users are \"Phase 1\" of the Retroactive Distribution, encompassing users of application-integrations. All of these 12,619 addresses were excluded from the original airdrop.\n\n// The Phase determination was made based on how easy it is to programmatically hook a trading bot into them, as this is a proxy for what portion of these cohorts risk representing multiple addresses per end-user. Phase 1 is the less programmatically accessible cohort, indicating a lower likelihood of multiple addresses per end-user.\n\n// Specifically, this proposal transfers 5,047,600 UNI to a new MerkleDistributor contract, which will then allow for 400 UNI to be claimed by each of the 12,619 accounts held by users of the following projects:\n\n// | Project | Accounts | % of total |\n// |------------|----------|------------|\n// | Argent | 3418 | 27.09% |\n// | DeFi Saver | 890 | 7.05% |\n// | Dharma | 2833 | 22.45% |\n// | eidoo | 301 | 2.39% |\n// | FURUCOMBO | 57 | 0.45% |\n// | MEW | 4278 | 33.90% |\n// | Monolith | 19 | 0.15% |\n// | Nuo | 740 | 5.86% |\n// | Opyn | 79 | 0.63% |\n// | rebalance | 4 | 0.03% |\n\n// ## Additional Considerations\n\n// ### 1. No Repeat Retroactive Airdrop Proposals\n\n// Dharma is committed to carrying out the Retroactive Airdrop proposal. This includes proposing Phase 1, and, if Phase 1 passes, proposing Phase 2.\n\n// If either Phase fails, we will accept that as the final determination of the Uniswap community. Should both Phases pass, we will not vote in favor of any further retroactive airdops.\n\n// ### 2. Dharma's Commitment to Uniswap Governance\n\n// Dharma is committed to being an active, engaged member of Uniswap governance, just as we have been in the Compound community.\n\n// As a signal of this commitment, if this proposal passes, we will commit to:\n// - Giving Dharma users the ability to delegate their UNI holdings for voting, as well as to vote directly with their UNI holdings.\n// - Participating in the development of a Uniswap Improvement Proposal (UIP) Process in collaboration with other engaged community members.`\n\nconst deerfiGrants = `# Deerfi Grants Program v0.1\n\n*co-authored with [Ken Ng](https://twitter.com/nkennethk?lang=en)*\n\n## Summary:\n\n**This post outlines a framework for funding Uniswap ecosystem development with grants from the[ UNI Community Treasury](https://uniswap.org/blog/uni/).** The program starts small—sponsoring hackathons, [for example](https://gov.uniswap.org/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.\n\n**Purpose:**\n\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.\n\n**Quarterly Budget:**\n\n* Max quarterly budget of up to $750k\n* Budget and caps to be assessed every six months\n\n**Grant Allocation Committee:**\n\n* Of 6 committee members: 1 lead and 5 reviewers\n* Each committee has a term of 2 quarters (6 months) after which the program needs to be renewed by UNI governance\n* Committee functions as a 4 of 5 multi-sig\n\n**Committee Members**\n\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.**\n\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.\n\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.\n\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.\n\n**Program Lead:** [Ken Ng](https://twitter.com/nkennethk?lang=en) (HL Creative Corp)\n*Ecosystem Support Program at the Ethereum Foundation*\n\n1. Reviewer: [Jesse Walden](https://twitter.com/jessewldn) (o/b/o Unofficial LLC dba [Variant Fund](http://twitter.com/variantfund))\n*Founder and Investor at Variant Fund (holds UNI)*\n\n2. Reviewer: [Monet Supply](https://twitter.com/MonetSupply)\n*Risk Analyst at MakerDAO*\n\n3. Reviewer: [Robert Leshner](https://twitter.com/rleshner)\n*Founder and CEO of Compound Finance*\n\n4. Reviewer: [Kain Warwick](https://twitter.com/kaiynne)\n*Founder of Synthetix*\n\n5. Reviewer: [Ashleigh Schap](https://twitter.com/ashleighschap)\n*Growth Lead, Uniswap (Company)*\n\n## Methodology\n\n**1.1 Budget**\n\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).\n\nThe UGP will be funded by the UNI treasury according to the[ release schedule](https://uniswap.org/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).\n\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.\n\n**1.2 Committee Compensation**\n\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.\n\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 .\n\n**2.1 Priorities**\n\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.\n\n![|624x199](upload://vNP0APCOjiwQMurCmYI47cTLklc.png)\n\nWith the initial priorities in mind, some effective measures for quick successes might look like:\n\n* Total number of projects funded\n* Quarterly increase in applications\n* Project engagement post-event/funding\n* Overall community engagement/sentiment\n\n**2.2 Timeline**\n\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.\n\n**![|624x245](upload://n56TSh5X3mt4TSqVVMFhbnZM0eM.png)**\n\n**Rolling Wave 1 & 2 Applications**\n\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\n\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\n\n**Wave 3 & Beyond**\n\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.\n\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\n\n## Conclusion:\n\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.\n\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.**\n\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.`\n\n const args = [\n ['0xbed87AdAcc517EbC5a6aa321a5afA3532f16380a'],\n [BigNumber.from(0)],\n ['transfer(address,uint256)'],\n ['0x000000000000000000000000e501d72935f88bfd6a30d7bb0787b9b815e693700000000000000000000000000000000000000000000000241a9b4f617a280000'],\n deerfiGrants\n ]\n const value = null\n \n await estimate(...args)\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n console.log(response, 'response')\n })\n )\n .catch(error => {\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n return (\n \n \n \n \n \n \n \n \n \n Deerfi Governance\n \n \n \n DEER tokens represent voting shares in Deerfi governance. You can vote on each proposal yourself or\n delegate your votes to a third party.\n \n \n \n \n \n \n \n \n \n \n Proposals\n \n \n {(!allProposals || allProposals.length === 0) && !availableVotes && }\n {showUnlockVoting ? (\n \n Unlock Voting\n \n ) : availableVotes && JSBI.notEqual(JSBI.BigInt(0), availableVotes?.raw) ? (\n \n Votes\n \n ) : deerBalance &&\n userDelegatee &&\n userDelegatee !== ZERO_ADDRESS &&\n JSBI.notEqual(JSBI.BigInt(0), deerBalance?.raw) ? (\n \n Votes\n \n ) : (\n ''\n )}\n \n {!showUnlockVoting && (\n \n
\n {userDelegatee && userDelegatee !== ZERO_ADDRESS ? (\n \n \n Delegated to:\n \n \n \n {userDelegatee === account ? 'Self' : shortenAddress(userDelegatee)}\n \n \n (edit)\n \n \n \n ) : (\n ''\n )}\n \n )}\n {allProposals?.length === 0 && (\n \n No proposals found.\n \n Proposals submitted by community members will appear here.\n \n \n )}\n {allProposals?.map((p: ProposalData, i) => {\n return (\n \n {p.id}\n {p.title}\n {p.status}\n \n )\n })}\n \n \n A minimum threshhold of 1% of the total DEER supply is required to submit proposals\n \n \n )\n}\n","import React, { useState, useContext } from 'react'\nimport { useActiveWeb3React } from '../../hooks'\n\nimport Modal from '../Modal'\nimport { AutoColumn, ColumnCenter } from '../Column'\nimport styled, { ThemeContext } from 'styled-components'\nimport { RowBetween } from '../Row'\nimport { TYPE, CustomLightSpinner } from '../../theme'\nimport { X, ArrowUpCircle } from 'react-feather'\nimport { ButtonPrimary } from '../Button'\nimport Circle from '../../assets/images/blue-loader.svg'\nimport { useVoteCallback, useDeerUserVotes } from '../../state/governance/hooks'\nimport { getEtherscanLink } from '../../utils'\nimport { ExternalLink } from '../../theme/components'\nimport { TokenAmount } from '@uniswap/sdk'\n\nconst ContentWrapper = styled(AutoColumn)`\n width: 100%;\n padding: 24px;\n`\n\nconst StyledClosed = styled(X)`\n :hover {\n cursor: pointer;\n }\n`\n\nconst ConfirmOrLoadingWrapper = styled.div`\n width: 100%;\n padding: 24px;\n`\n\nconst ConfirmedIcon = styled(ColumnCenter)`\n padding: 60px 0;\n`\n\ninterface VoteModalProps {\n isOpen: boolean\n onDismiss: () => void\n support: boolean // if user is for or against proposal\n proposalId: string | undefined // id for the proposal to vote on\n}\n\nexport default function VoteModal({ isOpen, onDismiss, proposalId, support }: VoteModalProps) {\n const { chainId } = useActiveWeb3React()\n const {\n voteCallback\n }: {\n voteCallback: (proposalId: string | undefined, support: boolean) => Promise | undefined\n } = useVoteCallback()\n const availableVotes: TokenAmount | undefined = useDeerUserVotes()\n // monitor call to help UI loading state\n const [hash, setHash] = useState()\n const [attempting, setAttempting] = useState(false)\n\n // get theme for colors\n const theme = useContext(ThemeContext)\n\n // wrapper to reset state on modal close\n function wrappedOndismiss() {\n setHash(undefined)\n setAttempting(false)\n onDismiss()\n }\n\n async function onVote() {\n setAttempting(true)\n\n // if callback not returned properly ignore\n if (!voteCallback) return\n\n // try delegation and store hash\n const hash = await voteCallback(proposalId, support)?.catch(error => {\n setAttempting(false)\n console.log(error)\n })\n\n if (hash) {\n setHash(hash)\n }\n }\n\n return (\n \n {!attempting && !hash && (\n \n \n \n {`Vote ${\n support ? 'for ' : 'against'\n } proposal ${proposalId}`}\n \n \n {availableVotes?.toSignificant(4)} Votes\n \n {`Vote ${\n support ? 'for ' : 'against'\n } proposal ${proposalId}`}\n \n \n \n )}\n {attempting && !hash && (\n \n \n
\n \n \n \n \n \n \n \n Submitting Vote\n \n Confirm this transaction in your wallet\n \n \n )}\n {hash && (\n \n \n
\n \n \n \n \n \n \n \n Transaction Submitted\n \n {chainId && (\n \n View transaction on Etherscan\n \n )}\n \n \n )}\n \n )\n}\n","import React, { useState } from 'react'\nimport { AutoColumn } from '../../components/Column'\nimport styled from 'styled-components'\n\nimport { RouteComponentProps } from 'react-router-dom'\nimport { TYPE, StyledInternalLink, ExternalLink } from '../../theme'\nimport { RowFixed, RowBetween } from '../../components/Row'\nimport { CardSection, DataCard } from '../../components/earn/styled'\nimport { ArrowLeft } from 'react-feather'\nimport { ButtonPrimary } from '../../components/Button'\nimport { ProposalStatus } from './styled'\nimport { useProposalData, useUserDeerVotesAsOfBlock, ProposalData, useUserDelegatee } from '../../state/governance/hooks'\nimport { DateTime } from 'luxon'\nimport ReactMarkdown from 'react-markdown'\nimport VoteModal from '../../components/deerVote/VoteModal'\nimport { TokenAmount, JSBI } from '@uniswap/sdk'\nimport { useActiveWeb3React } from '../../hooks'\nimport { AVERAGE_BLOCK_TIME_IN_SECS, COMMON_CONTRACT_NAMES, DEER, ZERO_ADDRESS } from '../../constants'\nimport { isAddress, getEtherscanLink } from '../../utils'\nimport { ApplicationModal } from '../../state/application/actions'\nimport { useModalOpen, useToggleDelegateModal, useToggleVoteModal, useBlockNumber } from '../../state/application/hooks'\nimport DelegateModal from '../../components/deerVote/DelegateModal'\nimport { GreyCard } from '../../components/Card'\nimport { useTokenBalance } from '../../state/wallet/hooks'\nimport useCurrentBlockTimestamp from 'hooks/useCurrentBlockTimestamp'\nimport { BigNumber } from 'ethers'\n\nconst PageWrapper = styled(AutoColumn)`\n width: 100%;\n`\n\nconst ProposalInfo = styled(AutoColumn)`\n border: 1px solid ${({ theme }) => theme.bg4};\n border-radius: 12px;\n padding: 1.5rem;\n position: relative;\n max-width: 640px;\n width: 100%;\n`\nconst ArrowWrapper = styled(StyledInternalLink)`\n display: flex;\n align-items: center;\n gap: 8px;\n height: 24px;\n color: ${({ theme }) => theme.text1};\n\n a {\n color: ${({ theme }) => theme.text1};\n text-decoration: none;\n }\n :hover {\n text-decoration: none;\n }\n`\nconst CardWrapper = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n width: 100%;\n`\n\nconst StyledDataCard = styled(DataCard)`\n width: 100%;\n background: none;\n background-color: ${({ theme }) => theme.bg1};\n height: fit-content;\n z-index: 2;\n`\n\nconst ProgressWrapper = styled.div`\n width: 100%;\n margin-top: 1rem;\n height: 4px;\n border-radius: 4px;\n background-color: ${({ theme }) => theme.bg3};\n position: relative;\n`\n\nconst Progress = styled.div<{ status: 'for' | 'against'; percentageString?: string }>`\n height: 4px;\n border-radius: 4px;\n background-color: ${({ theme, status }) => (status === 'for' ? theme.green1 : theme.red1)};\n width: ${({ percentageString }) => percentageString};\n`\n\nconst MarkDownWrapper = styled.div`\n max-width: 640px;\n overflow: hidden;\n`\n\nconst WrapSmall = styled(RowBetween)`\n ${({ theme }) => theme.mediaWidth.upToSmall`\n align-items: flex-start;\n flex-direction: column;\n `};\n`\n\nconst DetailText = styled.div`\n word-break: break-all;\n`\n\nconst ProposerAddressLink = styled(ExternalLink)`\n word-break: break-all;\n`\n\nexport default function VotePage({\n match: {\n params: { id }\n }\n}: RouteComponentProps<{ id: string }>) {\n const { chainId, account } = useActiveWeb3React()\n\n // get data for this specific proposal\n const proposalData: ProposalData | undefined = useProposalData(id)\n\n // update support based on button interactions\n const [support, setSupport] = useState(true)\n\n // modal for casting votes\n const showVoteModal = useModalOpen(ApplicationModal.VOTE)\n const toggleVoteModal = useToggleVoteModal()\n\n // toggle for showing delegation modal\n const showDelegateModal = useModalOpen(ApplicationModal.DELEGATE)\n const toggleDelegateModal = useToggleDelegateModal()\n\n // get and format date from data\n const currentTimestamp = useCurrentBlockTimestamp()\n const currentBlock = useBlockNumber()\n const endDate: DateTime | undefined =\n proposalData && currentTimestamp && currentBlock\n ? DateTime.fromSeconds(\n currentTimestamp\n .add(BigNumber.from(AVERAGE_BLOCK_TIME_IN_SECS).mul(BigNumber.from(proposalData.endBlock - currentBlock)))\n .toNumber()\n )\n : undefined\n const now: DateTime = DateTime.local()\n\n // get total votes and format percentages for UI\n const totalVotes: number | undefined = proposalData ? proposalData.forCount + proposalData.againstCount : undefined\n const forPercentage: string =\n proposalData && totalVotes ? ((proposalData.forCount * 100) / totalVotes).toFixed(0) + '%' : '0%'\n const againstPercentage: string =\n proposalData && totalVotes ? ((proposalData.againstCount * 100) / totalVotes).toFixed(0) + '%' : '0%'\n\n // only count available votes as of the proposal start block\n const availableVotes: TokenAmount | undefined = useUserDeerVotesAsOfBlock(proposalData?.startBlock ?? undefined)\n\n // only show voting if user has > 0 votes at proposal start block and proposal is active,\n const showVotingButtons =\n availableVotes &&\n JSBI.greaterThan(availableVotes.raw, JSBI.BigInt(0)) &&\n proposalData &&\n proposalData.status === 'active'\n\n const deerBalance: TokenAmount | undefined = useTokenBalance(\n account ?? undefined,\n chainId ? DEER[chainId] : undefined\n )\n const userDelegatee: string | undefined = useUserDelegatee()\n\n // in blurb link to home page if they are able to unlock\n const showLinkForUnlock = Boolean(\n deerBalance && JSBI.notEqual(deerBalance.raw, JSBI.BigInt(0)) && userDelegatee === ZERO_ADDRESS\n )\n\n // show links in propsoal details if content is an address\n // if content is contract with common name, replace address with common name\n const linkIfAddress = (content: string) => {\n if (isAddress(content) && chainId) {\n const commonName = COMMON_CONTRACT_NAMES[content] ?? content\n return {commonName}\n }\n return {content}\n }\n\n return (\n \n \n \n \n \n \n All Proposals\n \n {proposalData && {proposalData?.status}}\n \n \n {proposalData?.title}\n \n \n {endDate && endDate < now\n ? 'Voting ended ' + (endDate && endDate.toLocaleString(DateTime.DATETIME_FULL))\n : proposalData\n ? 'Voting ends approximately ' + (endDate && endDate.toLocaleString(DateTime.DATETIME_FULL))\n : ''}\n \n \n {proposalData && proposalData.status === 'active' && !showVotingButtons && (\n \n \n Only DEER votes that were self delegated or delegated to another address before block{' '}\n {proposalData.startBlock} are eligible for voting.{' '}\n {showLinkForUnlock && (\n \n Unlock voting to prepare for the next proposal.\n \n )}\n \n \n )}\n \n {showVotingButtons ? (\n \n {\n setSupport(true)\n toggleVoteModal()\n }}\n >\n Vote For\n \n {\n setSupport(false)\n toggleVoteModal()\n }}\n >\n Vote Against\n \n \n ) : (\n ''\n )}\n \n \n \n \n \n For\n \n {' '}\n {proposalData?.forCount.toLocaleString(undefined, { maximumFractionDigits: 0 })}\n \n \n \n \n \n \n \n \n \n \n \n \n Against\n \n {proposalData?.againstCount.toLocaleString(undefined, { maximumFractionDigits: 0 })}\n \n \n \n \n \n \n \n \n \n \n Details\n {proposalData?.details?.map((d, i) => {\n return (\n \n {i + 1}: {linkIfAddress(d.target)}.{d.functionSig}(\n {d.callData.split(',').map((content, i) => {\n return (\n \n {linkIfAddress(content)}\n {d.callData.split(',').length - 1 === i ? '' : ','}\n \n )\n })}\n )\n \n )\n })}\n \n \n Description\n \n \n \n \n \n Proposer\n \n \n \n \n \n \n )\n}\n","import React from 'react'\nimport { Redirect, RouteComponentProps } from 'react-router-dom'\n\n// Redirects to pool but only replace the pathname\nexport function RedirectPathToPoolOnly({ location }: RouteComponentProps) {\n return \n}\n","import { transparentize } from 'polished'\nimport React from 'react'\nimport { AlertTriangle } from 'react-feather'\nimport styled, { css } from 'styled-components'\nimport { Text } from 'rebass'\nimport { AutoColumn } from '../Column'\n\nexport const Wrapper = styled.div`\n position: relative;\n padding: 1rem;\n`\n\nexport const ArrowWrapper = styled.div<{ clickable: boolean }>`\n padding: 2px;\n\n ${({ clickable }) =>\n clickable\n ? css`\n :hover {\n cursor: pointer;\n opacity: 0.8;\n }\n `\n : null}\n`\n\nexport const SectionBreak = styled.div`\n height: 1px;\n width: 100%;\n background-color: ${({ theme }) => theme.bg3};\n`\n\nexport const BottomGrouping = styled.div`\n margin-top: 1rem;\n`\n\nexport const ErrorText = styled(Text)<{ severity?: 0 | 1 | 2 | 3 | 4 }>`\n color: ${({ theme, severity }) =>\n severity === 3 || severity === 4\n ? theme.red1\n : severity === 2\n ? theme.yellow2\n : severity === 1\n ? theme.text1\n : theme.green1};\n`\n\nexport const StyledBalanceMaxMini = styled.button`\n height: 22px;\n width: 22px;\n background-color: ${({ theme }) => theme.bg2};\n border: none;\n border-radius: 50%;\n padding: 0.2rem;\n font-size: 0.875rem;\n font-weight: 400;\n margin-left: 0.4rem;\n cursor: pointer;\n color: ${({ theme }) => theme.text2};\n display: flex;\n justify-content: center;\n align-items: center;\n float: right;\n\n :hover {\n background-color: ${({ theme }) => theme.bg3};\n }\n :focus {\n background-color: ${({ theme }) => theme.bg3};\n outline: none;\n }\n`\n\nexport const TruncatedText = styled(Text)`\n text-overflow: ellipsis;\n width: 220px;\n overflow: hidden;\n`\n\n// styles\nexport const Dots = styled.span`\n &::after {\n display: inline-block;\n animation: ellipsis 1.25s infinite;\n content: '.';\n width: 1em;\n text-align: left;\n }\n @keyframes ellipsis {\n 0% {\n content: '.';\n }\n 33% {\n content: '..';\n }\n 66% {\n content: '...';\n }\n }\n`\n\nconst SwapCallbackErrorInner = styled.div`\n background-color: ${({ theme }) => transparentize(0.9, theme.red1)};\n border-radius: 1rem;\n display: flex;\n align-items: center;\n font-size: 0.825rem;\n width: 100%;\n padding: 3rem 1.25rem 1rem 1rem;\n margin-top: -2rem;\n color: ${({ theme }) => theme.red1};\n z-index: -1;\n p {\n padding: 0;\n margin: 0;\n font-weight: 500;\n }\n`\n\nconst SwapCallbackErrorInnerAlertTriangle = styled.div`\n background-color: ${({ theme }) => transparentize(0.9, theme.red1)};\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n border-radius: 12px;\n min-width: 48px;\n height: 48px;\n`\n\nexport function SwapCallbackError({ error }: { error: string }) {\n return (\n \n \n \n \n

{error}

\n
\n )\n}\n\nexport const SwapShowAcceptChanges = styled(AutoColumn)`\n background-color: ${({ theme }) => transparentize(0.9, theme.primary1)};\n color: ${({ theme }) => theme.primary1};\n padding: 0.5rem;\n border-radius: 12px;\n margin-top: 8px;\n`\nexport const Separator = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.bg2};\n`\n","import { CurrencyAmount } from '@uniswap/sdk'\nimport React, { useContext, useMemo } from 'react'\nimport { Text } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport { TYPE } from '../../theme'\nimport { computeFlashLoanFee } from '../../utils/prices'\nimport { ButtonError } from '../Button'\nimport { AutoColumn } from '../Column'\nimport QuestionHelper from '../QuestionHelper'\nimport { AutoRow, RowBetween, RowFixed } from '../Row'\nimport { SwapCallbackError } from './styleds'\n\nexport default function FlashLoanModalFooter({\n currencyAmount,\n onConfirm,\n swapErrorMessage,\n disabledConfirm\n}: {\n currencyAmount: CurrencyAmount\n onConfirm: () => void\n swapErrorMessage: string | undefined\n disabledConfirm: boolean\n}) {\n const theme = useContext(ThemeContext)\n const { realizedLPFee } = useMemo(() => computeFlashLoanFee(currencyAmount), [currencyAmount])\n\n return (\n <>\n \n \n \n \n Liquidity Provider Fee\n \n \n \n \n {realizedLPFee ? realizedLPFee?.toSignificant(6) + ' ' + currencyAmount.currency.symbol : '-'}\n \n \n \n\n \n \n \n Confirm FlashLoan\n \n \n\n {swapErrorMessage ? : null}\n \n \n )\n}\n","import { TokenAmount } from '@uniswap/sdk'\nimport React from 'react'\nimport { Text } from 'rebass'\nimport { TYPE } from '../../theme'\nimport { isAddress, shortenAddress } from '../../utils'\nimport { AutoColumn } from '../Column'\nimport CurrencyLogo from '../CurrencyLogo'\nimport { RowBetween, RowFixed } from '../Row'\nimport { TruncatedText } from './styleds'\n\nexport default function FlashLoanModalHeader({\n tokenAmount,\n recipient\n}: {\n tokenAmount: TokenAmount\n recipient: string\n}) {\n\n return (\n \n \n \n \n \n {tokenAmount.toSignificant(6)}\n \n \n \n \n {tokenAmount.currency.symbol}\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 { TokenAmount } from '@uniswap/sdk'\nimport React, { useCallback } from 'react'\nimport TransactionConfirmationModal, {\n ConfirmationModalContent,\n TransactionErrorContent\n} from '../TransactionConfirmationModal'\nimport FlashLoanModalFooter from './FlashLoanModalFooter'\nimport FlashLoanModalHeader from './FlashLoanModalHeader'\n\nexport default function ConfirmFlashLoanModal({\n tokenAmount,\n onConfirm,\n onDismiss,\n recipient,\n swapErrorMessage,\n isOpen,\n attemptingTxn,\n txHash\n}: {\n isOpen: boolean\n tokenAmount: TokenAmount | undefined\n attemptingTxn: boolean\n txHash: string | undefined\n recipient: string | null\n onConfirm: () => void\n swapErrorMessage: string | undefined\n onDismiss: () => void\n}) {\n const modalHeader = useCallback(() => {\n return tokenAmount && recipient ? (\n \n ) : null\n }, [recipient, tokenAmount])\n\n const modalBottom = useCallback(() => {\n return tokenAmount && recipient ? (\n \n ) : null\n }, [onConfirm, swapErrorMessage, tokenAmount, recipient ])\n\n // text to show while loading\n const pendingText = `Flashing ${tokenAmount?.toSignificant(6)} ${\n tokenAmount?.currency?.symbol\n }`\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 { CurrencyAmount } from '@uniswap/sdk'\nimport { Pool } from 'data/Pool'\nimport React, { useContext } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport { TYPE, ExternalLink } from '../../theme'\nimport { computeFlashLoanFee } from '../../utils/prices'\nimport { AutoColumn } from '../Column'\nimport QuestionHelper from '../QuestionHelper'\nimport { RowBetween, RowFixed } from '../Row'\n\nconst InfoLink = styled(ExternalLink)`\n width: 100%;\n border: 1px solid ${({ theme }) => theme.bg3};\n padding: 6px 6px;\n border-radius: 8px;\n text-align: center;\n font-size: 14px;\n color: ${({ theme }) => theme.text1};\n`\n\nfunction FlashLoanSummary({ currencyAmount }: { currencyAmount: CurrencyAmount }) {\n const theme = useContext(ThemeContext)\n const { realizedLPFee } = computeFlashLoanFee(currencyAmount)\n\n return (\n <>\n \n \n \n \n Liquidity Provider Fee\n \n \n \n \n {realizedLPFee ? `${realizedLPFee.toSignificant(4)} ${currencyAmount.currency.symbol}` : '-'}\n \n \n \n \n )\n}\n\nexport interface AdvancedFlashLoanDetailsProps {\n pool?: Pool\n currencyAmount?: CurrencyAmount\n}\n\nexport function AdvancedFlashLoanDetails({ pool, currencyAmount }: AdvancedFlashLoanDetailsProps) {\n\n return (\n \n {pool && currencyAmount && (\n <>\n \n \n \n View pair analytics ↗\n \n \n \n )}\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { AdvancedFlashLoanDetails, AdvancedFlashLoanDetailsProps } from './AdvancedFlashLoanDetails'\n\nconst AdvancedDetailsFooter = styled.div<{ show: boolean }>`\n padding-top: calc(16px + 2rem);\n padding-bottom: 16px;\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 AdvancedFlashLoanDetailsDropdown({ pool, currencyAmount, ...rest }: AdvancedFlashLoanDetailsProps) {\n\n return (\n \n \n \n )\n}\n","import { Token } from '@uniswap/sdk'\nimport React, { useCallback } from 'react'\nimport Modal from '../Modal'\nimport { ImportToken } from 'components/SearchModal/ImportToken'\n\nexport default function TokenWarningModal({\n isOpen,\n tokens,\n onConfirm\n}: {\n isOpen: boolean\n tokens: Token[]\n onConfirm: () => void\n}) {\n const handleDismiss = useCallback(() => null, [])\n\n return (\n \n \n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport Settings from '../Settings/FlashLoanSettings'\nimport { RowBetween } from '../Row'\nimport { TYPE } from '../../theme'\n\nconst StyledFlashLoanHeader = styled.div`\n padding: 12px 1rem 0px 1.5rem;\n margin-bottom: -4px;\n width: 100%;\n max-width: 420px;\n color: ${({ theme }) => theme.text2};\n`\n\nexport default function FlashLoanHeader() {\n return (\n \n \n FlashLoan\n \n \n \n )\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Contract } from '@ethersproject/contracts'\nimport { CurrencyAmount, JSBI, Percent, Router, SwapParameters, Trade, TradeType } from '@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, getFlashLoanRouterContract, 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'\nimport { Pool } from 'data/Pool'\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\ninterface FlashLoanOptions {\n /**\n * When the transaction expires.\n * This is an atlernate to specifying the ttl, for when you do not want to use local time.\n */\n deadline: number\n /**\n * The account that should receive the output of the flashloan.\n */\n recipient: string\n\n /**\n * The data that should send to the flashloan.\n */\n data: string | null\n}\n\n/**\n * The parameters to use in the call to the Uniswap V2 Router to execute a trade.\n */\ninterface FlashLoanParameters {\n /**\n * The method to call on the Uniswap V2 Router.\n */\n methodName: string\n /**\n * The arguments to pass to the method, all hex encoded.\n */\n args: (string | string[])[]\n /**\n * The amount of wei to send in hex.\n */\n value: string\n}\n\n/**\n * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.\n * @param currencyAmount to produce call parameters for\n * @param options options for the call parameters\n */\nfunction flashLoanCallParameters(pool: Pool, currencyAmount: CurrencyAmount, options: FlashLoanOptions): FlashLoanParameters {\n const recipient: string = options.recipient\n const amount: string = toHex(currencyAmount)\n const deadline = `0x${options.deadline.toString(16)}`\n const data = options.data ?? '0x0000'\n\n let methodName: string\n let args: (string | string[])[]\n let value: string\n methodName = 'flashLoan'\n args = [pool.token.address, recipient, amount, deadline, data]\n value = '0x0'\n return {\n methodName,\n args,\n value\n }\n}\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\nfunction toHex(currencyAmount: CurrencyAmount) {\n return `0x${currencyAmount.raw.toString(16)}`\n}\n\n/**\n * Returns the swap calls that can be used to make the trade\n * @param pool\n * @param currencyAmount\n * @param recipientAddressOrName\n * @param data\n */\nfunction useFlashLoanCallArguments(\n pool: Pool | undefined | null,\n currencyAmount: CurrencyAmount | undefined, // trade to execute, required\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 data: string | null\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 return useMemo(() => {\n if (!pool || !currencyAmount || !recipient || !library || !account || !chainId || !deadline) return []\n\n const contract: Contract | null = getFlashLoanRouterContract(chainId, library, account)\n if (!contract) {\n return []\n }\n\n const flashLoanMethods = []\n\n flashLoanMethods.push(\n flashLoanCallParameters(pool, currencyAmount, {\n recipient,\n deadline: deadline.toNumber(),\n data\n })\n )\n return flashLoanMethods.map(parameters => ({ parameters, contract }))\n }, [account, chainId, deadline, library, recipient, data, pool, currencyAmount])\n}\n\n// returns a function that will execute a flashloan, if the parameters are all valid\n// and the user has approved the slippage adjusted input amount for the trade\nexport function useFlashLoanCallback(\n pool: Pool | undefined | null,\n currencyAmount: CurrencyAmount | undefined,\n recipientAddressOrName: string | null, // the ENS name or address of the recipient of the flashloan, or null if flashloan should be returned to sender\n data: string | null // the data of the flashloan, or null if no data is required\n): { state: SwapCallbackState; callback: null | (() => Promise); error: string | null } {\n const { account, chainId, library } = useActiveWeb3React()\n\n const swapCalls = useFlashLoanCallArguments(pool, currencyAmount, recipientAddressOrName, data)\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 (!currencyAmount || !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 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 default:\n errorMessage = `The transaction cannot succeed due to error: ${callError.reason}.`\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 = currencyAmount.currency.symbol\n const inputAmount = currencyAmount.toSignificant(3)\n\n const base = `FlashLoan ${inputAmount} ${inputSymbol}`\n const withRecipient =\n recipient === account\n ? base\n : `${base} to ${\n recipientAddressOrName && isAddress(recipientAddressOrName)\n ? shortenAddress(recipientAddressOrName)\n : recipientAddressOrName\n }`\n\n addTransaction(response, {\n summary: withRecipient\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(`FlashLoan failed`, error, methodName, args, value)\n throw new Error(`FlashLoan failed: ${error.message}`)\n }\n })\n },\n error: null\n }\n }, [library, account, chainId, recipient, currencyAmount, recipientAddressOrName, swapCalls, addTransaction])\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport enum Field {\n INPUT = 'INPUT'\n}\n\nexport const selectCurrency = createAction<{ field: Field; currencyId: string }>('flashLoan/selectCurrency')\nexport const typeInput = createAction<{ field: Field; typedValue: string }>('flashLoan/typeInput')\nexport const replaceFlashLoanState = createAction<{\n typedValue: string\n inputCurrencyId?: string\n recipient: string\n data: string | null\n}>('flashLoan/replaceFlashLoanState')\nexport const setRecipient = createAction<{ recipient: string }>('flashLoan/setRecipient')\nexport const setData = createAction<{ data: string | null }>('flashLoan/setData')\n","import useENS from '../../hooks/useENS'\nimport { parseUnits } from '@ethersproject/units'\nimport { Currency, CurrencyAmount, ETHER, JSBI, Token, TokenAmount } from '@uniswap/sdk'\nimport { ParsedQs } from 'qs'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency } from '../../hooks/Tokens'\nimport useParsedQueryString from '../../hooks/useParsedQueryString'\nimport { isAddress } from '../../utils'\nimport { AppDispatch, AppState } from '../index'\nimport { useCurrencyBalances } from '../wallet/hooks'\nimport { Field, replaceFlashLoanState, selectCurrency, setRecipient, setData, typeInput } from './actions'\nimport { SwapState } from './reducer'\nimport { Pool } from 'data/Pool'\nimport { PairState, usePool } from 'data/Reserves'\n\nexport function useFlashLoanState(): AppState['flashLoan'] {\n return useSelector(state => state.flashLoan)\n}\n\nexport function useFlashLoanActionHandlers(): {\n onCurrencySelection: (field: Field, currency: Currency) => void\n onUserInput: (field: Field, typedValue: string) => void\n onChangeRecipient: (recipient: string) => void\n onChangeData: (data: string | null) => void\n} {\n const dispatch = useDispatch()\n const onCurrencySelection = useCallback(\n (field: Field, currency: Currency) => {\n dispatch(\n selectCurrency({\n field,\n currencyId: currency instanceof Token ? currency.address : currency === ETHER ? 'ETH' : ''\n })\n )\n },\n [dispatch]\n )\n\n const onUserInput = useCallback(\n (field: Field, typedValue: string) => {\n dispatch(typeInput({ field, typedValue }))\n },\n [dispatch]\n )\n\n const onChangeRecipient = useCallback(\n (recipient: string) => {\n dispatch(setRecipient({ recipient }))\n },\n [dispatch]\n )\n\n const onChangeData = useCallback(\n (data: string | null) => {\n dispatch(setData({ data }))\n },\n [dispatch]\n )\n\n return {\n onCurrencySelection,\n onUserInput,\n onChangeRecipient,\n onChangeData\n }\n}\n\n// try to parse a user entered amount for a given token\nexport function tryParseAmount(value?: string, currency?: Currency): CurrencyAmount | undefined {\n if (!value || !currency) {\n return undefined\n }\n try {\n const typedValueParsed = parseUnits(value, currency.decimals).toString()\n if (typedValueParsed !== '0') {\n return currency instanceof Token\n ? new TokenAmount(currency, JSBI.BigInt(typedValueParsed))\n : CurrencyAmount.ether(JSBI.BigInt(typedValueParsed))\n }\n } catch (error) {\n // should fail if the user specifies too many decimal places of precision (or maybe exceed max uint?)\n console.debug(`Failed to parse input amount: \"${value}\"`, error)\n }\n // necessary for all paths to return a value\n return undefined\n}\n\nconst BAD_RECIPIENT_ADDRESSES: string[] = [\n '0xa22F8cf50D9827Daef24dCb5BAC92C147a9D342e', // flashloan v1 factory\n '0x0A8015b1647bc133F25681da0996307839eD64FD', // flashloan v1 router\n '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', // v2 factory\n '0xf164fC0Ec4E93095b804a4795bBe1e041497b92a', // v2 router 01\n '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D' // v2 router 02\n]\n\n// from the current swap inputs, compute the best trade and return it.\nexport function useDerivedFlashLoanInfo(): {\n noEnoughLiquidity?: boolean\n pool?: Pool\n currency?: Currency\n currencyBalance?: CurrencyAmount\n parsedAmount: CurrencyAmount | undefined\n inputError?: string\n} {\n const { account } = useActiveWeb3React()\n\n const {\n typedValue,\n [Field.INPUT]: { currencyId: inputCurrencyId },\n recipient\n } = useFlashLoanState()\n\n const inputCurrency = useCurrency(inputCurrencyId)\n const recipientLookup = useENS(recipient ?? undefined)\n const to: string | null = (recipient === null ? account : recipientLookup.address) ?? null\n\n const relevantTokenBalances = useCurrencyBalances(account ?? undefined, [\n inputCurrency ?? undefined\n ])\n\n const parsedAmount = tryParseAmount(typedValue, inputCurrency ?? undefined)\n\n const currencyBalance = relevantTokenBalances[0]\n\n // pool\n const [poolState, pool] = usePool(inputCurrency ?? undefined)\n const noEnoughLiquidity: boolean =\n poolState === PairState.NOT_EXISTS || Boolean(pool && parsedAmount && JSBI.lessThan(pool.reserve.raw, parsedAmount.raw))\n\n\n const currency = inputCurrency ?? undefined\n\n let inputError: string | undefined\n if (!account) {\n inputError = 'Connect Wallet'\n }\n\n if (!parsedAmount) {\n inputError = inputError ?? 'Enter an amount'\n }\n\n if (!currency) {\n inputError = inputError ?? 'Select a token'\n }\n\n const formattedTo = isAddress(to)\n if (!to || !formattedTo) {\n inputError = inputError ?? 'Enter a recipient'\n } else {\n if (\n BAD_RECIPIENT_ADDRESSES.indexOf(formattedTo) !== -1\n ) {\n inputError = inputError ?? 'Invalid recipient'\n }\n }\n\n return {\n noEnoughLiquidity,\n pool: pool ?? undefined,\n currency,\n currencyBalance,\n parsedAmount,\n inputError\n }\n}\n\nfunction parseCurrencyFromURLParameter(urlParam: any): string {\n if (typeof urlParam === 'string') {\n const valid = isAddress(urlParam)\n if (valid) return valid\n if (urlParam.toUpperCase() === 'ETH') return 'ETH'\n if (valid === false) return 'ETH'\n }\n return 'ETH' ?? ''\n}\n\nfunction parseTokenAmountURLParameter(urlParam: any): string {\n return typeof urlParam === 'string' && !isNaN(parseFloat(urlParam)) ? urlParam : ''\n}\n\nconst ENS_NAME_REGEX = /^[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)?$/\nconst ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\nconst DATA_REGEX = /^0x[a-fA-F0-9]*$/\nfunction validatedRecipient(recipient: any): string | null {\n if (typeof recipient !== 'string') return null\n const address = isAddress(recipient)\n if (address) return address\n if (ENS_NAME_REGEX.test(recipient)) return recipient\n if (ADDRESS_REGEX.test(recipient)) return recipient\n return null\n}\n\nfunction validatedData(data: any): string | null {\n if (typeof data !== 'string') return null\n if (DATA_REGEX.test(data)) return data\n return null\n}\n\nexport function queryParametersToSwapState(parsedQs: ParsedQs): SwapState {\n let inputCurrency = parseCurrencyFromURLParameter(parsedQs.inputCurrency)\n let outputCurrency = parseCurrencyFromURLParameter(parsedQs.outputCurrency)\n if (inputCurrency === outputCurrency) {\n if (typeof parsedQs.outputCurrency === 'string') {\n inputCurrency = ''\n } else {\n outputCurrency = ''\n }\n }\n\n const recipient = validatedRecipient(parsedQs.recipient)\n const data = validatedData(parsedQs.data)\n\n return {\n [Field.INPUT]: {\n currencyId: inputCurrency\n },\n typedValue: parseTokenAmountURLParameter(parsedQs.exactAmount),\n recipient: recipient ?? '',\n data\n }\n}\n\n// updates the swap state to use the defaults for a given network\nexport function useDefaultsFromURLSearch():\n | { inputCurrencyId: string | undefined }\n | undefined {\n const { chainId } = useActiveWeb3React()\n const dispatch = useDispatch()\n const parsedQs = useParsedQueryString()\n const [result, setResult] = useState<\n { inputCurrencyId: string | undefined } | undefined\n >()\n\n useEffect(() => {\n if (!chainId) return\n const parsed = queryParametersToSwapState(parsedQs)\n\n dispatch(\n replaceFlashLoanState({\n typedValue: parsed.typedValue,\n inputCurrencyId: parsed[Field.INPUT].currencyId,\n recipient: parsed.recipient,\n data: parsed.data\n })\n )\n\n setResult({ inputCurrencyId: parsed[Field.INPUT].currencyId })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dispatch, chainId])\n\n return result\n}\n","import React, { useContext, useCallback } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport { TYPE } from '../../theme'\nimport { AutoColumn } from '../Column'\nimport { RowBetween } from '../Row'\n\nconst InputPanel = styled.div`\n ${({ theme }) => theme.flexColumnNoWrap}\n position: relative;\n border-radius: 1.25rem;\n background-color: ${({ theme }) => theme.bg1};\n z-index: 1;\n width: 100%;\n`\n\nconst ContainerRow = styled.div<{ error: boolean }>`\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 1.25rem;\n border: 1px solid ${({ error, theme }) => (error ? theme.red1 : theme.bg2)};\n transition: border-color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')},\n color 500ms ${({ error }) => (error ? 'step-end' : 'step-start')};\n background-color: ${({ theme }) => theme.bg1};\n`\n\nconst InputContainer = styled.div`\n flex: 1;\n padding: 1rem;\n`\n\nconst Input = styled.input<{ error?: boolean }>`\n font-size: 1.25rem;\n outline: none;\n border: none;\n flex: 1 1 auto;\n width: 0;\n background-color: ${({ theme }) => theme.bg1};\n transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};\n color: ${({ error, theme }) => (error ? theme.red1 : theme.primary1)};\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 500;\n width: 100%;\n ::placeholder {\n color: ${({ theme }) => theme.text4};\n }\n padding: 0px;\n -webkit-appearance: textfield;\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\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\nexport default function AddressInputPanel({\n id,\n value,\n onChange\n}: {\n id?: string\n // the typed string value\n value: string\n // triggers whenever the typed value changes\n onChange: (value: string) => void\n}) {\n const theme = useContext(ThemeContext)\n\n const handleInput = useCallback(\n event => {\n const input = event.target.value\n const withoutSpaces = input.replace(/\\s+/g, '')\n onChange(withoutSpaces)\n },\n [onChange]\n )\n\n return (\n \n \n \n \n \n \n Data\n \n \n \n \n \n \n \n )\n}\n","import { CurrencyAmount, JSBI, Token, TokenAmount, Trade } from '@uniswap/sdk'\nimport React, { useCallback, useContext, useMemo, useState } from 'react'\nimport { ArrowDown } from 'react-feather'\nimport ReactGA from 'react-ga'\nimport { Text } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport AddressInputPanel from '../../components/AddressInputPanel'\nimport { ButtonError, ButtonLight, ButtonPrimary } from '../../components/Button'\nimport { GreyCard } from '../../components/Card'\nimport { AutoColumn } from '../../components/Column'\nimport ConfirmFlashLoanModal from '../../components/flashLoan/ConfirmFlashLoanModal'\nimport CurrencyInputPanel from '../../components/CurrencyInputPanel'\nimport { FlashLoanPoolTabs } from '../../components/NavigationTabs'\nimport { AutoRow } from '../../components/Row'\nimport AdvancedFlashLoanDetailsDropdown from '../../components/flashLoan/AdvancedFlashLoanDetailsDropdown'\nimport { ArrowWrapper, BottomGrouping, SwapCallbackError, Wrapper } from '../../components/swap/styleds'\nimport TokenWarningModal from '../../components/TokenWarningModal'\nimport FlashLoanHeader from '../../components/flashLoan/FlashLoanHeader'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency, useAllTokens } from '../../hooks/Tokens'\nimport { useFlashLoanCallback } from '../../hooks/useSwapCallback'\nimport { useWalletModalToggle } from '../../state/application/hooks'\nimport { Field } from '../../state/flashLoan/actions'\nimport {\n useDefaultsFromURLSearch,\n useDerivedFlashLoanInfo,\n useFlashLoanActionHandlers,\n useFlashLoanState\n} from '../../state/flashLoan/hooks'\nimport { LinkStyledButton, TYPE } from '../../theme'\nimport { maxAmountSpend } from '../../utils/maxAmountSpend'\nimport AppBody from '../AppBody'\nimport { useIsFlashLoanTransactionUnsupported } from 'hooks/Trades'\nimport UnsupportedCurrencyFooter from 'components/swap/UnsupportedCurrencyFooter'\nimport { wrappedCurrency } from 'utils/wrappedCurrency'\nimport DataInputPanel from 'components/DataInputPanel'\n\nexport default function FlashLoan() {\n const loadedUrlParams = useDefaultsFromURLSearch()\n\n // token warning stuff\n const loadedInputCurrency = useCurrency(loadedUrlParams?.inputCurrencyId)\n const [dismissTokenWarning, setDismissTokenWarning] = useState(false)\n const urlLoadedTokens: Token[] = useMemo(\n () => [loadedInputCurrency]?.filter((c): c is Token => c instanceof Token) ?? [],\n [loadedInputCurrency]\n )\n const handleConfirmTokenWarning = useCallback(() => {\n setDismissTokenWarning(true)\n }, [])\n\n // dismiss warning if all imported tokens are in active lists\n const defaultTokens = useAllTokens()\n const importTokensNotInDefault =\n urlLoadedTokens &&\n urlLoadedTokens.filter((token: Token) => {\n return !Boolean(token.address in defaultTokens)\n })\n\n const { account, chainId } = useActiveWeb3React()\n const theme = useContext(ThemeContext)\n\n // toggle wallet when disconnected\n const toggleWalletModal = useWalletModalToggle()\n\n // swap state\n const { typedValue, recipient, data } = useFlashLoanState()\n const {\n noEnoughLiquidity,\n pool,\n currencyBalance,\n parsedAmount,\n currency,\n inputError: swapInputError\n } = useDerivedFlashLoanInfo()\n\n const parsedToken = parsedAmount ? wrappedCurrency(parsedAmount.currency, chainId) : undefined\n const parsedTokenAmount = parsedAmount && parsedToken ? new TokenAmount(parsedToken, parsedAmount.raw) : undefined\n\n const { onCurrencySelection, onUserInput, onChangeRecipient, onChangeData } = useFlashLoanActionHandlers()\n const isValid = !swapInputError\n\n const handleTypeInput = useCallback(\n (value: string) => {\n onUserInput(Field.INPUT, value)\n },\n [onUserInput]\n )\n\n // modal and loading\n const [{ showConfirm, tradeToConfirm, flashLoanErrorMessage: swapErrorMessage, attemptingTxn, txHash }, setFlashLoanState] = useState<{\n showConfirm: boolean\n tradeToConfirm: Trade | undefined\n attemptingTxn: boolean\n flashLoanErrorMessage: string | undefined\n txHash: string | undefined\n }>({\n showConfirm: false,\n tradeToConfirm: undefined,\n attemptingTxn: false,\n flashLoanErrorMessage: undefined,\n txHash: undefined\n })\n\n const userHasSpecifiedInputOutput = Boolean(\n currency && parsedAmount?.greaterThan(JSBI.BigInt(0))\n )\n\n const maxAmountInput: CurrencyAmount | undefined = maxAmountSpend(currencyBalance)\n const atMaxAmountInput = Boolean(maxAmountInput && parsedAmount?.equalTo(maxAmountInput))\n\n // the callback to execute the swap\n const { callback: flashLoanCallback, error: flashLoanCallbackError } = useFlashLoanCallback(pool, parsedTokenAmount, recipient, data)\n\n const handleFlashLoan = useCallback(() => {\n if (!flashLoanCallback) {\n return\n }\n setFlashLoanState({ attemptingTxn: true, tradeToConfirm, showConfirm, flashLoanErrorMessage: undefined, txHash: undefined })\n flashLoanCallback()\n .then(hash => {\n setFlashLoanState({ attemptingTxn: false, tradeToConfirm, showConfirm, flashLoanErrorMessage: undefined, txHash: hash })\n\n ReactGA.event({\n category: 'FlashLoan',\n action: 'FlashLoan',\n label: parsedAmount?.currency?.symbol\n })\n })\n .catch(error => {\n setFlashLoanState({\n attemptingTxn: false,\n tradeToConfirm,\n showConfirm,\n flashLoanErrorMessage: error.message,\n txHash: undefined\n })\n })\n }, [\n flashLoanCallback,\n parsedAmount,\n tradeToConfirm,\n showConfirm\n ])\n\n const handleConfirmDismiss = useCallback(() => {\n setFlashLoanState({ showConfirm: false, tradeToConfirm, attemptingTxn, flashLoanErrorMessage: swapErrorMessage, txHash })\n // if there was a tx hash, we want to clear the input\n if (txHash) {\n onUserInput(Field.INPUT, '')\n }\n }, [attemptingTxn, onUserInput, swapErrorMessage, tradeToConfirm, txHash])\n\n const handleInputSelect = useCallback(\n inputCurrency => {\n onCurrencySelection(Field.INPUT, inputCurrency)\n },\n [onCurrencySelection]\n )\n\n const handleMaxInput = useCallback(() => {\n maxAmountInput && onUserInput(Field.INPUT, maxAmountInput.toExact())\n }, [maxAmountInput, onUserInput])\n\n const flashLoanIsUnsupported = useIsFlashLoanTransactionUnsupported(currency)\n\n return (\n <>\n 0 && !dismissTokenWarning}\n tokens={importTokensNotInDefault}\n onConfirm={handleConfirmTokenWarning}\n />\n \n \n \n \n \n\n \n \n \n \n \n \n \n {data === null ? (\n onChangeData('')}>\n + Add a data (optional)\n \n ) : null}\n \n \n <>\n \n \n\n {data !== null ? (\n <>\n \n \n \n \n onChangeData(null)}>\n - Remove data\n \n \n \n \n ) : null}\n \n \n {flashLoanIsUnsupported ? (\n \n Unsupported Asset\n \n ) : !account ? (\n Connect Wallet\n ) : noEnoughLiquidity && userHasSpecifiedInputOutput ? (\n \n Insufficient liquidity for this flash loan.\n \n ) : (\n {\n handleFlashLoan()\n }}\n id=\"swap-button\"\n disabled={!isValid || !!flashLoanCallbackError}\n error={isValid && !flashLoanCallbackError}\n >\n \n {swapInputError\n ? swapInputError\n : `FlashLoan`}\n \n \n )}\n {swapErrorMessage ? : null}\n \n \n \n {!flashLoanIsUnsupported ? (\n \n ) : (\n \n )}\n \n )\n}\n","import React from 'react'\n\nimport styled from 'styled-components'\n\nconst MarketBarWrap = styled.div<{ barColor?: string; width?: string; height?: string }>`\n background: ${({ barColor, theme }) => barColor ?? theme.bg3};\n height: ${({ height }) => height ?? '4px'};\n width: ${({ width }) => width ?? '100%'};\n border-radius: 2px;\n`\n\nconst RateWrap = styled.div`\n position: absolute;\n width: 100%;\n font-weight: 600;\n font-size: 0.7rem;\n margin-top: -1rem;\n text-align: right;\n`\n\nconst FillBar = styled.div<{ rate: number; fillColor?: string }>`\n position: relative;\n background: ${({ fillColor, theme }) => fillColor ?? theme.primary1};\n width: ${({ rate }) => rate}%;\n height: 100%;\n border-radius: 2px;\n`\n\ninterface MarketBarProps {\n rate: number\n showRate?: boolean\n barColor?: string\n fillColor?: string\n width?: string\n height?: string\n}\n\nexport default function MarketBar({ rate, showRate = false, barColor, fillColor, width, height }: MarketBarProps) {\n return (\n \n \n {showRate && {rate}%}\n \n \n )\n}\n","import { Fraction, JSBI } from '@uniswap/sdk'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport styled from 'styled-components'\nimport { formatData, showDollarValue } from '../../utils'\nimport MarketBar from '../MarketBar'\n\nconst SummaryCard = styled.div`\n background: ${({ theme }) => theme.bg1};\n box-shadow: 0px 2px 4px rgba(16, 21, 24, 0.05);\n border-radius: 4px;\n width: 100%;\n`\n\nconst SummaryFrame = styled.div`\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n align-items: center;\n justify-content: space-between;\n align-items: center;\n flex-direction: row;\n gap: 1.3rem;\n width: 100%;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n width: 100%;\n grid-template-columns: 1fr 1fr;\n gap: 0.4rem;\n `};\n`\n\nconst SummaryElement = styled.div`\n display: flex;\n flex-direction: column;\n padding: 24px 28px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n padding: 1rem;\n `};\n`\n\nconst SummaryTitle = styled.div`\n margin-bottom: 1.2rem;\n font-size: 0.9rem;\n color: ${({ theme }) => theme.text1};\n font-weight: 600;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n font-size: 0.8rem;\n font-weight: 500;\n margin-bottom: 0.8rem;\n `};\n`\n\nconst SummaryContent = styled.div`\n display: flex;\n align-items: center;\n font-size: 20px;\n color: ${({ theme }) => theme.text1};\n font-weight: 400;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n font-size: 1rem;\n margin-bottom: 0.8rem;\n `};\n`\n\nconst DotIcon = styled.div`\n font-size: 10px;\n margin-right: 15px;\n color: #1de9b6;\n display: inline-block;\n -webkit-font-smoothing: antialiased;\n &::before {\n content: '●';\n }\n ${({ theme }) => theme.mediaWidth.upToMedium`\n font-size: 6px;\n margin-right: 4px;\n `};\n`\n\nconst MarketBarWrap = styled.div`\n display: flex;\n align-items: center;\n padding: 24px 28px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n padding: 1rem;\n `};\n`\n\nconst MarketBarTitle = styled.div`\n font-size: 0.8rem;\n white-space: nowrap;\n`\n\nfunction Summary({\n supplyTotalBalance,\n borrowTotalBalance,\n limit,\n usedLimit,\n netApy,\n totalMarketSize\n}: {\n supplyTotalBalance: JSBI\n borrowTotalBalance: JSBI\n limit: JSBI\n usedLimit: Fraction\n netApy: Fraction\n totalMarketSize: JSBI\n}) {\n const { t } = useTranslation()\n\n const formaterSupplyTotalBalance = useMemo(() => {\n return formatData(supplyTotalBalance).toFixed(8)\n }, [supplyTotalBalance])\n\n const formaterNetAPY = useMemo(() => {\n return netApy.toFixed(2)\n }, [netApy])\n\n const formaterBorrowTotalBalance = useMemo(() => {\n return formatData(borrowTotalBalance).toFixed(8)\n }, [borrowTotalBalance])\n\n const formaterMarketSize = useMemo(() => {\n return showDollarValue(totalMarketSize)\n }, [totalMarketSize])\n\n const formaterRate = useMemo((): number => {\n return Number(usedLimit.toSignificant(4)) ?? 0\n }, [usedLimit])\n\n const formaterLimit = useMemo(() => {\n return formatData(limit).toFixed(2)\n }, [limit])\n\n return (\n \n \n \n {t('supplyBalance')}\n \n ${formaterSupplyTotalBalance}\n \n \n \n {t('netAPY')}\n \n \n {formaterNetAPY}%\n \n \n \n {t('borrowBalance')}\n \n ${formaterBorrowTotalBalance}\n \n \n \n {t('totalMarketSize')}\n \n ${formaterMarketSize}\n \n \n \n \n {t('borrowLimit')}\n \n ${formaterLimit}\n \n \n )\n}\n\nexport default Summary\n","import React from 'react'\nimport styled from 'styled-components'\n\nconst ToggleWrap = styled.div`\n display: flex;\n height: 100%;\n align-items: center;\n`\n\nconst StyledToggle = styled.button<{ isActive: boolean }>`\n border-radius: 12px;\n border: none;\n background-color: ${({ isActive }) => (isActive ? '#98e8c6' : '#bfc8cd')};\n display: flex;\n position: relative;\n align-items: center;\n cursor: pointer;\n outline: none;\n padding: 0;\n width: 38px;\n height: 12px;\n border-radius: 12px;\n transition: opacity 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1),\n border-color 90ms cubic-bezier(0.4, 0, 0.2, 1);\n`\n\nconst ToggleElement = styled.div<{ isActive: boolean }>`\n border-radius: 14px;\n background: ${({ isActive }) => (isActive ? '#05d394' : '#ffffff')};\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14),\n 0px 1px 3px 0px rgba(0, 0, 0, 0.12);\n border-radius: 50%;\n left: ${({ isActive }) => (isActive ? 'auto' : '-2px')};\n right: ${({ isActive }) => (isActive ? '-2px' : 'auto')};\n position: absolute;\n padding: 0.64rem 0.64rem;\n ${ToggleWrap}:hover & {\n box-shadow: ${({ isActive }) =>\n isActive\n ? '0px 0px 0px 8px rgba(5, 211, 148, 0.16), 0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12)'\n : '0px 0px 0px 8px rgba(0, 0, 0, 0.08), 0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12)'};\n }\n`\n\nexport interface ToggleProps {\n id?: string\n isActive: boolean\n toggle?: () => void\n}\n\nexport default function Switch({ id, isActive = false, toggle }: ToggleProps) {\n return (\n {\n event.stopPropagation()\n toggle?.()\n }}\n >\n \n \n \n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\n\nimport Logo from '../Logo'\n\nconst StyledLogo = styled(Logo)<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n border-radius: ${({ size }) => size};\n box-shadow: 0px 6px 10px rgba(0, 0, 0, 0.075);\n`\n\nexport default function CurrencyLogo({\n logo0,\n size = '24px',\n style\n}: {\n logo0?: string\n size?: string\n style?: React.CSSProperties\n}) {\n return \n}\n","import React, { useContext } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport { darken } from 'polished'\nimport { RowBetween } from '../Row'\nimport { TYPE } from '../../theme'\nimport { Input as NumericalInput } from '../NumericalInput'\n\n// import { useTranslation } from 'react-i18next'\n\nconst InputRow = styled.div<{ selected: boolean }>`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n padding: ${({ selected }) => (selected ? '0.75rem 0.5rem 0.75rem 1rem' : '0.75rem 0.75rem 0.75rem 1rem')};\n`\n\nconst LabelRow = styled.div`\n ${({ theme }) => theme.flexRowNoWrap}\n align-items: center;\n color: ${({ theme }) => theme.text1};\n font-size: 0.75rem;\n line-height: 1rem;\n padding: 0.75rem 1rem 0 1rem;\n span:hover {\n cursor: pointer;\n color: ${({ theme }) => darken(0.2, theme.text2)};\n }\n`\n\nconst InputPanel = styled.div<{ hideInput?: boolean }>`\n ${({ theme }) => theme.flexColumnNoWrap}\n position: relative;\n border-radius: ${({ hideInput }) => (hideInput ? '8px' : '20px')};\n background-color: ${({ theme }) => theme.bg2};\n z-index: 1;\n width: 100%;\n`\n\nconst Container = styled.div<{ hideInput: boolean }>`\n border-radius: ${({ hideInput }) => (hideInput ? '8px' : '20px')};\n border: 1px solid ${({ theme }) => theme.bg3};\n background-color: ${({ theme }) => theme.bg1};\n`\n\nconst StyledBalanceMax = styled.button`\n height: 28px;\n background-color: ${({ theme }) => theme.primary5};\n border: 1px solid ${({ theme }) => theme.primary5};\n border-radius: 0.5rem;\n font-size: 0.875rem;\n\n font-weight: 500;\n cursor: pointer;\n margin-right: 0.5rem;\n color: ${({ theme }) => theme.primaryText1};\n :hover {\n border: 1px solid ${({ theme }) => theme.primary1};\n }\n :focus {\n border: 1px solid ${({ theme }) => theme.primary1};\n outline: none;\n }\n\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\n margin-right: 0.5rem;\n `};\n`\n\ninterface CurrencyInputPanelProps {\n value: string\n onUserInput: (value: string) => void\n onMax?: () => void\n safeMax?: boolean\n showMaxButton: boolean\n label?: string\n disableCurrencySelect?: boolean\n hideInput?: boolean\n id: string\n}\n\nexport default function CurrencyInputPanel({\n value,\n onUserInput,\n onMax,\n safeMax = false,\n showMaxButton,\n label = 'Input',\n disableCurrencySelect = false,\n hideInput = false,\n id\n}: CurrencyInputPanelProps) {\n // const { t } = useTranslation()\n\n const theme = useContext(ThemeContext)\n\n return (\n \n \n {!hideInput && (\n \n \n \n {label}\n \n \n \n )}\n \n {!hideInput && (\n <>\n {\n onUserInput(val)\n }}\n />\n {showMaxButton && label !== 'To' && (\n {safeMax ? 'SAFE MAX' : 'MAX'}\n )}\n \n )}\n \n \n \n )\n}\n","import { createAction } from '@reduxjs/toolkit'\nimport { ChainId } from '@uniswap/sdk'\nimport { CToken, CTokenState } from 'data/CToken'\n\nexport enum LendField {\n SUPPLY = 'SUPPLY',\n BORROW = 'BORROW',\n WITHDRAW = 'WITHDRAW',\n REPAY = 'REPAY'\n}\n\nexport const updateLendingToken = createAction<{\n chainId: ChainId\n markets: [CTokenState, CToken | null][]\n}>('lending/updateLendingToken')\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 SerializedPool,\n SerializedToken,\n updateMatchesDarkMode,\n updateUserDarkMode,\n updateUserExpertMode,\n updateUserSlippageTolerance,\n updateUserDeadline,\n toggleURLWarning,\n updateUserSingleHopOnly\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 userSingleHopOnly: boolean // only allow swaps on direct pairs\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 pools: {\n [chainId: number]: {\n // keyed by token0Address:token1Address\n [key: string]: SerializedPool\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 userSingleHopOnly: false,\n userSlippageTolerance: INITIAL_ALLOWED_SLIPPAGE,\n userDeadline: DEFAULT_DEADLINE_FROM_NOW,\n tokens: {},\n pairs: {},\n pools: {},\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(updateUserSingleHopOnly, (state, action) => {\n state.userSingleHopOnly = action.payload.userSingleHopOnly\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 { 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 { 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, replaceFlashLoanState, selectCurrency, setRecipient, setData, typeInput } from './actions'\n\nexport interface SwapState {\n readonly typedValue: string\n readonly [Field.INPUT]: {\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\n readonly data: string | null\n}\n\nconst initialState: SwapState = {\n typedValue: '',\n [Field.INPUT]: {\n currencyId: ''\n },\n recipient: '',\n data: null\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(\n replaceFlashLoanState,\n (state, { payload: { typedValue, recipient, data, inputCurrencyId } }) => {\n return {\n [Field.INPUT]: {\n currencyId: inputCurrencyId\n },\n typedValue: typedValue,\n recipient,\n data\n }\n }\n )\n .addCase(selectCurrency, (state, { payload: { currencyId, field } }) => {\n // the normal case\n return {\n ...state,\n [field]: { currencyId: 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 .addCase(setData, (state, { payload: { data } }) => {\n state.data = data\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 { createReducer } from '@reduxjs/toolkit'\nimport { Field, resetMintState, typeInput } from './actions'\n\nexport interface MintState {\n readonly independentField: Field\n readonly typedValue: string\n}\n\nconst initialState: MintState = {\n independentField: Field.CURRENCY,\n typedValue: ''\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(resetMintState, () => initialState)\n .addCase(typeInput, (state, { payload: { field, typedValue, noLiquidity } }) => {\n return {\n ...state,\n independentField: field,\n typedValue\n }\n })\n)\n","import { DEFAULT_ACTIVE_LIST_URLS } from './../../constants/lists'\nimport { createReducer } from '@reduxjs/toolkit'\nimport { getVersionUpgrade, VersionUpgrade } from '@uniswap/token-lists'\nimport { TokenList } from '@uniswap/token-lists/dist/types'\nimport { DEFAULT_LIST_OF_LISTS } from '../../constants/lists'\nimport { updateVersion } from '../global/actions'\nimport { acceptListUpdate, addList, fetchTokenList, removeList, enableList, disableList } from './actions'\n\nexport interface ListsState {\n readonly byUrl: {\n readonly [url: string]: {\n readonly current: TokenList | null\n readonly pendingUpdate: TokenList | null\n readonly loadingRequestId: string | null\n readonly error: string | null\n }\n }\n // this contains the default list of lists from the last time the updateVersion was called, i.e. the app was reloaded\n readonly lastInitializedDefaultListOfLists?: string[]\n\n // currently active lists\n readonly activeListUrls: string[] | undefined\n}\n\ntype ListState = ListsState['byUrl'][string]\n\nconst NEW_LIST_STATE: ListState = {\n error: null,\n current: null,\n loadingRequestId: null,\n pendingUpdate: null\n}\n\ntype Mutable = { -readonly [P in keyof T]: T[P] extends ReadonlyArray ? U[] : T[P] }\n\nconst initialState: ListsState = {\n lastInitializedDefaultListOfLists: DEFAULT_LIST_OF_LISTS,\n byUrl: {\n ...DEFAULT_LIST_OF_LISTS.reduce>((memo, listUrl) => {\n memo[listUrl] = NEW_LIST_STATE\n return memo\n }, {})\n },\n activeListUrls: DEFAULT_ACTIVE_LIST_URLS\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(fetchTokenList.pending, (state, { payload: { requestId, url } }) => {\n state.byUrl[url] = {\n current: null,\n pendingUpdate: null,\n ...state.byUrl[url],\n loadingRequestId: requestId,\n error: null\n }\n })\n .addCase(fetchTokenList.fulfilled, (state, { payload: { requestId, tokenList, url } }) => {\n const current = state.byUrl[url]?.current\n const loadingRequestId = state.byUrl[url]?.loadingRequestId\n\n // no-op if update does nothing\n if (current) {\n const upgradeType = getVersionUpgrade(current.version, tokenList.version)\n\n if (upgradeType === VersionUpgrade.NONE) return\n if (loadingRequestId === null || loadingRequestId === requestId) {\n state.byUrl[url] = {\n ...state.byUrl[url],\n loadingRequestId: null,\n error: null,\n current: current,\n pendingUpdate: tokenList\n }\n }\n } else {\n state.byUrl[url] = {\n ...state.byUrl[url],\n loadingRequestId: null,\n error: null,\n current: tokenList,\n pendingUpdate: null\n }\n }\n })\n .addCase(fetchTokenList.rejected, (state, { payload: { url, requestId, errorMessage } }) => {\n if (state.byUrl[url]?.loadingRequestId !== requestId) {\n // no-op since it's not the latest request\n return\n }\n\n state.byUrl[url] = {\n ...state.byUrl[url],\n loadingRequestId: null,\n error: errorMessage,\n current: null,\n pendingUpdate: null\n }\n })\n .addCase(addList, (state, { payload: url }) => {\n if (!state.byUrl[url]) {\n state.byUrl[url] = NEW_LIST_STATE\n }\n })\n .addCase(removeList, (state, { payload: url }) => {\n if (state.byUrl[url]) {\n delete state.byUrl[url]\n }\n // remove list from active urls if needed\n if (state.activeListUrls && state.activeListUrls.includes(url)) {\n state.activeListUrls = state.activeListUrls.filter(u => u !== url)\n }\n })\n .addCase(enableList, (state, { payload: url }) => {\n if (!state.byUrl[url]) {\n state.byUrl[url] = NEW_LIST_STATE\n }\n\n if (state.activeListUrls && !state.activeListUrls.includes(url)) {\n state.activeListUrls.push(url)\n }\n\n if (!state.activeListUrls) {\n state.activeListUrls = [url]\n }\n })\n .addCase(disableList, (state, { payload: url }) => {\n if (state.activeListUrls && state.activeListUrls.includes(url)) {\n state.activeListUrls = state.activeListUrls.filter(u => u !== url)\n }\n })\n .addCase(acceptListUpdate, (state, { payload: url }) => {\n if (!state.byUrl[url]?.pendingUpdate) {\n throw new Error('accept list update called without pending update')\n }\n state.byUrl[url] = {\n ...state.byUrl[url],\n pendingUpdate: null,\n current: state.byUrl[url].pendingUpdate\n }\n })\n .addCase(updateVersion, state => {\n // state loaded from localStorage, but new lists have never been initialized\n if (!state.lastInitializedDefaultListOfLists) {\n state.byUrl = initialState.byUrl\n state.activeListUrls = initialState.activeListUrls\n } else if (state.lastInitializedDefaultListOfLists) {\n const lastInitializedSet = state.lastInitializedDefaultListOfLists.reduce>(\n (s, l) => s.add(l),\n new Set()\n )\n const newListOfListsSet = DEFAULT_LIST_OF_LISTS.reduce>((s, l) => s.add(l), new Set())\n\n DEFAULT_LIST_OF_LISTS.forEach(listUrl => {\n if (!lastInitializedSet.has(listUrl)) {\n state.byUrl[listUrl] = NEW_LIST_STATE\n }\n })\n\n state.lastInitializedDefaultListOfLists.forEach(listUrl => {\n if (!newListOfListsSet.has(listUrl)) {\n delete state.byUrl[listUrl]\n }\n })\n }\n\n state.lastInitializedDefaultListOfLists = DEFAULT_LIST_OF_LISTS\n\n // if no active lists, activate defaults\n if (!state.activeListUrls) {\n state.activeListUrls = DEFAULT_ACTIVE_LIST_URLS\n\n // for each list on default list, initialize if needed\n DEFAULT_ACTIVE_LIST_URLS.map((listUrl: string) => {\n if (!state.byUrl[listUrl]) {\n state.byUrl[listUrl] = NEW_LIST_STATE\n }\n return true\n })\n }\n })\n)\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 { 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 { createReducer } from '@reduxjs/toolkit'\nimport { ChainId } from '@uniswap/sdk'\nimport { CToken, CTokenState } from 'data/CToken'\nimport { updateLendingToken } from './actions'\n\nexport type LendingState = {\n [chainId in ChainId]: [CTokenState, CToken | null][]\n}\n\nexport const initialState: LendingState = {\n '1': [],\n '3': [],\n '4': [],\n '5': [],\n '42': []\n}\n\nexport default createReducer(initialState, builder =>\n builder.addCase(updateLendingToken, (lending, { payload: { chainId, markets } }) => {\n lending[chainId] = markets\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 flashLoan from './flashLoan/reducer'\nimport mint from './mint/reducer'\nimport flashLoanMint from './flashLoanMint/reducer'\nimport lists from './lists/reducer'\nimport burn from './burn/reducer'\nimport flashLoanBurn from './flashLoanBurn/reducer'\nimport multicall from './multicall/reducer'\nimport lending from './lending/reducer'\n\nconst PERSISTED_KEYS: string[] = ['user', 'transactions', 'lists', 'lending']\n\nconst store = configureStore({\n reducer: {\n application,\n user,\n transactions,\n swap,\n flashLoan,\n mint,\n flashLoanMint,\n burn,\n flashLoanBurn,\n multicall,\n lists,\n lending\n },\n middleware: [...getDefaultMiddleware({ thunk: false, serializableCheck: 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 { CToken, CTokenState, useCTokens } from '../../data/CToken'\nimport { useActiveWeb3React } from '../../hooks'\nimport { LendField, updateLendingToken } from './actions'\nimport { ChainId, CurrencyAmount, JSBI, TokenAmount } from '@uniswap/sdk'\nimport { tryParseAmount } from '../swap/hooks'\nimport { useTranslation } from 'react-i18next'\nimport store from 'state'\nimport { useMemo } from 'react'\nimport { BigNumber } from 'ethers'\nimport { LendingState } from './reducer'\n\n// based on typed value\nexport function useLendingInfo(\n lendInputValue: string,\n lendToken: CToken | undefined,\n lendMarket: LendField | undefined,\n limit: JSBI,\n withdrawMax: CurrencyAmount | undefined,\n borrowMax: CurrencyAmount | undefined,\n walletBalance: JSBI | undefined\n): {\n inputError?: boolean\n inputText?: string\n} {\n const { t } = useTranslation()\n const { account } = useActiveWeb3React()\n // Wallet Balance\n let inputError = false\n let inputText: string | undefined\n\n if (!account) {\n inputError = true\n inputText = 'Connect Wallet'\n }\n if (!lendToken || inputError) {\n inputError = true\n inputText = inputText ?? 'Data Error'\n return { inputError, inputText }\n }\n\n const ZERO = JSBI.BigInt(0)\n // Protocol Balance\n const parseInputValue: CurrencyAmount | undefined = tryParseAmount(lendInputValue, lendToken)\n const protocolBorrowBalance = new TokenAmount(lendToken, lendToken.getBorrowBalanceAmount())\n const protocolSuppleyBalance = new TokenAmount(lendToken, lendToken.getSupplyBalanceAmount())\n const liquidity = new TokenAmount(lendToken, lendToken.getLiquidity())\n const liquidityValue = new TokenAmount(lendToken, lendToken.getLiquidityValue())\n if (lendMarket === LendField.SUPPLY && !inputError) {\n if (walletBalance) {\n if (!parseInputValue) {\n inputError = true\n inputText = t(lendMarket.toLowerCase())\n } else if (JSBI.equal(walletBalance, ZERO) || JSBI.greaterThan(parseInputValue.raw, walletBalance)) {\n inputError = true\n inputText = t('noFundsAvailable')\n } else {\n inputText = t(lendMarket.toLowerCase())\n }\n } else {\n inputError = true\n inputText = t('noFundsAvailable')\n }\n }\n\n if (lendMarket === LendField.WITHDRAW && !inputError) {\n if (protocolSuppleyBalance && withdrawMax) {\n if (JSBI.equal(protocolSuppleyBalance.raw, ZERO)) {\n inputError = true\n inputText = t('noBalanceToWithdraw')\n } else if (!parseInputValue) {\n inputError = true\n inputText = t(lendMarket.toLowerCase())\n } else if (withdrawMax.lessThan(parseInputValue)) {\n inputError = true\n inputText = t('tokenInsufficientLiquidity')\n } else {\n inputText = t(lendMarket.toLowerCase())\n }\n } else {\n inputError = true\n inputText = t('noBalanceToWithdraw')\n }\n }\n\n if (lendMarket === LendField.REPAY && !inputError) {\n if (!protocolBorrowBalance || JSBI.equal(protocolBorrowBalance.raw, ZERO)) {\n inputError = true\n inputText = t('noBalanceToRepay')\n } else if ((parseInputValue && JSBI.equal(parseInputValue.raw, ZERO)) || !parseInputValue) {\n inputError = true\n inputText = t(lendMarket.toLowerCase())\n } else if (JSBI.greaterThan(parseInputValue.raw, protocolBorrowBalance.raw)) {\n inputError = true\n inputText = t('Exceed borrow balance')\n } else if (walletBalance && JSBI.greaterThan(parseInputValue.raw, walletBalance)) {\n inputError = true\n inputText = t('noFundsAvailable')\n } else {\n inputText = t(lendMarket.toLowerCase())\n }\n }\n\n if (lendMarket === LendField.BORROW && !inputError) {\n if (JSBI.equal(limit, ZERO)) {\n inputError = true\n inputText = t('borrowingLimitReached')\n } else if (\n JSBI.equal(liquidityValue.raw, ZERO) ||\n (parseInputValue && JSBI.lessThan(liquidity.raw, parseInputValue.raw))\n ) {\n inputError = true\n inputText = t('tokenInsufficientLiquidity')\n } else if ((parseInputValue && JSBI.equal(parseInputValue.raw, ZERO)) || !parseInputValue) {\n inputError = true\n inputText = t(lendMarket.toLowerCase())\n } else if (borrowMax && parseInputValue && borrowMax.lessThan(parseInputValue)) {\n inputError = true\n inputText = t('insufficientCollateral')\n } else {\n inputText = t(lendMarket.toLowerCase())\n }\n }\n\n inputText = inputText ?? t(lendMarket?.toLowerCase())\n\n return { inputError, inputText }\n}\n\nexport function listToCTokenMap(state: LendingState, chainId: ChainId): [CTokenState, CToken | null][] {\n return state[chainId].map(i => {\n const token = i[1] as CToken\n return [\n i[0],\n new CToken(\n chainId,\n token.cAddress,\n token.address,\n token.decimals,\n token.cSymbol,\n token.cName,\n token.symbol,\n token.name,\n BigNumber.from((token.supplyRatePerBlock as BigNumber)._hex),\n BigNumber.from((token.borrowRatePerBlock as BigNumber)._hex),\n BigNumber.from((token.balanceUnderlying as BigNumber)._hex),\n BigNumber.from((token.supplyBalance as BigNumber)._hex),\n BigNumber.from((token.borrowBalance as BigNumber)._hex),\n BigNumber.from((token.exchangeRateMantissa as BigNumber)._hex),\n BigNumber.from((token.totalSupply as BigNumber)._hex),\n BigNumber.from((token.liquidity as BigNumber)._hex),\n token.canBeCollateral,\n BigNumber.from((token.underlyingPrice as BigNumber)._hex),\n token.isListed,\n BigNumber.from((token.collateralFactorMantissa as BigNumber)._hex),\n token.logo0,\n token.logo1\n )\n ]\n })\n}\n\nexport function useAllLendingMarket(): [CTokenState, CToken | null][] {\n const { chainId, account } = useActiveWeb3React()\n const markets = useCTokens()\n const state = store.getState().lending\n return useMemo(() => {\n if (account && chainId && markets[0][0] === CTokenState.EXISTS) {\n store.dispatch(updateLendingToken({ chainId, markets }))\n return markets\n }\n if (account && chainId && state[chainId].length) {\n try {\n return listToCTokenMap(state, chainId)\n } catch (error) {\n console.error('Could not show lending list due to error', error)\n return markets\n }\n }\n return markets\n }, [account, chainId, markets, state])\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport CurrencyLogo from '../CurrencyIcon'\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 DoubleAssetLogoProps {\n margin?: boolean\n size?: number\n logo0?: string\n logo1?: string\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 DoubleAssetLogo({ logo0, logo1, size = 16, margin = false }: DoubleAssetLogoProps) {\n return (\n \n {logo0 && }\n {logo1 && }\n \n )\n}\n","import React from 'react'\n\nimport styled from 'styled-components'\n\nconst SkeletonWrap = styled.div`\n height: 1rem;\n width: 4rem;\n animation-duration: 2s;\n animation-fill-mode: forwards;\n animation-iteration-count: infinite;\n animation-name: placeHolderShimmer;\n animation-timing-function: linear;\n background-size: 800px 104px;\n background: ${({ theme }) => theme.SkeletonBG};\n @keyframes placeHolderShimmer {\n 0% {\n background-position: -468px 0;\n }\n 100% {\n background-position: 468px 0;\n }\n }\n`\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface SkeletonProps {\n loading: boolean\n children?: React.ReactNode\n}\n\nexport default function Skeleton({ loading, children }: SkeletonProps) {\n return <>{loading ? children : }\n}\n","import React, { useEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport CurrencyIcon from '../CurrencyIcon'\nimport LendModal from '../LendModal'\nimport { CToken } from '../../data/CToken'\nimport { LendField } from '../../state/lending/actions'\nimport { APY_BASE, formatData, getBorrowTotalBalance, showDollarValue } from '../../utils'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { useCTokenApproveCallback } from '../../hooks/useApproveCallback'\nimport { ChainId, Fraction, JSBI, TokenAmount } from '@uniswap/sdk'\nimport DoubleAssetLogo from '../DoubleAssetLogo'\nimport { useTranslation } from 'react-i18next'\nimport Skeleton from 'components/Skeleton'\nimport { useActiveWeb3React } from 'hooks'\nimport { CTOKEN_LISTS } from 'constants/lend'\n\nconst MarketsCard = styled.div`\n background: ${({ theme }) => theme.bg1};\n color: ${({ theme }) => theme.text1};\n box-shadow: 0px 2px 4px rgba(16, 21, 24, 0.05);\n border-radius: 4px;\n`\n\nconst MarketsCardHeader = styled.div`\n display: flex;\n flex-flow: inherit;\n font-weight: 600;\n justify-content: space-between;\n font-size: 1.1rem;\n padding: 1rem 1.75rem;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n ${({ theme }) => theme.mediaWidth.upToMedium`\n padding: 1rem;\n font-size: 1rem;\n `};\n`\n\nconst AssetWrap = styled.div`\n cursor: pointer;\n font-size: 1rem;\n`\n\nconst AssetWrapLabels = styled.div`\n display: grid;\n padding: 1rem 1.75rem;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n align-items: center;\n grid-template-columns: 200px 2fr 4fr 90px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n grid-template-columns: 140px 4fr 70px;\n padding: 0.8rem 1rem;\n `};\n`\n\nconst AssetLabel = styled.div<{ textAlign?: string; mobileHide?: boolean }>`\n font-size: 12px;\n font-weight: 500;\n color: #aab8c1;\n text-align: ${({ textAlign }) => (textAlign ? textAlign : 'center')};\n ${({ theme, mobileHide }) => theme.mediaWidth.upToMedium`\n display: ${mobileHide ? 'none' : 'block'};\n `};\n`\n\nconst AssetItemWrap = styled.div`\n font-size: 1rem;\n`\n\nconst AssetItem = styled.div<{ justifyItems?: string }>`\n display: grid;\n justify-items: ${({ justifyItems }) => (justifyItems ? justifyItems : 'end')};\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n padding: 1.25rem 1.75rem;\n border-left: 2px solid transparent;\n padding-left: 1.625rem;\n height: 78px;\n text-transform: none;\n font-size: 1rem;\n font-weight: 500;\n letter-spacing: 0;\n transition: none;\n grid-template-columns: 200px 2fr 4fr 90px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n grid-template-columns: 140px 4fr 70px;\n padding: 0.8rem 1rem;\n `};\n :hover {\n border-left: 2px solid #1de9b6;\n background: rgba(4, 169, 245, 0.05);\n }\n`\n\nconst AssetLogo = styled.div`\n display: flex;\n align-items: center;\n justify-self: start;\n`\n\nconst ItemWrap = styled.div<{ mobileHide?: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: right;\n align-self: center;\n text-align: right;\n font-size: 0.95rem;\n ${({ theme, mobileHide }) => theme.mediaWidth.upToMedium`\n display: ${mobileHide ? 'none' : 'flex'};\n font-size: 0.8rem;\n `};\n`\n\nconst ItemBottomWrap = styled.div`\n color: #aab8c1;\n font-size: 0.9em;\n`\n\nconst MobileWrap = styled.div`\n display: none;\n color: #aab8c1;\n text-align: left;\n font-size: 0.9em;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n display: block;\n `};\n`\n\nconst SymbolWrap = styled.div`\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 8rem;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n width: 6rem;\n `};\n`\n\nfunction ItemPannel({\n marketCToken,\n walletBalances,\n children\n}: {\n marketCToken: CToken\n walletBalances: {\n [tokenAddress: string]: TokenAmount | undefined\n }\n children: React.ReactNode\n}) {\n useCTokenApproveCallback(marketCToken, walletBalances, marketCToken?.cAddress)\n return <>{children}\n}\n\nconst ZERO = JSBI.BigInt(0)\n\nexport function getBorrowApy(ctoken: CToken): Fraction {\n return new Fraction(ctoken.getBorrowApy() ?? ZERO, APY_BASE)\n}\n\nfunction BorrowMarkets({\n allMarketCTokens = [],\n borrowTotalBalance,\n limit,\n usedLimit,\n walletBalances\n}: {\n allMarketCTokens: CToken[]\n borrowTotalBalance: JSBI\n limit: JSBI\n usedLimit: Fraction\n walletBalances: {\n [tokenAddress: string]: TokenAmount | undefined\n }\n}) {\n const { chainId } = useActiveWeb3React()\n\n const cTokenList = CTOKEN_LISTS[chainId ?? ChainId.MAINNET]\n\n const { t } = useTranslation()\n\n const [lendToken, setLendToken] = useState()\n\n const [showLendConfirmation, setShowLendConfirmation] = useState(false)\n\n const [TokenLoadState, setTokenLoadState] = useState(false)\n\n useEffect(() => {\n if (allMarketCTokens.length > 0) {\n setTokenLoadState(true)\n } else {\n setTokenLoadState(false)\n }\n }, [allMarketCTokens])\n\n const borrowedAsset = allMarketCTokens.filter((item: CToken) => {\n return item.borrowBalance && BigNumber.from(0).lt(item.borrowBalance)\n })\n\n const borrowAsset = allMarketCTokens.filter((item: CToken) => {\n return (\n (!item.borrowBalance || BigNumber.from(0).eq(item.borrowBalance)) &&\n (!item.supplyBalance || BigNumber.from(0).eq(item.supplyBalance))\n )\n })\n\n return (\n
\n \n {!!borrowedAsset.length && (\n \n {t('borrowingMarkets')}\n \n \n {t('asset')}\n \n {t('APY')}\n \n {t('assetBalance')}\n {t('percentOfLimit')}\n \n \n {borrowedAsset.map((item: CToken) => (\n \n {\n if (TokenLoadState) {\n setLendToken(item)\n setShowLendConfirmation(true)\n }\n }}\n >\n \n {item.logo1 ? (\n \n ) : (\n \n )}\n \n {item.name}\n \n {getBorrowApy(item).toFixed(2) ?? 0}%\n \n \n \n \n \n
{getBorrowApy(item).toFixed(2) ?? 0}%
\n
\n
\n \n \n
${formatData(getBorrowTotalBalance([item])).toFixed(2) ?? ''}
\n \n {new TokenAmount(item, item.getBorrowBalanceAmount()).toSignificant()}\n {' ' + item.symbol}\n \n
\n
\n \n \n {new Fraction(getBorrowTotalBalance([item]), limit).multiply(JSBI.BigInt(100)).toFixed(1) ?? ''}\n %\n \n \n \n
\n ))}\n
\n
\n
\n )}\n \n \n {t('borrowMarkets')}\n \n {t('asset')}\n \n {t('APY')}\n \n {t('assetWallet')}\n {t('liquidity')}\n \n \n {!!borrowAsset.length\n ? borrowAsset.map((item: CToken) => (\n \n {\n if (TokenLoadState) {\n setLendToken(item)\n setShowLendConfirmation(true)\n }\n }}\n >\n \n {item.logo1 ? (\n \n ) : (\n \n )}\n \n {item.name}\n \n {getBorrowApy(item).toFixed(2) ?? 0}%\n \n \n \n \n
\n {getBorrowApy(item).toFixed(2) ?? 0}%\n
\n
\n \n \n {walletBalances[item.address]?.toSignificant(4) ?? '0'}\n {' ' + item.symbol}\n \n \n \n ${showDollarValue(item.getLiquidityValue())}\n \n \n
\n ))\n : cTokenList.map((item: any, index) => (\n \n \n \n {item[8] ? (\n \n ) : (\n \n )}\n \n {item[6]}\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\nexport default BorrowMarkets\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport styled from 'styled-components'\nimport Modal from '../Modal'\nimport { AutoColumn } from '../Column'\nimport { Text } from 'rebass'\nimport { AutoRow, RowBetween } from '../Row'\nimport { ArrowRight, X } from 'react-feather'\nimport { CToken } from '../../data/CToken'\nimport { ButtonLight } from '../Button'\nimport CurrencyIcon from '../CurrencyIcon'\nimport LendInputPanel from '../LendInputPanel'\nimport { Dots } from '../swap/styleds'\n\nimport { ApprovalState, useCTokenApproveCallback } from '../../hooks/useApproveCallback'\nimport {\n calculateGasMargin,\n formatData,\n EXA_BASE,\n getCERC20Contract,\n getCEtherContract,\n LIMIT_BASE,\n getMaximillionContract\n} from '../../utils'\nimport { useActiveWeb3React } from '../../hooks'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport ReactGA from 'react-ga'\nimport { LendField } from '../../state/lending/actions'\nimport MarketBar from '../MarketBar'\nimport { tryParseAmount } from '../../state/swap/hooks'\nimport { cTokenMaxAmountSpend } from '../../utils/maxAmountSpend'\nimport { CurrencyAmount, Fraction, JSBI, TokenAmount } from '@uniswap/sdk'\nimport { useLendingInfo } from '../../state/lending/hooks'\nimport DoubleAssetLogo from '../DoubleAssetLogo'\nimport TransactionConfirmationModal, { TransactionErrorContent } from '../TransactionConfirmationModal'\nimport { getSupplyApy } from '../SupplyMarkets'\nimport { getBorrowApy } from '../BorrowMarkets'\nimport { useTranslation } from 'react-i18next'\n\nconst ZERO = JSBI.BigInt(0)\nconst ONE = JSBI.BigInt(1)\nconst EIGHT = JSBI.BigInt(8)\nconst TEN = JSBI.BigInt(10)\nconst ONE_HUNDRED = JSBI.BigInt(100)\n\nconst ZERO_FRACTION = new Fraction(ZERO, ONE)\n\nconst StyledCloseIcon = styled(X)`\n height: 20px;\n width: 20px;\n :hover {\n cursor: pointer;\n }\n\n > * {\n stroke: ${({ theme }) => theme.text1};\n }\n`\n\nconst AssetLogo = styled.div`\n display: flex;\n align-items: center;\n`\n\nconst Break = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.bg3};\n`\n\nconst ModalContentWrapper = styled.div`\n padding: 2rem 0;\n background-color: ${({ theme }) => theme.bg2};\n border-radius: 4px;\n width: 100%;\n`\n\nconst ApproveWrap = styled.div`\n background: ${({ theme }) => theme.bg1};\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 2.5rem 1.75rem;\n`\n\nconst TabWrap = styled.div`\n background: ${({ theme }) => theme.bg1};\n display: grid;\n grid-template-columns: 1fr 1fr;\n width: 100%;\n user-select: none;\n`\n\nconst TabItem = styled.div<{ isActive: boolean }>`\n font-size: 0.85rem;\n text-align: center;\n position: relative;\n cursor: pointer;\n text-transform: uppercase;\n color: ${({ isActive, theme }) => (isActive ? theme.primary1 : '#AAB8C1')};\n padding-bottom: 0.8rem;\n font-weight: 600;\n :after {\n background: ${({ isActive, theme }) => (isActive ? theme.primary1 : 'none')};\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 3px;\n border-radius: 10px 10px 0 0;\n }\n`\n\nconst RateWrap = styled.div`\n padding: 1.2rem 1.75rem 0;\n width: 100%;\n`\n\nconst RateTitle = styled.div`\n cursor: pointer;\n text-transform: none;\n color: #657786;\n font-weight: 600;\n font-size: 12px;\n`\n\nconst RatePanel = styled.div`\n display: flex;\n color: ${({ theme }) => theme.text2};\n justify-content: space-between;\n align-items: center;\n width: 100%;\n padding: 1rem 0;\n`\n\nconst RateCalculation = styled.div`\n display: flex;\n align-items: center;\n font-weight: 500;\n color: ${({ theme }) => theme.text2};\n`\n\nexport interface LendModalProps {\n lendToken: CToken | undefined\n walletBalances: {\n [tokenAddress: string]: TokenAmount | undefined\n }\n showLendConfirmation: boolean\n setShowLendConfirmation: Function\n borrowTotalBalance: JSBI\n limit: JSBI\n usedLimit: Fraction\n lendMarket?: LendField\n}\n\nfunction LendModal({\n lendToken,\n walletBalances,\n showLendConfirmation,\n setShowLendConfirmation,\n borrowTotalBalance,\n limit,\n usedLimit,\n lendMarket\n}: LendModalProps) {\n const { t } = useTranslation()\n\n const { account, chainId, library } = useActiveWeb3React()\n\n // modal and confirm\n const [showConfirm, setShowConfirm] = useState(false)\n const [attemptingTxn, setAttemptingTxn] = useState(false) // clicked confirm\n\n const [txHash, setTxHash] = useState('')\n\n console.log('use txHash and attemptingTxn later like Add Liquidity', attemptingTxn, txHash)\n\n const walletBalanceAmount = useMemo(() => walletBalances[lendToken?.address ?? ''], [walletBalances, lendToken])\n\n const addTransaction = useTransactionAdder()\n\n const [tabItemActive, setTabItemActive] = useState()\n\n const [lendInputValue, setLendInputValue] = useState('')\n\n const [pendingText, setPendingText] = useState('')\n\n const [approvalTokenStatus, approveCallback, approveHash, approvePendingText] = useCTokenApproveCallback(\n lendToken,\n walletBalances,\n lendToken?.cAddress,\n setAttemptingTxn\n )\n\n useEffect(() => {\n setTxHash(approveHash)\n setPendingText(approvePendingText)\n }, [approveHash, approvePendingText])\n\n const inputAmount = useMemo(() => tryParseAmount(lendInputValue, lendToken), [lendToken, lendInputValue])\n\n const changedBorrowLimit = useMemo(() => {\n if (lendToken) {\n const price = lendToken.getUnderlyingPrice()\n const parseInputAmount = inputAmount?.raw ?? ZERO\n let changedBorrowLimit: JSBI = ZERO\n if (lendMarket === LendField.SUPPLY) {\n const borrowLimit = JSBI.divide(\n JSBI.multiply(JSBI.multiply(price, parseInputAmount), lendToken.getCollateralFactorMantissa()),\n LIMIT_BASE\n )\n if (tabItemActive === LendField.SUPPLY) {\n changedBorrowLimit = JSBI.add(limit, borrowLimit)\n } else {\n changedBorrowLimit = JSBI.subtract(limit, borrowLimit)\n }\n } else {\n const borrowLimit = JSBI.divide(JSBI.multiply(price, parseInputAmount), EXA_BASE)\n if (tabItemActive === LendField.BORROW) {\n changedBorrowLimit = JSBI.add(borrowTotalBalance, borrowLimit)\n } else {\n changedBorrowLimit = JSBI.subtract(borrowTotalBalance, borrowLimit)\n }\n }\n return formatData(changedBorrowLimit)\n }\n return ZERO_FRACTION\n }, [lendToken, inputAmount, lendMarket, tabItemActive, limit, borrowTotalBalance])\n\n const changedBorrowLimitUsed = useMemo(() => {\n if (lendToken) {\n let changedBorrowLimitUsed: Fraction\n const fraOne = new Fraction(EXA_BASE, ONE)\n if (lendMarket === LendField.SUPPLY) {\n if (JSBI.equal(borrowTotalBalance, ZERO)) {\n changedBorrowLimitUsed = ZERO_FRACTION\n } else {\n changedBorrowLimitUsed = fraOne\n .divide(changedBorrowLimit.multiply(JSBI.divide(LIMIT_BASE, borrowTotalBalance)))\n .multiply(ONE_HUNDRED)\n }\n } else {\n if (JSBI.equal(limit, ZERO)) {\n changedBorrowLimitUsed = ZERO_FRACTION\n } else {\n changedBorrowLimitUsed = changedBorrowLimit\n .multiply(EXA_BASE)\n .divide(limit)\n .multiply(ONE_HUNDRED)\n }\n }\n return changedBorrowLimitUsed.greaterThan(ONE_HUNDRED)\n ? new Fraction(ONE_HUNDRED, ONE)\n : changedBorrowLimitUsed.lessThan(ZERO)\n ? ZERO_FRACTION\n : changedBorrowLimitUsed\n }\n return ZERO_FRACTION\n }, [borrowTotalBalance, changedBorrowLimit, lendMarket, lendToken, limit])\n\n const handleDismissConfirmation = useCallback(() => {\n setShowConfirm(false)\n }, [])\n\n useEffect(() => {\n if (showLendConfirmation) {\n lendMarket === LendField.SUPPLY ? setTabItemActive(LendField.SUPPLY) : setTabItemActive(LendField.BORROW)\n } else {\n setLendInputValue('')\n }\n }, [lendMarket, showLendConfirmation])\n\n function onSupplyMax(): CurrencyAmount | undefined {\n return cTokenMaxAmountSpend(walletBalanceAmount)\n }\n\n function onWithdrawMax(lendToken: CToken, safe = true): CurrencyAmount {\n const collateralFactorMantissa = lendToken.getCollateralFactorMantissa()\n if (!lendToken.canBeCollateral) {\n const amount = lendToken.getSupplyBalanceAmount()\n return new TokenAmount(lendToken, amount)\n } else {\n const price = lendToken.getUnderlyingPrice()\n const suppliedValue = lendToken.getSuppliedValue()\n const otherSuppliedTotalValue: JSBI = JSBI.subtract(limit, suppliedValue)\n const expectTotalBalnce = JSBI.divide(JSBI.multiply(borrowTotalBalance, TEN), safe ? EIGHT : TEN)\n const remainValue: JSBI = JSBI.subtract(\n // divide 8/10\n JSBI.greaterThan(expectTotalBalnce, limit) ? limit : expectTotalBalnce,\n otherSuppliedTotalValue\n )\n const owedValue = JSBI.greaterThan(remainValue, ZERO) ? remainValue : ZERO\n if (JSBI.greaterThan(remainValue, ZERO)) {\n const safeValue = JSBI.subtract(\n lendToken.getSupplyBalanceJSBI(),\n JSBI.divide(JSBI.multiply(owedValue, EXA_BASE), collateralFactorMantissa)\n )\n const amount = JSBI.divide(JSBI.multiply(safeValue, EXA_BASE), price)\n return new TokenAmount(lendToken, amount)\n } else {\n const amount = lendToken.getSupplyBalanceAmount()\n return new TokenAmount(lendToken, amount)\n }\n }\n }\n\n function onBorrowMax(lendToken: CToken, safe = true): CurrencyAmount {\n const price = lendToken.getUnderlyingPrice()\n const borrowMaxValue = JSBI.subtract(\n // multiply 0.8\n JSBI.divide(JSBI.multiply(limit, safe ? EIGHT : TEN), TEN),\n borrowTotalBalance\n )\n const numerator = JSBI.greaterThan(borrowMaxValue, ZERO) ? borrowMaxValue : ZERO\n const liquidity = lendToken.getLiquidity()\n const borrowMaxAmount = JSBI.divide(JSBI.multiply(numerator, EXA_BASE), price)\n\n if (JSBI.greaterThan(borrowMaxAmount, liquidity)) {\n return new TokenAmount(lendToken, liquidity)\n } else {\n return new TokenAmount(lendToken, borrowMaxAmount)\n }\n }\n\n function onRepayMax(lendToken: CToken): TokenAmount | undefined {\n const borrowAmount = new TokenAmount(lendToken, lendToken.getBorrowBalanceAmount())\n if (walletBalanceAmount && JSBI.greaterThan(walletBalanceAmount.raw, borrowAmount.raw)) {\n return borrowAmount\n } else {\n return walletBalanceAmount\n }\n }\n\n const lendingInfoWithdrawMax = lendToken ? onWithdrawMax(lendToken, false) : undefined\n const lendingInfoOnBorrowMax = lendToken ? onBorrowMax(lendToken, false) : undefined\n\n const { inputError, inputText } = useLendingInfo(\n lendInputValue,\n lendToken,\n tabItemActive,\n limit,\n lendingInfoWithdrawMax,\n lendingInfoOnBorrowMax,\n walletBalanceAmount?.raw\n )\n\n async function onMint(cToken: CToken, lendInputValue: string, isETH: boolean) {\n const inputAmount = tryParseAmount(lendInputValue, cToken)\n if (!inputAmount) throw new Error('missing input amount')\n\n const amount = inputAmount.raw.toString()\n if (!chainId || !library || !account || !amount) return\n let estimate,\n method: (...args: any) => Promise,\n args: Array,\n value: BigNumber | null\n if (isETH) {\n const cTokenContract = getCEtherContract(chainId, cToken.cAddress, library, account)\n estimate = cTokenContract.estimateGas.mint\n method = cTokenContract.mint\n args = []\n value = BigNumber.from(amount)\n } else {\n const cTokenContract = getCERC20Contract(chainId, cToken.cAddress, library, account)\n estimate = cTokenContract.estimateGas.mint\n method = cTokenContract.mint\n args = [amount]\n value = null\n }\n\n setPendingText(t('supplyUppercase') + lendInputValue + ' ' + cToken.symbol)\n setAttemptingTxn(true)\n await estimate(...args, value ? { value } : {})\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: t('supplyUppercase') + lendInputValue + ' ' + cToken.symbol\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Liquidity',\n action: 'Add',\n label: cToken.symbol\n })\n })\n )\n .catch(error => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n async function onRedeem(cToken: CToken, lendInputValue: string) {\n const inputAmount = tryParseAmount(lendInputValue, cToken)\n if (!inputAmount) throw new Error('missing input amount')\n\n const amount = inputAmount.raw.toString()\n\n if (!chainId || !library || !account || !amount) return\n const cTokenContract = getCERC20Contract(chainId, cToken.cAddress, library, account)\n\n let estimate, method: (...args: any) => Promise, args: Array\n const value: BigNumber | null = null\n\n const supplyBalanceAmount = new TokenAmount(cToken, cToken.getSupplyBalanceAmount()).toExact() ?? ''\n if (lendInputValue === supplyBalanceAmount) {\n estimate = cTokenContract.estimateGas.redeem\n method = cTokenContract.redeem\n args = [JSBI.BigInt(cToken.supplyBalance ?? 0).toString()]\n } else {\n estimate = cTokenContract.estimateGas.redeemUnderlying\n method = cTokenContract.redeemUnderlying\n args = [amount]\n }\n\n setPendingText(t('withdrawUppercase') + lendInputValue + ' ' + cToken.symbol)\n setAttemptingTxn(true)\n await estimate(...args, value ? { value } : {})\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: t('withdrawUppercase') + lendInputValue + ' ' + cToken.symbol\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Liquidity',\n action: 'Remove',\n label: cToken.symbol\n })\n })\n )\n .catch(error => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n async function onBorrow(cToken: CToken, lendInputValue: string) {\n const inputAmount = tryParseAmount(lendInputValue, cToken)\n if (!inputAmount) throw new Error('missing input amount')\n\n const amount = inputAmount.raw.toString()\n if (!chainId || !library || !account || !amount) return\n const cTokenContract = getCERC20Contract(chainId, cToken.cAddress, library, account)\n\n const estimate = cTokenContract.estimateGas.borrow\n const method: (...args: any) => Promise = cTokenContract.borrow\n const args: Array = [amount]\n const value: BigNumber | null = null\n\n setPendingText(t('borrowUppercase') + lendInputValue + ' ' + cToken.symbol)\n setAttemptingTxn(true)\n await estimate(...args, value ? { value } : {})\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: t('borrowUppercase') + lendInputValue + ' ' + cToken.symbol\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Lend',\n action: 'Borrow',\n label: cToken.symbol\n })\n })\n )\n .catch(error => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n async function onRepayBorrow(cToken: CToken, lendInputValue: string, isETH: boolean) {\n const inputAmount = tryParseAmount(lendInputValue, cToken)\n if (!inputAmount) throw new Error('missing input amount')\n\n const amount = inputAmount.raw.toString()\n if (!chainId || !library || !account || !amount) return\n\n let estimate,\n method: (...args: any) => Promise,\n args: Array,\n value: BigNumber | null\n\n const borrowBlanceAmount = cToken.getBorrowBalanceAmount()\n const borrowAmount = new TokenAmount(cToken, borrowBlanceAmount).toExact() ?? ''\n if (isETH) {\n const maximillionContract = getMaximillionContract(chainId, library, account)\n estimate = maximillionContract.estimateGas.repayBehalf\n method = maximillionContract.repayBehalf\n args = [account]\n if (lendInputValue === borrowAmount) {\n // pay max eth with 0.35% extra ETH\n value = BigNumber.from(\n JSBI.divide(JSBI.multiply(borrowBlanceAmount, JSBI.BigInt(10035)), JSBI.BigInt(10000)).toString()\n )\n } else {\n value = BigNumber.from(amount) // TODO: consider use cTokenMaxAmountSpend to substract tx fee\n }\n } else {\n const cTokenContract = getCERC20Contract(chainId, cToken.cAddress, library, account)\n estimate = cTokenContract.estimateGas.repayBorrow\n method = cTokenContract.repayBorrow\n if (lendInputValue === borrowAmount) {\n args = ['0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff']\n } else {\n args = [amount]\n }\n value = null\n }\n\n setPendingText(t('repayUppercase') + lendInputValue + ' ' + cToken.symbol)\n setAttemptingTxn(true)\n await estimate(...args, value ? { value } : {})\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: t('repayUppercase') + lendInputValue + ' ' + cToken.symbol\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Lend',\n action: 'Repay',\n label: cToken.symbol\n })\n })\n )\n .catch(error => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n const confirmationContent = useCallback(\n () =>\n txHash ? (\n <>\n ) : (\n \n ),\n [handleDismissConfirmation, t, txHash]\n )\n\n return (\n
\n \n setShowLendConfirmation(false)}>\n \n \n \n
\n \n {lendToken?.logo1 ? (\n \n ) : (\n \n )}\n \n {lendToken?.name}\n \n \n setShowLendConfirmation(false)} />\n \n \n
\n \n {tabItemActive === LendField.WITHDRAW ||\n tabItemActive === LendField.BORROW ||\n (approvalTokenStatus === ApprovalState.APPROVED && lendToken?.address) ? (\n \n
\n {\n if (lendToken) {\n switch (tabItemActive) {\n case LendField.SUPPLY:\n setLendInputValue(onSupplyMax()?.toExact() ?? '')\n break\n case LendField.WITHDRAW:\n setLendInputValue(onWithdrawMax(lendToken, true).toExact() ?? '')\n break\n case LendField.BORROW:\n setLendInputValue(onBorrowMax(lendToken, true).toExact() ?? '')\n break\n case LendField.REPAY:\n setLendInputValue(onRepayMax(lendToken)?.toExact() ?? '')\n break\n default:\n break\n }\n } else {\n return\n }\n }}\n label={t('amount')}\n showMaxButton={true}\n id=\"lend-input\"\n />\n \n ) : (\n \n {lendToken?.logo1 ? (\n \n ) : (\n \n )}\n \n {t('approveQuestionHelper')}\n \n \n )}\n \n \n \n {\n if (\n lendMarket === LendField.SUPPLY\n ? LendField.SUPPLY === tabItemActive\n : LendField.BORROW === tabItemActive\n ) {\n setTabItemActive(lendMarket === LendField.SUPPLY ? LendField.SUPPLY : LendField.BORROW)\n } else {\n setTabItemActive(lendMarket === LendField.SUPPLY ? LendField.SUPPLY : LendField.BORROW)\n setLendInputValue('')\n }\n }}\n >\n {lendMarket === LendField.SUPPLY\n ? t(LendField.SUPPLY.toLowerCase())\n : t(LendField.BORROW.toLowerCase())}\n \n {\n if (\n lendMarket === LendField.SUPPLY\n ? LendField.WITHDRAW === tabItemActive\n : LendField.REPAY === tabItemActive\n ) {\n setTabItemActive(lendMarket === LendField.SUPPLY ? LendField.WITHDRAW : LendField.REPAY)\n } else {\n setTabItemActive(lendMarket === LendField.SUPPLY ? LendField.WITHDRAW : LendField.REPAY)\n setLendInputValue('')\n }\n }}\n >\n {lendMarket === LendField.SUPPLY\n ? t(LendField.WITHDRAW.toLowerCase())\n : t(LendField.REPAY.toLowerCase())}\n \n \n \n \n \n \n {lendMarket === LendField.BORROW ? t('borrowRates') : t('supplyRates')}\n \n \n {lendToken?.logo1 ? (\n \n ) : (\n \n )}\n \n {lendToken?.symbol} {t('APY')}\n \n \n \n {lendToken && lendMarket === LendField.SUPPLY\n ? getSupplyApy(lendToken).toFixed(2)\n : lendToken && getBorrowApy(lendToken).toFixed(2)}\n %\n \n \n \n {(approvalTokenStatus === ApprovalState.APPROVED ||\n tabItemActive === LendField.WITHDRAW ||\n tabItemActive === LendField.BORROW) && (\n \n {t('borrowLimit')}\n \n \n {lendMarket === LendField.BORROW ? t('borrowBalance') : t('borrowLimit')}\n \n \n \n $\n {lendMarket === LendField.BORROW\n ? formatData(borrowTotalBalance).toFixed(2)\n : formatData(limit).toFixed(2)}\n \n {lendInputValue && (\n <>\n \n ${changedBorrowLimit.toFixed(2)}\n \n )}\n \n \n \n \n \n {t('borrowLimitUsed')}\n \n \n {usedLimit.toSignificant(4) ?? '0.00'}%\n {lendInputValue && (\n <>\n \n {changedBorrowLimitUsed.toFixed(2)}%\n \n )}\n \n \n \n \n )}\n \n \n {tabItemActive === LendField.SUPPLY || tabItemActive === LendField.REPAY ? (\n <>\n {approvalTokenStatus === ApprovalState.APPROVED ? (\n {\n setTxHash('')\n setShowConfirm(true)\n if (lendToken && inputAmount && tabItemActive === LendField.SUPPLY) {\n onMint(lendToken, lendInputValue, lendToken.isETH())\n setShowLendConfirmation(false)\n }\n if (lendToken && inputAmount && tabItemActive === LendField.REPAY) {\n onRepayBorrow(lendToken, lendInputValue, lendToken.isETH())\n setShowLendConfirmation(false)\n }\n }}\n >\n {inputText?.toLocaleUpperCase()}\n \n ) : (\n {\n setTxHash('')\n setPendingText('')\n setShowConfirm(true)\n approveCallback()\n }}\n >\n {approvalTokenStatus === ApprovalState.PENDING ? (\n {t('approvePending')}\n ) : (\n t('enable')\n )}\n \n )}\n \n ) : (\n {\n setTxHash('')\n setShowConfirm(true)\n if (lendToken && inputAmount && tabItemActive === LendField.WITHDRAW) {\n onRedeem(lendToken, lendInputValue)\n setShowLendConfirmation(false)\n }\n\n if (lendToken && inputAmount && tabItemActive === LendField.BORROW) {\n onBorrow(lendToken, lendInputValue)\n setShowLendConfirmation(false)\n }\n }}\n >\n {inputText?.toLocaleUpperCase()}\n \n )}\n \n \n \n \n {tabItemActive === LendField.WITHDRAW || tabItemActive === LendField.BORROW\n ? tabItemActive === LendField.WITHDRAW\n ? t('currentlySupplying')\n : t('currentlyBorrowing')\n : t('walletBalance')}\n \n {(lendToken && tabItemActive === LendField.WITHDRAW) ||\n (lendToken && tabItemActive === LendField.BORROW)\n ? tabItemActive === LendField.WITHDRAW\n ? new TokenAmount(lendToken, lendToken.getSupplyBalanceAmount()).toFixed(4)\n : new TokenAmount(lendToken, lendToken.getBorrowBalanceAmount()).toFixed(4)\n : (walletBalanceAmount && walletBalanceAmount.toSignificant()) || '0'}\n {' ' + lendToken?.symbol}\n \n \n
\n
\n \n \n
\n )\n}\n\nexport default LendModal\n","import React, { useCallback, useEffect, useState } from 'react'\nimport Switch from '../Switch'\nimport styled from 'styled-components'\nimport CurrencyIcon from '../CurrencyIcon'\nimport Modal from '../Modal'\nimport { AutoColumn } from '../Column'\nimport { Text } from 'rebass'\nimport { RowBetween } from '../Row'\nimport { X } from 'react-feather'\nimport { CToken } from '../../data/CToken'\nimport { ButtonLight } from '../Button'\nimport LendModal from '../LendModal'\nimport { APY_BASE, calculateGasMargin, formatData, getComptrollerContract, getSupplyTotalBalance } from '../../utils'\nimport { useActiveWeb3React } from '../../hooks'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport ReactGA from 'react-ga'\nimport { LendField } from '../../state/lending/actions'\nimport { useCTokenApproveCallback } from '../../hooks/useApproveCallback'\nimport { ChainId, Fraction, JSBI, TokenAmount } from '@uniswap/sdk'\nimport DoubleAssetLogo from '../DoubleAssetLogo'\nimport TransactionConfirmationModal, { TransactionErrorContent } from '../TransactionConfirmationModal'\nimport { useTranslation } from 'react-i18next'\nimport Skeleton from 'components/Skeleton'\nimport { CTOKEN_LISTS } from 'constants/lend'\n\nconst StyledCloseIcon = styled(X)`\n height: 20px;\n width: 20px;\n :hover {\n cursor: pointer;\n }\n\n > * {\n stroke: ${({ theme }) => theme.text1};\n }\n`\n\nconst MarketsCard = styled.div`\n background: ${({ theme }) => theme.bg1};\n color: ${({ theme }) => theme.text1};\n box-shadow: 0px 2px 4px rgba(16, 21, 24, 0.05);\n border-radius: 4px;\n`\n\nconst MarketsCardHeader = styled.div`\n display: flex;\n flex-flow: inherit;\n align-items: center;\n justify-content: space-between;\n font-size: 1.1rem;\n padding: 1rem 1.75rem;\n font-weight: 600;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n ${({ theme }) => theme.mediaWidth.upToMedium`\n padding: 1rem;\n font-size: 1rem;\n `};\n`\n\nconst AssetWrap = styled.div`\n cursor: pointer;\n font-size: 1rem;\n`\n\nconst AssetWrapLabels = styled.div`\n display: grid;\n padding: 1rem 1.75rem;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n align-items: center;\n grid-template-columns: 200px 2fr 4fr 90px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n grid-template-columns: 140px 4fr 70px;\n padding: 0.8rem 1rem;\n `};\n`\n\nconst AssetLabel = styled.div<{ textAlign?: string; mobileHide?: boolean }>`\n font-size: 12px;\n font-weight: 500;\n color: #aab8c1;\n text-align: ${({ textAlign }) => (textAlign ? textAlign : 'center')};\n ${({ theme, mobileHide }) => theme.mediaWidth.upToMedium`\n display: ${mobileHide ? 'none' : 'block'};\n `};\n`\n\nconst AssetItemWrap = styled.div`\n font-size: 1rem;\n`\n\nconst AssetItem = styled.div<{ justifyItems?: string }>`\n display: grid;\n justify-items: ${({ justifyItems }) => (justifyItems ? justifyItems : 'end')};\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n padding: 1.25rem 1.75rem;\n height: 78px;\n border-left: 2px solid transparent;\n padding-left: 1.625rem;\n text-transform: none;\n font-size: 1rem;\n font-weight: 500;\n letter-spacing: 0;\n transition: none;\n grid-template-columns: 200px 2fr 4fr 90px;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n grid-template-columns: 140px 4fr 70px;\n padding: 0.8rem 1rem;\n `};\n :hover {\n border-left: 2px solid #1de9b6;\n background: rgba(4, 169, 245, 0.05);\n }\n`\n\nconst AssetLogo = styled.div`\n display: flex;\n align-items: center;\n justify-self: start;\n`\n\nconst ItemWrap = styled.div<{ mobileHide?: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: right;\n align-self: center;\n text-align: right;\n font-size: 0.95rem;\n ${({ theme, mobileHide }) => theme.mediaWidth.upToMedium`\n display: ${mobileHide ? 'none' : 'flex'};\n font-size: 0.8rem;\n `};\n`\n\nconst ItemBottomWrap = styled.div<{ mobileShow?: boolean }>`\n color: #aab8c1;\n font-size: 0.9em;\n`\n\nconst MobileWrap = styled.div`\n display: none;\n color: #aab8c1;\n text-align: left;\n font-size: 0.9em;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n display: block;\n `};\n`\n\nconst Break = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.bg3};\n`\n\nconst ModalContentWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem 0;\n background-color: ${({ theme }) => theme.bg2};\n border-radius: 20px;\n`\n\nconst SymbolWrap = styled.div`\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 8rem;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n width: 6rem;\n `};\n`\n\nfunction ItemPannel({\n marketCToken,\n walletBalances,\n children\n}: {\n marketCToken: CToken\n walletBalances: {\n [tokenAddress: string]: TokenAmount | undefined\n }\n children: React.ReactNode\n}) {\n useCTokenApproveCallback(marketCToken, walletBalances, marketCToken.cAddress)\n return <>{children}\n}\n\nexport function getSupplyApy(ctoken: CToken): Fraction {\n return new Fraction(ctoken.getSupplyApy(), APY_BASE)\n}\n\nfunction SupplyMarkets({\n allMarketCTokens = [],\n borrowTotalBalance,\n limit,\n usedLimit,\n walletBalances\n}: {\n allMarketCTokens: CToken[]\n borrowTotalBalance: JSBI\n limit: JSBI\n usedLimit: Fraction\n walletBalances: {\n [tokenAddress: string]: TokenAmount | undefined\n }\n}) {\n const { t } = useTranslation()\n\n const { account, chainId, library } = useActiveWeb3React()\n\n const cTokenList = CTOKEN_LISTS[chainId ?? ChainId.MAINNET]\n\n const [attemptingTxn, setAttemptingTxn] = useState(false) // clicked confirm\n\n const [showConfirm, setShowConfirm] = useState(false)\n\n const [txHash, setTxHash] = useState('')\n\n const [pendingText, setPendingText] = useState('')\n\n console.log('use txHash and attemptingTxn later like Add Liquidity', attemptingTxn, txHash)\n\n const addTransaction = useTransactionAdder()\n\n async function onEnterMarkets(cToken: CToken) {\n if (!chainId || !library || !account) return\n const comptroller = getComptrollerContract(chainId, library, account)\n\n const estimate = comptroller.estimateGas.enterMarkets\n const method: (...args: any) => Promise = comptroller.enterMarkets\n const args: Array = [[cToken.cAddress]]\n const value: BigNumber | null = null\n\n setPendingText(t('enter') + cToken.symbol + t('asCollateral'))\n setAttemptingTxn(true)\n await estimate(...args, value ? { value } : {})\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: t('enter') + cToken.symbol + t('asCollateral')\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Collateral',\n action: 'Enter',\n label: cToken.symbol\n })\n })\n )\n .catch(error => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n async function onExitMarket(cToken: CToken) {\n if (!chainId || !library || !account) return\n const comptroller = getComptrollerContract(chainId, library, account)\n\n const estimate = comptroller.estimateGas.exitMarket\n const method: (...args: any) => Promise = comptroller.exitMarket\n const args: Array = [cToken.cAddress]\n const value: BigNumber | null = null\n\n setPendingText(t('exit') + cToken.symbol + t('asCollateral'))\n setAttemptingTxn(true)\n await estimate(...args, value ? { value } : {})\n .then(estimatedGasLimit =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit)\n }).then(response => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: t('exit') + cToken.symbol + t('asCollateral')\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Collateral',\n action: 'Exit',\n label: cToken.symbol\n })\n })\n )\n .catch(error => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (error?.code !== 4001) {\n console.error(error)\n }\n })\n }\n\n const [showCollateralConfirmation, setShowCollateralConfirmation] = useState(false)\n\n const [collateralToken, setCollateralToken] = useState()\n\n const [lendToken, setLendToken] = useState()\n\n const [showLendConfirmation, setShowLendConfirmation] = useState(false)\n\n const [isSuppliedMarkets, setIsSuppliedMarkets] = useState(false)\n\n const [TokenLoadState, setTokenLoadState] = useState(false)\n\n useEffect(() => {\n if (allMarketCTokens.length > 0) {\n setTokenLoadState(true)\n } else {\n setTokenLoadState(false)\n }\n }, [allMarketCTokens])\n\n const suppliedAsset = allMarketCTokens.filter((item: CToken) => {\n return item.supplyBalance && BigNumber.from(0).lt(item.supplyBalance)\n })\n\n const supplyAsset = allMarketCTokens.filter((item: CToken) => {\n return (\n (!item.supplyBalance || BigNumber.from(0).eq(item.supplyBalance)) &&\n (!item.borrowBalance || BigNumber.from(0).eq(item.borrowBalance))\n )\n })\n\n console.log('check--', allMarketCTokens, suppliedAsset, supplyAsset)\n\n function canExitMarkets(): boolean {\n if (collateralToken) {\n const canExitMarkets: boolean = JSBI.lessThan(\n JSBI.subtract(limit, collateralToken.getSuppliedValue()),\n borrowTotalBalance\n )\n if (canExitMarkets) {\n return false\n } else {\n return true\n }\n } else {\n return false\n }\n }\n\n const handleDismissConfirmation = useCallback(() => {\n setShowConfirm(false)\n }, [])\n\n const confirmationContent = useCallback(\n () =>\n txHash ? (\n <>\n ) : (\n \n ),\n [handleDismissConfirmation, txHash]\n )\n\n return (\n
\n \n \n setShowCollateralConfirmation(false)}>\n \n \n \n
\n \n {collateralToken?.canBeCollateral\n ? t('disableAsCollateral')\n : isSuppliedMarkets\n ? t('collateralRequired')\n : t('enableAsCollateral')}\n \n setShowCollateralConfirmation(false)} />\n \n \n \n {collateralToken?.canBeCollateral && canExitMarkets() ? (\n \n {t('collateralQuestionHelperOne')}\n \n ) : collateralToken?.canBeCollateral ? (\n \n {t('collateralQuestionHelperTwo')}\n \n ) : (\n \n {t('collateralQuestionHelperThree')}\n \n )}\n \n \n {\n if (collateralToken) {\n if (collateralToken.canBeCollateral) {\n if (canExitMarkets()) {\n setPendingText('')\n setTxHash('')\n setShowConfirm(true)\n onExitMarket(collateralToken)\n setShowCollateralConfirmation(false)\n } else {\n return setShowCollateralConfirmation(false)\n }\n } else {\n setPendingText('')\n setTxHash('')\n setShowConfirm(true)\n onEnterMarkets(collateralToken)\n setShowCollateralConfirmation(false)\n }\n } else {\n return\n }\n }}\n >\n {collateralToken?.canBeCollateral && canExitMarkets()\n ? t('disableCollateralAsset', { symbol: collateralToken?.symbol })\n : collateralToken?.canBeCollateral\n ? t('dismiss')\n : t('useAssetAsCollateral', { symbol: collateralToken?.symbol })}\n \n \n \n \n \n {!!suppliedAsset.length && (\n \n {t('suppliedMarkets')}\n \n \n {t('asset')}\n \n {t('APY')}\n \n {t('assetBalance')}\n {t('collateral')}\n \n setShowLendConfirmation(true)}>\n {suppliedAsset.map((item: CToken) => (\n \n {\n if (TokenLoadState) {\n setLendToken(item)\n setShowLendConfirmation(true)\n }\n }}\n >\n \n {item.logo1 ? (\n \n ) : (\n \n )}\n \n {item.name}\n \n {getSupplyApy(item).toFixed(2) ?? 0}%\n \n \n \n \n \n
{getSupplyApy(item).toFixed(2) ?? 0}%
\n
\n
\n \n \n
${formatData(getSupplyTotalBalance([item])).toFixed(2) ?? ''}
\n \n {new TokenAmount(item, item.getSupplyBalanceAmount()).toSignificant()}\n {' ' + item.symbol}\n \n
\n
\n {\n if (TokenLoadState) {\n setCollateralToken(item)\n setIsSuppliedMarkets(true)\n setShowCollateralConfirmation(true)\n }\n }}\n />\n \n
\n ))}\n
\n
\n
\n )}\n \n {t('supplyMarkets')}\n \n \n {t('asset')}\n \n {t('APY')}\n \n {t('assetWallet')}\n {t('collateral')}\n \n \n {!!supplyAsset.length\n ? supplyAsset.map((item: CToken) => (\n \n {\n if (TokenLoadState) {\n setLendToken(item)\n setShowLendConfirmation(true)\n }\n }}\n >\n \n {item.logo1 ? (\n \n ) : (\n \n )}\n \n {item.name}\n \n {getSupplyApy(item).toFixed(2) ?? 0}%\n \n \n \n \n
\n {getSupplyApy(item).toFixed(2) ?? 0}%\n
\n
\n \n \n {walletBalances[item.address]?.toSignificant(4) ?? '0'}\n {' ' + item.symbol}\n \n \n {\n if (TokenLoadState) {\n setCollateralToken(item)\n setIsSuppliedMarkets(false)\n setShowCollateralConfirmation(true)\n }\n }}\n />\n \n
\n ))\n : cTokenList.map((item: any, index) => (\n \n \n \n {item[8] ? (\n \n ) : (\n \n )}\n \n {item[6]}\n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n
\n
\n ))}\n
\n
\n
\n
\n )\n}\n\nexport default SupplyMarkets\n","import React, { useMemo } from 'react'\nimport { AutoColumn } from '../../components/Column'\nimport styled from 'styled-components'\n\nimport Summary from '../../components/Summary'\nimport SupplyMarkets from '../../components/SupplyMarkets'\nimport BorrowMarkets from '../../components/BorrowMarkets'\nimport { CToken, CTokenState } from '../../data/CToken'\nimport {\n getBorrowTotalBalance,\n getLimit,\n getNetApy,\n getSupplyTotalBalance,\n getTotalMarketSize,\n ONE_HUNDRED\n} from '../../utils'\nimport { Fraction, JSBI } from '@uniswap/sdk'\nimport { useCTokenBalances } from '../../state/wallet/hooks'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAllLendingMarket } from 'state/lending/hooks'\n\nconst PageWrapper = styled(AutoColumn)`\n max-width: 1280px;\n width: 90%;\n ${({ theme }) => theme.mediaWidth.upToLarge`\n width: 90%;\n `};\n ${({ theme }) => theme.mediaWidth.upToMedium`\n width: 100%;\n `};\n`\n\nconst MarketsWrap = styled.div`\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n justify-content: space-between;\n align-items: start;\n flex-direction: row;\n gap: 1.3rem;\n width: 100%;\n grid-template-columns: 1fr 1fr;\n ${({ theme }) => theme.mediaWidth.upToMedium`\n width: 100%;\n grid-template-columns: 1fr;\n `};\n`\n\nfunction useAllMarketCTokens(markets: [CTokenState, CToken | null][]): CToken[] {\n return useMemo(\n () =>\n Object.values(\n markets\n // filter out invalid ctokens\n .filter((result): result is [CTokenState.EXISTS, CToken] =>\n Boolean(result[0] === CTokenState.EXISTS && result[1])\n )\n // filter out duplicated ctokens\n .reduce<{ [cAddress: string]: CToken }>((memo, [, curr]) => {\n memo[curr.cAddress] = memo[curr.cAddress] ?? curr\n return memo\n }, {})\n ),\n [markets]\n )\n}\n\nexport default function Lend() {\n const { account } = useActiveWeb3React()\n\n const allMarkets = useAllLendingMarket()\n\n const allMarketCTokens: CToken[] = useAllMarketCTokens(allMarkets)\n\n const walletBalances = useCTokenBalances(account ?? undefined, allMarketCTokens)\n\n const supplyTotalBalance = getSupplyTotalBalance(allMarketCTokens)\n\n const borrowTotalBalance = getBorrowTotalBalance(allMarketCTokens)\n\n const totalMarketSize = useMemo(() => getTotalMarketSize(allMarketCTokens), [allMarketCTokens])\n\n const limit: JSBI = useMemo(() => getLimit(allMarketCTokens), [allMarketCTokens])\n\n const usedLimit: Fraction = useMemo(() => new Fraction(borrowTotalBalance, limit), [borrowTotalBalance, limit])\n\n const usedLimtPercent = useMemo(() => usedLimit.multiply(ONE_HUNDRED), [usedLimit])\n\n return (\n <>\n \n \n \n \n \n \n \n \n )\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 AddressClaimModal from '../components/claim/AddressClaimModal'\nimport Header from '../components/Header'\nimport Polling from '../components/Header/Polling'\nimport URLWarning from '../components/Header/URLWarning'\nimport Web3ReactManager from '../components/Web3ReactManager'\nimport { ApplicationModal } from '../state/application/actions'\nimport { useModalOpen, useToggleModal } from '../state/application/hooks'\nimport DarkModeQueryParamReader from '../theme/DarkModeQueryParamReader'\nimport AddFlashLoanLiquidity from './AddFlashLoanLiquidity'\nimport { RedirectFlashLoanAddLiquidity, RedirectToAddLiquidity } from './AddFlashLoanLiquidity/redirects'\nimport DeerEarn from './DeerEarn'\nimport Manage from './DeerEarn/Manage'\nimport FlashLoanPool from './FlashLoanPool'\nimport FlashLoanPoolFinder from './FlashLoanPoolFinder'\nimport RemoveFlashLoanLiquidity from './RemoveFlashLoanLiquidity'\nimport DeerVote from './DeerVote'\nimport VotePage from './DeerVote/VotePage'\nimport { RedirectPathToPoolOnly } from './FlashLoanPool/redirects'\nimport FlashLoan from './FlashLoan'\n\nimport Lend from './Lend'\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: 60px;\n align-items: center;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n z-index: 10;\n\n ${({ theme }) => theme.mediaWidth.upToMedium`\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\nfunction 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","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'\nimport { UNSUPPORTED_LIST_URLS } from './../../constants/lists'\nimport { getVersionUpgrade, minVersionBump, VersionUpgrade } from '@uniswap/token-lists'\nimport { useCallback, useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useFetchListCallback } from '../../hooks/useFetchListCallback'\nimport useInterval from '../../hooks/useInterval'\nimport useIsWindowVisible from '../../hooks/useIsWindowVisible'\nimport { AppDispatch } from '../index'\nimport { acceptListUpdate } from './actions'\nimport { useActiveListUrls } from './hooks'\nimport { useAllInactiveTokens } from 'hooks/Tokens'\n\nexport default function Updater(): null {\n const { library } = useActiveWeb3React()\n const dispatch = useDispatch()\n const isWindowVisible = useIsWindowVisible()\n\n // get all loaded lists, and the active urls\n const lists = useAllLists()\n const activeListUrls = useActiveListUrls()\n\n // initiate loading\n useAllInactiveTokens()\n\n const fetchList = useFetchListCallback()\n const fetchAllListsCallback = useCallback(() => {\n if (!isWindowVisible) return\n Object.keys(lists).forEach(url =>\n fetchList(url).catch(error => console.debug('interval list fetching error', error))\n )\n }, [fetchList, isWindowVisible, lists])\n\n // fetch all lists every 10 minutes, but only after we initialize library\n useInterval(fetchAllListsCallback, library ? 1000 * 60 * 10 : null)\n\n // whenever a list is not loaded and not loading, try again to load it\n useEffect(() => {\n Object.keys(lists).forEach(listUrl => {\n const list = lists[listUrl]\n if (!list.current && !list.loadingRequestId && !list.error) {\n fetchList(listUrl).catch(error => console.debug('list added fetching error', error))\n }\n })\n }, [dispatch, fetchList, library, lists])\n\n // automatically update lists if versions are minor/patch\n useEffect(() => {\n Object.keys(lists).forEach(listUrl => {\n const list = lists[listUrl]\n if (list.current && list.pendingUpdate) {\n const bump = getVersionUpgrade(list.current.version, list.pendingUpdate.version)\n switch (bump) {\n case VersionUpgrade.NONE:\n throw new Error('unexpected no version bump')\n case VersionUpgrade.PATCH:\n case VersionUpgrade.MINOR:\n const min = minVersionBump(list.current.tokens, list.pendingUpdate.tokens)\n // automatically update minor/patch as long as bump matches the min update\n if (bump >= min) {\n dispatch(acceptListUpdate(listUrl))\n } else {\n console.error(\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`\n )\n }\n break\n\n case VersionUpgrade.MAJOR:\n // accept update if list is active or list in background\n if (activeListUrls?.includes(listUrl) || UNSUPPORTED_LIST_URLS.includes(listUrl)) {\n dispatch(acceptListUpdate(listUrl))\n }\n }\n }\n })\n }, [dispatch, lists, activeListUrls])\n\n return null\n}\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'\nimport 'inter-ui'\nimport React, { StrictMode } from 'react'\nimport { isMobile } from 'react-device-detect'\nimport ReactDOM from 'react-dom'\nimport ReactGA from 'react-ga'\nimport { Provider } from 'react-redux'\nimport { HashRouter } from 'react-router-dom'\nimport Blocklist from './components/Blocklist'\nimport { NetworkContextName } from './constants'\nimport './i18n'\nimport App from './pages/App'\nimport store from './state'\nimport ApplicationUpdater from './state/application/updater'\nimport ListsUpdater from './state/lists/updater'\nimport MulticallUpdater from './state/multicall/updater'\nimport TransactionUpdater from './state/transactions/updater'\nimport UserUpdater from './state/user/updater'\nimport ThemeProvider, { FixedGlobalStyle, ThemedGlobalStyle } from './theme'\nimport getLibrary from './utils/getLibrary'\n\nconst Web3ProviderNetwork = createWeb3ReactRoot(NetworkContextName)\n\nif ('ethereum' in window) {\n ;(window.ethereum as any).autoRefreshOnNetworkChange = false\n}\n\nconst GOOGLE_ANALYTICS_ID: string | undefined = process.env.REACT_APP_GOOGLE_ANALYTICS_ID\nif (typeof GOOGLE_ANALYTICS_ID === 'string') {\n ReactGA.initialize(GOOGLE_ANALYTICS_ID)\n ReactGA.set({\n customBrowserType: !isMobile ? 'desktop' : 'web3' in window || 'ethereum' in window ? 'mobileWeb3' : 'mobileRegular'\n })\n} else {\n ReactGA.initialize('test', { testMode: true, debug: true })\n}\n\nwindow.addEventListener('error', error => {\n ReactGA.exception({\n description: `${error.message} @ ${error.filename}:${error.lineno}:${error.colno}`,\n fatal: true\n })\n})\n\nfunction Updaters() {\n return (\n <>\n \n \n \n \n \n \n )\n}\n\nReactDOM.render(\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById('root')\n)\n","module.exports = __webpack_public_path__ + \"static/media/blue-loader.904b44c2.svg\";"],"sourceRoot":""}