{"version":3,"sources":["img/logo.png","img/ic_ethereum_24.svg","img/ic_arbitrum_24.svg","img/ic_avalanche_24.svg","img/ic_ethereum_16.svg","img/ic_language24.svg","img/ic_moonbeam_24.svg","img/ic_arbitrum_16.svg","img/ic_avalanche_16.svg","img/ic_checked.svg","img/ic_moonbeam_16.svg","img/ic_settings_16.svg","img/DROP_DOWN.svg","img/buy_fxdx.svg","img/coinbaseWallet.png","img/ic_arbitrum_96.svg","img/ic_avalanche_96.svg","img/ic_buy_flp.svg","img/ic_coingecko_16.svg","img/ic_convert_down.svg","img/ic_copy_16.svg","img/ic_cost.svg","img/ic_discord.svg","img/ic_github.svg","img/ic_liquidity.svg","img/ic_medium.svg","img/ic_metamask_16.svg","img/ic_new_link_16.svg","img/ic_sign_out_16.svg","img/ic_simpleswaps.svg","img/ic_stats.svg","img/ic_telegram.svg","img/ic_totaluser.svg","img/ic_trading.svg","img/ic_twitter.svg","img/ic_wallet_24.svg","img/long.svg","img/metamask.png","img/position-share-bg.png","img/short.svg","img/swap.svg","img/walletconnect-circle-blue.svg","img sync /^/.//.*$","img/Anyswap.png","img/Anyswap.svg","img/Artwork.svg","img/Artwork_fxdx.svg","img/Banxa.png","img/Hop.png","img/Hop.svg","img/Hop_dark.png","img/Hop_dark.svg","img/Synapse.png","img/Synapse.svg","img/binance.png","img/bscscan.png","img/btn_big_arbitrum.png","img/btn_big_avalanche.png","img/btn_big_bsc.png","img/btn_big_purchasegmx.png","img/btn_big_purchasegmx.svg","img/buy_fxdx_bond.svg","img/buy_transfer_eth.svg","img/coingecko.png","img/cross.svg","img/flag_en.svg","img/flag_es.svg","img/flag_fr.svg","img/flag_ja.svg","img/flag_ko.svg","img/flag_ru.svg","img/flag_zh.svg","img/flp_icon.svg","img/fxdx-logo-final-white-small.png","img/fxdx-logo-final-white.png","img/fxdx-logo-final.png","img/fxdx-logo-glow.png","img/fxdx-logo-with-name.svg","img/fxdx_logo.svg","img/graphite-01.png","img/ic-communityproject.svg","img/ic_arbitrum_hover_16.svg","img/ic_arrowleft16.svg","img/ic_arrowright16.svg","img/ic_avax_24.svg","img/ic_avax_30.svg","img/ic_avax_40.svg","img/ic_banxa.svg","img/ic_binance_logo.svg","img/ic_bsc.svg","img/ic_bsc_96.svg","img/ic_btc.b_24.svg","img/ic_btc.b_40.svg","img/ic_btc_24.svg","img/ic_btc_40.svg","img/ic_busd_24.svg","img/ic_busd_40.svg","img/ic_cash.png","img/ic_cash.svg","img/ic_coingecko_hover_16.svg","img/ic_dai_24.svg","img/ic_dai_40.svg","img/ic_eth_24.svg","img/ic_eth_40.svg","img/ic_ethereum_96.svg","img/ic_flp_24.svg","img/ic_flp_40.svg","img/ic_flp_custom.svg","img/ic_frax_24.svg","img/ic_frax_40.svg","img/ic_fxdx.svg","img/ic_fxdx_24.svg","img/ic_fxdx_30.svg","img/ic_fxdx_40.svg","img/ic_fxdx_64.svg","img/ic_fxdx_arbitrum.svg","img/ic_fxdx_avax.svg","img/ic_fxdx_big.svg","img/ic_fxdx_custom.svg","img/ic_fxdx_footer.svg","img/ic_glmr_24.svg","img/ic_glmr_40.svg","img/ic_hop.svg","img/ic_info.svg","img/ic_link_24.svg","img/ic_link_40.svg","img/ic_menu_dots.svg","img/ic_metamask_hover_16.svg","img/ic_mim_24.svg","img/ic_mim_40.svg","img/ic_moonbeam_200.svg","img/ic_multiswap.svg","img/ic_olympus.svg","img/ic_olympus_arbitrum.svg","img/ic_selector_dropdowns.svg","img/ic_settings_24.svg","img/ic_sign in_16.svg","img/ic_stats_big.svg","img/ic_synapse.svg","img/ic_tether_24.svg","img/ic_tokens.svg","img/ic_transfer_avax.svg","img/ic_uni_24.svg","img/ic_uni_40.svg","img/ic_usdc(m)_24.svg","img/ic_usdc(m)_40.svg","img/ic_usdc(w)_24.svg","img/ic_usdc(w)_40.svg","img/ic_usdc.e_24.svg","img/ic_usdc.e_40.svg","img/ic_usdc_24.svg","img/ic_usdc_40.svg","img/ic_usdt_24.svg","img/ic_usdt_40.svg","img/ic_wavax_24.svg","img/ic_wavax_40.svg","img/ic_wbtc(m)_24.svg","img/ic_wbtc(m)_40.svg","img/ic_wbtc(w)_24.svg","img/ic_wbtc(w)_40.svg","img/ic_wbtc_24.svg","img/ic_wbtc_40.svg","img/ic_weth_24.svg","img/ic_weth_40.svg","img/ic_wglmr_24.svg","img/ic_wglmr_40.svg","img/lg_arbitrum.svg","img/logo_FXDX.svg","img/logo_FXDX_small.svg","img/metamask-text.svg","img/page-not-found.svg","img/trading.jpg","img/wallet-connect-text.svg","img/wave-01.png","img/wave-02.png","../ /^/.//.*//messages/.po$/ groupOptions: {} namespace object","config/chains.ts","config/contracts.ts","config/backend.ts","config/tokens.ts","lib/numbers.ts","domain/tokens/utils.ts","lib/helperToast.ts","components/ToastifyDebug/ToastifyDebug.tsx","lib/contracts/transactionErrors.ts","lib/contracts/utils.ts","components/ExternalLink/ExternalLink.tsx","lib/contracts/callContract.tsx","lib/rpc/index.ts","lib/contracts/contractFetcher.ts","domain/tokens/useInfoTokens.ts","domain/tokens/approveTokens.tsx","config/localStorage.ts","lib/chains/index.ts","lib/dates.ts","lib/legacy.js","components/Footer/Footer.js","config/ui.ts","lib/subgraph/utils.ts","config/subgraph.ts","lib/subgraph/clients.ts","lib/sleep.js","domain/prices.js","domain/legacy.js","components/APRLabel/APRLabel.js","components/Header/HeaderLink.tsx","lib/wallets/index.js","components/TokenCard/TokenCard.js","pages/Home/Home.js","components/Tooltip/Tooltip.js","domain/useFeesSummary.js","pages/Dashboard/AssetDropdown.js","components/Common/SEO.js","domain/useTotalVolume.js","components/StatsTooltip/StatsTooltip.tsx","components/StatsTooltip/StatsTooltipRow.tsx","pages/Dashboard/Dashboard.js","lib/useLockBodyScroll.ts","components/Modal/Modal.js","components/Checkbox/Checkbox.js","lib/localStorage/index.ts","pages/Stake/StakeV2.js","pages/Stake/Stake.js","components/Tab/Tab.js","components/Common/Portal.js","components/Tooltip/TooltipWithPortal.js","components/Exchange/TokenSelector.js","components/Exchange/ExchangeInfoRow.js","components/Exchange/ConfirmationBox.js","components/Exchange/OrdersToa.js","components/Referrals/referralsHelper.js","lib/url.ts","domain/referrals.js","domain/common.js","components/Exchange/NoLiquidityErrorModal.tsx","lib/usePrevious.js","components/Exchange/SwapBox.js","components/Exchange/ChartTokenSelector.js","components/Exchange/ExchangeTVChart.js","components/Exchange/PositionSeller.js","components/Exchange/PositionEditor.js","components/Common/SpinningLoader.js","lib/downloadImage.ts","components/Exchange/PositionShare.js","lib/useLoadImage.js","components/Exchange/PositionDropdown.js","components/Exchange/PositionsList.js","components/Exchange/OrderEditor.js","components/Exchange/OrdersList.js","components/Exchange/TradeHistory.js","components/Exchange/ExchangeWalletTokens.js","components/Exchange/ExchangeBanner.js","pages/Exchange/Exchange.js","pages/Actions/Actions.js","pages/OrdersOverview/OrdersOverview.js","pages/PositionsOverview/PositionsOverview.js","components/Common/Loader.js","lib/useDebounce.js","components/Referrals/JoinReferralCode.js","components/Common/Card.js","components/Referrals/EmptyMessage.js","components/Referrals/InfoCard.js","components/Referrals/AddAffiliateCode.js","components/Referrals/AffiliatesStats.js","components/Referrals/TradersStats.js","pages/Referrals/Referrals.js","components/BuyInputSection/BuyInputSection.js","components/Flp/SwapErrorModal.tsx","components/Flp/FlpSwap.js","pages/BuyFlp/BuyFlp.js","pages/Buy/Buy.js","pages/NftWallet/NftWallet.js","pages/BeginAccountTransfer/BeginAccountTransfer.js","pages/CompleteAccountTransfer/CompleteAccountTransfer.js","config/events.ts","components/EventToast/AnnouncementIcon.js","components/EventToast/EventToast.js","components/EventToast/useEventToast.js","components/EventToast/EventToastContainer.js","pages/PageNotFound/PageNotFound.js","pages/ReferralTerms/ReferralTerms.js","pages/TermsAndConditions/TermsAndConditions.js","components/ModalViews/RedirectModal.js","pages/Jobs/Jobs.js","lib/i18n.js","components/AddressDropdown/AddressDropdown.js","components/Common/ConnectWalletButton.tsx","components/Modal/ModalWithPortal.js","components/NetworkDropdown/NetworkDropdown.js","components/NetworkDropdown/LanguagePopupHome.js","components/Header/AppHeaderUser.tsx","components/Header/AppHeaderLinks.tsx","components/Header/Header.tsx","App/App.js","lib/useRouteQuery.js","lib/useScrollToTop.js","reportWebVitals.js","index.tsx"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","webpackAsyncContext","Promise","then","ids","t","parseEther","ethers","utils","AVALANCHE","ARBITRUM_TESTNET","ARBITRUM","MOONBEAM","MUMBAI","DEFAULT_CHAIN_ID","SUPPORTED_CHAIN_IDS","push","IS_NETWORK_DISABLED","CHAIN_NAMES_MAP","GAS_PRICE_ADJUSTMENT_MAP","MAX_GAS_PRICE_MAP","HIGH_EXECUTION_FEES_MAP","constants","nativeTokenSymbol","wrappedTokenSymbol","defaultCollateralSymbol","defaultFlagOrdersEnabled","positionReaderPropsLength","v2","SWAP_ORDER_EXECUTION_GAS_FEE","INCREASE_ORDER_EXECUTION_GAS_FEE","DECREASE_ORDER_EXECUTION_GAS_FEE","ALCHEMY_WHITELISTED_DOMAINS","GOERLI_RPC_PRIVIDERS","MAINNET_RPC_PROVIDERS","ARBITRUM_RPC_PROVIDERS","AVALANCHE_RPC_PROVIDERS","MOONBEAM_RPC_PROVIDERS","MUMBAI_RPC_PROVIDERS","RPC_PROVIDERS","FALLBACK_PROVIDERS","includes","window","location","host","getAlchemyHttpUrl","NETWORK_METADATA","chainId","toString","chainName","nativeCurrency","name","symbol","decimals","rpcUrls","blockExplorerUrls","getExplorerUrl","getConstant","key","getChainName","CONTRACTS","Vault","Router","VaultReader","Reader","FlpManager","RewardRouter","RewardReader","NATIVE_TOKEN","FLP","FXDX","ES_FXDX","BN_FXDX","USDF","ES_FXDX_IOU","StakedFxdxTracker","BonusFxdxTracker","FeeFxdxTracker","StakedFlpTracker","FeeFlpTracker","StakedFxdxDistributor","StakedFlpDistributor","FxdxVester","FlpVester","OrderBook","OrderBookReader","PositionRouter","PositionManager","ReferralStorage","ReferralReader","UniswapFxdxEthPool","TraderJoeFxdxAvaxPool","getContract","FXDX_STATS_API_URL","BACKEND_URLS","default","getServerBaseUrl","document","hostname","fromLocalStorage","localStorage","getItem","getServerUrl","path","TOKENS","address","AddressZero","isNative","isShortable","imageUrl","isWrapped","baseSymbol","isStable","isTempHidden","ADDITIONAL_TOKENS","PLATFORM_TOKENS","ICONLINKS","coingecko","ethereum","ETH","BTC","USDC","USDT","arbitrum","LINK","UNI","DAI","MIM","FRAX","avalanche","AVAX","WBTC","moonbeam","GLMR","WETH","BUSD","FLP_POOL_COLORS","TOKENS_MAP","TOKENS_BY_SYMBOL_MAP","WRAPPED_TOKENS_MAP","NATIVE_TOKENS_MAP","CHAIN_IDS","j","length","tokens","concat","i","token","getWrappedToken","getNativeToken","getTokens","isValidToken","getToken","getTokenBySymbol","getWhitelistedTokens","filter","PRICE_PRECISION","expandDecimals","bigNumberify","n","BigNumber","from","console","error","mul","pow","limitDecimals","amount","maxDecimals","amountStr","undefined","split","dotIndex","indexOf","substr","formatAmount","tokenDecimals","displayDecimals","useCommas","defaultValue","formatUnits","minDecimals","padEnd","padDecimals","numberWithCommas","formatKeyAmount","formatKeyPrice","formatPrice","price","isFree","lte","formatAmountFree","USD_DECIMALS","parseFloat","parseInt","trimZeroDecimals","parseValue","value","pValue","isNaN","parseUnits","x","parts","replace","join","getUsd","tokenAddress","max","infoTokens","orderOption","triggerPriceUsd","USDF_ADDRESS","PRECISION","div","info","getTokenInfo","MARKET","maxPrice","minPrice","getTriggerPrice","getTokenAmountFromUsd","usdAmount","opts","overridePrice","isBigNumber","replaceNative","nativeTokenAddress","toLowerCase","find","toLocaleLowerCase","getLowestFeeTokenForBuyFlp","toAmount","flpPrice","usdfSupply","totalTokenWeights","fromTokenAddress","swapUsdMin","getVisibleTokens","usdfAmount","tokensData","fromToken","fees","getFeeBasisPoints","MINT_BURN_FEE_BASIS_POINTS","TAX_BASIS_POINTS","amountLeftToDeposit","maxUsdfAmount","gt","sub","USDF_DECIMALS","tokensWithLiquidity","asset","hasOwnProperty","lt","sort","a","b","Number","getMostAbundantStableToken","availableAmount","whitelistedTokens","stableToken","adjustedAvailableAmount","adjustForDecimals","shouldRaiseGasError","balance","gte","DUST_BNB","replaceNativeTokenAddress","updatedPath","helperToast","content","toast","dismiss","success","ToastifyDebug","props","useState","open","setOpen","className","onClick","old","children","NOT_ENOUGH_FUNDS","USER_DENIED","SLIPPAGE","RPC_ERROR","TX_ERROR_PATTERNS","msg","extractError","ex","message","data","entries","type","patterns","pattern","matchCode","matchMessage","setGasPrice","txnOpts","provider","maxGasPrice","premium","getGasPrice","gasPrice","getFeeData","feeData","maxPriorityFeePerGas","maxFeePerGas","add","getGasLimit","contract","method","params","estimateGas","gasLimit","ExternalLink","href","target","rel","callContract","Array","isArray","res","txUrl","hash","sentMsg","setPendingTxns","hideSuccessMsg","successMsg","pendingTxn","pendingTxns","autoCloseToast","errorData","failMsg","originalError","autoClose","getProvider","library","getSigner","_","sample","providers","StaticJsonRpcProvider","getFallbackProvider","contractFetcher","contractInfo","additionalArgs","args","arg0","arg1","isAddress","contractCall","getContractCall","shouldCallFallback","handleFallback","reject","fallbackProvider","result","catch","contractName","setTimeout","Contract","abi","ONE_USD","MAX_STRICT_PRICE_DEVIATION","useInfoTokens","active","tokenBalances","fundingRateInfo","vaultPropsLength","vaultReaderAddress","vaultAddress","positionRouterAddress","whitelistedTokenAddresses","vaultTokenInfo","useSWR","fetcher","indexPricesUrl","fetch","json","refreshInterval","refreshWhenHidden","getInfoTokens","indexPrices","JSON","parse","stringify","poolAmount","reservedAmount","redemptionAmount","weight","bufferAmount","globalShortSize","maxGlobalShortSize","maxGlobalLongSize","guaranteedUsd","maxPrimaryPrice","minPrimaryPrice","contractMinPrice","contractMaxPrice","maxAvailableShort","hasMaxAvailableShort","eq","DEFAULT_MAX_USDF_AMOUNT","availableUsd","maxAvailableLong","hasMaxAvailableLong","remainingLongSize","maxLongCapacity","managedUsd","managedAmount","setTokenUsingIndexPrices","fundingRate","cumulativeFundingRate","indexPrice","indexPriceBn","spreadBps","BASIS_POINTS_DIVISOR","MAX_PRICE_DEVIATION_BASIS_POINTS","halfSpreadBps","toNumber","approveTokens","setIsApproving","spender","onApproveSubmitted","includeMessage","Token","approve","MaxUint256","finally","SELECTED_NETWORK_LOCAL_STORAGE_KEY","WALLET_CONNECT_LOCALSTORAGE_KEY","SHOULD_EAGER_CONNECT_LOCALSTORAGE_KEY","CURRENT_PROVIDER_LOCALSTORAGE_KEY","LANGUAGE_LOCALSTORAGE_KEY","SLIPPAGE_BPS_KEY","REFERRAL_CODE_KEY","useChainId","useWeb3React","chainIdFromLocalStorage","removeItem","formatDateTime","time","formatDateFn","formatDate","getTimeRemaining","now","String","Date","diff","hours","minutes","PLACEHOLDER_ACCOUNT","Wallet","createRandom","MAX_LEVERAGE","SECONDS_PER_YEAR","DUST_USD","FLP_DECIMALS","MARGIN_FEE_BASIS_POINTS","LIQUIDATION_FEE","THRESHOLD_REDEMPTION_VALUE","FUNDING_RATE_PRECISION","SWAP","INCREASE","DECREASE","LONG","SHORT","LIMIT","STOP","LEVERAGE_ORDER_OPTIONS","SWAP_ORDER_OPTIONS","SWAP_OPTIONS","REFERRAL_CODE_QUERY_PARAM","deserialize","_type","isHomeSite","process","REACT_APP_IS_HOME_SITE","getLiquidationPriceFromDelta","liquidationAmount","size","collateral","averagePrice","isLong","priceDelta","getMarginFee","sizeDelta","afterFeeUsd","isTriggerRatioInverted","fromTokenInfo","toTokenInfo","isUsdf","getExchangeRate","tokenAInfo","tokenBInfo","inverted","shouldInvertTriggerRatio","tokenA","tokenB","getExchangeRateDisplay","rate","rateValue","omitSymbols","adjustForDecimalsFactory","number","divDecimals","mulDecimals","usdfDelta","feeBasisPoints","taxBasisPoints","increment","initialAmount","nextAmount","targetAmount","getTargetUsdfAmount","initialDiff","nextDiff","rebateBps","averageDiff","taxBps","getBuyFlpFromAmount","fromAmount","getSellFlpToAmount","getNextFromAmount","toTokenAddress","toTokenPriceUsd","ratio","forSwap","fromTokenMinPrice","toTokenMaxPrice","toToken","fromAmountBasedOnRatio","adjustDecimals","isZero","swapFeeBasisPoints","feeBasisPoints0","feeBasisPoints1","getNextToAmount","toAmountBasedOnRatio","getSwapFeeBasisPoints","expectedAmount","calculatePositionDelta","lastIncreasedTime","delta","pendingDelta","minProfitExpired","hasProfit","deltaPercentage","pendingDeltaPercentage","getDeltaStr","deltaStr","deltaPercentageStr","getLeverage","increaseSize","collateralDelta","increaseCollateral","entryFundingRate","includeDelta","nextSize","remainingCollateral","fundingFee","getLiquidationPrice","adjustedDelta","positionFee","liquidationPriceForFees","liquidationPriceForMaxLeverage","getPositionKey","account","collateralTokenAddress","indexTokenAddress","getPositionContractKey","collateralToken","indexToken","solidityKeccak256","shortenAddress","left","Math","floor","substring","_parseOrdersData","ordersData","indexes","extractor","uintPropsLength","addressPropsLength","uintProps","addressProps","count","orders","sliced","slice","order","index","parseDecreaseOrdersData","decreaseOrdersData","triggerPrice","triggerAboveThreshold","parseIncreaseOrdersData","increaseOrdersData","purchaseToken","purchaseTokenAmount","parseSwapOrdersData","swapOrdersData","shouldUnwrap","amountIn","minOut","triggerRatio","every","getOrderKey","useAccountOrders","flagOrdersEnabled","overrideAccount","connectedAccount","shouldRequest","orderBookAddress","orderBookReaderAddress","dedupingInterval","orderBookContract","orderBookReaderContract","fetchIndexesFromServer","ordersIndexesUrl","ret","val","swap","increase","decrease","fetchLastIndex","_hex","fetchLastIndexes","all","getRange","to","_indexes","getIndexes","knownIndexes","lastIndex","getOrders","parseFunc","serverIndexes","lastIndexes","swapOrders","increaseOrders","decreaseOrders","mutate","CHART_PERIODS","getTotalVolumeSum","volumes","volume","getBalanceAndSupplyData","balances","balanceData","supplyData","getDepositBalanceData","depositBalances","getVestingData","vestingInfo","pairAmount","vestedAmount","escrowedBalance","claimedAmounts","claimable","maxVestableAmount","averageStakedAmount","getStakingData","stakingInfo","tokensPerInterval","averageStakedAmounts","cumulativeRewards","totalSupply","getProcessedData","depositBalanceData","stakingData","vestingData","aum","nativeTokenPrice","stakedFxdxSupply","fxdxPrice","fxdxSupply","fxdxBalance","fxdx","fxdxBalanceUsd","fxdxSupplyUsd","stakedFxdxSupplyUsd","fxdxInStakedFxdx","fxdxInStakedFxdxUsd","esFxdxBalance","esFxdx","esFxdxBalanceUsd","stakedFxdxTrackerSupply","stakedFxdxTracker","stakedFxdxTrackerSupplyUsd","stakedEsFxdxSupply","stakedEsFxdxSupplyUsd","esFxdxInStakedFxdx","esFxdxInStakedFxdxUsd","bnFxdxInFeeFxdx","bonusFxdxInFeeFxdx","feeFxdxSupply","feeFxdxTracker","feeFxdxSupplyUsd","stakedFxdxTrackerRewards","stakedFxdxTrackerRewardsUsd","bonusFxdxTrackerRewards","bonusFxdxTracker","feeFxdxTrackerRewards","feeFxdxTrackerRewardsUsd","boostBasisPoints","stakedFxdxTrackerAnnualRewardsUsd","fxdxAprForEsFxdx","feeFxdxTrackerAnnualRewardsUsd","fxdxAprForNativeToken","fxdxBoostAprForNativeToken","fxdxAprTotal","fxdxAprTotalWithBoost","fxdxAprForNativeTokenWithBoost","totalFxdxRewardsUsd","flpSupply","flp","flpSupplyUsd","flpBalance","flpInStakedFlp","flpBalanceUsd","stakedFlpTrackerRewards","stakedFlpTracker","stakedFlpTrackerRewardsUsd","feeFlpTrackerRewards","feeFlpTracker","feeFlpTrackerRewardsUsd","stakedFlpTrackerAnnualRewardsUsd","flpAprForEsFxdx","feeFlpTrackerAnnualRewardsUsd","flpAprForNativeToken","flpAprTotal","totalFlpRewardsUsd","totalEsFxdxRewards","totalEsFxdxRewardsUsd","fxdxVesterRewards","fxdxVester","flpVesterRewards","flpVester","totalVesterRewards","totalVesterRewardsUsd","totalNativeTokenRewards","totalNativeTokenRewardsUsd","totalRewardsUsd","getPageTitle","isHashZero","HashZero","isAddressZero","isDevelopment","isLocal","getHomeUrl","getAppBaseUrl","importImage","tokenImage","require","getTwitterIntentURL","text","url","hashtag","finalURL","encodeURIComponent","getPositionForOrder","positionsMap","position","getOrderError","positionForOrder","arrayURLFetcher","urlArr","shouldShowRedirectModal","timestamp","expiryTime","getTime","isValidTimestamp","footerLinks","home","link","external","app","socialLinks","icon","twitterIcon","mediumIcon","githubIcon","telegramIcon","discordIcon","Footer","showRedirectModal","redirectPopupTimestamp","isHome","cx","platform","src","alt","isAppLink","baseUrl","activeClassName","IS_TOUCH","TRIGGER_PREFIX_ABOVE","TRIGGER_PREFIX_BELOW","createClient","uri","ApolloClient","cache","InMemoryCache","SUBGRAPH_URLS","stats","referrals","nissohVault","chainLink","chainlinkClient","common","goerliGraphClient","goerliReferralsGraphClient","arbitrumGraphClient","arbitrumReferralsGraphClient","avalancheGraphClient","avalancheReferralsGraphClient","moonbeamGraphClient","moonbeamReferralsGraphClient","mumbaiGraphClient","mumbaiReferralsGraphClient","getFxdxGraphClient","sleep","ms","FEED_ID_MAP","BTC_USD","ETH_USD","BNB_USD","LINK_USD","UNI_USD","SUSHI_USD","AVAX_USD","AAVE_USD","YFI_USD","SPELL_USD","timezoneOffset","getTimezoneOffset","getChartPricesFromStats","period","timeDiff","done","lastEx","ok","status","statusText","prices","OBSOLETE_THRESHOLD","updatedAt","toISOString","close","c","high","h","low","l","getChainlinkChartPricesFromGraph","tokenSymbol","marketName","feedId","requests","query","gql","chunks","uniqTs","Set","forEach","chunk","rounds","item","has","unixTimestamp","periodTime","candles","first","prevTsGroup","prevPrice","ts","tsGroup","min","getCandlesFromPrices","err","useChartPrices","currentAveragePrice","swrKey","warn","focusThrottleInterval","updatePrices","currentAveragePriceString","retPrices","useMemo","periodSeconds","priceData","getStablePriceData","_prices","currentCandleTime","last","averagePriceValue","newCandle","appendCurrentAveragePrice","newPrices","prevTime","fillGaps","useAllOrdersStats","setRes","useEffect","graphClient","orderStat","useUserStat","userStat","useLiquidationsData","setData","_data","liquidatedPositions","markPrice","useAllPositions","useAllOrders","charAt","toUpperCase","orderFromChain","path0","path1","path2","createdTimestamp","Boolean","usePositionsForOrders","getPosition","reduce","memo","invariant","condition","errorMsg","useTrades","forSingleAccount","afterId","urlItem","URL","searchParams","append","trades","updateTrades","item0","item1","data0","data1","time0","time1","block0","blockNumber","block1","useMinExecutionFee","multiplier","minExecutionFee","finalExecutionFee","estimatedExecutionFee","finalExecutionFeeUSD","isFeeHigh","getHighExecutionFee","minExecutionFeeUSD","minExecutionFeeErrorMessage","useHasOutdatedUi","hasOutdatedUi","useFxdxPrice","libraries","fxdxPriceFromEthereum","fxdxPriceFromMoonBeam","useTotalFxdxSupply","fxdxSupplyUrl","updateFxdxSupply","total","useTotalFxdxStaked","totalStakedFxdx","useRef","etherChainId","stakedFxdxTrackerAddressEthereum","stakedFxdxSupplyEthereum","updateStakedFxdxSupplyEthereum","stakedFxdxSupplyMoonBeam","updateStakedFxdxSupplyMoonBeam","useCallback","current","useTotalFxdxInLiquidity","approvePlugin","pluginAddress","routerAddress","createSwapOrder","executionFee","shouldWrap","createIncreaseOrder","fromETH","createDecreaseOrder","cancelSwapOrder","cancelDecreaseOrder","cancelIncreaseOrder","handleCancelOrder","func","cancelMultipleOrders","ordersWithTypes","d","allIndexes","groupBy","v","updateDecreaseOrder","updateIncreaseOrder","updateSwapOrder","_executeOrder","feeReceiver","positionManagerAddress","executeSwapOrder","executeIncreaseOrder","executeDecreaseOrder","APRLabel","label","rewardReaderAddress","readerAddress","fxdxAddress","esFxdxAddress","bnFxdxAddress","flpAddress","stakedFxdxTrackerAddress","bonusFxdxTrackerAddress","feeFxdxTrackerAddress","stakedFlpTrackerAddress","feeFlpTrackerAddress","flpManagerAddress","vesterAddresses","walletTokens","depositTokens","rewardTrackersForDepositBalances","rewardTrackersForStakingInfo","walletBalances","aums","processedData","HeaderLink","isHomeLink","exact","isOnHomePage","pathname","injectedConnector","InjectedConnector","supportedChainIds","activateInjectedProvider","providerName","isCoinbaseWallet","isMetaMask","setSelectedProvider","getInjectedConnector","getWalletConnectConnector","WalletConnectConnector","rpc","qrcode","clearWalletConnectData","clearWalletLinkData","startsWith","addNetwork","metadata","request","switchNetwork","setItem","reload","chainIdHex","options","image","TokenCard","changeNetwork","network","BuyLink","disabled","Home","arbitrumPositionStatsUrl","arbitrumPositionStats","arbitrumTotalVolumeUrl","arbitrumTotalVolume","avalanchePositionStatsUrl","avalanchePositionStats","avalancheTotalVolumeUrl","avalancheTotalVolume","arbitrumTotalVolumeSum","avalancheTotalVolumeSum","totalVolumeSum","openInterest","totalLongPositionSizes","totalShortPositionSizes","arbitrumUserStats","avalancheUserStats","totalUsers","uniqueCount","LaunchExchangeButton","tradingIcon","statsIcon","totaluserIcon","toFixed","liquidityIcon","costIcon","simpleSwapIcon","arbitrumIcon","avaIcon","Tooltip","visible","setVisible","intervalCloseRef","intervalOpenRef","trigger","onMouseEnter","clearInterval","onMouseClick","onMouseLeave","disableHandleStyle","handleClassName","handle","renderContent","ACTIVE_CHAIN_IDS","AssetDropdown","assetSymbol","assetInfo","unavailableTokenSymbols","Button","as","Items","Item","coingeckoIcon","ethereumIcon","avalancheIcon","moonbeamIcon","addTokenToMetamask","metamaskIcon","SEO","customMeta","meta","title","description","Helmet","property","StatsTooltip","ethereumValue","moonbeamValue","showDollar","decimalsForConversion","StatsTooltipRow","Dashboard","totalVolume","chain","acc","sum","useTotalVolume","positionStats","hourlyVolumes","totalFxdxSupply","currentVolumeInfo","hourlyVolume","secondsPerHour","minTime","cv","getVolumeInfo","positionStatsInfo","getPositionStats","getWhitelistedTokenAddresses","fxdxMarketCap","flpMarketCap","tvl","tokenList","visibleTokens","tokensForSupplyQuery","totalSupplies","infoTokensEthereum","feeUSD","tokenAddresses","currentFeesUsd","tokenInfo","feeUsd","getCurrentFeesUsd","currentFees","feesSummary","feesSummaryByChain","useFeesSummary","shouldIncludeCurrrentFees","lastUpdatedAt","totalFees","round","totalFxdxInLiquidity","ethereumStakedFxdx","moonbeamStakedFxdx","adjustedUsdfSupply","getWeightText","currentWeightBps","targetWeightBps","weightText","stakedPercent","liquidityPercent","notStakedPercent","fxdxDistributionData","color","totalStatsStartDate","stableFlp","totalFlp","flpPool","fullname","stablePercentage","element","fxdxActiveIndex","setFXDXActiveIndex","onFXDXDistributionChartLeave","flpActiveIndex","setFLPActiveIndex","onFLPPoolChartLeave","CustomTooltip","payload","style","backgroundColor","avalanche24Icon","arbitrum24Icon","ethereum24Icon","moonbeam24Icon","PieChart","width","height","Pie","cy","innerRadius","outerRadius","fill","dataKey","startAngle","endAngle","paddingAngle","onMouseOut","entry","Cell","hexToRgba","cursor","stroke","strokeWidth","y","textAnchor","dominantBaseline","avalanche16Icon","arbitrum16Icon","ethereum16Icon","moonbeam16Icon","utilization","TOUCH_MOVE_CONTAINER_CLASS_NAME","allowTouchMoveFn","el","body","parentElement","Modal","isVisible","setIsVisible","zIndex","onAfterOpen","disableBodyScrollLock","allowContentTouchMove","modalRef","ref","disableLock","disableBodyScroll","allowTouchMove","enableBodyScroll","clearAllBodyScrollLocks","useLockBodyScroll","keyCode","addEventListener","removeEventListener","motion","initial","animate","exit","variants","hidden","opacity","transition","duration","overflow","fontSize","Checkbox","isChecked","setIsChecked","selected","useLocalStorageByChainId","useLocalStorage","internalValue","setInternalValue","setValue","useLocalStorageSerializeKey","StakeModal","maxAmount","stakingTokenSymbol","stakingTokenAddress","farmAddress","rewardRouterAddress","stakeMethodName","isStaking","setIsStaking","isApproving","tokenAllowance","needApproval","getError","placeholder","onChange","getPrimaryText","UnstakeModal","burnAmount","unstakingTokenSymbol","unstakeMethodName","multiplierPointsAmount","isUnstaking","setIsUnstaking","rewardReductionBasisPoints","VesterDepositModal","stakeTokenLabel","reserveAmount","maxReserveAmount","vesterAddress","isDepositing","setIsDepositing","nextReserveAmount","nextDepositAmount","additionalReserveAmount","Vester","VesterWithdrawModal","isWithdrawing","setIsWithdrawing","CompoundModal","isCompounding","setIsCompounding","shouldClaimFxdx","setShouldClaimFxdx","shouldStakeFxdx","setShouldStakeFxdx","shouldClaimEsFxdx","setShouldClaimEsFxdx","shouldStakeEsFxdx","setShouldStakeEsFxdx","shouldStakeMultiplierPoints","setShouldStakeMultiplierPoints","shouldClaimWeth","setShouldClaimWeth","shouldConvertWeth","setShouldConvertWeth","ClaimModal","isClaiming","setIsClaiming","StakeV2","esFxdxSupplyUsd","connectWallet","isStakeModalVisible","setIsStakeModalVisible","stakeModalTitle","setStakeModalTitle","stakeModalMaxAmount","setStakeModalMaxAmount","stakeValue","setStakeValue","setStakingTokenSymbol","setStakingTokenAddress","stakingFarmAddress","setStakingFarmAddress","setStakeMethodName","isUnstakeModalVisible","setIsUnstakeModalVisible","unstakeModalTitle","setUnstakeModalTitle","unstakeModalMaxAmount","setUnstakeModalMaxAmount","unstakeModalReservedAmount","setUnstakeModalReservedAmount","unstakeValue","setUnstakeValue","setUnstakingTokenSymbol","setUnstakeMethodName","isVesterDepositModalVisible","setIsVesterDepositModalVisible","vesterDepositTitle","setVesterDepositTitle","vesterDepositStakeTokenLabel","setVesterDepositStakeTokenLabel","vesterDepositMaxAmount","setVesterDepositMaxAmount","vesterDepositBalance","setVesterDepositBalance","vesterDepositEscrowedBalance","setVesterDepositEscrowedBalance","vesterDepositVestedAmount","setVesterDepositVestedAmount","vesterDepositAverageStakedAmount","setVesterDepositAverageStakedAmount","vesterDepositMaxVestableAmount","setVesterDepositMaxVestableAmount","vesterDepositValue","setVesterDepositValue","vesterDepositReserveAmount","setVesterDepositReserveAmount","vesterDepositMaxReserveAmount","setVesterDepositMaxReserveAmount","vesterDepositAddress","setVesterDepositAddress","isVesterWithdrawModalVisible","setIsVesterWithdrawModalVisible","vesterWithdrawTitle","setVesterWithdrawTitle","vesterWithdrawAddress","setVesterWithdrawAddress","isCompoundModalVisible","setIsCompoundModalVisible","isClaimModalVisible","setIsClaimModalVisible","stakedFxdxDistributorAddress","stakedFlpDistributorAddress","fxdxVesterAddress","flpVesterAddress","excludedEsFxdxAccounts","esFxdxSupply","ethereumFxdxStaked","moonbeamFxdxStaked","totalFxdxStaked","totalRewardTokens","totalRewardTokensAndFlp","hasMultiplierPoints","totalSupplyUsd","maxUnstakeableFxdx","fxdxVesterPairAmount","availableTokens","stakedTokens","divisor","earnMsg","renderMultiplierPointsLabel","renderMultiplierPointsValue","fxdxAmountStr","esFxdxAmountStr","mpAmountStr","flpStr","s","showUnstakeFxdxModal","showUnstakeEsFxdxModal","remainingVestableAmount","showFxdxVesterDepositModal","fxdxVesterVestedAmount","showFlpVesterDepositModal","flpVesterVestedAmount","Stake","Tab","option","setOption","optionLabels","icons","opt","Portal","root","createElement","appendChild","removeChild","createPortal","TooltipWithPortal","coords","setCoords","tooltipWidth","setTooltipWidth","handlerRef","updateTooltipCoords","rect","getBoundingClientRect","top","scrollY","fitHandleWidth","closeOnDoubleClick","TokenSelector","isModalVisible","setIsModalVisible","searchKeyword","setSearchKeyword","mintingCap","showMintingCap","selectedTokenLabel","showBalances","showTokenImgInDropdown","showSymbolImage","showNewCaret","getTokenState","onSelectToken","filteredTokens","onSearchKeywordChange","onKeyDown","autoFocus","tokenIndex","mintAmount","balanceUsd","tokenPopupImage","tokenState","portalClassName","dropDownIcon","ExchangeInfoRow","isTop","isWarning","HIGH_SPREAD_THRESHOLD","ConfirmationBox","fromTokenUsd","toTokenUsd","isSwap","isMarketOrder","isShort","isHigherSlippageAllowed","setIsHigherSlippageAllowed","onConfirmationClick","setIsConfirming","shortCollateralAddress","hasExistingPosition","leverage","existingPosition","existingLiquidationPrice","displayLiquidationPrice","shortCollateralToken","isPendingConfirmation","feesUsd","isSubmitting","fromUsdMin","toUsdMax","nextAveragePrice","feeBps","savedSlippageAmount","isProfitWarningAccepted","setIsProfitWarningAccepted","isTriggerWarningAccepted","setIsTriggerWarningAccepted","isLimitOrdersVisible","setIsLimitOrdersVisible","onCancelOrderClick","collateralAfterFees","existingOrder","wrappedToken","sameToken","existingOrders","existingTriggerOrders","decreaseOrdersThatWillBeExecuted","hasPendingProfit","spread","fromSpread","toSpread","isHigh","getSpread","showSpread","allowedSlippage","renderSpreadWarning","renderFeeWarning","MIN_PROFIT_TIME","renderExistingOrderWarning","sizeInToken","longOrShortText","p","triggerPricePrefix","renderExistingTriggerErrors","existingTriggerOrderLength","renderExistingTriggerWarning","renderMain","renderExecutionFee","renderAvailableLiquidity","availableLiquidity","isLiquidityRisk","riskThresholdBps","poolWithoutBuffer","adjustedMaxGlobalShortSize","sizeTokens","renderMarginSection","renderSwapSection","action","OrdersToa","isPluginApproving","approveOrderBook","REFERRAL_CODE_REGEX","REGEX_VERIFY_BYTES32","isRecentReferralCodeNotExpired","referralCodeInfo","getReferralCodeTakenStatus","referralCode","referralCodeBytes32","encodeReferralCode","getReferralCodeOwner","ownerEthereum","takenOnEth","referralCodeTakenInfo","ownerMoonBeam","takenOnMB","getTierIdDisplay","tierId","tierRebateInfo","tierDiscountInfo","deserializeSampleStats","input","parsedData","obj1","getSampleReferrarStat","obj2","currentValue","hex","ownerOnOtherNetwork","discountUsd","totalRebateUsd","tradedReferralsCount","registeredReferralsCount","ownerOnOtherChain","codeString","owner","isTaken","isTakenByCurrentUser","getUSDValue","getReferralCodeTradeUrl","origin","protocol","port","portString","getRootUrl","ACTIVE_CHAINS","getGraphClient","decodeReferralCode","hexCode","parseBytes32String","fromCharCode","trim","final","formatBytes32String","getCodeOwnersData","codes","variables","codeOwners","referralCodes","useReferralsData","loading","setLoading","main","useUserCodesOnAllChain","startOfDayTimestamp","typeIds","referralTotalStatsId","rebateDistributions","discountDistributions","prepareStatsItem","distributions","transactionHash","receiver","getAddress","typeId","referrerTotalStats","referrerTierInfo","referrerLastDayStats","cumulativeStats","getCumulativeStats","referralTotalStats","referralStorageAddress","referralCodeHex","setTraderReferralCodeByUser","codeOwner","useUserReferralCode","localStorageCode","onChainCode","localStorageCodeOwner","test","attachedOnChain","userReferralCode","userReferralCodeString","validateReferralCodeExists","referralCodeOwner","get1InchSwapUrl","rootUrl","NoLiquidityErrorModal","outputCurrency","modalError","setModalError","nativeToken","inputCurrency","swapTokenSymbol","oneInchSwapUrl","usePrevious","SWAP_ICONS","longImg","shortImg","swapImg","leverageSliderHandle","dragging","restProps","prefixCls","overlay","placement","Handle","SwapBox","pendingPositions","setPendingPositions","setFromTokenAddress","setToTokenAddress","swapOption","setSwapOption","tokenSelection","setTokenSelection","isConfirming","setIsPendingConfirmation","savedIsPnlInLeverage","orderBookApproved","positionRouterApproved","isWaitingForPluginApproval","approvePositionRouter","setIsWaitingForPluginApproval","isWaitingForPositionRouterApproval","setIsWaitingForPositionRouterApproval","isPositionRouterApproving","savedShouldDisableValidationForTesting","fromValue","setFromValue","toValue","setToValue","anchorOnFromAmount","setAnchorOnFromAmount","isWaitingForApproval","setIsWaitingForApproval","setIsSubmitting","setShortCollateralAddress","leverageOption","setLeverageOption","isLeverageSliderEnabled","setIsLeverageSliderEnabled","hasLeverageOption","ordersToaOpen","setOrdersToaOpen","setOrderOption","positionKey","orderOptions","orderOptionLabels","triggerPriceValue","setTriggerPriceValue","fromTokens","stableTokens","indexTokens","shortableTokens","toTokens","needOrderBookApproval","prevNeedOrderBookApproval","needPositionRouterApproval","prevNeedPositionRouterApproval","tokenAllowanceAddress","Api","fromBalance","toBalance","isPotentialWrap","isWrapOrUnwrap","prevFromTokenAddress","prevNeedApproval","prevToTokenAddress","triggerRatioValue","setTriggerRatioValue","triggerRatioInverted","maxToTokenOut","maxToTokenOutUSD","maxFromTokenInUSD","maxFromTokenIn","maxSwapAmountUsd","entryMarkPrice","exitMarkPrice","nextToAmount","nextToValue","nextFromAmount","nextFromValue","updateSwapAmounts","leverageMultiplier","fromUsdMinAfterFee","toNumerator","toDenominator","baseFromAmountUsd","swapFees","updateLeverageAmounts","nextDelta","nextHasProfit","nextPrice","getNextAveragePrice","liquidationPrice","getToLabel","currentRate","usdfFromAmount","getSwapError","requiredAmount","swapAmount","sizeUsd","stableTokenAmount","getLeverageError","wrap","unwrap","multiPath","increasePosition","tokenAddress0","refPrice","priceBasisPoints","priceLimit","boundedFromAmount","contractAddress","pendingChanges","isStopOrder","showFromAndToSection","showTriggerPriceSection","showTriggerRatioSection","feeTokenPrice","borrowFeeText","hasZeroBorrowFee","setFromValueToMaximumAvailable","maxAvailableAmount","SWAP_LABELS","Fragment","shouldShowMaxButton","updatedTokenSelection","getTokenLabel","evt","positive","negative","step","marks","modal","errorCode","isPrimaryEnabled","isSupportedChain","indexTokenInfo","nextToAmountUsd","ChartTokenSelector","selectedToken","onSelect","marginLeft","getChartToken","ExchangeTVChart","positions","savedShouldShowPositionLines","currentChart","setCurrentChart","currentSeries","setCurrentSeries","setPeriod","hoveredCandlestick","setHoveredCandlestick","chartToken","setChartToken","tmp","previousMarketName","currentOrders","chartRef","updatePriceData","chartInited","setChartInited","scaleChart","timeScale","setVisibleRange","onCrosshairMove","seriesPrices","values","point","chart","createChart","offsetWidth","offsetHeight","layout","textColor","fontFamily","localization","timeFormatter","businessDayOrTimestamp","priceFormatter","grid","vertLines","horzLines","rightOffset","borderVisible","barSpacing","timeVisible","fixLeftEdge","priceScale","crosshair","horzLine","vertLine","mode","subscribeCrosshairMove","series","addCandlestickSeries","lineColor","topColor","bottomColor","lineWidth","priceLineColor","downColor","wickDownColor","upColor","wickUpColor","interval","setInterval","resizeChart","resize","lines","createPriceLine","line","removePriceLine","deltaPrice","candleStatsHtml","candlestick","PRICE_DECIMALS","toFixedNumbers","timeThreshold","average","ORDER_SIZE_DUST_USD","shouldSwap","receiveToken","isCollateralWrapped","isSameToken","isUnwrap","PositionSeller","keepLeverage","setKeepLeverage","prevIsVisible","savedRecieveTokenAddress","setSavedRecieveTokenAddress","swapToToken","setSwapToToken","ORDER_OPTIONS","ORDER_OPTION_LABELS","maxAmountFormatted","maxAmountFormattedFree","convertedAmount","convertedAmountFormatted","nextLeverage","nextLiquidationPrice","isClosing","nextCollateral","isNotEnoughReceiveTokenLiquidity","isCollateralPoolCapacityExceeded","swapFeeToken","swapFee","isSwapAllowed","receiveAmount","convertedReceiveAmount","executionFeeUsd","residualSize","abs","deductions","collateralInfo","receiveTokenInfo","profitPrice","onClickPrimary","minProfitExpiration","minProfitTimeExpired","withdrawETH","sizeDeltaUsd","prefix","closePrice","getProfitPrice","warning","tokenOptionInfo","convertedTokenAmount","maxInUsd","maxIn","maxOut","maxOutUsd","fromInfo","toInfo","getSwapLimits","DEPOSIT","WITHDRAW","EDIT_OPTIONS","PositionEditor","nextLeverageExcludingPnl","isSwapping","setIsSwapping","isDeposit","isWithdrawal","resetForm","depositCollateral","collateralSnapshot","expectingCollateralChange","withdrawCollateral","EDIT_OPTIONS_LABELS","depositOrWithdrawalText","SpinningLoader","downloadImage","dataURI","filename","blob","navigator","msSaveBlob","blobURL","createObjectURL","tempLink","display","setAttribute","download","click","revokeObjectURL","ROOT_SHARE_URL","UPLOAD_URL","UPLOAD_SHARE","config","quality","canvasWidth","canvasHeight","getShareURL","imageInfo","PositionShareCard","positionRef","userAffiliateCode","uploadedImageInfo","uploadedImageError","sharePositionBgImg","isMobile","useMedia","deltaAfterFeesPercentageStr","homeURL","backgroundImage","fxdxLogo","PositionShare","setIsPositionShareModalOpen","isPositionShareModalOpen","positionToShare","affiliateCodes","setAffiliateCodes","parsedAffiliateCodes","useAffiliateCodes","setUploadedImageInfo","setUploadedImageError","useCopyToClipboard","copyToClipboard","sourceLoaded","setSourceLoaded","img","Image","onload","useLoadImage","shareBgImg","tweetLink","toJpeg","PositionDropdown","handleEditCollateral","handleMarketSelect","handleShare","fontWeight","getOrdersForPosition","hasMatchingIndexToken","hasMatchingCollateralToken","PositionsList","positionsDataIsLoading","setListSection","showPnlAfterFees","setMarket","positionToEditKey","setPositionToEditKey","positionToSellKey","setPositionToSellKey","setPositionToShare","isPositionEditorVisible","setIsPositionEditorVisible","isPositionSellerVisible","setIsPositionSellerVisible","setCollateralTokenAddress","editPosition","sellPosition","onPositionClick","borrowFeeUSD","positionOrders","hasPositionProfit","positionDelta","borrowFeeRate","collateralAfterFee","hasLowCollateral","muted","netValue","deltaBeforeFeesStr","deltaAfterFeesStr","orderText","colSpan","hasOrderError","hasPendingChanges","OrderEditor","setEditingOrder","initialRatio","indexTokenMarkPrice","OrdersList","hideActions","cancelOrderIdList","setCancelOrderIdList","editingOrder","onCancelClick","onEditClick","renderHead","isAllOrdersSelected","allOrderIds","renderEmptyRow","renderActions","renderLargeList","markExchangeRate","orderId","prevState","indexTokenSymbol","collateralTokenInfo","collateralUSD","renderSmallList","getPositionDisplay","getOrderActionTitle","actionDisplay","renderLiquidationTooltip","liquidationData","minCollateral","borrowFee","loss","getLiquidationData","liquidationsDataMap","TradeHistory","shouldShowPaginationButtons","pageIds","setPageIds","pageIndex","setPageIndex","liquidationsData","getMsg","trade","tradeData","defaultMsg","tokenAmount","tokenIn","tokenOut","amountOut","acceptablePrice","flags","isOrderExecution","isLiquidation","longShortDisplay","executionPriceDisplay","executionPrice","orderType","sizeDeltaDisplay","priceDisplay","fromAmountDisplay","toAmountDisplay","amountInDisplay","minOutDisplay","tradesWithMessages","txhash","lastTrade","ExchangeWalletTokens","ExchangeBanner","hideBanner","xmlns","viewBox","transform","notifications","pushSuccessNotification","pushErrorNotification","getFundingFee","getTokenAddress","applyPendingChanges","getPositions","positionQuery","positionData","updatedPositions","propsLength","collateralTokens","contractKey","hasRealisedProfit","realisedPnl","updatedPosition","closingFee","hasProfitAfterFees","pendingDeltaAfterFees","deltaPercentageAfterFees","getPositionQuery","Exchange","forwardRef","setSavedIsPnlInLeverage","savedShowPnlAfterFees","setSavedShouldShowPositionLines","showBanner","setShowBanner","bannerHidden","setBannerHidden","setUpdatedPositions","currentAccount","usdfAddress","defaultTokenSelection","selectedSwapOption","newTokenSelection","positionDataError","useImperativeHandle","onUpdatePosition","onClosePosition","onIncreasePosition","fee","indexTokenItem","onDecreasePosition","onCancelIncreasePosition","blockGap","timeGap","onCancelDecreasePosition","setIsPluginApproving","setIsPositionRouterApproving","isCancelMultipleOrderProcessing","setIsCancelMultipleOrderProcessing","onMultipleCancelClick","tx","wait","POSITIONS","ORDERS","TRADES","LIST_SECTIONS","listSection","LIST_SECTIONS_LABELS","renderCancelOrderButton","getListSection","section","hiddenLimit","Actions","useParams","checkSummedAccount","updateOrders","OrdersOverview","openTotal","executedTotal","cancelledTotal","positionsForOrders","openDecrease","openIncrease","openSwap","executedDecrease","executedIncrease","executedSwap","cancelledDecrease","cancelledIncrease","cancelledSwap","executeOrder","preventDefault","shouldExecute","nearExecute","diffPercent","shoudUnwrap","invalidToken","invert","near","PositionsOverview","danger","diffToLiq","feesPerHour","liqTime","Loader","useDebounce","delay","debouncedValue","setDebouncedValue","handler","clearTimeout","ReferralCodeForm","callAfterSuccess","setReferralCode","inputRef","isValidating","setIsValidating","referralCodeExists","setReferralCodeExists","debouncedReferralCode","event","isEdit","cancelled","codeExists","checkReferralCode","focus","onSubmit","JoinReferralCode","Card","tooltipText","EmptyMessage","InfoCard","toolTipPosition","AffiliateCodeForm","handleCreateReferralCode","recentlyAddedCodes","setRecentlyAddedCodes","isProcessing","setIsProcessing","setError","referralCodeCheckStatus","setReferralCodeCheckStatus","checkCodeTakenStatus","takenStatus","buttonError","trimmedValue","getCodeError","AddAffiliateCode","AffiliatesStats","referralsData","isAddReferralCodeModalOpen","setIsAddReferralCodeModalOpen","addNewModalRef","allReferralCodes","finalAffiliatesTotalStats","referrerRebates","scope","stat","referrerRebate","rebate","explorerURL","TradersStats","traderTier","isEditModalOpen","setIsEditModalOpen","editModalRef","TRADERS","AFFILIATES","TAB_OPTIONS","Referrals","walletAccount","queryAccount","activeTab","setActiveTab","deserializer","mutateCodeOwner","useCodeOwner","referrerTier","mutateReferrerTier","useReferrerTier","registerReferralCode","TAB_OPTION_LABELS","isReferralCodeAvailable","renderAffiliatesTab","BuyInputSection","topLeftLabel","topRightLabel","onClickTopRightLabel","inputValue","onInputValueChange","onClickMax","showMaxButton","staticInput","tokenBalance","clickable","SwapErrorModal","swapToken","flpAmount","lowestFeeToken","setLowestFeeToken","lowestFeeTokenInfo","oneInchUrl","getTooltipContent","FlpSwap","isBuying","setIsBuying","history","useHistory","swapLabel","tabLabel","swapValue","setSwapValue","flpValue","setFlpValue","swapTokenAddress","setSwapTokenAddress","anchorOnSwapAmount","setAnchorOnSwapAmount","setFeeBasisPoints","tokensForBalanceAndSupplyQuery","balancesAndSupplies","lastPurchaseTime","RewardTracker","redemptionTime","inCooldownWindow","reserveAmountUsd","maxSellAmount","isSwapTokenCapReached","swapTokenInfo","swapTokenBalance","flpUsdMax","feeFlpTrackerApr","stakedFlpTrackerApr","onSwapValueChange","onFlpValueChange","onSelectSwapToken","totalApr","getBuyFlpToAmount","nextValue","getSellFlpFromAmount","switchSwapOption","fillMaxAmount","nextUsdfAmount","payLabel","receiveLabel","payBalance","receiveBalance","selectToken","feePercentageText","defaultTokenName","arrowIcon","minFlp","buyFlp","sellFlp","tooltipIconPosition","tokenFeeBps","availableAmountUsd","isCapReached","swapUrl","renderFees","BuyFlp","buyFLPIcon","BuyFXDXFLP","buyFXDXIcon","NftWallet","nftAddress","setNftAddress","nftId","setNftId","setReceiver","getTransferError","ERC721","transferNft","transferError","ValidationRow","isValid","BeginAccountTransfer","isTransferring","setIsTransferring","isTransferSubmittedModalVisible","setIsTransferSubmittedModalVisible","parsedReceiver","fxdxVesterBalance","flpVesterBalance","cumulativeFxdxRewards","cumulativeFlpRewards","transferredCumulativeFxdxRewards","transferredCumulativeFlpRewards","pendingReceiver","fxdxAllowance","fxdxStaked","hasVestedFxdx","hasVestedFlp","hasStakedFxdx","hasStakedFlp","hasPendingReceiver","completeTransferLink","pendingTransferLink","CompleteAccountTransfer","sender","isCorrectAccount","homeEventsData","appEventsData","isActive","validTill","bodyText","buttons","newTab","Icon","strokeLinecap","strokeLinejoin","EventToast","button","useEventToast","visited","setVisited","isFuture","custom","EventToastContainer","useWindowScroll","breakpoint","createBreakpoint","XL","L","S","useBreakpoint","reverseOrder","gutter","containerClassName","containerStyle","right","toastOptions","Infinity","PageNotFound","homeUrl","tradePageUrl","ReferralTerms","TermsAndConditions","RedirectPopupModal","redirectModalVisible","setRedirectModalVisible","appRedirectUrl","setRedirectPopupTimestamp","setShouldHideRedirectModal","shouldHideRedirectModal","removeRedirectPopupTimestamp","NoJob","Jobs","locales","en","es","zh","ko","ja","pseudo","defaultLocale","isTestLanguage","locale","dynamicActivate","messages","i18n","load","activate","loadLocaleData","plurals","ru","fr","de","AddressDropdown","accountUrl","disconnectAccountAndCloseSettings","M","ensName","setENSName","JsonRpcProvider","lookupAddress","resolveENS","useENS","copy","externalLink","disconnect","ConnectWalletButton","imgSrc","classNames","ModalWithPortal","LANGUAGE_MODAL_KEY","NETWORK_MODAL_KEY","NetworkDropdown","currentLanguage","activeModal","setActiveModal","small","NavIcons","selectorLabel","DesktopDropdown","modalName","getModalProps","LanguageModalContent","NetworkModalContent","networkOptions","onNetworkSelect","openSettings","getModalContent","iconsMap","Ethereum","Goerli","Arbitrum","ArbRinkeby","Avalanche","avaxIcon","MoonBeam","Mumbai","NetworkMenuItems","settingsIcon","language24Icon","networkIcon","handleNetworkSelect","checkedIcon","LanguagePopupHome","isLanguageModalOpen","setIsLanguageModalOpen","AppHeaderUser","setWalletModalVisible","showConnectionOptions","connectWalletImg","getAccountUrl","AppHeaderLinks","clickCloseIcon","logoImg","AnimatePresence","fadeVariants","slideVariants","Header","isDrawerVisible","setIsDrawerVisible","isNativeSelectorModalVisible","setIsNativeSelectorModalVisible","logoSmallImg","getLibrary","Web3Provider","autoRefreshOnNetworkChange","Zoom","cssTransition","enter","appendPosition","collapse","collapseDuration","goerliWsProvider","mumbaiWsProvider","arbWsProvider","WebSocketProvider","avaxWsProvider","moonbeamWsProvider","FullApp","exchangeRef","connector","deactivate","useLocation","activatingConnector","setActivatingConnector","triedEager","tried","setTried","shouldTryWalletConnect","rawData","connected","SyntaxError","currentProviderName","isAuthorized","useEagerConnect","suppress","injected","on","handleConnect","handleChainChanged","handleAccountsChanged","accounts","handleNetworkChanged","networkId","removeListener","useInactiveListener","search","React","URLSearchParams","useRouteQuery","get","encodedReferralCode","queryParams","delete","disconnectAccount","connectInjectedWallet","fn","UnsupportedChainIdError","errString","getInjectedHandler","userOnMobileDevice","userAgent","attemptActivateWallet","walletModalVisible","selectedToPage","setSelectedToPage","isSettingsVisible","setIsSettingsVisible","setSavedSlippageAmount","slippageAmount","setSlippageAmount","isPnlInLeverage","setIsPnlInLeverage","shouldDisableValidationForTesting","setShouldDisableValidationForTesting","setShowPnlAfterFees","setSavedShowPnlAfterFees","setSavedShouldDisableValidationForTesting","decodedRefCode","checkPendingTxns","updatedPendingTxns","getTransactionReceipt","receipt","wsVaultAbi","wsProvider","getWsProvider","wsVault","wsPositionRouter","callExchangeRef","off","slippage","limit","hideProgressBar","newestOnTop","closeOnClick","draggable","pauseOnHover","metamaskImg","hasCoinBaseWalletExtension","coinbaseImg","walletConnect","UserRejectedRequestErrorWalletConnect","getWalletConnectHandler","walletConnectImg","basisPoints","App","unlisten","listen","scrollTo","useScrollToTop","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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+BCAzC,OAAe,spE,+BCAf,OAAe,cAA0B,oC,+BCAzC,OAAe,07D,+BCAf,OAAe,cAA0B,mC,+BCAzC,OAAe,kwC,+BCAf,OAAe,kvG,+BCAf,OAAe,cAA0B,4C,+BCAzC,OAAe,8lK,+BCAf,OAAe,cAA0B,uC,+BCAzC,OAAe,8lY,+BCAf,OAAe,cAA0B,+C,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,4C,+BCAzC,OAAe,s/S,+BCAf,OAAe,cAA0B,iC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,oC,+BCAzC,OAAe,03C,+BCAf,OAAe,cAA0B,iD,+BCAzC,OAAe,cAA0B,2C,+BCAzC,OAAe,cAA0B,0C,+BCAzC,OAAe,cAA0B,+C,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,+C,+BCAzC,OAAe,cAA0B,gD,+BCAzC,OAAe,cAA0B,0C,+BCAzC,OAAe,cAA0B,2C,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,oC,+BCAzC,OAAe,cAA0B,2C,+BCAzC,OAAe,cAA0B,kC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,00D,+BCAf,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,iD,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,0C,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,4C,+BCAzC,OAAe,cAA0B,wC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,0C,+BCAzC,OAAe,cAA0B,0C,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,kC,+BCAzC,OAAe,cAA0B,mC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,wC,+BCAzC,OAAe,cAA0B,gD,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,2C,+BCAzC,OAAe,cAA0B,wC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,+C,+BCAzC,OAAe,cAA0B,iD,+BCAzC,OAAe,cAA0B,0C,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,wC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,wC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,4C,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,qC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,wC,+BCAzC,OAAe,cAA0B,wC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,yC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,uC,+BCAzC,OAAe,cAA0B,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","file":"static/js/main.94bd1bcf.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/logo.1e48e65d.png\";","export default __webpack_public_path__ + \"static/media/ic_ethereum_24.eaaac21a.svg\";","export default __webpack_public_path__ + \"static/media/ic_arbitrum_24.21ec7bfe.svg\";","export default __webpack_public_path__ + \"static/media/ic_avalanche_24.be4891c9.svg\";","export default __webpack_public_path__ + \"static/media/ic_ethereum_16.1d9694d2.svg\";","export default __webpack_public_path__ + \"static/media/ic_language24.ce951c62.svg\";","export default __webpack_public_path__ + \"static/media/ic_moonbeam_24.42b84f89.svg\";","export default __webpack_public_path__ + \"static/media/ic_arbitrum_16.f4c1a9fe.svg\";","export default __webpack_public_path__ + \"static/media/ic_avalanche_16.90aca01d.svg\";","export default __webpack_public_path__ + \"static/media/ic_checked.ef61d0e2.svg\";","export default __webpack_public_path__ + \"static/media/ic_moonbeam_16.96c21403.svg\";","export default __webpack_public_path__ + \"static/media/ic_settings_16.e5edd079.svg\";","export default __webpack_public_path__ + \"static/media/DROP_DOWN.ef525fad.svg\";","export default __webpack_public_path__ + \"static/media/buy_fxdx.f306d934.svg\";","export default __webpack_public_path__ + \"static/media/coinbaseWallet.ae86a337.png\";","export default __webpack_public_path__ + \"static/media/ic_arbitrum_96.4c6d42bf.svg\";","export default __webpack_public_path__ + \"static/media/ic_avalanche_96.b6255c50.svg\";","export default __webpack_public_path__ + \"static/media/ic_buy_flp.03f302d8.svg\";","export default __webpack_public_path__ + \"static/media/ic_coingecko_16.ef20d202.svg\";","export default __webpack_public_path__ + \"static/media/ic_convert_down.74b7eb02.svg\";","export default __webpack_public_path__ + \"static/media/ic_copy_16.5b289ecc.svg\";","export default __webpack_public_path__ + \"static/media/ic_cost.b4a729d3.svg\";","export default __webpack_public_path__ + \"static/media/ic_discord.be4d716c.svg\";","export default __webpack_public_path__ + \"static/media/ic_github.dbd4de8a.svg\";","export default __webpack_public_path__ + \"static/media/ic_liquidity.505b3f30.svg\";","export default __webpack_public_path__ + \"static/media/ic_medium.f6051b2e.svg\";","export default __webpack_public_path__ + \"static/media/ic_metamask_16.aa3dce32.svg\";","export default __webpack_public_path__ + \"static/media/ic_new_link_16.33dcae6c.svg\";","export default __webpack_public_path__ + \"static/media/ic_sign_out_16.7516903b.svg\";","export default __webpack_public_path__ + \"static/media/ic_simpleswaps.2005009f.svg\";","export default __webpack_public_path__ + \"static/media/ic_stats.f0a18011.svg\";","export default __webpack_public_path__ + \"static/media/ic_telegram.af1a4a66.svg\";","export default __webpack_public_path__ + \"static/media/ic_totaluser.ae09b310.svg\";","export default __webpack_public_path__ + \"static/media/ic_trading.2c53815a.svg\";","export default __webpack_public_path__ + \"static/media/ic_twitter.9f35b403.svg\";","export default __webpack_public_path__ + \"static/media/ic_wallet_24.a19a6758.svg\";","export default __webpack_public_path__ + \"static/media/long.0bc4a064.svg\";","export default __webpack_public_path__ + \"static/media/metamask.4b5d438a.png\";","export default __webpack_public_path__ + \"static/media/position-share-bg.900fbfaa.png\";","export default __webpack_public_path__ + \"static/media/short.1f94a0c2.svg\";","export default __webpack_public_path__ + \"static/media/swap.40fb8e49.svg\";","export default __webpack_public_path__ + \"static/media/walletconnect-circle-blue.31c29967.svg\";","var map = {\n\t\"./Anyswap.png\": 467,\n\t\"./Anyswap.svg\": 468,\n\t\"./Artwork.svg\": 469,\n\t\"./Artwork_fxdx.svg\": 470,\n\t\"./Banxa.png\": 471,\n\t\"./DROP_DOWN.svg\": 274,\n\t\"./Hop.png\": 472,\n\t\"./Hop.svg\": 473,\n\t\"./Hop_dark.png\": 474,\n\t\"./Hop_dark.svg\": 475,\n\t\"./Synapse.png\": 476,\n\t\"./Synapse.svg\": 477,\n\t\"./binance.png\": 478,\n\t\"./bscscan.png\": 479,\n\t\"./btn_big_arbitrum.png\": 480,\n\t\"./btn_big_avalanche.png\": 481,\n\t\"./btn_big_bsc.png\": 482,\n\t\"./btn_big_purchasegmx.png\": 483,\n\t\"./btn_big_purchasegmx.svg\": 484,\n\t\"./buy_fxdx.svg\": 275,\n\t\"./buy_fxdx_bond.svg\": 485,\n\t\"./buy_transfer_eth.svg\": 486,\n\t\"./coinbaseWallet.png\": 276,\n\t\"./coingecko.png\": 487,\n\t\"./cross.svg\": 488,\n\t\"./flag_en.svg\": 489,\n\t\"./flag_es.svg\": 490,\n\t\"./flag_fr.svg\": 491,\n\t\"./flag_ja.svg\": 492,\n\t\"./flag_ko.svg\": 493,\n\t\"./flag_ru.svg\": 494,\n\t\"./flag_zh.svg\": 495,\n\t\"./flp_icon.svg\": 496,\n\t\"./fxdx-logo-final-white-small.png\": 497,\n\t\"./fxdx-logo-final-white.png\": 498,\n\t\"./fxdx-logo-final.png\": 499,\n\t\"./fxdx-logo-glow.png\": 500,\n\t\"./fxdx-logo-with-name.svg\": 501,\n\t\"./fxdx_logo.svg\": 502,\n\t\"./graphite-01.png\": 503,\n\t\"./ic-communityproject.svg\": 504,\n\t\"./ic_arbitrum_16.svg\": 191,\n\t\"./ic_arbitrum_24.svg\": 149,\n\t\"./ic_arbitrum_96.svg\": 277,\n\t\"./ic_arbitrum_hover_16.svg\": 505,\n\t\"./ic_arrowleft16.svg\": 506,\n\t\"./ic_arrowright16.svg\": 507,\n\t\"./ic_avalanche_16.svg\": 192,\n\t\"./ic_avalanche_24.svg\": 165,\n\t\"./ic_avalanche_96.svg\": 278,\n\t\"./ic_avax_24.svg\": 508,\n\t\"./ic_avax_30.svg\": 509,\n\t\"./ic_avax_40.svg\": 510,\n\t\"./ic_banxa.svg\": 511,\n\t\"./ic_binance_logo.svg\": 512,\n\t\"./ic_bsc.svg\": 513,\n\t\"./ic_bsc_96.svg\": 514,\n\t\"./ic_btc.b_24.svg\": 515,\n\t\"./ic_btc.b_40.svg\": 516,\n\t\"./ic_btc_24.svg\": 517,\n\t\"./ic_btc_40.svg\": 518,\n\t\"./ic_busd_24.svg\": 519,\n\t\"./ic_busd_40.svg\": 520,\n\t\"./ic_buy_flp.svg\": 279,\n\t\"./ic_cash.png\": 521,\n\t\"./ic_cash.svg\": 522,\n\t\"./ic_checked.svg\": 193,\n\t\"./ic_coingecko_16.svg\": 280,\n\t\"./ic_coingecko_hover_16.svg\": 523,\n\t\"./ic_convert_down.svg\": 281,\n\t\"./ic_copy_16.svg\": 282,\n\t\"./ic_cost.svg\": 283,\n\t\"./ic_dai_24.svg\": 524,\n\t\"./ic_dai_40.svg\": 525,\n\t\"./ic_discord.svg\": 284,\n\t\"./ic_eth_24.svg\": 526,\n\t\"./ic_eth_40.svg\": 527,\n\t\"./ic_ethereum_16.svg\": 166,\n\t\"./ic_ethereum_24.svg\": 134,\n\t\"./ic_ethereum_96.svg\": 528,\n\t\"./ic_flp_24.svg\": 529,\n\t\"./ic_flp_40.svg\": 530,\n\t\"./ic_flp_custom.svg\": 531,\n\t\"./ic_frax_24.svg\": 532,\n\t\"./ic_frax_40.svg\": 533,\n\t\"./ic_fxdx.svg\": 534,\n\t\"./ic_fxdx_24.svg\": 535,\n\t\"./ic_fxdx_30.svg\": 536,\n\t\"./ic_fxdx_40.svg\": 537,\n\t\"./ic_fxdx_64.svg\": 538,\n\t\"./ic_fxdx_arbitrum.svg\": 539,\n\t\"./ic_fxdx_avax.svg\": 540,\n\t\"./ic_fxdx_big.svg\": 541,\n\t\"./ic_fxdx_custom.svg\": 542,\n\t\"./ic_fxdx_footer.svg\": 543,\n\t\"./ic_github.svg\": 285,\n\t\"./ic_glmr_24.svg\": 544,\n\t\"./ic_glmr_40.svg\": 545,\n\t\"./ic_hop.svg\": 546,\n\t\"./ic_info.svg\": 547,\n\t\"./ic_language24.svg\": 167,\n\t\"./ic_link_24.svg\": 548,\n\t\"./ic_link_40.svg\": 549,\n\t\"./ic_liquidity.svg\": 286,\n\t\"./ic_medium.svg\": 287,\n\t\"./ic_menu_dots.svg\": 550,\n\t\"./ic_metamask_16.svg\": 288,\n\t\"./ic_metamask_hover_16.svg\": 551,\n\t\"./ic_mim_24.svg\": 552,\n\t\"./ic_mim_40.svg\": 553,\n\t\"./ic_moonbeam_16.svg\": 194,\n\t\"./ic_moonbeam_200.svg\": 554,\n\t\"./ic_moonbeam_24.svg\": 168,\n\t\"./ic_multiswap.svg\": 555,\n\t\"./ic_new_link_16.svg\": 289,\n\t\"./ic_olympus.svg\": 556,\n\t\"./ic_olympus_arbitrum.svg\": 557,\n\t\"./ic_selector_dropdowns.svg\": 558,\n\t\"./ic_settings_16.svg\": 234,\n\t\"./ic_settings_24.svg\": 559,\n\t\"./ic_sign in_16.svg\": 560,\n\t\"./ic_sign_out_16.svg\": 290,\n\t\"./ic_simpleswaps.svg\": 291,\n\t\"./ic_stats.svg\": 292,\n\t\"./ic_stats_big.svg\": 561,\n\t\"./ic_synapse.svg\": 562,\n\t\"./ic_telegram.svg\": 293,\n\t\"./ic_tether_24.svg\": 563,\n\t\"./ic_tokens.svg\": 564,\n\t\"./ic_totaluser.svg\": 294,\n\t\"./ic_trading.svg\": 295,\n\t\"./ic_transfer_avax.svg\": 565,\n\t\"./ic_twitter.svg\": 296,\n\t\"./ic_uni_24.svg\": 566,\n\t\"./ic_uni_40.svg\": 567,\n\t\"./ic_usdc(m)_24.svg\": 568,\n\t\"./ic_usdc(m)_40.svg\": 569,\n\t\"./ic_usdc(w)_24.svg\": 570,\n\t\"./ic_usdc(w)_40.svg\": 571,\n\t\"./ic_usdc.e_24.svg\": 572,\n\t\"./ic_usdc.e_40.svg\": 573,\n\t\"./ic_usdc_24.svg\": 574,\n\t\"./ic_usdc_40.svg\": 575,\n\t\"./ic_usdt_24.svg\": 576,\n\t\"./ic_usdt_40.svg\": 577,\n\t\"./ic_wallet_24.svg\": 297,\n\t\"./ic_wavax_24.svg\": 578,\n\t\"./ic_wavax_40.svg\": 579,\n\t\"./ic_wbtc(m)_24.svg\": 580,\n\t\"./ic_wbtc(m)_40.svg\": 581,\n\t\"./ic_wbtc(w)_24.svg\": 582,\n\t\"./ic_wbtc(w)_40.svg\": 583,\n\t\"./ic_wbtc_24.svg\": 584,\n\t\"./ic_wbtc_40.svg\": 585,\n\t\"./ic_weth_24.svg\": 586,\n\t\"./ic_weth_40.svg\": 587,\n\t\"./ic_wglmr_24.svg\": 588,\n\t\"./ic_wglmr_40.svg\": 589,\n\t\"./lg_arbitrum.svg\": 590,\n\t\"./logo.png\": 99,\n\t\"./logo_FXDX.svg\": 591,\n\t\"./logo_FXDX_small.svg\": 592,\n\t\"./long.svg\": 298,\n\t\"./metamask-text.svg\": 593,\n\t\"./metamask.png\": 299,\n\t\"./page-not-found.svg\": 594,\n\t\"./position-share-bg.png\": 300,\n\t\"./short.svg\": 301,\n\t\"./swap.svg\": 302,\n\t\"./trading.jpg\": 595,\n\t\"./wallet-connect-text.svg\": 596,\n\t\"./walletconnect-circle-blue.svg\": 303,\n\t\"./wave-01.png\": 597,\n\t\"./wave-02.png\": 598\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 = 466;","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQgAAAAsCAMAAACuYtZZAAAAZlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Vn2moAAAAInRSTlMABhQdEgsKKUeEstIZdbP/wlfRwTjgpJRm8fDhhaNlk3ZW+c569wAAAsRJREFUeAHs0AEBwEAMAjFaCv4lbz7+IiHSrJ+3I40vfVzOo72it3JaxHLxI4IIIogggggiiCDia9cMdx5FwSj8aw84Ug4qCoL96t7/Te68YL7GjrPpn0nsxCepLXrA8IQ3NoY/IULp5keLJ0YbHKM1/gfd3PQni7Ak6b6bXU9y8DigIz1+hx9JsvefKwITyfBsVCIOgrPkjlGp7WDiPJqPFWF6kvHpISgox6R+DXKyI35DpK6LJn6oCPEwW/rNw6bEZC4Hc+0iu/Irmttw7wDdKKB8bSKwaDRPF6bpANUM96/aTT2GR3dOEeLBY9p7ABY6vDJkGJakG1N24krVdp+h5qRRaceyNPptgfg0O8dBuiVKt/spRbTiAa8esP4qQjFIxABwnMq85GO2K3Hm+PBVogcCqWp8zAaIMrKTHAL1CUVE8sgDJk7YU+fXlYgrOiJVneBaxjBrS44d4LkC41SOFtClergALkPI7oQiJoYjD5HUeGFMzU/qGi9T0ZKZ+1IZFRMzY5mpZ2ctvLTMfWQaiogAwY4nFOG4HHuY8ILnhtqJCFSlMryvKnIv57DOWGlWKph+Dstii4h6r8BTiggvHnQ88iCBTv8kct2JUAylMtyIgsvirOstFKNrJdV9l4atkTOWRmRSOw9YORx5QHIo5HEnAjaVylhrf5WsZKy0WivSYkmtRQQ9RFM4oQiTmW76q3/WReChh/h8sPqdiI51Yi1/3L4eafZ1DFOOClBz/69+sIiQe93SbE4oAj5TmOOzWHj0pLc0KChOOxHI9EXpMpN0ul5pZWi2pZFl+LkHnJOMUyf9Z7m0bIP6blNY8D59xoZROETV88Wf/5T3Eb6dVm3wPp4r3sS5v/bFjL83KRtcIlRL6/EuYfkbRFzvLC8Rl4hLxCXiEnGJuET8A+HaTFa3F17bC68Np9uG02sL8rYF+T+idSlyqmiqtwAAAABJRU5ErkJggg==\"","export default __webpack_public_path__ + \"static/media/Anyswap.491d1f32.svg\";","export default __webpack_public_path__ + \"static/media/Artwork.a2d41b8c.svg\";","export default __webpack_public_path__ + \"static/media/Artwork_fxdx.cc61d732.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAAoCAMAAABO8gGqAAABcVBMVEUAAAAoKDwnKTsnKTsnKTuGh5HJyc6urrWFhpA1Nkehoqrx8vO7vMF4eoVCRFRrbHhQUWARbooBqMcRcojKys////+vr7ZdX2zW19ry8vMUZIIBo8cBqMYBrMUUbYCTlJ0iN00BnsgAoscArMUDqbwiO0zl5ee8vcLX2NsNd50Bp8YBrcYAscQPgpHk5OYeRF8AmcgAo8cUaYEBssUAtsMdTl0Gh7gBmckPdpMPe5IBtsQIn6mgoalcXmtqa3gWVnoBlcoAmckDmMAlMUQiOUwDqr0Bu8MYYm4lL0QDicIBlMoAu8MDtrolM0MSYI0Bj8oFi7clMkQFpbMAv8EUd34iNU0Bi8sBkMsbTGgZXm8AwMIAxMEiPUwKb6gBi8wLeqcKl6EAv8IBxcEMl5YbRWkBhs0gPVYgRFUBwMIAycAdUlwGeLwBhswRY4wPh48Fuq8UVoQBgs0Azr8YaWwKbKkBzsAKqZ4ZS3IDfcQCxLcbXmRL8BeXAAAABHRSTlMAM7D2JaXEwgAAAp1JREFUeAHszjEBADAQArF7wL/myigDURA4OaWsg3OK+VCqCaeaSbkFF/xswQUfa2XRJa8OxNFNYF6gvUkz7u7u7u7u7m6f/1UqZArW/9wNhZ26kd+JZWvy/uMsjOPGQg8c247rOmHblrwm4a8UQ+K2HUswIp3JGhL0BOEmGRGHBzm6FYA29IXwUBCe5eMgUlAVQKUpLCouKTUvKFyaBO4KwCdBSSoqyMrgWV7wcUGK/VFeUZmpqq4xJej4SLIWSlpSIbGjgm6KBJE6eGgxVo/TSzRUFDU2NbeYEvRpUT39OCE7h9sKpJVHBblU8x0hh0a0tVd0dFZ1dfcYFrRCgp6sy6QRCeb0liNBligQwoXndSxEb19FPxtoHhwyJDg8goy6lAofNxyH7mUk6Ftqy5Eg1pJ6zoix8YnJKTY90z07ZzokQvepVa5xyg0mRs6hQ4KIpdJDzC8s9hXCtXRwaXnFtGDeX9MCHryNkaD6Oh4VrBcYFGJ1bXxdXjc2Z7e2jQjWlyk8lAC4q1v6+IgEVSjCgjmBJJlmZ3dvcR+rg6XDo2MzIaG6LGhaS/3zSTAIBaaJFrhePkuxgJPTtbOgPL+4vDIqWKYap1CGUhoPCbIUPBBaEM+SWu4Livv1ze7eLVPc3R89PBoQ1MvDW9UMetifpF1OgtKJBFPBCWIJPdHs6fn0hWleLx/eDAi6tgK6iYQ2COOQIBBHQT0iNb85HbD3j2fYg30VcBY3D8IefPj8MprieNAsikeC2sbTAXboRJG5+v54Pl0bn5BncVf37MXlw8/vPwrWkUdBXQrXrVZEKZDa8DDFyLAO92r0RCmA6/8rr0iFhKCWNjAEgWmwsmq0RY0XjDpw1IGjDhx14KAfwBz0Q8CDfhB90E9DAACtALoxSNWoNwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQgAAAAsCAYAAACZvCZrAAAFLElEQVR4Ae3aBWwcRxTG8QjKQqsUEtOJpTJzw+U2zMmGmZlJVIYwYznMya0ZjslU58Jo2Nu43L7Os2ej7eiMMt+30s8ws+a7f2Zn044PIrpbeFDonPAA4EHhbnsceDBJeEC4P2EBwAOyBZ0rIiFrkWSdAAAgm/BgO1kKdeUAAFhJdJaBUCYBABAIAKhzIAAAEAgAQCAAAIEAAAQCABAIAEAg8tcEHIExrqhPc/ui26Pt78wBAAIRmRXs4h3pIe9wH3lGBLa30V80AAJx6aszT0dXHFt+bslxZ+H841Q49xTlzzpDeTOcFJmWHM2dlr4/PD1zBq8a7qwgluU7vMP95B4cINfAMLlGFfbm8QbmELoIVa1Q2qvzANCAgbjyyekuRYuPUNHCY1Q4/wQVzLHioFNkajKFJ6dRaEI6BcdlkX9MDvlHe5zBCcGR/LHuoSE9R8Qhu18eZfYuKIuuvdnQT9QVVHl0qWK+izoP0IAQiPOrTmpFC49TwTyOw2nKm3mW8qaLOExJqYhDcEKGiEO2CEMO+TQ3eYd7yTMsQK7BQZ9reO7MrL4ch0JKf7+I0j88vx+BgDYGlxiFi07PLFygr8ifp888tyKzS8ESV5eCha4ukRkuLTzR9YV/tMvvG+khD8dhqIjDoBDl9I9QVp98yvyI43CO0t45Tym9LlJG72saAgEJBpuUvOfg00IrcgaGjOz+uZRZEYdfKO09jsMFSu51iZJ7XKWzXa6VucbecrSAQIwU9gtOYXu8c+TYcuV8thz7GoBA1ENgftSR1a/gQMaHHIcopb4t4tDzEundOQ7X6czrt4SSA80YiPaCT46fF3T5mo/98T6/7Xxd4iMqPI0HGyR8IMx9W3sbO74pMw/+UOt/+dP7np+Z+vZFEYfLIg7X6OyblXE49UoJnXzJoAYOhE9wxuGLEwinHFPvqsyU4yvifH6/YP/ZOQyG/Fx4wAECEdvxDZk719bpCZH24TVN78ZxuEGnXyumUy+X0skXY3TipdsNvYLwC3ocfiUQDiUCqgNCWQ0rFHUOqwjAJYa5Y+15EQiK7V6/oi4fl/xOsXb6NV41lJKza7l2ppvZO7yC2jfTJUbvGs6fqczLz48N0LgAgeDLitjezSPN3eu/4FUEu/3Tzjo9KU6/VrrjxAsmnXih/EAz3+acWcP5vesRCA0POEjcQFgrB46DZefasl/376n10ppXDMeeLT9/9KnfKX3gH45mDEQXZf9B9YWcdyifv31NMQFIvEDk6O1tYVCVmfs2abVeRfT4q8vhx/887xxIzRkIdl6Iqk96+X6ZoKufv4o9C6dg4HYnJPQKIrZjrd+KgrqS4PfN3es+55DU5XM2cyB6225TjpRzM2QcDOFp9fPbboF+JDnl2Ew82CChA8GXEhyD6vAt0NiejTN4v6IVBMIa99P/D12Jg/r5z9vONay9BwDc5ty7cYUSBUNZSdjfdpp7NnzOG5vGd9u6sPLvxNt7NizncQ5JC/pFta8yLvE3KR3S/QAIhE1sp7zUkMx9WzTewJTv14m1wdmiKYEAQCBquNSwrxSMnet28DhvVJoyHvb5qt43dnxt8KVIGwoEAALBYns3zLQ/4dX/L1Exv3PdAXVlwe/zOM+3ojgwzbqrAYBA1IK5a50uVwa2SwUAQCDkSqFyRbDWj180AAIBAAgEACAQANDwEAgAQCAAAIEAAATiAdsgAMADViAeFJKsCQAA2YQHORB3cynkAFYSAFg5JMkm3N2ODxmJB3kQABLeg1Yc/gOptOvB5Z4VkgAAAABJRU5ErkJggg==\"","export default __webpack_public_path__ + \"static/media/Hop.4b77c9e3.svg\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/Hop_dark.423942af.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQgAAAAsCAMAAACuYtZZAAABmFBMVEUAAAD///////////////////////+PcOZ/UON5R+KNT+iFQeWSYOi4hfWIP+aRP+iIP+WUP+ibPeqSPOiiauz///////////////95VON4U+O3N/C1LO9+WOL///////9yS+F4SeO/JvK+IvF4SOP///////////////9+WOWHVeXRQPbKHvTRO/b///////////+pOOyxKu6+KfG7JvCxKu+wRPH///////////////////////////////////+qL+21J+/CIvLTS/PCIPK2J++sMuz///////////+eT+2iOOu3QfG8MPDNQPbUH/beGff1Zv/gGPjVIfXNNvS+MvOiNuv///////96SOKHQeaZQ+noMvrvDfv3A/3vC/vmRPmHP+V6R+J7SOKIQuaXQefvDfz3Bf2ZQeehNuuzPu27MPDUHfbeG/fTIfWiNuurMuy2J/DBIPGtQO2wKu68KPGwKe7NKvXKHvR3SOJ4SOJ3UuK/SfG0Ku+7QfF7V+OUPuidPeqIQOaRPueQP+eQT+iFQOV6R+MNOs0rAAAAhnRSTlMABhQdEgsKKXb/V/84Gf+z/7OF4SkpZYRWdnVmwVeT////wv//lIU4s1dXOMI44MLSdv+U0v9H4dFHV6PBGbJ10v/gKf//o/DxZkekR3Y4lIUZk4VHZrN2pPHwdjiz/8Ip8fDS4Xaz4XazV3WUhYWkpP//V/+z/2bB//+FOMJHZrKF/8KzVzMrutwAAANDSURBVHgB7NDFAQRBCERRfHxa8091PYK9Ur8Fzo+IRdMnTMRqHslzUyaxQGFC6oHClfQ90f8QgAAEIACxAOLTuq2AeLcfOyDO67dcZ2qI8y6/rdQzM8TV+m/rYz65LYvt9nkgju7mDWSXp2Q5JdsfxkqscmunzMzMzPjqf4+isrv3iQq6yZzfQlf4W5gZZhkrYRHlFRoqqyo1VVckZGuQmlm6ImrrNNQ31GtqrP0ZtZDbYGeQl6yIpmYNLa1tmpqbfkYdV3WeU9JnxF9//6Pp3//+T45mfdUJDsJkRDkTmMlEPjClqhj59g4iYcqOIK8QmBnkDSiW24MalnoRnV3dPQp6evv6k6MW5mWRBFrUOdmY8ui6GMYF6ccUhQyAox+5HvoSwMYsEaiy50ZYSLeIgcGh4ZHRMYDxicmp6aGZgaSodBHbDUmYdYAGOQsCURBxGn4OgEUZIk+SrTmAjEcrhypBJADkHLIUi5hfWFT90vLK6pqixfWNpLCYi1AtiwINzUL2tjZcF8C2iTIOiWCEcxgXHEk5pqyRzGguxSI2t7aLInZ2d5YU7W1tQnKz52jJS5p4x6NpL7yJANNH9H0E4BFQy6GI/8J8hw1quwTUQjfdW2P/4HDq6Bhg/Phk6vDgNGlrSCFVP0urYQ6ZmmOB4k2EhXOcW1kSoU9VqjHuIgaStourWiblh+XZ+YU+LC/Oz5LXAs7q8c2qDxayLyL0JiERqI0x0EtjDgooFNss5SIur641Xd9cJkcjX1LH1ZA8h3bGFxE8BhYqEVxfKhBliHwXZBQULfIUi6hu1nB7d6upufpnNIehWWa2ozruCoizX0W4oSGMMFIisEYYvjpQYxI1WKBAYIiO0JNpfmLf/3hiP9QmZIWLiBGXxDJC9lWEpKrFkdFFmkXM5qjCI4ooj/F3OCfT/I54fNTw9Pyi6fXxl0vjnRwvwRT9K54R7H3EjL2T/WdDoRve0AhlNTbwEmGOJZ42opr8UB6YaWqGslqaCA7MqFuLuxuw4QmIkTJUJ2ruoYEns3vqD/XB29a2VjA9OpzfPjqcPzrBgxWMBsRoQIwGxGhAjAYEK4geXUwGXV44urwQuuB0dMEpdAny6BJkAMRHfxzYlb9eAAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/Synapse.4974674c.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQgAAAAsCAMAAACuYtZZAAAAn1BMVEUAAAD////////////////////////1vjzzuzPzui/yvDTyujD////////////////2xE3/////////////////1nrzuzH////////////////zvTb1wELzvDL0wEbyvDb////////////////////////0uzDzuzHzuy/////////////////////////////0vDLyujD////////1wD3k7xDPAAAANXRSTlMABhQdEgsKZqT/o/EpRzgZOIX/wcIZ0nbx4JSEScJFiVeEk6NlsvbR8vDS4dFmpLPB8FZ1ZcrSjpcAAAKDSURBVHgB7NABAcBQFAFAD/SPvPX4LsIBRz2PB5ycPi7Wge7UhNJpBHV+i1jEIr527aipUR8IAPjTP4KSpGxigaoK0P49AFDv7vt/ttvNmpnrVfrgE7TZmcBOlIf8Jlkk5hsQNwHCRRTfBgjnEKNEgCAHkrhyCHJgieuGYAeWuGYIdri7uTsjkUgKRamW6kIh2GEjNmckUnBh0ECCvUyI+y07CJbY3n8NkUkps7wQQtndRUKQBDuQxIwDQki67UBdao14eESJpw1ebpFg84SX55dZiJJulWtJbWopKGRtqoTqSJXIxlSaOxtTl8LF/mDqZOkQD/H/jzwtXuNXngzPP+KXOYhDroWAFNuh7WwONNQGOttTJqEBa6HVrrPHzgYzPbifj0uGIIeYJdAhZgl0iE8lUhiMMUWOHAxBF91bGv6EfbaljLQUpK6kYOdIwzf0jJ5ArgRiy3VyHqKz1vZQe4iee+nFqt2YE4RwVdSiTmEFxbRjF4z8bS1LY8sO55fG6BCoTR5ClAeAwoBEiPETQvPoKTIYDEVbrKFYvlOxjKhYvp8vlqKzBMGNIUqwaZp2DkIyhJ8GfipxLByC68PH5+vzg+vEPIQ9gbAdZdkRhOBFIpRCp9KnS4egOkkS5MAVcx5CwXQCMVA2HENMrXuftpPQueEH01X8iU0S7BBHMzOiqaqqafPkGIJaJX8aOIZI8vaX3Bf02yOYvdy3vV48hJf47R3mvzXyt0T8CyF2AGAzGP+GEMpSr1sOZY/ppFf2GR6Jb4T6cpRS+NBqdRszUdiq8w5h89Y7hO18cggQ4R88sxEgAkSACBABIkD855JwmCwcL+Tjhf7AaThwGo4g8xHkP7gaLtKObnJaAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/btn_big_arbitrum.ff6ad480.png\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAf8AAAB/CAMAAADW6DvgAAABF1BMVEUbIDIeITUbHDAXGCwhGi2HLjhhJjNhJzNOIzJPIzI8HzBYJjNrKDRqKDRYJTM7Hy+QMDhGITGsNTwqHC51KjWaMTqPMDkzHi8eIDYbHDBFITB0KjYeITaiMzt+LDceITajMzt9LDdCIDCZMTo4HzA+IDBLKDmBMT15LzuuOD+TND05JjhRIzJyKjVwKjU2Hi+RMDgyHi8oIzdSIzJUKTp7LDYjGy5PJDKeMjuELThAIDBjJjSbMjqKLzg5HzBUJDJ5LDYlGy5hJzSSMDkfGSxqKDUpHC5EITEnGy5VJDMcGS02HS9DIDFAIDFFITFDIDAsHC4eITYcHzMaGy8TFiMeITUAAAASFiIcHzJlLDowJDduLjpCJjgHX8VeAAAAWXRSTlM4+O////////////////////////////+18P//+f/////////////////////////////////////////////////////////////////////6vvJR+SRTwHfs7R4AAA1sSURBVHgB7d2Hmuo6lgVgute2jKRNkLYoTcPgQ01NzjnnnKdzvO//HAOc2+jjkGRjwFT5vzmHtSwkWTaDwTe+iZOowJYqkY2GWhP2KIMvkLGsRuMJnf9Hm6lDiwq/UeBGRDOPBfUwGgh+bfZCuEY08ZvfGPzCt3Ca1vhMOCLL3DrCl5zBUWLUyRZYBVpMI54i/yRa5iHdOn+wnzmYqcGVvjX4xcx/OWszwldacIQxOCM6xVwOJ0gAWr6Uy4rQKpvyv6WoeDRHJoUrKEW4zuATTiOFrawhIFobT/4hJOdbELFFL36N0C6aeu9XEXdgFJcTXCYa1xB2N8zfCoCsISAq5doouXFKcTmfvPgNg5aRVZZwJ+SUGkecZwyuY4LcLH/GPlERR8hY6TYHOXKV31J4dqKVGgpOU4RrqZJuk390+JJTdBB+sNT6JCfl//zEspoTjmNcT8IQtChepeX8FQ4RGyQ0rlhuMMkhv7ESvBfR8miCI1SLE1tvkO+XLuZPFse4INiiYQjmJpPcuJxN1/E7vCtGqcMpYWhzZfvSav5acJRUJUDD10ITcIv8zcwCxuD9Icf7U8KocA2aTCbjclS8+c+Q7Zd/JeVfOzR+e5kpQdJq/noa8Y6R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\"","export default __webpack_public_path__ + \"static/media/btn_big_bsc.5e5ec82b.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/btn_big_purchasegmx.86c08dee.svg\";","export default __webpack_public_path__ + \"static/media/buy_fxdx_bond.8e72a10c.svg\";","export default __webpack_public_path__ + \"static/media/buy_transfer_eth.fd9264bc.svg\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/cross.4f70d802.svg\";","export default __webpack_public_path__ + \"static/media/flag_en.ad3aa4f8.svg\";","export default __webpack_public_path__ + \"static/media/flag_es.284fc0d7.svg\";","export default __webpack_public_path__ + \"static/media/flag_fr.d7acb86a.svg\";","export default __webpack_public_path__ + \"static/media/flag_ja.fdbc8bce.svg\";","export default __webpack_public_path__ + \"static/media/flag_ko.e814d54a.svg\";","export default __webpack_public_path__ + \"static/media/flag_ru.c789ea20.svg\";","export default __webpack_public_path__ + \"static/media/flag_zh.814b7a34.svg\";","export default __webpack_public_path__ + \"static/media/flp_icon.ef02d046.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABPCAQAAAC3gKgqAAADyUlEQVR4Ae3BfWhVdQDH4e/Z3Uvb2lZukS5sOEI3UHS95xbBqg2iQmcvpCRZZClYkBoWaAvpD0ncHxVCFjE0iyE6eyFqK6K3RRTaiy1ptaXljDnL29h2t7v7iZGeTuuen9vd7r3nynke+Xw+n8/n800EWToXUMKrVCnVkcELwPsUKbWxlH5GbcZS6mI23/OPk9QqVZHNTv7VxiVKTawkhFMDAaUeKujkv4LUKdWQTzP/9zWlSi2sI0w0O8hU6qCSbqIbYLlSBYW04O4w5UoFWNQTwWQ3OfI+aujFbIhV8jqKaePsuqiQlxGggfHZT768iyX8xfiMsF5eRSnfMn7dVMmLyOJlJqaFafIe7mOQiYnwFJa8hXl0MHG91MhLyKWJ2LRRLO/gEYaJ1TYC8gau5iixC7JIXsAFvI1ZK3sxOcAsJR9PEMGki/mUcBCTF8lUcnEDv2MyxCpJoo4g7vpZqmTiIj7EbDc5kkSABkzaKVOykMYzmP1AuU6jmM8x2UW2koNb+AOTAe6VA7WcxN0QDysZmMkXmO0gUw5YbMakkwVKNNJ5DrODzNIYFPEBJs3kKbG4iz5MgixWFFzPcdyFeUyJxGV8h9lWAoqKxxnB3TEWKlE4j0bMPmOGbAQIyEYBb2DSQqESg/sZxKSXm+XAA6yWA1fQhbsIm5QIzOMnzOqxZKOCI3RzrRxYzRDuTnCj4o3z2YNZC4Wykc9+Rr3LNNnI4TVMPmGG4otHCWNyjIVyYB1hRkXYKAfKOYzJs6QpfriGXzEJs1YOVNLNGT1Uy4HlDODuFLcrXriQdzDbR55sFNKK00dcLBtZvITJV5QoPthIBJOfmS8bFk8z1hbSZKOUbzDZTqamHtX0YBLiQTlQQy9j/cmtcuAO+nDXzzJNNabzMWaNZMtGMW1E8yUzZSOdBkzaKdNUIo0tmB1itmwE2Iab58mQjWLaMNlJtqYOt3EKkyB3yoHFBHHTx91yoJZe3IV4SONi6awo0V5dLpNf1KiQLI1C6bpHZXJ3SIusDp2GpXo9qXS56VKddUCTRwbbmWqvkCUbRbRiso88TR7L6GeqDbJCDlRxHHdh1mqymEM78dDBXDmwgRHc/cZ1mgyy2UW8NJErGwW8icl7FCp2rCREvAyzRg5cyRHcRdikWLGATuLpKFfJgTUM4+4ENykW5NNMvL1FgWzk0oTJp0zXxLGeMPE2wgY5MJcfMdlKQBNDJT0kQi/VcmAFIdz1s0Qu0hVdjpoV0fhZik1Al2JZ6IzXVag5iii6dOXKq7Dk8/l8Pp/Pd676GwYUP6Kwt1/bAAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/fxdx-logo-final-white.b7833ed6.png\";","export default __webpack_public_path__ + \"static/media/fxdx-logo-final.0b59e423.png\";","export default __webpack_public_path__ + \"static/media/fxdx-logo-glow.83c5aea5.png\";","export default __webpack_public_path__ + \"static/media/fxdx-logo-with-name.6211e9eb.svg\";","export default __webpack_public_path__ + \"static/media/fxdx_logo.9b999610.svg\";","export default __webpack_public_path__ + \"static/media/graphite-01.6f3526cd.png\";","export default __webpack_public_path__ + \"static/media/ic-communityproject.d195d704.svg\";","export default __webpack_public_path__ + \"static/media/ic_arbitrum_hover_16.d779b479.svg\";","export default __webpack_public_path__ + \"static/media/ic_arrowleft16.9d2319ed.svg\";","export default __webpack_public_path__ + \"static/media/ic_arrowright16.25e0dd13.svg\";","export default __webpack_public_path__ + \"static/media/ic_avax_24.43583fc4.svg\";","export default __webpack_public_path__ + \"static/media/ic_avax_30.403cd87e.svg\";","export default __webpack_public_path__ + \"static/media/ic_avax_40.ba220dde.svg\";","export default __webpack_public_path__ + \"static/media/ic_banxa.06412144.svg\";","export default __webpack_public_path__ + \"static/media/ic_binance_logo.46794a16.svg\";","export default __webpack_public_path__ + \"static/media/ic_bsc.8de996f1.svg\";","export default __webpack_public_path__ + \"static/media/ic_bsc_96.79853d5a.svg\";","export default __webpack_public_path__ + \"static/media/ic_btc.b_24.a8f56d16.svg\";","export default __webpack_public_path__ + \"static/media/ic_btc.b_40.1560513c.svg\";","export default __webpack_public_path__ + \"static/media/ic_btc_24.f992927a.svg\";","export default __webpack_public_path__ + \"static/media/ic_btc_40.1560513c.svg\";","export default __webpack_public_path__ + \"static/media/ic_busd_24.2432ce58.svg\";","export default __webpack_public_path__ + \"static/media/ic_busd_40.f2392c6a.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAAsCAYAAAAq/ZsdAAAFI0lEQVR4Ac1ZA5AsSRCd2FkMvm2cbdu2bdu2bdt3obN9X6tGrW3vxv6x509e5dwtukZdXYt5EW9ZNf1eZFZmVbVJL8yyfJpZlT2UYIw4VzrVlC3IJXINChNhriLXZJOh56gon4Ahbw5RHs8SO+JRwrmmbEMuIfuYiRzgNYNzcK4pG5Gryk9j+vCkGs7JGgOiqYdjj7MEzj/OErrfCHHuBBiS9slR5XpMpXTEMZtf037hcdYgiPAEe3gHU7bghBkw43hrsNWoGZw77iLNqnqWWVW+yVElNR1xDG2mZ51gCRxg1BDOHT8nkrQFFfgLpVvP+rmorRUe6ekJPtrTU3P6Lt7PDRh6Ydy85CjSlVRkxKxIusr2TrXVMBq3NnVtOGq2b5An1TBdxyfFiPwRFbmep/cc1FCvMfRgTzfY/yqLzP6iehJTTVEW5SqyRA3FU0zUEP7dUkRiW13W0X3EIu/Tx9kCDyTjsZbABWNvRi1ckUuUOr0phpxdTuDGzg742+MG4vdrDLWEQvG/v9DfB4c01ofiG9WysiWmCUF5+cxcVaniMYNrxhGNgl6scnpg578anbsfMHgKjcj+oznmfcesyKuoyCC/GT784vDBwnfqk66hY63Bv+g6WiFuRpVf5dyrwT8eD/DCR/3fWBeDZauaYaMHW1IVBwfl9SLV7HTeUylGJxnQ5Cq3B9a4fEA8G6CSeu4Pac2cQP7jrNXVsOPpPelK+Ff8JbyoaBoVOMBbzW6iRYAFVjhrURmsLGxFwRre0xiDy6q1fzuAeKGgSIVDNvKkK+Uq19rKJdKLQzsAHmI5ZmEpIbBVcReK1c0tV3fB8kebMvUnB5rS1W+ouBgl8PKk5iZg8fWAH0Vy07a6DPbbySFsCrc193JFh+k9qVDkBHixnUmxNNx6VTesvL8ZRYuZov2mnREqnHYsmv0A3/ZriwHLw0kILOuI3o2rioUi6WFtqLKJ8Pv1LtCLCk9qYzP/qYZdj+7Xu4H9KjHdiHIP00S5iUVgb+KCL3rjJVkXvNHkppaXtsCOp/bqPmIcawudwDRS5S9RMxutaxsWdHZFDN7tikGxEzKiLwQJhrYhPbDpg208Z6YWxpD0i4ihXMojSChB2JC5x1ti8OfgUFNNxEvt2jl7Egcs+LSexxBoduc0Ql4RQxsVtukuy9hUGWAkNWMOI0GYsqacwxATJbMitxk1YysqgwOJl6fX4BZIA/ydHTPr92o4YoEPhXKvJUy5P40amlZUmZBij7XEv6dMQW80s6Gt3u3kv1CxhT4wIUQu4Dcr7dCIbfYPVTAszYnEIsAAK6PGzFEkPNSLeOkYMvS3ETP2deWwB3GwZriPEGw0dyODsPDdeqNXXiv+v2OTndxbnj9rYC/iRBHxMs2PxAqHnLu6DnY5vk/sDo8K/I23uVpKCRxJwsNCvhvgiUxyM5uXdMKitxoMmUHiBYspDlWdkavIMs8WaObq6gRBuAnFNYELvYVJQexD+HeMJptmx5Eobc6tMPeLWjhyrk/IEHNiVd5BU3qiNefvGq6ewy7+Y6kJPNhtWdIFtnVlsNFDicdwYUOIPEJ2zFXjrx8bKMO5RC5KGqFfqwzdyyE3+bQN8ktVmPldNWxyeyvsv71T2AxS6D4PK0q6D79+d22N/vyRqIBYjionAvohf6d7wIuXReJGkGcuGF8zqMWYCzZKlqBTTIg4UcNQdISBR2GBF1rCxGejhjF/S4cVhj9aYlHBZ/Lf1/Gn4QFxc+PIdK9a/gVaRiAcqhHzNAAAAABJRU5ErkJggg==\"","export default __webpack_public_path__ + \"static/media/ic_cash.21569a1d.svg\";","export default __webpack_public_path__ + \"static/media/ic_coingecko_hover_16.ef20d202.svg\";","export default __webpack_public_path__ + \"static/media/ic_dai_24.bafa9da6.svg\";","export default __webpack_public_path__ + \"static/media/ic_dai_40.6f901476.svg\";","export default __webpack_public_path__ + \"static/media/ic_eth_24.6b1d8a1d.svg\";","export default __webpack_public_path__ + \"static/media/ic_eth_40.5e255508.svg\";","export default __webpack_public_path__ + \"static/media/ic_ethereum_96.77db9d2e.svg\";","export default __webpack_public_path__ + \"static/media/ic_flp_24.eff381d9.svg\";","export default __webpack_public_path__ + \"static/media/ic_flp_40.087335c1.svg\";","export default __webpack_public_path__ + \"static/media/ic_flp_custom.11dd75db.svg\";","export default __webpack_public_path__ + \"static/media/ic_frax_24.7349c478.svg\";","export default __webpack_public_path__ + \"static/media/ic_frax_40.1e127166.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx.bf8fb0b1.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_24.2b59d7e0.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_30.375de394.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_40.8cd483b1.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_64.f4caeaad.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_arbitrum.59f04e87.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_avax.fb50658c.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_big.a0a74216.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_custom.fd35b66a.svg\";","export default __webpack_public_path__ + \"static/media/ic_fxdx_footer.e7821eb2.svg\";","export default __webpack_public_path__ + \"static/media/ic_glmr_24.42b84f89.svg\";","export default __webpack_public_path__ + \"static/media/ic_glmr_40.5d7c0689.svg\";","export default __webpack_public_path__ + \"static/media/ic_hop.0f4a98a0.svg\";","export default __webpack_public_path__ + \"static/media/ic_info.f334ee0a.svg\";","export default __webpack_public_path__ + \"static/media/ic_link_24.0d641e52.svg\";","export default __webpack_public_path__ + \"static/media/ic_link_40.4bb3a048.svg\";","export default __webpack_public_path__ + \"static/media/ic_menu_dots.ba19dad8.svg\";","export default __webpack_public_path__ + \"static/media/ic_metamask_hover_16.aa3dce32.svg\";","export default __webpack_public_path__ + \"static/media/ic_mim_24.b6a1708c.svg\";","export default __webpack_public_path__ + \"static/media/ic_mim_40.42c8b575.svg\";","export default __webpack_public_path__ + \"static/media/ic_moonbeam_200.d537e328.svg\";","export default __webpack_public_path__ + \"static/media/ic_multiswap.e577f4fa.svg\";","export default __webpack_public_path__ + \"static/media/ic_olympus.0b15337e.svg\";","export default __webpack_public_path__ + \"static/media/ic_olympus_arbitrum.2d52c3f7.svg\";","export default __webpack_public_path__ + \"static/media/ic_selector_dropdowns.aaf0b8f0.svg\";","export default __webpack_public_path__ + \"static/media/ic_settings_24.6f286878.svg\";","export default __webpack_public_path__ + \"static/media/ic_sign in_16.fa320a73.svg\";","export default __webpack_public_path__ + \"static/media/ic_stats_big.4a4ebfb7.svg\";","export default __webpack_public_path__ + \"static/media/ic_synapse.8b3e94cb.svg\";","export default __webpack_public_path__ + \"static/media/ic_tether_24.a7c88dcd.svg\";","export default __webpack_public_path__ + \"static/media/ic_tokens.42432da7.svg\";","export default __webpack_public_path__ + \"static/media/ic_transfer_avax.6d7a1ef1.svg\";","export default __webpack_public_path__ + \"static/media/ic_uni_24.47e903f7.svg\";","export default __webpack_public_path__ + \"static/media/ic_uni_40.efe1f12f.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc(m)_24.0952740b.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc(m)_40.27f415ba.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc(w)_24.0952740b.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc(w)_40.27f415ba.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc.e_24.0952740b.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc.e_40.27f415ba.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc_24.0952740b.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdc_40.27f415ba.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdt_24.5ab8778d.svg\";","export default __webpack_public_path__ + \"static/media/ic_usdt_40.e357d24a.svg\";","export default __webpack_public_path__ + \"static/media/ic_wavax_24.43583fc4.svg\";","export default __webpack_public_path__ + \"static/media/ic_wavax_40.ba36eda4.svg\";","export default __webpack_public_path__ + \"static/media/ic_wbtc(m)_24.5dda0ca3.svg\";","export default __webpack_public_path__ + \"static/media/ic_wbtc(m)_40.8330ef8d.svg\";","export default __webpack_public_path__ + \"static/media/ic_wbtc(w)_24.5dda0ca3.svg\";","export default __webpack_public_path__ + \"static/media/ic_wbtc(w)_40.8330ef8d.svg\";","export default __webpack_public_path__ + \"static/media/ic_wbtc_24.5dda0ca3.svg\";","export default __webpack_public_path__ + \"static/media/ic_wbtc_40.8330ef8d.svg\";","export default __webpack_public_path__ + \"static/media/ic_weth_24.bc395894.svg\";","export default __webpack_public_path__ + \"static/media/ic_weth_40.334ca16a.svg\";","export default __webpack_public_path__ + \"static/media/ic_wglmr_24.42b84f89.svg\";","export default __webpack_public_path__ + \"static/media/ic_wglmr_40.5d7c0689.svg\";","export default __webpack_public_path__ + \"static/media/lg_arbitrum.bdf133fe.svg\";","export default __webpack_public_path__ + \"static/media/logo_FXDX.b956aa96.svg\";","export default __webpack_public_path__ + \"static/media/logo_FXDX_small.f593fa5c.svg\";","export default __webpack_public_path__ + \"static/media/metamask-text.2f9c2df2.svg\";","export default __webpack_public_path__ + \"static/media/page-not-found.bb90d073.svg\";","export default __webpack_public_path__ + \"static/media/trading.7ea1604c.jpg\";","export default __webpack_public_path__ + \"static/media/wallet-connect-text.78166b41.svg\";","export default __webpack_public_path__ + \"static/media/wave-01.3c9bce1e.png\";","export default __webpack_public_path__ + \"static/media/wave-02.4a56e8c7.png\";","var map = {\n\t\"./de/messages.po\": [\n\t\t795,\n\t\t4\n\t],\n\t\"./en/messages.po\": [\n\t\t796,\n\t\t5\n\t],\n\t\"./es/messages.po\": [\n\t\t797,\n\t\t6\n\t],\n\t\"./fr/messages.po\": [\n\t\t798,\n\t\t7\n\t],\n\t\"./ja/messages.po\": [\n\t\t799,\n\t\t8\n\t],\n\t\"./ko/messages.po\": [\n\t\t800,\n\t\t9\n\t],\n\t\"./pseudo/messages.po\": [\n\t\t801,\n\t\t10\n\t],\n\t\"./ru/messages.po\": [\n\t\t802,\n\t\t11\n\t],\n\t\"./zh/messages.po\": [\n\t\t803,\n\t\t12\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__.t(id, 7);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 775;\nmodule.exports = webpackAsyncContext;","import { ethers } from \"ethers\";\n\nconst { parseEther } = ethers.utils;\n\nexport const IS_TESTNET = true;\n\nexport const GOERLI = 5;\nexport const MAINNET = 1;\nexport const AVALANCHE = 43114;\nexport const ARBITRUM_TESTNET = 421611;\nexport const ARBITRUM = 42161;\nexport const MOONBEAM = 1284;\nexport const MUMBAI = 80001;\n\n// TODO take it from web3\nexport const DEFAULT_CHAIN_ID = IS_TESTNET ? MUMBAI : MOONBEAM;\nexport const CHAIN_ID = DEFAULT_CHAIN_ID;\n\nexport const SUPPORTED_CHAIN_IDS: number[] = [];\n\nif (IS_TESTNET) {\n SUPPORTED_CHAIN_IDS.push(MUMBAI);\n} else {\n SUPPORTED_CHAIN_IDS.push(MOONBEAM);\n}\n\nexport const IS_NETWORK_DISABLED = {\n [ARBITRUM]: false,\n [AVALANCHE]: false,\n};\n\nexport const CHAIN_NAMES_MAP = {\n [GOERLI]: \"Goerli\",\n [MAINNET]: \"Ethereum\",\n [ARBITRUM_TESTNET]: \"ArbRinkeby\",\n [ARBITRUM]: \"Arbitrum\",\n [AVALANCHE]: \"Avalanche\",\n [MOONBEAM]: \"MoonBeam\",\n [MUMBAI]: \"Mumbai\",\n};\n\nexport const GAS_PRICE_ADJUSTMENT_MAP = {\n [ARBITRUM]: \"0\",\n [AVALANCHE]: \"3000000000\", // 3 gwei\n};\n\nexport const MAX_GAS_PRICE_MAP = {\n [AVALANCHE]: \"200000000000\", // 200 gwei\n};\n\nexport const HIGH_EXECUTION_FEES_MAP = {\n [ARBITRUM]: 3, // 3 USD\n [AVALANCHE]: 3, // 3 USD\n [MOONBEAM]: 1, // 1 USD\n};\n\nconst constants = {\n [GOERLI]: {\n nativeTokenSymbol: \"ETH\",\n wrappedTokenSymbol: \"WETH\",\n defaultCollateralSymbol: \"USDC\",\n defaultFlagOrdersEnabled: false,\n positionReaderPropsLength: 9,\n v2: true,\n\n SWAP_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.01\"),\n INCREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.01\"),\n // contract requires that execution fee be strictly greater than instead of gte\n DECREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.0100001\"),\n },\n\n [ARBITRUM_TESTNET]: {\n nativeTokenSymbol: \"ETH\",\n defaultCollateralSymbol: \"USDC\",\n defaultFlagOrdersEnabled: false,\n positionReaderPropsLength: 9,\n v2: true,\n\n SWAP_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.0003\"),\n INCREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.0003\"),\n // contract requires that execution fee be strictly greater than instead of gte\n DECREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.000300001\"),\n },\n\n [ARBITRUM]: {\n nativeTokenSymbol: \"ETH\",\n wrappedTokenSymbol: \"WETH\",\n defaultCollateralSymbol: \"USDC\",\n defaultFlagOrdersEnabled: false,\n positionReaderPropsLength: 9,\n v2: true,\n\n SWAP_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.0003\"),\n INCREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.0003\"),\n // contract requires that execution fee be strictly greater than instead of gte\n DECREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.000300001\"),\n },\n\n [AVALANCHE]: {\n nativeTokenSymbol: \"AVAX\",\n wrappedTokenSymbol: \"WAVAX\",\n defaultCollateralSymbol: \"USDC\",\n defaultFlagOrdersEnabled: true,\n positionReaderPropsLength: 9,\n v2: true,\n\n SWAP_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.01\"),\n INCREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.01\"),\n // contract requires that execution fee be strictly greater than instead of gte\n DECREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.0100001\"),\n },\n\n [MOONBEAM]: {\n nativeTokenSymbol: \"GLMR\",\n wrappedTokenSymbol: \"WGLMR\",\n defaultCollateralSymbol: \"USDC(M)\",\n defaultFlagOrdersEnabled: true,\n positionReaderPropsLength: 9,\n v2: true,\n\n SWAP_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.1\"),\n INCREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.1\"),\n // contract requires that execution fee be strictly greater than instead of gte\n DECREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.100001\"),\n },\n [MUMBAI]: {\n nativeTokenSymbol: \"MATIC\",\n wrappedTokenSymbol: \"WMATIC\",\n defaultCollateralSymbol: \"USDC\",\n defaultFlagOrdersEnabled: true,\n positionReaderPropsLength: 9,\n v2: true,\n\n SWAP_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.1\"),\n INCREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.1\"),\n // contract requires that execution fee be strictly greater than instead of gte\n DECREASE_ORDER_EXECUTION_GAS_FEE: parseEther(\"0.100001\"),\n },\n};\n\nconst ALCHEMY_WHITELISTED_DOMAINS = [\"fxdx.exchange\", \"test.fxdx.exchange\"];\n\nexport const GOERLI_RPC_PRIVIDERS = [\n // \"https://goerli.infura.io/v3/5fe38fecbed34e5098225e7b279a2289\",\n \"https://rpc.ankr.com/eth_goerli\",\n];\nexport const MAINNET_RPC_PROVIDERS = [\"https://mainnet.infura.io/v3/5fe38fecbed34e5098225e7b279a2289\"];\nexport const ARBITRUM_RPC_PROVIDERS = [getDefaultArbitrumRpcUrl()];\nexport const AVALANCHE_RPC_PROVIDERS = [\"https://api.avax.network/ext/bc/C/rpc\"]; // BSC MAINNET\nexport const MOONBEAM_RPC_PROVIDERS = [\"https://rpc.api.moonbeam.network\"];\nexport const MUMBAI_RPC_PROVIDERS = [\"https://matic-mumbai.chainstacklabs.com\"];\n\nexport const RPC_PROVIDERS = {\n [GOERLI]: GOERLI_RPC_PRIVIDERS,\n [MAINNET]: MAINNET_RPC_PROVIDERS,\n [ARBITRUM]: ARBITRUM_RPC_PROVIDERS,\n [AVALANCHE]: AVALANCHE_RPC_PROVIDERS,\n [MOONBEAM]: MOONBEAM_RPC_PROVIDERS,\n [MUMBAI]: MUMBAI_RPC_PROVIDERS,\n};\n\nexport const FALLBACK_PROVIDERS = {\n [GOERLI]: [\"https://ethereum-goerli-rpc.allthatnode.com\"],\n [MAINNET]: [\"https://mainnet.infura.io/v3/5fe38fecbed34e5098225e7b279a2289\"],\n [ARBITRUM]: [getAlchemyHttpUrl()],\n [AVALANCHE]: [\"https://avax-mainnet.gateway.pokt.network/v1/lb/626f37766c499d003aada23b\"],\n [MOONBEAM]: [\n \"https://moonbeam.public.blastapi.io\",\n \"https://moonbeam.blastapi.io/fe360d4f-9d4a-4fb1-9030-37aeb5d195b3\",\n ],\n [MUMBAI]: [\"https://polygon-testnet.public.blastapi.io\",\n 'https://matic-testnet-archive-rpc.bwarelabs.com',\n 'https://rpc.ankr.com/polygon_mumbai'\n ],\n};\n\nexport const NETWORK_METADATA = {\n [GOERLI]: {\n chainId: \"0x\" + GOERLI.toString(16),\n chainName: \"Goerli test network\",\n nativeCurrency: {\n name: \"GoerliETH\",\n symbol: \"GoerliETH\",\n decimals: 18,\n },\n rpcUrls: GOERLI_RPC_PRIVIDERS,\n blockExplorerUrls: [getExplorerUrl(ARBITRUM)],\n },\n [MAINNET]: {\n chainId: \"0x\" + MAINNET.toString(16),\n chainName: \"Ethereum\",\n nativeCurrency: {\n name: \"ETH\",\n symbol: \"ETH\",\n decimals: 18,\n },\n rpcUrls: MAINNET_RPC_PROVIDERS,\n blockExplorerUrls: [\"https://etherscan.io\"],\n },\n [ARBITRUM_TESTNET]: {\n chainId: \"0x\" + ARBITRUM_TESTNET.toString(16),\n chainName: \"Arbitrum Testnet\",\n nativeCurrency: {\n name: \"ETH\",\n symbol: \"ETH\",\n decimals: 18,\n },\n rpcUrls: [\"https://rinkeby.arbitrum.io/rpc\"],\n blockExplorerUrls: [\"https://rinkeby-explorer.arbitrum.io/\"],\n },\n [ARBITRUM]: {\n chainId: \"0x\" + ARBITRUM.toString(16),\n chainName: \"Arbitrum\",\n nativeCurrency: {\n name: \"ETH\",\n symbol: \"ETH\",\n decimals: 18,\n },\n rpcUrls: ARBITRUM_RPC_PROVIDERS,\n blockExplorerUrls: [getExplorerUrl(ARBITRUM)],\n },\n [AVALANCHE]: {\n chainId: \"0x\" + AVALANCHE.toString(16),\n chainName: \"Avalanche\",\n nativeCurrency: {\n name: \"AVAX\",\n symbol: \"AVAX\",\n decimals: 18,\n },\n rpcUrls: AVALANCHE_RPC_PROVIDERS,\n blockExplorerUrls: [getExplorerUrl(AVALANCHE)],\n },\n [MOONBEAM]: {\n chainId: \"0x\" + MOONBEAM.toString(16),\n chainName: \"MoonBeam\",\n nativeCurrency: {\n name: \"Glimmer\",\n symbol: \"GLMR\",\n decimals: 18,\n },\n rpcUrls: MOONBEAM_RPC_PROVIDERS,\n blockExplorerUrls: [getExplorerUrl(MOONBEAM)],\n },\n [MUMBAI]: {\n chainId: \"0x\" + MOONBEAM.toString(16),\n chainName: \"Mumbai\",\n nativeCurrency: {\n name: \"Matic\",\n symbol: \"MATIC\",\n decimals: 18,\n },\n rpcUrls: MUMBAI_RPC_PROVIDERS,\n blockExplorerUrls: [getExplorerUrl(MUMBAI)],\n },\n};\n\nexport const getConstant = (chainId: number, key: string) => {\n if (!constants[chainId]) {\n throw new Error(`Unsupported chainId ${chainId}`);\n }\n\n if (!(key in constants[chainId])) {\n throw new Error(`Key ${key} does not exist for chainId ${chainId}`);\n }\n\n return constants[chainId][key];\n};\n\nexport function getChainName(chainId: number) {\n return CHAIN_NAMES_MAP[chainId];\n}\n\nexport function getDefaultArbitrumRpcUrl() {\n return \"https://arb1.arbitrum.io/rpc\";\n}\n\nexport function getAlchemyHttpUrl() {\n if (ALCHEMY_WHITELISTED_DOMAINS.includes(window.location.host)) {\n return \"https://arb-mainnet.g.alchemy.com/v2/ha7CFsr1bx5ZItuR6VZBbhKozcKDY4LZ\";\n }\n return \"https://arb-mainnet.g.alchemy.com/v2/EmVYwUw0N2tXOuG0SZfe5Z04rzBsCbr2\";\n}\n\nexport function getAlchemyWsUrl() {\n if (ALCHEMY_WHITELISTED_DOMAINS.includes(window.location.host)) {\n return \"wss://arb-mainnet.g.alchemy.com/v2/ha7CFsr1bx5ZItuR6VZBbhKozcKDY4LZ\";\n }\n return \"wss://arb-mainnet.g.alchemy.com/v2/EmVYwUw0N2tXOuG0SZfe5Z04rzBsCbr2\";\n}\n\nexport function getExplorerUrl(chainId) {\n if (chainId === GOERLI) {\n return \"https://goerli.etherscan.io/\";\n } else if (chainId === MAINNET) {\n return \"https://etherscan.com/\";\n } else if (chainId === ARBITRUM_TESTNET) {\n return \"https://testnet.arbiscan.io/\";\n } else if (chainId === ARBITRUM) {\n return \"https://arbiscan.io/\";\n } else if (chainId === AVALANCHE) {\n return \"https://snowtrace.io/\";\n } else if (chainId === MOONBEAM) {\n return \"https://moonscan.io/\";\n } else if (chainId === MUMBAI) {\n return \"https://mumbai.polygonscan.com/\";\n }\n return \"https://etherscan.io/\";\n}\n\nexport function getHighExecutionFee(chainId) {\n return HIGH_EXECUTION_FEES_MAP[chainId] || 3;\n}\n\nexport function isSupportedChain(chainId) {\n return SUPPORTED_CHAIN_IDS.includes(chainId);\n}\n","import { ARBITRUM, ARBITRUM_TESTNET, AVALANCHE, GOERLI, MOONBEAM, MUMBAI } from \"./chains\";\n\nconst CONTRACTS = {\n [GOERLI]: {\n // Goerli Testnet\n Vault: \"0xEF5616750eeE8337E7e84E77Cc066dB78811AAAC\",\n Router: \"0x717c6C92B592e85A447630658B270fdeE0BC5021\",\n VaultReader: \"0x0772e957FcCFcDF7f8aDAEE1b874b1DDDd83a986\",\n Reader: \"0x0088504EEAe8B1A260dacF1f9DdE9FFE234368e1\",\n FlpManager: \"0xc3B15C60B76D2d08c1f616D36193d2Af1F5A5C38\",\n RewardRouter: \"0xdc6934373a2050d370f8fDce078fb9255A3F504C\",\n RewardReader: \"0xEcb552df99bB4D16CcC894cBcD10bE892e2aBFF8\",\n NATIVE_TOKEN: \"0xc47564a1303Ab4D8706fd70678Bf71A627605D50\",\n FLP: \"0x58Ec2c320b682bbC0e05fA9f6C943A36feBB46c3\",\n FXDX: \"0x77F7F57Dcc36A394D66d170bdFD0d94783D19B37\",\n ES_FXDX: \"0x236AfB12A35e61A2378352fb8d6fF3207954057b\",\n BN_FXDX: \"0x65dc83514aB9d4F2e896C5a8294b3aa16d4B547F\",\n USDF: \"0x7F7e822AD72003fde68827cC31806d7F871b621b\",\n ES_FXDX_IOU: \"0x6260101218eC4cCfFF1b778936C6f2400f95A954\", // placeholder\n StakedFxdxTracker: \"0x4A86668f3F5e38694880Ff6f4d62C8Fc4A5DFA55\",\n BonusFxdxTracker: \"0x04d8EC2583829A4f594E10Db7792e9CC4cB71256\",\n FeeFxdxTracker: \"0xCaBA10d0ddC80aAda44379898cA4783Ae698082f\",\n StakedFlpTracker: \"0xD372550C90C7DD20d44315D3Fd7d36206a2cD28C\",\n FeeFlpTracker: \"0xcc205E9C99714495902CB5163B5cfB2F315E3A5a\",\n\n StakedFxdxDistributor: \"0x945ea206B8eb500A2C52Cb8db110802EDbbBF2Ba\",\n StakedFlpDistributor: \"0x817226047a76a068F5A540F363F46334A600675f\",\n \n FxdxVester: \"0xF22f75ce8FC20A3801B9B0203700bb84d8F8caD8\",\n FlpVester: \"0x1d11bC7549272d2b2FA8137d7a95Da790C5Fa4D7\",\n \n OrderBook: \"0x0001e6c8c679854de107a0968ABa89A64a1865aC\",\n OrderBookReader: \"0x7BCfde821734861F4C4F2cE15887d42979DCCe97\",\n \n PositionRouter: \"0xBeC864A397D6b72D4f1c22Baf300CF6dE4add741\",\n PositionManager: \"0x5a8F03199BCc888510bae9153D2B6Aa0f0e60Ac7\",\n \n // UniswapFxdxEthPool: \"0x80A9ae39310abf666A87C743d6ebBD0E8C42158E\",\n ReferralStorage: \"0x6E48076398F3b16fC157AceaE6F8DD74C1d847d8\",\n ReferralReader: \"0x1DA813ff0591E22224aD6528Eda1084A1d1869AE\",\n },\n [ARBITRUM_TESTNET]: {\n // / goerli: {\n // admin: \"0xD5fba05dE4b2d303D03052e8aFbF31a767Bd908e\",\n // priceSender: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n // positionsKeeper: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n // orderKeeper: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n // liquidator: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n // mintReceiver: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n \n // // signers\n // signer1: \"0xD5fba05dE4b2d303D03052e8aFbF31a767Bd908e\",\n // signer2: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n // signer3: \"0xc136B4cb683343f41aC38B730cF45367c2a1786b\",\n // signer4: \"0x78351284f83A52b726aeEe6C2ceBBe656124434c\",\n // signer5: \"0x9539Aa4a337b0030606D4Bc996074074FA1DCe2d\",\n // signer6: \"0x0aadC3f3a906E392B78B42798Be40B8CFBE97451\",\n // signer7: \"0x8B9f8C1454Ca00E8c9e23dbb0D79680b86a33C3B\",// fake\n // signer8: \"0x074A430A18C4414aa88080f6daA25bCe6AA66B23\",// fake\n // signer9: \"0x70193F4E9Df8CFb79ebC47075fd4C3B2fA466ecE\",// fake\n \n // vault: \"0xEF5616750eeE8337E7e84E77Cc066dB78811AAAC\",\n // usdf: \"0x7F7e822AD72003fde68827cC31806d7F871b621b\",\n // router: \"0x717c6C92B592e85A447630658B270fdeE0BC5021\",\n // vaultPriceFeedOld: \"0x7103aFadbB3d3b28049B25637c70924328d73Ed8\", // not updated\n // vaultPriceFeed: \"0xa4236551dfb0bE6C40e80C3746DBD13a099405b8\",\n // flp: \"0x58Ec2c320b682bbC0e05fA9f6C943A36feBB46c3\",\n // flpManager: \"0xc3B15C60B76D2d08c1f616D36193d2Af1F5A5C38\",\n // vaultErrorController: \"0xd86882B077b3D0c3ac10A22Bd69F364c1FcFce83\",\n // vaultUtils: \"0x70029beefe45F5D8308bd06fC6491D8cb34f444f\",\n // orderBook: \"0x0001e6c8c679854de107a0968ABa89A64a1865aC\",\n // tokenManager: \"0x2A869589412c10227506E19173C5d08A4394948B\",\n // fxdx: \"0x77F7F57Dcc36A394D66d170bdFD0d94783D19B37\",\n // esFxdx: \"0x236AfB12A35e61A2378352fb8d6fF3207954057b\",\n // positionManager: \"0x5a8F03199BCc888510bae9153D2B6Aa0f0e60Ac7\",\n // positionRouter: \"0xBeC864A397D6b72D4f1c22Baf300CF6dE4add741\",\n // swapRouter: \"0x3561837482bC0e865d4f9E3bBcf857933dFE4CFC\",\n // liquidityRouter: \"0x2CC02646C8aE3d4593DaB80e80eC6A2F66d94c20\",\n // referralReader: \"0x1DA813ff0591E22224aD6528Eda1084A1d1869AE\",\n // referralStorage: \"0x6E48076398F3b16fC157AceaE6F8DD74C1d847d8\",\n // balanceUpdater: \"0x0BC64BAc45c4d8fAC6c5E113a1555B5DAb44E8e4\",\n // batchSender: \"0x06d4d3BbDCdCA741baD465D8b616172aAbE2a2d8\",\n // orderBookReader: \"0x7BCfde821734861F4C4F2cE15887d42979DCCe97\",\n // reader: \"0x0088504EEAe8B1A260dacF1f9DdE9FFE234368e1\",\n // rewardReader: \"0xEcb552df99bB4D16CcC894cBcD10bE892e2aBFF8\",\n // vaultReaderV1: \"0x8C009Dd38E0E40FD9b0451346BE92838f9A4B2cb\", // not updated\n // vaultReader: \"0x0772e957FcCFcDF7f8aDAEE1b874b1DDDd83a986\",\n // bnFxdx: \"0x65dc83514aB9d4F2e896C5a8294b3aa16d4B547F\",\n // stakedFxdxTracker: \"0x4A86668f3F5e38694880Ff6f4d62C8Fc4A5DFA55\",\n // stakedFxdxDistributor: \"0x945ea206B8eb500A2C52Cb8db110802EDbbBF2Ba\",\n // bonusFxdxTracker: \"0x04d8EC2583829A4f594E10Db7792e9CC4cB71256\",\n // bonusFxdxDistributor: \"0xdf29724A01e237a3255ebE1E638ed1BC91908447\",\n // feeFxdxTracker: \"0xCaBA10d0ddC80aAda44379898cA4783Ae698082f\",\n // feeFxdxDistributor: \"0xCd02BE07bD2DFE574bF6294457184eFA9db8e373\",\n // feeFlpTracker: \"0xcc205E9C99714495902CB5163B5cfB2F315E3A5a\",\n // feeFlpDistributor: \"0xfa79D668441c95D7069E32eCec229eF648FA3885\",\n // stakedFlpTracker: \"0xD372550C90C7DD20d44315D3Fd7d36206a2cD28C\",\n // stakedFlpDistributor: \"0x817226047a76a068F5A540F363F46334A600675f\",\n // fxdxVester: \"0xF22f75ce8FC20A3801B9B0203700bb84d8F8caD8\",\n // flpVester: \"0x1d11bC7549272d2b2FA8137d7a95Da790C5Fa4D7\",\n // rewardRouterV2Old: \"0xc7531ad650D0183B63CBeA4b9D6d9A7Cf305f1f9\", // no update\n // rewardRouterV2: \"0xdc6934373a2050d370f8fDce078fb9255A3F504C\",\n // stakeManager: \"0x628F47cBB126E6F06572052d78850BFA0554674e\",\n // timelock: \"0x060d4084EeefFd585CC75487743EBa2D6417B186\",\n // fastPriceEvents: \"0xa34245A6CFccD3ae2181F8Ae01C92CBD8fAE4E7C\",\n // fastPriceFeedOld: \"0xb6C7381211Ebf909d70259456dd343bDb0A34332\", // no update\n // fastPriceFeed: \"0x8CD6C4e422ceefaa2E63ff333160a1fF7a982Bed\",\n // priceFeedTimelock: \"0xC2f1F3cdF621E82E8FD34bB4fEe649BeA03125a3\",\n // stakedFlp: \"0x4f697c2cc8f8271aB0513DD9C46B7D209826E99c\",\n // flpBalance: \"0x056001c957B38d2e8C58E55E0a5148e2310a79c7\"\n // },\n \n // goerli: {\n // // https://docs.chain.link/docs/data-feeds/price-feeds/addresses/\n // btcPriceFeed: { address: \"0xA39434A63A52E749F02807ae27335515BA4b07F7\" },\n // ethPriceFeed: { address: \"0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e\" },\n // usdtPriceFeed: { address: \"0xAb5c49580294Aff77670F839ea425f5b78ab3Ae7\" },\n // usdcPriceFeed: { address: \"0xAb5c49580294Aff77670F839ea425f5b78ab3Ae7\" },\n // btc: {\n // name: \"btc\",\n // address: \"0x889328FC12EDBb9faccE23791F036005bE633e04\",\n // decimals: 18,\n // priceFeed: \"0xA39434A63A52E749F02807ae27335515BA4b07F7\",\n // priceDecimals: 8,\n // fastPricePrecision: 1000,\n // maxCumulativeDeltaDiff: 10 * 1000 * 1000,\n // isStrictStable: false,\n // tokenWeight: 27000,\n // minProfitBps: 0,\n // maxUsdfAmount: 50 * 1000 *1000,\n // bufferAmount: 450,\n // isStable: false,\n // isShortable: true,\n // maxGlobalShortSize: 30 * 1000 * 1000,\n // },\n // eth: {\n // name: \"eth\",\n // address: \"0xc47564a1303Ab4D8706fd70678Bf71A627605D50\",\n // decimals: 18,\n // priceFeed: \"0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e\",\n // priceDecimals: 8,\n // fastPricePrecision: 1000,\n // maxCumulativeDeltaDiff: 10 * 1000 * 1000,\n // isStrictStable: false,\n // tokenWeight: 28000,\n // minProfitBps: 0,\n // maxUsdfAmount: 120 * 1000 * 1000,\n // bufferAmount: 15000,\n // isStable: false,\n // isShortable: true,\n // maxGlobalShortSize: 30 * 1000 * 1000,\n // },\n // usdc: {\n // name: \"usdc\",\n // address: \"0x290733C49DA29892b23f16d2c33B9694bB9d7d80\",\n // decimals: 18,\n // priceFeed: \"0xAb5c49580294Aff77670F839ea425f5b78ab3Ae7\",\n // priceDecimals: 8,\n // isStrictStable: true,\n // tokenWeight: 32000,\n // minProfitBps: 0,\n // maxUsdfAmount: 120 * 1000 * 1000,\n // bufferAmount: 60 * 1000 * 1000,\n // isStable: true,\n // isShortable: false\n // },\n // usdt: {\n // name: \"usdt\",\n // address: \"0xD9a40366F9432B5ed484CF009d9793E633b54E10\",\n // decimals: 18,\n // priceFeed: \"0xAb5c49580294Aff77670F839ea425f5b78ab3Ae7\",\n // priceDecimals: 8,\n // isStrictStable: true,\n // tokenWeight: 3000,\n // minProfitBps: 0,\n // maxUsdfAmount: 10 * 1000 * 1000,\n // bufferAmount: 4 * 1000 * 1000,\n // isStable: true,\n // isShortable: false\n // },\n // nativeToken: {\n // name: \"weth\",\n // address: \"0xc47564a1303Ab4D8706fd70678Bf71A627605D50\",\n // decimals: 18\n // }\n // },\n // arbitrum testnet\n Vault: \"0xBc9BC47A7aB63db1E0030dC7B60DDcDe29CF4Ffb\",\n Router: \"0xe0d4662cdfa2d71477A7DF367d5541421FAC2547\",\n VaultReader: \"0xFc371E380262536c819D12B9569106bf032cC41c\",\n Reader: \"0x2E093c70E3A7E4919611d2555dFd8D697d2fC0a1\",\n FlpManager: \"0xD875d99E09118d2Be80579b9d23E83469077b498\",\n RewardRouter: \"0x0000000000000000000000000000000000000000\",\n RewardReader: \"0x0000000000000000000000000000000000000000\",\n NATIVE_TOKEN: \"0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681\",\n FLP: \"0xb4f81Fa74e06b5f762A104e47276BA9b2929cb27\",\n FXDX: \"0x0000000000000000000000000000000000000000\",\n ES_FXDX: \"0x0000000000000000000000000000000000000000\",\n BN_FXDX: \"0x0000000000000000000000000000000000000000\",\n USDF: \"0xBCDCaF67193Bf5C57be08623278fCB69f4cA9e68\",\n ES_FXDX_IOU: \"0x0000000000000000000000000000000000000000\",\n StakedFxdxTracker: \"0x0000000000000000000000000000000000000000\",\n BonusFxdxTracker: \"0x0000000000000000000000000000000000000000\",\n FeeFxdxTracker: \"0x0000000000000000000000000000000000000000\",\n StakedFlpTracker: \"0x0000000000000000000000000000000000000000\",\n FeeFlpTracker: \"0x0000000000000000000000000000000000000000\",\n\n StakedFxdxDistributor: \"0x0000000000000000000000000000000000000000\",\n StakedFlpDistributor: \"0x0000000000000000000000000000000000000000\",\n\n FxdxVester: \"0x0000000000000000000000000000000000000000\",\n FlpVester: \"0x0000000000000000000000000000000000000000\",\n\n OrderBook: \"0xebD147E5136879520dDaDf1cA8FBa48050EFf016\",\n OrderBookReader: \"0xC492c8d82DC576Ad870707bb40EDb63E2026111E\",\n\n PositionRouter: \"0xB4bB78cd12B097603e2b55D2556c09C17a5815F8\",\n PositionManager: \"0x168aDa266c2f10C1F37973B213d6178551030e44\",\n\n // UniswapFxdxEthPool: \"0x80A9ae39310abf666A87C743d6ebBD0E8C42158E\",\n ReferralStorage: \"0x0000000000000000000000000000000000000000\",\n ReferralReader: \"0x0000000000000000000000000000000000000000\",\n },\n [ARBITRUM]: {\n // arbitrum mainnet\n Vault: \"0x489ee077994B6658eAfA855C308275EAd8097C4A\",\n Router: \"0xaBBc5F99639c9B6bCb58544ddf04EFA6802F4064\",\n VaultReader: \"0xfebB9f4CAC4cD523598fE1C5771181440143F24A\",\n Reader: \"0x2b43c90D1B727cEe1Df34925bcd5Ace52Ec37694\",\n FlpManager: \"0x321F653eED006AD1C29D174e17d96351BDe22649\",\n RewardRouter: \"0xA906F338CB21815cBc4Bc87ace9e68c87eF8d8F1\",\n RewardReader: \"0x8BFb8e82Ee4569aee78D03235ff465Bd436D40E0\",\n NATIVE_TOKEN: \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\",\n FLP: \"0x4277f8F2c384827B5273592FF7CeBd9f2C1ac258\",\n FXDX: \"0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a\",\n ES_FXDX: \"0xf42Ae1D54fd613C9bb14810b0588FaAa09a426cA\",\n BN_FXDX: \"0x35247165119B69A40edD5304969560D0ef486921\",\n USDF: \"0x45096e7aA921f27590f8F19e457794EB09678141\",\n ES_FXDX_IOU: \"0x6260101218eC4cCfFF1b778936C6f2400f95A954\",\n StakedFxdxTracker: \"0x908C4D94D34924765f1eDc22A1DD098397c59dD4\",\n BonusFxdxTracker: \"0x4d268a7d4C16ceB5a606c173Bd974984343fea13\",\n FeeFxdxTracker: \"0xd2D1162512F927a7e282Ef43a362659E4F2a728F\",\n StakedFlpTracker: \"0x1aDDD80E6039594eE970E5872D247bf0414C8903\",\n FeeFlpTracker: \"0x4e971a87900b931fF39d1Aad67697F49835400b6\",\n\n StakedFxdxDistributor: \"0x23208B91A98c7C1CD9FE63085BFf68311494F193\",\n StakedFlpDistributor: \"0x60519b48ec4183a61ca2B8e37869E675FD203b34\",\n\n FxdxVester: \"0x199070DDfd1CFb69173aa2F7e20906F26B363004\",\n FlpVester: \"0xA75287d2f8b217273E7FCD7E86eF07D33972042E\",\n\n OrderBook: \"0x09f77E8A13De9a35a7231028187e9fD5DB8a2ACB\",\n OrderBookReader: \"0xa27C20A7CF0e1C68C0460706bB674f98F362Bc21\",\n\n PositionRouter: \"0xb87a436B93fFE9D75c5cFA7bAcFff96430b09868\",\n PositionManager: \"0x75E42e6f01baf1D6022bEa862A28774a9f8a4A0C\",\n\n UniswapFxdxEthPool: \"0x80A9ae39310abf666A87C743d6ebBD0E8C42158E\",\n ReferralStorage: \"0xe6fab3f0c7199b0d34d7fbe83394fc0e0d06e99d\",\n ReferralReader: \"0x8Aa382760BCdCe8644C33e6C2D52f6304A76F5c8\",\n },\n [AVALANCHE]: {\n // avalanche\n Vault: \"0x9ab2De34A33fB459b538c43f251eB825645e8595\",\n Router: \"0x5F719c2F1095F7B9fc68a68e35B51194f4b6abe8\",\n VaultReader: \"0x66eC8fc33A26feAEAe156afA3Cb46923651F6f0D\",\n Reader: \"0x2eFEE1950ededC65De687b40Fd30a7B5f4544aBd\",\n FlpManager: \"0xe1ae4d4b06A5Fe1fc288f6B4CD72f9F8323B107F\",\n RewardRouter: \"0x82147C5A7E850eA4E28155DF107F2590fD4ba327\",\n RewardReader: \"0x04Fc11Bd28763872d143637a7c768bD96E44c1b6\",\n NATIVE_TOKEN: \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\",\n FLP: \"0x01234181085565ed162a948b6a5e88758CD7c7b8\",\n FXDX: \"0x62edc0692BD897D2295872a9FFCac5425011c661\",\n ES_FXDX: \"0xFf1489227BbAAC61a9209A08929E4c2a526DdD17\",\n BN_FXDX: \"0x8087a341D32D445d9aC8aCc9c14F5781E04A26d2\",\n USDF: \"0xc0253c3cC6aa5Ab407b5795a04c28fB063273894\",\n ES_FXDX_IOU: \"0x6260101218eC4cCfFF1b778936C6f2400f95A954\", // placeholder address\n\n StakedFxdxTracker: \"0x2bD10f8E93B3669b6d42E74eEedC65dd1B0a1342\",\n BonusFxdxTracker: \"0x908C4D94D34924765f1eDc22A1DD098397c59dD4\",\n FeeFxdxTracker: \"0x4d268a7d4C16ceB5a606c173Bd974984343fea13\",\n StakedFlpTracker: \"0x9e295B5B976a184B14aD8cd72413aD846C299660\",\n FeeFlpTracker: \"0xd2D1162512F927a7e282Ef43a362659E4F2a728F\",\n\n StakedFxdxDistributor: \"0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a\",\n StakedFlpDistributor: \"0xDd593Cf40734199afc9207eBe9ffF23dA4Bf7720\",\n\n FxdxVester: \"0x472361d3cA5F49c8E633FB50385BfaD1e018b445\",\n FlpVester: \"0x62331A7Bd1dfB3A7642B7db50B5509E57CA3154A\",\n\n OrderBook: \"0x4296e307f108B2f583FF2F7B7270ee7831574Ae5\",\n OrderBookReader: \"0xccFE3E576f8145403d3ce8f3c2f6519Dae40683B\",\n\n PositionRouter: \"0xffF6D276Bc37c61A23f06410Dce4A400f66420f8\",\n PositionManager: \"0xA21B83E579f4315951bA658654c371520BDcB866\",\n\n TraderJoeFxdxAvaxPool: \"0x0c91a070f862666bbcce281346be45766d874d98\",\n ReferralStorage: \"0x827ed045002ecdabeb6e2b0d1604cf5fc3d322f8\",\n ReferralReader: \"0x505Ce16D3017be7D76a7C2631C0590E71A975083\",\n },\n\n [MOONBEAM]: {\n // MoonBeam\n Vault: \"0xD3dDd179093C612d6f6abd48F65090DD008bA321\",\n Router: \"0xC824cAeA4Bcd3C054FeA78A58ba6D0A52f661792\",\n VaultReader: \"0x9BC6B9dB96327335480CC4D6F08A7E00a2384477\",\n Reader: \"0xB48fbc1F71B8E6C459736e59B80e27aFA3a0Ce3F\",\n FlpManager: \"0x6EEC778670d1b1c82b85271c3bFb4281A3DcCa8d\",\n RewardRouter: \"0x597bF61B3bC1AE3542c04b7070d24cE0735957c6\",\n RewardReader: \"0x268DE15eB064C01A0F837330510c755A5081E56c\",\n NATIVE_TOKEN: \"0x226bD09205A6Aa9374f77e746feB18971A2501a8\",\n FLP: \"0x779676333543249A741C1afB7f88e6aFB861427d\",\n FXDX: \"0x9a74dcaf28a9b7B9BB2Ec59F458EC77565A6A8b2\",\n ES_FXDX: \"0xf596B3c00695d61b4F79477aD522f0cD46F0db25\",\n BN_FXDX: \"0x576Aa7EE949600939DBB36781cAF1110CB67a7c7\",\n USDF: \"0xB36A70FE255f56739fE65C26Ae8Fd0edd0DF2E83\",\n ES_FXDX_IOU: \"0x6260101218eC4cCfFF1b778936C6f2400f95A954\", // placeholder address\n\n StakedFxdxTracker: \"0xe4a4b754Ead7245F19B82ba346285208fBC6146d\",\n BonusFxdxTracker: \"0x035564819A51B12De273E0C49517186Cba7f6C87\",\n FeeFxdxTracker: \"0xDaA78A48C99A23b1c4156F68A6678E97bfF0256F\",\n StakedFlpTracker: \"0xddb999B022816b774f5dE06B9f0Faf3b79cE2653\",\n FeeFlpTracker: \"0xA17eea14C82b42aa955d40a1438A31D693652fC7\",\n\n StakedFxdxDistributor: \"0xec0fcDE013059191EE2C164d3b1e4782C6aB4F60\",\n StakedFlpDistributor: \"0x9243e2f252952c4263dE06CDEaA8684DF014D16D\",\n\n FxdxVester: \"0xc3Ac168845c8DAbc8ad42B72F42Ebf48eAADf0F5\",\n FlpVester: \"0x9E87f4F8E6fad3334682Be65960c7ef112F93Aa0\",\n\n OrderBook: \"0x804e614b059Cc7fD8326d1B5C2ACc2A884BD3c0E\",\n OrderBookReader: \"0xbbf78fF7af9beB06D7B5D582dAfE83397D45d891\",\n\n PositionRouter: \"0xE939DfE46Eb7f18093BfbAe0dF8d34455893e0Ee\",\n PositionManager: \"0x6bD37eB049CbCc833AaB5172Ec2F0ce053FCa41c\",\n\n ReferralStorage: \"0x97B85d651fc31c877c23A954f851c99372178ad7\",\n ReferralReader: \"0xBA6eD2156C3e4791b43F98276BDA66B901A0659B\",\n },\n [MUMBAI]: {\n // Mumbai\n Vault: \"0xde6B3E71B3395f1B2B2393Cd2C68Daeb06E65eDb\",\n Router: \"0x7834F27dF278765883b420da25450134bF1bAE29\",\n VaultReader: \"0xb9E4267d575bc75eF2E88Ce1337b0F0610d7E573\",\n Reader: \"0x5c35eE0471613796453226b1a6056873c9b77925\",\n FlpManager: \"0xDB17144cCfA71F368A8cB6400B77644BD6797B63\",\n RewardRouter: \"0xe7001541E3cec70E8a43bDE5E3f9635B6BF44F13\",\n RewardReader: \"0xF02A64572D7fb4374Aa4C13c755A0Ebe1Ebb14BC\",\n NATIVE_TOKEN: \"0xd1132715bc3544b2eaF8Bc47CfbD131a0De0252d\",\n FLP: \"0x9582c7E27a3BBFe76B7B6bb4571F12848CA90627\",\n FXDX: \"0x859dCAa0cF4Ea034dab7Af0709149027C687423D\",\n ES_FXDX: \"0xcAE2e8009b8Dd299319F125c568ecb59Cd5F0e99\", \n BN_FXDX: \"0x576Aa7EE949600939DBB36781cAF1110CB67a7c7\",\n USDF: \"0xd6476EF3a78278609d4F07954C9554AF2C201Af4\",\n ES_FXDX_IOU: \"0x6260101218eC4cCfFF1b778936C6f2400f95A954\", // placeholder address\n\n StakedFxdxTracker: \"0xfdCA337eDc7c105aCc1352e911A55fD8461ea2bB\",\n BonusFxdxTracker: \"0x08655705d59508b51794934efc2910d93af53f7e\",\n FeeFxdxTracker: \"0xf6a8e0E9fA0a2217c8f9f6eEFE586D8513dA22c6\",\n StakedFlpTracker: \"0xE820154d74eE57e75be772b9bC3c36eE572c7091\",\n FeeFlpTracker: \"0xbe582b5D01E2E6C712449E72F89d331D25f8Ad0f\",\n\n\n StakedFxdxDistributor: \"0x24A2dfF93E7e145746E225d6D432a1F8E064940C\",\n StakedFlpDistributor: \"0xf4a0706FffCa0B6B83E4A831426Cf5cFA0c8DDAf\",\n\n FxdxVester: \"0xb1704090c322da5715C50b8bdeDb54C8BF35F0F3\",\n FlpVester: \"0x518eD25DA485737c6A8cAFEA0f8B4a1eBd16F4f0\",\n\n OrderBook: \"0xC81E5dD5fe8890D2B3981939bF49d6b4A23a3795\",\n OrderBookReader: \"0x8660764C715cF7566bEaEe0Af3F640a862a240d0\",\n\n PositionRouter: \"0x66CE70b0d8965d1F464524b51cFfa93D959fDA80\",\n PositionManager: \"0xb5109882e197e116324FDCaCec5e1C5C368a8e18\",\n\n ReferralStorage: \"0x49c1Dfb6Ff55BA13753D1BCe57C89B5243bcDe19\",\n ReferralReader: \"0x57baA3E350EB7330128cC39aC447743FC2DF4580\",\n },\n};\n\n\n\n// mumbai: {\n// admin: \"0xD5fba05dE4b2d303D03052e8aFbF31a767Bd908e\",\n// priceSender: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n// positionsKeeper: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n// orderKeeper: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n// liquidator: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n// mintReceiver: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n\n// // signers\n// signer1: \"0xD5fba05dE4b2d303D03052e8aFbF31a767Bd908e\",\n// signer2: \"0x56722AaD3ae80D056cAD0786B378bD1C45896dA2\",\n// signer3: \"0xc136B4cb683343f41aC38B730cF45367c2a1786b\",\n// signer4: \"0x78351284f83A52b726aeEe6C2ceBBe656124434c\",\n// signer5: \"0x9539Aa4a337b0030606D4Bc996074074FA1DCe2d\",\n// signer6: \"0x0aadC3f3a906E392B78B42798Be40B8CFBE97451\",\n// signer7: \"0x8B9f8C1454Ca00E8c9e23dbb0D79680b86a33C3B\",// fake\n// signer8: \"0x074A430A18C4414aa88080f6daA25bCe6AA66B23\",// fake\n// signer9: \"0x70193F4E9Df8CFb79ebC47075fd4C3B2fA466ecE\",// fake\n\n// vault: \"0xde6B3E71B3395f1B2B2393Cd2C68Daeb06E65eDb\",\n// usdf: \"0xd6476EF3a78278609d4F07954C9554AF2C201Af4\",\n// router: \"0x7834F27dF278765883b420da25450134bF1bAE29\",\n// vaultPriceFeed: \"0x87f1d77684C0f883906356468D8fAC516A79973A\",\n// flp: \"0x9582c7E27a3BBFe76B7B6bb4571F12848CA90627\",\n// flpManager: \"0xDB17144cCfA71F368A8cB6400B77644BD6797B63\",\n// vaultErrorController: \"0x10a1bdCea61b1613E53C661292F235Eb536Bc848\",\n// vaultUtils: \"0x99474B01085c1fFdc65f34688F7b95A808621136\",\n// orderBook: \"0xC81E5dD5fe8890D2B3981939bF49d6b4A23a3795\",\n// tokenManager: \"0x66A9b2Cc764B0c5F55D5876F1C6425b6912dAFBf\",\n// fxdx: \"0x859dCAa0cF4Ea034dab7Af0709149027C687423D\",\n// esFxdx: \"0xcAE2e8009b8Dd299319F125c568ecb59Cd5F0e99\",\n// positionManager: \"0xb5109882e197e116324FDCaCec5e1C5C368a8e18\",\n// positionRouter: \"0x66CE70b0d8965d1F464524b51cFfa93D959fDA80\",\n// referralReader: \"0x57baA3E350EB7330128cC39aC447743FC2DF4580\",\n// referralStorage: \"0x49c1Dfb6Ff55BA13753D1BCe57C89B5243bcDe19\",\n// balanceUpdater: \"0x33E1B30417B1e13842cAf9CA13e8C29A41C47129\",\n// batchSender: \"0xE519faCeaef5645adD954e1Ca6679dfDdbC4B5b6\",\n// orderBookReader: \"0x8660764C715cF7566bEaEe0Af3F640a862a240d0\",\n// reader: \"0x5c35eE0471613796453226b1a6056873c9b77925\",\n// rewardReader: \"0xF02A64572D7fb4374Aa4C13c755A0Ebe1Ebb14BC\",\n// vaultReader: \"0xb9E4267d575bc75eF2E88Ce1337b0F0610d7E573\",\n// bnFxdx: \"0x08655705d59508b51794934efc2910d93af53f7e\",\n// stakedFxdxTracker: \"0xfdCA337eDc7c105aCc1352e911A55fD8461ea2bB\",\n// stakedFxdxDistributor: \"0x24A2dfF93E7e145746E225d6D432a1F8E064940C\",\n// bonusFxdxTracker: \"0x09273c656Ccae7200ff3B8C709B9611A98a70F11\",\n// bonusFxdxDistributor: \"0xD429F49E49693A3Aa2D2d3134F5a11c19196fbeD\",\n// feeFxdxTracker: \"0xf6a8e0E9fA0a2217c8f9f6eEFE586D8513dA22c6\",\n// feeFxdxDistributor: \"0x9627338cF008eA606271F5e49584297D485294E8\",\n// feeFlpTracker: \"0xbe582b5D01E2E6C712449E72F89d331D25f8Ad0f\",\n// feeFlpDistributor: \"0x4146EF303c8cc29FfC3Eb42d90A4F39b24814c44\",\n// stakedFlpTracker: \"0xE820154d74eE57e75be772b9bC3c36eE572c7091\",\n// stakedFlpDistributor: \"0xf4a0706FffCa0B6B83E4A831426Cf5cFA0c8DDAf\",\n// fxdxVester: \"0xb1704090c322da5715C50b8bdeDb54C8BF35F0F3\",\n// flpVester: \"0x518eD25DA485737c6A8cAFEA0f8B4a1eBd16F4f0\",\n// rewardRouterV2: \"0xe7001541E3cec70E8a43bDE5E3f9635B6BF44F13\",\n// stakeManager: \"0x1A1B1aCe13e37055c90e10702068919097CEc73A\",\n// timelock: \"0x31B7C1aF4D163a1E18Ef03803C82BE574d95C3Ad\",\n// fastPriceEvents: \"0x644Af161B683D62011C187Fa8B32729b02cD807e\",\n// fastPriceFeed: \"0x3E5baC47075b433FaD727c02C17cE632AF1607DA\",\n// priceFeedTimelock: \"0xAfa3B3309c89aB10d50A749f58f218009fFb9a94\",\n// stakedFlp: \"0xc56064DED280532f9eB56335D22e8653711ED8F3\",\n// flpBalance: \"0xb6851FfBb0851727039D885547bf2e192B16c499\"\n// },\nexport function getContract(chainId: number, name: string): string {\n if (!CONTRACTS[chainId]) {\n throw new Error(`Unknown chainId ${chainId}`);\n }\n\n if (!CONTRACTS[chainId][name]) {\n throw new Error(`Unknown contract \"${name}\" for chainId ${chainId}`);\n }\n\n return CONTRACTS[chainId][name];\n}\n","import { ARBITRUM, ARBITRUM_TESTNET, AVALANCHE, GOERLI, IS_TESTNET, MAINNET, MOONBEAM, MUMBAI } from \"./chains\";\n\nexport const FXDX_STATS_API_URL = IS_TESTNET\n ? \"https://test.stats.fxdx.exchange/api\"\n : \"https://data.fxdx.exchange/api\";\n\nconst BACKEND_URLS = {\n default: \"https://fxdx-server-mainnet.uw.r.appspot.com\",\n\n [MUMBAI]: \"https://fxdx-mumbai-pricesender.onrender.com\",\n [MAINNET]: \"https://api.ethereum.fxdx.exchange\",\n [ARBITRUM_TESTNET]: \"https://gambit-server-devnet.uc.r.appspot.com\",\n [ARBITRUM]: \"https://fxdx-server-mainnet.uw.r.appspot.com\",\n [AVALANCHE]: \"https://fxdx-avax-server.uc.r.appspot.com\",\n [MOONBEAM]: \"https://api.moonbeam.fxdx.exchange\",\n // [GOERLI]: \"https://fxdx-goerli-pricesender.onrender.com\",\n [GOERLI]: \"https://fxdx-backend-api-mumbai.up.railway.app\",\n};\n\nexport function getServerBaseUrl(chainId: number) {\n if (!chainId) {\n throw new Error(\"chainId is not provided\");\n }\n\n if (document.location.hostname.includes(\"deploy-preview\")) {\n const fromLocalStorage = localStorage.getItem(\"SERVER_BASE_URL\");\n if (fromLocalStorage) {\n return fromLocalStorage;\n }\n }\n\n return BACKEND_URLS[chainId] || BACKEND_URLS.default;\n}\n\nexport function getServerUrl(chainId: number, path: string) {\n return `${getServerBaseUrl(chainId)}${path}`;\n}\n","import { ethers } from \"ethers\";\nimport { getContract } from \"./contracts\";\nimport { ARBITRUM, ARBITRUM_TESTNET, AVALANCHE, GOERLI, MOONBEAM, MUMBAI } from \"./chains\";\nimport { Token } from \"domain/tokens\";\n\nexport const TOKENS: { [chainId: number]: Token[] } = {\n // mumbai: {\n // // https://docs.chain.link/docs/data-feeds/price-feeds/addresses/\n // btcPriceFeed: { address: \"0x007A22900a3B98143368Bd5906f8E17e9867581b\" },\n // ethPriceFeed: { address: \"0x0715A7794a1dc8e42615F059dD6e406A6594651A\" },\n // usdtPriceFeed: { address: \"0x92C09849638959196E976289418e5973CC96d645\" },\n // usdcPriceFeed: { address: \"0x572dDec9087154dC5dfBB1546Bb62713147e0Ab0\" },\n // btc: {\n // name: \"btc\",\n // address: \"0x998b028aB8F31De182Ed5Bd5477B0EaE4aB53071\",\n // decimals: 18,\n // priceFeed: \"0x007A22900a3B98143368Bd5906f8E17e9867581b\",\n // priceDecimals: 8,\n // fastPricePrecision: 1000,\n // maxCumulativeDeltaDiff: 10 * 1000 * 1000,\n // isStrictStable: false,\n // tokenWeight: 27000,\n // minProfitBps: 0,\n // maxUsdfAmount: 50 * 1000 *1000,\n // bufferAmount: 450,\n // isStable: false,\n // isShortable: true,\n // maxGlobalShortSize: 30 * 1000 * 1000,\n // },\n // eth: {\n // name: \"eth\",\n // address: \"0xd1132715bc3544b2eaF8Bc47CfbD131a0De0252d\",\n // decimals: 18,\n // priceFeed: \"0x0715A7794a1dc8e42615F059dD6e406A6594651A\",\n // priceDecimals: 8,\n // fastPricePrecision: 1000,\n // maxCumulativeDeltaDiff: 10 * 1000 * 1000,\n // isStrictStable: false,\n // tokenWeight: 28000,\n // minProfitBps: 0,\n // maxUsdfAmount: 120 * 1000 * 1000,\n // bufferAmount: 15000,\n // isStable: false,\n // isShortable: true,\n // maxGlobalShortSize: 30 * 1000 * 1000,\n // },\n // usdc: {\n // name: \"usdc\",\n // address: \"0x42aB99371614e066cB2794cb950ba575c327CcB1\",\n // decimals: 18,\n // priceFeed: \"0x572dDec9087154dC5dfBB1546Bb62713147e0Ab0\",\n // priceDecimals: 8,\n // isStrictStable: true,\n // tokenWeight: 32000,\n // minProfitBps: 0,\n // maxUsdfAmount: 120 * 1000 * 1000,\n // bufferAmount: 60 * 1000 * 1000,\n // isStable: true,\n // isShortable: false\n // },\n // usdt: {\n // name: \"usdt\",\n // address: \"0x55916eC218B88947a4dC5372f060792B0fa0881C\",\n // decimals: 18,\n // priceFeed: \"0x92C09849638959196E976289418e5973CC96d645\",\n // priceDecimals: 8,\n // isStrictStable: true,\n // tokenWeight: 3000,\n // minProfitBps: 0,\n // maxUsdfAmount: 10 * 1000 * 1000,\n // bufferAmount: 4 * 1000 * 1000,\n // isStable: true,\n // isShortable: false\n // },\n // nativeToken: {\n // name: \"weth\",\n // address: \"0xd1132715bc3544b2eaF8Bc47CfbD131a0De0252d\",\n // decimals: 18\n // }\n // },\n [MUMBAI]: [\n {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n address: ethers.constants.AddressZero,\n isNative: true,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880\",\n },\n {\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n decimals: 18,\n address: \"0xd1132715bc3544b2eaF8Bc47CfbD131a0De0252d\",\n isWrapped: true,\n baseSymbol: \"ETH\",\n imageUrl: \"https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1628852295\",\n },\n {\n name: \"Bitcoin\",\n symbol: \"BTC\",\n decimals: 18,\n address: \"0x998b028aB8F31De182Ed5Bd5477B0EaE4aB53071\",\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744\",\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 18,\n address: \"0x42aB99371614e066cB2794cb950ba575c327CcB1\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"Tether\",\n symbol: \"USDT\",\n decimals: 18,\n address: \"0x55916eC218B88947a4dC5372f060792B0fa0881C\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/325/thumb/Tether-logo.png?1598003707\",\n },\n ],\n [GOERLI]: [\n {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n address: ethers.constants.AddressZero,\n isNative: true,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880\",\n },\n {\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n decimals: 18,\n address: \"0xc47564a1303Ab4D8706fd70678Bf71A627605D50\",\n isWrapped: true,\n baseSymbol: \"ETH\",\n imageUrl: \"https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1628852295\",\n },\n {\n name: \"Bitcoin\",\n symbol: \"BTC\",\n decimals: 18,\n address: \"0x889328FC12EDBb9faccE23791F036005bE633e04\",\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744\",\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 18,\n address: \"0x290733C49DA29892b23f16d2c33B9694bB9d7d80\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"Tether\",\n symbol: \"USDT\",\n decimals: 18,\n address: \"0xD9a40366F9432B5ed484CF009d9793E633b54E10\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/325/thumb/Tether-logo.png?1598003707\",\n },\n ],\n [ARBITRUM_TESTNET]: [\n {\n name: \"Bitcoin\",\n symbol: \"BTC\",\n decimals: 8,\n address: \"0x27960f9A322BE96A1535E6c19B3958e80E6a2670\",\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744\",\n },\n {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n address: ethers.constants.AddressZero,\n isNative: true,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880\",\n },\n // https://github.com/OffchainLabs/arbitrum/blob/950c2f91b2e951cd3764394e0a73eac3797aecf3/packages/arb-ts/src/lib/networks.ts#L65\n {\n name: \"Wrapped Ethereum\",\n symbol: \"WETH\",\n decimals: 18,\n address: \"0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681\",\n isWrapped: true,\n baseSymbol: \"ETH\",\n imageUrl: \"https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1628852295\",\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 6,\n address: \"0xf0DCd4737A20ED33481A49De94C599944a3Ca737\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"Tether\",\n symbol: \"USDT\",\n decimals: 6,\n address: \"0x818ED84bA1927945b631016e0d402Db50cE8865f\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/325/small/Tether-logo.png\",\n },\n ],\n [ARBITRUM]: [\n {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n address: ethers.constants.AddressZero,\n isNative: true,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880\",\n },\n {\n name: \"Wrapped Ethereum\",\n symbol: \"WETH\",\n decimals: 18,\n address: \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\",\n isWrapped: true,\n baseSymbol: \"ETH\",\n imageUrl: \"https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1628852295\",\n },\n {\n name: \"Bitcoin (WBTC)\",\n symbol: \"BTC\",\n decimals: 8,\n address: \"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\",\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744\",\n },\n {\n name: \"Chainlink\",\n symbol: \"LINK\",\n decimals: 18,\n address: \"0xf97f4df75117a78c1A5a0DBb814Af92458539FB4\",\n isStable: false,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/877/thumb/chainlink-new-logo.png?1547034700\",\n },\n {\n name: \"Uniswap\",\n symbol: \"UNI\",\n decimals: 18,\n address: \"0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0\",\n isStable: false,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/12504/thumb/uniswap-uni.png?1600306604\",\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 6,\n address: \"0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"Tether\",\n symbol: \"USDT\",\n decimals: 6,\n address: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/325/thumb/Tether-logo.png?1598003707\",\n },\n {\n name: \"Dai\",\n symbol: \"DAI\",\n decimals: 18,\n address: \"0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/9956/thumb/4943.png?1636636734\",\n },\n {\n name: \"Frax\",\n symbol: \"FRAX\",\n decimals: 18,\n address: \"0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/13422/small/frax_logo.png?1608476506\",\n },\n {\n name: \"Magic Internet Money\",\n symbol: \"MIM\",\n decimals: 18,\n address: \"0xFEa7a6a0B346362BF88A9e4A88416B77a57D6c2A\",\n isStable: true,\n isTempHidden: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/16786/small/mimlogopng.png\",\n },\n ],\n [AVALANCHE]: [\n {\n name: \"Avalanche\",\n symbol: \"AVAX\",\n decimals: 18,\n address: ethers.constants.AddressZero,\n isNative: true,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/12559/small/coin-round-red.png?1604021818\",\n },\n {\n name: \"Wrapped AVAX\",\n symbol: \"WAVAX\",\n decimals: 18,\n address: \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\",\n isWrapped: true,\n baseSymbol: \"AVAX\",\n imageUrl: \"https://assets.coingecko.com/coins/images/12559/small/coin-round-red.png?1604021818\",\n },\n {\n name: \"Ethereum (WETH.e)\",\n symbol: \"ETH\",\n address: \"0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB\",\n decimals: 18,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880\",\n },\n {\n name: \"Bitcoin (BTC.b)\",\n symbol: \"BTC\",\n address: \"0x152b9d0FdC40C096757F570A51E494bd4b943E50\",\n decimals: 8,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/26115/thumb/btcb.png?1655921693\",\n },\n {\n name: \"Bitcoin (WBTC.e)\",\n symbol: \"WBTC\",\n address: \"0x50b7545627a5162F82A992c33b87aDc75187B218\",\n decimals: 8,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744\",\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n decimals: 6,\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"USD Coin (USDC.e)\",\n symbol: \"USDC.e\",\n address: \"0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664\",\n decimals: 6,\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"Magic Internet Money\",\n symbol: \"MIM\",\n address: \"0x130966628846BFd36ff31a822705796e8cb8C18D\",\n decimals: 18,\n isStable: true,\n isTempHidden: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/16786/small/mimlogopng.png\",\n },\n ],\n [MOONBEAM]: [\n {\n name: \"Glimmer\",\n symbol: \"GLMR\",\n decimals: 18,\n address: ethers.constants.AddressZero,\n isNative: true,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/22459/small/glmr.png?1641880985\",\n },\n {\n name: \"Wrapped Glimmer\",\n symbol: \"WGLMR\",\n decimals: 18,\n address: \"0x226bD09205A6Aa9374f77e746feB18971A2501a8\",\n isWrapped: true,\n baseSymbol: \"GLMR\",\n imageUrl: \"https://assets.coingecko.com/coins/images/22459/small/glmr.png?1641880985\",\n },\n {\n name: \"Ethereum (Multichain)\",\n symbol: \"ETH\",\n address: \"0xfa9343c3897324496a05fc75abed6bac29f8a40f\",\n decimals: 18,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880\",\n },\n {\n name: \"Wrapped Ether (Wormhole)\",\n symbol: \"WETH\",\n address: \"0xab3f0245b83feb11d15aaffefd7ad465a59817ed\",\n decimals: 18,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880\",\n },\n {\n name: \"Wrapped BTC (Multichain)\",\n symbol: \"WBTC(M)\",\n address: \"0x922d641a426dcffaef11680e5358f34d97d112e1\",\n decimals: 8,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/26115/thumb/btcb.png?1655921693\",\n },\n {\n name: \"Wrapped BTC (Wormhole)\",\n symbol: \"WBTC(W)\",\n address: \"0xe57ebd2d67b462e9926e04a8e33f01cd0d64346d\",\n decimals: 8,\n isShortable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744\",\n },\n {\n name: \"Tether USD\",\n symbol: \"USDT\",\n address: \"0xefaeee334f0fd1712f9a8cc375f427d9cdd40d73\",\n decimals: 6,\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"USD Coin (Mutlichain)\",\n symbol: \"USDC(M)\",\n address: \"0x818ec0a7fe18ff94269904fced6ae3dae6d6dc0b\",\n decimals: 6,\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"USD Coin (Wormhole)\",\n symbol: \"USDC(W)\",\n address: \"0x931715FEE2d06333043d11F658C8CE934aC61D0c\",\n decimals: 6,\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"Binance-Peg BUSD Token\",\n symbol: \"BUSD\",\n address: \"0xa649325aa7c5093d12d6f98eb4378deae68ce23f\",\n decimals: 18,\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389\",\n },\n {\n name: \"Dai Stablecoin\",\n symbol: \"DAI\",\n decimals: 18,\n address: \"0x765277EebeCA2e31912C9946eAe1021199B39C61\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/9956/thumb/4943.png?1636636734\",\n },\n {\n name: \"Frax\",\n symbol: \"FRAX\",\n decimals: 18,\n address: \"0x322e86852e492a7ee17f28a78c663da38fb33bfb\",\n isStable: true,\n imageUrl: \"https://assets.coingecko.com/coins/images/13422/small/frax_logo.png?1608476506\",\n },\n ]\n};\n\nexport const ADDITIONAL_TOKENS: { [chainId: number]: Token[] } = {\n [GOERLI]: [\n {\n name: \"FXDX\",\n symbol: \"FXDX\",\n address: getContract(GOERLI, \"FXDX\"),\n decimals: 18,\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n {\n name: \"Escrowed FXDX\",\n symbol: \"esFXDX\",\n address: getContract(GOERLI, \"ES_FXDX\"),\n decimals: 18,\n },\n {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n address: getContract(GOERLI, \"FLP\"),\n decimals: 18,\n imageUrl: \"https://github.com/gmx-io/gmx-assets/blob/main/GMX-Assets/PNG/GLP_LOGO%20ONLY.png?raw=true\",\n },\n ],\n [ARBITRUM]: [\n {\n name: \"FXDX\",\n symbol: \"FXDX\",\n address: getContract(ARBITRUM, \"FXDX\"),\n decimals: 18,\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n {\n name: \"Escrowed FXDX\",\n symbol: \"esFXDX\",\n address: getContract(ARBITRUM, \"ES_FXDX\"),\n decimals: 18,\n },\n {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n address: getContract(ARBITRUM, \"FLP\"),\n decimals: 18,\n imageUrl: \"https://github.com/fxdx-io/fxdx-assets/blob/main/FXDX-Assets/PNG/FLP_LOGO%20ONLY.png?raw=true\",\n },\n ],\n [AVALANCHE]: [\n {\n name: \"FXDX\",\n symbol: \"FXDX\",\n address: getContract(AVALANCHE, \"FXDX\"),\n decimals: 18,\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n {\n name: \"Escrowed FXDX\",\n symbol: \"esFXDX\",\n address: getContract(AVALANCHE, \"ES_FXDX\"),\n decimals: 18,\n },\n {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n address: getContract(ARBITRUM, \"FLP\"),\n decimals: 18,\n imageUrl: \"https://github.com/fxdx-io/fxdx-assets/blob/main/FXDX-Assets/PNG/FLP_LOGO%20ONLY.png?raw=true\",\n },\n ],\n [MOONBEAM]: [\n {\n name: \"FXDX\",\n symbol: \"FXDX\",\n address: getContract(MOONBEAM, \"FXDX\"),\n decimals: 18,\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n {\n name: \"Escrowed FXDX\",\n symbol: \"esFXDX\",\n address: getContract(MOONBEAM, \"ES_FXDX\"),\n decimals: 18,\n },\n {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n address: getContract(MOONBEAM, \"FLP\"),\n decimals: 18,\n imageUrl: \"https://github.com/fxdx-io/fxdx-assets/blob/main/FXDX-Assets/PNG/FLP_LOGO%20ONLY.png?raw=true\",\n },\n ],\n};\n\nexport const PLATFORM_TOKENS: { [chainId: number]: { [symbol: string]: Token } } = {\n [GOERLI]: {\n // arbitrum\n FXDX: {\n name: \"FXDX\",\n symbol: \"FXDX\",\n decimals: 18,\n address: getContract(GOERLI, \"FXDX\"),\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n FLP: {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n decimals: 18,\n address: getContract(GOERLI, \"StakedFlpTracker\"), // address of fsFLP token because user only holds fsFLP\n imageUrl: \"https://github.com/gmx-io/gmx-assets/blob/main/GMX-Assets/PNG/GLP_LOGO%20ONLY.png?raw=true\",\n },\n },\n [ARBITRUM]: {\n // arbitrum\n FXDX: {\n name: \"FXDX\",\n symbol: \"FXDX\",\n decimals: 18,\n address: getContract(ARBITRUM, \"FXDX\"),\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n FLP: {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n decimals: 18,\n address: getContract(ARBITRUM, \"StakedFlpTracker\"), // address of fsFLP token because user only holds fsFLP\n imageUrl: \"https://github.com/fxdx-io/fxdx-assets/blob/main/FXDX-Assets/PNG/FLP_LOGO%20ONLY.png?raw=true\",\n },\n },\n [AVALANCHE]: {\n // avalanche\n FXDX: {\n name: \"FXDX\",\n symbol: \"FXDX\",\n decimals: 18,\n address: getContract(AVALANCHE, \"FXDX\"),\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n FLP: {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n decimals: 18,\n address: getContract(AVALANCHE, \"StakedFlpTracker\"), // address of fsFLP token because user only holds fsFLP\n imageUrl: \"https://github.com/fxdx-io/fxdx-assets/blob/main/FXDX-Assets/PNG/FLP_LOGO%20ONLY.png?raw=true\",\n },\n },\n [MOONBEAM]: {\n // moonbeam\n FXDX: {\n name: \"FXDX\",\n symbol: \"FXDX\",\n decimals: 18,\n address: getContract(MOONBEAM, \"FXDX\"),\n imageUrl: \"https://assets.coingecko.com/coins/images/18323/small/arbit.png?1631532468\",\n },\n FLP: {\n name: \"FXDX LP\",\n symbol: \"FLP\",\n decimals: 18,\n address: getContract(MOONBEAM, \"StakedFlpTracker\"), // address of fsFLP token because user only holds fsFLP\n imageUrl: \"https://github.com/fxdx-io/fxdx-assets/blob/main/FXDX-Assets/PNG/FLP_LOGO%20ONLY.png?raw=true\",\n },\n },\n};\n\nexport const ICONLINKS = {\n [GOERLI]: {\n FXDX: {\n coingecko: \"https://www.coingecko.com/en/coins/gmx\",\n ethereum: \"https://goerli.etherscan.io/address/0x5FAb4cE46Ef52805178263D1c81aeA83685130D6\",\n },\n FLP: {\n ethereum: \"https://goerli.etherscan.io/token/0x433Ad5632b8c695ea09d2FB6D345cF579B1168fF\",\n },\n ETH: {\n coingecko: \"https://www.coingecko.com/en/coins/ethereum\",\n },\n BTC: {\n coingecko: \"https://www.coingecko.com/en/coins/wrapped-bitcoin\",\n ethereum: \"https://goerli.etherscan.io/address/0x3FB1f5F1297895f4680Adc1F55CC48e95183C55d\",\n },\n USDC: {\n coingecko: \"https://www.coingecko.com/en/coins/usd-coin\",\n ethereum: \"https://goerli.etherscan.io/address/0x1788509e1Bd6cd9b797B10E344A43d7Aea668Fc5\",\n },\n USDT: {\n coingecko: \"https://www.coingecko.com/en/coins/tether\",\n ethereum: \"https://goerli.etherscan.io/address/0x3491d4649aeBC9f46370DFF87c9887f557fb5954\",\n },\n },\n [MUMBAI]: {\n FXDX: {\n coingecko: \"https://www.coingecko.com/en/coins/gmx\",\n ethereum: \"https://mumbai.polygonscan.com/address/0x859dCAa0cF4Ea034dab7Af0709149027C687423D\",\n },\n FLP: {\n ethereum: \"https://mumbai.polygonscan.com/address/0x9582c7E27a3BBFe76B7B6bb4571F12848CA90627\",\n },\n ETH: {\n coingecko: \"https://www.coingecko.com/en/coins/ethereum\",\n },\n BTC: {\n coingecko: \"https://www.coingecko.com/en/coins/wrapped-bitcoin\",\n ethereum: \"https://mumbai.polygonscan.com/address/0x998b028aB8F31De182Ed5Bd5477B0EaE4aB53071\",\n },\n USDC: {\n coingecko: \"https://www.coingecko.com/en/coins/usd-coin\",\n ethereum: \"https://mumbai.polygonscan.com/address/0x42aB99371614e066cB2794cb950ba575c327CcB1\",\n },\n USDT: {\n coingecko: \"https://www.coingecko.com/en/coins/tether\",\n ethereum: \"https://mumbai.polygonscan.com/address/0x55916eC218B88947a4dC5372f060792B0fa0881C\",\n },\n },\n [ARBITRUM_TESTNET]: {\n FXDX: {\n coingecko: \"https://www.coingecko.com/en/coins/fxdx\",\n arbitrum: \"https://arbiscan.io/address/0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a\",\n },\n FLP: {\n arbitrum: \"https://testnet.arbiscan.io/token/0xb4f81Fa74e06b5f762A104e47276BA9b2929cb27\",\n },\n },\n [ARBITRUM]: {\n FXDX: {\n coingecko: \"https://www.coingecko.com/en/coins/fxdx\",\n arbitrum: \"https://arbiscan.io/address/0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a\",\n },\n FLP: {\n arbitrum: \"https://arbiscan.io/token/0x1aDDD80E6039594eE970E5872D247bf0414C8903\",\n },\n ETH: {\n coingecko: \"https://www.coingecko.com/en/coins/ethereum\",\n },\n BTC: {\n coingecko: \"https://www.coingecko.com/en/coins/wrapped-bitcoin\",\n arbitrum: \"https://arbiscan.io/address/0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f\",\n },\n LINK: {\n coingecko: \"https://www.coingecko.com/en/coins/chainlink\",\n arbitrum: \"https://arbiscan.io/address/0xf97f4df75117a78c1a5a0dbb814af92458539fb4\",\n },\n UNI: {\n coingecko: \"https://www.coingecko.com/en/coins/uniswap\",\n arbitrum: \"https://arbiscan.io/address/0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0\",\n },\n USDC: {\n coingecko: \"https://www.coingecko.com/en/coins/usd-coin\",\n arbitrum: \"https://arbiscan.io/address/0xff970a61a04b1ca14834a43f5de4533ebddb5cc8\",\n },\n USDT: {\n coingecko: \"https://www.coingecko.com/en/coins/tether\",\n arbitrum: \"https://arbiscan.io/address/0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9\",\n },\n DAI: {\n coingecko: \"https://www.coingecko.com/en/coins/dai\",\n arbitrum: \"https://arbiscan.io/address/0xda10009cbd5d07dd0cecc66161fc93d7c9000da1\",\n },\n MIM: {\n coingecko: \"https://www.coingecko.com/en/coins/magic-internet-money\",\n arbitrum: \"https://arbiscan.io/address/0xfea7a6a0b346362bf88a9e4a88416b77a57d6c2a\",\n },\n FRAX: {\n coingecko: \"https://www.coingecko.com/en/coins/frax\",\n arbitrum: \"https://arbiscan.io/address/0x17fc002b466eec40dae837fc4be5c67993ddbd6f\",\n },\n },\n [AVALANCHE]: {\n FXDX: {\n coingecko: \"https://www.coingecko.com/en/coins/fxdx\",\n avalanche: \"https://snowtrace.io/address/0x62edc0692bd897d2295872a9ffcac5425011c661\",\n },\n FLP: {\n avalanche: \"https://snowtrace.io/address/0x9e295B5B976a184B14aD8cd72413aD846C299660\",\n },\n AVAX: {\n coingecko: \"https://www.coingecko.com/en/coins/avalanche\",\n },\n ETH: {\n coingecko: \"https://www.coingecko.com/en/coins/weth\",\n avalanche: \"https://snowtrace.io/address/0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab\",\n },\n WBTC: {\n coingecko: \"https://www.coingecko.com/en/coins/wrapped-bitcoin\",\n avalanche: \"https://snowtrace.io/address/0x50b7545627a5162f82a992c33b87adc75187b218\",\n },\n BTC: {\n coingecko: \"https://www.coingecko.com/en/coins/bitcoin-avalanche-bridged-btc-b\",\n avalanche: \"https://snowtrace.io/address/0x152b9d0FdC40C096757F570A51E494bd4b943E50\",\n },\n MIM: {\n coingecko: \"https://www.coingecko.com/en/coins/magic-internet-money\",\n avalanche: \"https://snowtrace.io/address/0x130966628846bfd36ff31a822705796e8cb8c18d\",\n },\n USDC: {\n coingecko: \"https://www.coingecko.com/en/coins/usd-coin\",\n avalanche: \"https://snowtrace.io/address/0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e\",\n },\n \"USDC.e\": {\n coingecko: \"https://www.coingecko.com/en/coins/usd-coin-avalanche-bridged-usdc-e\",\n avalanche: \"https://snowtrace.io/address/0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664\",\n },\n },\n [MOONBEAM]: {\n FXDX: {\n coingecko: \"https://www.coingecko.com/en/coins/fxdx\",\n moonbeam: \"https://moonscan.io/address/0x9a74dcaf28a9b7B9BB2Ec59F458EC77565A6A8b2\",\n },\n FLP: {\n moonbeam: \"https://moonscan.io/token/0x779676333543249A741C1afB7f88e6aFB861427d\",\n },\n GLMR: {\n coingecko: \"https://www.coingecko.com/en/coins/moonbeam\",\n },\n ETH: {\n coingecko: \"https://www.coingecko.com/en/coins/ethereum\",\n moonbeam: \"https://moonscan.io/address/0xfa9343c3897324496a05fc75abed6bac29f8a40f\",\n },\n WETH: {\n coingecko: \"https://www.coingecko.com/en/coins/ethereum\",\n moonbeam: \"https://moonscan.io/address/0xab3f0245b83feb11d15aaffefd7ad465a59817ed\",\n },\n \"WBTC(M)\": {\n coingecko: \"https://www.coingecko.com/en/coins/wrapped-bitcoin\",\n moonbeam: \"https://moonscan.io/address/0x922D641a426DcFFaeF11680e5358F34d97d112E1\",\n },\n \"WBTC(W)\": {\n coingecko: \"https://www.coingecko.com/en/coins/wrapped-bitcoin\",\n moonbeam: \"https://moonscan.io/address/0xE57eBd2d67B462E9926e04a8e33f01cD0D64346D\",\n },\n USDT: {\n coingecko: \"https://www.coingecko.com/en/coins/tether\",\n moonbeam: \"https://moonscan.io/address/0xeFAeeE334F0Fd1712f9a8cc375f427D9Cdd40d73\",\n },\n \"USDC(M)\": {\n coingecko: \"https://www.coingecko.com/en/coins/usd-coin\",\n moonbeam: \"https://moonscan.io/address/0x818ec0A7Fe18Ff94269904fCED6AE3DaE6d6dC0b\",\n },\n \"USDC(W)\": {\n coingecko: \"https://www.coingecko.com/en/coins/usd-coin\",\n moonbeam: \"https://moonscan.io/address/0x931715FEE2d06333043d11F658C8CE934aC61D0c\",\n },\n BUSD: {\n coingecko: \"https://www.coingecko.com/en/coins/binance-usd\",\n moonbeam: \"https://moonscan.io/address/0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F\",\n },\n DAI: {\n coingecko: \"https://www.coingecko.com/en/coins/dai\",\n moonbeam: \"https://moonscan.io/address/0x765277EebeCA2e31912C9946eAe1021199B39C61\",\n },\n FRAX: {\n coingecko: \"https://www.coingecko.com/en/coins/frax\",\n moonbeam: \"https://moonscan.io/address/0x322E86852e492a7Ee17f28a78c663da38FB33bfb\",\n },\n },\n};\n\nexport const FLP_POOL_COLORS = {\n GLMR: \"#E84142\",\n ETH: \"#6062a6\",\n WETH: \"#E9167C\",\n BTC: \"#F7931A\",\n \"WBTC(M)\": \"#F7931A\",\n WBTC: \"#F7931A\",\n \"WBTC(W)\": \"#F7931A\",\n USDC: \"#2775CA\",\n \"USDC.e\": \"#2A5ADA\",\n \"USDC(M)\": \"#2775CA\",\n \"USDC(W)\": \"#2A5ADA\",\n USDT: \"#67B18A\",\n MIM: \"#9695F8\",\n BUSD: \"#9695F8\",\n FRAX: \"#000\",\n DAI: \"#FAC044\",\n UNI: \"#E9167C\",\n AVAX: \"#E84142\",\n LINK: \"#3256D6\",\n};\n\nexport const TOKENS_MAP: { [chainId: number]: { [address: string]: Token } } = {};\nexport const TOKENS_BY_SYMBOL_MAP: { [chainId: number]: { [symbol: string]: Token } } = {};\nexport const WRAPPED_TOKENS_MAP: { [chainId: number]: Token } = {};\nexport const NATIVE_TOKENS_MAP: { [chainId: number]: Token } = {};\n\nconst CHAIN_IDS = [GOERLI, ARBITRUM, ARBITRUM_TESTNET, AVALANCHE, MOONBEAM, MUMBAI];\n\nfor (let j = 0; j < CHAIN_IDS.length; j++) {\n const chainId = CHAIN_IDS[j];\n TOKENS_MAP[chainId] = {};\n TOKENS_BY_SYMBOL_MAP[chainId] = {};\n let tokens = TOKENS[chainId];\n if (ADDITIONAL_TOKENS[chainId]) {\n tokens = tokens.concat(ADDITIONAL_TOKENS[chainId]);\n }\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n TOKENS_MAP[chainId][token.address] = token;\n TOKENS_BY_SYMBOL_MAP[chainId][token.symbol] = token;\n }\n}\n\nfor (const chainId of CHAIN_IDS) {\n for (const token of TOKENS[chainId]) {\n if (token.isWrapped) {\n WRAPPED_TOKENS_MAP[chainId] = token;\n } else if (token.isNative) {\n NATIVE_TOKENS_MAP[chainId] = token;\n }\n }\n}\n\nexport function getWrappedToken(chainId: number) {\n return WRAPPED_TOKENS_MAP[chainId];\n}\n\nexport function getNativeToken(chainId: number) {\n return NATIVE_TOKENS_MAP[chainId];\n}\n\nexport function getTokens(chainId: number) {\n return TOKENS[chainId];\n}\n\nexport function isValidToken(chainId: number, address: string) {\n if (!TOKENS_MAP[chainId]) {\n throw new Error(`Incorrect chainId ${chainId}`);\n }\n return address in TOKENS_MAP[chainId];\n}\n\nexport function getToken(chainId: number, address: string) {\n if (!TOKENS_MAP[chainId]) {\n throw new Error(`Incorrect chainId ${chainId}`);\n }\n if (!TOKENS_MAP[chainId][address]) {\n throw new Error(`Incorrect address \"${address}\" for chainId ${chainId}`);\n }\n return TOKENS_MAP[chainId][address];\n}\n\nexport function getTokenBySymbol(chainId: number, symbol: string) {\n const token = TOKENS_BY_SYMBOL_MAP[chainId][symbol];\n if (!token) {\n throw new Error(`Incorrect symbol \"${symbol}\" for chainId ${chainId}`);\n }\n return token;\n}\n\nexport function getWhitelistedTokens(chainId: number) {\n return TOKENS[chainId].filter((token) => token.symbol !== \"USDF\");\n}\n\nexport function getVisibleTokens(chainId: number) {\n return getWhitelistedTokens(chainId).filter((token) => !token.isWrapped && !token.isTempHidden);\n}\n","import { BigNumber, BigNumberish, ethers } from \"ethers\";\nimport { USD_DECIMALS } from \"./legacy\";\n\nexport const PRICE_PRECISION = expandDecimals(1, 30);\nexport const HIGH_PRICE_DECIMALS = 2;\nexport const PRICE_DECIMALS = 4;\n\nexport function bigNumberify(n: BigNumberish) {\n try {\n return BigNumber.from(n);\n } catch (e) {\n console.error(\"bigNumberify error\", e);\n return undefined;\n }\n}\n\nexport function expandDecimals(n: BigNumberish, decimals: number): BigNumber {\n // @ts-ignore\n return bigNumberify(n).mul(bigNumberify(10).pow(decimals));\n}\n\nexport const trimZeroDecimals = (amount: string) => {\n if (parseFloat(amount) === parseInt(amount)) {\n return parseInt(amount).toString();\n }\n return amount;\n};\n\nexport const limitDecimals = (amount: BigNumberish, maxDecimals?: number) => {\n let amountStr = amount.toString();\n if (maxDecimals === undefined) {\n return amountStr;\n }\n if (maxDecimals === 0) {\n return amountStr.split(\".\")[0];\n }\n const dotIndex = amountStr.indexOf(\".\");\n if (dotIndex !== -1) {\n let decimals = amountStr.length - dotIndex - 1;\n if (decimals > maxDecimals) {\n amountStr = amountStr.substr(0, amountStr.length - (decimals - maxDecimals));\n }\n }\n return amountStr;\n};\n\nexport const padDecimals = (amount: BigNumberish, minDecimals: number) => {\n let amountStr = amount.toString();\n const dotIndex = amountStr.indexOf(\".\");\n if (dotIndex !== -1) {\n const decimals = amountStr.length - dotIndex - 1;\n if (decimals < minDecimals) {\n amountStr = amountStr.padEnd(amountStr.length + (minDecimals - decimals), \"0\");\n }\n } else {\n amountStr = amountStr + \".0000\";\n }\n return amountStr;\n};\n\nexport const formatAmount = (\n amount: BigNumberish | undefined,\n tokenDecimals: number,\n displayDecimals?: number,\n useCommas?: boolean,\n defaultValue?: string\n) => {\n if (!defaultValue) {\n defaultValue = \"...\";\n }\n if (amount === undefined || amount.toString().length === 0) {\n return defaultValue;\n }\n if (displayDecimals === undefined) {\n displayDecimals = 4;\n }\n let amountStr = ethers.utils.formatUnits(amount, tokenDecimals);\n amountStr = limitDecimals(amountStr, displayDecimals);\n if (displayDecimals !== 0) {\n amountStr = padDecimals(amountStr, displayDecimals);\n }\n if (useCommas) {\n return numberWithCommas(amountStr);\n }\n return amountStr;\n};\n\nexport const formatKeyAmount = (\n map: any,\n key: string,\n tokenDecimals: number,\n displayDecimals: number,\n useCommas?: boolean\n) => {\n if (!map || !map[key]) {\n return \"...\";\n }\n\n return formatAmount(map[key], tokenDecimals, displayDecimals, useCommas);\n};\n\nexport const formatKeyPrice = (map: any, key: string, useCommas?: boolean) => {\n if (!map || !map[key]) {\n return \"...\";\n }\n\n return formatPrice(map[key], useCommas);\n};\n\nexport const formatPrice = (price: BigNumber | undefined, useCommas?: boolean, isFree?: boolean) => {\n if (!price) {\n return \"...\";\n }\n\n const displayDecimals = PRICE_PRECISION.mul(100).lte(price) ? HIGH_PRICE_DECIMALS : PRICE_DECIMALS;\n\n if (isFree) {\n return formatAmountFree(price, USD_DECIMALS, displayDecimals);\n }\n\n return formatAmount(price, USD_DECIMALS, displayDecimals, useCommas);\n};\n\nexport const formatArrayAmount = (\n arr: any[],\n index: number,\n tokenDecimals: number,\n displayDecimals?: number,\n useCommas?: boolean\n) => {\n if (!arr || !arr[index]) {\n return \"...\";\n }\n\n return formatAmount(arr[index], tokenDecimals, displayDecimals, useCommas);\n};\n\nexport const formatAmountFree = (amount: BigNumberish, tokenDecimals: number, displayDecimals?: number) => {\n if (!amount) {\n return \"...\";\n }\n let amountStr = ethers.utils.formatUnits(amount, tokenDecimals);\n amountStr = limitDecimals(amountStr, displayDecimals);\n return trimZeroDecimals(amountStr);\n};\n\nexport const parseValue = (value: string, tokenDecimals: number) => {\n const pValue = parseFloat(value);\n\n if (isNaN(pValue)) {\n return undefined;\n }\n\n value = limitDecimals(value, tokenDecimals);\n const amount = ethers.utils.parseUnits(value, tokenDecimals);\n return bigNumberify(amount);\n};\n\nexport function numberWithCommas(x: BigNumberish) {\n if (!x) {\n return \"...\";\n }\n\n var parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return parts.join(\".\");\n}\n","import { BigNumber, ethers } from \"ethers\";\nimport {\n adjustForDecimals,\n DUST_BNB,\n getFeeBasisPoints,\n MARKET,\n MINT_BURN_FEE_BASIS_POINTS,\n PRECISION,\n TAX_BASIS_POINTS,\n USD_DECIMALS,\n USDF_ADDRESS,\n USDF_DECIMALS,\n} from \"lib/legacy\";\nimport { getVisibleTokens, getWhitelistedTokens } from \"config/tokens\";\nimport { getExplorerUrl } from \"config/chains\";\nimport { InfoTokens, Token, TokenInfo } from \"./types\";\nimport { bigNumberify, expandDecimals } from \"lib/numbers\";\n\nconst { AddressZero } = ethers.constants;\n\nexport function getTokenUrl(chainId: number, address: string) {\n if (!address) {\n return getExplorerUrl(chainId);\n }\n return getExplorerUrl(chainId) + \"token/\" + address;\n}\n\nexport function getUsd(\n amount: BigNumber,\n tokenAddress: string,\n max: boolean,\n infoTokens: InfoTokens,\n orderOption?: string,\n triggerPriceUsd?: BigNumber\n) {\n if (!amount) {\n return;\n }\n if (tokenAddress === USDF_ADDRESS) {\n return amount.mul(PRECISION).div(expandDecimals(1, 18));\n }\n const info = getTokenInfo(infoTokens, tokenAddress);\n const price = getTriggerPrice(tokenAddress, max, info, orderOption, triggerPriceUsd);\n if (!price) {\n return;\n }\n\n return amount.mul(price).div(expandDecimals(1, info.decimals));\n}\n\nexport function getTokenAmountFromUsd(\n infoTokens: InfoTokens,\n tokenAddress: string,\n usdAmount?: BigNumber,\n opts: {\n max?: boolean;\n overridePrice?: BigNumber;\n } = {}\n) {\n if (!usdAmount) {\n return;\n }\n\n if (tokenAddress === USDF_ADDRESS) {\n return usdAmount.mul(expandDecimals(1, 18)).div(PRECISION);\n }\n\n const info: TokenInfo | undefined = getTokenInfo(infoTokens, tokenAddress);\n\n if (!info) {\n return;\n }\n\n const price = opts.overridePrice || (opts.max ? info.maxPrice : info.minPrice);\n\n if (!BigNumber.isBigNumber(price) || price.lte(0)) {\n return;\n }\n\n return usdAmount.mul(expandDecimals(1, info.decimals)).div(price);\n}\n\nexport function getTriggerPrice(\n tokenAddress: string,\n max: boolean,\n info: TokenInfo,\n orderOption?: string,\n triggerPriceUsd?: BigNumber\n) {\n // Limit/stop orders are executed with price specified by user\n if (orderOption && orderOption !== MARKET && triggerPriceUsd) {\n return triggerPriceUsd;\n }\n\n // Market orders are executed with current market price\n if (!info) {\n return;\n }\n if (max && !info.maxPrice) {\n return;\n }\n if (!max && !info.minPrice) {\n return;\n }\n return max ? info.maxPrice : info.minPrice;\n}\n\nexport function getTokenInfo(\n infoTokens: InfoTokens,\n tokenAddress: string,\n replaceNative?: boolean,\n nativeTokenAddress?: string\n) {\n if (replaceNative && tokenAddress.toLowerCase() === nativeTokenAddress?.toLowerCase()) {\n return infoTokens[AddressZero];\n }\n\n if (!infoTokens[tokenAddress]) {\n const key = Object.keys(infoTokens).find(key => key.toLocaleLowerCase() === tokenAddress.toLowerCase());\n if (key) {\n return infoTokens[key];\n }\n\n return infoTokens[tokenAddress];\n };\n\n return infoTokens[tokenAddress];\n}\n\nexport function getLowestFeeTokenForBuyFlp(\n chainId: number,\n toAmount: BigNumber,\n flpPrice: BigNumber,\n usdfSupply: BigNumber,\n totalTokenWeights: BigNumber,\n infoTokens: InfoTokens,\n fromTokenAddress: string,\n swapUsdMin: BigNumber\n): { token: Token; fees: number; amountLeftToDeposit: BigNumber } | undefined {\n if (!chainId || !toAmount || !infoTokens || !flpPrice || !usdfSupply || !totalTokenWeights || !swapUsdMin) {\n return;\n }\n\n const tokens = getVisibleTokens(chainId);\n\n const usdfAmount = toAmount.mul(flpPrice).div(PRECISION);\n\n const tokensData = tokens.map((token) => {\n const fromToken = getTokenInfo(infoTokens, token.address);\n\n const fees = getFeeBasisPoints(\n fromToken,\n usdfAmount,\n MINT_BURN_FEE_BASIS_POINTS,\n TAX_BASIS_POINTS,\n true,\n usdfSupply,\n totalTokenWeights\n );\n\n let amountLeftToDeposit = bigNumberify(0)!;\n\n if (\n fromToken.maxUsdfAmount &&\n fromToken.maxUsdfAmount.gt(0) &&\n fromToken.usdfAmount &&\n fromToken.usdfAmount.gt(0)\n ) {\n amountLeftToDeposit = fromToken.maxUsdfAmount\n .sub(fromToken.usdfAmount)\n .mul(expandDecimals(1, USD_DECIMALS))\n .div(expandDecimals(1, USDF_DECIMALS));\n }\n return { token, fees, amountLeftToDeposit };\n });\n\n const tokensWithLiquidity = tokensData\n .filter(\n (asset) =>\n asset.token.address !== fromTokenAddress &&\n asset.hasOwnProperty(\"fees\") &&\n swapUsdMin.lt(asset.amountLeftToDeposit)\n )\n .sort((a, b) => a.fees - b.fees);\n\n return tokensWithLiquidity.length > 0\n ? tokensWithLiquidity[0]\n : tokensData.sort((a, b) => Number(b.amountLeftToDeposit.sub(a.amountLeftToDeposit)))[0];\n}\n\nexport function getMostAbundantStableToken(chainId: number, infoTokens: InfoTokens) {\n const whitelistedTokens = getWhitelistedTokens(chainId);\n let availableAmount;\n let stableToken = whitelistedTokens.find((t) => t.isStable);\n\n for (let i = 0; i < whitelistedTokens.length; i++) {\n const info = getTokenInfo(infoTokens, whitelistedTokens[i].address);\n if (!info.isStable || !info.availableAmount) {\n continue;\n }\n\n const adjustedAvailableAmount = adjustForDecimals(info.availableAmount, info.decimals, USD_DECIMALS);\n if (!availableAmount || adjustedAvailableAmount.gt(availableAmount)) {\n availableAmount = adjustedAvailableAmount;\n stableToken = info;\n }\n }\n\n return stableToken;\n}\n\nexport function shouldRaiseGasError(token: TokenInfo, amount?: BigNumber) {\n if (!amount) {\n return false;\n }\n if (token.address !== AddressZero) {\n return false;\n }\n if (!token.balance) {\n return false;\n }\n if (amount.gte(token.balance)) {\n return true;\n }\n if (token.balance.sub(amount).lt(DUST_BNB)) {\n return true;\n }\n return false;\n}\n\nexport const replaceNativeTokenAddress = (path: string[], nativeTokenAddress: string) => {\n if (!path) {\n return;\n }\n\n let updatedPath: string[] = [];\n\n for (let i = 0; i < path.length; i++) {\n let address = path[i];\n if (address === AddressZero) {\n address = nativeTokenAddress;\n }\n updatedPath.push(address);\n }\n\n return updatedPath;\n};\n","import { toast, ToastContent, ToastOptions } from \"react-toastify\";\n\nexport const helperToast = {\n success: (content: ToastContent, opts?: ToastOptions) => {\n toast.dismiss();\n toast.success(content, opts);\n },\n error: (content: ToastContent, opts?: ToastOptions) => {\n toast.dismiss();\n toast.error(content, opts);\n },\n};\n","import { useState } from \"react\";\n\nexport function ToastifyDebug(props) {\n const [open, setOpen] = useState(false);\n return (\n
\n setOpen((old) => !old)}>\n {open ? \"Hide error\" : \"Show error\"}\n \n {open &&
{props.children}
}\n
\n );\n}\n","export const NOT_ENOUGH_FUNDS = \"NOT_ENOUGH_FUNDS\";\nexport const USER_DENIED = \"USER_DENIED\";\nexport const SLIPPAGE = \"SLIPPAGE\";\nexport const RPC_ERROR = \"RPC_ERROR\";\n\ntype ErrorPattern = { msg?: string; code?: number };\n\nconst TX_ERROR_PATTERNS: { [key: string]: ErrorPattern[] } = {\n [NOT_ENOUGH_FUNDS]: [\n { msg: \"not enough funds for gas\" },\n { msg: \"failed to execute call with revert code InsufficientGasFunds\" },\n ],\n [USER_DENIED]: [{ msg: \"User denied transaction signature\" }],\n [SLIPPAGE]: [{ msg: \"Router: mark price lower than limit\" }, { msg: \"Router: mark price higher than limit\" }],\n [RPC_ERROR]: [\n // @see https://eips.ethereum.org/EIPS/eip-1474#error-codes\n { code: -32005 },\n { msg: \"Non-200 status code\" },\n { msg: \"Request limit exceeded\" },\n { msg: \"Internal JSON-RPC error\" },\n { msg: \"Response has no error or result\" },\n { msg: \"couldn't connect to the network\" },\n ],\n};\n\ntype TxError = {\n message?: string;\n code?: number;\n data?: any;\n};\n\nexport function extractError(ex: TxError) {\n if (!ex) {\n return [];\n }\n\n const message = ex.data?.message || ex.message;\n const code = ex.code;\n\n if (!message && !code) {\n return [];\n }\n\n for (const [type, patterns] of Object.entries(TX_ERROR_PATTERNS)) {\n for (const pattern of patterns) {\n const matchCode = pattern.code && code === pattern.code;\n const matchMessage = pattern.msg && message && message.includes(pattern.msg);\n\n if (matchCode || matchMessage) {\n return [message, type, ex.data];\n }\n }\n }\n\n return [message, null, ex.data];\n}\n","import { Provider } from \"@ethersproject/providers\";\nimport { Contract } from \"ethers\";\nimport { GAS_PRICE_ADJUSTMENT_MAP, MAX_GAS_PRICE_MAP } from \"config/chains\";\nimport { bigNumberify } from \"../numbers\";\n\nexport async function setGasPrice(txnOpts: any, provider: Provider, chainId: number) {\n let maxGasPrice = MAX_GAS_PRICE_MAP[chainId];\n const premium = GAS_PRICE_ADJUSTMENT_MAP[chainId] || bigNumberify(0);\n\n const gasPrice = await provider.getGasPrice();\n\n if (maxGasPrice) {\n if (gasPrice.gt(maxGasPrice)) {\n maxGasPrice = gasPrice;\n }\n\n const feeData = await provider.getFeeData();\n\n // the wallet provider might not return maxPriorityFeePerGas in feeData\n // in which case we should fallback to the usual getGasPrice flow handled below\n if (feeData && feeData.maxPriorityFeePerGas) {\n txnOpts.maxFeePerGas = maxGasPrice;\n txnOpts.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas.add(premium);\n return;\n }\n }\n\n txnOpts.gasPrice = gasPrice.add(premium);\n return;\n}\n\nexport async function getGasLimit(contract: Contract, method, params = [], value) {\n const defaultValue = bigNumberify(0);\n\n if (!value) {\n value = defaultValue;\n }\n\n let gasLimit = await contract.estimateGas[method](...params, { value });\n\n if (gasLimit.lt(22000)) {\n gasLimit = bigNumberify(22000)!;\n }\n\n return gasLimit.mul(11000).div(10000); // add a 10% buffer\n}\n","import React from \"react\";\n\ntype Props = {\n href: string;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction ExternalLink({ href, children, className }: Props) {\n return (\n \n {children}\n \n );\n}\n\nexport default ExternalLink;\n","import { BigNumber, Contract } from \"ethers\";\nimport { helperToast } from \"../helperToast\";\nimport { ToastifyDebug } from \"components/ToastifyDebug/ToastifyDebug\";\nimport { extractError, NOT_ENOUGH_FUNDS, RPC_ERROR, SLIPPAGE, USER_DENIED } from \"./transactionErrors\";\nimport { getGasLimit, setGasPrice } from \"./utils\";\nimport { getExplorerUrl } from \"config/chains\";\nimport { t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nexport async function callContract(\n chainId: number,\n contract: Contract,\n method: string,\n params: any,\n opts: {\n value?: BigNumber | number;\n gasLimit?: BigNumber | number;\n sentMsg?: string;\n successMsg?: string;\n hideSuccessMsg?: boolean;\n failMsg?: string;\n setPendingTxns?: (txns: any) => void;\n }\n) {\n try {\n if (!Array.isArray(params) && typeof params === \"object\" && opts === undefined) {\n opts = params;\n params = [];\n }\n\n if (!opts) {\n opts = {};\n }\n\n const txnOpts: any = {};\n\n if (opts.value) {\n txnOpts.value = opts.value;\n }\n\n txnOpts.gasLimit = opts.gasLimit ? opts.gasLimit : await getGasLimit(contract, method, params, opts.value);\n\n await setGasPrice(txnOpts, contract.provider, chainId);\n\n const res = await contract[method](...params, txnOpts);\n const txUrl = getExplorerUrl(chainId) + \"tx/\" + res.hash;\n const sentMsg = opts.sentMsg || t`Transaction sent.`;\n\n helperToast.success(\n
\n {sentMsg}{\" \"}\n \n View status.\n \n
\n
\n );\n\n if (opts.setPendingTxns) {\n const message = opts.hideSuccessMsg ? undefined : opts.successMsg || t`Transaction completed!`;\n const pendingTxn = {\n hash: res.hash,\n message,\n };\n opts.setPendingTxns((pendingTxns) => [...pendingTxns, pendingTxn]);\n }\n\n return res;\n } catch (e) {\n let failMsg;\n\n let autoCloseToast: number | boolean = 5000;\n\n const [message, type, errorData] = extractError(e);\n switch (type) {\n case NOT_ENOUGH_FUNDS:\n failMsg = (\n
\n \n There is not enough ETH in your account on Arbitrum to send this transaction.\n
\n
\n Bridge ETH to Arbitrum\n
\n
\n );\n break;\n case USER_DENIED:\n failMsg = t`Transaction was cancelled.`;\n break;\n case SLIPPAGE:\n failMsg = t`The mark price has changed, consider increasing your Allowed Slippage by clicking on the \"...\" icon next to your address.`;\n break;\n case RPC_ERROR:\n autoCloseToast = false;\n\n const originalError = errorData?.error?.message || errorData?.message || message;\n\n failMsg = (\n
\n \n Transaction failed due to RPC error.\n
\n
\n Please try changing the RPC url in your wallet settings.{\" \"}\n More info\n
\n
\n {originalError && {originalError}}\n
\n );\n break;\n default:\n autoCloseToast = false;\n\n failMsg = (\n
\n {opts.failMsg || t`Transaction failed`}\n
\n {message && {message}}\n
\n );\n }\n\n helperToast.error(failMsg, { autoClose: autoCloseToast });\n throw e;\n }\n}\n","import { FALLBACK_PROVIDERS, RPC_PROVIDERS } from \"config/chains\";\nimport _ from \"lodash\";\nimport { ethers } from \"ethers\";\nimport { Web3ReactContextInterface } from \"@web3-react/core/dist/types\";\nimport { JsonRpcProvider } from \"@ethersproject/providers\";\n\nexport function getProvider(\n library: Web3ReactContextInterface[\"library\"] | undefined,\n chainId: number\n): JsonRpcProvider {\n let provider;\n\n if (library) {\n return library.getSigner();\n }\n\n provider = _.sample(RPC_PROVIDERS[chainId]);\n\n return new ethers.providers.StaticJsonRpcProvider(\n provider,\n // @ts-ignore incorrect Network param types\n { chainId }\n );\n}\n\nexport function getFallbackProvider(chainId: number) {\n if (!FALLBACK_PROVIDERS[chainId]) {\n return;\n }\n\n const provider = _.sample(FALLBACK_PROVIDERS[chainId]);\n\n return new ethers.providers.StaticJsonRpcProvider(\n provider,\n // @ts-ignore incorrect Network param types\n { chainId }\n );\n}\n","import { ethers } from \"ethers\";\nimport { Web3Provider } from \"@ethersproject/providers\";\nimport { getFallbackProvider, getProvider } from \"../rpc\";\n\nexport const contractFetcher =\n (library: Web3Provider, contractInfo: any, additionalArgs: any[]) =>\n (...args: any): Promise => {\n // eslint-disable-next-line\n const [id, chainId, arg0, arg1, ...params] = args;\n const provider = getProvider(library, chainId);\n\n const method = ethers.utils.isAddress(arg0) ? arg1 : arg0;\n\n const contractCall = getContractCall({\n provider,\n contractInfo,\n arg0,\n arg1,\n method,\n params,\n additionalArgs,\n });\n\n let shouldCallFallback = true;\n\n const handleFallback = async (resolve, reject, error) => {\n if (!shouldCallFallback) {\n return;\n }\n // prevent fallback from being called twice\n shouldCallFallback = false;\n\n const fallbackProvider = getFallbackProvider(chainId);\n if (!fallbackProvider) {\n reject(error);\n return;\n }\n\n console.info(\"using fallbackProvider for\", method);\n const fallbackContractCall = getContractCall({\n provider: fallbackProvider,\n contractInfo,\n arg0,\n arg1,\n method,\n params,\n additionalArgs,\n });\n\n fallbackContractCall\n .then((result) => resolve(result))\n .catch((e) => {\n console.error(\"fallback fetcher error\", id, contractInfo.contractName, method, e);\n reject(e);\n });\n };\n\n return new Promise(async (resolve, reject) => {\n contractCall\n .then((result) => {\n shouldCallFallback = false;\n resolve(result);\n })\n .catch((e) => {\n console.error(\"fetcher error\", id, contractInfo.contractName, method, e);\n handleFallback(resolve, reject, e);\n });\n\n setTimeout(() => {\n handleFallback(resolve, reject, \"contractCall timeout\");\n }, 2000);\n });\n };\n\nfunction getContractCall({ provider, contractInfo, arg0, arg1, method, params, additionalArgs }) {\n if (ethers.utils.isAddress(arg0)) {\n const address = arg0;\n const contract = new ethers.Contract(address, contractInfo.abi, provider);\n\n if (additionalArgs) {\n return contract[method](...params.concat(additionalArgs));\n }\n return contract[method](...params);\n }\n\n if (!provider) {\n return;\n }\n\n return provider[method](arg1, ...params);\n}\n","import { getContract } from \"config/contracts\";\nimport useSWR from \"swr\";\nimport { contractFetcher } from \"lib/contracts\";\nimport VaultReader from \"abis/VaultReader.json\";\nimport {\n BASIS_POINTS_DIVISOR,\n DEFAULT_MAX_USDF_AMOUNT,\n MAX_PRICE_DEVIATION_BASIS_POINTS,\n USD_DECIMALS,\n USDF_ADDRESS,\n} from \"lib/legacy\";\nimport { getServerUrl } from \"config/backend\";\nimport { InfoTokens, Token, TokenInfo } from \"./types\";\nimport { BigNumber } from \"ethers\";\nimport { Web3ReactContextInterface } from \"@web3-react/core/dist/types\";\nimport { bigNumberify, expandDecimals } from \"lib/numbers\";\nimport { getTokens, getWhitelistedTokens } from \"config/tokens\";\n\nexport const ONE_USD = expandDecimals(1, 30);\nexport const MAX_STRICT_PRICE_DEVIATION = expandDecimals(1, 28);\n\nexport function useInfoTokens(\n library: Web3ReactContextInterface[\"library\"],\n chainId: number,\n active: boolean,\n tokenBalances?: BigNumber[],\n fundingRateInfo?: BigNumber[],\n vaultPropsLength?: number\n) {\n const tokens = getTokens(chainId);\n const vaultReaderAddress = getContract(chainId, \"VaultReader\");\n const vaultAddress = getContract(chainId, \"Vault\");\n const positionRouterAddress = getContract(chainId, \"PositionRouter\");\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n\n const whitelistedTokens = getWhitelistedTokens(chainId);\n const whitelistedTokenAddresses = whitelistedTokens.map((token) => token.address);\n\n const { data: vaultTokenInfo } = useSWR(\n [`useInfoTokens:${active}`, chainId, vaultReaderAddress, \"getVaultTokenInfoV4\"],\n {\n fetcher: contractFetcher(library, VaultReader, [\n vaultAddress,\n positionRouterAddress,\n nativeTokenAddress,\n expandDecimals(1, 18),\n whitelistedTokenAddresses,\n ]),\n }\n );\n\n const indexPricesUrl = getServerUrl(chainId, \"/prices\");\n\n const { data: indexPrices } = useSWR([indexPricesUrl], {\n // @ts-ignore spread args incorrect type\n fetcher: (...args) => fetch(...args).then((res) => res.json()),\n refreshInterval: 500,\n refreshWhenHidden: true,\n });\n\n return {\n infoTokens: getInfoTokens(\n tokens,\n tokenBalances,\n whitelistedTokens,\n vaultTokenInfo,\n fundingRateInfo,\n vaultPropsLength,\n indexPrices,\n nativeTokenAddress\n ),\n };\n}\n\nfunction getInfoTokens(\n tokens: Token[],\n tokenBalances: BigNumber[] | undefined,\n whitelistedTokens: Token[],\n vaultTokenInfo: BigNumber[] | undefined,\n fundingRateInfo: BigNumber[] | undefined,\n vaultPropsLength: number | undefined,\n indexPrices: { [address: string]: BigNumber },\n nativeTokenAddress: string\n): InfoTokens {\n if (!vaultPropsLength) {\n vaultPropsLength = 15;\n }\n const fundingRatePropsLength = 2;\n const infoTokens: InfoTokens = {};\n\n for (let i = 0; i < tokens.length; i++) {\n const token = JSON.parse(JSON.stringify(tokens[i])) as TokenInfo;\n\n if (tokenBalances) {\n token.balance = tokenBalances[i];\n }\n\n if (token.address === USDF_ADDRESS) {\n token.minPrice = expandDecimals(1, USD_DECIMALS);\n token.maxPrice = expandDecimals(1, USD_DECIMALS);\n }\n\n infoTokens[token.address] = token;\n }\n\n for (let i = 0; i < whitelistedTokens.length; i++) {\n const token = JSON.parse(JSON.stringify(whitelistedTokens[i])) as TokenInfo;\n\n if (vaultTokenInfo) {\n token.poolAmount = vaultTokenInfo[i * vaultPropsLength];\n token.reservedAmount = vaultTokenInfo[i * vaultPropsLength + 1];\n token.availableAmount = token.poolAmount.sub(token.reservedAmount);\n token.usdfAmount = vaultTokenInfo[i * vaultPropsLength + 2];\n token.redemptionAmount = vaultTokenInfo[i * vaultPropsLength + 3];\n token.weight = vaultTokenInfo[i * vaultPropsLength + 4];\n token.bufferAmount = vaultTokenInfo[i * vaultPropsLength + 5];\n token.maxUsdfAmount = vaultTokenInfo[i * vaultPropsLength + 6];\n token.globalShortSize = vaultTokenInfo[i * vaultPropsLength + 7];\n token.maxGlobalShortSize = vaultTokenInfo[i * vaultPropsLength + 8];\n token.maxGlobalLongSize = vaultTokenInfo[i * vaultPropsLength + 9];\n token.minPrice = vaultTokenInfo[i * vaultPropsLength + 10];\n token.maxPrice = vaultTokenInfo[i * vaultPropsLength + 11];\n token.guaranteedUsd = vaultTokenInfo[i * vaultPropsLength + 12];\n token.maxPrimaryPrice = vaultTokenInfo[i * vaultPropsLength + 13];\n token.minPrimaryPrice = vaultTokenInfo[i * vaultPropsLength + 14];\n\n // save minPrice and maxPrice as setTokenUsingIndexPrices may override it\n token.contractMinPrice = token.minPrice;\n token.contractMaxPrice = token.maxPrice;\n\n token.maxAvailableShort = bigNumberify(0)!;\n\n token.hasMaxAvailableShort = false;\n if (token.maxGlobalShortSize.gt(0)) {\n token.hasMaxAvailableShort = true;\n if (token.maxGlobalShortSize.gt(token.globalShortSize)) {\n token.maxAvailableShort = token.maxGlobalShortSize.sub(token.globalShortSize);\n }\n }\n\n if (token.maxUsdfAmount.eq(0)) {\n token.maxUsdfAmount = DEFAULT_MAX_USDF_AMOUNT;\n }\n\n token.availableUsd = token.isStable\n ? token.poolAmount.mul(token.minPrice).div(expandDecimals(1, token.decimals))\n : token.availableAmount.mul(token.minPrice).div(expandDecimals(1, token.decimals));\n\n token.maxAvailableLong = bigNumberify(0)!;\n token.hasMaxAvailableLong = false;\n if (token.maxGlobalLongSize.gt(0)) {\n token.hasMaxAvailableLong = true;\n\n if (token.maxGlobalLongSize.gt(token.guaranteedUsd)) {\n const remainingLongSize = token.maxGlobalLongSize.sub(token.guaranteedUsd);\n token.maxAvailableLong = remainingLongSize.lt(token.availableUsd) ? remainingLongSize : token.availableUsd;\n }\n } else {\n token.maxAvailableLong = token.availableUsd;\n }\n\n token.maxLongCapacity =\n token.maxGlobalLongSize.gt(0) && token.maxGlobalLongSize.lt(token.availableUsd.add(token.guaranteedUsd))\n ? token.maxGlobalLongSize\n : token.availableUsd.add(token.guaranteedUsd);\n\n token.managedUsd = token.availableUsd.add(token.guaranteedUsd);\n token.managedAmount = token.managedUsd.mul(expandDecimals(1, token.decimals)).div(token.minPrice);\n\n setTokenUsingIndexPrices(token, indexPrices, nativeTokenAddress);\n }\n\n if (fundingRateInfo) {\n token.fundingRate = fundingRateInfo[i * fundingRatePropsLength];\n token.cumulativeFundingRate = fundingRateInfo[i * fundingRatePropsLength + 1];\n }\n\n if (infoTokens[token.address]) {\n token.balance = infoTokens[token.address].balance;\n }\n\n infoTokens[token.address] = token;\n }\n\n return infoTokens;\n}\n\nfunction setTokenUsingIndexPrices(\n token: TokenInfo,\n indexPrices: { [address: string]: BigNumber },\n nativeTokenAddress: string\n) {\n if (!indexPrices) {\n return;\n }\n\n const tokenAddress = token.isNative ? nativeTokenAddress : token.address;\n\n const indexPrice = indexPrices[tokenAddress];\n\n if (!indexPrice) {\n return;\n }\n\n let indexPriceBn = bigNumberify(indexPrice)!;\n\n if (indexPriceBn.eq(0)) {\n return;\n }\n\n if (token.isStable) {\n const delta = indexPriceBn.gt(ONE_USD) ? indexPriceBn.sub(ONE_USD) : ONE_USD.sub(indexPriceBn);\n if (delta.lte(MAX_STRICT_PRICE_DEVIATION)) {\n indexPriceBn = ONE_USD\n }\n }\n\n const spread = token.maxPrice!.sub(token.minPrice!);\n const spreadBps = spread.mul(BASIS_POINTS_DIVISOR).div(token.maxPrice!.add(token.minPrice!).div(2));\n\n if (spreadBps.gt(MAX_PRICE_DEVIATION_BASIS_POINTS - 50)) {\n // only set one of the values as there will be a spread between the index price and the Chainlink price\n if (indexPriceBn.gt(token.minPrimaryPrice!)) {\n token.maxPrice = indexPriceBn;\n } else {\n token.minPrice = indexPriceBn;\n }\n return;\n }\n\n const halfSpreadBps = spreadBps.div(2).toNumber();\n token.maxPrice = indexPriceBn.mul(BASIS_POINTS_DIVISOR + halfSpreadBps).div(BASIS_POINTS_DIVISOR);\n token.minPrice = indexPriceBn.mul(BASIS_POINTS_DIVISOR - halfSpreadBps).div(BASIS_POINTS_DIVISOR);\n}\n","import { ethers } from \"ethers\";\nimport Token from \"abis/Token.json\";\nimport { getExplorerUrl } from \"config/chains\";\nimport { helperToast } from \"lib/helperToast\";\nimport { Web3ReactContextInterface } from \"@web3-react/core/dist/types\";\nimport { InfoTokens, TokenInfo } from \"./types\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\nimport { t, Trans } from \"@lingui/macro\";\n\ntype Params = {\n setIsApproving: (val: boolean) => void;\n library: Web3ReactContextInterface[\"library\"];\n tokenAddress: string;\n spender: string;\n chainId: number;\n onApproveSubmitted: () => void;\n getTokenInfo?: (infoTokens: InfoTokens, tokenAddress: string) => TokenInfo;\n infoTokens: InfoTokens;\n pendingTxns: any[];\n setPendingTxns: (txns: any[]) => void;\n includeMessage?: boolean;\n};\n\nexport function approveTokens({\n setIsApproving,\n library,\n tokenAddress,\n spender,\n chainId,\n onApproveSubmitted,\n getTokenInfo,\n infoTokens,\n pendingTxns,\n setPendingTxns,\n includeMessage,\n}: Params) {\n setIsApproving(true);\n const contract = new ethers.Contract(tokenAddress, Token.abi, library.getSigner());\n contract\n .approve(spender, ethers.constants.MaxUint256)\n .then(async (res) => {\n const txUrl = getExplorerUrl(chainId) + \"tx/\" + res.hash;\n helperToast.success(\n
\n \n Approval submitted! View status.\n \n
\n
\n );\n if (onApproveSubmitted) {\n onApproveSubmitted();\n }\n if (getTokenInfo && infoTokens && pendingTxns && setPendingTxns) {\n const token = getTokenInfo(infoTokens, tokenAddress);\n const pendingTxn = {\n hash: res.hash,\n message: includeMessage ? t`${token.symbol} Approved!` : false,\n };\n setPendingTxns([...pendingTxns, pendingTxn]);\n }\n })\n .catch((e) => {\n console.error(e);\n let failMsg;\n if (\n [\"not enough funds for gas\", \"failed to execute call with revert code InsufficientGasFunds\"].includes(\n e.data?.message\n )\n ) {\n failMsg = (\n
\n \n There is not enough ETH in your account on Arbitrum to send this transaction.\n
\n
\n Bridge ETH to Arbitrum\n
\n
\n );\n } else if (e.message?.includes(\"User denied transaction signature\")) {\n failMsg = t`Approval was cancelled`;\n } else {\n failMsg = t`Approval failed`;\n }\n helperToast.error(failMsg);\n })\n .finally(() => {\n setIsApproving(false);\n });\n}\n","export const SELECTED_NETWORK_LOCAL_STORAGE_KEY = \"SELECTED_NETWORK\";\nexport const WALLET_CONNECT_LOCALSTORAGE_KEY = \"walletconnect\";\nexport const WALLET_LINK_LOCALSTORAGE_PREFIX = \"-walletlink\";\nexport const SHOULD_EAGER_CONNECT_LOCALSTORAGE_KEY = \"eagerconnect\";\nexport const CURRENT_PROVIDER_LOCALSTORAGE_KEY = \"currentprovider\";\nexport const LANGUAGE_LOCALSTORAGE_KEY = \"LANGUAGE_KEY\";\nexport const SLIPPAGE_BPS_KEY = \"Exchange-swap-slippage-basis-points-v3\";\nexport const CLOSE_POSITION_RECEIVE_TOKEN_KEY = \"Close-position-receive-token\";\nexport const IS_PNL_IN_LEVERAGE_KEY = \"Exchange-swap-is-pnl-in-leverage\";\nexport const SHOW_PNL_AFTER_FEES_KEY = \"Exchange-swap-show-pnl-after-fees\";\nexport const DISABLE_ORDER_VALIDATION_KEY = \"disable-order-validation\";\nexport const SHOULD_SHOW_POSITION_LINES_KEY = \"Exchange-swap-should-show-position-lines\";\nexport const REFERRAL_CODE_KEY = \"FXDX-referralCode\";\nexport const REFERRALS_SELECTED_TAB_KEY = \"Referrals-selected-tab\";\n","import { useWeb3React } from \"@web3-react/core\";\nimport { SELECTED_NETWORK_LOCAL_STORAGE_KEY } from \"config/localStorage\";\nimport { DEFAULT_CHAIN_ID, SUPPORTED_CHAIN_IDS } from \"config/chains\";\n\nexport function useChainId() {\n let { chainId } = useWeb3React();\n\n if (!chainId) {\n const chainIdFromLocalStorage = localStorage.getItem(SELECTED_NETWORK_LOCAL_STORAGE_KEY);\n if (chainIdFromLocalStorage) {\n chainId = parseInt(chainIdFromLocalStorage);\n if (!chainId) {\n // localstorage value is invalid\n localStorage.removeItem(SELECTED_NETWORK_LOCAL_STORAGE_KEY);\n }\n }\n }\n\n if (!chainId || !SUPPORTED_CHAIN_IDS.includes(chainId)) {\n chainId = DEFAULT_CHAIN_ID;\n }\n\n return { chainId };\n}\n","import { format as formatDateFn } from \"date-fns\";\n\nexport function formatDateTime(time: number) {\n return formatDateFn(time * 1000, \"dd MMM yyyy, h:mm a\");\n}\n\nexport function formatDate(time: number) {\n return formatDateFn(time * 1000, \"dd MMM yyyy\");\n}\n\nexport function getTimeRemaining(time: number) {\n const now = parseInt(String(Date.now() / 1000));\n if (time < now) {\n return \"0h 0m\";\n }\n const diff = time - now;\n const hours = parseInt(String(diff / (60 * 60)));\n const minutes = parseInt(String((diff - hours * 60 * 60) / 60));\n return `${hours}h ${minutes}m`;\n}\n\nexport function isValidTimestamp(timestamp: any) {\n return new Date(timestamp).getTime() > 0;\n}\n","import { useEffect, useState } from \"react\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport { ethers } from \"ethers\";\nimport { getContract } from \"config/contracts\";\nimport useSWR from \"swr\";\n\nimport OrderBookReader from \"abis/OrderBookReader.json\";\nimport OrderBook from \"abis/OrderBook.json\";\n\nimport { CHAIN_ID, getExplorerUrl, IS_TESTNET } from \"config/chains\";\nimport { getServerBaseUrl } from \"config/backend\";\nimport { getMostAbundantStableToken } from \"domain/tokens\";\nimport { getTokenInfo } from \"domain/tokens/utils\";\nimport { getProvider } from \"./rpc\";\nimport { bigNumberify, expandDecimals, formatAmount } from \"./numbers\";\nimport { isValidToken } from \"config/tokens\";\nimport { useChainId } from \"./chains\";\nimport { isValidTimestamp } from \"./dates\";\nimport { t } from \"@lingui/macro\";\n\nconst { AddressZero } = ethers.constants;\n\n// use a random placeholder account instead of the zero address as the zero address might have tokens\nexport const PLACEHOLDER_ACCOUNT = ethers.Wallet.createRandom().address;\n\nexport const MIN_PROFIT_TIME = 0;\n\nexport const USDF_ADDRESS = getContract(CHAIN_ID, \"USDF\");\nexport const MAX_LEVERAGE = 100 * 10000;\n\nexport const MAX_PRICE_DEVIATION_BASIS_POINTS = 750;\nexport const DEFAULT_GAS_LIMIT = 1 * 1000 * 1000;\nexport const SECONDS_PER_YEAR = 31536000;\nexport const USDF_DECIMALS = 18;\nexport const USD_DECIMALS = 30;\nexport const BASIS_POINTS_DIVISOR = 10000;\nexport const DEPOSIT_FEE = 30;\nexport const DUST_BNB = \"2000000000000000\";\nexport const DUST_USD = expandDecimals(1, USD_DECIMALS);\nexport const PRECISION = expandDecimals(1, 30);\nexport const FLP_DECIMALS = 18;\nexport const FXDX_DECIMALS = 18;\nexport const DEFAULT_MAX_USDF_AMOUNT = expandDecimals(200 * 1000 * 1000, 18);\n\nexport const TAX_BASIS_POINTS = 50;\nexport const STABLE_TAX_BASIS_POINTS = 5;\nexport const MINT_BURN_FEE_BASIS_POINTS = 25;\nexport const SWAP_FEE_BASIS_POINTS = 30;\nexport const STABLE_SWAP_FEE_BASIS_POINTS = 1;\nexport const MARGIN_FEE_BASIS_POINTS = 10;\n\nexport const LIQUIDATION_FEE = expandDecimals(5, USD_DECIMALS);\n\nexport const TRADES_PAGE_SIZE = 100;\n\nexport const FLP_COOLDOWN_DURATION = 15 * 60;\nexport const THRESHOLD_REDEMPTION_VALUE = expandDecimals(993, 27); // 0.993\nexport const FUNDING_RATE_PRECISION = 1000000;\n\nexport const SWAP = \"Swap\";\nexport const INCREASE = \"Increase\";\nexport const DECREASE = \"Decrease\";\nexport const LONG = \"Long\";\nexport const SHORT = \"Short\";\n\nexport const MARKET = \"Market\";\nexport const LIMIT = \"Limit\";\nexport const STOP = \"Stop\";\nexport const LEVERAGE_ORDER_OPTIONS = [MARKET, LIMIT, STOP];\nexport const SWAP_ORDER_OPTIONS = [MARKET, LIMIT];\nexport const SWAP_OPTIONS = [LONG, SHORT, SWAP];\nexport const DEFAULT_SLIPPAGE_AMOUNT = 30;\nexport const DEFAULT_HIGHER_SLIPPAGE_AMOUNT = 100;\n\nexport const REFERRAL_CODE_QUERY_PARAM = \"ref\";\nexport const MAX_REFERRAL_CODE_LENGTH = 20;\n\nexport const MIN_PROFIT_BIPS = 0;\n\nexport function deserialize(data) {\n for (const [key, value] of Object.entries(data)) {\n if (value._type === \"BigNumber\") {\n data[key] = bigNumberify(value.value);\n }\n }\n return data;\n}\n\nexport function isHomeSite() {\n return process.env.REACT_APP_IS_HOME_SITE === \"true\";\n}\n\nexport function getLiquidationPriceFromDelta({ liquidationAmount, size, collateral, averagePrice, isLong }) {\n if (!size || size.eq(0)) {\n return;\n }\n\n if (liquidationAmount.gt(collateral)) {\n const liquidationDelta = liquidationAmount.sub(collateral);\n const priceDelta = liquidationDelta.mul(averagePrice).div(size);\n return isLong ? averagePrice.add(priceDelta) : averagePrice.sub(priceDelta);\n }\n\n const liquidationDelta = collateral.sub(liquidationAmount);\n const priceDelta = liquidationDelta.mul(averagePrice).div(size);\n\n return isLong ? averagePrice.sub(priceDelta) : averagePrice.add(priceDelta);\n}\n\nexport function getMarginFee(sizeDelta) {\n if (!sizeDelta) {\n return bigNumberify(0);\n }\n const afterFeeUsd = sizeDelta.mul(BASIS_POINTS_DIVISOR - MARGIN_FEE_BASIS_POINTS).div(BASIS_POINTS_DIVISOR);\n return sizeDelta.sub(afterFeeUsd);\n}\n\nexport function isTriggerRatioInverted(fromTokenInfo, toTokenInfo) {\n if (!toTokenInfo || !fromTokenInfo) return false;\n if (toTokenInfo.isStable || toTokenInfo.isUsdf) return true;\n if (toTokenInfo.maxPrice) return toTokenInfo.maxPrice.lt(fromTokenInfo.maxPrice);\n return false;\n}\n\nexport function getExchangeRate(tokenAInfo, tokenBInfo, inverted) {\n if (!tokenAInfo || !tokenAInfo.minPrice || !tokenBInfo || !tokenBInfo.maxPrice) {\n return;\n }\n if (inverted) {\n return tokenAInfo.minPrice.mul(PRECISION).div(tokenBInfo.maxPrice);\n }\n return tokenBInfo.maxPrice.mul(PRECISION).div(tokenAInfo.minPrice);\n}\n\nexport function shouldInvertTriggerRatio(tokenA, tokenB) {\n if (tokenB.isStable || tokenB.isUsdf) return true;\n if (tokenB.maxPrice && tokenA.maxPrice && tokenB.maxPrice.lt(tokenA.maxPrice)) return true;\n return false;\n}\n\nexport function getExchangeRateDisplay(rate, tokenA, tokenB, opts = {}) {\n if (!rate || !tokenA || !tokenB) return \"...\";\n if (shouldInvertTriggerRatio(tokenA, tokenB)) {\n [tokenA, tokenB] = [tokenB, tokenA];\n rate = PRECISION.mul(PRECISION).div(rate);\n }\n const rateValue = formatAmount(rate, USD_DECIMALS, tokenA.isStable || tokenA.isUsdf ? 2 : 4, true);\n if (opts.omitSymbols) {\n return rateValue;\n }\n return `${rateValue} ${tokenA.symbol} / ${tokenB.symbol}`;\n}\n\nconst adjustForDecimalsFactory = (n) => (number) => {\n if (n === 0) {\n return number;\n }\n if (n > 0) {\n return number.mul(expandDecimals(1, n));\n }\n return number.div(expandDecimals(1, -n));\n};\n\nexport function adjustForDecimals(amount, divDecimals, mulDecimals) {\n return amount.mul(expandDecimals(1, mulDecimals)).div(expandDecimals(1, divDecimals));\n}\n\nexport function getTargetUsdfAmount(token, usdfSupply, totalTokenWeights) {\n if (!token || !token.weight || !usdfSupply) {\n return;\n }\n\n if (usdfSupply.eq(0)) {\n return bigNumberify(0);\n }\n\n return token.weight.mul(usdfSupply).div(totalTokenWeights);\n}\n\nexport function getFeeBasisPoints(\n token,\n usdfDelta,\n feeBasisPoints,\n taxBasisPoints,\n increment,\n usdfSupply,\n totalTokenWeights\n) {\n if (!token || !token.usdfAmount || !usdfSupply || !totalTokenWeights) {\n return 0;\n }\n\n feeBasisPoints = bigNumberify(feeBasisPoints);\n taxBasisPoints = bigNumberify(taxBasisPoints);\n\n const initialAmount = token.usdfAmount;\n let nextAmount = initialAmount.add(usdfDelta);\n if (!increment) {\n nextAmount = usdfDelta.gt(initialAmount) ? bigNumberify(0) : initialAmount.sub(usdfDelta);\n }\n\n const targetAmount = getTargetUsdfAmount(token, usdfSupply, totalTokenWeights);\n if (!targetAmount || targetAmount.eq(0)) {\n return feeBasisPoints.toNumber();\n }\n\n const initialDiff = initialAmount.gt(targetAmount)\n ? initialAmount.sub(targetAmount)\n : targetAmount.sub(initialAmount);\n const nextDiff = nextAmount.gt(targetAmount) ? nextAmount.sub(targetAmount) : targetAmount.sub(nextAmount);\n\n if (nextDiff.lt(initialDiff)) {\n const rebateBps = taxBasisPoints.mul(initialDiff).div(targetAmount);\n return rebateBps.gt(feeBasisPoints) ? 0 : feeBasisPoints.sub(rebateBps).toNumber();\n }\n\n let averageDiff = initialDiff.add(nextDiff).div(2);\n if (averageDiff.gt(targetAmount)) {\n averageDiff = targetAmount;\n }\n const taxBps = taxBasisPoints.mul(averageDiff).div(targetAmount);\n return feeBasisPoints.add(taxBps).toNumber();\n}\n\nexport function getBuyFlpToAmount(fromAmount, swapTokenAddress, infoTokens, flpPrice, usdfSupply, totalTokenWeights) {\n const defaultValue = { amount: bigNumberify(0), feeBasisPoints: 0 };\n if (!fromAmount || !swapTokenAddress || !infoTokens || !flpPrice || !usdfSupply || !totalTokenWeights) {\n return defaultValue;\n }\n\n const swapToken = getTokenInfo(infoTokens, swapTokenAddress);\n if (!swapToken || !swapToken.minPrice) {\n return defaultValue;\n }\n\n let flpAmount = fromAmount.mul(swapToken.minPrice).div(flpPrice);\n flpAmount = adjustForDecimals(flpAmount, swapToken.decimals, USDF_DECIMALS);\n\n let usdfAmount = fromAmount.mul(swapToken.minPrice).div(PRECISION);\n usdfAmount = adjustForDecimals(usdfAmount, swapToken.decimals, USDF_DECIMALS);\n const feeBasisPoints = getFeeBasisPoints(\n swapToken,\n usdfAmount,\n MINT_BURN_FEE_BASIS_POINTS,\n TAX_BASIS_POINTS,\n true,\n usdfSupply,\n totalTokenWeights\n );\n\n flpAmount = flpAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR);\n\n return { amount: flpAmount, feeBasisPoints };\n}\n\nexport function getSellFlpFromAmount(toAmount, swapTokenAddress, infoTokens, flpPrice, usdfSupply, totalTokenWeights) {\n const defaultValue = { amount: bigNumberify(0), feeBasisPoints: 0 };\n if (!toAmount || !swapTokenAddress || !infoTokens || !flpPrice || !usdfSupply || !totalTokenWeights) {\n return defaultValue;\n }\n\n const swapToken = getTokenInfo(infoTokens, swapTokenAddress);\n if (!swapToken || !swapToken.maxPrice) {\n return defaultValue;\n }\n\n let flpAmount = toAmount.mul(swapToken.maxPrice).div(flpPrice);\n flpAmount = adjustForDecimals(flpAmount, swapToken.decimals, USDF_DECIMALS);\n\n let usdfAmount = toAmount.mul(swapToken.maxPrice).div(PRECISION);\n usdfAmount = adjustForDecimals(usdfAmount, swapToken.decimals, USDF_DECIMALS);\n const feeBasisPoints = getFeeBasisPoints(\n swapToken,\n usdfAmount,\n MINT_BURN_FEE_BASIS_POINTS,\n TAX_BASIS_POINTS,\n false,\n usdfSupply,\n totalTokenWeights\n );\n\n flpAmount = flpAmount.mul(BASIS_POINTS_DIVISOR).div(BASIS_POINTS_DIVISOR - feeBasisPoints);\n\n return { amount: flpAmount, feeBasisPoints };\n}\n\nexport function getBuyFlpFromAmount(toAmount, fromTokenAddress, infoTokens, flpPrice, usdfSupply, totalTokenWeights) {\n const defaultValue = { amount: bigNumberify(0) };\n if (!toAmount || !fromTokenAddress || !infoTokens || !flpPrice || !usdfSupply || !totalTokenWeights) {\n return defaultValue;\n }\n\n const fromToken = getTokenInfo(infoTokens, fromTokenAddress);\n if (!fromToken || !fromToken.minPrice) {\n return defaultValue;\n }\n\n let fromAmount = toAmount.mul(flpPrice).div(fromToken.minPrice);\n fromAmount = adjustForDecimals(fromAmount, FLP_DECIMALS, fromToken.decimals);\n\n const usdfAmount = toAmount.mul(flpPrice).div(PRECISION);\n const feeBasisPoints = getFeeBasisPoints(\n fromToken,\n usdfAmount,\n MINT_BURN_FEE_BASIS_POINTS,\n TAX_BASIS_POINTS,\n true,\n usdfSupply,\n totalTokenWeights\n );\n\n fromAmount = fromAmount.mul(BASIS_POINTS_DIVISOR).div(BASIS_POINTS_DIVISOR - feeBasisPoints);\n\n return { amount: fromAmount, feeBasisPoints };\n}\n\nexport function getSellFlpToAmount(toAmount, fromTokenAddress, infoTokens, flpPrice, usdfSupply, totalTokenWeights) {\n const defaultValue = { amount: bigNumberify(0) };\n if (!toAmount || !fromTokenAddress || !infoTokens || !flpPrice || !usdfSupply || !totalTokenWeights) {\n return defaultValue;\n }\n\n const fromToken = getTokenInfo(infoTokens, fromTokenAddress);\n if (!fromToken || !fromToken.maxPrice) {\n return defaultValue;\n }\n\n let fromAmount = toAmount.mul(flpPrice).div(fromToken.maxPrice);\n fromAmount = adjustForDecimals(fromAmount, FLP_DECIMALS, fromToken.decimals);\n\n const usdfAmount = toAmount.mul(flpPrice).div(PRECISION);\n const feeBasisPoints = getFeeBasisPoints(\n fromToken,\n usdfAmount,\n MINT_BURN_FEE_BASIS_POINTS,\n TAX_BASIS_POINTS,\n false,\n usdfSupply,\n totalTokenWeights\n );\n\n fromAmount = fromAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR);\n\n return { amount: fromAmount, feeBasisPoints };\n}\n\nexport function getNextFromAmount(\n chainId,\n toAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n toTokenPriceUsd,\n ratio,\n usdfSupply,\n totalTokenWeights,\n forSwap\n) {\n const defaultValue = { amount: bigNumberify(0) };\n\n if (!toAmount || !fromTokenAddress || !toTokenAddress || !infoTokens) {\n return defaultValue;\n }\n\n if (fromTokenAddress === toTokenAddress) {\n return { amount: toAmount };\n }\n\n const fromToken = getTokenInfo(infoTokens, fromTokenAddress);\n const toToken = getTokenInfo(infoTokens, toTokenAddress);\n\n if (fromToken.isNative && toToken.isWrapped) {\n return { amount: toAmount };\n }\n\n if (fromToken.isWrapped && toToken.isNative) {\n return { amount: toAmount };\n }\n\n // the realtime price should be used if it is for a transaction to open / close a position\n // or if the transaction involves doing a swap and opening / closing a position\n // otherwise use the contract price instead of realtime price for swaps\n\n let fromTokenMinPrice;\n if (fromToken) {\n fromTokenMinPrice = forSwap ? fromToken.contractMinPrice : fromToken.minPrice;\n }\n\n let toTokenMaxPrice;\n if (toToken) {\n toTokenMaxPrice = forSwap ? toToken.contractMaxPrice : toToken.maxPrice;\n }\n\n if (!fromToken || !fromTokenMinPrice || !toToken || !toTokenMaxPrice) {\n return defaultValue;\n }\n\n const adjustDecimals = adjustForDecimalsFactory(fromToken.decimals - toToken.decimals);\n\n let fromAmountBasedOnRatio;\n if (ratio && !ratio.isZero()) {\n fromAmountBasedOnRatio = toAmount.mul(ratio).div(PRECISION);\n }\n\n const fromAmount =\n ratio && !ratio.isZero() ? fromAmountBasedOnRatio : toAmount.mul(toTokenMaxPrice).div(fromTokenMinPrice);\n\n let usdfAmount = fromAmount.mul(fromTokenMinPrice).div(PRECISION);\n usdfAmount = adjustForDecimals(usdfAmount, toToken.decimals, USDF_DECIMALS);\n const swapFeeBasisPoints =\n fromToken.isStable && toToken.isStable ? STABLE_SWAP_FEE_BASIS_POINTS : SWAP_FEE_BASIS_POINTS;\n const taxBasisPoints = fromToken.isStable && toToken.isStable ? STABLE_TAX_BASIS_POINTS : TAX_BASIS_POINTS;\n const feeBasisPoints0 = getFeeBasisPoints(\n fromToken,\n usdfAmount,\n swapFeeBasisPoints,\n taxBasisPoints,\n true,\n usdfSupply,\n totalTokenWeights\n );\n const feeBasisPoints1 = getFeeBasisPoints(\n toToken,\n usdfAmount,\n swapFeeBasisPoints,\n taxBasisPoints,\n false,\n usdfSupply,\n totalTokenWeights\n );\n const feeBasisPoints = feeBasisPoints0 > feeBasisPoints1 ? feeBasisPoints0 : feeBasisPoints1;\n\n return {\n amount: adjustDecimals(fromAmount.mul(BASIS_POINTS_DIVISOR).div(BASIS_POINTS_DIVISOR - feeBasisPoints)),\n feeBasisPoints,\n };\n}\n\nexport function getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n toTokenPriceUsd,\n ratio,\n usdfSupply,\n totalTokenWeights,\n forSwap\n) {\n const defaultValue = { amount: bigNumberify(0) };\n if (!fromAmount || !fromTokenAddress || !toTokenAddress || !infoTokens) {\n return defaultValue;\n }\n\n if (fromTokenAddress === toTokenAddress) {\n return { amount: fromAmount };\n }\n\n const fromToken = getTokenInfo(infoTokens, fromTokenAddress);\n const toToken = getTokenInfo(infoTokens, toTokenAddress);\n\n if (fromToken.isNative && toToken.isWrapped) {\n return { amount: fromAmount };\n }\n\n if (fromToken.isWrapped && toToken.isNative) {\n return { amount: fromAmount };\n }\n\n // the realtime price should be used if it is for a transaction to open / close a position\n // or if the transaction involves doing a swap and opening / closing a position\n // otherwise use the contract price instead of realtime price for swaps\n\n let fromTokenMinPrice;\n if (fromToken) {\n fromTokenMinPrice = forSwap ? fromToken.contractMinPrice : fromToken.minPrice;\n }\n\n let toTokenMaxPrice;\n if (toToken) {\n toTokenMaxPrice = forSwap ? toToken.contractMaxPrice : toToken.maxPrice;\n }\n\n if (!fromTokenMinPrice || !toTokenMaxPrice) {\n return defaultValue;\n }\n\n const adjustDecimals = adjustForDecimalsFactory(toToken.decimals - fromToken.decimals);\n\n let toAmountBasedOnRatio = bigNumberify(0);\n if (ratio && !ratio.isZero()) {\n toAmountBasedOnRatio = fromAmount.mul(PRECISION).div(ratio);\n }\n\n if (toTokenAddress === USDF_ADDRESS) {\n const feeBasisPoints = getSwapFeeBasisPoints(fromToken.isStable);\n\n if (ratio && !ratio.isZero()) {\n const toAmount = toAmountBasedOnRatio;\n return {\n amount: adjustDecimals(toAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR)),\n feeBasisPoints,\n };\n }\n\n const toAmount = fromAmount.mul(fromTokenMinPrice).div(PRECISION);\n return {\n amount: adjustDecimals(toAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR)),\n feeBasisPoints,\n };\n }\n\n if (fromTokenAddress === USDF_ADDRESS) {\n const redemptionValue = toToken.redemptionAmount\n .mul(toTokenPriceUsd || toTokenMaxPrice)\n .div(expandDecimals(1, toToken.decimals));\n\n if (redemptionValue.gt(THRESHOLD_REDEMPTION_VALUE)) {\n const feeBasisPoints = getSwapFeeBasisPoints(toToken.isStable);\n\n const toAmount =\n ratio && !ratio.isZero()\n ? toAmountBasedOnRatio\n : fromAmount.mul(toToken.redemptionAmount).div(expandDecimals(1, toToken.decimals));\n\n return {\n amount: adjustDecimals(toAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR)),\n feeBasisPoints,\n };\n }\n\n const expectedAmount = fromAmount;\n\n const stableToken = getMostAbundantStableToken(chainId, infoTokens);\n if (!stableToken || stableToken.availableAmount.lt(expectedAmount)) {\n const toAmount =\n ratio && !ratio.isZero()\n ? toAmountBasedOnRatio\n : fromAmount.mul(toToken.redemptionAmount).div(expandDecimals(1, toToken.decimals));\n const feeBasisPoints = getSwapFeeBasisPoints(toToken.isStable);\n return {\n amount: adjustDecimals(toAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR)),\n feeBasisPoints,\n };\n }\n\n const feeBasisPoints0 = getSwapFeeBasisPoints(true);\n const feeBasisPoints1 = getSwapFeeBasisPoints(false);\n\n if (ratio && !ratio.isZero()) {\n const toAmount = toAmountBasedOnRatio\n .mul(BASIS_POINTS_DIVISOR - feeBasisPoints0 - feeBasisPoints1)\n .div(BASIS_POINTS_DIVISOR);\n return {\n amount: adjustDecimals(toAmount),\n path: [USDF_ADDRESS, stableToken.address, toToken.address],\n feeBasisPoints: feeBasisPoints0 + feeBasisPoints1,\n };\n }\n\n // get toAmount for USDF => stableToken\n let toAmount = fromAmount.mul(PRECISION).div(stableToken.maxPrice);\n // apply USDF => stableToken fees\n toAmount = toAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints0).div(BASIS_POINTS_DIVISOR);\n\n // get toAmount for stableToken => toToken\n toAmount = toAmount.mul(stableToken.minPrice).div(toTokenPriceUsd || toTokenMaxPrice);\n // apply stableToken => toToken fees\n toAmount = toAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints1).div(BASIS_POINTS_DIVISOR);\n\n return {\n amount: adjustDecimals(toAmount),\n path: [USDF_ADDRESS, stableToken.address, toToken.address],\n feeBasisPoints: feeBasisPoints0 + feeBasisPoints1,\n };\n }\n\n const toAmount =\n ratio && !ratio.isZero()\n ? toAmountBasedOnRatio\n : fromAmount.mul(fromTokenMinPrice).div(toTokenPriceUsd || toTokenMaxPrice);\n\n let usdfAmount = fromAmount.mul(fromTokenMinPrice).div(PRECISION);\n usdfAmount = adjustForDecimals(usdfAmount, fromToken.decimals, USDF_DECIMALS);\n const swapFeeBasisPoints =\n fromToken.isStable && toToken.isStable ? STABLE_SWAP_FEE_BASIS_POINTS : SWAP_FEE_BASIS_POINTS;\n const taxBasisPoints = fromToken.isStable && toToken.isStable ? STABLE_TAX_BASIS_POINTS : TAX_BASIS_POINTS;\n const feeBasisPoints0 = getFeeBasisPoints(\n fromToken,\n usdfAmount,\n swapFeeBasisPoints,\n taxBasisPoints,\n true,\n usdfSupply,\n totalTokenWeights\n );\n const feeBasisPoints1 = getFeeBasisPoints(\n toToken,\n usdfAmount,\n swapFeeBasisPoints,\n taxBasisPoints,\n false,\n usdfSupply,\n totalTokenWeights\n );\n const feeBasisPoints = feeBasisPoints0 > feeBasisPoints1 ? feeBasisPoints0 : feeBasisPoints1;\n\n return {\n amount: adjustDecimals(toAmount.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR)),\n feeBasisPoints,\n };\n}\n\nexport function getProfitPrice(closePrice, position) {\n let profitPrice;\n if (position && position.averagePrice && closePrice) {\n profitPrice = position.isLong\n ? position.averagePrice.mul(BASIS_POINTS_DIVISOR + MIN_PROFIT_BIPS).div(BASIS_POINTS_DIVISOR)\n : position.averagePrice.mul(BASIS_POINTS_DIVISOR - MIN_PROFIT_BIPS).div(BASIS_POINTS_DIVISOR);\n }\n return profitPrice;\n}\n\nexport function calculatePositionDelta(\n price,\n { size, collateral, isLong, averagePrice, lastIncreasedTime },\n sizeDelta\n) {\n if (!sizeDelta) {\n sizeDelta = size;\n }\n const priceDelta = averagePrice.gt(price) ? averagePrice.sub(price) : price.sub(averagePrice);\n let delta = sizeDelta.mul(priceDelta).div(averagePrice);\n const pendingDelta = delta;\n\n const minProfitExpired = lastIncreasedTime + MIN_PROFIT_TIME < Date.now() / 1000;\n const hasProfit = isLong ? price.gt(averagePrice) : price.lt(averagePrice);\n if (!minProfitExpired && hasProfit && delta.mul(BASIS_POINTS_DIVISOR).lte(size.mul(MIN_PROFIT_BIPS))) {\n delta = bigNumberify(0);\n }\n\n const deltaPercentage = delta.mul(BASIS_POINTS_DIVISOR).div(collateral);\n const pendingDeltaPercentage = pendingDelta.mul(BASIS_POINTS_DIVISOR).div(collateral);\n\n return {\n delta,\n pendingDelta,\n pendingDeltaPercentage,\n hasProfit,\n deltaPercentage,\n };\n}\n\nexport function getDeltaStr({ delta, deltaPercentage, hasProfit }) {\n let deltaStr;\n let deltaPercentageStr;\n\n if (delta.gt(0)) {\n deltaStr = hasProfit ? \"+\" : \"-\";\n deltaPercentageStr = hasProfit ? \"+\" : \"-\";\n } else {\n deltaStr = \"\";\n deltaPercentageStr = \"\";\n }\n deltaStr += `$${formatAmount(delta, USD_DECIMALS, 2, true)}`;\n deltaPercentageStr += `${formatAmount(deltaPercentage, 2, 2)}%`;\n\n return { deltaStr, deltaPercentageStr };\n}\n\nexport function getLeverage({\n size,\n sizeDelta,\n increaseSize,\n collateral,\n collateralDelta,\n increaseCollateral,\n entryFundingRate,\n cumulativeFundingRate,\n hasProfit,\n delta,\n includeDelta,\n}) {\n if (!size && !sizeDelta) {\n return;\n }\n if (!collateral && !collateralDelta) {\n return;\n }\n\n let nextSize = size ? size : bigNumberify(0);\n if (sizeDelta) {\n if (increaseSize) {\n nextSize = size.add(sizeDelta);\n } else {\n if (sizeDelta.gte(size)) {\n return;\n }\n nextSize = size.sub(sizeDelta);\n }\n }\n\n let remainingCollateral = collateral ? collateral : bigNumberify(0);\n if (collateralDelta) {\n if (increaseCollateral) {\n remainingCollateral = collateral.add(collateralDelta);\n } else {\n if (collateralDelta.gte(collateral)) {\n return;\n }\n remainingCollateral = collateral.sub(collateralDelta);\n }\n }\n\n if (delta && includeDelta) {\n if (hasProfit) {\n remainingCollateral = remainingCollateral.add(delta);\n } else {\n if (delta.gt(remainingCollateral)) {\n return;\n }\n\n remainingCollateral = remainingCollateral.sub(delta);\n }\n }\n\n if (remainingCollateral.eq(0)) {\n return;\n }\n\n remainingCollateral = sizeDelta\n ? remainingCollateral.mul(BASIS_POINTS_DIVISOR - MARGIN_FEE_BASIS_POINTS).div(BASIS_POINTS_DIVISOR)\n : remainingCollateral;\n if (entryFundingRate && cumulativeFundingRate) {\n const fundingFee = size.mul(cumulativeFundingRate.sub(entryFundingRate)).div(FUNDING_RATE_PRECISION);\n remainingCollateral = remainingCollateral.sub(fundingFee);\n }\n\n return nextSize.mul(BASIS_POINTS_DIVISOR).div(remainingCollateral);\n}\n\nexport function getLiquidationPrice(data) {\n let {\n isLong,\n size,\n collateral,\n averagePrice,\n entryFundingRate,\n cumulativeFundingRate,\n sizeDelta,\n collateralDelta,\n increaseCollateral,\n increaseSize,\n delta,\n hasProfit,\n includeDelta,\n } = data;\n if (!size || !collateral || !averagePrice) {\n return;\n }\n\n let nextSize = size ? size : bigNumberify(0);\n let remainingCollateral = collateral;\n\n if (sizeDelta) {\n if (increaseSize) {\n nextSize = size.add(sizeDelta);\n } else {\n if (sizeDelta.gte(size)) {\n return;\n }\n nextSize = size.sub(sizeDelta);\n }\n\n if (includeDelta && !hasProfit) {\n const adjustedDelta = sizeDelta.mul(delta).div(size);\n remainingCollateral = remainingCollateral.sub(adjustedDelta);\n }\n }\n\n if (collateralDelta) {\n if (increaseCollateral) {\n remainingCollateral = remainingCollateral.add(collateralDelta);\n } else {\n if (collateralDelta.gte(remainingCollateral)) {\n return;\n }\n remainingCollateral = remainingCollateral.sub(collateralDelta);\n }\n }\n\n let positionFee = getMarginFee(size).add(LIQUIDATION_FEE);\n if (entryFundingRate && cumulativeFundingRate) {\n const fundingFee = size.mul(cumulativeFundingRate.sub(entryFundingRate)).div(FUNDING_RATE_PRECISION);\n positionFee = positionFee.add(fundingFee);\n }\n\n const liquidationPriceForFees = getLiquidationPriceFromDelta({\n liquidationAmount: positionFee,\n size: nextSize,\n collateral: remainingCollateral,\n averagePrice,\n isLong,\n });\n\n const liquidationPriceForMaxLeverage = getLiquidationPriceFromDelta({\n liquidationAmount: nextSize.mul(BASIS_POINTS_DIVISOR).div(MAX_LEVERAGE),\n size: nextSize,\n collateral: remainingCollateral,\n averagePrice,\n isLong,\n });\n\n if (!liquidationPriceForFees) {\n return liquidationPriceForMaxLeverage;\n }\n if (!liquidationPriceForMaxLeverage) {\n return liquidationPriceForFees;\n }\n\n if (isLong) {\n // return the higher price\n return liquidationPriceForFees.gt(liquidationPriceForMaxLeverage)\n ? liquidationPriceForFees\n : liquidationPriceForMaxLeverage;\n }\n\n // return the lower price\n return liquidationPriceForFees.lt(liquidationPriceForMaxLeverage)\n ? liquidationPriceForFees\n : liquidationPriceForMaxLeverage;\n}\n\nexport function getPositionKey(account, collateralTokenAddress, indexTokenAddress, isLong, nativeTokenAddress) {\n const tokenAddress0 = collateralTokenAddress === AddressZero ? nativeTokenAddress : collateralTokenAddress;\n const tokenAddress1 = indexTokenAddress === AddressZero ? nativeTokenAddress : indexTokenAddress;\n return account + \":\" + tokenAddress0 + \":\" + tokenAddress1 + \":\" + isLong;\n}\n\nexport function getPositionContractKey(account, collateralToken, indexToken, isLong) {\n return ethers.utils.solidityKeccak256(\n [\"address\", \"address\", \"address\", \"bool\"],\n [account, collateralToken, indexToken, isLong]\n );\n}\n\nexport function getSwapFeeBasisPoints(isStable) {\n return isStable ? STABLE_SWAP_FEE_BASIS_POINTS : SWAP_FEE_BASIS_POINTS;\n}\n\nexport function shortenAddress(address, length) {\n if (!length) {\n return \"\";\n }\n if (!address) {\n return address;\n }\n if (address.length < 10) {\n return address;\n }\n let left = Math.floor((length - 3) / 2) + 1;\n return address.substring(0, left) + \"...\" + address.substring(address.length - (length - (left + 3)), address.length);\n}\n\nexport function useENS(address) {\n const [ensName, setENSName] = useState();\n\n useEffect(() => {\n async function resolveENS() {\n if (address) {\n const provider = new ethers.providers.JsonRpcProvider(\"https://rpc.ankr.com/eth\");\n const name = await provider.lookupAddress(address.toLowerCase());\n if (name) setENSName(name);\n }\n }\n resolveENS();\n }, [address]);\n\n return { ensName };\n}\n\nfunction _parseOrdersData(ordersData, account, indexes, extractor, uintPropsLength, addressPropsLength) {\n if (!ordersData || ordersData.length === 0) {\n return [];\n }\n const [uintProps, addressProps] = ordersData;\n const count = uintProps.length / uintPropsLength;\n\n const orders = [];\n for (let i = 0; i < count; i++) {\n const sliced = addressProps\n .slice(addressPropsLength * i, addressPropsLength * (i + 1))\n .concat(uintProps.slice(uintPropsLength * i, uintPropsLength * (i + 1)));\n\n if (sliced[0] === AddressZero && sliced[1] === AddressZero) {\n continue;\n }\n\n const order = extractor(sliced);\n order.index = indexes[i];\n order.account = account;\n orders.push(order);\n }\n\n return orders;\n}\n\nfunction parseDecreaseOrdersData(chainId, decreaseOrdersData, account, indexes) {\n const extractor = (sliced) => {\n const isLong = sliced[4].toString() === \"1\";\n return {\n collateralToken: sliced[0],\n indexToken: sliced[1],\n collateralDelta: sliced[2],\n sizeDelta: sliced[3],\n isLong,\n triggerPrice: sliced[5],\n triggerAboveThreshold: sliced[6].toString() === \"1\",\n type: DECREASE,\n };\n };\n return _parseOrdersData(decreaseOrdersData, account, indexes, extractor, 5, 2).filter((order) => {\n return isValidToken(chainId, order.collateralToken) && isValidToken(chainId, order.indexToken);\n });\n}\n\nfunction parseIncreaseOrdersData(chainId, increaseOrdersData, account, indexes) {\n const extractor = (sliced) => {\n const isLong = sliced[5].toString() === \"1\";\n return {\n purchaseToken: sliced[0],\n collateralToken: sliced[1],\n indexToken: sliced[2],\n purchaseTokenAmount: sliced[3],\n sizeDelta: sliced[4],\n isLong,\n triggerPrice: sliced[6],\n triggerAboveThreshold: sliced[7].toString() === \"1\",\n type: INCREASE,\n };\n };\n return _parseOrdersData(increaseOrdersData, account, indexes, extractor, 5, 3).filter((order) => {\n return (\n isValidToken(chainId, order.purchaseToken) &&\n isValidToken(chainId, order.collateralToken) &&\n isValidToken(chainId, order.indexToken)\n );\n });\n}\n\nfunction parseSwapOrdersData(chainId, swapOrdersData, account, indexes) {\n if (!swapOrdersData || !swapOrdersData.length) {\n return [];\n }\n\n const extractor = (sliced) => {\n const triggerAboveThreshold = sliced[6].toString() === \"1\";\n const shouldUnwrap = sliced[7].toString() === \"1\";\n\n return {\n path: [sliced[0], sliced[1], sliced[2]].filter((address) => address !== AddressZero),\n amountIn: sliced[3],\n minOut: sliced[4],\n triggerRatio: sliced[5],\n triggerAboveThreshold,\n type: SWAP,\n shouldUnwrap,\n };\n };\n return _parseOrdersData(swapOrdersData, account, indexes, extractor, 5, 3).filter((order) => {\n return order.path.every((token) => isValidToken(chainId, token));\n });\n}\n\nexport function getOrderKey(order) {\n return `${order.type}-${order.account}-${order.index}`;\n}\n\nexport function useAccountOrders(flagOrdersEnabled, overrideAccount) {\n const { library, account: connectedAccount } = useWeb3React();\n const active = true; // this is used in Actions.js so set active to always be true\n const account = overrideAccount || connectedAccount;\n\n const { chainId } = useChainId();\n const shouldRequest = active && account && flagOrdersEnabled;\n\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const orderBookReaderAddress = getContract(chainId, \"OrderBookReader\");\n const key = shouldRequest ? [active, chainId, orderBookAddress, account] : false;\n const {\n data: orders = [],\n mutate: updateOrders,\n error: ordersError,\n } = useSWR(key, {\n dedupingInterval: 5000,\n fetcher: async (active, chainId, orderBookAddress, account) => {\n const provider = getProvider(library, chainId);\n const orderBookContract = new ethers.Contract(orderBookAddress, OrderBook.abi, provider);\n const orderBookReaderContract = new ethers.Contract(orderBookReaderAddress, OrderBookReader.abi, provider);\n\n const fetchIndexesFromServer = () => {\n const ordersIndexesUrl = `${getServerBaseUrl(chainId)}/orders_indices?account=${account}`;\n return fetch(ordersIndexesUrl)\n .then(async (res) => {\n const json = await res.json();\n const ret = {};\n for (const key of Object.keys(json)) {\n ret[key.toLowerCase()] = json[key].map((val) => parseInt(val.value)).sort((a, b) => a - b);\n }\n\n return ret;\n })\n .catch(() => ({ swap: [], increase: [], decrease: [] }));\n };\n\n const fetchLastIndex = async (type) => {\n const method = type.toLowerCase() + \"OrdersIndex\";\n return await orderBookContract[method](account).then((res) => bigNumberify(res._hex).toNumber());\n };\n\n const fetchLastIndexes = async () => {\n const [swap, increase, decrease] = await Promise.all([\n fetchLastIndex(\"swap\"),\n fetchLastIndex(\"increase\"),\n fetchLastIndex(\"decrease\"),\n ]);\n\n return { swap, increase, decrease };\n };\n\n const getRange = (to, from) => {\n const LIMIT = 10;\n const _indexes = [];\n from = from || Math.max(to - LIMIT, 0);\n for (let i = to - 1; i >= from; i--) {\n _indexes.push(i);\n }\n return _indexes;\n };\n\n const getIndexes = (knownIndexes, lastIndex) => {\n if (knownIndexes.length === 0) {\n return getRange(lastIndex);\n }\n return [\n ...knownIndexes,\n ...getRange(lastIndex, knownIndexes[knownIndexes.length - 1] + 1).sort((a, b) => b - a),\n ];\n };\n\n const getOrders = async (method, knownIndexes, lastIndex, parseFunc) => {\n const indexes = getIndexes(knownIndexes, lastIndex);\n const ordersData = await orderBookReaderContract[method](orderBookAddress, account, indexes);\n const orders = parseFunc(chainId, ordersData, account, indexes);\n\n return orders;\n };\n\n try {\n const [serverIndexes, lastIndexes] = await Promise.all([fetchIndexesFromServer(), fetchLastIndexes()]);\n const [swapOrders = [], increaseOrders = [], decreaseOrders = []] = await Promise.all([\n getOrders(\"getSwapOrders\", serverIndexes.swap, lastIndexes.swap, parseSwapOrdersData),\n getOrders(\"getIncreaseOrders\", serverIndexes.increase, lastIndexes.increase, parseIncreaseOrdersData),\n getOrders(\"getDecreaseOrders\", serverIndexes.decrease, lastIndexes.decrease, parseDecreaseOrdersData),\n ]);\n return [...swapOrders, ...increaseOrders, ...decreaseOrders];\n } catch (ex) {\n console.error(ex);\n }\n },\n });\n\n return [orders, updateOrders, ordersError];\n}\n\nexport function getAccountUrl(chainId, account) {\n if (!account) {\n return getExplorerUrl(chainId);\n }\n return getExplorerUrl(chainId) + \"address/\" + account;\n}\n\nexport function isMobileDevice(navigator) {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\nexport const CHART_PERIODS = {\n \"5m\": 60 * 5,\n \"15m\": 60 * 15,\n \"1h\": 60 * 60,\n \"4h\": 60 * 60 * 4,\n \"1d\": 60 * 60 * 24,\n};\n\nexport function getTotalVolumeSum(volumes) {\n if (!volumes || volumes.length === 0) {\n return bigNumberify(0);\n }\n\n let volume = bigNumberify(0);\n\n for (let i = 0; i < volumes.length; i++) {\n volume = volume.add(volumes[i].data.volume);\n }\n\n return volume;\n}\n\nexport function getBalanceAndSupplyData(balances) {\n if (!balances || balances.length === 0) {\n return {};\n }\n\n const keys = [\"fxdx\", \"esFxdx\", \"flp\", \"stakedFxdxTracker\"];\n const balanceData = {};\n const supplyData = {};\n const propsLength = 2;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n balanceData[key] = balances[i * propsLength];\n supplyData[key] = balances[i * propsLength + 1];\n }\n\n return { balanceData, supplyData };\n}\n\nexport function getDepositBalanceData(depositBalances) {\n if (!depositBalances || depositBalances.length === 0) {\n return;\n }\n\n const keys = [\n \"fxdxInStakedFxdx\",\n \"esFxdxInStakedFxdx\",\n \"stakedFxdxInBonusFxdx\",\n \"bonusFxdxInFeeFxdx\",\n \"bnFxdxInFeeFxdx\",\n \"flpInStakedFlp\",\n ];\n const data = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n data[key] = depositBalances[i];\n }\n\n return data;\n}\n\nexport function getVestingData(vestingInfo) {\n if (!vestingInfo || vestingInfo.length === 0) {\n return;\n }\n\n const keys = [\"fxdxVester\", \"flpVester\"];\n const data = {};\n const propsLength = 7;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n data[key] = {\n pairAmount: vestingInfo[i * propsLength],\n vestedAmount: vestingInfo[i * propsLength + 1],\n escrowedBalance: vestingInfo[i * propsLength + 2],\n claimedAmounts: vestingInfo[i * propsLength + 3],\n claimable: vestingInfo[i * propsLength + 4],\n maxVestableAmount: vestingInfo[i * propsLength + 5],\n averageStakedAmount: vestingInfo[i * propsLength + 6],\n };\n\n data[key + \"PairAmount\"] = data[key].pairAmount;\n data[key + \"VestedAmount\"] = data[key].vestedAmount;\n data[key + \"EscrowedBalance\"] = data[key].escrowedBalance;\n data[key + \"ClaimSum\"] = data[key].claimedAmounts.add(data[key].claimable);\n data[key + \"Claimable\"] = data[key].claimable;\n data[key + \"MaxVestableAmount\"] = data[key].maxVestableAmount;\n data[key + \"AverageStakedAmount\"] = data[key].averageStakedAmount;\n }\n\n return data;\n}\n\nexport function getStakingData(stakingInfo) {\n if (!stakingInfo || stakingInfo.length === 0) {\n return;\n }\n\n const keys = [\"stakedFxdxTracker\", \"bonusFxdxTracker\", \"feeFxdxTracker\", \"stakedFlpTracker\", \"feeFlpTracker\"];\n const data = {};\n const propsLength = 5;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n data[key] = {\n claimable: stakingInfo[i * propsLength],\n tokensPerInterval: stakingInfo[i * propsLength + 1],\n averageStakedAmounts: stakingInfo[i * propsLength + 2],\n cumulativeRewards: stakingInfo[i * propsLength + 3],\n totalSupply: stakingInfo[i * propsLength + 4],\n };\n }\n\n return data;\n}\n\nexport function getProcessedData(\n balanceData,\n supplyData,\n depositBalanceData,\n stakingData,\n vestingData,\n aum,\n nativeTokenPrice,\n stakedFxdxSupply,\n fxdxPrice,\n fxdxSupply\n) {\n if (\n !balanceData ||\n !supplyData ||\n !depositBalanceData ||\n !stakingData ||\n !vestingData ||\n !aum ||\n !nativeTokenPrice ||\n !stakedFxdxSupply ||\n !fxdxPrice ||\n !fxdxSupply\n ) {\n return {};\n }\n\n const data = {};\n\n data.fxdxBalance = balanceData.fxdx;\n data.fxdxBalanceUsd = balanceData.fxdx.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.fxdxSupply = bigNumberify(fxdxSupply);\n\n data.fxdxSupplyUsd = data.fxdxSupply.mul(fxdxPrice).div(expandDecimals(1, 18));\n data.stakedFxdxSupply = stakedFxdxSupply;\n data.stakedFxdxSupplyUsd = stakedFxdxSupply.mul(fxdxPrice).div(expandDecimals(1, 18));\n data.fxdxInStakedFxdx = depositBalanceData.fxdxInStakedFxdx;\n data.fxdxInStakedFxdxUsd = depositBalanceData.fxdxInStakedFxdx.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.esFxdxBalance = balanceData.esFxdx;\n data.esFxdxBalanceUsd = balanceData.esFxdx.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.stakedFxdxTrackerSupply = supplyData.stakedFxdxTracker;\n data.stakedFxdxTrackerSupplyUsd = supplyData.stakedFxdxTracker.mul(fxdxPrice).div(expandDecimals(1, 18));\n data.stakedEsFxdxSupply = data.stakedFxdxTrackerSupply.sub(data.stakedFxdxSupply);\n data.stakedEsFxdxSupplyUsd = data.stakedEsFxdxSupply.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.esFxdxInStakedFxdx = depositBalanceData.esFxdxInStakedFxdx;\n data.esFxdxInStakedFxdxUsd = depositBalanceData.esFxdxInStakedFxdx.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.bnFxdxInFeeFxdx = depositBalanceData.bnFxdxInFeeFxdx;\n data.bonusFxdxInFeeFxdx = depositBalanceData.bonusFxdxInFeeFxdx;\n data.feeFxdxSupply = stakingData.feeFxdxTracker.totalSupply;\n data.feeFxdxSupplyUsd = data.feeFxdxSupply.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.stakedFxdxTrackerRewards = stakingData.stakedFxdxTracker.claimable;\n data.stakedFxdxTrackerRewardsUsd = stakingData.stakedFxdxTracker.claimable.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.bonusFxdxTrackerRewards = stakingData.bonusFxdxTracker.claimable;\n\n data.feeFxdxTrackerRewards = stakingData.feeFxdxTracker.claimable;\n data.feeFxdxTrackerRewardsUsd = stakingData.feeFxdxTracker.claimable.mul(nativeTokenPrice).div(expandDecimals(1, 18));\n\n data.boostBasisPoints = bigNumberify(0);\n if (data && data.bnFxdxInFeeFxdx && data.bonusFxdxInFeeFxdx && data.bonusFxdxInFeeFxdx.gt(0)) {\n data.boostBasisPoints = data.bnFxdxInFeeFxdx.mul(BASIS_POINTS_DIVISOR).div(data.bonusFxdxInFeeFxdx);\n }\n\n data.stakedFxdxTrackerAnnualRewardsUsd = stakingData.stakedFxdxTracker.tokensPerInterval\n .mul(SECONDS_PER_YEAR)\n .mul(fxdxPrice)\n .div(expandDecimals(1, 18));\n data.fxdxAprForEsFxdx =\n data.stakedFxdxTrackerSupplyUsd && data.stakedFxdxTrackerSupplyUsd.gt(0)\n ? data.stakedFxdxTrackerAnnualRewardsUsd.mul(BASIS_POINTS_DIVISOR).div(data.stakedFxdxTrackerSupplyUsd)\n : bigNumberify(0);\n data.feeFxdxTrackerAnnualRewardsUsd = stakingData.feeFxdxTracker.tokensPerInterval\n .mul(SECONDS_PER_YEAR)\n .mul(nativeTokenPrice)\n .div(expandDecimals(1, 18));\n data.fxdxAprForNativeToken =\n data.feeFxdxSupplyUsd && data.feeFxdxSupplyUsd.gt(0)\n ? data.feeFxdxTrackerAnnualRewardsUsd.mul(BASIS_POINTS_DIVISOR).div(data.feeFxdxSupplyUsd)\n : bigNumberify(0);\n data.fxdxBoostAprForNativeToken = data.fxdxAprForNativeToken.mul(data.boostBasisPoints).div(BASIS_POINTS_DIVISOR);\n data.fxdxAprTotal = data.fxdxAprForNativeToken.add(data.fxdxAprForEsFxdx);\n data.fxdxAprTotalWithBoost = data.fxdxAprForNativeToken.add(data.fxdxBoostAprForNativeToken).add(data.fxdxAprForEsFxdx);\n data.fxdxAprForNativeTokenWithBoost = data.fxdxAprForNativeToken.add(data.fxdxBoostAprForNativeToken);\n\n data.totalFxdxRewardsUsd = data.stakedFxdxTrackerRewardsUsd.add(data.feeFxdxTrackerRewardsUsd);\n\n data.flpSupply = supplyData.flp;\n data.flpPrice =\n data.flpSupply && data.flpSupply.gt(0)\n ? aum.mul(expandDecimals(1, FLP_DECIMALS)).div(data.flpSupply)\n : bigNumberify(0);\n\n data.flpSupplyUsd = supplyData.flp.mul(data.flpPrice).div(expandDecimals(1, 18));\n\n data.flpBalance = depositBalanceData.flpInStakedFlp;\n data.flpBalanceUsd = depositBalanceData.flpInStakedFlp.mul(data.flpPrice).div(expandDecimals(1, FLP_DECIMALS));\n\n data.stakedFlpTrackerRewards = stakingData.stakedFlpTracker.claimable;\n data.stakedFlpTrackerRewardsUsd = stakingData.stakedFlpTracker.claimable.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.feeFlpTrackerRewards = stakingData.feeFlpTracker.claimable;\n data.feeFlpTrackerRewardsUsd = stakingData.feeFlpTracker.claimable.mul(nativeTokenPrice).div(expandDecimals(1, 18));\n\n data.stakedFlpTrackerAnnualRewardsUsd = stakingData.stakedFlpTracker.tokensPerInterval\n .mul(SECONDS_PER_YEAR)\n .mul(fxdxPrice)\n .div(expandDecimals(1, 18));\n data.flpAprForEsFxdx =\n data.flpSupplyUsd && data.flpSupplyUsd.gt(0)\n ? data.stakedFlpTrackerAnnualRewardsUsd.mul(BASIS_POINTS_DIVISOR).div(data.flpSupplyUsd)\n : bigNumberify(0);\n data.feeFlpTrackerAnnualRewardsUsd = stakingData.feeFlpTracker.tokensPerInterval\n .mul(SECONDS_PER_YEAR)\n .mul(nativeTokenPrice)\n .div(expandDecimals(1, 18));\n data.flpAprForNativeToken =\n data.flpSupplyUsd && data.flpSupplyUsd.gt(0)\n ? data.feeFlpTrackerAnnualRewardsUsd.mul(BASIS_POINTS_DIVISOR).div(data.flpSupplyUsd)\n : bigNumberify(0);\n data.flpAprTotal = data.flpAprForNativeToken.add(data.flpAprForEsFxdx);\n\n data.totalFlpRewardsUsd = data.stakedFlpTrackerRewardsUsd.add(data.feeFlpTrackerRewardsUsd);\n\n data.totalEsFxdxRewards = data.stakedFxdxTrackerRewards.add(data.stakedFlpTrackerRewards);\n data.totalEsFxdxRewardsUsd = data.stakedFxdxTrackerRewardsUsd.add(data.stakedFlpTrackerRewardsUsd);\n\n data.fxdxVesterRewards = vestingData.fxdxVester.claimable;\n data.flpVesterRewards = vestingData.flpVester.claimable;\n data.totalVesterRewards = data.fxdxVesterRewards.add(data.flpVesterRewards);\n data.totalVesterRewardsUsd = data.totalVesterRewards.mul(fxdxPrice).div(expandDecimals(1, 18));\n\n data.totalNativeTokenRewards = data.feeFxdxTrackerRewards.add(data.feeFlpTrackerRewards);\n data.totalNativeTokenRewardsUsd = data.feeFxdxTrackerRewardsUsd.add(data.feeFlpTrackerRewardsUsd);\n\n data.totalRewardsUsd = data.totalEsFxdxRewardsUsd.add(data.totalNativeTokenRewardsUsd).add(data.totalVesterRewardsUsd);\n\n return data;\n}\n\nexport function getPageTitle(data) {\n return `${data} | Decentralized\n Perpetual Exchange | FXDX`;\n}\n\nexport function isHashZero(value) {\n return value === ethers.constants.HashZero;\n}\nexport function isAddressZero(value) {\n return value === ethers.constants.AddressZero;\n}\n\nexport function isDevelopment() {\n return !window.location.host?.includes(\"fxdx.exchange\") && !window.location.host?.includes(\"ipfs.io\");\n}\n\nexport function isLocal() {\n return window.location.host?.includes(\"localhost\");\n}\n\nexport function getHomeUrl() {\n if (isLocal()) {\n return \"http://localhost:3010\";\n }\n\n return \"https://fxdx.exchange\";\n}\n\nexport function getAppBaseUrl() {\n if (isLocal()) {\n return \"http://localhost:3011/#\";\n }\n\n return IS_TESTNET ? \"https://test.fxdx.exchange\" : \"https://app.fxdx.exchange/\";\n}\n\nexport function getRootShareApiUrl() {\n if (isLocal()) {\n return \"https://fxdxs.vercel.app\";\n }\n\n return \"https://share.fxdx.exchange\";\n}\n\nexport function getTradePageUrl() {\n if (isLocal()) {\n return \"http://localhost:3011/trade\";\n }\n\n return IS_TESTNET ? \"https://test.fxdx.exchange/trade\" : \"https://app.fxdx.exchange/trade\";\n}\n\nexport function importImage(name) {\n let tokenImage = null;\n try {\n tokenImage = require(\"img/\" + name);\n } catch (error) {\n console.error(error);\n }\n return tokenImage.default;\n}\n\nexport function getTwitterIntentURL(text, url = \"\", hashtag = \"\") {\n let finalURL = \"https://twitter.com/intent/tweet?text=\";\n if (text.length > 0) {\n finalURL += Array.isArray(text) ? text.map((t) => encodeURIComponent(t)).join(\"%0a%0a\") : encodeURIComponent(text);\n if (hashtag.length > 0) {\n finalURL += \"&hashtags=\" + encodeURIComponent(hashtag.replace(/#/g, \"\"));\n }\n if (url.length > 0) {\n finalURL += \"&url=\" + encodeURIComponent(url);\n }\n }\n return finalURL;\n}\n\nexport function getPositionForOrder(account, order, positionsMap) {\n const key = getPositionKey(account, order.collateralToken, order.indexToken, order.isLong);\n const position = positionsMap[key];\n return position && position.size && position.size.gt(0) ? position : null;\n}\n\nexport function getOrderError(account, order, positionsMap, position) {\n if (order.type !== DECREASE) {\n return;\n }\n\n const positionForOrder = position ? position : getPositionForOrder(account, order, positionsMap);\n\n if (!positionForOrder) {\n return t`No open position, order cannot be executed unless a position is opened`;\n }\n if (positionForOrder.size.lt(order.sizeDelta)) {\n return t`Order size is bigger than position, will only be executable if position increases`;\n }\n\n if (positionForOrder.size.gt(order.sizeDelta)) {\n if (positionForOrder.size.sub(order.sizeDelta).lt(positionForOrder.collateral.sub(order.collateralDelta))) {\n return t`Order cannot be executed as it would reduce the position's leverage below 1`;\n }\n if (positionForOrder.size.sub(order.sizeDelta).lt(expandDecimals(5, USD_DECIMALS))) {\n return t`Order cannot be executed as the remaining position would be smaller than $5.00`;\n }\n }\n}\n\nexport function arrayURLFetcher(...urlArr) {\n const fetcher = (url) => fetch(url).then((res) => res.json());\n return Promise.all(urlArr.map(fetcher));\n}\n\nexport function shouldShowRedirectModal(timestamp) {\n const thirtyDays = 1000 * 60 * 60 * 24 * 30;\n const expiryTime = timestamp + thirtyDays;\n return !isValidTimestamp(timestamp) || Date.now() > expiryTime;\n}\n","import React from \"react\";\nimport cx from \"classnames\";\nimport { t } from \"@lingui/macro\";\nimport \"./Footer.css\";\n// import logoImg from \"img/ic_fxdx_footer.svg\";\nimport twitterIcon from \"img/ic_twitter.svg\";\nimport discordIcon from \"img/ic_discord.svg\";\nimport telegramIcon from \"img/ic_telegram.svg\";\nimport githubIcon from \"img/ic_github.svg\";\nimport mediumIcon from \"img/ic_medium.svg\";\nimport { NavLink } from \"react-router-dom\";\nimport { isHomeSite, getAppBaseUrl, shouldShowRedirectModal } from \"lib/legacy\";\n\nconst footerLinks = {\n home: [\n { text: t`Terms and Conditions`, link: \"/terms-and-conditions\" },\n { text: t`Referral Terms`, link: \"/referral-terms\" },\n { text: t`Media Kit`, link: \"https://fxdx.gitbook.io/fxdx/media-kit\", external: true },\n // { text: \"Jobs\", link: \"/jobs\", isAppLink: true },\n ],\n app: [\n { text: t`Media Kit`, link: \"https://fxdx.gitbook.io/fxdx/media-kit\", external: true },\n // { text: \"Jobs\", link: \"/jobs\" },\n ],\n};\n\nconst socialLinks = [\n { link: \"https://twitter.com/fxdxdex\", name: \"Twitter\", icon: twitterIcon },\n { link: \"https://fxdxdex.medium.com\", name: \"Medium\", icon: mediumIcon },\n { link: \"https://github.com/fxdxdex\", name: \"Github\", icon: githubIcon },\n { link: \"https://t.me/fxdxdex\", name: \"Telegram\", icon: telegramIcon },\n { link: \"https://discord.gg/duDxNgKGaX\", name: \"Discord\", icon: discordIcon },\n];\n\nexport default function Footer({ showRedirectModal, redirectPopupTimestamp }) {\n const isHome = isHomeSite();\n\n return (\n
\n
\n {/*
\n \"MetaMask\"\n
*/}\n
\n {socialLinks.map((platform) => {\n return (\n \n {platform.name}\n \n );\n })}\n
\n
\n {footerLinks[isHome ? \"home\" : \"app\"].map(({ external, text, link, isAppLink }) => {\n if (external) {\n return (\n \n {text}\n \n );\n }\n if (isAppLink) {\n if (shouldShowRedirectModal(redirectPopupTimestamp)) {\n return (\n
showRedirectModal(link)}>\n {text}\n
\n );\n } else {\n const baseUrl = getAppBaseUrl();\n return (\n \n {text}\n \n );\n }\n }\n return (\n \n {text}\n \n );\n })}\n
\n
\n
\n );\n}\n","export const REDIRECT_POPUP_TIMESTAMP_KEY = \"redirect-popup-timestamp\";\n\nexport const IS_TOUCH = \"ontouchstart\" in window;\n\nexport const UI_VERSION = \"1.4\";\n\nexport const TRIGGER_PREFIX_ABOVE = \">\";\nexport const TRIGGER_PREFIX_BELOW = \"<\";\n","import { ApolloClient, InMemoryCache } from \"@apollo/client\";\n\nexport function createClient(uri: string) {\n return new ApolloClient({\n uri,\n cache: new InMemoryCache(),\n });\n}\n","import { ARBITRUM, AVALANCHE, GOERLI, MOONBEAM, MUMBAI } from \"./chains\";\n\nexport const SUBGRAPH_URLS = {\n [GOERLI]: {\n stats: \"https://api.thegraph.com/subgraphs/name/nuthan2x/fxdx-goerli-stats\",\n referrals: \"https://api.thegraph.com/subgraphs/name/nuthan2x/fxdx-goerli-referrals\",\n },\n \n [ARBITRUM]: {\n stats: \"https://api.thegraph.com/subgraphs/name/fxdx-io/fxdx-stats\",\n referrals: \"https://api.thegraph.com/subgraphs/name/fxdxdex/fxdx-arbitrum-referrals\",\n nissohVault: \"https://api.thegraph.com/subgraphs/name/nissoh/fxdx-vault\",\n },\n \n [AVALANCHE]: {\n stats: \"https://api.thegraph.com/subgraphs/name/fxdx-io/fxdx-avalanche-stats\",\n referrals: \"https://api.thegraph.com/subgraphs/name/fxdxdex/fxdx-avalanche-referrals\",\n },\n \n [MOONBEAM]: {\n stats: \"https://api.thegraph.com/subgraphs/name/danielsmith0630/fxdx-moonbeam-stats\",\n referrals: \"https://api.thegraph.com/subgraphs/name/danielsmith0630/fxdx-moonbeam-referrals\",\n },\n \n [MUMBAI]: {\n stats: \"https://api.thegraph.com/subgraphs/name/nuthan2x/fxdx-mumbai-stats\",\n referrals: \"https://api.thegraph.com/subgraphs/name/nuthan2x/fxdx-mumbai-referrals\",\n },\n common: {\n chainLink: \"https://api.thegraph.com/subgraphs/name/deividask/chainlink\",\n },\n};\n","import { createClient } from \"./utils\";\nimport { SUBGRAPH_URLS } from \"config/subgraph\";\nimport { ARBITRUM, ARBITRUM_TESTNET, AVALANCHE, GOERLI, MOONBEAM, MUMBAI } from \"config/chains\";\n\nexport const chainlinkClient = createClient(SUBGRAPH_URLS.common.chainLink);\n\nexport const goerliGraphClient = createClient(SUBGRAPH_URLS[GOERLI].stats);\nexport const goerliReferralsGraphClient = createClient(SUBGRAPH_URLS[GOERLI].referrals);\n\nexport const arbitrumGraphClient = createClient(SUBGRAPH_URLS[ARBITRUM].stats);\nexport const arbitrumReferralsGraphClient = createClient(SUBGRAPH_URLS[ARBITRUM].referrals);\nexport const nissohGraphClient = createClient(SUBGRAPH_URLS[ARBITRUM].nissohVault);\n\nexport const avalancheGraphClient = createClient(SUBGRAPH_URLS[AVALANCHE].stats);\nexport const avalancheReferralsGraphClient = createClient(SUBGRAPH_URLS[AVALANCHE].referrals);\n\nexport const moonbeamGraphClient = createClient(SUBGRAPH_URLS[MOONBEAM].stats);\nexport const moonbeamReferralsGraphClient = createClient(SUBGRAPH_URLS[MOONBEAM].referrals);\n\nexport const mumbaiGraphClient = createClient(SUBGRAPH_URLS[GOERLI].stats);\nexport const mumbaiReferralsGraphClient = createClient(SUBGRAPH_URLS[GOERLI].referrals);\n\nexport function getFxdxGraphClient(chainId: number) {\n if (chainId === GOERLI) {\n return goerliGraphClient;\n } else if (chainId === ARBITRUM) {\n return arbitrumGraphClient;\n } else if (chainId === AVALANCHE) {\n return avalancheGraphClient;\n } else if (chainId === ARBITRUM_TESTNET) {\n return null;\n } else if (chainId === MOONBEAM) {\n return moonbeamGraphClient;\n } else if (chainId === MUMBAI) {\n return mumbaiGraphClient;\n }\n\n throw new Error(`Unsupported chain ${chainId}`);\n}\n","export function sleep(ms) {\n return new Promise((resolve) => resolve(), ms);\n}\n","import { useMemo } from \"react\";\nimport { gql } from \"@apollo/client\";\nimport useSWR from \"swr\";\nimport { ethers } from \"ethers\";\n\nimport { CHART_PERIODS } from \"lib/legacy\";\nimport { FXDX_STATS_API_URL } from \"config/backend\";\nimport { chainlinkClient } from \"lib/subgraph/clients\";\nimport { sleep } from \"lib/sleep\";\nimport { formatPrice } from \"lib/numbers\";\n\nconst BigNumber = ethers.BigNumber;\n\n// Ethereum network, Chainlink Aggregator contracts\nconst FEED_ID_MAP = {\n BTC_USD: \"0xae74faa92cb67a95ebcab07358bc222e33a34da7\",\n ETH_USD: \"0x37bc7498f4ff12c19678ee8fe19d713b87f6a9e6\",\n BNB_USD: \"0xc45ebd0f901ba6b2b8c7e70b717778f055ef5e6d\",\n LINK_USD: \"0xdfd03bfc3465107ce570a0397b247f546a42d0fa\",\n UNI_USD: \"0x68577f915131087199fe48913d8b416b3984fd38\",\n SUSHI_USD: \"0x7213536a36094cd8a768a5e45203ec286cba2d74\",\n AVAX_USD: \"0x0fc3657899693648bba4dbd2d8b33b82e875105d\",\n AAVE_USD: \"0xe3f0dede4b499c07e12475087ab1a084b5f93bc0\",\n YFI_USD: \"0x8a4d74003870064d41d4f84940550911fbfccf04\",\n SPELL_USD: \"0x8640b23468815902e011948f3ab173e1e83f9879\",\n};\nconst timezoneOffset = -new Date().getTimezoneOffset() * 60;\n\nfunction fillGaps(prices, periodSeconds) {\n if (prices.length < 2) {\n return prices;\n }\n\n const newPrices = [prices[0]];\n let prevTime = prices[0].time;\n for (let i = 1; i < prices.length; i++) {\n const { time, open } = prices[i];\n if (prevTime) {\n let j = (time - prevTime) / periodSeconds - 1;\n while (j > 0) {\n newPrices.push({\n time: time - j * periodSeconds,\n open,\n close: open,\n high: open * 1.0003,\n low: open * 0.9996,\n });\n j--;\n }\n }\n\n prevTime = time;\n newPrices.push(prices[i]);\n }\n\n return newPrices;\n}\n\nasync function getChartPricesFromStats(chainId, symbol, period) {\n if ([\"WBTC\", \"WETH\", \"WAVAX\", \"WGLMR\"].includes(symbol)) {\n symbol = symbol.substr(1);\n } else if ([\"BTC.b\", \"WBTC(M)\", \"WBTC(W)\"].includes(symbol)) {\n symbol = \"BTC\";\n }\n\n const timeDiff = CHART_PERIODS[period] * 3000;\n const from = Math.floor(Date.now() / 1000 - timeDiff);\n const url = `${FXDX_STATS_API_URL}/candles/${symbol}?preferableChainId=${chainId}&period=${period}&from=${from}&preferableSource=fast`;\n\n const TIMEOUT = 5000;\n const res = await new Promise(async (resolve, reject) => {\n let done = false;\n setTimeout(() => {\n done = true;\n reject(new Error(`request timeout ${url}`));\n }, TIMEOUT);\n\n let lastEx;\n for (let i = 0; i < 3; i++) {\n if (done) return;\n try {\n const res = await fetch(url);\n resolve(res);\n return;\n } catch (ex) {\n await sleep(300);\n lastEx = ex;\n }\n }\n reject(lastEx);\n });\n if (!res.ok) {\n throw new Error(`request failed ${res.status} ${res.statusText}`);\n }\n const json = await res.json();\n let prices = json?.prices;\n if (!prices || prices.length < 10) {\n throw new Error(`not enough prices data: ${prices?.length}`);\n }\n\n const OBSOLETE_THRESHOLD = Date.now() / 1000 - 60 * 30; // 30 min ago\n const updatedAt = json?.updatedAt || 0;\n if (updatedAt < OBSOLETE_THRESHOLD) {\n throw new Error(\n \"chart data is obsolete, last price record at \" +\n new Date(updatedAt * 1000).toISOString() +\n \" now: \" +\n new Date().toISOString()\n );\n }\n\n prices = prices.map(({ t, o: open, c: close, h: high, l: low }) => ({\n time: t + timezoneOffset,\n open,\n close,\n high,\n low,\n }));\n return prices;\n}\n\nfunction getCandlesFromPrices(prices, period) {\n const periodTime = CHART_PERIODS[period];\n\n if (prices.length < 2) {\n return [];\n }\n\n const candles = [];\n const first = prices[0];\n let prevTsGroup = Math.floor(first[0] / periodTime) * periodTime;\n let prevPrice = first[1];\n let o = prevPrice;\n let h = prevPrice;\n let l = prevPrice;\n let c = prevPrice;\n for (let i = 1; i < prices.length; i++) {\n const [ts, price] = prices[i];\n const tsGroup = Math.floor(ts / periodTime) * periodTime;\n if (prevTsGroup !== tsGroup) {\n candles.push({ t: prevTsGroup + timezoneOffset, o, h, l, c });\n o = c;\n h = Math.max(o, c);\n l = Math.min(o, c);\n }\n c = price;\n h = Math.max(h, price);\n l = Math.min(l, price);\n prevTsGroup = tsGroup;\n }\n\n return candles.map(({ t: time, o: open, c: close, h: high, l: low }) => ({\n time,\n open,\n close,\n high,\n low,\n }));\n}\n\nfunction getChainlinkChartPricesFromGraph(tokenSymbol, period) {\n if ([\"WBTC\", \"WETH\", \"WAVAX\"].includes(tokenSymbol)) {\n tokenSymbol = tokenSymbol.substr(1);\n }\n const marketName = tokenSymbol + \"_USD\";\n const feedId = FEED_ID_MAP[marketName];\n if (!feedId) {\n throw new Error(`undefined marketName ${marketName}`);\n }\n\n const PER_CHUNK = 1000;\n const CHUNKS_TOTAL = 6;\n const requests = [];\n for (let i = 0; i < CHUNKS_TOTAL; i++) {\n const query = gql(`{\n rounds(\n first: ${PER_CHUNK},\n skip: ${i * PER_CHUNK},\n orderBy: unixTimestamp,\n orderDirection: desc,\n where: {feed: \"${feedId}\"}\n ) {\n unixTimestamp,\n value\n }\n }`);\n requests.push(chainlinkClient.query({ query }));\n }\n\n return Promise.all(requests)\n .then((chunks) => {\n let prices = [];\n const uniqTs = new Set();\n chunks.forEach((chunk) => {\n chunk.data.rounds.forEach((item) => {\n if (uniqTs.has(item.unixTimestamp)) {\n return;\n }\n\n uniqTs.add(item.unixTimestamp);\n prices.push([item.unixTimestamp, Number(item.value) / 1e8]);\n });\n });\n\n prices.sort(([timeA], [timeB]) => timeA - timeB);\n prices = getCandlesFromPrices(prices, period);\n return prices;\n })\n .catch((err) => {\n console.error(err);\n });\n}\n\nexport function useChartPrices(chainId, symbol, isStable, period, currentAveragePrice) {\n const swrKey = !isStable && symbol ? [\"getChartCandles\", chainId, symbol, period] : null;\n let { data: prices, mutate: updatePrices } = useSWR(swrKey, {\n fetcher: async (...args) => {\n try {\n return await getChartPricesFromStats(chainId, symbol, period);\n } catch (ex) {\n console.warn(ex);\n console.warn(\"Switching to graph chainlink data\");\n try {\n return await getChainlinkChartPricesFromGraph(symbol, period);\n } catch (ex2) {\n console.warn(\"getChainlinkChartPricesFromGraph failed\");\n console.warn(ex2);\n return [];\n }\n }\n },\n dedupingInterval: 60000,\n focusThrottleInterval: 60000 * 10,\n });\n\n const currentAveragePriceString = currentAveragePrice && currentAveragePrice.toString();\n const retPrices = useMemo(() => {\n if (isStable) {\n return getStablePriceData(period);\n }\n\n if (!prices) {\n return [];\n }\n\n let _prices = [...prices];\n if (currentAveragePriceString && prices.length) {\n _prices = appendCurrentAveragePrice(_prices, BigNumber.from(currentAveragePriceString), period);\n }\n\n return fillGaps(_prices, CHART_PERIODS[period]);\n }, [prices, isStable, currentAveragePriceString, period]);\n\n return [retPrices, updatePrices];\n}\n\nfunction appendCurrentAveragePrice(prices, currentAveragePrice, period) {\n const periodSeconds = CHART_PERIODS[period];\n const currentCandleTime = Math.floor(Date.now() / 1000 / periodSeconds) * periodSeconds + timezoneOffset;\n const last = prices[prices.length - 1];\n const averagePriceValue = parseFloat(formatPrice(currentAveragePrice));\n if (currentCandleTime === last.time) {\n last.close = averagePriceValue;\n last.high = Math.max(last.high, averagePriceValue);\n last.low = Math.max(last.low, averagePriceValue);\n return prices;\n } else {\n const newCandle = {\n time: currentCandleTime,\n open: last.close,\n close: averagePriceValue,\n high: averagePriceValue,\n low: averagePriceValue,\n };\n return [...prices, newCandle];\n }\n}\n\nfunction getStablePriceData(period) {\n const periodSeconds = CHART_PERIODS[period];\n const now = Math.floor(Date.now() / 1000 / periodSeconds) * periodSeconds;\n let priceData = [];\n for (let i = 100; i > 0; i--) {\n priceData.push({\n time: now - i * periodSeconds,\n open: 1,\n close: 1,\n high: 1,\n low: 1,\n });\n }\n return priceData;\n}\n","import { ethers } from \"ethers\";\nimport { gql } from \"@apollo/client\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n// import { Token as UniToken } from \"@uniswap/sdk-core\";\n// import { Pool } from \"@uniswap/v3-sdk\";\nimport useSWR from \"swr\";\n\nimport OrderBook from \"abis/OrderBook.json\";\nimport PositionManager from \"abis/PositionManager.json\";\nimport Vault from \"abis/Vault.json\";\nimport Router from \"abis/Router.json\";\n// import UniPool from \"abis/UniPool.json\";\n// import UniswapV2 from \"abis/UniswapV2.json\";\nimport Token from \"abis/Token.json\";\nimport PositionRouter from \"abis/PositionRouter.json\";\n\nimport { getContract } from \"config/contracts\";\nimport {\n ARBITRUM,\n ARBITRUM_TESTNET,\n AVALANCHE,\n getConstant,\n getHighExecutionFee,\n GOERLI,\n MUMBAI,\n IS_TESTNET,\n MAINNET,\n MOONBEAM\n} from \"config/chains\";\nimport { DECREASE, getOrderKey, INCREASE, SWAP, USD_DECIMALS } from \"lib/legacy\";\n\nimport { groupBy } from \"lodash\";\nimport { UI_VERSION } from \"config/ui\";\nimport { getServerBaseUrl, getServerUrl } from \"config/backend\";\nimport { getFxdxGraphClient } from \"lib/subgraph/clients\";\nimport { callContract, contractFetcher } from \"lib/contracts\";\nimport { replaceNativeTokenAddress } from \"./tokens\";\nimport { getUsd } from \"./tokens/utils\";\nimport { getProvider } from \"lib/rpc\";\nimport { bigNumberify, expandDecimals } from \"lib/numbers\";\n// import { getTokenBySymbol } from \"config/tokens\";\nimport { t } from \"@lingui/macro\";\n\nexport * from \"./prices\";\n\nconst { AddressZero } = ethers.constants;\n\nexport function useAllOrdersStats(chainId) {\n const query = gql(`{\n orderStat(id: \"total\") {\n openSwap\n openIncrease\n openDecrease\n executedSwap\n executedIncrease\n executedDecrease\n cancelledSwap\n cancelledIncrease\n cancelledDecrease\n }\n }`);\n\n const [res, setRes] = useState();\n\n useEffect(() => {\n const graphClient = getFxdxGraphClient(chainId);\n if (graphClient) {\n graphClient.query({ query }).then(setRes).catch(console.warn);\n }\n }, [setRes, query, chainId]);\n\n return res ? res.data.orderStat : null;\n}\n\nexport function useUserStat(chainId) {\n const query = gql(`{\n userStat(id: \"total\") {\n id\n uniqueCount\n }\n }`);\n\n const [res, setRes] = useState();\n\n useEffect(() => {\n getFxdxGraphClient(chainId).query({ query }).then(setRes).catch(console.warn);\n }, [setRes, query, chainId]);\n\n return res ? res.data.userStat : null;\n}\n\nexport function useLiquidationsData(chainId, account) {\n const [data, setData] = useState(null);\n useEffect(() => {\n if (account) {\n const query = gql(`{\n liquidatedPositions(\n where: {account: \"${account.toLowerCase()}\"}\n first: 100\n orderBy: timestamp\n orderDirection: desc\n ) {\n key\n timestamp\n borrowFee\n loss\n collateral\n size\n markPrice\n type\n }\n }`);\n const graphClient = getFxdxGraphClient(chainId);\n if (!graphClient) {\n return;\n }\n\n graphClient\n .query({ query })\n .then((res) => {\n const _data = res.data.liquidatedPositions.map((item) => {\n return {\n ...item,\n size: bigNumberify(item.size),\n collateral: bigNumberify(item.collateral),\n markPrice: bigNumberify(item.markPrice),\n };\n });\n setData(_data);\n })\n .catch(console.warn);\n }\n }, [setData, chainId, account]);\n\n return data;\n}\n\nexport function useAllPositions(chainId, library) {\n // const count = 1000;\n // const query = gql(`{\n // aggregatedTradeOpens(\n // first: ${count}\n // ) {\n // account\n // initialPosition{\n // indexToken\n // collateralToken\n // isLong\n // sizeDelta\n // }\n // increaseList {\n // sizeDelta\n // }\n // decreaseList {\n // sizeDelta\n // }\n // }\n // }`);\n\n // const [res, setRes] = useState();\n\n // useEffect(() => {\n // nissohGraphClient.query({ query }).then(setRes).catch(console.warn);\n // }, [setRes, query]);\n\n // const key = res ? `allPositions${count}__` : false;\n // const { data: positions = [] } = useSWR(key, async () => {\n // const provider = getProvider(library, chainId);\n // const vaultAddress = getContract(chainId, \"Vault\");\n // const contract = new ethers.Contract(vaultAddress, Vault.abi, provider);\n // const ret = await Promise.all(\n // res.data.aggregatedTradeOpens.map(async (dataItem) => {\n // try {\n // const { indexToken, collateralToken, isLong } = dataItem.initialPosition;\n // const positionData = await contract.getPosition(dataItem.account, collateralToken, indexToken, isLong);\n // const position = {\n // size: bigNumberify(positionData[0]),\n // collateral: bigNumberify(positionData[1]),\n // entryFundingRate: bigNumberify(positionData[3]),\n // account: dataItem.account,\n // };\n // position.fundingFee = await contract.getFundingFee(collateralToken, position.size, position.entryFundingRate);\n // position.marginFee = position.size.div(1000);\n // position.fee = position.fundingFee.add(position.marginFee);\n\n // const THRESHOLD = 5000;\n // const collateralDiffPercent = position.fee.mul(10000).div(position.collateral);\n // position.danger = collateralDiffPercent.gt(THRESHOLD);\n\n // return position;\n // } catch (ex) {\n // console.error(ex);\n // }\n // })\n // );\n\n // return ret.filter(Boolean);\n // });\n\n // return positions;\n return [];\n}\n\nexport function useAllOrders(chainId, library) {\n const query = gql(`{\n orders(\n first: 1000,\n orderBy: createdTimestamp,\n orderDirection: desc,\n where: {status: \"open\"}\n ) {\n type\n account\n index\n status\n createdTimestamp\n }\n }`);\n\n const [res, setRes] = useState();\n\n useEffect(() => {\n getFxdxGraphClient(chainId).query({ query }).then(setRes);\n }, [setRes, query, chainId]);\n\n const key = res ? res.data.orders.map((order) => `${order.type}-${order.account}-${order.index}`) : null;\n const { data: orders = [] } = useSWR(key, () => {\n const provider = getProvider(library, chainId);\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, provider);\n return Promise.all(\n res.data.orders.map(async (order) => {\n try {\n const type = order.type.charAt(0).toUpperCase() + order.type.substring(1);\n const method = `get${type}Order`;\n const orderFromChain = await contract[method](order.account, order.index);\n const ret = {};\n for (const [key, val] of Object.entries(orderFromChain)) {\n ret[key] = val;\n }\n if (order.type === \"swap\") {\n ret.path = [ret.path0, ret.path1, ret.path2].filter((address) => address !== AddressZero);\n }\n ret.type = type;\n ret.index = order.index;\n ret.account = order.account;\n ret.createdTimestamp = order.createdTimestamp;\n return ret;\n } catch (ex) {\n console.error(ex);\n }\n })\n );\n });\n\n return orders.filter(Boolean);\n}\n\nexport function usePositionsForOrders(chainId, library, orders) {\n const key = orders ? orders.map((order) => getOrderKey(order) + \"____\") : null;\n const { data: positions = {} } = useSWR(key, async () => {\n const provider = getProvider(library, chainId);\n const vaultAddress = getContract(chainId, \"Vault\");\n const contract = new ethers.Contract(vaultAddress, Vault.abi, provider);\n const data = await Promise.all(\n orders.map(async (order) => {\n try {\n const position = await contract.getPosition(\n order.account,\n order.collateralToken,\n order.indexToken,\n order.isLong\n );\n if (position[0].eq(0)) {\n return [null, order];\n }\n return [position, order];\n } catch (ex) {\n console.error(ex);\n }\n })\n );\n return data.reduce((memo, [position, order]) => {\n memo[getOrderKey(order)] = position;\n return memo;\n }, {});\n });\n\n return positions;\n}\n\nfunction invariant(condition, errorMsg) {\n if (!condition) {\n throw new Error(errorMsg);\n }\n}\n\nexport function useTrades(chainId, account, forSingleAccount, afterId) {\n let url =\n account && account.length > 0\n ? `${getServerBaseUrl(chainId)}/actions?account=${account}`\n : !forSingleAccount && `${getServerBaseUrl(chainId)}/actions`;\n\n if (afterId && afterId.length > 0) {\n const urlItem = new URL(url);\n urlItem.searchParams.append(\"after\", afterId);\n url = urlItem.toString();\n }\n\n const { data: trades, mutate: updateTrades } = useSWR(url && url, {\n dedupingInterval: 10000,\n fetcher: (...args) => fetch(...args).then((res) => res.json()),\n });\n\n if (trades) {\n trades.sort((item0, item1) => {\n const data0 = item0.data;\n const data1 = item1.data;\n const time0 = parseInt(data0.timestamp);\n const time1 = parseInt(data1.timestamp);\n if (time1 > time0) {\n return 1;\n }\n if (time1 < time0) {\n return -1;\n }\n\n const block0 = parseInt(data0.blockNumber);\n const block1 = parseInt(data1.blockNumber);\n\n if (isNaN(block0) && isNaN(block1)) {\n return 0;\n }\n\n if (isNaN(block0)) {\n return 1;\n }\n\n if (isNaN(block1)) {\n return -1;\n }\n\n if (block1 > block0) {\n return 1;\n }\n\n if (block1 < block0) {\n return -1;\n }\n\n return 0;\n });\n }\n\n return { trades, updateTrades };\n}\n\nexport function useMinExecutionFee(library, active, chainId, infoTokens) {\n const positionRouterAddress = getContract(chainId, \"PositionRouter\");\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n\n const { data: minExecutionFee } = useSWR([active, chainId, positionRouterAddress, \"minExecutionFee\"], {\n fetcher: contractFetcher(library, PositionRouter),\n });\n\n const { data: gasPrice } = useSWR([\"gasPrice\", chainId], {\n fetcher: () => {\n return new Promise(async (resolve, reject) => {\n const provider = getProvider(library, chainId);\n if (!provider) {\n resolve(undefined);\n return;\n }\n\n try {\n const gasPrice = await provider.getGasPrice();\n resolve(gasPrice);\n } catch (e) {\n console.error(e);\n }\n });\n },\n });\n\n let multiplier;\n\n // multiplier for Ethereum is just the average gas usage\n if (chainId === MAINNET || chainId === MUMBAI) {\n multiplier = 700000;\n }\n\n // if gas prices on Arbitrum are high, the main transaction costs would come from the L2 gas usage\n // for executing positions this is around 65,000 gas\n // if gas prices on Ethereum are high, than the gas usage might be higher, this calculation doesn't deal with that\n // case yet\n if (chainId === ARBITRUM || chainId === ARBITRUM_TESTNET) {\n multiplier = 65000;\n }\n\n // multiplier for Avalanche is just the average gas usage\n if (chainId === AVALANCHE) {\n multiplier = 700000;\n }\n\n if (chainId === MOONBEAM) {\n multiplier = 700000;\n }\n\n let finalExecutionFee = minExecutionFee;\n\n if (gasPrice && minExecutionFee) {\n const estimatedExecutionFee = gasPrice.mul(multiplier);\n if (estimatedExecutionFee.gt(minExecutionFee)) {\n finalExecutionFee = estimatedExecutionFee;\n }\n }\n\n const finalExecutionFeeUSD = getUsd(finalExecutionFee, nativeTokenAddress, false, infoTokens);\n const isFeeHigh = finalExecutionFeeUSD?.gt(expandDecimals(getHighExecutionFee(chainId), USD_DECIMALS));\n const errorMessage =\n isFeeHigh &&\n `The network cost to send transactions is high at the moment, please check the \"Execution Fee\" value before proceeding.`;\n\n return {\n minExecutionFee: finalExecutionFee,\n minExecutionFeeUSD: finalExecutionFeeUSD,\n minExecutionFeeErrorMessage: errorMessage,\n };\n}\n\n// export function useStakedFxdxSupply(library, active) {\n// const fxdxAddressArb = getContract(ARBITRUM, \"FXDX\");\n// const stakedFxdxTrackerAddressArb = getContract(ARBITRUM, \"StakedFxdxTracker\");\n\n// const { data: arbData, mutate: arbMutate } = useSWR(\n// [`StakeV2:stakedFxdxSupply:${active}`, ARBITRUM, fxdxAddressArb, \"balanceOf\", stakedFxdxTrackerAddressArb],\n// {\n// fetcher: contractFetcher(library, Token),\n// }\n// );\n\n// const fxdxAddressAvax = getContract(AVALANCHE, \"FXDX\");\n// const stakedFxdxTrackerAddressAvax = getContract(AVALANCHE, \"StakedFxdxTracker\");\n\n// const { data: avaxData, mutate: avaxMutate } = useSWR(\n// [`StakeV2:stakedFxdxSupply:${active}`, AVALANCHE, fxdxAddressAvax, \"balanceOf\", stakedFxdxTrackerAddressAvax],\n// {\n// fetcher: contractFetcher(undefined, Token),\n// }\n// );\n\n// let data;\n// if (arbData && avaxData) {\n// data = arbData.add(avaxData);\n// }\n\n// const mutate = () => {\n// arbMutate();\n// avaxMutate();\n// };\n\n// return { data, mutate };\n// }\n\nexport function useHasOutdatedUi() {\n const url = getServerUrl(MUMBAI, \"/ui_version\");\n const { data, mutate } = useSWR([url], {\n fetcher: (...args) => fetch(...args).then((res) => res.text()),\n });\n\n let hasOutdatedUi = false;\n\n if (data && parseFloat(data) > parseFloat(UI_VERSION)) {\n hasOutdatedUi = true;\n }\n\n return { data: hasOutdatedUi, mutate };\n}\n\nexport function useFxdxPrice(chainId, libraries, active) {\n // const arbitrumLibrary = libraries && libraries.arbitrum ? libraries.arbitrum : undefined;\n // const { data: fxdxPriceFromArbitrum, mutate: mutateFromArbitrum } = useFxdxPriceFromArbitrum(arbitrumLibrary, active);\n // const { data: fxdxPriceFromAvalanche, mutate: mutateFromAvalanche } = useFxdxPriceFromAvalanche();\n\n // const fxdxPrice = chainId === ARBITRUM ? fxdxPriceFromArbitrum : fxdxPriceFromAvalanche;\n // const mutate = useCallback(() => {\n // mutateFromAvalanche();\n // mutateFromArbitrum();\n // }, [mutateFromAvalanche, mutateFromArbitrum]);\n\n // return {\n // fxdxPrice,\n // fxdxPriceFromArbitrum,\n // fxdxPriceFromAvalanche,\n // mutate,\n // };\n return {\n fxdxPrice: expandDecimals(5, 29),\n fxdxPriceFromEthereum: expandDecimals(5, 29),\n fxdxPriceFromMoonBeam: expandDecimals(5, 29),\n };\n}\n\n// use only the supply endpoint on arbitrum, it includes the supply on avalanche\nexport function useTotalFxdxSupply() {\n const fxdxSupplyUrl = getServerUrl(IS_TESTNET ? MUMBAI : MOONBEAM, \"/fxdx_supply\");\n\n const { data: fxdxSupply, mutate: updateFxdxSupply } = useSWR([fxdxSupplyUrl], {\n fetcher: (...args) => fetch(...args).then((res) => res.text()),\n });\n\n return {\n total: fxdxSupply ? bigNumberify(fxdxSupply) : undefined,\n mutate: updateFxdxSupply,\n };\n}\n\nexport function useTotalFxdxStaked() {\n let totalStakedFxdx = useRef(bigNumberify(0));\n\n const etherChainId = MUMBAI;\n const stakedFxdxTrackerAddressEthereum = getContract(etherChainId, \"StakedFxdxTracker\");\n const { data: stakedFxdxSupplyEthereum, mutate: updateStakedFxdxSupplyEthereum } = useSWR(\n IS_TESTNET && [\n `StakeV2:stakedFxdxSupply:${etherChainId}`,\n etherChainId,\n getContract(etherChainId, \"FXDX\"),\n \"balanceOf\",\n stakedFxdxTrackerAddressEthereum,\n ],\n {\n fetcher: contractFetcher(undefined, Token),\n }\n );\n\n const stakedFxdxTrackerAddressMoonBeam = getContract(MOONBEAM, \"StakedFxdxTracker\");\n const { data: stakedFxdxSupplyMoonBeam, mutate: updateStakedFxdxSupplyMoonBeam } = useSWR(\n !IS_TESTNET && [\n `StakeV2:stakedFxdxSupply:${MOONBEAM}`,\n MOONBEAM,\n getContract(MOONBEAM, \"FXDX\"),\n \"balanceOf\",\n stakedFxdxTrackerAddressMoonBeam,\n ],\n {\n fetcher: contractFetcher(undefined, Token),\n }\n );\n\n const mutate = useCallback(() => {\n updateStakedFxdxSupplyEthereum();\n updateStakedFxdxSupplyMoonBeam();\n }, [\n updateStakedFxdxSupplyEthereum,\n updateStakedFxdxSupplyMoonBeam\n ]);\n\n if (IS_TESTNET && stakedFxdxSupplyEthereum) {\n let total = bigNumberify(stakedFxdxSupplyEthereum);\n totalStakedFxdx.current = total;\n } else if (!IS_TESTNET && stakedFxdxSupplyMoonBeam) {\n let total = bigNumberify(stakedFxdxSupplyMoonBeam);\n totalStakedFxdx.current = total;\n }\n\n return {\n ethereum: stakedFxdxSupplyEthereum,\n moonbeam: stakedFxdxSupplyMoonBeam,\n total: totalStakedFxdx.current,\n mutate,\n };\n\n // const stakedFxdxTrackerAddressArbitrum = getContract(ARBITRUM, \"StakedFxdxTracker\");\n // const { data: stakedFxdxSupplyArbitrum, mutate: updateStakedFxdxSupplyArbitrum } = useSWR(\n // [\n // `StakeV2:stakedFxdxSupply:${ARBITRUM}`,\n // ARBITRUM,\n // getContract(ARBITRUM, \"FXDX\"),\n // \"balanceOf\",\n // stakedFxdxTrackerAddressArbitrum,\n // ],\n // {\n // fetcher: contractFetcher(undefined, Token),\n // }\n // );\n\n // const stakedFxdxTrackerAddressAvax = getContract(AVALANCHE, \"StakedFxdxTracker\");\n // const { data: stakedFxdxSupplyAvax, mutate: updateStakedFxdxSupplyAvax } = useSWR(\n // [\n // `StakeV2:stakedFxdxSupply:${AVALANCHE}`,\n // AVALANCHE,\n // getContract(AVALANCHE, \"FXDX\"),\n // \"balanceOf\",\n // stakedFxdxTrackerAddressAvax,\n // ],\n // {\n // fetcher: contractFetcher(undefined, Token),\n // }\n // );\n\n // const mutate = useCallback(() => {\n // updateStakedFxdxSupplyArbitrum();\n // updateStakedFxdxSupplyAvax();\n // }, [\n // updateStakedFxdxSupplyArbitrum,\n // updateStakedFxdxSupplyAvax\n // ]);\n\n // if (stakedFxdxSupplyArbitrum && stakedFxdxSupplyAvax) {\n // let total = bigNumberify(stakedFxdxSupplyArbitrum).add(stakedFxdxSupplyAvax);\n // totalStakedFxdx.current = total;\n // }\n\n // return {\n // avax: stakedFxdxSupplyAvax,\n // arbitrum: stakedFxdxSupplyArbitrum,\n // total: totalStakedFxdx.current,\n // mutate,\n // };\n}\n\nexport function useTotalFxdxInLiquidity() {\n // let poolAddressArbitrum = getContract(ARBITRUM, \"UniswapFxdxEthPool\");\n // let poolAddressAvax = getContract(AVALANCHE, \"TraderJoeFxdxAvaxPool\");\n // let totalFXDX = useRef(bigNumberify(0));\n\n // const { data: fxdxInLiquidityOnArbitrum, mutate: mutateFXDXInLiquidityOnArbitrum } = useSWR(\n // [`StakeV2:fxdxInLiquidity:${ARBITRUM}`, ARBITRUM, getContract(ARBITRUM, \"FXDX\"), \"balanceOf\", poolAddressArbitrum],\n // {\n // fetcher: contractFetcher(undefined, Token),\n // }\n // );\n // const { data: fxdxInLiquidityOnAvax, mutate: mutateFXDXInLiquidityOnAvax } = useSWR(\n // [`StakeV2:fxdxInLiquidity:${AVALANCHE}`, AVALANCHE, getContract(AVALANCHE, \"FXDX\"), \"balanceOf\", poolAddressAvax],\n // {\n // fetcher: contractFetcher(undefined, Token),\n // }\n // );\n // const mutate = useCallback(() => {\n // mutateFXDXInLiquidityOnArbitrum();\n // mutateFXDXInLiquidityOnAvax();\n // }, [mutateFXDXInLiquidityOnArbitrum, mutateFXDXInLiquidityOnAvax]);\n\n // if (fxdxInLiquidityOnAvax && fxdxInLiquidityOnArbitrum) {\n // let total = bigNumberify(fxdxInLiquidityOnArbitrum).add(fxdxInLiquidityOnAvax);\n // totalFXDX.current = total;\n // }\n // return {\n // avax: fxdxInLiquidityOnAvax,\n // arbitrum: fxdxInLiquidityOnArbitrum,\n // total: totalFXDX.current,\n // mutate,\n // };\n return {\n ethereum: bigNumberify(0),\n moonbeam: bigNumberify(0),\n total: bigNumberify(0),\n };\n}\n\n// function useFxdxPriceFromAvalanche() {\n// const poolAddress = getContract(AVALANCHE, \"TraderJoeFxdxAvaxPool\");\n\n// const { data, mutate: updateReserves } = useSWR([\"TraderJoeFxdxAvaxReserves\", AVALANCHE, poolAddress, \"getReserves\"], {\n// fetcher: contractFetcher(undefined, UniswapV2),\n// });\n// const { _reserve0: fxdxReserve, _reserve1: avaxReserve } = data || {};\n\n// const vaultAddress = getContract(AVALANCHE, \"Vault\");\n// const avaxAddress = getTokenBySymbol(AVALANCHE, \"WAVAX\").address;\n// const { data: avaxPrice, mutate: updateAvaxPrice } = useSWR(\n// [`StakeV2:avaxPrice`, AVALANCHE, vaultAddress, \"getMinPrice\", avaxAddress],\n// {\n// fetcher: contractFetcher(undefined, Vault),\n// }\n// );\n\n// const PRECISION = bigNumberify(10).pow(18);\n// let fxdxPrice;\n// if (avaxReserve && fxdxReserve && avaxPrice) {\n// fxdxPrice = avaxReserve.mul(PRECISION).div(fxdxReserve).mul(avaxPrice).div(PRECISION);\n// }\n\n// const mutate = useCallback(() => {\n// updateReserves(undefined, true);\n// updateAvaxPrice(undefined, true);\n// }, [updateReserves, updateAvaxPrice]);\n\n// return { data: fxdxPrice, mutate };\n// }\n\n// function useFxdxPriceFromArbitrum(library, active) {\n// const poolAddress = getContract(ARBITRUM, \"UniswapFxdxEthPool\");\n// const { data: uniPoolSlot0, mutate: updateUniPoolSlot0 } = useSWR(\n// [`StakeV2:uniPoolSlot0:${active}`, ARBITRUM, poolAddress, \"slot0\"],\n// {\n// fetcher: contractFetcher(library, UniPool),\n// }\n// );\n\n// const vaultAddress = getContract(ARBITRUM, \"Vault\");\n// const ethAddress = getTokenBySymbol(ARBITRUM, \"WETH\").address;\n// const { data: ethPrice, mutate: updateEthPrice } = useSWR(\n// [`StakeV2:ethPrice:${active}`, ARBITRUM, vaultAddress, \"getMinPrice\", ethAddress],\n// {\n// fetcher: contractFetcher(library, Vault),\n// }\n// );\n\n// const fxdxPrice = useMemo(() => {\n// if (uniPoolSlot0 && ethPrice) {\n// const tokenA = new UniToken(ARBITRUM, ethAddress, 18, \"SYMBOL\", \"NAME\");\n\n// const fxdxAddress = getContract(ARBITRUM, \"FXDX\");\n// const tokenB = new UniToken(ARBITRUM, fxdxAddress, 18, \"SYMBOL\", \"NAME\");\n\n// const pool = new Pool(\n// tokenA, // tokenA\n// tokenB, // tokenB\n// 10000, // fee\n// uniPoolSlot0.sqrtPriceX96, // sqrtRatioX96\n// 1, // liquidity\n// uniPoolSlot0.tick, // tickCurrent\n// []\n// );\n\n// const poolTokenPrice = pool.priceOf(tokenB).toSignificant(6);\n// const poolTokenPriceAmount = parseValue(poolTokenPrice, 18);\n// return poolTokenPriceAmount.mul(ethPrice).div(expandDecimals(1, 18));\n// }\n// }, [ethPrice, uniPoolSlot0, ethAddress]);\n\n// const mutate = useCallback(() => {\n// updateUniPoolSlot0(undefined, true);\n// updateEthPrice(undefined, true);\n// }, [updateEthPrice, updateUniPoolSlot0]);\n\n// return { data: fxdxPrice, mutate };\n// }\n\nexport async function approvePlugin(\n chainId,\n pluginAddress,\n { library, pendingTxns, setPendingTxns, sentMsg, failMsg }\n) {\n const routerAddress = getContract(chainId, \"Router\");\n const contract = new ethers.Contract(routerAddress, Router.abi, library.getSigner());\n return callContract(chainId, contract, \"approvePlugin\", [pluginAddress], {\n sentMsg,\n failMsg,\n pendingTxns,\n setPendingTxns,\n });\n}\n\nexport async function createSwapOrder(\n chainId,\n library,\n path,\n amountIn,\n minOut,\n triggerRatio,\n nativeTokenAddress,\n opts = {}\n) {\n const executionFee = getConstant(chainId, \"SWAP_ORDER_EXECUTION_GAS_FEE\");\n const triggerAboveThreshold = false;\n let shouldWrap = false;\n let shouldUnwrap = false;\n opts.value = executionFee;\n\n if (path[0] === AddressZero) {\n shouldWrap = true;\n opts.value = opts.value.add(amountIn);\n }\n if (path[path.length - 1] === AddressZero) {\n shouldUnwrap = true;\n }\n path = replaceNativeTokenAddress(path, nativeTokenAddress);\n\n const params = [path, amountIn, minOut, triggerRatio, triggerAboveThreshold, executionFee, shouldWrap, shouldUnwrap];\n\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, \"createSwapOrder\", params, opts);\n}\n\nexport async function createIncreaseOrder(\n chainId,\n library,\n nativeTokenAddress,\n path,\n amountIn,\n indexTokenAddress,\n minOut,\n sizeDelta,\n collateralTokenAddress,\n isLong,\n triggerPrice,\n opts = {}\n) {\n invariant(!isLong || indexTokenAddress === collateralTokenAddress, \"invalid token addresses\");\n invariant(indexTokenAddress !== AddressZero, \"indexToken is 0\");\n invariant(collateralTokenAddress !== AddressZero, \"collateralToken is 0\");\n\n const fromETH = path[0] === AddressZero;\n\n path = replaceNativeTokenAddress(path, nativeTokenAddress);\n const shouldWrap = fromETH;\n const triggerAboveThreshold = !isLong;\n const executionFee = getConstant(chainId, \"INCREASE_ORDER_EXECUTION_GAS_FEE\");\n\n const params = [\n path,\n amountIn,\n indexTokenAddress,\n minOut,\n sizeDelta,\n collateralTokenAddress,\n isLong,\n triggerPrice,\n triggerAboveThreshold,\n executionFee,\n shouldWrap,\n ];\n\n if (!opts.value) {\n opts.value = fromETH ? amountIn.add(executionFee) : executionFee;\n }\n\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, \"createIncreaseOrder\", params, opts);\n}\n\nexport async function createDecreaseOrder(\n chainId,\n library,\n indexTokenAddress,\n sizeDelta,\n collateralTokenAddress,\n collateralDelta,\n isLong,\n triggerPrice,\n triggerAboveThreshold,\n opts = {}\n) {\n invariant(!isLong || indexTokenAddress === collateralTokenAddress, \"invalid token addresses\");\n invariant(indexTokenAddress !== AddressZero, \"indexToken is 0\");\n invariant(collateralTokenAddress !== AddressZero, \"collateralToken is 0\");\n\n const executionFee = getConstant(chainId, \"DECREASE_ORDER_EXECUTION_GAS_FEE\");\n\n const params = [\n indexTokenAddress,\n sizeDelta,\n collateralTokenAddress,\n collateralDelta,\n isLong,\n triggerPrice,\n triggerAboveThreshold,\n ];\n opts.value = executionFee;\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, \"createDecreaseOrder\", params, opts);\n}\n\nexport async function cancelSwapOrder(chainId, library, index, opts) {\n const params = [index];\n const method = \"cancelSwapOrder\";\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport async function cancelDecreaseOrder(chainId, library, index, opts) {\n const params = [index];\n const method = \"cancelDecreaseOrder\";\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport async function cancelIncreaseOrder(chainId, library, index, opts) {\n const params = [index];\n const method = \"cancelIncreaseOrder\";\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport function handleCancelOrder(chainId, library, order, opts) {\n let func;\n if (order.type === SWAP) {\n func = cancelSwapOrder;\n } else if (order.type === INCREASE) {\n func = cancelIncreaseOrder;\n } else if (order.type === DECREASE) {\n func = cancelDecreaseOrder;\n }\n\n return func(chainId, library, order.index, {\n successMsg: t`Order cancelled.`,\n failMsg: t`Cancel failed.`,\n sentMsg: t`Cancel submitted.`,\n pendingTxns: opts.pendingTxns,\n setPendingTxns: opts.setPendingTxns,\n });\n}\n\nexport async function cancelMultipleOrders(chainId, library, allIndexes = [], opts) {\n const ordersWithTypes = groupBy(allIndexes, (v) => v.split(\"-\")[0]);\n function getIndexes(key) {\n if (!ordersWithTypes[key]) return;\n return ordersWithTypes[key].map((d) => d.split(\"-\")[1]);\n }\n // params order => swap, increase, decrease\n const params = [\"Swap\", \"Increase\", \"Decrease\"].map((key) => getIndexes(key) || []);\n const method = \"cancelMultiple\";\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport async function updateDecreaseOrder(\n chainId,\n library,\n index,\n collateralDelta,\n sizeDelta,\n triggerPrice,\n triggerAboveThreshold,\n opts\n) {\n const params = [index, collateralDelta, sizeDelta, triggerPrice, triggerAboveThreshold];\n const method = \"updateDecreaseOrder\";\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport async function updateIncreaseOrder(\n chainId,\n library,\n index,\n sizeDelta,\n triggerPrice,\n triggerAboveThreshold,\n opts\n) {\n const params = [index, sizeDelta, triggerPrice, triggerAboveThreshold];\n const method = \"updateIncreaseOrder\";\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport async function updateSwapOrder(chainId, library, index, minOut, triggerRatio, triggerAboveThreshold, opts) {\n const params = [index, minOut, triggerRatio, triggerAboveThreshold];\n const method = \"updateSwapOrder\";\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const contract = new ethers.Contract(orderBookAddress, OrderBook.abi, library.getSigner());\n\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport async function _executeOrder(chainId, library, method, account, index, feeReceiver, opts) {\n const params = [account, index, feeReceiver];\n const positionManagerAddress = getContract(chainId, \"PositionManager\");\n const contract = new ethers.Contract(positionManagerAddress, PositionManager.abi, library.getSigner());\n return callContract(chainId, contract, method, params, opts);\n}\n\nexport function executeSwapOrder(chainId, library, account, index, feeReceiver, opts) {\n return _executeOrder(chainId, library, \"executeSwapOrder\", account, index, feeReceiver, opts);\n}\n\nexport function executeIncreaseOrder(chainId, library, account, index, feeReceiver, opts) {\n return _executeOrder(chainId, library, \"executeIncreaseOrder\", account, index, feeReceiver, opts);\n}\n\nexport function executeDecreaseOrder(chainId, library, account, index, feeReceiver, opts) {\n return _executeOrder(chainId, library, \"executeDecreaseOrder\", account, index, feeReceiver, opts);\n}\n","import React from \"react\";\n\nimport useSWR from \"swr\";\n\nimport {\n PLACEHOLDER_ACCOUNT,\n getBalanceAndSupplyData,\n getDepositBalanceData,\n getVestingData,\n getStakingData,\n getProcessedData,\n} from \"lib/legacy\";\n\nimport Vault from \"abis/Vault.json\";\nimport Reader from \"abis/Reader.json\";\nimport RewardReader from \"abis/RewardReader.json\";\nimport Token from \"abis/Token.json\";\nimport FlpManager from \"abis/FlpManager.json\";\n\nimport { useWeb3React } from \"@web3-react/core\";\n\nimport { useFxdxPrice } from \"domain/legacy\";\n\nimport { getContract } from \"config/contracts\";\nimport { getServerUrl } from \"config/backend\";\nimport { contractFetcher } from \"lib/contracts\";\nimport { formatKeyAmount } from \"lib/numbers\";\n\nexport default function APRLabel({ chainId, label }) {\n let { active } = useWeb3React();\n\n const rewardReaderAddress = getContract(chainId, \"RewardReader\");\n const readerAddress = getContract(chainId, \"Reader\");\n\n const vaultAddress = getContract(chainId, \"Vault\");\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const fxdxAddress = getContract(chainId, \"FXDX\");\n const esFxdxAddress = getContract(chainId, \"ES_FXDX\");\n const bnFxdxAddress = getContract(chainId, \"BN_FXDX\");\n const flpAddress = getContract(chainId, \"FLP\");\n\n const stakedFxdxTrackerAddress = getContract(chainId, \"StakedFxdxTracker\");\n const bonusFxdxTrackerAddress = getContract(chainId, \"BonusFxdxTracker\");\n const feeFxdxTrackerAddress = getContract(chainId, \"FeeFxdxTracker\");\n\n const stakedFlpTrackerAddress = getContract(chainId, \"StakedFlpTracker\");\n const feeFlpTrackerAddress = getContract(chainId, \"FeeFlpTracker\");\n\n const flpManagerAddress = getContract(chainId, \"FlpManager\");\n\n const fxdxVesterAddress = getContract(chainId, \"FxdxVester\");\n const flpVesterAddress = getContract(chainId, \"FlpVester\");\n\n const vesterAddresses = [fxdxVesterAddress, flpVesterAddress];\n\n const walletTokens = [fxdxAddress, esFxdxAddress, flpAddress, stakedFxdxTrackerAddress];\n const depositTokens = [\n fxdxAddress,\n esFxdxAddress,\n stakedFxdxTrackerAddress,\n bonusFxdxTrackerAddress,\n bnFxdxAddress,\n flpAddress,\n ];\n const rewardTrackersForDepositBalances = [\n stakedFxdxTrackerAddress,\n stakedFxdxTrackerAddress,\n bonusFxdxTrackerAddress,\n feeFxdxTrackerAddress,\n feeFxdxTrackerAddress,\n feeFlpTrackerAddress,\n ];\n const rewardTrackersForStakingInfo = [\n stakedFxdxTrackerAddress,\n bonusFxdxTrackerAddress,\n feeFxdxTrackerAddress,\n stakedFlpTrackerAddress,\n feeFlpTrackerAddress,\n ];\n\n const { data: walletBalances } = useSWR(\n [`StakeV2:walletBalances:${active}`, chainId, readerAddress, \"getTokenBalancesWithSupplies\", PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(undefined, Reader, [walletTokens]),\n }\n );\n\n const { data: depositBalances } = useSWR(\n [`StakeV2:depositBalances:${active}`, chainId, rewardReaderAddress, \"getDepositBalances\", PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(undefined, RewardReader, [depositTokens, rewardTrackersForDepositBalances]),\n }\n );\n\n const { data: stakingInfo } = useSWR(\n [`StakeV2:stakingInfo:${active}`, chainId, rewardReaderAddress, \"getStakingInfo\", PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(undefined, RewardReader, [rewardTrackersForStakingInfo]),\n }\n );\n\n const { data: stakedFxdxSupply } = useSWR(\n [`StakeV2:stakedFxdxSupply:${active}`, chainId, fxdxAddress, \"balanceOf\", stakedFxdxTrackerAddress],\n {\n fetcher: contractFetcher(undefined, Token),\n }\n );\n\n const { data: aums } = useSWR([`StakeV2:getAums:${active}`, chainId, flpManagerAddress, \"getAums\"], {\n fetcher: contractFetcher(undefined, FlpManager),\n });\n\n const { data: nativeTokenPrice } = useSWR(\n [`StakeV2:nativeTokenPrice:${active}`, chainId, vaultAddress, \"getMinPrice\", nativeTokenAddress],\n {\n fetcher: contractFetcher(undefined, Vault),\n }\n );\n\n const { data: vestingInfo } = useSWR(\n [`StakeV2:vestingInfo:${active}`, chainId, readerAddress, \"getVestingInfo\", PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(undefined, Reader, [vesterAddresses]),\n }\n );\n\n const { fxdxPrice } = useFxdxPrice(chainId, {}, active);\n\n const fxdxSupplyUrl = getServerUrl(chainId, \"/fxdx_supply\");\n const { data: fxdxSupply } = useSWR([fxdxSupplyUrl], {\n fetcher: (...args) => fetch(...args).then((res) => res.text()),\n });\n\n let aum;\n if (aums && aums.length > 0) {\n aum = aums[0].add(aums[1]).div(2);\n }\n\n const { balanceData, supplyData } = getBalanceAndSupplyData(walletBalances);\n const depositBalanceData = getDepositBalanceData(depositBalances);\n const stakingData = getStakingData(stakingInfo);\n const vestingData = getVestingData(vestingInfo);\n\n const processedData = getProcessedData(\n balanceData,\n supplyData,\n depositBalanceData,\n stakingData,\n vestingData,\n aum,\n nativeTokenPrice,\n stakedFxdxSupply,\n fxdxPrice,\n fxdxSupply\n );\n\n return <>{`${formatKeyAmount(processedData, label, 2, 2, true)}%`};\n}\n","import React, { ReactNode } from \"react\";\nimport { NavLink } from \"react-router-dom\";\nimport cx from \"classnames\";\nimport { getAppBaseUrl, getHomeUrl } from \"lib/legacy\";\n\nimport \"./Header.css\";\nimport { isHomeSite, shouldShowRedirectModal } from \"lib/legacy\";\n\ntype Props = {\n isHome?: boolean;\n isHomeLink?: boolean;\n className?: string;\n exact?: boolean;\n to: string;\n shouldShowRedirectModal?: boolean;\n showRedirectModal: (to: string) => void;\n redirectPopupTimestamp: number;\n children?: ReactNode;\n};\n\nexport function HeaderLink({\n isHomeLink,\n className,\n exact,\n to,\n children,\n redirectPopupTimestamp,\n showRedirectModal,\n}: Props) {\n const isOnHomePage = window.location.pathname === \"/\";\n const isHome = isHomeSite();\n\n if (isHome && !(isHomeLink && !isOnHomePage)) {\n if (shouldShowRedirectModal(redirectPopupTimestamp)) {\n return (\n
showRedirectModal(to)}>\n {children}\n
\n );\n } else {\n const baseUrl = getAppBaseUrl();\n return (\n \n {children}\n \n );\n }\n }\n\n if (isHomeLink) {\n return (\n \n {children}\n \n );\n }\n\n return (\n \n {children}\n \n );\n}\n","import { InjectedConnector } from \"@web3-react/injected-connector\";\nimport {\n GOERLI,\n GOERLI_RPC_PRIVIDERS,\n MUMBAI,\n MUMBAI_RPC_PROVIDERS,\n ARBITRUM,\n ARBITRUM_RPC_PROVIDERS,\n ARBITRUM_TESTNET,\n AVALANCHE,\n AVALANCHE_RPC_PROVIDERS,\n MOONBEAM,\n MOONBEAM_RPC_PROVIDERS,\n DEFAULT_CHAIN_ID,\n getChainName,\n NETWORK_METADATA,\n SUPPORTED_CHAIN_IDS,\n IS_TESTNET,\n} from \"config/chains\";\nimport { UnsupportedChainIdError, useWeb3React } from \"@web3-react/core\";\nimport React, { useEffect, useState } from \"react\";\nimport {\n CURRENT_PROVIDER_LOCALSTORAGE_KEY,\n SELECTED_NETWORK_LOCAL_STORAGE_KEY,\n SHOULD_EAGER_CONNECT_LOCALSTORAGE_KEY,\n WALLET_CONNECT_LOCALSTORAGE_KEY,\n WALLET_LINK_LOCALSTORAGE_PREFIX,\n} from \"config/localStorage\";\nimport {\n UserRejectedRequestError as UserRejectedRequestErrorWalletConnect,\n WalletConnectConnector,\n} from \"@web3-react/walletconnect-connector\";\nimport { helperToast } from \"../helperToast\";\nimport { t, Trans } from \"@lingui/macro\";\n\nconst injectedConnector = new InjectedConnector({\n supportedChainIds: SUPPORTED_CHAIN_IDS,\n});\n\nexport function hasMetaMaskWalletExtension() {\n return window.ethereum;\n}\n\nexport function hasCoinBaseWalletExtension() {\n const { ethereum } = window;\n\n if (!ethereum?.providers && !ethereum?.isCoinbaseWallet) {\n return false;\n }\n\n return window.ethereum.isCoinbaseWallet || ethereum.providers.find(({ isCoinbaseWallet }) => isCoinbaseWallet);\n}\n\nexport function activateInjectedProvider(providerName) {\n const { ethereum } = window;\n\n if (!ethereum?.providers && !ethereum?.isCoinbaseWallet && !ethereum?.isMetaMask) {\n return undefined;\n }\n\n let provider;\n if (ethereum?.providers) {\n switch (providerName) {\n case \"CoinBase\":\n provider = ethereum.providers.find(({ isCoinbaseWallet }) => isCoinbaseWallet);\n break;\n case \"MetaMask\":\n default:\n provider = ethereum.providers.find(({ isMetaMask }) => isMetaMask);\n break;\n }\n }\n\n if (provider) {\n ethereum.setSelectedProvider(provider);\n }\n}\n\nexport function getInjectedConnector() {\n return injectedConnector;\n}\n\nexport const getWalletConnectConnector = () => {\n const chainId = localStorage.getItem(SELECTED_NETWORK_LOCAL_STORAGE_KEY) || DEFAULT_CHAIN_ID;\n return new WalletConnectConnector({\n rpc: {\n [GOERLI]: GOERLI_RPC_PRIVIDERS[0],\n [MUMBAI]: MUMBAI_RPC_PROVIDERS[0],\n [AVALANCHE]: AVALANCHE_RPC_PROVIDERS[0],\n [ARBITRUM]: ARBITRUM_RPC_PROVIDERS[0],\n [ARBITRUM_TESTNET]: \"https://rinkeby.arbitrum.io/rpc\",\n [MOONBEAM]: MOONBEAM_RPC_PROVIDERS[0],\n },\n qrcode: true,\n chainId,\n });\n};\n\nexport function clearWalletConnectData() {\n localStorage.removeItem(WALLET_CONNECT_LOCALSTORAGE_KEY);\n}\n\nexport function clearWalletLinkData() {\n Object.entries(localStorage)\n .map((x) => x[0])\n .filter((x) => x.startsWith(WALLET_LINK_LOCALSTORAGE_PREFIX))\n .map((x) => localStorage.removeItem(x));\n}\n\nexport function useEagerConnect(setActivatingConnector) {\n const { activate, active } = useWeb3React();\n const [tried, setTried] = useState(false);\n\n useEffect(() => {\n (async function () {\n if (Boolean(localStorage.getItem(SHOULD_EAGER_CONNECT_LOCALSTORAGE_KEY)) !== true) {\n // only works with WalletConnect\n clearWalletConnectData();\n // force clear localStorage connection for MM/CB Wallet (Brave legacy)\n clearWalletLinkData();\n return;\n }\n\n let shouldTryWalletConnect = false;\n try {\n // naive validation to not trigger Wallet Connect if data is corrupted\n const rawData = localStorage.getItem(WALLET_CONNECT_LOCALSTORAGE_KEY);\n if (rawData) {\n const data = JSON.parse(rawData);\n if (data && data.connected) {\n shouldTryWalletConnect = true;\n }\n }\n } catch (ex) {\n if (ex instanceof SyntaxError) {\n // rawData is not a valid json\n clearWalletConnectData();\n }\n }\n\n if (shouldTryWalletConnect) {\n try {\n const connector = getWalletConnectConnector();\n setActivatingConnector(connector);\n await activate(connector, undefined, true);\n // in case Wallet Connect is activated no need to check injected wallet\n return;\n } catch (ex) {\n // assume data in localstorage is corrupted and delete it to not retry on next page load\n clearWalletConnectData();\n }\n }\n\n try {\n const connector = getInjectedConnector();\n const currentProviderName = localStorage.getItem(CURRENT_PROVIDER_LOCALSTORAGE_KEY) ?? false;\n if (currentProviderName !== false) {\n activateInjectedProvider(currentProviderName);\n }\n const authorized = await connector.isAuthorized();\n if (authorized) {\n setActivatingConnector(connector);\n await activate(connector, undefined, true);\n }\n } catch (ex) {}\n\n setTried(true);\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // 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 (!tried && active) {\n setTried(true);\n }\n }, [tried, active]);\n\n return tried;\n}\n\nexport function useInactiveListener(suppress = false) {\n const injected = getInjectedConnector();\n const { active, error, activate } = useWeb3React();\n\n useEffect(() => {\n const { ethereum } = window;\n if (ethereum && ethereum.on && !active && !error && !suppress) {\n const handleConnect = () => {\n activate(injected);\n };\n const handleChainChanged = (chainId) => {\n activate(injected);\n };\n const handleAccountsChanged = (accounts) => {\n if (accounts.length > 0) {\n activate(injected);\n }\n };\n const handleNetworkChanged = (networkId) => {\n activate(injected);\n };\n\n ethereum.on(\"connect\", handleConnect);\n ethereum.on(\"chainChanged\", handleChainChanged);\n ethereum.on(\"accountsChanged\", handleAccountsChanged);\n ethereum.on(\"networkChanged\", handleNetworkChanged);\n\n return () => {\n if (ethereum.removeListener) {\n ethereum.removeListener(\"connect\", handleConnect);\n ethereum.removeListener(\"chainChanged\", handleChainChanged);\n ethereum.removeListener(\"accountsChanged\", handleAccountsChanged);\n ethereum.removeListener(\"networkChanged\", handleNetworkChanged);\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active, error, suppress, activate]);\n}\n\nexport const addNetwork = async (metadata) => {\n await window.ethereum.request({ method: \"wallet_addEthereumChain\", params: [metadata] }).catch();\n};\n\nexport const switchNetwork = async (chainId, active) => {\n if (!active) {\n // chainId in localStorage allows to switch network even if wallet is not connected\n // or there is no wallet at all\n localStorage.setItem(SELECTED_NETWORK_LOCAL_STORAGE_KEY, chainId);\n document.location.reload();\n return;\n }\n\n try {\n const chainIdHex = \"0x\" + chainId.toString(16);\n await window.ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: chainIdHex }],\n });\n helperToast.success(t`Connected to ${getChainName(chainId)}`);\n return getChainName(chainId);\n } catch (ex) {\n // https://docs.metamask.io/guide/rpc-api.html#other-rpc-methods\n // This error code indicates that the chain has not been added to MetaMask.\n // 4001 error means user has denied the request\n // If the error code is not 4001, then we need to add the network\n if (ex.code !== 4001) {\n return await addNetwork(NETWORK_METADATA[chainId]);\n }\n\n console.error(\"error\", ex);\n }\n};\n\nexport const getWalletConnectHandler = (activate, deactivate, setActivatingConnector) => {\n const fn = async () => {\n const walletConnect = getWalletConnectConnector();\n setActivatingConnector(walletConnect);\n activate(walletConnect, (ex) => {\n if (ex instanceof UnsupportedChainIdError) {\n helperToast.error(\n t`Unsupported chain. Switch to ${IS_TESTNET ? \"Mumbai\" : \"MoonBeam\"} network on your wallet and try again`\n );\n console.warn(ex);\n } else if (!(ex instanceof UserRejectedRequestErrorWalletConnect)) {\n helperToast.error(ex.message);\n console.warn(ex);\n }\n clearWalletConnectData();\n deactivate();\n });\n };\n return fn;\n};\n\nexport const getInjectedHandler = (activate) => {\n const fn = async () => {\n activate(getInjectedConnector(), (e) => {\n const chainId = localStorage.getItem(SELECTED_NETWORK_LOCAL_STORAGE_KEY) || DEFAULT_CHAIN_ID;\n\n if (e instanceof UnsupportedChainIdError) {\n helperToast.error(\n
\n \n
Your wallet is not connected to {getChainName(chainId)}.
\n
\n
switchNetwork(chainId, true)}>\n Switch to {getChainName(chainId)}\n
\n
switchNetwork(chainId, true)}>\n Add {getChainName(chainId)}\n
\n
\n
\n );\n return;\n }\n const errString = e.message ?? e.toString();\n helperToast.error(errString);\n });\n };\n return fn;\n};\n\nexport async function addTokenToMetamask(token) {\n try {\n const wasAdded = await window.ethereum.request({\n method: \"wallet_watchAsset\",\n params: {\n type: \"ERC20\",\n options: {\n address: token.address,\n symbol: token.symbol,\n decimals: token.decimals,\n image: token.imageUrl,\n },\n },\n });\n if (wasAdded) {\n // https://github.com/MetaMask/metamask-extension/issues/11377\n // We can show a toast message when the token is added to metamask but because of the bug we can't. Once the bug is fixed we can show a toast message.\n }\n } catch (error) {\n console.error(error);\n }\n}\n","import React, { useCallback } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Trans } from \"@lingui/macro\";\n\n// import fxdxBigIcon from \"img/ic_fxdx_custom.svg\";\n// import flpBigIcon from \"img/ic_flp_custom.svg\";\n\nimport { isHomeSite } from \"lib/legacy\";\n\nimport { useWeb3React } from \"@web3-react/core\";\n\nimport APRLabel from \"../APRLabel/APRLabel\";\nimport { HeaderLink } from \"../Header/HeaderLink\";\nimport { GOERLI, IS_TESTNET, MOONBEAM, MUMBAI } from \"config/chains\";\nimport { switchNetwork } from \"lib/wallets\";\nimport { useChainId } from \"lib/chains\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nexport default function TokenCard({ showRedirectModal, redirectPopupTimestamp }) {\n const isHome = isHomeSite();\n const { chainId } = useChainId();\n const { active } = useWeb3React();\n\n const changeNetwork = useCallback(\n (network) => {\n if (network === chainId) {\n return;\n }\n if (!active) {\n setTimeout(() => {\n return switchNetwork(network, active);\n }, 500);\n } else {\n return switchNetwork(network, active);\n }\n },\n [chainId, active]\n );\n\n const BuyLink = ({ className, to, children, network }) => {\n if (isHome && showRedirectModal) {\n return (\n \n {children}\n \n );\n }\n\n return (\n changeNetwork(network)}>\n {children}\n \n );\n };\n\n return (\n
\n
\n
\n {/* \"fxdxBigIcon\" FXDX (Not available yet.) */}\n FXDX (Not available yet.\n
\n
\n
\n FXDX is the utility and governance token. Accrues 30% of the platform's generated fees.\n
\n
\n {IS_TESTNET ? (\n <>\n Ethereum APR: \n \n ) : (\n <>\n MoonBeam APR: \n \n )}\n {/* Arbitrum APR: ,{\" \"}\n Avalanche APR: */}\n
\n
\n
\n {IS_TESTNET ? (\n \n Buy on Ethereum\n \n ) : (\n \n Buy on MoonBeam\n \n )}\n\n {/* \n Buy on Arbitrum\n \n \n Buy on Avalanche\n */}\n
\n \n Read more\n \n
\n
\n
\n
\n
\n {/* \"flpBigIcon\" FLP */}\n FLP\n
\n
\n
\n FLP is the liquidity provider token. Accrues 70% of the platform's generated fees.\n
\n
\n {IS_TESTNET ? (\n <>\n Ethereum APR: \n \n ) : (\n <>\n MoonBeam APR: \n \n )}\n\n {/* Arbitrum APR: ,{\" \"}\n Avalanche APR: */}\n
\n
\n
\n {IS_TESTNET ? (\n \n Buy on Ethereum\n \n ) : (\n \n Buy on MoonBeam\n \n )}\n {/* \n Buy on Arbitrum\n \n \n Buy on Avalanche\n */}\n
\n \n Read more\n \n
\n
\n
\n
\n );\n}\n","import React from \"react\";\nimport Footer from \"components/Footer/Footer\";\nimport \"./Home.css\";\n\nimport simpleSwapIcon from \"img/ic_simpleswaps.svg\";\nimport costIcon from \"img/ic_cost.svg\";\nimport liquidityIcon from \"img/ic_liquidity.svg\";\nimport totaluserIcon from \"img/ic_totaluser.svg\";\n\nimport arbitrumIcon from \"img/ic_arbitrum_96.svg\";\nimport avaIcon from \"img/ic_avalanche_96.svg\";\n\nimport statsIcon from \"img/ic_stats.svg\";\nimport tradingIcon from \"img/ic_trading.svg\";\n\nimport useSWR from \"swr\";\n\nimport { USD_DECIMALS, getTotalVolumeSum } from \"lib/legacy\";\n\nimport { useUserStat } from \"domain/legacy\";\n\nimport TokenCard from \"components/TokenCard/TokenCard\";\nimport { Trans } from \"@lingui/macro\";\nimport { HeaderLink } from \"components/Header/HeaderLink\";\nimport { ARBITRUM, AVALANCHE } from \"config/chains\";\nimport { getServerUrl } from \"config/backend\";\nimport { bigNumberify, formatAmount, numberWithCommas } from \"lib/numbers\";\n\nexport default function Home({ showRedirectModal, redirectPopupTimestamp }) {\n // const [openedFAQIndex, setOpenedFAQIndex] = useState(null)\n // const faqContent = [{\n // id: 1,\n // question: \"What is FXDX?\",\n // answer: \"FXDX is a decentralized spot and perpetual exchange that supports low swap fees and zero price impact trades.

Trading is supported by a unique multi-asset pool that earns liquidity providers fees from market making, swap fees, leverage trading (spreads, funding fees & liquidations), and asset rebalancing.

Dynamic pricing is supported by Chainlink Oracles along with TWAP pricing from leading volume DEXs.\"\n // }, {\n // id: 2,\n // question: \"What is the FXDX Governance Token? \",\n // answer: \"The FXDX token is the governance token of the FXDX ecosystem, it provides the token owner voting rights on the direction of the FXDX platform.

Additionally, when FXDX is staked you will earn 30% of the platform-generated fees, you will also earn Escrowed FXDX tokens and Multiplier Points.\"\n // }, {\n // id: 3,\n // question: \"What is the FLP Token? \",\n // answer: \"The FLP token represents the liquidity users provide to the FXDX platform for Swaps and Margin Trading.

To provide liquidity to FLP you trade your crypto asset BTC, ETH, LINK, UNI, USDC, USDT, MIM, or FRAX to the liquidity pool, in exchange, you gain exposure to a diversified index of tokens while earning 50% of the platform trading fees and esFXDX.\"\n // }, {\n // id: 4,\n // question: \"What can I trade on FXDX? \",\n // answer: \"On FXDX you can swap or margin trade any of the following assets: ETH, BTC, LINK, UNI, USDC, USDT, MIM, FRAX, with others to be added. \"\n // }]\n\n // const toggleFAQContent = function(index) {\n // if (openedFAQIndex === index) {\n // setOpenedFAQIndex(null)\n // } else {\n // setOpenedFAQIndex(index)\n // }\n // }\n\n // ARBITRUM\n\n const arbitrumPositionStatsUrl = getServerUrl(ARBITRUM, \"/position_stats\");\n const { data: arbitrumPositionStats } = useSWR([arbitrumPositionStatsUrl], {\n fetcher: (...args) => fetch(...args).then((res) => res.json()),\n });\n\n const arbitrumTotalVolumeUrl = getServerUrl(ARBITRUM, \"/total_volume\");\n const { data: arbitrumTotalVolume } = useSWR([arbitrumTotalVolumeUrl], {\n fetcher: (...args) => fetch(...args).then((res) => res.json()),\n });\n\n // AVALANCHE\n\n const avalanchePositionStatsUrl = getServerUrl(AVALANCHE, \"/position_stats\");\n const { data: avalanchePositionStats } = useSWR([avalanchePositionStatsUrl], {\n fetcher: (...args) => fetch(...args).then((res) => res.json()),\n });\n\n const avalancheTotalVolumeUrl = getServerUrl(AVALANCHE, \"/total_volume\");\n const { data: avalancheTotalVolume } = useSWR([avalancheTotalVolumeUrl], {\n fetcher: (...args) => fetch(...args).then((res) => res.json()),\n });\n\n // Total Volume\n\n const arbitrumTotalVolumeSum = getTotalVolumeSum(arbitrumTotalVolume);\n const avalancheTotalVolumeSum = getTotalVolumeSum(avalancheTotalVolume);\n\n let totalVolumeSum = bigNumberify(0);\n if (arbitrumTotalVolumeSum && avalancheTotalVolumeSum) {\n totalVolumeSum = totalVolumeSum.add(arbitrumTotalVolumeSum);\n totalVolumeSum = totalVolumeSum.add(avalancheTotalVolumeSum);\n }\n\n // Open Interest\n\n let openInterest = bigNumberify(0);\n if (\n arbitrumPositionStats &&\n arbitrumPositionStats.totalLongPositionSizes &&\n arbitrumPositionStats.totalShortPositionSizes\n ) {\n openInterest = openInterest.add(arbitrumPositionStats.totalLongPositionSizes);\n openInterest = openInterest.add(arbitrumPositionStats.totalShortPositionSizes);\n }\n\n if (\n avalanchePositionStats &&\n avalanchePositionStats.totalLongPositionSizes &&\n avalanchePositionStats.totalShortPositionSizes\n ) {\n openInterest = openInterest.add(avalanchePositionStats.totalLongPositionSizes);\n openInterest = openInterest.add(avalanchePositionStats.totalShortPositionSizes);\n }\n\n // user stat\n const arbitrumUserStats = useUserStat(ARBITRUM);\n const avalancheUserStats = useUserStat(AVALANCHE);\n let totalUsers = 0;\n\n if (arbitrumUserStats && arbitrumUserStats.uniqueCount) {\n totalUsers += arbitrumUserStats.uniqueCount;\n }\n\n if (avalancheUserStats && avalancheUserStats.uniqueCount) {\n totalUsers += avalancheUserStats.uniqueCount;\n }\n\n const LaunchExchangeButton = () => {\n return (\n \n Launch Exchange\n \n );\n };\n\n return (\n
\n
\n {/*
*/}\n
\n
\n
\n \n Decentralized\n
\n Perpetual Exchange\n
\n
\n
\n \n Trade BTC, ETH, AVAX and other top cryptocurrencies with up to 30x leverage directly from your wallet\n \n
\n \n
\n
\n
\n
\n \"Total\n
\n
\n Total Trading Volume\n
\n
${formatAmount(totalVolumeSum, USD_DECIMALS, 0, true)}
\n
\n
\n
\n \"Open\n
\n
\n Open Interest\n
\n
${formatAmount(openInterest, USD_DECIMALS, 0, true)}
\n
\n
\n
\n \"Total\n
\n
\n Total Users\n
\n
{numberWithCommas(totalUsers.toFixed(0))}
\n
\n
\n
\n
\n
\n
\n
\n
\n \"Reduce\n
\n Reduce Liquidation Risks\n
\n
\n
\n \n An aggregate of high-quality price feeds determine when liquidations occur. This keeps positions safe\n from temporary wicks.\n \n
\n
\n
\n
\n \"Save\n
\n Save on Costs\n
\n
\n
\n \n Enter and exit positions with minimal spread and zero price impact. Get the optimal price without\n incurring additional costs.\n \n
\n
\n
\n
\n \"Simple\n
\n Simple Swaps\n
\n
\n
\n \n Open positions through a simple swap interface. Conveniently swap from any supported asset into the\n position of your choice.\n \n
\n
\n
\n
\n
\n
\n
\n
\n Available on your preferred network\n
\n
\n FXDX is currently live on Arbitrum and Avalanche.\n
\n
\n
\n
\n
\n \"Arbitrum\n
\n
\n
Arbitrum
\n
\n \n
\n
\n
\n
\n
\n \"Avalanche\n
\n
\n
Avalanche
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n Two tokens create our ecosystem\n
\n
\n \n
\n
\n\n {/*
\n
\n
\n \"fxdxbig\"\n
\n
\n
*/}\n {/*
\n
\n
\n
FAQs
\n
Most asked questions. If you wish to learn more, please head to our Documentation page.
\n Documentation\n
\n
\n {\n faqContent.map((content, index) => (\n
toggleFAQContent(index)}>\n
\n
\n {\n openedFAQIndex === index ? : \n }\n
\n
\n { content.question }\n
\n
\n
\n
\n
\n
\n
\n
\n
\n ))\n }\n
\n
\n
*/}\n
\n
\n );\n}\n","import cx from \"classnames\";\nimport { useCallback, useState, useRef } from \"react\";\nimport { IS_TOUCH } from \"config/ui\";\n\nconst OPEN_DELAY = 0;\nconst CLOSE_DELAY = 100;\n\nexport default function Tooltip(props) {\n const [visible, setVisible] = useState(false);\n const intervalCloseRef = useRef(null);\n const intervalOpenRef = useRef(null);\n\n const position = props.position ?? \"left-bottom\";\n const trigger = props.trigger ?? \"hover\";\n\n const onMouseEnter = useCallback(() => {\n if (trigger !== \"hover\" || IS_TOUCH) return;\n\n if (intervalCloseRef.current) {\n clearInterval(intervalCloseRef.current);\n intervalCloseRef.current = null;\n }\n if (!intervalOpenRef.current) {\n intervalOpenRef.current = setTimeout(() => {\n setVisible(true);\n intervalOpenRef.current = null;\n }, OPEN_DELAY);\n }\n }, [setVisible, intervalCloseRef, intervalOpenRef, trigger]);\n\n const onMouseClick = useCallback(() => {\n if (trigger !== \"click\" && !IS_TOUCH) return;\n if (intervalCloseRef.current) {\n clearInterval(intervalCloseRef.current);\n intervalCloseRef.current = null;\n }\n if (intervalOpenRef.current) {\n clearInterval(intervalOpenRef.current);\n intervalOpenRef.current = null;\n }\n\n setVisible(true);\n }, [setVisible, intervalCloseRef, trigger]);\n\n const onMouseLeave = useCallback(() => {\n intervalCloseRef.current = setTimeout(() => {\n setVisible(false);\n intervalCloseRef.current = null;\n }, CLOSE_DELAY);\n if (intervalOpenRef.current) {\n clearInterval(intervalOpenRef.current);\n intervalOpenRef.current = null;\n }\n }, [setVisible, intervalCloseRef]);\n\n const className = cx(\"Tooltip\", props.className);\n\n return (\n \n \n {props.handle}\n \n {visible &&
{props.renderContent()}
}\n \n );\n}\n","import useSWR from \"swr\";\nimport { arrayURLFetcher } from \"lib/legacy\";\nimport { GOERLI, IS_TESTNET, MOONBEAM, MUMBAI } from \"config/chains\";\nimport { getServerUrl } from \"config/backend\";\nconst ACTIVE_CHAIN_IDS = [IS_TESTNET ? MUMBAI : MOONBEAM];\n\nexport default function useFeesSummary() {\n const { data: feesSummary } = useSWR(\n ACTIVE_CHAIN_IDS.map((chainId) => getServerUrl(chainId, \"/fees_summary\")),\n {\n fetcher: arrayURLFetcher,\n }\n );\n\n const feesSummaryByChain = {};\n for (let i = 0; i < ACTIVE_CHAIN_IDS.length; i++) {\n if (feesSummary && feesSummary.length === ACTIVE_CHAIN_IDS.length) {\n feesSummaryByChain[ACTIVE_CHAIN_IDS[i]] = feesSummary[i];\n } else {\n feesSummaryByChain[ACTIVE_CHAIN_IDS[i]] = {};\n }\n }\n\n return { data: feesSummaryByChain };\n}\n","import { Menu } from \"@headlessui/react\";\nimport { FiChevronDown } from \"react-icons/fi\";\nimport \"./AssetDropdown.css\";\nimport coingeckoIcon from \"img/ic_coingecko_16.svg\";\nimport ethereumIcon from \"img/ic_ethereum_16.svg\";\nimport arbitrumIcon from \"img/ic_arbitrum_16.svg\";\nimport avalancheIcon from \"img/ic_avalanche_16.svg\";\nimport moonbeamIcon from \"img/ic_moonbeam_16.svg\";\nimport metamaskIcon from \"img/ic_metamask_16.svg\";\nimport { useWeb3React } from \"@web3-react/core\";\n\nimport { t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\nimport { ICONLINKS, PLATFORM_TOKENS } from \"config/tokens\";\nimport { addTokenToMetamask } from \"lib/wallets\";\nimport { useChainId } from \"lib/chains\";\n\nfunction AssetDropdown({ assetSymbol, assetInfo }) {\n const { active } = useWeb3React();\n const { chainId } = useChainId();\n let { coingecko, arbitrum, avalanche, ethereum, moonbeam } = ICONLINKS[chainId][assetSymbol] || {};\n const unavailableTokenSymbols =\n {\n 42161: [\"ETH\"],\n 43114: [\"AVAX\"],\n }[chainId] || [];\n\n return (\n \n \n \n \n \n \n <>\n {coingecko && (\n \n \"Open\n

\n Open in Coingecko\n

\n
\n )}\n \n
\n \n <>\n {ethereum && (\n \n \"Open\n

\n Open in Explorer\n

\n
\n )}\n {arbitrum && (\n \n \"Open\n

\n Open in Explorer\n

\n
\n )}\n {avalanche && (\n \n \"Open\n

\n Open in Explorer\n

\n
\n )}\n {moonbeam && (\n \n \"Open\n

\n Open in Explorer\n

\n
\n )}\n \n
\n \n <>\n {active && unavailableTokenSymbols.indexOf(assetSymbol) < 0 && (\n {\n let token = assetInfo\n ? { ...assetInfo, image: assetInfo.imageUrl }\n : PLATFORM_TOKENS[chainId][assetSymbol];\n addTokenToMetamask(token);\n }}\n className=\"asset-item\"\n >\n {t`Add\n

\n Add to Metamask\n

\n \n )}\n \n
\n
\n
\n );\n}\n\nexport default AssetDropdown;\n","import { IS_TESTNET } from \"config/chains\";\nimport { Helmet } from \"react-helmet\";\n\nfunction SEO(props) {\n const { children, ...customMeta } = props;\n const networks = IS_TESTNET ? \"Mumbai\" : \"MoonBeam\";\n\n const meta = {\n title: \"fxdx | Decentralized Perpetual Exchange\",\n description:\n `Trade spot or perpetual BTC, ETH and other top cryptocurrencies with up to 30x leverage directly from your wallet on ${networks}.`,\n image: IS_TESTNET ? \"https://test.fxdx.exchange/og.png\" : \"https://app.fxdx.exchange/og.png\",\n type: \"exchange\",\n ...customMeta,\n };\n return (\n <>\n \n {meta.title}\n \n \n \n \n \n \n \n \n \n \n \n \n \n {children}\n \n );\n}\n\nexport default SEO;\n","import useSWR from \"swr\";\nimport { arrayURLFetcher, getTotalVolumeSum } from \"lib/legacy\";\nimport { GOERLI, IS_TESTNET, MOONBEAM, MUMBAI } from \"config/chains\";\nimport { getServerUrl } from \"config/backend\";\nimport { bigNumberify } from \"lib/numbers\";\nconst ACTIVE_CHAIN_IDS = [IS_TESTNET ? MUMBAI : MOONBEAM];\n\nexport default function useTotalVolume() {\n const { data: totalVolume } = useSWR(\n ACTIVE_CHAIN_IDS.map((chain) => getServerUrl(chain, \"/total_volume\")),\n {\n fetcher: arrayURLFetcher,\n }\n );\n if (totalVolume?.length > 0) {\n return ACTIVE_CHAIN_IDS.reduce(\n (acc, chainId, index) => {\n const sum = getTotalVolumeSum(totalVolume[index]);\n acc[chainId] = sum;\n acc.total = acc.total.add(sum);\n return acc;\n },\n { total: bigNumberify(0) }\n );\n }\n}\n","import { Trans } from \"@lingui/macro\";\nimport { BigNumber } from \"ethers\";\nimport { USD_DECIMALS } from \"lib/legacy\";\nimport \"./StatsTooltip.css\";\nimport { formatAmount } from \"lib/numbers\";\nimport { IS_TESTNET } from \"config/chains\";\n\ntype Props = {\n title: string;\n total?: BigNumber;\n ethereumValue?: BigNumber,\n avaxValue?: BigNumber;\n arbitrumValue?: BigNumber;\n moonbeamValue?: BigNumber;\n showDollar?: boolean;\n decimalsForConversion: number;\n symbol: string;\n};\n\nexport default function StatsTooltip({\n title,\n total,\n ethereumValue,\n moonbeamValue,\n // avaxValue,\n // arbitrumValue,\n showDollar = true,\n decimalsForConversion = USD_DECIMALS,\n symbol,\n}: Props) {\n return (\n <>\n {IS_TESTNET ? (\n

\n \n {title} on Ethereum:\n \n \n {showDollar && \"$\"}\n {formatAmount(ethereumValue, decimalsForConversion, 0, true)}\n {!showDollar && symbol && \" \" + symbol}\n \n

\n ) : (\n

\n \n {title} on MoonBeam:\n \n \n {showDollar && \"$\"}\n {formatAmount(moonbeamValue, decimalsForConversion, 0, true)}\n {!showDollar && symbol && \" \" + symbol}\n \n

\n )}\n {/*

\n \n {title} on Arbitrum:\n \n \n {showDollar && \"$\"}\n {formatAmount(arbitrumValue, decimalsForConversion, 0, true)}\n {!showDollar && symbol && \" \" + symbol}\n \n

\n

\n \n {title} on Avalanche:\n \n \n {showDollar && \"$\"}\n {formatAmount(avaxValue, decimalsForConversion, 0, true)}\n {!showDollar && symbol && \" \" + symbol}\n \n

*/}\n
\n

\n \n Total:\n \n \n {showDollar && \"$\"}\n {formatAmount(total, decimalsForConversion, 0, true)}\n {!showDollar && symbol && \" \" + symbol}\n \n

\n \n );\n}\n","import \"./StatsTooltip.css\";\ntype Props = {\n label: string;\n value: number | [number];\n showDollar?: boolean;\n};\n\nexport default function StatsTooltipRow({ label, value, showDollar = true }: Props) {\n function renderValue() {\n if (Array.isArray(value)) {\n return (\n
    \n {value.map((v, i) => (\n
  • {v}
  • \n ))}\n
\n );\n }\n return (\n \n {showDollar && \"$\"}\n {value}\n \n );\n }\n return (\n
\n {label}:\n {renderValue()}\n
\n );\n}\n","import React, { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport { Trans, t } from \"@lingui/macro\";\nimport useSWR from \"swr\";\nimport { PieChart, Pie, Cell, Tooltip } from \"recharts\";\nimport TooltipComponent from \"components/Tooltip/Tooltip\";\n\nimport hexToRgba from \"hex-to-rgba\";\nimport { ethers } from \"ethers\";\n\nimport {\n USD_DECIMALS,\n FXDX_DECIMALS,\n FLP_DECIMALS,\n BASIS_POINTS_DIVISOR,\n DEFAULT_MAX_USDF_AMOUNT,\n getPageTitle,\n importImage,\n arrayURLFetcher,\n} from \"lib/legacy\";\nimport { useTotalFxdxInLiquidity, useFxdxPrice, useTotalFxdxStaked, useTotalFxdxSupply } from \"domain/legacy\";\nimport useFeesSummary from \"domain/useFeesSummary\";\n\nimport { getContract } from \"config/contracts\";\n\nimport Vault from \"abis/Vault.json\";\nimport Reader from \"abis/Reader.json\";\nimport FlpManager from \"abis/FlpManager.json\";\nimport Footer from \"components/Footer/Footer\";\n\nimport \"./Dashboard.css\";\n\n// import fxdx40Icon from \"img/ic_fxdx_40.svg\";\n// import flp40Icon from \"img/ic_flp_40.svg\";\nimport arbitrum16Icon from \"img/ic_arbitrum_16.svg\";\nimport arbitrum24Icon from \"img/ic_arbitrum_24.svg\";\nimport avalanche16Icon from \"img/ic_avalanche_16.svg\";\nimport avalanche24Icon from \"img/ic_avalanche_24.svg\";\nimport ethereum16Icon from \"img/ic_ethereum_16.svg\";\nimport ethereum24Icon from \"img/ic_ethereum_24.svg\";\nimport moonbeam16Icon from \"img/ic_moonbeam_16.svg\";\nimport moonbeam24Icon from \"img/ic_moonbeam_24.svg\";\n\nimport AssetDropdown from \"./AssetDropdown\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\nimport SEO from \"components/Common/SEO\";\nimport useTotalVolume from \"domain/useTotalVolume\";\nimport StatsTooltip from \"components/StatsTooltip/StatsTooltip\";\nimport StatsTooltipRow from \"components/StatsTooltip/StatsTooltipRow\";\nimport { ARBITRUM, AVALANCHE, getChainName, GOERLI, IS_TESTNET, MAINNET, MOONBEAM, MUMBAI } from \"config/chains\";\nimport { getServerUrl } from \"config/backend\";\nimport { contractFetcher } from \"lib/contracts\";\nimport { useInfoTokens } from \"domain/tokens\";\nimport { getWhitelistedTokens, FLP_POOL_COLORS } from \"config/tokens\";\nimport {\n bigNumberify,\n expandDecimals,\n formatAmount,\n formatKeyAmount,\n formatKeyPrice,\n numberWithCommas,\n} from \"lib/numbers\";\nimport { useChainId } from \"lib/chains\";\nimport { formatDate } from \"lib/dates\";\nconst ACTIVE_CHAIN_IDS = [IS_TESTNET ? MUMBAI : MOONBEAM];\n\nconst { AddressZero } = ethers.constants;\n\nfunction getVolumeInfo(hourlyVolumes) {\n if (!hourlyVolumes || hourlyVolumes.length === 0) {\n return {};\n }\n const dailyVolumes = hourlyVolumes.map((hourlyVolume) => {\n const secondsPerHour = 60 * 60;\n const minTime = parseInt(Date.now() / 1000 / secondsPerHour) * secondsPerHour - 24 * secondsPerHour;\n const info = {};\n let totalVolume = bigNumberify(0);\n for (let i = 0; i < hourlyVolume.length; i++) {\n const item = hourlyVolume[i].data;\n if (parseInt(item.timestamp) < minTime) {\n break;\n }\n\n if (!info[item.token]) {\n info[item.token] = bigNumberify(0);\n }\n\n info[item.token] = info[item.token].add(item.volume);\n totalVolume = totalVolume.add(item.volume);\n }\n info.totalVolume = totalVolume;\n return info;\n });\n return dailyVolumes.reduce(\n (acc, cv, index) => {\n acc.totalVolume = acc.totalVolume.add(cv.totalVolume);\n acc[ACTIVE_CHAIN_IDS[index]] = cv;\n return acc;\n },\n { totalVolume: bigNumberify(0) }\n );\n}\n\nfunction getPositionStats(positionStats) {\n if (!positionStats || positionStats.length === 0) {\n return null;\n }\n return positionStats.reduce(\n (acc, cv, i) => {\n acc.totalLongPositionSizes = acc.totalLongPositionSizes.add(cv.totalLongPositionSizes);\n acc.totalShortPositionSizes = acc.totalShortPositionSizes.add(cv.totalShortPositionSizes);\n acc[ACTIVE_CHAIN_IDS[i]] = cv;\n return acc;\n },\n {\n totalLongPositionSizes: bigNumberify(0),\n totalShortPositionSizes: bigNumberify(0),\n }\n );\n}\n\nfunction getCurrentFeesUsd(tokenAddresses, fees, infoTokens) {\n if (!fees || !infoTokens) {\n return bigNumberify(0);\n }\n\n let currentFeesUsd = bigNumberify(0);\n for (let i = 0; i < tokenAddresses.length; i++) {\n const tokenAddress = tokenAddresses[i];\n const tokenInfo = infoTokens[tokenAddress];\n if (!tokenInfo || !tokenInfo.contractMinPrice) {\n continue;\n }\n\n const feeUsd = fees[i].mul(tokenInfo.contractMinPrice).div(expandDecimals(1, tokenInfo.decimals));\n currentFeesUsd = currentFeesUsd.add(feeUsd);\n }\n\n return currentFeesUsd;\n}\n\nexport default function Dashboard() {\n const { active, library } = useWeb3React();\n const { chainId } = useChainId();\n const totalVolume = useTotalVolume();\n\n const chainName = getChainName(chainId);\n\n const { data: positionStats } = useSWR(\n ACTIVE_CHAIN_IDS.map((chainId) => getServerUrl(chainId, \"/position_stats\")),\n {\n fetcher: arrayURLFetcher,\n }\n );\n\n const { data: hourlyVolumes } = useSWR(\n ACTIVE_CHAIN_IDS.map((chainId) => getServerUrl(chainId, \"/hourly_volume\")),\n {\n fetcher: arrayURLFetcher,\n }\n );\n\n let { total: totalFxdxSupply } = useTotalFxdxSupply(true);\n\n const currentVolumeInfo = getVolumeInfo(hourlyVolumes);\n\n const positionStatsInfo = getPositionStats(positionStats);\n\n function getWhitelistedTokenAddresses(chainId) {\n const whitelistedTokens = getWhitelistedTokens(chainId);\n return whitelistedTokens.map((token) => token.address);\n }\n\n const whitelistedTokens = getWhitelistedTokens(chainId);\n const tokenList = whitelistedTokens.filter((t) => !t.isWrapped);\n const visibleTokens = tokenList.filter((t) => !t.isTempHidden);\n\n const readerAddress = getContract(chainId, \"Reader\");\n const vaultAddress = getContract(chainId, \"Vault\");\n const flpManagerAddress = getContract(chainId, \"FlpManager\");\n\n const fxdxAddress = getContract(chainId, \"FXDX\");\n const flpAddress = getContract(chainId, \"FLP\");\n const usdfAddress = getContract(chainId, \"USDF\");\n\n const tokensForSupplyQuery = [fxdxAddress, flpAddress, usdfAddress];\n\n const { data: aums } = useSWR([`Dashboard:getAums:${active}`, chainId, flpManagerAddress, \"getAums\"], {\n fetcher: contractFetcher(library, FlpManager),\n });\n\n const { data: totalSupplies } = useSWR(\n [`Dashboard:totalSupplies:${active}`, chainId, readerAddress, \"getTokenBalancesWithSupplies\", AddressZero],\n {\n fetcher: contractFetcher(library, Reader, [tokensForSupplyQuery]),\n }\n );\n\n const { data: totalTokenWeights } = useSWR(\n [`FlpSwap:totalTokenWeights:${active}`, chainId, vaultAddress, \"totalTokenWeights\"],\n {\n fetcher: contractFetcher(library, Vault),\n }\n );\n\n const { infoTokens } = useInfoTokens(library, chainId, active, undefined, undefined);\n const { infoTokens: infoTokensEthereum } = useInfoTokens(\n null,\n IS_TESTNET ? MUMBAI : MOONBEAM,\n active,\n undefined,\n undefined\n );\n // const { infoTokens: infoTokensArbitrum } = useInfoTokens(null, ARBITRUM, active, undefined, undefined);\n // const { infoTokens: infoTokensAvax } = useInfoTokens(null, AVALANCHE, active, undefined, undefined);\n // const { infoTokens: infoTokensMoonBeam } = useInfoTokens(null, MOONBEAM, active, undefined, undefined)\n\n const { data: currentFees } = useSWR(\n infoTokensEthereum[AddressZero].contractMinPrice // && infoTokensAvax[AddressZero].contractMinPrice\n ? \"Dashboard:currentFees\"\n : null,\n {\n fetcher: () => {\n return Promise.all(\n ACTIVE_CHAIN_IDS.map((chainId) =>\n contractFetcher(null, Reader, [getWhitelistedTokenAddresses(chainId)])(\n `Dashboard:fees:${chainId}`,\n chainId,\n getContract(chainId, \"Reader\"),\n \"getFees\",\n getContract(chainId, \"Vault\")\n )\n )\n ).then((fees) => {\n return fees.reduce(\n (acc, cv, i) => {\n const feeUSD = getCurrentFeesUsd(\n getWhitelistedTokenAddresses(ACTIVE_CHAIN_IDS[i]),\n cv,\n // ACTIVE_CHAIN_IDS[i] === ARBITRUM ? infoTokensArbitrum : infoTokensAvax\n infoTokensEthereum\n );\n acc[ACTIVE_CHAIN_IDS[i]] = feeUSD;\n acc.total = acc.total.add(feeUSD);\n return acc;\n },\n { total: bigNumberify(0) }\n );\n });\n },\n }\n );\n\n const { data: feesSummaryByChain } = useFeesSummary();\n const feesSummary = feesSummaryByChain[chainId];\n\n // const eth = infoTokens[getTokenBySymbol(chainId, \"ETH\").address];\n const shouldIncludeCurrrentFees =\n feesSummaryByChain[chainId].lastUpdatedAt &&\n parseInt(Date.now() / 1000) - feesSummaryByChain[chainId].lastUpdatedAt > 60 * 60;\n\n const totalFees = ACTIVE_CHAIN_IDS.map((chainId) => {\n if (shouldIncludeCurrrentFees && currentFees && currentFees[chainId]) {\n return currentFees[chainId].div(expandDecimals(1, USD_DECIMALS)).add(feesSummaryByChain[chainId].totalFees || 0);\n }\n\n return feesSummaryByChain[chainId].totalFees || 0;\n })\n .map((v) => Math.round(v))\n .reduce(\n (acc, cv, i) => {\n acc[ACTIVE_CHAIN_IDS[i]] = cv;\n acc.total = acc.total + cv;\n return acc;\n },\n { total: 0 }\n );\n\n const {\n fxdxPrice,\n fxdxPriceFromEthereum,\n fxdxPriceFromMoonBeam,\n /*, fxdxPriceFromArbitrum, fxdxPriceFromAvalanche */\n } = useFxdxPrice(chainId, { arbitrum: chainId === ARBITRUM ? library : undefined }, active);\n\n let { total: totalFxdxInLiquidity } = useTotalFxdxInLiquidity(chainId, active);\n\n let {\n total: totalStakedFxdx,\n ethereum: ethereumStakedFxdx,\n moonbeam: moonbeamStakedFxdx,\n // avax: avaxStakedFxdx,\n // arbitrum: arbitrumStakedFxdx\n } = useTotalFxdxStaked();\n\n let fxdxMarketCap;\n if (fxdxPrice && totalFxdxSupply) {\n fxdxMarketCap = fxdxPrice.mul(totalFxdxSupply).div(expandDecimals(1, FXDX_DECIMALS));\n }\n\n let stakedFxdxSupplyUsd;\n if (fxdxPrice && totalStakedFxdx) {\n stakedFxdxSupplyUsd = totalStakedFxdx.mul(fxdxPrice).div(expandDecimals(1, FXDX_DECIMALS));\n }\n\n let aum;\n if (aums && aums.length > 0) {\n aum = aums[0].add(aums[1]).div(2);\n }\n\n let flpPrice;\n let flpSupply;\n let flpMarketCap;\n if (aum && totalSupplies && totalSupplies[3]) {\n flpSupply = totalSupplies[3];\n flpPrice =\n aum && aum.gt(0) && flpSupply.gt(0)\n ? aum.mul(expandDecimals(1, FLP_DECIMALS)).div(flpSupply)\n : expandDecimals(1, USD_DECIMALS);\n flpMarketCap = flpPrice.mul(flpSupply).div(expandDecimals(1, FLP_DECIMALS));\n }\n\n let tvl;\n if (flpMarketCap && fxdxPrice && totalStakedFxdx) {\n tvl = flpMarketCap.add(fxdxPrice.mul(totalStakedFxdx).div(expandDecimals(1, FXDX_DECIMALS)));\n }\n\n // const ethFloorPriceFund = expandDecimals(350 + 148 + 384, 18);\n // const flpFloorPriceFund = expandDecimals(660001, 18);\n // const usdcFloorPriceFund = expandDecimals(784598 + 200000, 30);\n\n // let totalFloorPriceFundUsd;\n\n // if (eth && eth.contractMinPrice && flpPrice) {\n // const ethFloorPriceFundUsd = ethFloorPriceFund.mul(eth.contractMinPrice).div(expandDecimals(1, eth.decimals));\n // const flpFloorPriceFundUsd = flpFloorPriceFund.mul(flpPrice).div(expandDecimals(1, 18));\n\n // totalFloorPriceFundUsd = ethFloorPriceFundUsd.add(flpFloorPriceFundUsd).add(usdcFloorPriceFund);\n // }\n\n let adjustedUsdfSupply = bigNumberify(0);\n\n for (let i = 0; i < tokenList.length; i++) {\n const token = tokenList[i];\n const tokenInfo = infoTokens[token.address];\n if (tokenInfo && tokenInfo.usdfAmount) {\n adjustedUsdfSupply = adjustedUsdfSupply.add(tokenInfo.usdfAmount);\n }\n }\n\n const getWeightText = (tokenInfo) => {\n if (\n !tokenInfo.weight ||\n !tokenInfo.usdfAmount ||\n !adjustedUsdfSupply ||\n adjustedUsdfSupply.eq(0) ||\n !totalTokenWeights\n ) {\n return \"...\";\n }\n\n const currentWeightBps = tokenInfo.usdfAmount.mul(BASIS_POINTS_DIVISOR).div(adjustedUsdfSupply);\n // use add(1).div(10).mul(10) to round numbers up\n const targetWeightBps = tokenInfo.weight.mul(BASIS_POINTS_DIVISOR).div(totalTokenWeights).add(1).div(10).mul(10);\n\n const weightText = `${formatAmount(currentWeightBps, 2, 2, false)}% / ${formatAmount(\n targetWeightBps,\n 2,\n 2,\n false\n )}%`;\n\n return (\n {\n return (\n <>\n \n \n
\n {currentWeightBps.lt(targetWeightBps) && (\n
\n \n {tokenInfo.symbol} is below its target weight.\n
\n
\n Get lower fees to{\" \"}\n \n buy FLP\n {\" \"}\n with {tokenInfo.symbol},  and to{\" \"}\n \n swap\n {\" \"}\n {tokenInfo.symbol} for other tokens.\n
\n
\n )}\n {currentWeightBps.gt(targetWeightBps) && (\n
\n \n {tokenInfo.symbol} is above its target weight.\n
\n
\n Get lower fees to{\" \"}\n \n swap\n {\" \"}\n tokens for {tokenInfo.symbol}.\n
\n
\n )}\n
\n
\n \n More Info\n \n
\n \n );\n }}\n />\n );\n };\n\n let stakedPercent = 0;\n\n if (totalFxdxSupply && !totalFxdxSupply.isZero() && !totalStakedFxdx.isZero()) {\n stakedPercent = totalStakedFxdx.mul(100).div(totalFxdxSupply).toNumber();\n }\n\n let liquidityPercent = 0;\n\n if (totalFxdxSupply && !totalFxdxSupply.isZero() && totalFxdxInLiquidity) {\n liquidityPercent = totalFxdxInLiquidity.mul(100).div(totalFxdxSupply).toNumber();\n }\n\n let notStakedPercent = 100 - stakedPercent - liquidityPercent;\n\n let fxdxDistributionData = [\n {\n name: t`staked`,\n value: stakedPercent,\n color: \"#4353fa\",\n },\n {\n name: t`in liquidity`,\n value: liquidityPercent,\n color: \"#0598fa\",\n },\n {\n name: t`not staked`,\n value: notStakedPercent,\n color: \"#5c0af5\",\n },\n ];\n\n const totalStatsStartDate = chainId === GOERLI ? t`03 Nov 2022` : t`14 DEC 2022`;\n\n let stableFlp = 0;\n let totalFlp = 0;\n\n let flpPool = tokenList.map((token) => {\n const tokenInfo = infoTokens[token.address];\n if (tokenInfo.usdfAmount && adjustedUsdfSupply && adjustedUsdfSupply.gt(0)) {\n const currentWeightBps = tokenInfo.usdfAmount.mul(BASIS_POINTS_DIVISOR).div(adjustedUsdfSupply);\n if (tokenInfo.isStable) {\n stableFlp += parseFloat(`${formatAmount(currentWeightBps, 2, 2, false)}`);\n }\n totalFlp += parseFloat(`${formatAmount(currentWeightBps, 2, 2, false)}`);\n return {\n fullname: token.name,\n name: token.symbol,\n value: parseFloat(`${formatAmount(currentWeightBps, 2, 2, false)}`),\n };\n }\n return null;\n });\n\n let stablePercentage = totalFlp > 0 ? ((stableFlp * 100) / totalFlp).toFixed(2) : \"0.0\";\n\n flpPool = flpPool.filter(function (element) {\n return element !== null;\n });\n\n flpPool = flpPool.sort(function (a, b) {\n if (a.value < b.value) return 1;\n else return -1;\n });\n\n fxdxDistributionData = fxdxDistributionData.sort(function (a, b) {\n if (a.value < b.value) return 1;\n else return -1;\n });\n\n const [fxdxActiveIndex, setFXDXActiveIndex] = useState(null);\n\n const onFXDXDistributionChartEnter = (_, index) => {\n setFXDXActiveIndex(index);\n };\n\n const onFXDXDistributionChartLeave = (_, index) => {\n setFXDXActiveIndex(null);\n };\n\n const [flpActiveIndex, setFLPActiveIndex] = useState(null);\n\n const onFLPPoolChartEnter = (_, index) => {\n setFLPActiveIndex(index);\n };\n\n const onFLPPoolChartLeave = (_, index) => {\n setFLPActiveIndex(null);\n };\n\n const CustomTooltip = ({ active, payload }) => {\n if (active && payload && payload.length) {\n return (\n
\n
\n {payload[0].value}% {payload[0].name}\n
\n );\n }\n\n return null;\n };\n\n return (\n \n
\n
\n
\n
\n
\n Stats {chainId === AVALANCHE && \"avalanche24Icon\"}\n {chainId === ARBITRUM && \"arbitrum24Icon\"}\n {chainId === GOERLI && \"ethereum24Icon\"}\n {chainId === MOONBEAM && \"moonbeam24Icon\"}\n
\n
\n \n {chainName} Total Stats start from {totalStatsStartDate}.
For detailed stats:\n
{\" \"}\n {chainId === GOERLI && (\n https://test.stats.fxdx.exchange\n )}\n {chainId === ARBITRUM && (\n \n https://data.fxdx.exchange/arbitrum\n \n )}\n {chainId === AVALANCHE && (\n \n https://data.fxdx.exchange/avalanche\n \n )}\n {chainId === MOONBEAM && (\n https://data.fxdx.exchange\n )}\n .\n
\n
\n
\n
\n
\n
\n
\n Overview\n
\n
\n
\n
\n
\n AUM\n
\n
\n (\n {t`Assets Under Management: FXDX staked (All chains) + FLP pool (${chainName})`}\n )}\n />\n
\n
\n
\n
\n FLP Pool\n
\n
\n {t`Total value of tokens in FLP pool (${chainName})`}}\n />\n
\n
\n
\n
\n 24h Volume\n
\n
\n (\n \n )}\n />\n
\n
\n
\n
\n Long Positions\n
\n
\n (\n \n )}\n />\n
\n
\n
\n
\n Short Positions\n
\n
\n (\n \n )}\n />\n
\n
\n {feesSummary.lastUpdatedAt ? (\n
\n
\n Fees since {formatDate(feesSummary.lastUpdatedAt)}\n
\n
\n (\n \n )}\n />\n
\n
\n ) : null}\n
\n
\n
\n
\n Total Stats\n
\n
\n
\n
\n
\n Total Fees\n
\n
\n (\n \n )}\n />\n
\n
\n
\n
\n Total Volume\n
\n
\n (\n \n )}\n />\n
\n
\n {/*
\n
\n Floor Price Fund\n
\n
${formatAmount(totalFloorPriceFundUsd, 30, 0, true)}
\n
*/}\n
\n
\n
\n
\n
\n Tokens {chainId === AVALANCHE && \"avalanche24Icon\"}\n {chainId === ARBITRUM && \"arbitrum24Icon\"}\n {(chainId === GOERLI || chainId === MAINNET) && \"ethereum24Icon\"}\n {(chainId === MUMBAI || chainId === MAINNET) && \"ethereum24Icon\"}\n {chainId === MOONBEAM && \"moonbeam24Icon\"}\n
\n
\n Platform and FLP index tokens.\n
\n
\n
\n
\n
\n
\n
\n
\n {/*
\n \"FXDX\n
*/}\n
\n
FXDX
\n
FXDX
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n Price\n
\n
\n {!fxdxPrice && \"...\"}\n {fxdxPrice && (\n (\n <>\n {IS_TESTNET && (\n \n )}\n {!IS_TESTNET && (\n \n )}\n {/* \n */}\n \n )}\n />\n )}\n
\n
\n
\n
\n Supply\n
\n
{formatAmount(totalFxdxSupply, FXDX_DECIMALS, 0, true)} FXDX
\n
\n
\n
\n Total Staked\n
\n
\n (\n \n )}\n />\n
\n
\n
\n
\n Market Cap\n
\n
${formatAmount(fxdxMarketCap, USD_DECIMALS, 0, true)}
\n
\n
\n
\n
\n {fxdxDistributionData.length > 0 && (\n \n \n {fxdxDistributionData.map((entry, index) => (\n \n ))}\n \n \n Distribution\n \n } />\n \n )}\n
\n
\n
\n
\n
\n
\n {/*
\n \"flp40Icon\"\n {(chainId === GOERLI || chainId === MAINNET) ? (\n {t`Ethereum\n ) : chainId === ARBITRUM ? (\n {t`Arbitrum\n ) : chainId === AVALANCHE ? (\n {t`Avalanche\n ) : (\n {t`MoonBeam\n )}\n
*/}\n
\n
FLP
\n
FLP
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n Price\n
\n
${formatAmount(flpPrice, USD_DECIMALS, 3, true)}
\n
\n
\n
\n Supply\n
\n
{formatAmount(flpSupply, FLP_DECIMALS, 0, true)} FLP
\n
\n
\n
\n Total Staked\n
\n
${formatAmount(flpMarketCap, USD_DECIMALS, 0, true)}
\n
\n
\n
\n Market Cap\n
\n
${formatAmount(flpMarketCap, USD_DECIMALS, 0, true)}
\n
\n
\n
\n Stablecoin Percentage\n
\n
{stablePercentage}%
\n
\n
\n
\n
\n {flpPool.length > 0 && (\n \n \n {flpPool.map((entry, index) => (\n \n ))}\n \n \n FLP Pool\n \n } />\n \n )}\n
\n
\n
\n
\n
\n FLP Index Composition{\" \"}\n {chainId === AVALANCHE && {t`Avalanche}\n {chainId === ARBITRUM && {t`Arbitrum}\n {chainId === GOERLI && {t`Ethereum}\n {chainId === MUMBAI && {t`Ethereum}\n {chainId === MOONBEAM && {t`MoonBeam}\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n {visibleTokens.map((token) => {\n const tokenInfo = infoTokens[token.address];\n let utilization = bigNumberify(0);\n if (tokenInfo && tokenInfo.reservedAmount && tokenInfo.poolAmount && tokenInfo.poolAmount.gt(0)) {\n utilization = tokenInfo.reservedAmount.mul(BASIS_POINTS_DIVISOR).div(tokenInfo.poolAmount);\n }\n let maxUsdfAmount = DEFAULT_MAX_USDF_AMOUNT;\n if (tokenInfo.maxUsdfAmount && tokenInfo.maxUsdfAmount.gt(0)) {\n maxUsdfAmount = tokenInfo.maxUsdfAmount;\n }\n const tokenImage = importImage(\"ic_\" + token.symbol.toLowerCase() + \"_40.svg\");\n\n return (\n \n \n \n \n \n \n \n );\n })}\n \n
\n TOKEN\n \n PRICE\n \n POOL\n \n WEIGHT\n \n UTILIZATION\n
\n
\n
\n
\n {token.symbol}\n
\n
\n
{token.name}
\n
{token.symbol}
\n
\n
\n \n
\n
\n
\n
${formatKeyPrice(tokenInfo, \"minPrice\", true)}\n {\n return (\n <>\n \n \n \n \n );\n }}\n />\n {getWeightText(tokenInfo)}{formatAmount(utilization, 2, 2, false)}%
\n
\n
\n {visibleTokens.map((token) => {\n const tokenInfo = infoTokens[token.address];\n let utilization = bigNumberify(0);\n if (tokenInfo && tokenInfo.reservedAmount && tokenInfo.poolAmount && tokenInfo.poolAmount.gt(0)) {\n utilization = tokenInfo.reservedAmount.mul(BASIS_POINTS_DIVISOR).div(tokenInfo.poolAmount);\n }\n let maxUsdfAmount = DEFAULT_MAX_USDF_AMOUNT;\n if (tokenInfo.maxUsdfAmount && tokenInfo.maxUsdfAmount.gt(0)) {\n maxUsdfAmount = tokenInfo.maxUsdfAmount;\n }\n\n const tokenImage = importImage(\"ic_\" + token.symbol.toLowerCase() + \"_24.svg\");\n return (\n
\n
\n
\n {token.symbol}\n
{token.symbol}
\n
\n \n
\n
\n
\n
\n
\n
\n
\n Price\n
\n
${formatKeyPrice(tokenInfo, \"minPrice\", true)}
\n
\n
\n
\n Pool\n
\n
\n {\n return (\n <>\n \n \n \n \n );\n }}\n />\n
\n
\n
\n
\n Weight\n
\n
{getWeightText(tokenInfo)}
\n
\n
\n
\n Utilization\n
\n
{formatAmount(utilization, 2, 2, false)}%
\n
\n
\n
\n );\n })}\n
\n
\n
\n
\n
\n
\n );\n}\n","import { disableBodyScroll, enableBodyScroll, clearAllBodyScrollLocks } from \"body-scroll-lock\";\nimport { RefObject, useEffect } from \"react\";\n\nexport const TOUCH_MOVE_CONTAINER_CLASS_NAME = \"DiableScroll-touch-move-container\";\n\n// @see https://github.com/willmcpo/body-scroll-lock#allowtouchmove\nconst allowTouchMoveFn = (el: HTMLElement) => {\n while (el && el !== document.body) {\n if (el.className?.includes?.(TOUCH_MOVE_CONTAINER_CLASS_NAME)) return true;\n\n el = el.parentElement as HTMLElement;\n }\n};\n\nexport default function useLockBodyScroll(\n ref: RefObject,\n isVisible: boolean,\n opts: {\n disableLock?: boolean;\n allowTouchMove?: boolean;\n } = {}\n) {\n useEffect(() => {\n if (opts.disableLock) {\n return;\n }\n\n if (ref.current) {\n if (isVisible) {\n disableBodyScroll(ref.current, {\n allowTouchMove: opts.allowTouchMove ? allowTouchMoveFn : undefined,\n });\n } else {\n enableBodyScroll(ref.current);\n }\n }\n\n return () => clearAllBodyScrollLocks();\n\n // needs ref.current in deps, not just ref\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref.current, opts.allowTouchMove, opts.disableLock, isVisible]);\n}\n","import React, { useRef, useEffect } from \"react\";\nimport cx from \"classnames\";\nimport { motion, AnimatePresence } from \"framer-motion\";\n\nimport { MdClose } from \"react-icons/md\";\n\nimport \"./Modal.css\";\nimport useLockBodyScroll, { TOUCH_MOVE_CONTAINER_CLASS_NAME } from \"lib/useLockBodyScroll\";\n\nexport default function Modal(props) {\n const { isVisible, setIsVisible, className, zIndex, onAfterOpen, disableBodyScrollLock, allowContentTouchMove } =\n props;\n\n const modalRef = useRef(null);\n\n useLockBodyScroll(modalRef, isVisible, {\n disableLock: disableBodyScrollLock,\n allowTouchMove: allowContentTouchMove,\n });\n\n useEffect(() => {\n function close(e) {\n if (e.keyCode === 27) {\n setIsVisible(false);\n }\n }\n window.addEventListener(\"keydown\", close);\n return () => window.removeEventListener(\"keydown\", close);\n }, [setIsVisible]);\n\n useEffect(() => {\n if (typeof onAfterOpen === \"function\") onAfterOpen();\n }, [onAfterOpen]);\n\n const fadeVariants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n };\n\n return (\n \n {isVisible && (\n \n setIsVisible(false)}\n >
\n
\n
\n
{props.label}
\n
setIsVisible(false)}>\n \n
\n
\n
\n
\n {props.children}\n
\n
\n \n )}\n \n );\n}\n","import React from \"react\";\n\nimport cx from \"classnames\";\n\nimport \"./Checkbox.css\";\nimport { ImCheckboxUnchecked, ImCheckboxChecked } from \"react-icons/im\";\n\nexport default function Checkbox(props) {\n const { isChecked, setIsChecked, disabled, className } = props;\n\n return (\n setIsChecked(!isChecked)}\n >\n \n {isChecked && }\n {!isChecked && }\n \n {props.children}\n
\n );\n}\n","import { useLocalStorage } from \"react-use\";\nimport { useCallback } from \"react\";\n\nexport function useLocalStorageByChainId(\n chainId: number,\n key: string,\n defaultValue: T\n): [T | undefined, (value: T) => void] {\n const [internalValue, setInternalValue] = useLocalStorage(key, {});\n\n const setValue = useCallback(\n (value) => {\n setInternalValue((internalValue) => {\n if (typeof value === \"function\") {\n value = value(internalValue?.[chainId] || defaultValue);\n }\n\n const newInternalValue = {\n ...internalValue,\n [chainId]: value,\n };\n return newInternalValue;\n });\n },\n [chainId, setInternalValue, defaultValue]\n );\n\n let value;\n\n if (internalValue && chainId in internalValue) {\n value = internalValue[chainId];\n } else {\n value = defaultValue;\n }\n\n return [value, setValue];\n}\n\nexport function useLocalStorageSerializeKey(\n key: string,\n value: T,\n opts?: {\n raw: boolean;\n serializer: (val: T) => string;\n deserializer: (value: string) => T;\n }\n) {\n key = JSON.stringify(key);\n\n return useLocalStorage(key, value, opts);\n}\n","import React, { useState, useCallback } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { useWeb3React } from \"@web3-react/core\";\n\nimport Modal from \"components/Modal/Modal\";\nimport Checkbox from \"components/Checkbox/Checkbox\";\nimport Tooltip from \"components/Tooltip/Tooltip\";\nimport Footer from \"components/Footer/Footer\";\n\nimport Vault from \"abis/Vault.json\";\nimport Reader from \"abis/Reader.json\";\nimport Vester from \"abis/Vester.json\";\nimport RewardRouter from \"abis/RewardRouter.json\";\nimport RewardReader from \"abis/RewardReader.json\";\nimport Token from \"abis/Token.json\";\nimport FlpManager from \"abis/FlpManager.json\";\n\nimport { ethers } from \"ethers\";\nimport {\n FLP_DECIMALS,\n USD_DECIMALS,\n BASIS_POINTS_DIVISOR,\n PLACEHOLDER_ACCOUNT,\n getBalanceAndSupplyData,\n getDepositBalanceData,\n getVestingData,\n getStakingData,\n getProcessedData,\n getPageTitle,\n} from \"lib/legacy\";\nimport { useFxdxPrice, useTotalFxdxStaked, useTotalFxdxSupply } from \"domain/legacy\";\nimport { ARBITRUM, getChainName, getConstant, IS_TESTNET } from \"config/chains\";\n\nimport useSWR from \"swr\";\n\nimport { getContract } from \"config/contracts\";\n\nimport \"./StakeV2.css\";\nimport SEO from \"components/Common/SEO\";\nimport StatsTooltip from \"components/StatsTooltip/StatsTooltip\";\nimport StatsTooltipRow from \"components/StatsTooltip/StatsTooltipRow\";\nimport { getServerUrl } from \"config/backend\";\nimport { callContract, contractFetcher } from \"lib/contracts\";\nimport { useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { helperToast } from \"lib/helperToast\";\nimport { approveTokens } from \"domain/tokens\";\nimport { bigNumberify, expandDecimals, formatAmount, formatAmountFree, formatKeyAmount, formatPrice, parseValue } from \"lib/numbers\";\nimport { useChainId } from \"lib/chains\";\n\nconst { AddressZero } = ethers.constants;\n\nfunction StakeModal(props) {\n const {\n isVisible,\n setIsVisible,\n chainId,\n title,\n maxAmount,\n value,\n setValue,\n active,\n account,\n library,\n stakingTokenSymbol,\n stakingTokenAddress,\n farmAddress,\n rewardRouterAddress,\n stakeMethodName,\n setPendingTxns,\n } = props;\n const [isStaking, setIsStaking] = useState(false);\n const [isApproving, setIsApproving] = useState(false);\n\n const { data: tokenAllowance } = useSWR(\n active && stakingTokenAddress && [active, chainId, stakingTokenAddress, \"allowance\", account, farmAddress],\n {\n fetcher: contractFetcher(library, Token),\n }\n );\n\n let amount = parseValue(value, 18);\n const needApproval = farmAddress !== AddressZero && tokenAllowance && amount && amount.gt(tokenAllowance);\n\n const getError = () => {\n if (!amount || amount.eq(0)) {\n return t`Enter an amount`;\n }\n if (maxAmount && amount.gt(maxAmount)) {\n return t`Max amount exceeded`;\n }\n };\n\n const onClickPrimary = () => {\n if (needApproval) {\n approveTokens({\n setIsApproving,\n library,\n tokenAddress: stakingTokenAddress,\n spender: farmAddress,\n chainId,\n });\n return;\n }\n\n setIsStaking(true);\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n\n callContract(chainId, contract, stakeMethodName, [amount], {\n sentMsg: t`Stake submitted!`,\n failMsg: t`Stake failed.`,\n setPendingTxns,\n })\n .then(async (res) => {\n setIsVisible(false);\n })\n .finally(() => {\n setIsStaking(false);\n });\n };\n\n const isPrimaryEnabled = () => {\n const error = getError();\n if (error) {\n return false;\n }\n if (isApproving) {\n return false;\n }\n if (isStaking) {\n return false;\n }\n return true;\n };\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n if (isApproving) {\n return t`Approving ${stakingTokenSymbol}...`;\n }\n if (needApproval) {\n return t`Approve ${stakingTokenSymbol}`;\n }\n if (isStaking) {\n return t`Staking...`;\n }\n return t`Stake`;\n };\n\n return (\n
\n \n
\n
\n
\n
\n Stake\n
\n
\n
setValue(formatAmountFree(maxAmount, 18, 18))}>\n Max: {formatAmount(maxAmount, 18, 4, true)}\n
\n
\n
\n
\n setValue(e.target.value)}\n />\n
\n
{stakingTokenSymbol}
\n
\n
\n
\n \n
\n
\n
\n );\n}\n\nfunction UnstakeModal(props) {\n const {\n isVisible,\n setIsVisible,\n chainId,\n title,\n maxAmount,\n value,\n setValue,\n library,\n unstakingTokenSymbol,\n rewardRouterAddress,\n unstakeMethodName,\n multiplierPointsAmount,\n reservedAmount,\n bonusFxdxInFeeFxdx,\n setPendingTxns,\n } = props;\n const [isUnstaking, setIsUnstaking] = useState(false);\n\n let amount = parseValue(value, 18);\n let burnAmount;\n\n if (\n multiplierPointsAmount &&\n multiplierPointsAmount.gt(0) &&\n amount &&\n amount.gt(0) &&\n bonusFxdxInFeeFxdx &&\n bonusFxdxInFeeFxdx.gt(0)\n ) {\n burnAmount = multiplierPointsAmount.mul(amount).div(bonusFxdxInFeeFxdx);\n }\n\n const shouldShowReductionAmount = true;\n let rewardReductionBasisPoints;\n if (burnAmount && bonusFxdxInFeeFxdx) {\n rewardReductionBasisPoints = burnAmount.mul(BASIS_POINTS_DIVISOR).div(bonusFxdxInFeeFxdx);\n }\n\n const getError = () => {\n if (!amount) {\n return t`Enter an amount`;\n }\n if (amount.gt(maxAmount)) {\n return t`Max amount exceeded`;\n }\n };\n\n const onClickPrimary = () => {\n setIsUnstaking(true);\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n callContract(chainId, contract, unstakeMethodName, [amount], {\n sentMsg: t`Unstake submitted!`,\n failMsg: t`Unstake failed.`,\n successMsg: t`Unstake completed!`,\n setPendingTxns,\n })\n .then(async (res) => {\n setIsVisible(false);\n })\n .finally(() => {\n setIsUnstaking(false);\n });\n };\n\n const isPrimaryEnabled = () => {\n const error = getError();\n if (error) {\n return false;\n }\n if (isUnstaking) {\n return false;\n }\n return true;\n };\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n if (isUnstaking) {\n return t`Unstaking...`;\n }\n return t`Unstake`;\n };\n\n return (\n
\n \n
\n
\n
\n
\n Unstake\n
\n
\n
setValue(formatAmountFree(maxAmount, 18, 18))}>\n Max: {formatAmount(maxAmount, 18, 4, true)}\n
\n
\n
\n
\n setValue(e.target.value)}\n />\n
\n
{unstakingTokenSymbol}
\n
\n
\n {reservedAmount && reservedAmount.gt(0) && (\n
\n You have {formatAmount(reservedAmount, 18, 2, true)} tokens reserved for vesting.\n
\n )}\n {burnAmount && burnAmount.gt(0) && rewardReductionBasisPoints && rewardReductionBasisPoints.gt(0) && (\n
\n Unstaking will burn \n \n {formatAmount(burnAmount, 18, 4, true)} Multiplier Points\n \n . \n {shouldShowReductionAmount && (\n Boost Percentage: -{formatAmount(rewardReductionBasisPoints, 2, 2)}%.\n )}\n
\n )}\n
\n \n
\n
\n
\n );\n}\n\nfunction VesterDepositModal(props) {\n const {\n isVisible,\n setIsVisible,\n chainId,\n title,\n maxAmount,\n value,\n setValue,\n balance,\n vestedAmount,\n averageStakedAmount,\n maxVestableAmount,\n library,\n stakeTokenLabel,\n reserveAmount,\n maxReserveAmount,\n vesterAddress,\n setPendingTxns,\n } = props;\n const [isDepositing, setIsDepositing] = useState(false);\n\n let amount = parseValue(value, 18);\n\n let nextReserveAmount = reserveAmount;\n\n let nextDepositAmount = vestedAmount;\n if (amount) {\n nextDepositAmount = vestedAmount.add(amount);\n }\n\n let additionalReserveAmount = bigNumberify(0);\n if (amount && averageStakedAmount && maxVestableAmount && maxVestableAmount.gt(0)) {\n nextReserveAmount = nextDepositAmount.mul(averageStakedAmount).div(maxVestableAmount);\n if (nextReserveAmount.gt(reserveAmount)) {\n additionalReserveAmount = nextReserveAmount.sub(reserveAmount);\n }\n }\n\n const getError = () => {\n if (!amount || amount.eq(0)) {\n return t`Enter an amount`;\n }\n if (maxAmount && amount.gt(maxAmount)) {\n return t`Max amount exceeded`;\n }\n if (nextReserveAmount.gt(maxReserveAmount)) {\n return t`Insufficient staked tokens`;\n }\n };\n\n const onClickPrimary = () => {\n setIsDepositing(true);\n const contract = new ethers.Contract(vesterAddress, Vester.abi, library.getSigner());\n\n callContract(chainId, contract, \"deposit\", [amount], {\n sentMsg: t`Deposit submitted!`,\n failMsg: t`Deposit failed!`,\n successMsg: t`Deposited!`,\n setPendingTxns,\n })\n .then(async (res) => {\n setIsVisible(false);\n })\n .finally(() => {\n setIsDepositing(false);\n });\n };\n\n const isPrimaryEnabled = () => {\n const error = getError();\n if (error) {\n return false;\n }\n if (isDepositing) {\n return false;\n }\n return true;\n };\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n if (isDepositing) {\n return t`Depositing...`;\n }\n return t`Deposit`;\n };\n\n return (\n \n
\n \n
\n
\n
\n
\n Deposit\n
\n
\n setValue(formatAmountFree(maxAmount, 18, 18))}\n >\n Max: {formatAmount(maxAmount, 18, 4, true)}\n
\n
\n
\n
\n setValue(e.target.value)}\n />\n
\n
esFXDX
\n
\n
\n
\n
\n
\n Wallet\n
\n
{formatAmount(balance, 18, 2, true)} esFXDX
\n
\n
\n
\n Vault Capacity\n
\n
\n {\n return (\n
\n

\n Vault Capacity for your Account:\n

\n \n \n
\n );\n }}\n />\n
\n
\n
\n
\n Reserve Amount\n
\n
\n {\n return (\n <>\n \n \n {amount && nextReserveAmount.gt(maxReserveAmount) && (\n <>\n
\n \n You need a total of at least {formatAmount(nextReserveAmount, 18, 2, true)}{\" \"}\n {stakeTokenLabel} to vest {formatAmount(amount, 18, 2, true)} esFXDX.\n \n \n )}\n \n );\n }}\n />\n
\n
\n
\n
\n \n
\n \n \n
\n );\n}\n\nfunction VesterWithdrawModal(props) {\n const { isVisible, setIsVisible, chainId, title, library, vesterAddress, setPendingTxns } = props;\n const [isWithdrawing, setIsWithdrawing] = useState(false);\n\n const onClickPrimary = () => {\n setIsWithdrawing(true);\n const contract = new ethers.Contract(vesterAddress, Vester.abi, library.getSigner());\n\n callContract(chainId, contract, \"withdraw\", [], {\n sentMsg: t`Withdraw submitted.`,\n failMsg: t`Withdraw failed.`,\n successMsg: t`Withdrawn!`,\n setPendingTxns,\n })\n .then(async (res) => {\n setIsVisible(false);\n })\n .finally(() => {\n setIsWithdrawing(false);\n });\n };\n\n return (\n
\n \n \n
\n This will withdraw and unreserve all tokens as well as pause vesting.\n
\n
\n esFXDX tokens that have been converted to FXDX will remain as FXDX tokens.\n
\n
\n To claim FXDX tokens without withdrawing, use the \"Claim\" button under the Total Rewards section.\n
\n
\n
\n
\n
\n \n
\n
\n
\n );\n}\n\nfunction CompoundModal(props) {\n const {\n isVisible,\n setIsVisible,\n rewardRouterAddress,\n active,\n account,\n library,\n chainId,\n setPendingTxns,\n totalVesterRewards,\n nativeTokenSymbol,\n wrappedTokenSymbol,\n } = props;\n const [isCompounding, setIsCompounding] = useState(false);\n const [shouldClaimFxdx, setShouldClaimFxdx] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-compound-should-claim-fxdx\"],\n true\n );\n const [shouldStakeFxdx, setShouldStakeFxdx] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-compound-should-stake-fxdx\"],\n true\n );\n const [shouldClaimEsFxdx, setShouldClaimEsFxdx] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-compound-should-claim-es-fxdx\"],\n true\n );\n const [shouldStakeEsFxdx, setShouldStakeEsFxdx] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-compound-should-stake-es-fxdx\"],\n true\n );\n const [shouldStakeMultiplierPoints, setShouldStakeMultiplierPoints] = useState(true);\n const [shouldClaimWeth, setShouldClaimWeth] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-compound-should-claim-weth\"],\n true\n );\n const [shouldConvertWeth, setShouldConvertWeth] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-compound-should-convert-weth\"],\n true\n );\n\n const fxdxAddress = getContract(chainId, \"FXDX\");\n const stakedFxdxTrackerAddress = getContract(chainId, \"StakedFxdxTracker\");\n\n const [isApproving, setIsApproving] = useState(false);\n\n const { data: tokenAllowance } = useSWR(\n active && [active, chainId, fxdxAddress, \"allowance\", account, stakedFxdxTrackerAddress],\n {\n fetcher: contractFetcher(library, Token),\n }\n );\n\n const needApproval = shouldStakeFxdx && tokenAllowance && totalVesterRewards && totalVesterRewards.gt(tokenAllowance);\n\n const isPrimaryEnabled = () => {\n return !isCompounding && !isApproving && !isCompounding;\n };\n\n const getPrimaryText = () => {\n if (isApproving) {\n return t`Approving FXDX...`;\n }\n if (needApproval) {\n return t`Approve FXDX`;\n }\n if (isCompounding) {\n return t`Compounding...`;\n }\n return t`Compound`;\n };\n\n const onClickPrimary = () => {\n if (needApproval) {\n approveTokens({\n setIsApproving,\n library,\n tokenAddress: fxdxAddress,\n spender: stakedFxdxTrackerAddress,\n chainId,\n });\n return;\n }\n\n setIsCompounding(true);\n\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n callContract(\n chainId,\n contract,\n \"handleRewards\",\n [\n shouldClaimFxdx || shouldStakeFxdx,\n shouldStakeFxdx,\n shouldClaimEsFxdx || shouldStakeEsFxdx,\n shouldStakeEsFxdx,\n shouldStakeMultiplierPoints,\n shouldClaimWeth || shouldConvertWeth,\n shouldConvertWeth,\n ],\n {\n sentMsg: t`Compound submitted!`,\n failMsg: t`Compound failed.`,\n successMsg: t`Compound completed!`,\n setPendingTxns,\n }\n )\n .then(async (res) => {\n setIsVisible(false);\n })\n .finally(() => {\n setIsCompounding(false);\n });\n };\n\n const toggleShouldStakeFxdx = (value) => {\n if (value) {\n setShouldClaimFxdx(true);\n }\n setShouldStakeFxdx(value);\n };\n\n const toggleShouldStakeEsFxdx = (value) => {\n if (value) {\n setShouldClaimEsFxdx(true);\n }\n setShouldStakeEsFxdx(value);\n };\n\n const toggleConvertWeth = (value) => {\n if (value) {\n setShouldClaimWeth(true);\n }\n setShouldConvertWeth(value);\n };\n\n return (\n
\n \n
\n
\n \n Stake Multiplier Points\n \n
\n
\n \n Claim FXDX Rewards\n \n
\n
\n \n Stake FXDX Rewards\n \n
\n
\n \n Claim esFXDX Rewards\n \n
\n
\n \n Stake esFXDX Rewards\n \n
\n
\n \n Claim {wrappedTokenSymbol} Rewards\n \n
\n
\n \n \n Convert {wrappedTokenSymbol} to {nativeTokenSymbol}\n \n \n
\n
\n
\n \n
\n
\n
\n );\n}\n\nfunction ClaimModal(props) {\n const {\n isVisible,\n setIsVisible,\n rewardRouterAddress,\n library,\n chainId,\n setPendingTxns,\n nativeTokenSymbol,\n wrappedTokenSymbol,\n } = props;\n const [isClaiming, setIsClaiming] = useState(false);\n const [shouldClaimFxdx, setShouldClaimFxdx] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-claim-should-claim-fxdx\"],\n true\n );\n const [shouldClaimEsFxdx, setShouldClaimEsFxdx] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-claim-should-claim-es-fxdx\"],\n true\n );\n const [shouldClaimWeth, setShouldClaimWeth] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-claim-should-claim-weth\"],\n true\n );\n const [shouldConvertWeth, setShouldConvertWeth] = useLocalStorageSerializeKey(\n [chainId, \"StakeV2-claim-should-convert-weth\"],\n true\n );\n\n const isPrimaryEnabled = () => {\n return !isClaiming;\n };\n\n const getPrimaryText = () => {\n if (isClaiming) {\n return t`Claiming...`;\n }\n return t`Claim`;\n };\n\n const onClickPrimary = () => {\n setIsClaiming(true);\n\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n callContract(\n chainId,\n contract,\n \"handleRewards\",\n [\n shouldClaimFxdx,\n false, // shouldStakeFxdx\n shouldClaimEsFxdx,\n false, // shouldStakeEsFxdx\n false, // shouldStakeMultiplierPoints\n shouldClaimWeth,\n shouldConvertWeth,\n ],\n {\n sentMsg: t`Claim submitted.`,\n failMsg: t`Claim failed.`,\n successMsg: t`Claim completed!`,\n setPendingTxns,\n }\n )\n .then(async (res) => {\n setIsVisible(false);\n })\n .finally(() => {\n setIsClaiming(false);\n });\n };\n\n const toggleConvertWeth = (value) => {\n if (value) {\n setShouldClaimWeth(true);\n }\n setShouldConvertWeth(value);\n };\n\n return (\n
\n \n
\n
\n \n Claim FXDX Rewards\n \n
\n
\n \n Claim esFXDX Rewards\n \n
\n
\n \n Claim {wrappedTokenSymbol} Rewards\n \n
\n
\n \n \n Convert {wrappedTokenSymbol} to {nativeTokenSymbol}\n \n \n
\n
\n
\n \n
\n
\n
\n );\n}\n\nexport default function StakeV2({ setPendingTxns, connectWallet }) {\n const { active, library, account } = useWeb3React();\n const { chainId } = useChainId();\n\n const chainName = getChainName(chainId);\n\n const hasInsurance = false;\n\n const [isStakeModalVisible, setIsStakeModalVisible] = useState(false);\n const [stakeModalTitle, setStakeModalTitle] = useState(\"\");\n const [stakeModalMaxAmount, setStakeModalMaxAmount] = useState(undefined);\n const [stakeValue, setStakeValue] = useState(\"\");\n const [stakingTokenSymbol, setStakingTokenSymbol] = useState(\"\");\n const [stakingTokenAddress, setStakingTokenAddress] = useState(\"\");\n const [stakingFarmAddress, setStakingFarmAddress] = useState(\"\");\n const [stakeMethodName, setStakeMethodName] = useState(\"\");\n\n const [isUnstakeModalVisible, setIsUnstakeModalVisible] = useState(false);\n const [unstakeModalTitle, setUnstakeModalTitle] = useState(\"\");\n const [unstakeModalMaxAmount, setUnstakeModalMaxAmount] = useState(undefined);\n const [unstakeModalReservedAmount, setUnstakeModalReservedAmount] = useState(undefined);\n const [unstakeValue, setUnstakeValue] = useState(\"\");\n const [unstakingTokenSymbol, setUnstakingTokenSymbol] = useState(\"\");\n const [unstakeMethodName, setUnstakeMethodName] = useState(\"\");\n\n const [isVesterDepositModalVisible, setIsVesterDepositModalVisible] = useState(false);\n const [vesterDepositTitle, setVesterDepositTitle] = useState(\"\");\n const [vesterDepositStakeTokenLabel, setVesterDepositStakeTokenLabel] = useState(\"\");\n const [vesterDepositMaxAmount, setVesterDepositMaxAmount] = useState(\"\");\n const [vesterDepositBalance, setVesterDepositBalance] = useState(\"\");\n const [vesterDepositEscrowedBalance, setVesterDepositEscrowedBalance] = useState(\"\");\n const [vesterDepositVestedAmount, setVesterDepositVestedAmount] = useState(\"\");\n const [vesterDepositAverageStakedAmount, setVesterDepositAverageStakedAmount] = useState(\"\");\n const [vesterDepositMaxVestableAmount, setVesterDepositMaxVestableAmount] = useState(\"\");\n const [vesterDepositValue, setVesterDepositValue] = useState(\"\");\n const [vesterDepositReserveAmount, setVesterDepositReserveAmount] = useState(\"\");\n const [vesterDepositMaxReserveAmount, setVesterDepositMaxReserveAmount] = useState(\"\");\n const [vesterDepositAddress, setVesterDepositAddress] = useState(\"\");\n\n const [isVesterWithdrawModalVisible, setIsVesterWithdrawModalVisible] = useState(false);\n const [vesterWithdrawTitle, setVesterWithdrawTitle] = useState(false);\n const [vesterWithdrawAddress, setVesterWithdrawAddress] = useState(\"\");\n\n const [isCompoundModalVisible, setIsCompoundModalVisible] = useState(false);\n const [isClaimModalVisible, setIsClaimModalVisible] = useState(false);\n\n const rewardRouterAddress = getContract(chainId, \"RewardRouter\");\n const rewardReaderAddress = getContract(chainId, \"RewardReader\");\n const readerAddress = getContract(chainId, \"Reader\");\n\n const vaultAddress = getContract(chainId, \"Vault\");\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const fxdxAddress = getContract(chainId, \"FXDX\");\n const esFxdxAddress = getContract(chainId, \"ES_FXDX\");\n const bnFxdxAddress = getContract(chainId, \"BN_FXDX\");\n const flpAddress = getContract(chainId, \"FLP\");\n\n const stakedFxdxTrackerAddress = getContract(chainId, \"StakedFxdxTracker\");\n const bonusFxdxTrackerAddress = getContract(chainId, \"BonusFxdxTracker\");\n const feeFxdxTrackerAddress = getContract(chainId, \"FeeFxdxTracker\");\n\n const stakedFlpTrackerAddress = getContract(chainId, \"StakedFlpTracker\");\n const feeFlpTrackerAddress = getContract(chainId, \"FeeFlpTracker\");\n\n const flpManagerAddress = getContract(chainId, \"FlpManager\");\n\n const stakedFxdxDistributorAddress = getContract(chainId, \"StakedFxdxDistributor\");\n const stakedFlpDistributorAddress = getContract(chainId, \"StakedFlpDistributor\");\n\n const fxdxVesterAddress = getContract(chainId, \"FxdxVester\");\n const flpVesterAddress = getContract(chainId, \"FlpVester\");\n\n const vesterAddresses = [fxdxVesterAddress, flpVesterAddress];\n\n const excludedEsFxdxAccounts = [stakedFxdxDistributorAddress, stakedFlpDistributorAddress];\n\n const nativeTokenSymbol = getConstant(chainId, \"nativeTokenSymbol\");\n const wrappedTokenSymbol = getConstant(chainId, \"wrappedTokenSymbol\");\n\n const walletTokens = [fxdxAddress, esFxdxAddress, flpAddress, stakedFxdxTrackerAddress];\n const depositTokens = [\n fxdxAddress,\n esFxdxAddress,\n stakedFxdxTrackerAddress,\n bonusFxdxTrackerAddress,\n bnFxdxAddress,\n flpAddress,\n ];\n const rewardTrackersForDepositBalances = [\n stakedFxdxTrackerAddress,\n stakedFxdxTrackerAddress,\n bonusFxdxTrackerAddress,\n feeFxdxTrackerAddress,\n feeFxdxTrackerAddress,\n feeFlpTrackerAddress,\n ];\n const rewardTrackersForStakingInfo = [\n stakedFxdxTrackerAddress,\n bonusFxdxTrackerAddress,\n feeFxdxTrackerAddress,\n stakedFlpTrackerAddress,\n feeFlpTrackerAddress,\n ];\n\n const { data: walletBalances } = useSWR(\n [\n `StakeV2:walletBalances:${active}`,\n chainId,\n readerAddress,\n \"getTokenBalancesWithSupplies\",\n account || PLACEHOLDER_ACCOUNT,\n ],\n {\n fetcher: contractFetcher(library, Reader, [walletTokens]),\n }\n );\n\n const { data: depositBalances } = useSWR(\n [\n `StakeV2:depositBalances:${active}`,\n chainId,\n rewardReaderAddress,\n \"getDepositBalances\",\n account || PLACEHOLDER_ACCOUNT,\n ],\n {\n fetcher: contractFetcher(library, RewardReader, [depositTokens, rewardTrackersForDepositBalances]),\n }\n );\n\n const { data: stakingInfo } = useSWR(\n [`StakeV2:stakingInfo:${active}`, chainId, rewardReaderAddress, \"getStakingInfo\", account || PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(library, RewardReader, [rewardTrackersForStakingInfo]),\n }\n );\n\n const { data: stakedFxdxSupply } = useSWR(\n [`StakeV2:stakedFxdxSupply:${active}`, chainId, fxdxAddress, \"balanceOf\", stakedFxdxTrackerAddress],\n {\n fetcher: contractFetcher(library, Token),\n }\n );\n\n const { data: aums } = useSWR([`StakeV2:getAums:${active}`, chainId, flpManagerAddress, \"getAums\"], {\n fetcher: contractFetcher(library, FlpManager),\n });\n\n const { data: nativeTokenPrice } = useSWR(\n [`StakeV2:nativeTokenPrice:${active}`, chainId, vaultAddress, \"getMinPrice\", nativeTokenAddress],\n {\n fetcher: contractFetcher(library, Vault),\n }\n );\n\n const { data: esFxdxSupply } = useSWR(\n [`StakeV2:esFxdxSupply:${active}`, chainId, readerAddress, \"getTokenSupply\", esFxdxAddress],\n {\n fetcher: contractFetcher(library, Reader, [excludedEsFxdxAccounts]),\n }\n );\n\n const { data: vestingInfo } = useSWR(\n [`StakeV2:vestingInfo:${active}`, chainId, readerAddress, \"getVestingInfo\", account || PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(library, Reader, [vesterAddresses]),\n }\n );\n\n const { fxdxPrice, fxdxPriceFromEthereum, fxdxPriceFromMoonBeam /* fxdxPriceFromArbitrum, fxdxPriceFromAvalanche */ } = useFxdxPrice(\n chainId,\n { arbitrum: chainId === ARBITRUM ? library : undefined },\n active\n );\n\n let { total: totalFxdxSupply } = useTotalFxdxSupply();\n\n let {\n ethereum: ethereumFxdxStaked,\n moonbeam: moonbeamFxdxStaked,\n // avax: avaxFxdxStaked,\n // arbitrum: arbitrumFxdxStaked,\n total: totalFxdxStaked\n } = useTotalFxdxStaked();\n\n const fxdxSupplyUrl = getServerUrl(chainId, \"/fxdx_supply\");\n const { data: fxdxSupply } = useSWR([fxdxSupplyUrl], {\n fetcher: (...args) => fetch(...args).then((res) => res.text()),\n });\n\n const isFxdxTransferEnabled = true;\n\n let esFxdxSupplyUsd;\n if (esFxdxSupply && fxdxPrice) {\n esFxdxSupplyUsd = esFxdxSupply.mul(fxdxPrice).div(expandDecimals(1, 18));\n }\n\n let aum;\n if (aums && aums.length > 0) {\n aum = aums[0].add(aums[1]).div(2);\n }\n\n const { balanceData, supplyData } = getBalanceAndSupplyData(walletBalances);\n const depositBalanceData = getDepositBalanceData(depositBalances);\n const stakingData = getStakingData(stakingInfo);\n const vestingData = getVestingData(vestingInfo);\n\n const processedData = getProcessedData(\n balanceData,\n supplyData,\n depositBalanceData,\n stakingData,\n vestingData,\n aum,\n nativeTokenPrice,\n stakedFxdxSupply,\n fxdxPrice,\n fxdxSupply\n );\n\n let hasMultiplierPoints = false;\n let multiplierPointsAmount;\n if (processedData && processedData.bonusFxdxTrackerRewards && processedData.bnFxdxInFeeFxdx) {\n multiplierPointsAmount = processedData.bonusFxdxTrackerRewards.add(processedData.bnFxdxInFeeFxdx);\n if (multiplierPointsAmount.gt(0)) {\n hasMultiplierPoints = true;\n }\n }\n let totalRewardTokens;\n if (processedData && processedData.bnFxdxInFeeFxdx && processedData.bonusFxdxInFeeFxdx) {\n totalRewardTokens = processedData.bnFxdxInFeeFxdx.add(processedData.bonusFxdxInFeeFxdx);\n }\n\n let totalRewardTokensAndFlp;\n if (totalRewardTokens && processedData && processedData.flpBalance) {\n totalRewardTokensAndFlp = totalRewardTokens.add(processedData.flpBalance);\n }\n\n const bonusFxdxInFeeFxdx = processedData ? processedData.bonusFxdxInFeeFxdx : undefined;\n\n let stakedFxdxSupplyUsd;\n if (!totalFxdxStaked.isZero() && fxdxPrice) {\n stakedFxdxSupplyUsd = totalFxdxStaked.mul(fxdxPrice).div(expandDecimals(1, 18));\n }\n\n let totalSupplyUsd;\n if (totalFxdxSupply && !totalFxdxSupply.isZero() && fxdxPrice) {\n totalSupplyUsd = totalFxdxSupply.mul(fxdxPrice).div(expandDecimals(1, 18));\n }\n\n let maxUnstakeableFxdx = bigNumberify(0);\n if (\n totalRewardTokens &&\n vestingData &&\n vestingData.fxdxVesterPairAmount &&\n multiplierPointsAmount &&\n processedData.bonusFxdxInFeeFxdx\n ) {\n const availableTokens = totalRewardTokens.sub(vestingData.fxdxVesterPairAmount);\n const stakedTokens = processedData.bonusFxdxInFeeFxdx;\n const divisor = multiplierPointsAmount.add(stakedTokens);\n if (divisor.gt(0)) {\n maxUnstakeableFxdx = availableTokens.mul(stakedTokens).div(divisor);\n }\n }\n\n const showStakeFxdxModal = () => {\n if (!isFxdxTransferEnabled) {\n helperToast.error(t`FXDX transfers not yet enabled`);\n return;\n }\n\n setIsStakeModalVisible(true);\n setStakeModalTitle(t`Stake FXDX`);\n setStakeModalMaxAmount(processedData.fxdxBalance);\n setStakeValue(\"\");\n setStakingTokenSymbol(\"FXDX\");\n setStakingTokenAddress(fxdxAddress);\n setStakingFarmAddress(stakedFxdxTrackerAddress);\n setStakeMethodName(\"stakeFxdx\");\n };\n\n const showStakeEsFxdxModal = () => {\n setIsStakeModalVisible(true);\n setStakeModalTitle(t`Stake esFXDX`);\n setStakeModalMaxAmount(processedData.esFxdxBalance);\n setStakeValue(\"\");\n setStakingTokenSymbol(\"esFXDX\");\n setStakingTokenAddress(esFxdxAddress);\n setStakingFarmAddress(AddressZero);\n setStakeMethodName(\"stakeEsFxdx\");\n };\n\n const showFxdxVesterDepositModal = () => {\n let remainingVestableAmount = vestingData.fxdxVester.maxVestableAmount.sub(vestingData.fxdxVester.vestedAmount);\n if (processedData.esFxdxBalance.lt(remainingVestableAmount)) {\n remainingVestableAmount = processedData.esFxdxBalance;\n }\n\n setIsVesterDepositModalVisible(true);\n setVesterDepositTitle(t`FXDX Vault`);\n setVesterDepositStakeTokenLabel(\"staked FXDX + esFXDX + Multiplier Points\");\n setVesterDepositMaxAmount(remainingVestableAmount);\n setVesterDepositBalance(processedData.esFxdxBalance);\n setVesterDepositEscrowedBalance(vestingData.fxdxVester.escrowedBalance);\n setVesterDepositVestedAmount(vestingData.fxdxVester.vestedAmount);\n setVesterDepositMaxVestableAmount(vestingData.fxdxVester.maxVestableAmount);\n setVesterDepositAverageStakedAmount(vestingData.fxdxVester.averageStakedAmount);\n setVesterDepositReserveAmount(vestingData.fxdxVester.pairAmount);\n setVesterDepositMaxReserveAmount(totalRewardTokens);\n setVesterDepositValue(\"\");\n setVesterDepositAddress(fxdxVesterAddress);\n };\n\n const showFlpVesterDepositModal = () => {\n let remainingVestableAmount = vestingData.flpVester.maxVestableAmount.sub(vestingData.flpVester.vestedAmount);\n if (processedData.esFxdxBalance.lt(remainingVestableAmount)) {\n remainingVestableAmount = processedData.esFxdxBalance;\n }\n\n setIsVesterDepositModalVisible(true);\n setVesterDepositTitle(t`FLP Vault`);\n setVesterDepositStakeTokenLabel(\"staked FLP\");\n setVesterDepositMaxAmount(remainingVestableAmount);\n setVesterDepositBalance(processedData.esFxdxBalance);\n setVesterDepositEscrowedBalance(vestingData.flpVester.escrowedBalance);\n setVesterDepositVestedAmount(vestingData.flpVester.vestedAmount);\n setVesterDepositMaxVestableAmount(vestingData.flpVester.maxVestableAmount);\n setVesterDepositAverageStakedAmount(vestingData.flpVester.averageStakedAmount);\n setVesterDepositReserveAmount(vestingData.flpVester.pairAmount);\n setVesterDepositMaxReserveAmount(processedData.flpBalance);\n setVesterDepositValue(\"\");\n setVesterDepositAddress(flpVesterAddress);\n };\n\n const showFxdxVesterWithdrawModal = () => {\n if (!vestingData || !vestingData.fxdxVesterVestedAmount || vestingData.fxdxVesterVestedAmount.eq(0)) {\n helperToast.error(t`You have not deposited any tokens for vesting.`);\n return;\n }\n\n setIsVesterWithdrawModalVisible(true);\n setVesterWithdrawTitle(t`Withdraw from FXDX Vault`);\n setVesterWithdrawAddress(fxdxVesterAddress);\n };\n\n const showFlpVesterWithdrawModal = () => {\n if (!vestingData || !vestingData.flpVesterVestedAmount || vestingData.flpVesterVestedAmount.eq(0)) {\n helperToast.error(t`You have not deposited any tokens for vesting.`);\n return;\n }\n\n setIsVesterWithdrawModalVisible(true);\n setVesterWithdrawTitle(t`Withdraw from FLP Vault`);\n setVesterWithdrawAddress(flpVesterAddress);\n };\n\n const showUnstakeFxdxModal = () => {\n if (!isFxdxTransferEnabled) {\n helperToast.error(t`FXDX transfers not yet enabled`);\n return;\n }\n setIsUnstakeModalVisible(true);\n setUnstakeModalTitle(t`Unstake FXDX`);\n let maxAmount = processedData.fxdxInStakedFxdx;\n if (\n processedData.fxdxInStakedFxdx &&\n vestingData &&\n vestingData.fxdxVesterPairAmount.gt(0) &&\n maxUnstakeableFxdx &&\n maxUnstakeableFxdx.lt(processedData.fxdxInStakedFxdx)\n ) {\n maxAmount = maxUnstakeableFxdx;\n }\n setUnstakeModalMaxAmount(maxAmount);\n setUnstakeModalReservedAmount(vestingData.fxdxVesterPairAmount);\n setUnstakeValue(\"\");\n setUnstakingTokenSymbol(\"FXDX\");\n setUnstakeMethodName(\"unstakeFxdx\");\n };\n\n const showUnstakeEsFxdxModal = () => {\n setIsUnstakeModalVisible(true);\n setUnstakeModalTitle(t`Unstake esFXDX`);\n let maxAmount = processedData.esFxdxInStakedFxdx;\n if (\n processedData.esFxdxInStakedFxdx &&\n vestingData &&\n vestingData.fxdxVesterPairAmount.gt(0) &&\n maxUnstakeableFxdx &&\n maxUnstakeableFxdx.lt(processedData.esFxdxInStakedFxdx)\n ) {\n maxAmount = maxUnstakeableFxdx;\n }\n setUnstakeModalMaxAmount(maxAmount);\n setUnstakeModalReservedAmount(vestingData.fxdxVesterPairAmount);\n setUnstakeValue(\"\");\n setUnstakingTokenSymbol(\"esFXDX\");\n setUnstakeMethodName(\"unstakeEsFxdx\");\n };\n\n const renderMultiplierPointsLabel = useCallback(() => {\n return t`Multiplier Points APR`;\n }, []);\n\n const renderMultiplierPointsValue = useCallback(() => {\n return (\n {\n return (\n \n Boost your rewards with Multiplier Points. \n \n More info\n \n .\n \n );\n }}\n />\n );\n }, []);\n\n let earnMsg;\n if (totalRewardTokensAndFlp && totalRewardTokensAndFlp.gt(0)) {\n let fxdxAmountStr;\n if (processedData.fxdxInStakedFxdx && processedData.fxdxInStakedFxdx.gt(0)) {\n fxdxAmountStr = formatAmount(processedData.fxdxInStakedFxdx, 18, 2, true) + \" FXDX\";\n }\n let esFxdxAmountStr;\n if (processedData.esFxdxInStakedFxdx && processedData.esFxdxInStakedFxdx.gt(0)) {\n esFxdxAmountStr = formatAmount(processedData.esFxdxInStakedFxdx, 18, 2, true) + \" esFXDX\";\n }\n let mpAmountStr;\n if (processedData.bonusFxdxInFeeFxdx && processedData.bnFxdxInFeeFxdx.gt(0)) {\n mpAmountStr = formatAmount(processedData.bnFxdxInFeeFxdx, 18, 2, true) + \" MP\";\n }\n let flpStr;\n if (processedData.flpBalance && processedData.flpBalance.gt(0)) {\n flpStr = formatAmount(processedData.flpBalance, 18, 2, true) + \" FLP\";\n }\n const amountStr = [fxdxAmountStr, esFxdxAmountStr, mpAmountStr, flpStr].filter((s) => s).join(\", \");\n earnMsg = (\n
\n \n You are earning {nativeTokenSymbol} rewards with {formatAmount(totalRewardTokensAndFlp, 18, 2, true)} tokens.\n
\n Tokens: {amountStr}.\n
\n
\n );\n }\n\n return (\n
\n \n \n \n \n \n \n
\n
\n
\n
\n Earn\n
\n
\n \n Stake{\" \"}\n \n FXDX\n {\" \"}\n and{\" \"}\n \n FLP\n {\" \"}\n to earn rewards.\n \n
\n {earnMsg &&
{earnMsg}
}\n
\n
\n
\n
\n
\n
FXDX
\n
\n
\n
\n
\n Price\n
\n
\n {!fxdxPrice && \"...\"}\n {fxdxPrice && (\n IS_TESTNET ? (\n <>\n \n \n ) : (\n <>\n \n {/* \n */}\n \n )}\n />\n )}\n
\n
\n
\n
\n Wallet\n
\n
\n {formatKeyAmount(processedData, \"fxdxBalance\", 18, 2, true)} FXDX ($\n {formatKeyAmount(processedData, \"fxdxBalanceUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n Staked\n
\n
\n {formatKeyAmount(processedData, \"fxdxInStakedFxdx\", 18, 2, true)} FXDX ($\n {formatKeyAmount(processedData, \"fxdxInStakedFxdxUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n
\n APR\n
\n
\n {\n return (\n <>\n \n {(!processedData.fxdxBoostAprForNativeToken ||\n processedData.fxdxBoostAprForNativeToken.eq(0)) && (\n \n )}\n {processedData.fxdxBoostAprForNativeToken && processedData.fxdxBoostAprForNativeToken.gt(0) && (\n
\n
\n\n \n \n
\n \n\n
\n\n The Boosted APR is from your staked Multiplier Points.\n
\n )}\n
\n
\n \n APRs are updated weekly on Monday and will depend on the fees collected for the week.\n \n
\n \n );\n }}\n />\n
\n
\n
\n
\n Rewards\n
\n
\n {\n return (\n <>\n \n \n \n );\n }}\n />\n
\n
\n
\n
{renderMultiplierPointsLabel()}
\n
{renderMultiplierPointsValue()}
\n
\n
\n
\n Boost Percentage\n
\n
\n {\n return (\n
\n \n You are earning {formatAmount(processedData.boostBasisPoints, 2, 2, false)}% more{\" \"}\n {nativeTokenSymbol} rewards using{\" \"}\n {formatAmount(processedData.bnFxdxInFeeFxdx, 18, 4, 2, true)} Staked Multiplier Points.\n \n
\n
\n Use the \"Compound\" button to stake your Multiplier Points.\n
\n );\n }}\n />\n
\n
\n
\n
\n
\n Total Staked\n
\n
\n {!totalFxdxStaked && \"...\"}\n {totalFxdxStaked && (\n (\n \n )}\n />\n )}\n
\n
\n
\n
\n Total Supply\n
\n {!totalFxdxSupply && \"...\"}\n {totalFxdxSupply && (\n
\n {formatAmount(totalFxdxSupply, 18, 0, true)} FXDX ($\n {formatAmount(totalSupplyUsd, USD_DECIMALS, 0, true)})\n
\n )}\n
\n
\n
\n \n Buy FXDX\n \n {active && (\n \n )}\n {active && (\n \n )}\n {active && (\n \n Transfer Account\n \n )}\n
\n
\n
\n
\n
\n Total Rewards\n
\n
\n
\n
\n
\n {nativeTokenSymbol} ({wrappedTokenSymbol})\n
\n
\n {formatKeyAmount(processedData, \"totalNativeTokenRewards\", 18, 4, true)} ($\n {formatKeyAmount(processedData, \"totalNativeTokenRewardsUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
FXDX
\n
\n {formatKeyAmount(processedData, \"totalVesterRewards\", 18, 4, true)} ($\n {formatKeyAmount(processedData, \"totalVesterRewardsUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n Escrowed FXDX\n
\n
\n {formatKeyAmount(processedData, \"totalEsFxdxRewards\", 18, 4, true)} ($\n {formatKeyAmount(processedData, \"totalEsFxdxRewardsUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n Multiplier Points\n
\n
{formatKeyAmount(processedData, \"bonusFxdxTrackerRewards\", 18, 4, true)}
\n
\n
\n
\n Staked Multiplier Points\n
\n
{formatKeyAmount(processedData, \"bnFxdxInFeeFxdx\", 18, 4, true)}
\n
\n
\n
\n Total\n
\n
${formatKeyAmount(processedData, \"totalRewardsUsd\", USD_DECIMALS, 2, true)}
\n
\n
\n
\n
\n {active && (\n \n )}\n {active && (\n \n )}\n {!active && (\n \n )}\n
\n
\n
\n
\n
\n {active && (\n setIsCompoundModalVisible(true)}\n >\n Compound\n \n )}\n {active && (\n \n )}\n {!active && (\n \n )}\n
\n
\n
\n
\n
\n
FLP ({chainName})
\n
\n
\n
\n
\n Price\n
\n
${formatKeyAmount(processedData, \"flpPrice\", USD_DECIMALS, 3, true)}
\n
\n
\n
\n Wallet\n
\n
\n {formatKeyAmount(processedData, \"flpBalance\", FLP_DECIMALS, 2, true)} FLP ($\n {formatKeyAmount(processedData, \"flpBalanceUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n Staked\n
\n
\n {formatKeyAmount(processedData, \"flpBalance\", FLP_DECIMALS, 2, true)} FLP ($\n {formatKeyAmount(processedData, \"flpBalanceUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n
\n APR\n
\n
\n {\n return (\n <>\n \n \n
\n\n \n APRs are updated weekly on Wednesday and will depend on the fees collected for the week.\n \n \n );\n }}\n />\n
\n
\n
\n
\n Rewards\n
\n
\n {\n return (\n <>\n \n \n \n );\n }}\n />\n
\n
\n
\n
\n
\n Total Staked\n
\n
\n {formatKeyAmount(processedData, \"flpSupply\", 18, 2, true)} FLP ($\n {formatKeyAmount(processedData, \"flpSupplyUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n Total Supply\n
\n
\n {formatKeyAmount(processedData, \"flpSupply\", 18, 2, true)} FLP ($\n {formatKeyAmount(processedData, \"flpSupplyUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n \n Buy FLP\n \n \n Sell FLP\n \n {hasInsurance && (\n \n Purchase Insurance\n \n )}\n
\n
\n
\n
\n
\n Escrowed FXDX\n
\n
\n
\n
\n
\n Price\n
\n
${formatPrice(fxdxPrice, true)}
\n
\n
\n
\n Wallet\n
\n
\n {formatKeyAmount(processedData, \"esFxdxBalance\", 18, 2, true)} esFXDX ($\n {formatKeyAmount(processedData, \"esFxdxBalanceUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n Staked\n
\n
\n {formatKeyAmount(processedData, \"esFxdxInStakedFxdx\", 18, 2, true)} esFXDX ($\n {formatKeyAmount(processedData, \"esFxdxInStakedFxdxUsd\", USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n
\n APR\n
\n
\n
\n {\n return (\n <>\n \n {processedData.bnFxdxInFeeFxdx && processedData.bnFxdxInFeeFxdx.gt(0) && (\n \n )}\n \n \n );\n }}\n />\n
\n
\n
\n
\n
{renderMultiplierPointsLabel()}
\n
{renderMultiplierPointsValue()}
\n
\n
\n
\n
\n Total Staked\n
\n
\n {formatKeyAmount(processedData, \"stakedEsFxdxSupply\", 18, 0, true)} esFXDX ($\n {formatKeyAmount(processedData, \"stakedEsFxdxSupplyUsd\", USD_DECIMALS, 0, true)})\n
\n
\n
\n
\n Total Supply\n
\n
\n {formatAmount(esFxdxSupply, 18, 0, true)} esFXDX (${formatAmount(esFxdxSupplyUsd, USD_DECIMALS, 0, true)}\n )\n
\n
\n
\n
\n {active && (\n \n )}\n {active && (\n \n )}\n {!active && (\n \n )}\n
\n
\n
\n
\n
\n\n
\n
\n
\n Vest\n
\n
\n \n Convert esFXDX tokens to FXDX tokens.\n
\n Please read the{\" \"}\n \n vesting details\n {\" \"}\n before using the vaults.\n
\n
\n
\n
\n
\n
\n
\n FXDX Vault\n
\n
\n
\n
\n
\n Staked Tokens\n
\n
\n {\n return (\n <>\n \n\n \n \n \n );\n }}\n />\n
\n
\n
\n
\n Reserved for Vesting\n
\n
\n {formatKeyAmount(vestingData, \"fxdxVesterPairAmount\", 18, 2, true)} /{\" \"}\n {formatAmount(totalRewardTokens, 18, 2, true)}\n
\n
\n
\n
\n Vesting Status\n
\n
\n {\n return (\n
\n \n {formatKeyAmount(vestingData, \"fxdxVesterClaimSum\", 18, 4, true)} tokens have been\n converted to FXDX from the{\" \"}\n {formatKeyAmount(vestingData, \"fxdxVesterVestedAmount\", 18, 4, true)} esFXDX deposited for\n vesting.\n \n
\n );\n }}\n />\n
\n
\n
\n
\n Claimable\n
\n
\n (\n \n {formatKeyAmount(vestingData, \"fxdxVesterClaimable\", 18, 4, true)} FXDX tokens can be claimed,\n use the options under the Total Rewards section to claim them.\n \n )}\n />\n
\n
\n
\n
\n {!active && (\n \n )}\n {active && (\n \n )}\n {active && (\n \n )}\n
\n
\n
\n
\n
\n FLP Vault\n
\n
\n
\n
\n
\n Staked Tokens\n
\n
{formatAmount(processedData.flpBalance, 18, 2, true)} FLP
\n
\n
\n
\n Reserved for Vesting\n
\n
\n {formatKeyAmount(vestingData, \"flpVesterPairAmount\", 18, 2, true)} /{\" \"}\n {formatAmount(processedData.flpBalance, 18, 2, true)}\n
\n
\n
\n
\n Vesting Status\n
\n
\n {\n return (\n
\n \n {formatKeyAmount(vestingData, \"flpVesterClaimSum\", 18, 4, true)} tokens have been\n converted to FXDX from the{\" \"}\n {formatKeyAmount(vestingData, \"flpVesterVestedAmount\", 18, 4, true)} esFXDX deposited for\n vesting.\n \n
\n );\n }}\n />\n
\n
\n
\n
\n Claimable\n
\n
\n (\n \n {formatKeyAmount(vestingData, \"flpVesterClaimable\", 18, 4, true)} FXDX tokens can be claimed,\n use the options under the Total Rewards section to claim them.\n \n )}\n />\n
\n
\n
\n
\n {!active && (\n \n )}\n {active && (\n \n )}\n {active && (\n \n )}\n
\n
\n
\n
\n
\n
\n
\n
\n );\n}\n","import React from \"react\";\n\nimport StakeV2 from \"./StakeV2\";\n\nexport default function Stake(props) {\n return ;\n}\n","import React from \"react\";\n\nimport cx from \"classnames\";\n\nimport \"./Tab.css\";\n\nexport default function Tab(props) {\n const { options, option, setOption, onChange, type = \"block\", className, optionLabels, icons } = props;\n const onClick = (opt) => {\n if (setOption) {\n setOption(opt);\n }\n if (onChange) {\n onChange(opt);\n }\n };\n\n return (\n
\n {options.map((opt) => {\n const label = optionLabels && optionLabels[opt] ? optionLabels[opt] : opt;\n return (\n
onClick(opt)} key={opt}>\n {icons && icons[opt] && {option}}\n {label}\n
\n );\n })}\n
\n );\n}\n","import { useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport default function Portal({ children }) {\n const root = document.body;\n\n const el = useMemo(() => document.createElement(\"div\"), []);\n\n useEffect(() => {\n root.appendChild(el);\n return () => root.removeChild(el);\n }, [root, el]);\n\n return createPortal(children, el);\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport cx from \"classnames\";\n\nimport \"./Tooltip.css\";\nimport { IS_TOUCH } from \"config/ui\";\nimport Portal from \"../Common/Portal\";\n\nconst OPEN_DELAY = 0;\nconst CLOSE_DELAY = 100;\n\nexport default function TooltipWithPortal(props) {\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState({});\n const [tooltipWidth, setTooltipWidth] = useState();\n const intervalCloseRef = useRef(null);\n const intervalOpenRef = useRef(null);\n\n const position = props.position ?? \"left-bottom\";\n const trigger = props.trigger ?? \"hover\";\n const handlerRef = useRef();\n\n const updateTooltipCoords = useCallback(() => {\n const rect = handlerRef.current.getBoundingClientRect();\n\n setCoords({\n height: rect.height,\n width: rect.width,\n left: rect.x,\n top: rect.y + window.scrollY,\n });\n\n if (props.fitHandleWidth) {\n setTooltipWidth(`${rect.width}px`);\n }\n }, [handlerRef, props.fitHandleWidth]);\n\n const onMouseEnter = useCallback(() => {\n if (trigger !== \"hover\" || IS_TOUCH) return;\n\n if (intervalCloseRef.current) {\n clearInterval(intervalCloseRef.current);\n intervalCloseRef.current = null;\n }\n if (!intervalOpenRef.current) {\n intervalOpenRef.current = setTimeout(() => {\n setVisible(true);\n intervalOpenRef.current = null;\n }, OPEN_DELAY);\n }\n updateTooltipCoords();\n }, [setVisible, intervalCloseRef, intervalOpenRef, trigger, updateTooltipCoords]);\n\n const onMouseClick = useCallback(() => {\n if (trigger !== \"click\" && !IS_TOUCH) return;\n if (intervalCloseRef.current) {\n clearInterval(intervalCloseRef.current);\n intervalCloseRef.current = null;\n }\n if (intervalOpenRef.current) {\n clearInterval(intervalOpenRef.current);\n intervalOpenRef.current = null;\n }\n updateTooltipCoords();\n\n if (props.closeOnDoubleClick) {\n setVisible((old) => !old);\n } else {\n setVisible(true);\n }\n }, [setVisible, intervalCloseRef, trigger, updateTooltipCoords, props.closeOnDoubleClick]);\n\n const onMouseLeave = useCallback(() => {\n intervalCloseRef.current = setTimeout(() => {\n setVisible(false);\n intervalCloseRef.current = null;\n }, CLOSE_DELAY);\n if (intervalOpenRef.current) {\n clearInterval(intervalOpenRef.current);\n intervalOpenRef.current = null;\n }\n updateTooltipCoords();\n }, [setVisible, intervalCloseRef, updateTooltipCoords]);\n\n const className = cx(\"Tooltip\", props.className);\n\n return (\n \n \n {props.handle}\n \n {visible && coords.left && (\n \n
\n
\n {props.renderContent()}\n
\n
\n
\n )}\n \n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport cx from \"classnames\";\n\nimport { BiChevronDown } from \"react-icons/bi\";\n\nimport Modal from \"../Modal/Modal\";\n\nimport dropDownIcon from \"img/DROP_DOWN.svg\";\nimport \"./TokenSelector.css\";\nimport TooltipWithPortal from \"../Tooltip/TooltipWithPortal\";\nimport { bigNumberify, expandDecimals, formatAmount } from \"lib/numbers\";\nimport { getToken } from \"config/tokens\";\nimport { importImage } from \"lib/legacy\";\nimport { t } from \"@lingui/macro\";\n\nexport default function TokenSelector(props) {\n const [isModalVisible, setIsModalVisible] = useState(false);\n const [searchKeyword, setSearchKeyword] = useState(\"\");\n const tokenInfo = getToken(props.chainId, props.tokenAddress);\n const {\n tokens,\n mintingCap,\n infoTokens,\n showMintingCap,\n disabled,\n selectedTokenLabel,\n showBalances = true,\n showTokenImgInDropdown = false,\n showSymbolImage = false,\n showNewCaret = false,\n getTokenState = () => ({ disabled: false, message: null }),\n disableBodyScrollLock,\n } = props;\n\n const visibleTokens = tokens.filter((t) => !t.isTempHidden);\n\n const onSelectToken = (token) => {\n setIsModalVisible(false);\n props.onSelectToken(token);\n };\n\n useEffect(() => {\n if (isModalVisible) {\n setSearchKeyword(\"\");\n }\n }, [isModalVisible]);\n\n if (!tokenInfo) {\n return null;\n }\n\n const tokenImage = showSymbolImage && importImage(`ic_${tokenInfo.symbol.toLowerCase()}_24.svg`);\n\n const onSearchKeywordChange = (e) => {\n setSearchKeyword(e.target.value);\n };\n\n const filteredTokens = visibleTokens.filter((item) => {\n return (\n item.name.toLowerCase().indexOf(searchKeyword.toLowerCase()) > -1 ||\n item.symbol.toLowerCase().indexOf(searchKeyword.toLowerCase()) > -1\n );\n });\n\n const _handleKeyDown = (e) => {\n if (e.key === \"Enter\" && filteredTokens.length > 0) {\n onSelectToken(filteredTokens[0]);\n }\n };\n\n return (\n
\n \n
\n
\n onSearchKeywordChange(e)}\n onKeyDown={_handleKeyDown}\n autoFocus\n />\n
\n {filteredTokens.map((token, tokenIndex) => {\n const tokenPopupImage = importImage(`ic_${token.symbol.toLowerCase()}_40.svg`);\n let info = infoTokens ? infoTokens[token.address] : {};\n let mintAmount;\n let balance = info.balance;\n if (showMintingCap && mintingCap && info.usdfAmount) {\n mintAmount = mintingCap.sub(info.usdfAmount);\n }\n if (mintAmount && mintAmount.lt(0)) {\n mintAmount = bigNumberify(0);\n }\n let balanceUsd;\n if (balance && info.maxPrice) {\n balanceUsd = balance.mul(info.maxPrice).div(expandDecimals(1, token.decimals));\n }\n\n const tokenState = getTokenState(info) || {};\n\n return (\n !tokenState.disabled && onSelectToken(token)}\n >\n {tokenState.disabled && tokenState.message && (\n }\n position={tokenIndex < filteredTokens.length / 2 ? \"center-bottom\" : \"center-top\"}\n disableHandleStyle\n closeOnDoubleClick\n fitHandleWidth\n renderContent={() => tokenState.message}\n />\n )}\n
\n {showTokenImgInDropdown && {token.name}}\n
\n
{token.symbol}
\n {token.name}\n
\n
\n
\n {showBalances && balance && (\n
\n {balance.gt(0) && formatAmount(balance, token.decimals, 4, true)}\n {balance.eq(0) && \"-\"}\n
\n )}\n \n {mintAmount &&
Mintable: {formatAmount(mintAmount, token.decimals, 2, true)} USDF
}\n {showMintingCap && !mintAmount &&
-
}\n {!showMintingCap && showBalances && balanceUsd && balanceUsd.gt(0) && (\n
${formatAmount(balanceUsd, 30, 2, true)}
\n )}\n
\n
\n
\n );\n })}\n
\n \n {selectedTokenLabel ? (\n
setIsModalVisible(true)}>\n {selectedTokenLabel}\n {!showNewCaret && }\n
\n ) : (\n
setIsModalVisible(true)}>\n {tokenInfo.symbol}\n {showSymbolImage && {tokenInfo.symbol}}\n {showNewCaret && \"Dropdown}\n {!showNewCaret && }\n
\n )}\n
\n );\n}\n","import cx from \"classnames\";\n\nexport default function ExchangeInfoRow(props) {\n const { label, children, value, isTop, isWarning } = props;\n\n return (\n
\n
{label}
\n
{children || value}
\n
\n );\n}\n","import React, { useCallback, useState, useMemo } from \"react\";\nimport \"./ConfirmationBox.css\";\nimport {\n USD_DECIMALS,\n PRECISION,\n BASIS_POINTS_DIVISOR,\n LIMIT,\n MIN_PROFIT_TIME,\n INCREASE,\n getExchangeRate,\n getExchangeRateDisplay,\n DEFAULT_SLIPPAGE_AMOUNT,\n DEFAULT_HIGHER_SLIPPAGE_AMOUNT,\n calculatePositionDelta,\n DECREASE,\n} from \"lib/legacy\";\nimport { getConstant } from \"config/chains\";\nimport { getContract } from \"config/contracts\";\n\nimport { BsArrowRight } from \"react-icons/bs\";\nimport Modal from \"../Modal/Modal\";\nimport Tooltip from \"../Tooltip/Tooltip\";\nimport Checkbox from \"../Checkbox/Checkbox\";\nimport ExchangeInfoRow from \"./ExchangeInfoRow\";\nimport { cancelDecreaseOrder, handleCancelOrder } from \"domain/legacy\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { TRIGGER_PREFIX_ABOVE, TRIGGER_PREFIX_BELOW } from \"config/ui\";\nimport { useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { SLIPPAGE_BPS_KEY } from \"config/localStorage\";\nimport { expandDecimals, formatAmount, formatAmountFree, formatPrice } from \"lib/numbers\";\nimport { getNativeToken, getToken, getWrappedToken } from \"config/tokens\";\nimport { Plural, t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst HIGH_SPREAD_THRESHOLD = expandDecimals(1, USD_DECIMALS).div(100); // 1%;\n\nfunction getSpread(fromTokenInfo, toTokenInfo, isLong, nativeTokenAddress) {\n if (fromTokenInfo && fromTokenInfo.maxPrice && toTokenInfo && toTokenInfo.minPrice) {\n const fromDiff = fromTokenInfo.maxPrice.sub(fromTokenInfo.minPrice).div(2);\n const fromSpread = fromDiff.mul(PRECISION).div(fromTokenInfo.maxPrice.add(fromTokenInfo.minPrice).div(2));\n const toDiff = toTokenInfo.maxPrice.sub(toTokenInfo.minPrice).div(2);\n const toSpread = toDiff.mul(PRECISION).div(toTokenInfo.maxPrice.add(toTokenInfo.minPrice).div(2));\n\n let value = fromSpread.add(toSpread);\n\n const fromTokenAddress = fromTokenInfo.isNative ? nativeTokenAddress : fromTokenInfo.address;\n const toTokenAddress = toTokenInfo.isNative ? nativeTokenAddress : toTokenInfo.address;\n\n if (isLong && fromTokenAddress === toTokenAddress) {\n value = fromSpread;\n }\n\n return {\n value,\n isHigh: value.gt(HIGH_SPREAD_THRESHOLD),\n };\n }\n}\n\nexport default function ConfirmationBox(props) {\n const {\n fromToken,\n fromTokenInfo,\n toToken,\n toTokenInfo,\n isSwap,\n isLong,\n isMarketOrder,\n orderOption,\n isShort,\n toAmount,\n fromAmount,\n isHigherSlippageAllowed,\n setIsHigherSlippageAllowed,\n onConfirmationClick,\n setIsConfirming,\n shortCollateralAddress,\n hasExistingPosition,\n leverage,\n existingPosition,\n existingLiquidationPrice,\n displayLiquidationPrice,\n shortCollateralToken,\n isPendingConfirmation,\n triggerPriceUsd,\n triggerRatio,\n fees,\n feesUsd,\n isSubmitting,\n fromUsdMin,\n toUsdMax,\n nextAveragePrice,\n collateralTokenAddress,\n feeBps,\n chainId,\n orders,\n library,\n setPendingTxns,\n pendingTxns,\n minExecutionFee,\n minExecutionFeeUSD,\n minExecutionFeeErrorMessage,\n } = props;\n\n const nativeTokenSymbol = getConstant(chainId, \"nativeTokenSymbol\");\n\n const [savedSlippageAmount] = useLocalStorageSerializeKey([chainId, SLIPPAGE_BPS_KEY], DEFAULT_SLIPPAGE_AMOUNT);\n const [isProfitWarningAccepted, setIsProfitWarningAccepted] = useState(false);\n const [isTriggerWarningAccepted, setIsTriggerWarningAccepted] = useState(false);\n const [isLimitOrdersVisible, setIsLimitOrdersVisible] = useState(false);\n\n const onCancelOrderClick = useCallback(\n (order) => {\n handleCancelOrder(chainId, library, order, { pendingTxns, setPendingTxns });\n },\n [library, pendingTxns, setPendingTxns, chainId]\n );\n\n let minOut;\n let fromTokenUsd;\n let toTokenUsd;\n\n let collateralAfterFees = fromUsdMin;\n if (feesUsd) {\n collateralAfterFees = fromUsdMin.sub(feesUsd);\n }\n\n if (isSwap) {\n minOut = toAmount.mul(BASIS_POINTS_DIVISOR - savedSlippageAmount).div(BASIS_POINTS_DIVISOR);\n\n fromTokenUsd = fromTokenInfo ? formatPrice(fromTokenInfo.minPrice, true) : 0;\n toTokenUsd = toTokenInfo ? formatPrice(toTokenInfo.maxPrice, true) : 0;\n }\n\n const getTitle = () => {\n if (!isMarketOrder) {\n return t`Confirm Limit Order`;\n }\n if (isSwap) {\n return t`Confirm Swap`;\n }\n return isLong ? t`Confirm Long` : t`Confirm Short`;\n };\n const title = getTitle();\n\n const existingOrder = useMemo(() => {\n const wrappedToken = getWrappedToken(chainId);\n for (const order of orders) {\n if (order.type !== INCREASE) continue;\n const sameToken =\n order.indexToken === wrappedToken.address ? toToken.isNative : order.indexToken === toToken.address;\n if (order.isLong === isLong && sameToken) {\n return order;\n }\n }\n }, [orders, chainId, isLong, toToken.address, toToken.isNative]);\n\n const existingOrders = useMemo(() => {\n const wrappedToken = getWrappedToken(chainId);\n return orders.filter((order) => {\n if (order.type !== INCREASE) return false;\n const sameToken =\n order.indexToken === wrappedToken.address ? toToken.isNative : order.indexToken === toToken.address;\n return order.isLong === isLong && sameToken;\n });\n }, [orders, chainId, isLong, toToken.address, toToken.isNative]);\n\n const existingTriggerOrders = useMemo(() => {\n const wrappedToken = getWrappedToken(chainId);\n return orders.filter((order) => {\n if (order.type !== DECREASE) return false;\n const sameToken =\n order.indexToken === wrappedToken.address ? toToken.isNative : order.indexToken === toToken.address;\n return order.isLong === isLong && sameToken;\n });\n }, [orders, chainId, isLong, toToken.address, toToken.isNative]);\n\n const decreaseOrdersThatWillBeExecuted = useMemo(() => {\n if (isSwap) return [];\n return existingTriggerOrders.filter((order) => {\n if (order.triggerAboveThreshold) {\n return existingPosition?.markPrice.gte(order.triggerPrice);\n } else {\n return existingPosition?.markPrice.lte(order.triggerPrice);\n }\n });\n }, [existingPosition, existingTriggerOrders, isSwap]);\n\n const getError = () => {\n if (!isSwap && hasExistingPosition && !isMarketOrder) {\n const { delta, hasProfit } = calculatePositionDelta(triggerPriceUsd, existingPosition);\n if (hasProfit && delta.eq(0)) {\n return t`Invalid price, see warning`;\n }\n }\n if (isMarketOrder && hasPendingProfit && !isProfitWarningAccepted) {\n return t`Forfeit profit not checked`;\n }\n return false;\n };\n\n const getPrimaryText = () => {\n if (decreaseOrdersThatWillBeExecuted.length > 0 && !isTriggerWarningAccepted) {\n return t`Accept confirmation of trigger orders`;\n }\n\n if (!isPendingConfirmation) {\n const error = getError();\n if (error) {\n return error;\n }\n\n if (isSwap) {\n return title;\n }\n const action = isMarketOrder ? (isLong ? t`Long` : t`Short`) : t`Create Order`;\n\n if (\n isMarketOrder &&\n MIN_PROFIT_TIME > 0 &&\n hasExistingPosition &&\n existingPosition.delta.eq(0) &&\n existingPosition.pendingDelta.gt(0)\n ) {\n return isLong ? t`Forfeit profit and ${action}` : t`Forfeit profit and Short`;\n }\n\n return isMarketOrder && MIN_PROFIT_TIME > 0 ? t`Accept minimum and ${action}` : action;\n }\n\n if (!isMarketOrder) {\n return t`Creating Order...`;\n }\n if (isSwap) {\n return t`Swapping...`;\n }\n if (isLong) {\n return t`Longing...`;\n }\n return t`Shorting...`;\n };\n\n const isPrimaryEnabled = () => {\n if (getError()) {\n return false;\n }\n if (decreaseOrdersThatWillBeExecuted.length > 0 && !isTriggerWarningAccepted) {\n return false;\n }\n return !isPendingConfirmation && !isSubmitting;\n };\n\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const spread = getSpread(fromTokenInfo, toTokenInfo, isLong, nativeTokenAddress);\n // it's meaningless for limit/stop orders to show spread based on current prices\n const showSpread = isMarketOrder && !!spread;\n\n let allowedSlippage = savedSlippageAmount;\n if (isHigherSlippageAllowed) {\n allowedSlippage = DEFAULT_HIGHER_SLIPPAGE_AMOUNT;\n }\n\n const renderSpreadWarning = useCallback(() => {\n if (!isMarketOrder) {\n return null;\n }\n\n if (spread && spread.isHigh) {\n return (\n
\n The spread is {`>`} 1%, please ensure the trade details are acceptable before comfirming\n
\n );\n }\n }, [isMarketOrder, spread]);\n\n const renderFeeWarning = useCallback(() => {\n if (orderOption === LIMIT || !feeBps || feeBps <= 60) {\n return null;\n }\n\n if (isSwap) {\n return (\n
\n \n Fees are high to swap from {fromToken.symbol} to {toToken.symbol}.\n \n
\n );\n }\n\n if (!collateralTokenAddress) {\n return null;\n }\n\n const collateralToken = getToken(chainId, collateralTokenAddress);\n return (\n
\n \n Fees are high to swap from {fromToken.symbol} to {collateralToken.symbol}.
\n {collateralToken.symbol} is needed for collateral.\n
\n
\n );\n }, [feeBps, isSwap, collateralTokenAddress, chainId, fromToken.symbol, toToken.symbol, orderOption]);\n\n const hasPendingProfit =\n MIN_PROFIT_TIME > 0 && existingPosition && existingPosition.delta.eq(0) && existingPosition.pendingDelta.gt(0);\n\n const renderExistingOrderWarning = useCallback(() => {\n if (isSwap || !existingOrder) {\n return;\n }\n const indexToken = getToken(chainId, existingOrder.indexToken);\n const sizeInToken = formatAmount(\n existingOrder.sizeDelta.mul(PRECISION).div(existingOrder.triggerPrice),\n USD_DECIMALS,\n 4,\n true\n );\n const longOrShortText = existingOrder.isLong ? t`Long` : t`Short`;\n if (existingOrders?.length > 1) {\n return (\n
\n
\n \n \n You have multiple existing Increase {longOrShortText} {indexToken.symbol} limit orders{\" \"}\n \n \n setIsLimitOrdersVisible((p) => !p)} className=\"view-orders\">\n ({isLimitOrdersVisible ? t`hide` : t`view`})\n \n
\n {isLimitOrdersVisible && (\n
    \n {existingOrders.map((order) => {\n const { account, index, type, triggerAboveThreshold, triggerPrice } = order;\n const id = `${account}-${index}`;\n const triggerPricePrefix = triggerAboveThreshold ? TRIGGER_PREFIX_ABOVE : TRIGGER_PREFIX_BELOW;\n const indexToken = getToken(chainId, order.indexToken);\n\n return (\n
  • \n

    \n {type === INCREASE ? t`Increase` : t`Decrease`} {indexToken.symbol} {isLong ? t`Long` : t`Short`}{\" \"}\n  {triggerPricePrefix} ${formatPrice(triggerPrice, true)}\n

    \n \n
  • \n );\n })}\n
\n )}\n
\n );\n }\n return (\n
\n \n You have an active Limit Order to Increase {longOrShortText} {sizeInToken} {indexToken.symbol} ($\n {formatAmount(existingOrder.sizeDelta, USD_DECIMALS, 2, true)}) at price $\n {formatPrice(existingOrder.triggerPrice, true)}\n \n
\n );\n }, [existingOrder, isSwap, chainId, existingOrders, isLong, isLimitOrdersVisible, onCancelOrderClick]);\n\n const renderExistingTriggerErrors = useCallback(() => {\n if (isSwap || decreaseOrdersThatWillBeExecuted?.length < 1) {\n return;\n }\n const existingTriggerOrderLength = decreaseOrdersThatWillBeExecuted.length;\n return (\n <>\n
\n \n
\n
    \n {decreaseOrdersThatWillBeExecuted.map((order) => {\n const { account, index, type, triggerAboveThreshold, triggerPrice } = order;\n const id = `${account}-${index}`;\n const triggerPricePrefix = triggerAboveThreshold ? TRIGGER_PREFIX_ABOVE : TRIGGER_PREFIX_BELOW;\n const indexToken = getToken(chainId, order.indexToken);\n return (\n
  • \n

    \n {type === INCREASE ? t`Increase` : t`Decrease`} {indexToken.symbol} {isLong ? t`Long` : t`Short`}\n  {triggerPricePrefix} ${formatPrice(triggerPrice, true)}\n

    \n \n cancelDecreaseOrder(chainId, library, index, {\n successMsg: t`Order cancelled`,\n failMsg: t`Cancel failed`,\n sentMsg: t`Cancel submitted`,\n pendingTxns,\n setPendingTxns,\n })\n }\n >\n Cancel\n \n
  • \n );\n })}\n
\n \n );\n }, [decreaseOrdersThatWillBeExecuted, isSwap, chainId, library, pendingTxns, setPendingTxns, isLong]);\n\n const renderExistingTriggerWarning = useCallback(() => {\n if (\n isSwap ||\n existingTriggerOrders.length < 1 ||\n decreaseOrdersThatWillBeExecuted.length > 0 ||\n renderExistingOrderWarning()\n ) {\n return;\n }\n const existingTriggerOrderLength = existingTriggerOrders.length;\n return (\n
\n \n
\n );\n }, [existingTriggerOrders, isSwap, decreaseOrdersThatWillBeExecuted, renderExistingOrderWarning]);\n\n // TODO handle unaprproved order plugin (very unlikely case)\n const renderMain = useCallback(() => {\n if (isSwap) {\n return (\n
\n
\n Pay {formatAmount(fromAmount, fromToken.decimals, 4, true)} {fromToken.symbol} ($\n {formatAmount(fromUsdMin, USD_DECIMALS, 2, true)})\n
\n
\n
\n Receive {formatAmount(toAmount, toToken.decimals, 4, true)} {toToken.symbol} ($\n {formatAmount(toUsdMax, USD_DECIMALS, 2, true)})\n
\n
\n );\n }\n\n return (\n
\n \n Pay {formatAmount(fromAmount, fromToken.decimals, 4, true)} {fromToken.symbol} ($\n {formatAmount(fromUsdMin, USD_DECIMALS, 2, true)})\n \n
\n
\n {isLong ? t`Long` : t`Short`} \n {formatAmount(toAmount, toToken.decimals, 4, true)} {toToken.symbol} ($\n {formatAmount(toUsdMax, USD_DECIMALS, 2, true)})\n
\n
\n );\n }, [isSwap, fromAmount, fromToken, toToken, fromUsdMin, toUsdMax, isLong, toAmount]);\n\n const SWAP_ORDER_EXECUTION_GAS_FEE = getConstant(chainId, \"SWAP_ORDER_EXECUTION_GAS_FEE\");\n const INCREASE_ORDER_EXECUTION_GAS_FEE = getConstant(chainId, \"INCREASE_ORDER_EXECUTION_GAS_FEE\");\n const executionFee = isSwap ? SWAP_ORDER_EXECUTION_GAS_FEE : INCREASE_ORDER_EXECUTION_GAS_FEE;\n const renderExecutionFee = useCallback(() => {\n if (isMarketOrder) {\n return null;\n }\n return (\n \n {formatAmount(executionFee, 18, 4)} {getNativeToken(chainId).symbol}\n \n );\n }, [isMarketOrder, executionFee, chainId]);\n\n const renderAvailableLiquidity = useCallback(() => {\n let availableLiquidity;\n const riskThresholdBps = 5000;\n let isLiquidityRisk;\n const token = isSwap || isLong ? toTokenInfo : shortCollateralToken;\n\n if (!token || !token.poolAmount || !token.availableAmount) {\n return null;\n }\n\n if (isSwap) {\n const poolWithoutBuffer = token.poolAmount.sub(token.bufferAmount);\n availableLiquidity = token.availableAmount.gt(poolWithoutBuffer) ? poolWithoutBuffer : token.availableAmount;\n isLiquidityRisk = availableLiquidity.mul(riskThresholdBps).div(BASIS_POINTS_DIVISOR).lt(toAmount);\n } else {\n if (isShort) {\n availableLiquidity = token.availableAmount;\n\n let adjustedMaxGlobalShortSize;\n\n if (toTokenInfo.maxAvailableShort && toTokenInfo.maxAvailableShort.gt(0)) {\n adjustedMaxGlobalShortSize = toTokenInfo.maxAvailableShort\n .mul(expandDecimals(1, token.decimals))\n .div(expandDecimals(1, USD_DECIMALS));\n }\n\n if (adjustedMaxGlobalShortSize && adjustedMaxGlobalShortSize.lt(token.availableAmount)) {\n availableLiquidity = adjustedMaxGlobalShortSize;\n }\n\n const sizeTokens = toUsdMax.mul(expandDecimals(1, token.decimals)).div(token.minPrice);\n isLiquidityRisk = availableLiquidity.mul(riskThresholdBps).div(BASIS_POINTS_DIVISOR).lt(sizeTokens);\n } else {\n availableLiquidity = token.availableAmount;\n isLiquidityRisk = availableLiquidity.mul(riskThresholdBps).div(BASIS_POINTS_DIVISOR).lt(toAmount);\n }\n }\n\n if (!availableLiquidity) {\n return null;\n }\n\n return (\n \n \n {formatAmount(availableLiquidity, token.decimals, token.isStable ? 0 : 2, true)} {token.symbol}\n \n }\n renderContent={() =>\n isLiquidityRisk\n ? t`There may not be sufficient liquidity to execute your order when the price conditions are met`\n : t`The order will only execute if the price conditions are met and there is sufficient liquidity`\n }\n />\n \n );\n }, [toTokenInfo, shortCollateralToken, isShort, isLong, isSwap, toAmount, toUsdMax]);\n\n const renderMarginSection = useCallback(() => {\n return (\n <>\n
\n {renderMain()}\n {renderFeeWarning()}\n {renderExistingOrderWarning()}\n {renderExistingTriggerErrors()}\n {renderExistingTriggerWarning()}\n {minExecutionFeeErrorMessage &&
{minExecutionFeeErrorMessage}
}\n {hasPendingProfit && isMarketOrder && (\n
\n \n \n Forfeit profit\n \n \n
\n )}\n {orderOption === LIMIT && renderAvailableLiquidity()}\n {isShort && (\n \n {getToken(chainId, shortCollateralAddress).symbol}\n \n )}\n {isLong && }\n \n {hasExistingPosition && toAmount && toAmount.gt(0) && (\n
\n {formatAmount(existingPosition.leverage, 4, 2)}x\n \n
\n )}\n {toAmount && leverage && leverage.gt(0) && `${formatAmount(leverage, 4, 2)}x`}\n {!toAmount && leverage && leverage.gt(0) && `-`}\n {leverage && leverage.eq(0) && `-`}\n
\n \n {hasExistingPosition && toAmount && toAmount.gt(0) && (\n
\n ${formatPrice(existingLiquidationPrice, true)}\n \n
\n )}\n {toAmount && displayLiquidationPrice && `$${formatAmount(displayLiquidationPrice, USD_DECIMALS, 2, true)}`}\n {!toAmount && displayLiquidationPrice && `-`}\n {!displayLiquidationPrice && `-`}\n
\n ${formatAmount(feesUsd, USD_DECIMALS, 2, true)}\n \n {\n return (\n <>\n Your position's collateral after deducting fees.\n
\n
\n \n \n
\n \n \n );\n }}\n />\n \n {showSpread && (\n \n {formatAmount(spread.value.mul(100), USD_DECIMALS, 2, true)}%\n \n )}\n {isMarketOrder && (\n \n {hasExistingPosition && toAmount && toAmount.gt(0) && (\n
\n ${formatPrice(existingPosition.averagePrice, true)}\n \n
\n )}\n {nextAveragePrice && `$${formatPrice(nextAveragePrice, true)}`}\n {!nextAveragePrice && `-`}\n
\n )}\n {!isMarketOrder && (\n \n ${formatPrice(triggerPriceUsd, true)}\n \n )}\n \n {isLong && toTokenInfo && formatAmount(toTokenInfo.fundingRate, 4, 4)}\n {isShort && shortCollateralToken && formatAmount(shortCollateralToken.fundingRate, 4, 4)}\n {((isLong && toTokenInfo && toTokenInfo.fundingRate) ||\n (isShort && shortCollateralToken && shortCollateralToken.fundingRate)) &&\n \"% / 1h\"}\n \n {isMarketOrder && (\n
\n \n {\n return (\n <>\n \n
\n \n This is the network cost required to execute the postion.{\" \"}\n \n More Info\n \n \n \n );\n }}\n />\n
\n
\n )}\n \n {\n return (\n \n You can change this in the settings menu on the top right of the page.\n
\n
\n Note that a low allowed slippage, e.g. less than 0.5%, may result in failed orders if prices are\n volatile.\n
\n );\n }}\n />\n
\n {isMarketOrder && (\n
\n \n \n Allow up to 1% slippage\n \n \n
\n )}\n {decreaseOrdersThatWillBeExecuted.length > 0 && (\n
\n \n \n I am aware of the trigger orders\n \n \n
\n )}\n {renderExecutionFee()}\n
\n \n );\n }, [\n renderMain,\n shortCollateralAddress,\n isShort,\n isLong,\n toTokenInfo,\n nextAveragePrice,\n toAmount,\n hasExistingPosition,\n existingPosition,\n isMarketOrder,\n triggerPriceUsd,\n showSpread,\n spread,\n displayLiquidationPrice,\n existingLiquidationPrice,\n feesUsd,\n leverage,\n renderExecutionFee,\n shortCollateralToken,\n chainId,\n renderFeeWarning,\n hasPendingProfit,\n isProfitWarningAccepted,\n renderAvailableLiquidity,\n orderOption,\n fromUsdMin,\n collateralAfterFees,\n renderExistingOrderWarning,\n renderExistingTriggerWarning,\n renderExistingTriggerErrors,\n isHigherSlippageAllowed,\n setIsHigherSlippageAllowed,\n allowedSlippage,\n isTriggerWarningAccepted,\n decreaseOrdersThatWillBeExecuted,\n minExecutionFee,\n nativeTokenSymbol,\n minExecutionFeeUSD,\n minExecutionFeeErrorMessage,\n ]);\n\n const renderSwapSection = useCallback(() => {\n return (\n <>\n
\n {renderMain()}\n {renderFeeWarning()}\n {renderSpreadWarning()}\n {orderOption === LIMIT && renderAvailableLiquidity()}\n \n {formatAmount(minOut, toTokenInfo.decimals, 4, true)} {toTokenInfo.symbol}\n \n \n {getExchangeRateDisplay(getExchangeRate(fromTokenInfo, toTokenInfo), fromTokenInfo, toTokenInfo)}\n \n {!isMarketOrder && (\n
\n
\n Limit Price\n
\n
{getExchangeRateDisplay(triggerRatio, fromTokenInfo, toTokenInfo)}
\n
\n )}\n {showSpread && (\n \n {formatAmount(spread.value.mul(100), USD_DECIMALS, 2, true)}%\n \n )}\n
\n
\n Fees\n
\n
\n {formatAmount(feeBps, 2, 2, true)}% ({formatAmount(fees, fromTokenInfo.decimals, 4, true)}{\" \"}\n {fromTokenInfo.symbol}: ${formatAmount(feesUsd, USD_DECIMALS, 2, true)})\n
\n
\n {renderExecutionFee()}\n {fromTokenUsd && (\n
\n
\n {fromTokenInfo.symbol} Price\n
\n
{fromTokenUsd} USD
\n
\n )}\n {toTokenUsd && (\n
\n
\n {toTokenInfo.symbol} Price\n
\n
{toTokenUsd} USD
\n
\n )}\n
\n \n );\n }, [\n renderMain,\n renderSpreadWarning,\n fromTokenInfo,\n toTokenInfo,\n orderOption,\n showSpread,\n spread,\n feesUsd,\n feeBps,\n renderExecutionFee,\n fromTokenUsd,\n toTokenUsd,\n triggerRatio,\n fees,\n isMarketOrder,\n minOut,\n renderFeeWarning,\n renderAvailableLiquidity,\n ]);\n\n return (\n
\n setIsConfirming(false)} label={title} allowContentTouchMove>\n {isSwap && renderSwapSection()}\n {!isSwap && renderMarginSection()}\n
\n \n {getPrimaryText()}\n \n
\n
\n
\n );\n}\n","import React, { useState } from \"react\";\nimport { Trans, t } from \"@lingui/macro\";\nimport Modal from \"../Modal/Modal\";\nimport Checkbox from \"../Checkbox/Checkbox\";\n\nimport \"./OrdersToa.css\";\n\nexport default function OrdersToa(props) {\n const { setIsVisible, isPluginApproving, approveOrderBook } = props;\n\n const [isChecked, setIsChecked] = useState(false);\n\n const onConfirmationClick = () => {\n approveOrderBook().then(() => {\n setIsVisible(false);\n });\n };\n\n const getPrimaryText = () => {\n if (isPluginApproving) {\n return t`Enabling Orders...`;\n }\n if (!isChecked) {\n return t`Accept terms to enable orders`;\n }\n return t`Enable Orders`;\n };\n\n const isPrimaryEnabled = () => {\n if (isPluginApproving) {\n return false;\n }\n return isChecked;\n };\n\n return (\n \n \n Note that orders are not guaranteed to be executed.\n
\n
\n This can occur in a few situations including but not exclusive to:\n
\n
\n
    \n \n
  • Insufficient liquidity to execute the order
  • \n
  • The mark price which is an aggregate of exchange prices did not reach the specified price
  • \n
  • The specified price was reached but not long enough for it to be executed
  • \n
  • No keeper picked up the order for execution
  • \n
    \n
\n
\n \n Additionally, trigger orders are market orders and are not guaranteed to settle at the trigger price.\n \n
\n
\n
\n \n \n \n Accept that orders are not guaranteed to execute and trigger orders may not settle at the trigger price\n \n \n \n
\n \n \n );\n}\n","import {\n isAddressZero,\n USD_DECIMALS,\n MAX_REFERRAL_CODE_LENGTH,\n getTwitterIntentURL,\n REFERRAL_CODE_QUERY_PARAM,\n} from \"lib/legacy\";\nimport { encodeReferralCode, getReferralCodeOwner } from \"domain/referrals\";\nimport { GOERLI, IS_TESTNET, MOONBEAM, MUMBAI } from \"config/chains\";\nimport { bigNumberify, formatAmount } from \"lib/numbers\";\nimport { t } from \"@lingui/macro\";\nimport { getRootUrl } from \"lib/url\";\n\nexport const REFERRAL_CODE_REGEX = /^\\w+$/; // only number, string and underscore is allowed\nexport const REGEX_VERIFY_BYTES32 = /^0x[0-9a-f]{64}$/;\n\nexport function isRecentReferralCodeNotExpired(referralCodeInfo) {\n const REFERRAL_DATA_MAX_TIME = 60000 * 5; // 5 minutes\n if (referralCodeInfo.time) {\n return referralCodeInfo.time + REFERRAL_DATA_MAX_TIME > Date.now();\n }\n}\n\nexport async function getReferralCodeTakenStatus(account, referralCode, chainId) {\n const referralCodeBytes32 = encodeReferralCode(referralCode);\n // const [ownerArbitrum, ownerAvax] = await Promise.all([\n // getReferralCodeOwner(ARBITRUM, referralCodeBytes32),\n // getReferralCodeOwner(AVALANCHE, referralCodeBytes32),\n // ]);\n\n // const takenOnArb =\n // !isAddressZero(ownerArbitrum) && (ownerArbitrum !== account || (ownerArbitrum === account && chainId === ARBITRUM));\n // const takenOnAvax =\n // !isAddressZero(ownerAvax) && (ownerAvax !== account || (ownerAvax === account && chainId === AVALANCHE));\n\n // const referralCodeTakenInfo = {\n // [ARBITRUM]: takenOnArb,\n // [AVALANCHE]: takenOnAvax,\n // both: takenOnArb && takenOnAvax,\n // ownerArbitrum,\n // ownerAvax,\n // };\n\n // if (referralCodeTakenInfo.both) {\n // return { status: \"all\", info: referralCodeTakenInfo };\n // }\n // if (referralCodeTakenInfo[chainId]) {\n // return { status: \"current\", info: referralCodeTakenInfo };\n // }\n // if (chainId === AVALANCHE ? referralCodeTakenInfo[ARBITRUM] : referralCodeTakenInfo[AVALANCHE]) {\n // return { status: \"other\", info: referralCodeTakenInfo };\n // }\n // return { status: \"none\", info: referralCodeTakenInfo };\n\n if (IS_TESTNET) {\n const [ownerEthereum] = await Promise.all([\n getReferralCodeOwner(MUMBAI, referralCodeBytes32),\n ]);\n\n const takenOnEth =\n !isAddressZero(ownerEthereum) && (ownerEthereum !== account || (ownerEthereum === account && chainId === MUMBAI));\n\n const referralCodeTakenInfo = {\n [MUMBAI]: takenOnEth,\n ownerEthereum,\n };\n\n if (referralCodeTakenInfo[chainId]) {\n return { status: \"current\", info: referralCodeTakenInfo };\n }\n return { status: \"none\", info: referralCodeTakenInfo };\n } else {\n const [ownerMoonBeam] = await Promise.all([\n getReferralCodeOwner(MOONBEAM, referralCodeBytes32),\n ]);\n\n const takenOnMB =\n !isAddressZero(ownerMoonBeam) && (ownerMoonBeam !== account || (ownerMoonBeam === account && chainId === MOONBEAM));\n\n const referralCodeTakenInfo = {\n [MOONBEAM]: takenOnMB,\n ownerMoonBeam,\n };\n\n if (referralCodeTakenInfo[chainId]) {\n return { status: \"current\", info: referralCodeTakenInfo };\n }\n return { status: \"none\", info: referralCodeTakenInfo };\n }\n}\n\nexport function getTierIdDisplay(tierId) {\n return Number(tierId) + 1;\n}\n\nexport const tierRebateInfo = {\n 0: 5,\n 1: 10,\n 2: 15,\n};\n\nexport const tierDiscountInfo = {\n 0: 5,\n 1: 10,\n 2: 10,\n};\n\nfunction areObjectsWithSameKeys(obj1, obj2) {\n return Object.keys(obj1).every((key) => key in obj2);\n}\n\nexport function deserializeSampleStats(input) {\n const parsedData = JSON.parse(input);\n if (!Array.isArray(parsedData)) return [];\n return parsedData\n .map((data) => {\n if (!areObjectsWithSameKeys(getSampleReferrarStat(), data)) return null;\n return Object.keys(data).reduce((acc, cv) => {\n const currentValue = data[cv];\n if (currentValue?.type === \"BigNumber\") {\n acc[cv] = bigNumberify(currentValue.hex || 0);\n } else {\n acc[cv] = currentValue;\n }\n return acc;\n }, {});\n })\n .filter(Boolean);\n}\n\nexport const getSampleReferrarStat = (code = \"\", ownerOnOtherNetwork = \"\", account = \"\") => {\n return {\n discountUsd: bigNumberify(0),\n referralCode: code,\n totalRebateUsd: bigNumberify(0),\n tradedReferralsCount: 0,\n registeredReferralsCount: 0,\n trades: 0,\n volume: bigNumberify(0),\n time: Date.now(),\n ownerOnOtherChain: {\n code: encodeReferralCode(code),\n codeString: code,\n owner: undefined,\n isTaken: !isAddressZero(ownerOnOtherNetwork),\n isTakenByCurrentUser:\n !isAddressZero(ownerOnOtherNetwork) && ownerOnOtherNetwork.toLowerCase() === account.toLowerCase(),\n },\n };\n};\n\nexport function getUSDValue(value, decimals = 2) {\n return `$${formatAmount(value, USD_DECIMALS, decimals, true, \"0.00\")}`;\n}\n\nexport function getCodeError(value) {\n const trimmedValue = value.trim();\n if (!trimmedValue) return \"\";\n\n if (trimmedValue.length > MAX_REFERRAL_CODE_LENGTH) {\n return t`The referral code can't be more than ${MAX_REFERRAL_CODE_LENGTH} characters.`;\n }\n\n if (!REFERRAL_CODE_REGEX.test(trimmedValue)) {\n return t`Only letters, numbers and underscores are allowed.`;\n }\n return \"\";\n}\n\nexport function getReferralCodeTradeUrl(referralCode) {\n return `${getRootUrl()}/#/trade/?${REFERRAL_CODE_QUERY_PARAM}=${referralCode}`;\n}\n\nexport function getTwitterShareUrl(referralCode) {\n const message = [\"Trying out trading on @FXDX_IO, up to 30x leverage on $BTC, $ETH 📈\", \"For fee discounts use:\"];\n const shareURL = getReferralCodeTradeUrl(referralCode);\n\n return getTwitterIntentURL(message, shareURL);\n}\n","export function getRootUrl() {\n const { origin, protocol, hostname, port } = window.location;\n let url = origin;\n if (!origin) {\n const portString = port && `:${port}`;\n url = `${protocol}//${hostname}${portString}`;\n }\n return url;\n}\n","import { ethers } from \"ethers\";\nimport { gql } from \"@apollo/client\";\nimport { useState, useEffect, useMemo } from \"react\";\nimport useSWR from \"swr\";\n\nimport ReferralStorage from \"abis/ReferralStorage.json\";\nimport { MAX_REFERRAL_CODE_LENGTH, isAddressZero, isHashZero } from \"lib/legacy\";\nimport { getContract } from \"config/contracts\";\nimport { REGEX_VERIFY_BYTES32 } from \"components/Referrals/referralsHelper\";\nimport { ARBITRUM, AVALANCHE, GOERLI, IS_TESTNET, MOONBEAM, MUMBAI } from \"config/chains\";\nimport {\n goerliReferralsGraphClient,\n arbitrumReferralsGraphClient,\n avalancheReferralsGraphClient,\n moonbeamReferralsGraphClient,\n mumbaiReferralsGraphClient,\n} from \"lib/subgraph/clients\";\nimport { callContract, contractFetcher } from \"lib/contracts\";\nimport { helperToast } from \"lib/helperToast\";\nimport { REFERRAL_CODE_KEY } from \"config/localStorage\";\nimport { getProvider } from \"lib/rpc\";\nimport { bigNumberify } from \"lib/numbers\";\n\n// const ACTIVE_CHAINS = [ARBITRUM, AVALANCHE];\nconst ACTIVE_CHAINS = [IS_TESTNET ? MUMBAI : MOONBEAM];\nconst DISTRIBUTION_TYPE_REBATES = \"1\";\nconst DISTRIBUTION_TYPE_DISCOUNT = \"2\";\n\nfunction getGraphClient(chainId) {\n if (chainId === GOERLI) {\n return goerliReferralsGraphClient;\n } else if (chainId === ARBITRUM) {\n return arbitrumReferralsGraphClient;\n } else if (chainId === AVALANCHE) {\n return avalancheReferralsGraphClient;\n } else if (chainId === MOONBEAM) {\n return moonbeamReferralsGraphClient;\n } else if (chainId === MUMBAI) {\n return mumbaiReferralsGraphClient;\n }\n throw new Error(`Unsupported chain ${chainId}`);\n}\n\nexport function decodeReferralCode(hexCode) {\n try {\n return ethers.utils.parseBytes32String(hexCode);\n } catch (ex) {\n let code = \"\";\n hexCode = hexCode.substring(2);\n for (let i = 0; i < 32; i++) {\n code += String.fromCharCode(parseInt(hexCode.substring(i * 2, i * 2 + 2), 16));\n }\n return code.trim();\n }\n}\n\nexport function encodeReferralCode(code) {\n let final = code.replace(/[^\\w_]/g, \"\"); // replace everything other than numbers, string and underscor to ''\n if (final.length > MAX_REFERRAL_CODE_LENGTH) {\n return ethers.constants.HashZero;\n }\n return ethers.utils.formatBytes32String(final);\n}\n\nasync function getCodeOwnersData(network, account, codes = []) {\n if (codes.length === 0 || !account || !network) {\n return undefined;\n }\n const query = gql`\n query allCodes($codes: [String!]!) {\n referralCodes(where: { code_in: $codes }) {\n owner\n id\n }\n }\n `;\n return getGraphClient(network)\n .query({ query, variables: { codes } })\n .then(({ data }) => {\n const { referralCodes } = data;\n const codeOwners = referralCodes.reduce((acc, cv) => {\n acc[cv.id] = cv.owner;\n return acc;\n }, {});\n return codes.map((code) => {\n const owner = codeOwners[code];\n return {\n code,\n codeString: decodeReferralCode(code),\n owner,\n isTaken: Boolean(owner),\n isTakenByCurrentUser: owner && owner.toLowerCase() === account.toLowerCase(),\n };\n });\n });\n}\n\nexport function useUserCodesOnAllChain(account) {\n const [data, setData] = useState(null);\n const query = gql`\n query referralCodesOnAllChain($account: String!) {\n referralCodes(first: 1000, where: { owner: $account }) {\n code\n }\n }\n `;\n useEffect(() => {\n async function main() {\n const [codes /* arbitrumCodes, avalancheCodes*/] = await Promise.all(\n ACTIVE_CHAINS.map((chainId) => {\n return getGraphClient(chainId)\n .query({ query, variables: { account: (account || \"\").toLowerCase() } })\n .then(({ data }) => {\n return data.referralCodes.map((c) => c.code);\n });\n })\n );\n // const [codeOwnersOnAvax = [], codeOwnersOnArbitrum = []] = await Promise.all([\n // getCodeOwnersData(AVALANCHE, account, arbitrumCodes),\n // getCodeOwnersData(ARBITRUM, account, avalancheCodes),\n // ]);\n const [codeOwners = []] = await Promise.all([\n getCodeOwnersData(IS_TESTNET ? MUMBAI : MOONBEAM, account, codes),\n ]);\n\n setData({\n [IS_TESTNET ? MUMBAI : MOONBEAM]: codeOwners.reduce((acc, cv) => {\n acc[cv.code] = cv;\n return acc;\n }, {}),\n // [ARBITRUM]: codeOwnersOnAvax.reduce((acc, cv) => {\n // acc[cv.code] = cv;\n // return acc;\n // }, {}),\n // [AVALANCHE]: codeOwnersOnArbitrum.reduce((acc, cv) => {\n // acc[cv.code] = cv;\n // return acc;\n // }, {}),\n });\n }\n\n main();\n }, [account, query]);\n return data;\n}\n\nexport function useReferralsData(chainId, account) {\n const [data, setData] = useState(null);\n const [loading, setLoading] = useState(true);\n const ownerOnOtherChain = useUserCodesOnAllChain(account);\n useEffect(() => {\n if (!chainId || !account) {\n setLoading(false);\n return;\n }\n const startOfDayTimestamp = Math.floor(parseInt(Date.now() / 1000) / 86400) * 86400;\n const query = gql`\n query referralData($typeIds: [String!]!, $account: String!, $timestamp: Int!, $referralTotalStatsId: String!) {\n distributions(\n first: 1000\n orderBy: timestamp\n orderDirection: desc\n where: { receiver: $account, typeId_in: $typeIds }\n ) {\n receiver\n amount\n typeId\n token\n transactionHash\n timestamp\n }\n referrerTotalStats: referrerStats(\n first: 1000\n orderBy: volume\n orderDirection: desc\n where: { period: total, referrer: $account }\n ) {\n referralCode\n volume\n trades\n tradedReferralsCount\n registeredReferralsCount\n totalRebateUsd\n discountUsd\n }\n referrerLastDayStats: referrerStats(\n first: 1000\n where: { period: daily, referrer: $account, timestamp: $timestamp }\n ) {\n referralCode\n volume\n trades\n tradedReferralsCount\n registeredReferralsCount\n totalRebateUsd\n discountUsd\n }\n referralCodes(first: 1000, where: { owner: $account }) {\n code\n }\n referralTotalStats: referralStat(id: $referralTotalStatsId) {\n volume\n discountUsd\n }\n referrerTierInfo: referrer(id: $account) {\n tierId\n id\n discountShare\n }\n }\n `;\n setLoading(true);\n\n getGraphClient(chainId)\n .query({\n query,\n variables: {\n typeIds: [DISTRIBUTION_TYPE_REBATES, DISTRIBUTION_TYPE_DISCOUNT],\n account: (account || \"\").toLowerCase(),\n timestamp: startOfDayTimestamp,\n referralTotalStatsId: account && `total:0:${account.toLowerCase()}`,\n },\n })\n .then((res) => {\n const rebateDistributions = [];\n const discountDistributions = [];\n res.data.distributions.forEach((d) => {\n const item = {\n timestamp: parseInt(d.timestamp),\n transactionHash: d.transactionHash,\n receiver: ethers.utils.getAddress(d.receiver),\n amount: bigNumberify(d.amount),\n typeId: d.typeId,\n token: ethers.utils.getAddress(d.token),\n };\n if (d.typeId === DISTRIBUTION_TYPE_REBATES) {\n rebateDistributions.push(item);\n } else {\n discountDistributions.push(item);\n }\n });\n\n function prepareStatsItem(e) {\n return {\n volume: bigNumberify(e.volume),\n trades: parseInt(e.trades),\n tradedReferralsCount: parseInt(e.tradedReferralsCount),\n registeredReferralsCount: parseInt(e.registeredReferralsCount),\n totalRebateUsd: bigNumberify(e.totalRebateUsd),\n discountUsd: bigNumberify(e.discountUsd),\n referralCode: decodeReferralCode(e.referralCode),\n ownerOnOtherChain: ownerOnOtherChain?.[chainId][e.referralCode],\n };\n }\n\n function getCumulativeStats(data = []) {\n return data.reduce(\n (acc, cv) => {\n acc.totalRebateUsd = acc.totalRebateUsd.add(cv.totalRebateUsd);\n acc.volume = acc.volume.add(cv.volume);\n acc.discountUsd = acc.discountUsd.add(cv.discountUsd);\n acc.trades = acc.trades + cv.trades;\n acc.tradedReferralsCount = acc.tradedReferralsCount + cv.tradedReferralsCount;\n acc.registeredReferralsCount = acc.registeredReferralsCount + cv.registeredReferralsCount;\n return acc;\n },\n {\n totalRebateUsd: bigNumberify(0),\n volume: bigNumberify(0),\n discountUsd: bigNumberify(0),\n trades: 0,\n tradedReferralsCount: 0,\n registeredReferralsCount: 0,\n }\n );\n }\n\n let referrerTotalStats = res.data.referrerTotalStats.map(prepareStatsItem);\n setData({\n rebateDistributions,\n discountDistributions,\n referrerTotalStats,\n referrerTierInfo: res.data.referrerTierInfo,\n referrerLastDayStats: res.data.referrerLastDayStats.map(prepareStatsItem),\n cumulativeStats: getCumulativeStats(referrerTotalStats),\n codes: res.data.referralCodes.map((e) => decodeReferralCode(e.code)),\n referralTotalStats: res.data.referralTotalStats\n ? {\n volume: bigNumberify(res.data.referralTotalStats.volume),\n discountUsd: bigNumberify(res.data.referralTotalStats.discountUsd),\n }\n : {\n volume: bigNumberify(0),\n discountUsd: bigNumberify(0),\n },\n });\n })\n .catch(console.warn)\n .finally(() => {\n setLoading(false);\n });\n }, [setData, chainId, account, ownerOnOtherChain]);\n\n return {\n data: data || null,\n loading,\n };\n}\n\nexport async function registerReferralCode(chainId, referralCode, library, opts) {\n const referralStorageAddress = getContract(chainId, \"ReferralStorage\");\n const referralCodeHex = encodeReferralCode(referralCode);\n const contract = new ethers.Contract(referralStorageAddress, ReferralStorage.abi, library.getSigner());\n return callContract(chainId, contract, \"registerCode\", [referralCodeHex], opts);\n}\n\nexport async function setTraderReferralCodeByUser(chainId, referralCode, library, opts) {\n const referralCodeHex = encodeReferralCode(referralCode);\n const referralStorageAddress = getContract(chainId, \"ReferralStorage\");\n const contract = new ethers.Contract(referralStorageAddress, ReferralStorage.abi, library.getSigner());\n const codeOwner = await contract.codeOwners(referralCodeHex);\n if (isAddressZero(codeOwner)) {\n const errorMsg = \"Referral code does not exist\";\n helperToast.error(errorMsg);\n return Promise.reject(errorMsg);\n }\n return callContract(chainId, contract, \"setTraderReferralCodeByUser\", [referralCodeHex], opts);\n}\n\nexport async function getReferralCodeOwner(chainId, referralCode) {\n const referralStorageAddress = getContract(chainId, \"ReferralStorage\");\n const provider = getProvider(null, chainId);\n const contract = new ethers.Contract(referralStorageAddress, ReferralStorage.abi, provider);\n const codeOwner = await contract.codeOwners(referralCode);\n return codeOwner;\n}\n\nexport function useUserReferralCode(library, chainId, account) {\n const localStorageCode = window.localStorage.getItem(REFERRAL_CODE_KEY);\n const referralStorageAddress = getContract(chainId, \"ReferralStorage\");\n const { data: onChainCode } = useSWR(\n account && [\"ReferralStorage\", chainId, referralStorageAddress, \"traderReferralCodes\", account],\n { fetcher: contractFetcher(library, ReferralStorage) }\n );\n const { data: localStorageCodeOwner } = useSWR(\n localStorageCode &&\n REGEX_VERIFY_BYTES32.test(localStorageCode) && [\n \"ReferralStorage\",\n chainId,\n referralStorageAddress,\n \"codeOwners\",\n localStorageCode,\n ],\n { fetcher: contractFetcher(library, ReferralStorage) }\n );\n const [attachedOnChain, userReferralCode, userReferralCodeString] = useMemo(() => {\n if (onChainCode && !isHashZero(onChainCode)) {\n return [true, onChainCode, decodeReferralCode(onChainCode)];\n } else if (localStorageCodeOwner && !isAddressZero(localStorageCodeOwner)) {\n return [false, localStorageCode, decodeReferralCode(localStorageCode)];\n }\n return [false];\n }, [localStorageCode, localStorageCodeOwner, onChainCode]);\n\n return {\n userReferralCode,\n userReferralCodeString,\n attachedOnChain,\n };\n}\n\nexport function useReferrerTier(library, chainId, account) {\n const referralStorageAddress = getContract(chainId, \"ReferralStorage\");\n const { data: referrerTier, mutate: mutateReferrerTier } = useSWR(\n account && [`ReferralStorage:referrerTiers`, chainId, referralStorageAddress, \"referrerTiers\", account],\n {\n fetcher: contractFetcher(library, ReferralStorage),\n }\n );\n return {\n referrerTier,\n mutateReferrerTier,\n };\n}\n\nexport function useCodeOwner(library, chainId, account, code) {\n const referralStorageAddress = getContract(chainId, \"ReferralStorage\");\n const { data: codeOwner, mutate: mutateCodeOwner } = useSWR(\n account && code && [`ReferralStorage:codeOwners`, chainId, referralStorageAddress, \"codeOwners\", code],\n {\n fetcher: contractFetcher(library, ReferralStorage),\n }\n );\n return {\n codeOwner,\n mutateCodeOwner,\n };\n}\n\nexport async function validateReferralCodeExists(referralCode, chainId) {\n const referralCodeBytes32 = encodeReferralCode(referralCode);\n const referralCodeOwner = await getReferralCodeOwner(chainId, referralCodeBytes32);\n return !isAddressZero(referralCodeOwner);\n}\n\nexport function useAffiliateCodes(chainId, account) {\n const [affiliateCodes, setAffiliateCodes] = useState({ code: null, success: false });\n const query = gql`\n query userReferralCodes($account: String!) {\n referrerTotalStats: referrerStats(\n first: 1000\n orderBy: volume\n orderDirection: desc\n where: { period: total, referrer: $account }\n ) {\n referralCode\n }\n }\n `;\n useEffect(() => {\n if (!chainId) return;\n getGraphClient(chainId)\n .query({ query, variables: { account: account?.toLowerCase() } })\n .then((res) => {\n const parsedAffiliateCodes = res?.data?.referrerTotalStats.map((c) => decodeReferralCode(c?.referralCode));\n setAffiliateCodes({ code: parsedAffiliateCodes[0], success: true });\n });\n return () => {\n setAffiliateCodes({ code: null, success: false });\n };\n }, [chainId, query, account]);\n return affiliateCodes;\n}\n","export function get1InchSwapUrl(chainId, from, to) {\n const rootUrl = `https://app.1inch.io/#/${chainId}/unified/swap`;\n if (!from && !to) return rootUrl;\n return `${rootUrl}/${from}/${to}`;\n}\n","import { ethers } from \"ethers\";\nimport Modal from \"../Modal/Modal\";\nimport { get1InchSwapUrl } from \"domain/common\";\nimport { Token, TokenInfo } from \"domain/tokens\";\nimport { getNativeToken } from \"config/tokens\";\nimport { t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst { AddressZero } = ethers.constants;\n\ntype Props = {\n chainId: number;\n modalError: string;\n isShort: boolean;\n isLong: boolean;\n fromToken: Token;\n toToken: Token;\n shortCollateralToken: TokenInfo;\n setModalError: () => void;\n};\n\nexport default function NoLiquidityErrorModal({\n chainId,\n fromToken,\n toToken,\n shortCollateralToken,\n isLong,\n isShort,\n modalError,\n setModalError,\n}: Props) {\n const nativeToken = getNativeToken(chainId);\n const inputCurrency = fromToken.address === AddressZero ? nativeToken.symbol : fromToken.address;\n let outputCurrency;\n if (isLong) {\n outputCurrency = toToken.address === AddressZero ? nativeToken.symbol : toToken.address;\n } else {\n outputCurrency = shortCollateralToken.address;\n }\n const swapTokenSymbol = isLong ? toToken.symbol : shortCollateralToken.symbol;\n const oneInchSwapUrl = get1InchSwapUrl(chainId, inputCurrency, outputCurrency);\n const label = modalError === \"BUFFER\"\n ? t`${shortCollateralToken.symbol} Required`\n : t`${fromToken.symbol} Pool Capacity Reached`;\n\n return (\n \n
\n \n You need to select {swapTokenSymbol} as the \"Pay\" token to use it for collateral to initiate this trade.\n \n
\n
\n
\n \n As there is not enough liquidity in FLP to swap {fromToken.symbol} to {swapTokenSymbol}, you can use the\n option below to do so:\n \n
\n
\n\n \n Buy {swapTokenSymbol} on 1inch\n \n\n {isShort && (\n
\n Alternatively, you can select a different \"Collateral In\" token.\n
\n
\n )}\n \n );\n}\n","import { useEffect, useRef } from \"react\";\n\nexport function usePrevious(value) {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport Tooltip from \"../Tooltip/Tooltip\";\nimport { select, t, Trans } from \"@lingui/macro\";\nimport Slider, { SliderTooltip } from \"rc-slider\";\nimport \"rc-slider/assets/index.css\";\nimport \"./SwapBox.css\";\n\nimport cx from \"classnames\";\nimport useSWR from \"swr\";\nimport { ethers } from \"ethers\";\n\nimport { IoMdSwap } from \"react-icons/io\";\nimport { BsArrowRight } from \"react-icons/bs\";\n\nimport {\n adjustForDecimals,\n BASIS_POINTS_DIVISOR,\n calculatePositionDelta,\n DEFAULT_HIGHER_SLIPPAGE_AMOUNT,\n DUST_BNB,\n getExchangeRate,\n getExchangeRateDisplay,\n getLeverage,\n getLiquidationPrice,\n getNextFromAmount,\n getNextToAmount,\n getPositionKey,\n isTriggerRatioInverted,\n LEVERAGE_ORDER_OPTIONS,\n LIMIT,\n LONG,\n MARGIN_FEE_BASIS_POINTS,\n MARKET,\n PRECISION,\n SHORT,\n STOP,\n SWAP,\n SWAP_OPTIONS,\n SWAP_ORDER_OPTIONS,\n USD_DECIMALS,\n USDF_ADDRESS,\n USDF_DECIMALS,\n} from \"lib/legacy\";\nimport {\n ARBITRUM,\n // AVALANCHE,\n getChainName,\n getConstant,\n IS_NETWORK_DISABLED,\n isSupportedChain\n} from \"config/chains\";\nimport * as Api from \"domain/legacy\";\nimport { getContract } from \"config/contracts\";\n\nimport Checkbox from \"../Checkbox/Checkbox\";\nimport Tab from \"../Tab/Tab\";\nimport TokenSelector from \"./TokenSelector\";\nimport ExchangeInfoRow from \"./ExchangeInfoRow\";\nimport ConfirmationBox from \"./ConfirmationBox\";\nimport OrdersToa from \"./OrdersToa\";\n\nimport PositionRouter from \"abis/PositionRouter.json\";\nimport Router from \"abis/Router.json\";\nimport Token from \"abis/Token.json\";\nimport WETH from \"abis/WETH.json\";\n\nimport longImg from \"img/long.svg\";\nimport shortImg from \"img/short.svg\";\nimport swapImg from \"img/swap.svg\";\n\nimport { useUserReferralCode } from \"domain/referrals\";\nimport NoLiquidityErrorModal from \"./NoLiquidityErrorModal\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { callContract, contractFetcher } from \"lib/contracts\";\nimport {\n approveTokens,\n getMostAbundantStableToken,\n replaceNativeTokenAddress,\n shouldRaiseGasError,\n} from \"domain/tokens\";\nimport { useLocalStorageByChainId, useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { helperToast } from \"lib/helperToast\";\nimport { getTokenInfo, getUsd } from \"domain/tokens/utils\";\nimport { usePrevious } from \"lib/usePrevious\";\nimport { bigNumberify, expandDecimals, formatAmount, formatAmountFree, formatPrice, parseValue } from \"lib/numbers\";\nimport { getToken, getTokenBySymbol, getTokens, getWhitelistedTokens } from \"config/tokens\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst SWAP_ICONS = {\n [LONG]: longImg,\n [SHORT]: shortImg,\n [SWAP]: swapImg,\n};\n\nconst { AddressZero } = ethers.constants;\n\nconst leverageSliderHandle = (props) => {\n const { value, dragging, index, ...restProps } = props;\n return (\n \n \n \n );\n};\n\nfunction getNextAveragePrice({ size, sizeDelta, hasProfit, delta, nextPrice, isLong }) {\n if (!size || !sizeDelta || !delta || !nextPrice) {\n return;\n }\n const nextSize = size.add(sizeDelta);\n let divisor;\n if (isLong) {\n divisor = hasProfit ? nextSize.add(delta) : nextSize.sub(delta);\n } else {\n divisor = hasProfit ? nextSize.sub(delta) : nextSize.add(delta);\n }\n if (!divisor || divisor.eq(0)) {\n return;\n }\n const nextAveragePrice = nextPrice.mul(nextSize).div(divisor);\n return nextAveragePrice;\n}\n\nexport default function SwapBox(props) {\n const {\n pendingPositions,\n setPendingPositions,\n infoTokens,\n active,\n library,\n account,\n fromTokenAddress,\n setFromTokenAddress,\n toTokenAddress,\n setToTokenAddress,\n swapOption,\n setSwapOption,\n positionsMap,\n pendingTxns,\n setPendingTxns,\n tokenSelection,\n setTokenSelection,\n setIsConfirming,\n isConfirming,\n isPendingConfirmation,\n setIsPendingConfirmation,\n flagOrdersEnabled,\n chainId,\n nativeTokenAddress,\n savedSlippageAmount,\n totalTokenWeights,\n usdfSupply,\n orders,\n savedIsPnlInLeverage,\n orderBookApproved,\n positionRouterApproved,\n isWaitingForPluginApproval,\n approveOrderBook,\n approvePositionRouter,\n setIsWaitingForPluginApproval,\n isWaitingForPositionRouterApproval,\n setIsWaitingForPositionRouterApproval,\n isPluginApproving,\n isPositionRouterApproving,\n savedShouldDisableValidationForTesting,\n minExecutionFee,\n minExecutionFeeUSD,\n minExecutionFeeErrorMessage,\n } = props;\n\n const [fromValue, setFromValue] = useState(\"\");\n const [toValue, setToValue] = useState(\"\");\n const [anchorOnFromAmount, setAnchorOnFromAmount] = useState(true);\n const [isApproving, setIsApproving] = useState(false);\n const [isWaitingForApproval, setIsWaitingForApproval] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [modalError, setModalError] = useState(false);\n const [isHigherSlippageAllowed, setIsHigherSlippageAllowed] = useState(false);\n const { attachedOnChain, userReferralCode } = useUserReferralCode(library, chainId, account);\n\n let allowedSlippage = savedSlippageAmount;\n if (isHigherSlippageAllowed) {\n allowedSlippage = DEFAULT_HIGHER_SLIPPAGE_AMOUNT;\n }\n\n const defaultCollateralSymbol = getConstant(chainId, \"defaultCollateralSymbol\");\n // TODO hack with useLocalStorageSerializeKey\n const [shortCollateralAddress, setShortCollateralAddress] = useLocalStorageByChainId(\n chainId,\n \"Short-Collateral-Address\",\n getTokenBySymbol(chainId, defaultCollateralSymbol).address\n );\n const isLong = swapOption === LONG;\n const isShort = swapOption === SHORT;\n const isSwap = swapOption === SWAP;\n\n // const getLeaderboardLink = () => {\n // if (chainId === ARBITRUM) {\n // return \"https://www.fxdx.house/arbitrum/leaderboard\";\n // }\n // if (chainId === AVALANCHE) {\n // return \"https://www.fxdx.house/avalanche/leaderboard\";\n // }\n // return \"https://www.fxdx.house\";\n // };\n\n function getTokenLabel() {\n switch (true) {\n case isLong:\n return t`Long`;\n case isShort:\n return t`Short`;\n case isSwap:\n return t`Receive`;\n default:\n return \"\";\n }\n }\n const [leverageOption, setLeverageOption] = useLocalStorageSerializeKey(\n [chainId, \"Exchange-swap-leverage-option\"],\n \"2\"\n );\n const [isLeverageSliderEnabled, setIsLeverageSliderEnabled] = useLocalStorageSerializeKey(\n [chainId, \"Exchange-swap-leverage-slider-enabled\"],\n true\n );\n\n const hasLeverageOption = isLeverageSliderEnabled && !isNaN(parseFloat(leverageOption));\n\n const [ordersToaOpen, setOrdersToaOpen] = useState(false);\n\n let [orderOption, setOrderOption] = useLocalStorageSerializeKey([chainId, \"Order-option\"], MARKET);\n if (!flagOrdersEnabled) {\n orderOption = MARKET;\n }\n\n const onOrderOptionChange = (option) => {\n setOrderOption(option);\n };\n\n const isMarketOrder = orderOption === MARKET;\n const orderOptions = isSwap ? SWAP_ORDER_OPTIONS : LEVERAGE_ORDER_OPTIONS;\n const orderOptionLabels = { [STOP]: t`Trigger`, [MARKET]: t`Market`, [LIMIT]: t`Limit` };\n\n const [triggerPriceValue, setTriggerPriceValue] = useState(\"\");\n const triggerPriceUsd = isMarketOrder ? 0 : parseValue(triggerPriceValue, USD_DECIMALS);\n\n const onTriggerPriceChange = (evt) => {\n setTriggerPriceValue(evt.target.value || \"\");\n };\n\n const onTriggerRatioChange = (evt) => {\n setTriggerRatioValue(evt.target.value || \"\");\n };\n\n let positionKey;\n if (isLong) {\n positionKey = getPositionKey(account, toTokenAddress, toTokenAddress, true, nativeTokenAddress);\n }\n if (isShort) {\n positionKey = getPositionKey(account, shortCollateralAddress, toTokenAddress, false, nativeTokenAddress);\n }\n\n const existingPosition = positionKey ? positionsMap[positionKey] : undefined;\n const hasExistingPosition = existingPosition && existingPosition.size && existingPosition.size.gt(0);\n\n const whitelistedTokens = getWhitelistedTokens(chainId);\n const tokens = getTokens(chainId);\n const fromTokens = tokens;\n const stableTokens = tokens.filter((token) => token.isStable);\n const indexTokens = whitelistedTokens.filter((token) => !token.isStable && !token.isWrapped);\n const shortableTokens = indexTokens.filter((token) => token.isShortable);\n\n let toTokens = tokens;\n if (isLong) {\n toTokens = indexTokens;\n }\n if (isShort) {\n toTokens = shortableTokens;\n }\n\n const needOrderBookApproval = !isMarketOrder && !orderBookApproved;\n const prevNeedOrderBookApproval = usePrevious(needOrderBookApproval);\n\n const needPositionRouterApproval = (isLong || isShort) && isMarketOrder && !positionRouterApproved;\n const prevNeedPositionRouterApproval = usePrevious(needPositionRouterApproval);\n\n useEffect(() => {\n if (!needOrderBookApproval && prevNeedOrderBookApproval && isWaitingForPluginApproval) {\n setIsWaitingForPluginApproval(false);\n helperToast.success(
Orders enabled!
);\n }\n }, [needOrderBookApproval, prevNeedOrderBookApproval, setIsWaitingForPluginApproval, isWaitingForPluginApproval]);\n\n useEffect(() => {\n if (!needPositionRouterApproval && prevNeedPositionRouterApproval && isWaitingForPositionRouterApproval) {\n setIsWaitingForPositionRouterApproval(false);\n helperToast.success(
Leverage enabled!
);\n }\n }, [\n needPositionRouterApproval,\n prevNeedPositionRouterApproval,\n setIsWaitingForPositionRouterApproval,\n isWaitingForPositionRouterApproval,\n ]);\n\n useEffect(() => {\n if (!needOrderBookApproval && prevNeedOrderBookApproval && isWaitingForPluginApproval) {\n setIsWaitingForPluginApproval(false);\n helperToast.success(
Orders enabled!
);\n }\n }, [needOrderBookApproval, prevNeedOrderBookApproval, setIsWaitingForPluginApproval, isWaitingForPluginApproval]);\n\n const routerAddress = getContract(chainId, \"Router\");\n const tokenAllowanceAddress = fromTokenAddress === AddressZero ? nativeTokenAddress : fromTokenAddress;\n const { data: tokenAllowance } = useSWR(\n active && [active, chainId, tokenAllowanceAddress, \"allowance\", account, routerAddress],\n {\n fetcher: contractFetcher(library, Token),\n }\n );\n\n const { data: hasOutdatedUi } = Api.useHasOutdatedUi();\n\n const fromToken = getToken(chainId, fromTokenAddress);\n const toToken = getToken(chainId, toTokenAddress);\n const shortCollateralToken = getTokenInfo(infoTokens, shortCollateralAddress);\n\n const fromTokenInfo = getTokenInfo(infoTokens, fromTokenAddress);\n const toTokenInfo = getTokenInfo(infoTokens, toTokenAddress);\n\n const renderAvailableLongLiquidity = () => {\n if (!isLong) {\n return null;\n }\n\n return (\n
\n
\n Available Liquidity\n
\n
\n {\n return (\n <>\n \n \n \n );\n }}\n >\n
\n
\n );\n };\n\n const fromBalance = fromTokenInfo ? fromTokenInfo.balance : bigNumberify(0);\n const toBalance = toTokenInfo ? toTokenInfo.balance : bigNumberify(0);\n\n const fromAmount = parseValue(fromValue, fromToken && fromToken.decimals);\n const toAmount = parseValue(toValue, toToken && toToken.decimals);\n\n const isPotentialWrap = (fromToken.isNative && toToken.isWrapped) || (fromToken.isWrapped && toToken.isNative);\n const isWrapOrUnwrap = isSwap && isPotentialWrap;\n const needApproval =\n fromTokenAddress !== AddressZero &&\n tokenAllowance &&\n fromAmount &&\n fromAmount.gt(tokenAllowance) &&\n !isWrapOrUnwrap;\n const prevFromTokenAddress = usePrevious(fromTokenAddress);\n const prevNeedApproval = usePrevious(needApproval);\n const prevToTokenAddress = usePrevious(toTokenAddress);\n\n const fromUsdMin = getUsd(fromAmount, fromTokenAddress, false, infoTokens);\n const toUsdMax = getUsd(toAmount, toTokenAddress, true, infoTokens, orderOption, triggerPriceUsd);\n\n const indexTokenAddress = toTokenAddress === AddressZero ? nativeTokenAddress : toTokenAddress;\n const collateralTokenAddress = isLong ? indexTokenAddress : shortCollateralAddress;\n const collateralToken = getToken(chainId, collateralTokenAddress);\n\n const [triggerRatioValue, setTriggerRatioValue] = useState(\"\");\n\n const triggerRatioInverted = useMemo(() => {\n return isTriggerRatioInverted(fromTokenInfo, toTokenInfo);\n }, [toTokenInfo, fromTokenInfo]);\n\n const maxToTokenOut = useMemo(() => {\n const value = toTokenInfo.availableAmount?.gt(toTokenInfo.poolAmount?.sub(toTokenInfo.bufferAmount))\n ? toTokenInfo.poolAmount?.sub(toTokenInfo.bufferAmount)\n : toTokenInfo.availableAmount;\n\n if (!value) {\n return bigNumberify(0);\n }\n\n return value.gt(0) ? value : bigNumberify(0);\n }, [toTokenInfo]);\n\n const maxToTokenOutUSD = useMemo(() => {\n return getUsd(maxToTokenOut, toTokenAddress, false, infoTokens);\n }, [maxToTokenOut, toTokenAddress, infoTokens]);\n\n const maxFromTokenInUSD = useMemo(() => {\n const value = fromTokenInfo.maxUsdfAmount\n ?.sub(fromTokenInfo.usdfAmount)\n .mul(expandDecimals(1, USD_DECIMALS))\n .div(expandDecimals(1, USDF_DECIMALS));\n\n if (!value) {\n return bigNumberify(0);\n }\n\n return value.gt(0) ? value : bigNumberify(0);\n }, [fromTokenInfo]);\n\n const maxFromTokenIn = useMemo(() => {\n if (!fromTokenInfo.maxPrice) {\n return bigNumberify(0);\n }\n return maxFromTokenInUSD?.mul(expandDecimals(1, fromTokenInfo.decimals)).div(fromTokenInfo.maxPrice).toString();\n }, [maxFromTokenInUSD, fromTokenInfo]);\n\n let maxSwapAmountUsd = bigNumberify(0);\n\n if (maxToTokenOutUSD && maxFromTokenInUSD) {\n maxSwapAmountUsd = maxToTokenOutUSD.lt(maxFromTokenInUSD) ? maxToTokenOutUSD : maxFromTokenInUSD;\n }\n\n const triggerRatio = useMemo(() => {\n if (!triggerRatioValue) {\n return bigNumberify(0);\n }\n let ratio = parseValue(triggerRatioValue, USD_DECIMALS);\n if (ratio.eq(0)) {\n return bigNumberify(0);\n }\n if (triggerRatioInverted) {\n ratio = PRECISION.mul(PRECISION).div(ratio);\n }\n return ratio;\n }, [triggerRatioValue, triggerRatioInverted]);\n\n useEffect(() => {\n if (\n fromToken &&\n fromTokenAddress === prevFromTokenAddress &&\n !needApproval &&\n prevNeedApproval &&\n isWaitingForApproval\n ) {\n setIsWaitingForApproval(false);\n helperToast.success(
{fromToken.symbol} approved!
);\n }\n }, [\n fromTokenAddress,\n prevFromTokenAddress,\n needApproval,\n prevNeedApproval,\n setIsWaitingForApproval,\n fromToken.symbol,\n isWaitingForApproval,\n fromToken,\n ]);\n\n useEffect(() => {\n if (!toTokens.find((token) => token.address === toTokenAddress)) {\n setToTokenAddress(swapOption, toTokens[0].address);\n }\n }, [swapOption, toTokens, toTokenAddress, setToTokenAddress]);\n\n useEffect(() => {\n if (swapOption !== SHORT) {\n return;\n }\n if (toTokenAddress === prevToTokenAddress) {\n return;\n }\n for (let i = 0; i < stableTokens.length; i++) {\n const stableToken = stableTokens[i];\n const key = getPositionKey(account, stableToken.address, toTokenAddress, false, nativeTokenAddress);\n const position = positionsMap[key];\n if (position && position.size && position.size.gt(0)) {\n setShortCollateralAddress(position.collateralToken.address);\n return;\n }\n }\n }, [\n account,\n toTokenAddress,\n prevToTokenAddress,\n swapOption,\n positionsMap,\n stableTokens,\n nativeTokenAddress,\n shortCollateralAddress,\n setShortCollateralAddress,\n ]);\n\n useEffect(() => {\n const updateSwapAmounts = () => {\n if (anchorOnFromAmount) {\n if (!fromAmount) {\n setToValue(\"\");\n return;\n }\n if (toToken) {\n const { amount: nextToAmount } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n undefined,\n !isMarketOrder && triggerRatio,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n\n const nextToValue = formatAmountFree(nextToAmount, toToken.decimals, toToken.decimals);\n setToValue(nextToValue);\n }\n return;\n }\n\n if (!toAmount) {\n setFromValue(\"\");\n return;\n }\n if (fromToken) {\n const { amount: nextFromAmount } = getNextFromAmount(\n chainId,\n toAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n undefined,\n !isMarketOrder && triggerRatio,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n const nextFromValue = formatAmountFree(nextFromAmount, fromToken.decimals, fromToken.decimals);\n setFromValue(nextFromValue);\n }\n };\n\n const updateLeverageAmounts = () => {\n if (!hasLeverageOption) {\n return;\n }\n if (anchorOnFromAmount) {\n if (!fromAmount) {\n setToValue(\"\");\n return;\n }\n\n const toTokenInfo = getTokenInfo(infoTokens, toTokenAddress);\n if (toTokenInfo && toTokenInfo.maxPrice && fromUsdMin && fromUsdMin.gt(0)) {\n const leverageMultiplier = parseInt(leverageOption * BASIS_POINTS_DIVISOR);\n const toTokenPriceUsd =\n !isMarketOrder && triggerPriceUsd && triggerPriceUsd.gt(0) ? triggerPriceUsd : toTokenInfo.maxPrice;\n\n const { feeBasisPoints } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n collateralTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n\n let fromUsdMinAfterFee = fromUsdMin;\n if (feeBasisPoints) {\n fromUsdMinAfterFee = fromUsdMin.mul(BASIS_POINTS_DIVISOR - feeBasisPoints).div(BASIS_POINTS_DIVISOR);\n }\n\n const toNumerator = fromUsdMinAfterFee.mul(leverageMultiplier).mul(BASIS_POINTS_DIVISOR);\n const toDenominator = bigNumberify(MARGIN_FEE_BASIS_POINTS)\n .mul(leverageMultiplier)\n .add(bigNumberify(BASIS_POINTS_DIVISOR).mul(BASIS_POINTS_DIVISOR));\n\n const nextToUsd = toNumerator.div(toDenominator);\n\n const nextToAmount = nextToUsd.mul(expandDecimals(1, toToken.decimals)).div(toTokenPriceUsd);\n\n const nextToValue = formatAmountFree(nextToAmount, toToken.decimals, toToken.decimals);\n\n setToValue(nextToValue);\n }\n return;\n }\n\n if (!toAmount) {\n setFromValue(\"\");\n return;\n }\n\n const fromTokenInfo = getTokenInfo(infoTokens, fromTokenAddress);\n if (fromTokenInfo && fromTokenInfo.minPrice && toUsdMax && toUsdMax.gt(0)) {\n const leverageMultiplier = parseInt(leverageOption * BASIS_POINTS_DIVISOR);\n\n const baseFromAmountUsd = toUsdMax.mul(BASIS_POINTS_DIVISOR).div(leverageMultiplier);\n\n let fees = toUsdMax.mul(MARGIN_FEE_BASIS_POINTS).div(BASIS_POINTS_DIVISOR);\n\n const { feeBasisPoints } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n collateralTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n\n if (feeBasisPoints) {\n const swapFees = baseFromAmountUsd.mul(feeBasisPoints).div(BASIS_POINTS_DIVISOR);\n fees = fees.add(swapFees);\n }\n\n const nextFromUsd = baseFromAmountUsd.add(fees);\n\n const nextFromAmount = nextFromUsd.mul(expandDecimals(1, fromToken.decimals)).div(fromTokenInfo.minPrice);\n\n const nextFromValue = formatAmountFree(nextFromAmount, fromToken.decimals, fromToken.decimals);\n\n setFromValue(nextFromValue);\n }\n };\n\n if (isSwap) {\n updateSwapAmounts();\n }\n\n if (isLong || isShort) {\n updateLeverageAmounts();\n }\n }, [\n anchorOnFromAmount,\n fromAmount,\n toAmount,\n fromToken,\n toToken,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n isSwap,\n isLong,\n isShort,\n leverageOption,\n fromUsdMin,\n toUsdMax,\n isMarketOrder,\n triggerPriceUsd,\n triggerRatio,\n hasLeverageOption,\n usdfSupply,\n totalTokenWeights,\n chainId,\n collateralTokenAddress,\n indexTokenAddress,\n ]);\n\n let entryMarkPrice;\n let exitMarkPrice;\n if (toTokenInfo) {\n entryMarkPrice = swapOption === LONG ? toTokenInfo.maxPrice : toTokenInfo.minPrice;\n exitMarkPrice = swapOption === LONG ? toTokenInfo.minPrice : toTokenInfo.maxPrice;\n }\n\n let leverage = bigNumberify(0);\n if (fromUsdMin && toUsdMax && fromUsdMin.gt(0)) {\n const fees = toUsdMax.mul(MARGIN_FEE_BASIS_POINTS).div(BASIS_POINTS_DIVISOR);\n if (fromUsdMin.sub(fees).gt(0)) {\n leverage = toUsdMax.mul(BASIS_POINTS_DIVISOR).div(fromUsdMin.sub(fees));\n }\n }\n\n let nextAveragePrice = isMarketOrder ? entryMarkPrice : triggerPriceUsd;\n if (hasExistingPosition) {\n let nextDelta, nextHasProfit;\n\n if (isMarketOrder) {\n nextDelta = existingPosition.delta;\n nextHasProfit = existingPosition.hasProfit;\n } else {\n const data = calculatePositionDelta(triggerPriceUsd || bigNumberify(0), existingPosition);\n nextDelta = data.delta;\n nextHasProfit = data.hasProfit;\n }\n\n nextAveragePrice = getNextAveragePrice({\n size: existingPosition.size,\n sizeDelta: toUsdMax,\n hasProfit: nextHasProfit,\n delta: nextDelta,\n nextPrice: isMarketOrder ? entryMarkPrice : triggerPriceUsd,\n isLong,\n });\n }\n\n const liquidationPrice = getLiquidationPrice({\n isLong,\n size: hasExistingPosition ? existingPosition.size : bigNumberify(0),\n collateral: hasExistingPosition ? existingPosition.collateral : bigNumberify(0),\n averagePrice: nextAveragePrice,\n entryFundingRate: hasExistingPosition ? existingPosition.entryFundingRate : bigNumberify(0),\n cumulativeFundingRate: hasExistingPosition ? existingPosition.cumulativeFundingRate : bigNumberify(0),\n sizeDelta: toUsdMax,\n collateralDelta: fromUsdMin,\n increaseCollateral: true,\n increaseSize: true,\n });\n\n const existingLiquidationPrice = existingPosition ? getLiquidationPrice(existingPosition) : undefined;\n let displayLiquidationPrice = liquidationPrice ? liquidationPrice : existingLiquidationPrice;\n\n if (hasExistingPosition) {\n const collateralDelta = fromUsdMin ? fromUsdMin : bigNumberify(0);\n const sizeDelta = toUsdMax ? toUsdMax : bigNumberify(0);\n leverage = getLeverage({\n size: existingPosition.size,\n sizeDelta,\n collateral: existingPosition.collateral,\n collateralDelta,\n increaseCollateral: true,\n entryFundingRate: existingPosition.entryFundingRate,\n cumulativeFundingRate: existingPosition.cumulativeFundingRate,\n increaseSize: true,\n hasProfit: existingPosition.hasProfit,\n delta: existingPosition.delta,\n includeDelta: savedIsPnlInLeverage,\n });\n } else if (hasLeverageOption) {\n leverage = bigNumberify(parseInt(leverageOption * BASIS_POINTS_DIVISOR));\n }\n\n const getSwapError = () => {\n if (IS_NETWORK_DISABLED[chainId]) {\n return [t`Swaps disabled, pending ${getChainName(chainId)} upgrade`];\n }\n\n if (fromTokenAddress === toTokenAddress) {\n return [t`Select different tokens`];\n }\n\n if (!isMarketOrder) {\n if ((toToken.isStable || toToken.isUsdf) && (fromToken.isStable || fromToken.isUsdf)) {\n return [t`Select different tokens`];\n }\n\n if (fromToken.isNative && toToken.isWrapped) {\n return [t`Select different tokens`];\n }\n\n if (toToken.isNative && fromToken.isWrapped) {\n return [t`Select different tokens`];\n }\n }\n\n if (!fromAmount || fromAmount.eq(0)) {\n return [t`Enter an amount`];\n }\n if (!toAmount || toAmount.eq(0)) {\n return [t`Enter an amount`];\n }\n\n const fromTokenInfo = getTokenInfo(infoTokens, fromTokenAddress);\n if (!fromTokenInfo || !fromTokenInfo.minPrice) {\n return [t`Incorrect network`];\n }\n if (\n !savedShouldDisableValidationForTesting &&\n fromTokenInfo &&\n fromTokenInfo.balance &&\n fromAmount &&\n fromAmount.gt(fromTokenInfo.balance)\n ) {\n return [t`Insufficient ${fromTokenInfo.symbol} balance`];\n }\n\n const toTokenInfo = getTokenInfo(infoTokens, toTokenAddress);\n\n if (!isMarketOrder) {\n if (!triggerRatioValue || triggerRatio.eq(0)) {\n return [t`Enter a price`];\n }\n\n const currentRate = getExchangeRate(fromTokenInfo, toTokenInfo);\n if (currentRate && currentRate.lt(triggerRatio)) {\n return triggerRatioInverted ? [t`Price below Mark Price`] : [t`Price above Mark Price`];\n }\n }\n\n if (\n !isWrapOrUnwrap &&\n toToken &&\n toTokenAddress !== USDF_ADDRESS &&\n toTokenInfo &&\n toTokenInfo.availableAmount &&\n toAmount.gt(toTokenInfo.availableAmount)\n ) {\n return [t`Insufficient liquidity`];\n }\n if (\n !isWrapOrUnwrap &&\n toAmount &&\n toTokenInfo.bufferAmount &&\n toTokenInfo.poolAmount &&\n toTokenInfo.bufferAmount.gt(toTokenInfo.poolAmount.sub(toAmount))\n ) {\n return [t`Insufficient liquidity`];\n }\n\n if (\n fromUsdMin &&\n fromTokenInfo.maxUsdfAmount &&\n fromTokenInfo.maxUsdfAmount.gt(0) &&\n fromTokenInfo.usdfAmount &&\n fromTokenInfo.maxPrice\n ) {\n const usdfFromAmount = adjustForDecimals(fromUsdMin, USD_DECIMALS, USDF_DECIMALS);\n const nextUsdfAmount = fromTokenInfo.usdfAmount.add(usdfFromAmount);\n\n if (nextUsdfAmount.gt(fromTokenInfo.maxUsdfAmount)) {\n return [t`${fromTokenInfo.symbol} pool exceeded`];\n }\n }\n\n return [false];\n };\n\n const getLeverageError = () => {\n if (IS_NETWORK_DISABLED[chainId]) {\n return [t`Leverage disabled, pending ${getChainName(chainId)} upgrade`];\n }\n if (hasOutdatedUi) {\n return [t`Page outdated, please refresh`];\n }\n\n if (!toAmount || toAmount.eq(0)) {\n return [t`Enter an amount`];\n }\n\n let toTokenInfo = getTokenInfo(infoTokens, toTokenAddress);\n if (toTokenInfo && toTokenInfo.isStable) {\n return [t`${select(swapOption, { [LONG]: \"Longing\", [SHORT]: \"Shorting\" })} ${toTokenInfo.symbol} not supported`];\n }\n\n const fromTokenInfo = getTokenInfo(infoTokens, fromTokenAddress);\n if (\n !savedShouldDisableValidationForTesting &&\n fromTokenInfo &&\n fromTokenInfo.balance &&\n fromAmount &&\n fromAmount.gt(fromTokenInfo.balance)\n ) {\n return [t`Insufficient ${fromTokenInfo.symbol} balance`];\n }\n\n if (leverage && leverage.eq(0)) {\n return [t`Enter an amount`];\n }\n if (!isMarketOrder && (!triggerPriceValue || triggerPriceUsd.eq(0))) {\n return [t`Enter a price`];\n }\n\n if (!hasExistingPosition && fromUsdMin && fromUsdMin.lt(expandDecimals(10, USD_DECIMALS))) {\n return [t`Min order: 10 USD`];\n }\n\n if (leverage && leverage.lt(1.1 * BASIS_POINTS_DIVISOR)) {\n return [t`Min leverage: 1.1x`];\n }\n\n if (leverage && leverage.gt(30.5 * BASIS_POINTS_DIVISOR)) {\n return [t`Max leverage: 30.5x`];\n }\n\n if (!isMarketOrder && entryMarkPrice && triggerPriceUsd && !savedShouldDisableValidationForTesting) {\n if (isLong && entryMarkPrice.lt(triggerPriceUsd)) {\n return [t`Price above Mark Price`];\n }\n if (!isLong && entryMarkPrice.gt(triggerPriceUsd)) {\n return [t`Price below Mark Price`];\n }\n }\n\n if (isLong) {\n let requiredAmount = toAmount;\n if (fromTokenAddress !== toTokenAddress) {\n const { amount: swapAmount } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n requiredAmount = requiredAmount.add(swapAmount);\n\n if (toToken && toTokenAddress !== USDF_ADDRESS) {\n if (!toTokenInfo.availableAmount) {\n return [t`Liquidity data not loaded`];\n }\n if (toTokenInfo.availableAmount && requiredAmount.gt(toTokenInfo.availableAmount)) {\n return [t`Insufficient liquidity`];\n }\n }\n\n if (\n toTokenInfo.poolAmount &&\n toTokenInfo.bufferAmount &&\n toTokenInfo.bufferAmount.gt(toTokenInfo.poolAmount.sub(swapAmount))\n ) {\n return [t`Insufficient liquidity`, true, \"BUFFER\"];\n }\n\n if (\n fromUsdMin &&\n fromTokenInfo.maxUsdfAmount &&\n fromTokenInfo.maxUsdfAmount.gt(0) &&\n fromTokenInfo.minPrice &&\n fromTokenInfo.usdfAmount\n ) {\n const usdfFromAmount = adjustForDecimals(fromUsdMin, USD_DECIMALS, USDF_DECIMALS);\n const nextUsdfAmount = fromTokenInfo.usdfAmount.add(usdfFromAmount);\n if (nextUsdfAmount.gt(fromTokenInfo.maxUsdfAmount)) {\n return [t`${fromTokenInfo.symbol} pool exceeded, try different token`, true, \"MAX_USDF\"];\n }\n }\n }\n\n if (toTokenInfo && toTokenInfo.maxPrice) {\n const sizeUsd = toAmount.mul(toTokenInfo.maxPrice).div(expandDecimals(1, toTokenInfo.decimals));\n if (\n toTokenInfo.maxGlobalLongSize &&\n toTokenInfo.maxGlobalLongSize.gt(0) &&\n toTokenInfo.maxAvailableLong &&\n sizeUsd.gt(toTokenInfo.maxAvailableLong)\n ) {\n return [t`Max ${toTokenInfo.symbol} long exceeded`];\n }\n }\n }\n\n if (isShort) {\n let stableTokenAmount = bigNumberify(0);\n if (fromTokenAddress !== shortCollateralAddress && fromAmount && fromAmount.gt(0)) {\n const { amount: nextToAmount } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n shortCollateralAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n stableTokenAmount = nextToAmount;\n if (stableTokenAmount.gt(shortCollateralToken.availableAmount)) {\n return [t`Insufficient liquidity, change \"Collateral In\"`];\n }\n\n if (\n shortCollateralToken.bufferAmount &&\n shortCollateralToken.poolAmount &&\n shortCollateralToken.bufferAmount.gt(shortCollateralToken.poolAmount.sub(stableTokenAmount))\n ) {\n // suggest swapping to collateralToken\n return [t`Insufficient liquidity, change \"Collateral In\"`, true, \"BUFFER\"];\n }\n\n if (\n fromTokenInfo.maxUsdfAmount &&\n fromTokenInfo.maxUsdfAmount.gt(0) &&\n fromTokenInfo.minPrice &&\n fromTokenInfo.usdfAmount\n ) {\n const usdfFromAmount = adjustForDecimals(fromUsdMin, USD_DECIMALS, USDF_DECIMALS);\n const nextUsdfAmount = fromTokenInfo.usdfAmount.add(usdfFromAmount);\n if (nextUsdfAmount.gt(fromTokenInfo.maxUsdfAmount)) {\n return [t`${fromTokenInfo.symbol} pool exceeded, try different token`, true, \"MAX_USDF\"];\n }\n }\n }\n if (\n !shortCollateralToken ||\n !fromTokenInfo ||\n !toTokenInfo ||\n !toTokenInfo.maxPrice ||\n !shortCollateralToken.availableAmount\n ) {\n return [t`Fetching token info...`];\n }\n\n const sizeUsd = toAmount.mul(toTokenInfo.maxPrice).div(expandDecimals(1, toTokenInfo.decimals));\n const sizeTokens = sizeUsd\n .mul(expandDecimals(1, shortCollateralToken.decimals))\n .div(shortCollateralToken.minPrice);\n\n if (!toTokenInfo.maxAvailableShort) {\n return [t`Liquidity data not loaded`];\n }\n\n if (\n toTokenInfo.maxGlobalShortSize &&\n toTokenInfo.maxGlobalShortSize.gt(0) &&\n toTokenInfo.maxAvailableShort &&\n sizeUsd.gt(toTokenInfo.maxAvailableShort)\n ) {\n return [t`Max ${toTokenInfo.symbol} short exceeded`];\n }\n\n stableTokenAmount = stableTokenAmount.add(sizeTokens);\n if (stableTokenAmount.gt(shortCollateralToken.availableAmount)) {\n return [t`Insufficient liquidity, change \"Collateral In\"`];\n }\n }\n\n return [false];\n };\n\n const getToLabel = () => {\n if (isSwap) {\n return t`Receive`;\n }\n if (isLong) {\n return t`Long`;\n }\n return t`Short`;\n };\n\n const getError = () => {\n if (isSwap) {\n return getSwapError();\n }\n return getLeverageError();\n };\n\n const renderOrdersToa = () => {\n if (!ordersToaOpen) {\n return null;\n }\n\n return (\n \n );\n };\n\n const isPrimaryEnabled = () => {\n if (IS_NETWORK_DISABLED[chainId]) {\n return false;\n }\n if (isStopOrder) {\n return true;\n }\n if (!active) {\n return true;\n }\n const [error, modal] = getError();\n if (error && !modal) {\n return false;\n }\n if (needOrderBookApproval && isWaitingForPluginApproval) {\n return false;\n }\n if ((needApproval && isWaitingForApproval) || isApproving) {\n return false;\n }\n if (needPositionRouterApproval && isWaitingForPositionRouterApproval) {\n return false;\n }\n if (isPositionRouterApproving) {\n return false;\n }\n if (isApproving) {\n return false;\n }\n if (isSubmitting) {\n return false;\n }\n\n return true;\n };\n\n const getPrimaryText = () => {\n if (isStopOrder) {\n return t`Open a position`;\n }\n if (!active) {\n return t`Connect Wallet`;\n }\n if (!isSupportedChain(chainId)) {\n return t`Incorrect Network`;\n }\n const [error, modal] = getError();\n if (error && !modal) {\n return error;\n }\n\n if (needPositionRouterApproval && isWaitingForPositionRouterApproval) {\n return t`Enabling Leverage...`;\n }\n if (isPositionRouterApproving) {\n return t`Enabling Leverage...`;\n }\n if (needPositionRouterApproval) {\n return t`Enable Leverage`;\n }\n\n if (needApproval && isWaitingForApproval) {\n return t`Waiting for Approval`;\n }\n if (isApproving) {\n return t`Approving ${fromToken.symbol}...`;\n }\n if (needApproval) {\n return t`Approve ${fromToken.symbol}`;\n }\n\n if (needOrderBookApproval && isWaitingForPluginApproval) {\n return t`Enabling Orders...`;\n }\n if (isPluginApproving) {\n return t`Enabling Orders...`;\n }\n if (needOrderBookApproval) {\n return t`Enable Orders`;\n }\n\n if (!isMarketOrder) return t`Create ${orderOption.charAt(0) + orderOption.substring(1).toLowerCase()} Order`;\n\n if (isSwap) {\n if (toUsdMax && toUsdMax.lt(fromUsdMin.mul(95).div(100))) {\n return t`High Slippage, Swap Anyway`;\n }\n return t`Swap`;\n }\n\n if (isLong) {\n const indexTokenInfo = getTokenInfo(infoTokens, toTokenAddress);\n if (indexTokenInfo && indexTokenInfo.minPrice) {\n const { amount: nextToAmount } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n indexTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n const nextToAmountUsd = nextToAmount\n .mul(indexTokenInfo.minPrice)\n .div(expandDecimals(1, indexTokenInfo.decimals));\n if (fromTokenAddress === USDF_ADDRESS && nextToAmountUsd.lt(fromUsdMin.mul(98).div(100))) {\n return t`High USDF Slippage, Long Anyway`;\n }\n }\n return t`Long ${toToken.symbol}`;\n }\n\n return t`Short ${toToken.symbol}`;\n };\n\n const onSelectFromToken = (token) => {\n setFromTokenAddress(swapOption, token.address);\n setIsWaitingForApproval(false);\n\n if (isShort && token.isStable) {\n setShortCollateralAddress(token.address);\n }\n };\n\n const onSelectShortCollateralAddress = (token) => {\n setShortCollateralAddress(token.address);\n };\n\n const onSelectToToken = (token) => {\n setToTokenAddress(swapOption, token.address);\n };\n\n const onFromValueChange = (e) => {\n setAnchorOnFromAmount(true);\n setFromValue(e.target.value);\n };\n\n const onToValueChange = (e) => {\n setAnchorOnFromAmount(false);\n setToValue(e.target.value);\n };\n\n const switchTokens = () => {\n if (fromAmount && toAmount) {\n if (anchorOnFromAmount) {\n setToValue(formatAmountFree(fromAmount, fromToken.decimals, 8));\n } else {\n setFromValue(formatAmountFree(toAmount, toToken.decimals, 8));\n }\n setAnchorOnFromAmount(!anchorOnFromAmount);\n }\n setIsWaitingForApproval(false);\n\n const updatedTokenSelection = JSON.parse(JSON.stringify(tokenSelection));\n updatedTokenSelection[swapOption] = {\n from: toTokenAddress,\n to: fromTokenAddress,\n };\n setTokenSelection(updatedTokenSelection);\n };\n\n const wrap = async () => {\n setIsSubmitting(true);\n\n const contract = new ethers.Contract(nativeTokenAddress, WETH.abi, library.getSigner());\n callContract(chainId, contract, \"deposit\", {\n value: fromAmount,\n sentMsg: t`Swap submitted.`,\n successMsg: t`Swapped ${formatAmount(fromAmount, fromToken.decimals, 4, true)} ${\n fromToken.symbol\n } for ${formatAmount(toAmount, toToken.decimals, 4, true)} ${toToken.symbol}!`,\n failMsg: t`Swap failed.`,\n setPendingTxns,\n })\n .then(async (res) => {})\n .finally(() => {\n setIsSubmitting(false);\n });\n };\n\n const unwrap = async () => {\n setIsSubmitting(true);\n\n const contract = new ethers.Contract(nativeTokenAddress, WETH.abi, library.getSigner());\n callContract(chainId, contract, \"withdraw\", [fromAmount], {\n sentMsg: t`Swap submitted!`,\n failMsg: t`Swap failed.`,\n successMsg: t`Swapped ${formatAmount(fromAmount, fromToken.decimals, 4, true)} ${\n fromToken.symbol\n } for ${formatAmount(toAmount, toToken.decimals, 4, true)} ${toToken.symbol}!`,\n setPendingTxns,\n })\n .then(async (res) => {})\n .finally(() => {\n setIsSubmitting(false);\n });\n };\n\n const swap = async () => {\n if (fromToken.isNative && toToken.isWrapped) {\n wrap();\n return;\n }\n\n if (fromTokenAddress.isWrapped && toToken.isNative) {\n unwrap();\n return;\n }\n\n setIsSubmitting(true);\n let path = [fromTokenAddress, toTokenAddress];\n if (anchorOnFromAmount) {\n const { path: multiPath } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n if (multiPath) {\n path = multiPath;\n }\n } else {\n const { path: multiPath } = getNextFromAmount(\n chainId,\n toAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n if (multiPath) {\n path = multiPath;\n }\n }\n\n let method;\n let contract;\n let value;\n let params;\n let minOut;\n if (shouldRaiseGasError(getTokenInfo(infoTokens, fromTokenAddress), fromAmount)) {\n setIsSubmitting(false);\n setIsPendingConfirmation(true);\n helperToast.error(\n t`Leave at least ${formatAmount(DUST_BNB, 18, 3)} ${getConstant(chainId, \"nativeTokenSymbol\")} for gas`\n );\n return;\n }\n\n if (!isMarketOrder) {\n minOut = toAmount;\n Api.createSwapOrder(chainId, library, path, fromAmount, minOut, triggerRatio, nativeTokenAddress, {\n sentMsg: t`Swap Order submitted!`,\n successMsg: t`Swap Order created!`,\n failMsg: t`Swap Order creation failed.`,\n pendingTxns,\n setPendingTxns,\n })\n .then(() => {\n setIsConfirming(false);\n })\n .finally(() => {\n setIsSubmitting(false);\n setIsPendingConfirmation(false);\n });\n return;\n }\n\n path = replaceNativeTokenAddress(path, nativeTokenAddress);\n method = \"swap\";\n value = bigNumberify(0);\n if (toTokenAddress === AddressZero) {\n method = \"swapTokensToETH\";\n }\n\n minOut = toAmount.mul(BASIS_POINTS_DIVISOR - allowedSlippage).div(BASIS_POINTS_DIVISOR);\n params = [path, fromAmount, minOut, account];\n if (fromTokenAddress === AddressZero) {\n method = \"swapETHToTokens\";\n value = fromAmount;\n params = [path, minOut, account];\n }\n contract = new ethers.Contract(routerAddress, Router.abi, library.getSigner());\n\n callContract(chainId, contract, method, params, {\n value,\n sentMsg: t`Swap ${!isMarketOrder ? \" order \" : \"\"} submitted!`,\n successMsg: t`Swapped ${formatAmount(fromAmount, fromToken.decimals, 4, true)} ${\n fromToken.symbol\n } for ${formatAmount(toAmount, toToken.decimals, 4, true)} ${toToken.symbol}!`,\n failMsg: t`Swap failed.`,\n setPendingTxns,\n })\n .then(async () => {\n setIsConfirming(false);\n })\n .finally(() => {\n setIsSubmitting(false);\n setIsPendingConfirmation(false);\n });\n };\n\n const createIncreaseOrder = () => {\n let path = [fromTokenAddress];\n\n if (path[0] === USDF_ADDRESS) {\n if (isLong) {\n const stableToken = getMostAbundantStableToken(chainId, infoTokens);\n path.push(stableToken.address);\n } else {\n path.push(shortCollateralAddress);\n }\n }\n\n const minOut = 0;\n const indexToken = getToken(chainId, indexTokenAddress);\n const successMsg = t`\n Created limit order for ${indexToken.symbol} ${isLong ? \"Long\" : \"Short\"}: ${formatAmount(\n toUsdMax,\n USD_DECIMALS,\n 2\n )} USD!\n `;\n return Api.createIncreaseOrder(\n chainId,\n library,\n nativeTokenAddress,\n path,\n fromAmount,\n indexTokenAddress,\n minOut,\n toUsdMax,\n collateralTokenAddress,\n isLong,\n triggerPriceUsd,\n {\n pendingTxns,\n setPendingTxns,\n sentMsg: t`Limit order submitted!`,\n successMsg,\n failMsg: t`Limit order creation failed.`,\n }\n )\n .then(() => {\n setIsConfirming(false);\n })\n .finally(() => {\n setIsSubmitting(false);\n setIsPendingConfirmation(false);\n });\n };\n\n let referralCode = ethers.constants.HashZero;\n if (!attachedOnChain && userReferralCode) {\n referralCode = userReferralCode;\n }\n\n const increasePosition = async () => {\n setIsSubmitting(true);\n const tokenAddress0 = fromTokenAddress === AddressZero ? nativeTokenAddress : fromTokenAddress;\n const indexTokenAddress = toTokenAddress === AddressZero ? nativeTokenAddress : toTokenAddress;\n let path = [indexTokenAddress]; // assume long\n if (toTokenAddress !== fromTokenAddress) {\n path = [tokenAddress0, indexTokenAddress];\n }\n\n if (fromTokenAddress === AddressZero && toTokenAddress === nativeTokenAddress) {\n path = [nativeTokenAddress];\n }\n\n if (fromTokenAddress === nativeTokenAddress && toTokenAddress === AddressZero) {\n path = [nativeTokenAddress];\n }\n\n if (isShort) {\n path = [shortCollateralAddress];\n if (tokenAddress0 !== shortCollateralAddress) {\n path = [tokenAddress0, shortCollateralAddress];\n }\n }\n\n const refPrice = isLong ? toTokenInfo.maxPrice : toTokenInfo.minPrice;\n const priceBasisPoints = isLong ? BASIS_POINTS_DIVISOR + allowedSlippage : BASIS_POINTS_DIVISOR - allowedSlippage;\n const priceLimit = refPrice.mul(priceBasisPoints).div(BASIS_POINTS_DIVISOR);\n\n const boundedFromAmount = fromAmount ? fromAmount : bigNumberify(0);\n\n if (fromAmount && fromAmount.gt(0) && fromTokenAddress === USDF_ADDRESS && isLong) {\n const { amount: nextToAmount, path: multiPath } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n indexTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n if (nextToAmount.eq(0)) {\n helperToast.error(t`Insufficient liquidity`);\n return;\n }\n if (multiPath) {\n path = replaceNativeTokenAddress(multiPath);\n }\n }\n\n let params = [\n path, // _path\n indexTokenAddress, // _indexToken\n boundedFromAmount, // _amountIn\n 0, // _minOut\n toUsdMax, // _sizeDelta\n isLong, // _isLong\n priceLimit, // _acceptablePrice\n minExecutionFee, // _executionFee\n referralCode, // _referralCode\n // AddressZero, // _callbackTarget\n ];\n\n let method = \"createIncreasePosition\";\n let value = minExecutionFee;\n if (fromTokenAddress === AddressZero) {\n method = \"createIncreasePositionETH\";\n value = boundedFromAmount.add(minExecutionFee);\n params = [\n path, // _path\n indexTokenAddress, // _indexToken\n 0, // _minOut\n toUsdMax, // _sizeDelta\n isLong, // _isLong\n priceLimit, // _acceptablePrice\n minExecutionFee, // _executionFee\n referralCode, // _referralCode\n // AddressZero, // _callbackTarget\n ];\n }\n\n if (shouldRaiseGasError(getTokenInfo(infoTokens, fromTokenAddress), fromAmount)) {\n setIsSubmitting(false);\n setIsPendingConfirmation(false);\n helperToast.error(\n t`Leave at least ${formatAmount(DUST_BNB, 18, 3)} ${getConstant(chainId, \"nativeTokenSymbol\")} for gas`\n );\n return;\n }\n\n const contractAddress = getContract(chainId, \"PositionRouter\");\n const contract = new ethers.Contract(contractAddress, PositionRouter.abi, library.getSigner());\n const indexToken = getTokenInfo(infoTokens, indexTokenAddress);\n const tokenSymbol = indexToken.isWrapped ? getConstant(chainId, \"nativeTokenSymbol\") : indexToken.symbol;\n const longOrShortText = isLong ? t`Long` : t`Short`;\n const successMsg = t`Requested increase of ${tokenSymbol} ${longOrShortText} by ${formatAmount(\n toUsdMax,\n USD_DECIMALS,\n 2\n )} USD.`;\n\n callContract(chainId, contract, method, params, {\n value,\n setPendingTxns,\n sentMsg: `${longOrShortText} submitted.`,\n failMsg: `${longOrShortText} failed.`,\n successMsg,\n // for Arbitrum, sometimes the successMsg shows after the position has already been executed\n // hide the success message for Arbitrum as a workaround\n hideSuccessMsg: chainId === ARBITRUM,\n })\n .then(async () => {\n setIsConfirming(false);\n\n const key = getPositionKey(account, path[path.length - 1], indexTokenAddress, isLong);\n let nextSize = toUsdMax;\n if (hasExistingPosition) {\n nextSize = existingPosition.size.add(toUsdMax);\n }\n\n pendingPositions[key] = {\n updatedAt: Date.now(),\n pendingChanges: {\n size: nextSize,\n },\n };\n\n setPendingPositions({ ...pendingPositions });\n })\n .finally(() => {\n setIsSubmitting(false);\n setIsPendingConfirmation(false);\n });\n };\n\n const onSwapOptionChange = (opt) => {\n setSwapOption(opt);\n if (orderOption === STOP) {\n setOrderOption(MARKET);\n }\n setAnchorOnFromAmount(true);\n setFromValue(\"\");\n setToValue(\"\");\n setTriggerPriceValue(\"\");\n setTriggerRatioValue(\"\");\n\n if (opt === SHORT && infoTokens) {\n const fromToken = getToken(chainId, tokenSelection[opt].from);\n if (fromToken && fromToken.isStable) {\n setShortCollateralAddress(fromToken.address);\n } else {\n const stableToken = getMostAbundantStableToken(chainId, infoTokens);\n setShortCollateralAddress(stableToken.address);\n }\n }\n };\n\n const onConfirmationClick = () => {\n if (!active) {\n props.connectWallet();\n return;\n }\n\n if (needOrderBookApproval) {\n approveOrderBook();\n return;\n }\n\n setIsPendingConfirmation(true);\n\n if (isSwap) {\n swap();\n return;\n }\n\n if (orderOption === LIMIT) {\n createIncreaseOrder();\n return;\n }\n\n increasePosition();\n };\n\n function approveFromToken() {\n approveTokens({\n setIsApproving,\n library,\n tokenAddress: fromToken.address,\n spender: routerAddress,\n chainId: chainId,\n onApproveSubmitted: () => {\n setIsWaitingForApproval(true);\n },\n infoTokens,\n getTokenInfo,\n pendingTxns,\n setPendingTxns,\n });\n }\n\n const onClickPrimary = () => {\n if (isStopOrder) {\n setOrderOption(MARKET);\n return;\n }\n\n if (!active) {\n props.connectWallet();\n return;\n }\n\n if (needPositionRouterApproval) {\n approvePositionRouter({\n sentMsg: t`Enable leverage sent.`,\n failMsg: t`Enable leverage failed.`,\n });\n return;\n }\n\n if (needApproval) {\n approveFromToken();\n return;\n }\n\n if (needOrderBookApproval) {\n setOrdersToaOpen(true);\n return;\n }\n\n const [, modal, errorCode] = getError();\n\n if (modal) {\n setModalError(errorCode);\n return;\n }\n\n if (isSwap) {\n if (fromTokenAddress === AddressZero && toTokenAddress === nativeTokenAddress) {\n wrap();\n return;\n }\n\n if (fromTokenAddress === nativeTokenAddress && toTokenAddress === AddressZero) {\n unwrap();\n return;\n }\n }\n\n setIsConfirming(true);\n setIsHigherSlippageAllowed(false);\n };\n\n const isStopOrder = orderOption === STOP;\n const showFromAndToSection = !isStopOrder;\n const showTriggerPriceSection = !isSwap && !isMarketOrder && !isStopOrder;\n const showTriggerRatioSection = isSwap && !isMarketOrder && !isStopOrder;\n\n let fees;\n let feesUsd;\n let feeBps;\n let swapFees;\n let positionFee;\n if (isSwap) {\n if (fromAmount) {\n const { feeBasisPoints } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n if (feeBasisPoints !== undefined) {\n fees = fromAmount.mul(feeBasisPoints).div(BASIS_POINTS_DIVISOR);\n const feeTokenPrice =\n fromTokenInfo.address === USDF_ADDRESS ? expandDecimals(1, USD_DECIMALS) : fromTokenInfo.maxPrice;\n feesUsd = fees.mul(feeTokenPrice).div(expandDecimals(1, fromTokenInfo.decimals));\n }\n feeBps = feeBasisPoints;\n }\n } else if (toUsdMax) {\n positionFee = toUsdMax.mul(MARGIN_FEE_BASIS_POINTS).div(BASIS_POINTS_DIVISOR);\n feesUsd = positionFee;\n\n const { feeBasisPoints } = getNextToAmount(\n chainId,\n fromAmount,\n fromTokenAddress,\n collateralTokenAddress,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n isSwap\n );\n if (feeBasisPoints) {\n swapFees = fromUsdMin.mul(feeBasisPoints).div(BASIS_POINTS_DIVISOR);\n feesUsd = feesUsd.add(swapFees);\n }\n feeBps = feeBasisPoints;\n }\n\n const leverageMarks = {\n 2: \"2x\",\n 5: \"5x\",\n 10: \"10x\",\n 15: \"15x\",\n 20: \"20x\",\n 25: \"25x\",\n 30: \"30x\",\n };\n\n if (!fromToken || !toToken) {\n return null;\n }\n\n let hasZeroBorrowFee = false;\n let borrowFeeText;\n if (isLong && toTokenInfo && toTokenInfo.fundingRate) {\n borrowFeeText = formatAmount(toTokenInfo.fundingRate, 4, 4) + \"% / 1h\";\n if (toTokenInfo.fundingRate.eq(0)) {\n // hasZeroBorrowFee = true\n }\n }\n if (isShort && shortCollateralToken && shortCollateralToken.fundingRate) {\n borrowFeeText = formatAmount(shortCollateralToken.fundingRate, 4, 4) + \"% / 1h\";\n if (shortCollateralToken.fundingRate.eq(0)) {\n // hasZeroBorrowFee = true\n }\n }\n\n function setFromValueToMaximumAvailable() {\n if (!fromToken || !fromBalance) {\n return;\n }\n\n const maxAvailableAmount = fromToken.isNative ? fromBalance.sub(bigNumberify(DUST_BNB).mul(2)) : fromBalance;\n setFromValue(formatAmountFree(maxAvailableAmount, fromToken.decimals, fromToken.decimals));\n setAnchorOnFromAmount(true);\n }\n\n function shouldShowMaxButton() {\n if (!fromToken || !fromBalance) {\n return false;\n }\n const maxAvailableAmount = fromToken.isNative ? fromBalance.sub(bigNumberify(DUST_BNB).mul(2)) : fromBalance;\n return fromValue !== formatAmountFree(maxAvailableAmount, fromToken.decimals, fromToken.decimals);\n }\n\n const SWAP_LABELS = {\n [LONG]: t`Long`,\n [SHORT]: t`Short`,\n [SWAP]: t`Swap`,\n };\n\n return (\n
\n {/*
\n {active &&
\n
}\n
*/}\n
\n
\n \n {flagOrdersEnabled && (\n \n )}\n
\n {showFromAndToSection && (\n \n
\n
\n
\n {fromUsdMin && (\n
\n Pay: {formatAmount(fromUsdMin, USD_DECIMALS, 2, true)} USD\n
\n )}\n {!fromUsdMin && t`Pay`}\n
\n {fromBalance && (\n
\n Balance: {formatAmount(fromBalance, fromToken.decimals, 4, true)}\n
\n )}\n
\n
\n
\n \n {shouldShowMaxButton() && (\n
\n MAX\n
\n )}\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n {toUsdMax && (\n
\n {getToLabel()}: {formatAmount(toUsdMax, USD_DECIMALS, 2, true)} USD\n
\n )}\n {!toUsdMax && getToLabel()}\n
\n {toBalance && isSwap && (\n
\n Balance: {formatAmount(toBalance, toToken.decimals, 4, true)}\n
\n )}\n {(isLong || isShort) && hasLeverageOption && (\n
\n Leverage: {parseFloat(leverageOption).toFixed(2)}x\n
\n )}\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n )}\n {showTriggerRatioSection && (\n
\n
\n
\n Price\n
\n {fromTokenInfo && toTokenInfo && (\n {\n setTriggerRatioValue(\n formatAmountFree(\n getExchangeRate(fromTokenInfo, toTokenInfo, triggerRatioInverted),\n USD_DECIMALS,\n 10\n )\n );\n }}\n >\n {formatAmount(getExchangeRate(fromTokenInfo, toTokenInfo, triggerRatioInverted), USD_DECIMALS, 4)}\n
\n )}\n
\n
\n
\n \n
\n {(() => {\n if (!toTokenInfo) return;\n if (!fromTokenInfo) return;\n const [tokenA, tokenB] = triggerRatioInverted\n ? [toTokenInfo, fromTokenInfo]\n : [fromTokenInfo, toTokenInfo];\n return (\n
\n {tokenA.symbol} per {tokenB.symbol}\n
\n );\n })()}\n
\n
\n )}\n {showTriggerPriceSection && (\n
\n
\n
\n Price\n
\n {\n setTriggerPriceValue(formatPrice(entryMarkPrice, false, true));\n }}\n >\n Mark: {formatPrice(entryMarkPrice, true)}\n
\n
\n
\n
\n \n
\n
USD
\n
\n
\n )}\n {isSwap && (\n
\n \n
\n {!fees && \"-\"}\n {fees && (\n
\n {formatAmount(feeBps, 2, 2, false)}%  ({formatAmount(fees, fromToken.decimals, 4, true)}{\" \"}\n {fromToken.symbol}: ${formatAmount(feesUsd, USD_DECIMALS, 2, true)})\n
\n )}\n
\n
\n
\n )}\n {(isLong || isShort) && !isStopOrder && (\n
\n
\n \n Leverage slider\n \n
\n {isLeverageSliderEnabled && (\n \n setLeverageOption(value)}\n value={leverageOption}\n defaultValue={leverageOption}\n />\n
\n )}\n {isShort && (\n
\n
\n Collateral In\n
\n\n
\n \n
\n
\n )}\n {isLong && (\n
\n
\n Collateral In\n
\n
\n (\n \n \n A snapshot of the USD value of your {existingPosition?.collateralToken?.symbol} collateral is\n taken when the position is opened.\n \n
\n
\n \n When closing the position, you can select which token you would like to receive the profits\n in.\n \n
\n )}\n />\n
\n
\n )}\n
\n
\n Leverage\n
\n
\n {hasExistingPosition && toAmount && toAmount.gt(0) && (\n
\n {formatAmount(existingPosition.leverage, 4, 2)}x\n \n
\n )}\n {toAmount && leverage && leverage.gt(0) && `${formatAmount(leverage, 4, 2)}x`}\n {!toAmount && leverage && leverage.gt(0) && `-`}\n {leverage && leverage.eq(0) && `-`}\n
\n
\n
\n
\n Entry Price\n
\n
\n {hasExistingPosition && toAmount && toAmount.gt(0) && (\n
\n ${formatPrice(existingPosition.averagePrice, true)}\n \n
\n )}\n {nextAveragePrice && `$${formatPrice(nextAveragePrice, true)}`}\n {!nextAveragePrice && `-`}\n
\n
\n
\n
\n Liq. Price\n
\n
\n {hasExistingPosition && toAmount && toAmount.gt(0) && (\n
\n ${formatPrice(existingLiquidationPrice, true)}\n \n
\n )}\n {toAmount &&\n displayLiquidationPrice &&\n `$${formatPrice(displayLiquidationPrice, true)}`}\n {!toAmount && displayLiquidationPrice && `-`}\n {!displayLiquidationPrice && `-`}\n
\n
\n \n
\n {!feesUsd && \"-\"}\n {feesUsd && (\n {\n return (\n
\n {swapFees && (\n
\n {collateralToken.symbol} is required for collateral.
\n
\n \n
\n
\n )}\n
\n \n
\n
\n );\n }}\n />\n )}\n
\n
\n
\n )}\n {isStopOrder && (\n
\n \n Take-profit and stop-loss orders can be set after opening a position.
\n
\n There will be a \"Close\" button on each position row, clicking this will display the option to set trigger\n orders.
\n
\n For screenshots and more information, please see the{\" \"}\n docs\n .\n
\n
\n )}\n
\n \n
\n
\n {isSwap && (\n
\n
\n Swap\n
\n
\n
\n
\n {fromToken.symbol} Price\n
\n
\n ${fromTokenInfo && formatPrice(fromTokenInfo.minPrice, true)}\n
\n
\n
\n
\n {toToken.symbol} Price\n
\n
\n ${toTokenInfo && formatPrice(toTokenInfo.maxPrice, true)}\n
\n
\n
\n
\n Available Liquidity\n
\n\n
\n {\n return (\n
\n \n \n
\n );\n }}\n />\n
\n
\n {!isMarketOrder && (\n \n {getExchangeRateDisplay(getExchangeRate(fromTokenInfo, toTokenInfo), fromToken, toToken)}\n \n )}\n
\n )}\n {(isLong || isShort) && (\n
\n
\n {isLong ? t`Long` : t`Short`} {toToken.symbol}\n
\n
\n
\n
\n Entry Price\n
\n
\n {\n return (\n
\n \n The position will be opened at {formatPrice(entryMarkPrice, true)} USD with a\n max slippage of {parseFloat(savedSlippageAmount / 100.0).toFixed(2)}%.\n
\n
\n The slippage amount can be configured under Settings, found by clicking on your address at the\n top right of the page after connecting your wallet.\n
\n
\n \n More Info\n \n
\n
\n );\n }}\n />\n
\n
\n
\n
\n Exit Price\n
\n
\n {\n return (\n
\n \n If you have an existing position, the position will be closed at{\" \"}\n {formatPrice(entryMarkPrice, true)} USD.\n
\n
\n This exit price will change with the price of the asset.\n
\n
\n \n More Info\n \n
\n
\n );\n }}\n />\n
\n
\n
\n
\n Borrow Fee\n
\n
\n {\n return (\n
\n {hasZeroBorrowFee && (\n
\n {isLong && t`There are more shorts than longs, borrow fees for longing is currently zero`}\n {isShort && t`There are more longs than shorts, borrow fees for shorting is currently zero`}\n
\n )}\n {!hasZeroBorrowFee && (\n
\n \n The borrow fee is calculated as (assets borrowed) / (total assets in pool) * 0.01% per hour.\n \n
\n
\n {isShort && t`You can change the \"Collateral In\" token above to find lower fees`}\n
\n )}\n
\n \n More Info\n \n
\n );\n }}\n >\n {!hasZeroBorrowFee && null}\n \n
\n
\n {renderAvailableLongLiquidity()}\n {isShort && toTokenInfo.hasMaxAvailableShort && (\n
\n
\n Available Liquidity\n
\n
\n {\n return (\n <>\n \n \n \n );\n }}\n >\n
\n
\n )}\n
\n )}\n
\n
\n Useful Links\n
\n
\n
\n
\n \n Trading guide\n \n
\n
\n {/*
\n
\n \n Leaderboard\n \n
\n
*/}\n
\n
\n \n Speed up page loading\n \n
\n
\n
\n \n {renderOrdersToa()}\n {isConfirming && (\n \n )}\n
\n );\n}\n","import React from \"react\";\nimport { Menu } from \"@headlessui/react\";\nimport { FaChevronDown } from \"react-icons/fa\";\nimport cx from \"classnames\";\nimport \"./ChartTokenSelector.css\";\nimport { LONG, SHORT, SWAP } from \"lib/legacy\";\nimport { getTokens, getWhitelistedTokens } from \"config/tokens\";\n\nexport default function ChartTokenSelector(props) {\n const { chainId, selectedToken, onSelectToken, swapOption } = props;\n\n const isLong = swapOption === LONG;\n const isShort = swapOption === SHORT;\n const isSwap = swapOption === SWAP;\n\n let options = getTokens(chainId);\n const whitelistedTokens = getWhitelistedTokens(chainId);\n const indexTokens = whitelistedTokens.filter((token) => !token.isStable && !token.isWrapped);\n const shortableTokens = indexTokens.filter((token) => token.isShortable);\n\n if (isLong) {\n options = indexTokens;\n }\n if (isShort) {\n options = shortableTokens;\n }\n\n const onSelect = async (token) => {\n onSelectToken(token);\n };\n\n var value = selectedToken;\n\n return (\n \n \n \n \n
\n \n {options.map((option, index) => (\n \n {\n onSelect(option);\n }}\n >\n \n {option.symbol} / USD\n \n
\n \n ))}\n \n \n
\n );\n}\n","import React, { useEffect, useState, useRef, useCallback, useMemo } from \"react\";\nimport cx from \"classnames\";\n\nimport { createChart } from \"krasulya-lightweight-charts\";\n\nimport { SWAP, INCREASE, CHART_PERIODS, getLiquidationPrice } from \"lib/legacy\";\nimport { useChartPrices } from \"domain/legacy\";\nimport Tab from \"../Tab/Tab\";\n\nimport ChartTokenSelector from \"./ChartTokenSelector\";\nimport { useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { getTokenInfo } from \"domain/tokens/utils\";\nimport { usePrevious } from \"lib/usePrevious\";\nimport { formatPrice, HIGH_PRICE_DECIMALS, numberWithCommas, PRICE_DECIMALS } from \"lib/numbers\";\nimport { getToken, getTokens } from \"config/tokens\";\nimport { formatDateTime } from \"lib/dates\";\nimport { t, Trans } from \"@lingui/macro\";\n\nconst PRICE_LINE_TEXT_WIDTH = 15;\n\nconst timezoneOffset = -new Date().getTimezoneOffset() * 60;\n\nexport function getChartToken(swapOption, fromToken, toToken, chainId) {\n if (!fromToken || !toToken) {\n return;\n }\n\n if (swapOption !== SWAP) {\n return toToken;\n }\n\n if (fromToken.isUsdf && toToken.isUsdf) {\n return getTokens(chainId).find((t) => t.isStable);\n }\n if (fromToken.isUsdf) {\n return toToken;\n }\n if (toToken.isUsdf) {\n return fromToken;\n }\n\n if (fromToken.isStable && toToken.isStable) {\n return toToken;\n }\n if (fromToken.isStable) {\n return toToken;\n }\n if (toToken.isStable) {\n return fromToken;\n }\n\n return toToken;\n}\n\nconst DEFAULT_PERIOD = \"4h\";\n\nconst getSeriesOptions = () => ({\n // https://github.com/tradingview/lightweight-charts/blob/master/docs/area-series.md\n lineColor: \"#5472cc\",\n topColor: \"rgba(49, 69, 131, 0.4)\",\n bottomColor: \"rgba(42, 64, 103, 0.0)\",\n lineWidth: 2,\n priceLineColor: \"#3a3e5e\",\n downColor: \"#fa3c58\",\n wickDownColor: \"#fa3c58\",\n upColor: \"#0ecc83\",\n wickUpColor: \"#0ecc83\",\n borderVisible: false,\n});\n\nconst getChartOptions = (width, height) => ({\n width,\n height,\n layout: {\n backgroundColor: \"rgba(255, 255, 255, 0)\",\n textColor: \"#ccc\",\n fontFamily: \"Relative\",\n },\n localization: {\n // https://github.com/tradingview/lightweight-charts/blob/master/docs/customization.md#time-format\n timeFormatter: (businessDayOrTimestamp) => {\n return formatDateTime(businessDayOrTimestamp - timezoneOffset);\n },\n priceFormatter: (price) => {\n if (price > 100) {\n return price.toFixed(HIGH_PRICE_DECIMALS);\n }\n return price.toFixed(PRICE_DECIMALS);\n },\n },\n grid: {\n vertLines: {\n visible: true,\n color: \"rgba(35, 38, 59, 1)\",\n style: 2,\n },\n horzLines: {\n visible: true,\n color: \"rgba(35, 38, 59, 1)\",\n style: 2,\n },\n },\n // https://github.com/tradingview/lightweight-charts/blob/master/docs/time-scale.md#time-scale\n timeScale: {\n rightOffset: 5,\n borderVisible: false,\n barSpacing: 5,\n timeVisible: true,\n fixLeftEdge: true,\n },\n // https://github.com/tradingview/lightweight-charts/blob/master/docs/customization.md#price-axis\n priceScale: {\n borderVisible: false,\n },\n crosshair: {\n horzLine: {\n color: \"#aaa\",\n },\n vertLine: {\n color: \"#aaa\",\n },\n mode: 0,\n },\n});\n\nexport default function ExchangeTVChart(props) {\n const {\n swapOption,\n fromTokenAddress,\n toTokenAddress,\n infoTokens,\n chainId,\n positions,\n savedShouldShowPositionLines,\n orders,\n setToTokenAddress,\n } = props;\n const [currentChart, setCurrentChart] = useState();\n const [currentSeries, setCurrentSeries] = useState();\n\n let [period, setPeriod] = useLocalStorageSerializeKey([chainId, \"Chart-period\"], DEFAULT_PERIOD);\n if (!(period in CHART_PERIODS)) {\n period = DEFAULT_PERIOD;\n }\n\n const [hoveredCandlestick, setHoveredCandlestick] = useState();\n\n const fromToken = getTokenInfo(infoTokens, fromTokenAddress);\n const toToken = getTokenInfo(infoTokens, toTokenAddress);\n\n const [chartToken, setChartToken] = useState({\n maxPrice: null,\n minPrice: null,\n });\n useEffect(() => {\n const tmp = getChartToken(swapOption, fromToken, toToken, chainId);\n setChartToken(tmp);\n }, [swapOption, fromToken, toToken, chainId]);\n\n const symbol = chartToken ? (chartToken.isWrapped ? chartToken.baseSymbol : chartToken.symbol) : undefined;\n const marketName = chartToken ? symbol + \"_USD\" : undefined;\n const previousMarketName = usePrevious(marketName);\n\n const currentOrders = useMemo(() => {\n if (swapOption === SWAP || !chartToken) {\n return [];\n }\n\n return orders.filter((order) => {\n if (order.type === SWAP) {\n // we can't show non-stable to non-stable swap orders with existing charts\n // so to avoid users confusion we'll show only long/short orders\n return false;\n }\n\n const indexToken = getToken(chainId, order.indexToken);\n return order.indexToken === chartToken.address || (chartToken.isNative && indexToken.isWrapped);\n });\n }, [orders, chartToken, swapOption, chainId]);\n\n const ref = useRef(null);\n const chartRef = useRef(null);\n\n const currentAveragePrice =\n chartToken.maxPrice && chartToken.minPrice ? chartToken.maxPrice.add(chartToken.minPrice).div(2) : null;\n const [priceData, updatePriceData] = useChartPrices(\n chainId,\n chartToken.symbol,\n chartToken.isStable,\n period,\n currentAveragePrice\n );\n\n const [chartInited, setChartInited] = useState(false);\n useEffect(() => {\n if (marketName !== previousMarketName) {\n setChartInited(false);\n }\n }, [marketName, previousMarketName]);\n\n const scaleChart = useCallback(() => {\n const from = Date.now() / 1000 - (7 * 24 * CHART_PERIODS[period]) / 2 + timezoneOffset;\n const to = Date.now() / 1000 + timezoneOffset;\n currentChart.timeScale().setVisibleRange({ from, to });\n }, [currentChart, period]);\n\n const onCrosshairMove = useCallback(\n (evt) => {\n if (!evt.time) {\n setHoveredCandlestick(null);\n return;\n }\n\n for (const point of evt.seriesPrices.values()) {\n setHoveredCandlestick((hoveredCandlestick) => {\n if (hoveredCandlestick && hoveredCandlestick.time === evt.time) {\n // rerender optimisations\n return hoveredCandlestick;\n }\n return {\n time: evt.time,\n ...point,\n };\n });\n break;\n }\n },\n [setHoveredCandlestick]\n );\n\n useEffect(() => {\n if (!ref.current || !priceData || !priceData.length || currentChart) {\n return;\n }\n\n const chart = createChart(\n chartRef.current,\n getChartOptions(chartRef.current.offsetWidth, chartRef.current.offsetHeight)\n );\n\n chart.subscribeCrosshairMove(onCrosshairMove);\n\n const series = chart.addCandlestickSeries(getSeriesOptions());\n\n setCurrentChart(chart);\n setCurrentSeries(series);\n }, [ref, priceData, currentChart, onCrosshairMove]);\n\n useEffect(() => {\n const interval = setInterval(() => {\n updatePriceData(undefined, true);\n }, 60 * 1000);\n return () => clearInterval(interval);\n }, [updatePriceData]);\n\n useEffect(() => {\n if (!currentChart) {\n return;\n }\n const resizeChart = () => {\n currentChart.resize(chartRef.current.offsetWidth, chartRef.current.offsetHeight);\n };\n window.addEventListener(\"resize\", resizeChart);\n return () => window.removeEventListener(\"resize\", resizeChart);\n }, [currentChart]);\n\n useEffect(() => {\n if (currentSeries && priceData && priceData.length) {\n currentSeries.setData(priceData);\n\n if (!chartInited) {\n scaleChart();\n setChartInited(true);\n }\n }\n }, [priceData, currentSeries, chartInited, scaleChart]);\n\n useEffect(() => {\n const lines = [];\n if (currentSeries && savedShouldShowPositionLines) {\n if (currentOrders && currentOrders.length > 0) {\n currentOrders.forEach((order) => {\n const indexToken = getToken(chainId, order.indexToken);\n let tokenSymbol;\n if (indexToken && indexToken.symbol) {\n tokenSymbol = indexToken.isWrapped ? indexToken.baseSymbol : indexToken.symbol;\n }\n const title = `${order.type === INCREASE ? t`Inc.` : t`Dec.`} ${tokenSymbol} ${\n order.isLong ? t`Long` : t`Short`\n }`;\n const color = \"#3a3e5e\";\n lines.push(\n currentSeries.createPriceLine({\n price: parseFloat(formatPrice(order.triggerPrice)),\n color,\n title: title.padEnd(PRICE_LINE_TEXT_WIDTH, \" \"),\n })\n );\n });\n }\n if (positions && positions.length > 0) {\n const color = \"#3a3e5e\";\n positions.forEach((position) => {\n const longOrShortText = position.isLong ? t`Long` : t`Short`;\n lines.push(\n currentSeries.createPriceLine({\n price: parseFloat(formatPrice(position.averagePrice)),\n color,\n title: t`Open ${position.indexToken.symbol} ${longOrShortText}`.padEnd(PRICE_LINE_TEXT_WIDTH, \" \"),\n })\n );\n\n const liquidationPrice = getLiquidationPrice(position);\n lines.push(\n currentSeries.createPriceLine({\n price: parseFloat(formatPrice(liquidationPrice)),\n color,\n title: t`Liq. ${position.indexToken.symbol} ${longOrShortText}`.padEnd(PRICE_LINE_TEXT_WIDTH, \" \"),\n })\n );\n });\n }\n }\n return () => {\n lines.forEach((line) => currentSeries.removePriceLine(line));\n };\n }, [currentOrders, positions, currentSeries, chainId, savedShouldShowPositionLines]);\n\n const candleStatsHtml = useMemo(() => {\n if (!priceData) {\n return null;\n }\n const candlestick = hoveredCandlestick || priceData[priceData.length - 1];\n if (!candlestick) {\n return null;\n }\n\n let length = String(parseInt(candlestick.close)).length;\n if (candlestick.close < 100) {\n length = String(parseInt(candlestick.close * 10 ** (PRICE_DECIMALS - HIGH_PRICE_DECIMALS)));\n }\n if (candlestick.close < 1) {\n length += 1;\n }\n\n const className = cx({\n \"ExchangeChart-bottom-stats\": true,\n positive: candlestick.open <= candlestick.close,\n negative: candlestick.open > candlestick.close,\n [`length-${length}`]: true,\n });\n\n const toFixedNumbers = candlestick.close > 100 ? HIGH_PRICE_DECIMALS : PRICE_DECIMALS;\n\n return (\n
\n O\n {candlestick.open.toFixed(toFixedNumbers)}\n H\n {candlestick.high.toFixed(toFixedNumbers)}\n L\n {candlestick.low.toFixed(toFixedNumbers)}\n C\n {candlestick.close.toFixed(toFixedNumbers)}\n
\n );\n }, [hoveredCandlestick, priceData]);\n\n let high;\n let low;\n let deltaPrice;\n let delta;\n let deltaPercentage;\n let deltaPercentageStr;\n\n const now = parseInt(Date.now() / 1000);\n const timeThreshold = now - 24 * 60 * 60;\n\n if (priceData) {\n for (let i = priceData.length - 1; i > 0; i--) {\n const price = priceData[i];\n if (price.time < timeThreshold) {\n break;\n }\n if (!low) {\n low = price.low;\n }\n if (!high) {\n high = price.high;\n }\n\n if (price.high > high) {\n high = price.high;\n }\n if (price.low < low) {\n low = price.low;\n }\n\n deltaPrice = price.open;\n }\n }\n\n if (deltaPrice && currentAveragePrice) {\n const average = parseFloat(formatPrice(currentAveragePrice));\n delta = average - deltaPrice;\n deltaPercentage = (delta * 100) / average;\n if (deltaPercentage > 0) {\n deltaPercentageStr = `+${deltaPercentage.toFixed(2)}%`;\n } else {\n deltaPercentageStr = `${deltaPercentage.toFixed(2)}%`;\n }\n if (deltaPercentage === 0) {\n deltaPercentageStr = \"0.00\";\n }\n }\n\n if (!chartToken) {\n return null;\n }\n\n const onSelectToken = (token) => {\n const tmp = getTokenInfo(infoTokens, token.address);\n setChartToken(tmp);\n setToTokenAddress(swapOption, token.address);\n };\n\n return (\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n {chartToken.maxPrice && formatPrice(chartToken.maxPrice, true)}\n
\n
\n ${chartToken.minPrice && formatPrice(chartToken.minPrice, true)}\n
\n
\n
\n
\n 24h Change\n
\n
0, negative: deltaPercentage < 0 })}>\n {!deltaPercentageStr && \"-\"}\n {deltaPercentageStr && deltaPercentageStr}\n
\n
\n
\n
\n 24h High\n
\n
\n {!high && \"-\"}\n {high && numberWithCommas(high.toFixed(high > 100 ? HIGH_PRICE_DECIMALS : PRICE_DECIMALS))}\n
\n
\n
\n
\n 24h Low\n
\n
\n {!low && \"-\"}\n {low && numberWithCommas(low.toFixed(low > 100 ? HIGH_PRICE_DECIMALS : PRICE_DECIMALS))}\n
\n
\n
\n
\n
\n
\n
\n \n
\n {candleStatsHtml}\n
\n
\n
\n
\n );\n}\n","import React, { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { ethers } from \"ethers\";\nimport cx from \"classnames\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { BsArrowRight } from \"react-icons/bs\";\n\nimport {\n DEFAULT_SLIPPAGE_AMOUNT,\n DEFAULT_HIGHER_SLIPPAGE_AMOUNT,\n USD_DECIMALS,\n DUST_USD,\n BASIS_POINTS_DIVISOR,\n MIN_PROFIT_TIME,\n getLiquidationPrice,\n getLeverage,\n getMarginFee,\n PRECISION,\n MARKET,\n STOP,\n DECREASE,\n calculatePositionDelta,\n getDeltaStr,\n getProfitPrice,\n getNextToAmount,\n USDF_DECIMALS,\n adjustForDecimals,\n} from \"lib/legacy\";\nimport { ARBITRUM, getChainName, getConstant, IS_NETWORK_DISABLED } from \"config/chains\";\nimport { createDecreaseOrder, useHasOutdatedUi } from \"domain/legacy\";\nimport { getContract } from \"config/contracts\";\nimport PositionRouter from \"abis/PositionRouter.json\";\nimport Checkbox from \"../Checkbox/Checkbox\";\nimport Tab from \"../Tab/Tab\";\nimport Modal from \"../Modal/Modal\";\nimport ExchangeInfoRow from \"./ExchangeInfoRow\";\nimport Tooltip from \"../Tooltip/Tooltip\";\nimport TokenSelector from \"./TokenSelector\";\nimport \"./PositionSeller.css\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { callContract } from \"lib/contracts\";\nimport { getTokenAmountFromUsd } from \"domain/tokens\";\nimport { TRIGGER_PREFIX_ABOVE, TRIGGER_PREFIX_BELOW } from \"config/ui\";\nimport { useLocalStorageByChainId, useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { CLOSE_POSITION_RECEIVE_TOKEN_KEY, SLIPPAGE_BPS_KEY } from \"config/localStorage\";\nimport { getTokenInfo, getUsd } from \"domain/tokens/utils\";\nimport { usePrevious } from \"lib/usePrevious\";\nimport { bigNumberify, expandDecimals, formatAmount, formatAmountFree, formatPrice, parseValue } from \"lib/numbers\";\nimport { getTokens } from \"config/tokens\";\nimport { formatDateTime, getTimeRemaining } from \"lib/dates\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst { AddressZero } = ethers.constants;\nconst ORDER_SIZE_DUST_USD = expandDecimals(1, USD_DECIMALS - 1); // $0.10\n\nfunction shouldSwap(collateralToken, receiveToken) {\n // If position collateral is WETH in contract, then position.collateralToken is { symbol: “ETH”, isNative: true, … }\n // @see https://github.com/fxdxdex/fxdx-evm-interface/blob/master/src/pages/Exchange/Exchange.js#L162\n // meaning if collateralToken.isNative === true in reality position has WETH as a collateral\n // and if collateralToken.isNative === true and receiveToken.isNative === true then position’s WETH will be unwrapped and user will receive native ETH\n const isCollateralWrapped = collateralToken.isNative;\n\n const isSameToken =\n collateralToken.address === receiveToken.address || (isCollateralWrapped && receiveToken.isWrapped);\n\n const isUnwrap = isCollateralWrapped && receiveToken.isNative;\n\n return !isSameToken && !isUnwrap;\n}\n\nfunction getSwapLimits(infoTokens, fromTokenAddress, toTokenAddress) {\n const fromInfo = getTokenInfo(infoTokens, fromTokenAddress);\n const toInfo = getTokenInfo(infoTokens, toTokenAddress);\n\n let maxInUsd;\n let maxIn;\n let maxOut;\n let maxOutUsd;\n\n if (!fromInfo?.maxUsdfAmount) {\n maxInUsd = bigNumberify(0);\n maxIn = bigNumberify(0);\n } else {\n maxInUsd = fromInfo.maxUsdfAmount\n .sub(fromInfo.usdfAmount)\n .mul(expandDecimals(1, USD_DECIMALS))\n .div(expandDecimals(1, USDF_DECIMALS));\n\n maxIn = maxInUsd.mul(expandDecimals(1, fromInfo.decimals)).div(fromInfo.maxPrice).toString();\n }\n\n if (!toInfo?.poolAmount || !toInfo?.bufferAmount) {\n maxOut = bigNumberify(0);\n maxOutUsd = bigNumberify(0);\n } else {\n maxOut = toInfo.availableAmount.gt(toInfo.poolAmount.sub(toInfo.bufferAmount))\n ? toInfo.poolAmount.sub(toInfo.bufferAmount)\n : toInfo.availableAmount;\n\n maxOutUsd = getUsd(maxOut, toInfo.address, false, infoTokens);\n }\n\n return {\n maxIn,\n maxInUsd,\n maxOut,\n maxOutUsd,\n };\n}\n\nexport default function PositionSeller(props) {\n const {\n pendingPositions,\n setPendingPositions,\n positionsMap,\n positionKey,\n isVisible,\n setIsVisible,\n account,\n library,\n infoTokens,\n setPendingTxns,\n flagOrdersEnabled,\n savedIsPnlInLeverage,\n chainId,\n nativeTokenAddress,\n orders,\n isWaitingForPluginApproval,\n isPluginApproving,\n orderBookApproved,\n setOrdersToaOpen,\n positionRouterApproved,\n isWaitingForPositionRouterApproval,\n isPositionRouterApproving,\n approvePositionRouter,\n isHigherSlippageAllowed,\n setIsHigherSlippageAllowed,\n minExecutionFee,\n minExecutionFeeErrorMessage,\n usdfSupply,\n totalTokenWeights,\n } = props;\n const [savedSlippageAmount] = useLocalStorageSerializeKey([chainId, SLIPPAGE_BPS_KEY], DEFAULT_SLIPPAGE_AMOUNT);\n const [keepLeverage, setKeepLeverage] = useLocalStorageSerializeKey([chainId, \"Exchange-keep-leverage\"], true);\n const position = positionsMap && positionKey ? positionsMap[positionKey] : undefined;\n const [fromValue, setFromValue] = useState(\"\");\n const [isProfitWarningAccepted, setIsProfitWarningAccepted] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const prevIsVisible = usePrevious(isVisible);\n const positionRouterAddress = getContract(chainId, \"PositionRouter\");\n const nativeTokenSymbol = getConstant(chainId, \"nativeTokenSymbol\");\n const toTokens = getTokens(chainId);\n const longOrShortText = position?.isLong ? t`Long` : t`Short`;\n\n const [savedRecieveTokenAddress, setSavedRecieveTokenAddress] = useLocalStorageByChainId(\n chainId,\n `${CLOSE_POSITION_RECEIVE_TOKEN_KEY}-${position?.indexToken?.symbol}-${position.isLong ? \"long\" : \"short\"}`\n );\n\n const [swapToToken, setSwapToToken] = useState(() =>\n savedRecieveTokenAddress ? toTokens.find((token) => token.address === savedRecieveTokenAddress) : undefined\n );\n\n let allowedSlippage = savedSlippageAmount;\n if (isHigherSlippageAllowed) {\n allowedSlippage = DEFAULT_HIGHER_SLIPPAGE_AMOUNT;\n }\n\n const ORDER_OPTIONS = [MARKET, STOP];\n const ORDER_OPTION_LABELS = {\n [MARKET]: t`Market`,\n [STOP]: t`Trigger`,\n };\n let [orderOption, setOrderOption] = useState(MARKET);\n\n if (!flagOrdersEnabled) {\n orderOption = MARKET;\n }\n\n const needPositionRouterApproval = !positionRouterApproved && orderOption === MARKET;\n\n const onOrderOptionChange = (option) => {\n setOrderOption(option);\n };\n\n const onTriggerPriceChange = (evt) => {\n setTriggerPriceValue(evt.target.value || \"\");\n };\n\n const [triggerPriceValue, setTriggerPriceValue] = useState(\"\");\n const triggerPriceUsd = orderOption === MARKET ? 0 : parseValue(triggerPriceValue, USD_DECIMALS);\n\n const [nextDelta, nextHasProfit = bigNumberify(0)] = useMemo(() => {\n if (!position) {\n return [bigNumberify(0), false];\n }\n\n if (orderOption !== STOP) {\n return [position.delta, position.hasProfit, position.deltaPercentage];\n }\n\n if (!triggerPriceUsd) {\n return [bigNumberify(0), false];\n }\n\n const { delta, hasProfit, deltaPercentage } = calculatePositionDelta(triggerPriceUsd, position);\n return [delta, hasProfit, deltaPercentage];\n }, [position, orderOption, triggerPriceUsd]);\n\n const existingOrders = useMemo(() => {\n if (orderOption === STOP && (!triggerPriceUsd || triggerPriceUsd.eq(0))) {\n return [];\n }\n if (!orders || !position) {\n return [];\n }\n\n const ret = [];\n for (const order of orders) {\n // only Stop orders can't be executed without corresponding opened position\n if (order.type !== DECREASE) continue;\n\n // if user creates Stop-Loss we need only Stop-Loss orders and vice versa\n if (orderOption === STOP) {\n const triggerAboveThreshold = triggerPriceUsd.gt(position.markPrice);\n if (triggerAboveThreshold !== order.triggerAboveThreshold) continue;\n }\n\n const sameToken =\n order.indexToken === nativeTokenAddress\n ? position.indexToken.isNative\n : order.indexToken === position.indexToken.address;\n if (order.isLong === position.isLong && sameToken) {\n ret.push(order);\n }\n }\n return ret;\n }, [position, orders, triggerPriceUsd, orderOption, nativeTokenAddress]);\n\n const existingOrder = existingOrders[0];\n\n const needOrderBookApproval = orderOption === STOP && !orderBookApproved;\n\n const isSwapAllowed = orderOption === MARKET;\n\n const { data: hasOutdatedUi } = useHasOutdatedUi();\n\n let collateralToken;\n let receiveToken;\n let maxAmount;\n let maxAmountFormatted;\n let maxAmountFormattedFree;\n let fromAmount;\n\n let convertedAmount;\n let convertedAmountFormatted;\n\n let nextLeverage;\n let liquidationPrice;\n let nextLiquidationPrice;\n let isClosing;\n let sizeDelta;\n\n let nextCollateral;\n let collateralDelta = bigNumberify(0);\n let receiveAmount = bigNumberify(0);\n let convertedReceiveAmount = bigNumberify(0);\n let adjustedDelta = bigNumberify(0);\n\n let isNotEnoughReceiveTokenLiquidity;\n let isCollateralPoolCapacityExceeded;\n\n let title;\n let fundingFee;\n let positionFee;\n let swapFeeToken;\n let swapFee;\n let totalFees = bigNumberify(0);\n\n let executionFee = orderOption === STOP ? getConstant(chainId, \"DECREASE_ORDER_EXECUTION_GAS_FEE\") : minExecutionFee;\n\n let executionFeeUsd = getUsd(executionFee, nativeTokenAddress, false, infoTokens) || bigNumberify(0);\n\n if (position) {\n fundingFee = position.fundingFee;\n fromAmount = parseValue(fromValue, USD_DECIMALS);\n sizeDelta = fromAmount;\n\n title = t`Close ${longOrShortText} ${position.indexToken.symbol}`;\n collateralToken = position.collateralToken;\n liquidationPrice = getLiquidationPrice(position);\n\n if (fromAmount) {\n isClosing = position.size.sub(fromAmount).lt(DUST_USD);\n positionFee = getMarginFee(fromAmount);\n }\n\n if (isClosing) {\n sizeDelta = position.size;\n receiveAmount = position.collateral;\n } else if (orderOption === STOP && sizeDelta && existingOrders.length > 0) {\n let residualSize = position.size;\n for (const order of existingOrders) {\n residualSize = residualSize.sub(order.sizeDelta);\n }\n if (residualSize.sub(sizeDelta).abs().lt(ORDER_SIZE_DUST_USD)) {\n sizeDelta = residualSize;\n }\n }\n\n if (sizeDelta) {\n adjustedDelta = nextDelta.mul(sizeDelta).div(position.size);\n }\n\n if (nextHasProfit) {\n receiveAmount = receiveAmount.add(adjustedDelta);\n } else {\n if (receiveAmount.gt(adjustedDelta)) {\n receiveAmount = receiveAmount.sub(adjustedDelta);\n } else {\n receiveAmount = bigNumberify(0);\n }\n }\n\n if (keepLeverage && sizeDelta && !isClosing) {\n collateralDelta = sizeDelta.mul(position.collateral).div(position.size);\n // if the position will be realising a loss then reduce collateralDelta by the realised loss\n if (!nextHasProfit) {\n const deductions = adjustedDelta.add(positionFee).add(fundingFee);\n if (collateralDelta.gt(deductions)) {\n collateralDelta = collateralDelta = collateralDelta.sub(deductions);\n } else {\n collateralDelta = bigNumberify(0);\n }\n }\n }\n\n maxAmount = position.size;\n maxAmountFormatted = formatAmount(maxAmount, USD_DECIMALS, 2, true);\n maxAmountFormattedFree = formatAmountFree(maxAmount, USD_DECIMALS, 2);\n\n if (fromAmount && collateralToken.maxPrice) {\n convertedAmount = fromAmount.mul(expandDecimals(1, collateralToken.decimals)).div(collateralToken.maxPrice);\n convertedAmountFormatted = formatAmount(convertedAmount, collateralToken.decimals, 4, true);\n }\n\n totalFees = totalFees.add(positionFee || bigNumberify(0)).add(fundingFee || bigNumberify(0));\n\n receiveAmount = receiveAmount.add(collateralDelta);\n\n if (sizeDelta) {\n if (receiveAmount.gt(totalFees)) {\n receiveAmount = receiveAmount.sub(totalFees);\n } else {\n receiveAmount = bigNumberify(0);\n }\n }\n\n receiveToken = isSwapAllowed && swapToToken ? swapToToken : collateralToken;\n\n // Calculate swap fees\n if (isSwapAllowed && swapToToken) {\n const { feeBasisPoints } = getNextToAmount(\n chainId,\n convertedAmount,\n collateralToken.address,\n receiveToken.address,\n infoTokens,\n undefined,\n undefined,\n usdfSupply,\n totalTokenWeights,\n true\n );\n\n if (feeBasisPoints) {\n swapFee = receiveAmount.mul(feeBasisPoints).div(BASIS_POINTS_DIVISOR);\n swapFeeToken = getTokenAmountFromUsd(infoTokens, collateralToken.address, swapFee);\n totalFees = totalFees.add(swapFee || bigNumberify(0));\n receiveAmount = receiveAmount.sub(swapFee);\n }\n }\n\n if (orderOption === STOP) {\n convertedReceiveAmount = getTokenAmountFromUsd(infoTokens, receiveToken.address, receiveAmount, {\n overridePrice: triggerPriceUsd,\n });\n } else {\n convertedReceiveAmount = getTokenAmountFromUsd(infoTokens, receiveToken.address, receiveAmount);\n }\n\n // Check swap limits (max in / max out)\n if (isSwapAllowed && shouldSwap(collateralToken, receiveToken)) {\n const collateralInfo = getTokenInfo(infoTokens, collateralToken.address);\n const receiveTokenInfo = getTokenInfo(infoTokens, receiveToken.address);\n\n isNotEnoughReceiveTokenLiquidity =\n receiveTokenInfo.availableAmount.lt(convertedReceiveAmount) ||\n receiveTokenInfo.bufferAmount.gt(receiveTokenInfo.poolAmount.sub(convertedReceiveAmount));\n\n if (\n collateralInfo.maxUsdfAmount &&\n collateralInfo.maxUsdfAmount.gt(0) &&\n collateralInfo.usdfAmount &&\n collateralInfo.maxPrice\n ) {\n const usdfFromAmount = adjustForDecimals(receiveAmount, USD_DECIMALS, USDF_DECIMALS);\n const nextUsdfAmount = collateralInfo.usdfAmount.add(usdfFromAmount);\n\n if (nextUsdfAmount.gt(collateralInfo.maxUsdfAmount)) {\n isCollateralPoolCapacityExceeded = true;\n }\n }\n }\n\n if (isClosing) {\n nextCollateral = bigNumberify(0);\n } else {\n if (position.collateral) {\n nextCollateral = position.collateral;\n if (collateralDelta && collateralDelta.gt(0)) {\n nextCollateral = position.collateral.sub(collateralDelta);\n } else if (position.delta && position.delta.gt(0) && sizeDelta) {\n if (!position.hasProfit) {\n nextCollateral = nextCollateral.sub(adjustedDelta);\n }\n }\n }\n }\n\n if (fromAmount) {\n if (!isClosing && !keepLeverage) {\n nextLeverage = getLeverage({\n size: position.size,\n sizeDelta,\n collateral: position.collateral,\n entryFundingRate: position.entryFundingRate,\n cumulativeFundingRate: position.cumulativeFundingRate,\n hasProfit: nextHasProfit,\n delta: nextDelta,\n includeDelta: savedIsPnlInLeverage,\n });\n nextLiquidationPrice = getLiquidationPrice({\n isLong: position.isLong,\n size: position.size,\n sizeDelta,\n collateral: position.collateral,\n averagePrice: position.averagePrice,\n entryFundingRate: position.entryFundingRate,\n cumulativeFundingRate: position.cumulativeFundingRate,\n delta: nextDelta,\n hasProfit: nextHasProfit,\n includeDelta: true,\n });\n }\n }\n }\n\n const [deltaStr, deltaPercentageStr] = useMemo(() => {\n if (!position || !position.markPrice) {\n return [\"-\", \"-\"];\n }\n if (orderOption !== STOP) {\n const { pendingDelta, pendingDeltaPercentage, hasProfit } = calculatePositionDelta(\n position.markPrice,\n position,\n fromAmount\n );\n const { deltaStr, deltaPercentageStr } = getDeltaStr({\n delta: pendingDelta,\n deltaPercentage: pendingDeltaPercentage,\n hasProfit,\n });\n return [deltaStr, deltaPercentageStr];\n }\n if (!triggerPriceUsd || triggerPriceUsd.eq(0)) {\n return [\"-\", \"-\"];\n }\n\n const { pendingDelta, pendingDeltaPercentage, hasProfit } = calculatePositionDelta(\n triggerPriceUsd,\n position,\n fromAmount\n );\n\n const { deltaStr, deltaPercentageStr } = getDeltaStr({\n delta: pendingDelta,\n deltaPercentage: pendingDeltaPercentage,\n hasProfit,\n });\n return [deltaStr, deltaPercentageStr];\n }, [position, triggerPriceUsd, orderOption, fromAmount]);\n\n const getError = () => {\n if (IS_NETWORK_DISABLED[chainId]) {\n if (orderOption === STOP) return [t`Trigger order disabled, pending ${getChainName(chainId)} upgrade`];\n return [t`Position close disabled, pending ${getChainName(chainId)} upgrade`];\n }\n if (hasOutdatedUi) {\n return t`Page outdated, please refresh`;\n }\n if (!fromAmount) {\n return t`Enter an amount`;\n }\n if (nextLeverage && nextLeverage.eq(0)) {\n return t`Enter an amount`;\n }\n if (orderOption === STOP) {\n if (!triggerPriceUsd || triggerPriceUsd.eq(0)) {\n return t`Enter Price`;\n }\n if (position.isLong && triggerPriceUsd.lte(liquidationPrice)) {\n return t`Price below Liq. Price`;\n }\n if (!position.isLong && triggerPriceUsd.gte(liquidationPrice)) {\n return t`Price above Liq. Price`;\n }\n\n if (profitPrice && nextDelta.eq(0) && nextHasProfit) {\n return t`Invalid price, see warning`;\n }\n }\n\n if (isNotEnoughReceiveTokenLiquidity) {\n return t`Insufficient receive token liquidity`;\n }\n\n if (isCollateralPoolCapacityExceeded) {\n return t`${collateralToken.symbol} pool exceeded, can only Receive ${collateralToken.symbol}`;\n }\n\n if (!isClosing && position && position.size && fromAmount) {\n if (position.size.sub(fromAmount).lt(expandDecimals(10, USD_DECIMALS))) {\n return t`Leftover position below 10 USD`;\n }\n if (nextCollateral && nextCollateral.lt(expandDecimals(5, USD_DECIMALS))) {\n return t`Leftover collateral below 5 USD`;\n }\n }\n\n if (position && position.size && position.size.lt(fromAmount)) {\n return t`Max close amount exceeded`;\n }\n\n if (nextLeverage && nextLeverage.lt(1.1 * BASIS_POINTS_DIVISOR)) {\n return t`Min leverage: 1.1x`;\n }\n\n if (nextLeverage && nextLeverage.gt(30.5 * BASIS_POINTS_DIVISOR)) {\n return t`Max leverage: 30.5xt`;\n }\n\n if (hasPendingProfit && orderOption !== STOP && !isProfitWarningAccepted) {\n return t`Forfeit profit not checked`;\n }\n };\n\n const isPrimaryEnabled = () => {\n const error = getError();\n if (error) {\n return false;\n }\n if (isSubmitting) {\n return false;\n }\n if (needOrderBookApproval && isWaitingForPluginApproval) {\n return false;\n }\n if (isPluginApproving) {\n return false;\n }\n if (needPositionRouterApproval && isWaitingForPositionRouterApproval) {\n return false;\n }\n if (isPositionRouterApproving) {\n return false;\n }\n\n return true;\n };\n\n const hasPendingProfit = MIN_PROFIT_TIME > 0 && position.delta.eq(0) && position.pendingDelta.gt(0);\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n\n if (orderOption === STOP) {\n if (isSubmitting) return t`Creating Order...`;\n\n if (needOrderBookApproval && isWaitingForPluginApproval) {\n return t`Enabling Orders...`;\n }\n if (isPluginApproving) {\n return t`Enabling Orders...`;\n }\n if (needOrderBookApproval) {\n return t`Enable Orders`;\n }\n\n return t`Create Order`;\n }\n\n if (needPositionRouterApproval && isWaitingForPositionRouterApproval) {\n return t`Enabling Leverage...`;\n }\n\n if (isPositionRouterApproving) {\n return t`Enabling Leverage...`;\n }\n\n if (needPositionRouterApproval) {\n return t`Enable Leverage`;\n }\n\n if (hasPendingProfit) {\n return t`Close without profit`;\n }\n return isSubmitting ? t`Closing...` : t`Close`;\n };\n\n const resetForm = () => {\n setFromValue(\"\");\n setIsProfitWarningAccepted(false);\n };\n\n useEffect(() => {\n if (prevIsVisible !== isVisible) {\n resetForm();\n }\n }, [prevIsVisible, isVisible]);\n\n const onClickPrimary = async () => {\n if (needOrderBookApproval) {\n setOrdersToaOpen(true);\n return;\n }\n\n if (needPositionRouterApproval) {\n approvePositionRouter({\n sentMsg: t`Enable leverage sent.`,\n failMsg: t`Enable leverage failed.`,\n });\n return;\n }\n\n setIsSubmitting(true);\n\n const collateralTokenAddress = position.collateralToken.isNative\n ? nativeTokenAddress\n : position.collateralToken.address;\n const indexTokenAddress = position.indexToken.isNative ? nativeTokenAddress : position.indexToken.address;\n\n if (orderOption === STOP) {\n const triggerAboveThreshold = triggerPriceUsd.gt(position.markPrice);\n\n createDecreaseOrder(\n chainId,\n library,\n indexTokenAddress,\n sizeDelta,\n collateralTokenAddress,\n collateralDelta,\n position.isLong,\n triggerPriceUsd,\n triggerAboveThreshold,\n {\n sentMsg: t`Order submitted!`,\n successMsg: t`Order created!`,\n failMsg: t`Order creation failed.`,\n setPendingTxns,\n }\n )\n .then(() => {\n setFromValue(\"\");\n setIsVisible(false);\n })\n .finally(() => {\n setIsSubmitting(false);\n });\n return;\n }\n\n const priceBasisPoints = position.isLong\n ? BASIS_POINTS_DIVISOR - allowedSlippage\n : BASIS_POINTS_DIVISOR + allowedSlippage;\n const refPrice = position.isLong ? position.indexToken.minPrice : position.indexToken.maxPrice;\n let priceLimit = refPrice.mul(priceBasisPoints).div(BASIS_POINTS_DIVISOR);\n const minProfitExpiration = position.lastIncreasedTime + MIN_PROFIT_TIME;\n const minProfitTimeExpired = parseInt(Date.now() / 1000) > minProfitExpiration;\n\n if (nextHasProfit && !minProfitTimeExpired && !isProfitWarningAccepted) {\n if ((position.isLong && priceLimit.lt(profitPrice)) || (!position.isLong && priceLimit.gt(profitPrice))) {\n priceLimit = profitPrice;\n }\n }\n\n const tokenAddress0 = collateralTokenAddress === AddressZero ? nativeTokenAddress : collateralTokenAddress;\n\n const path = [tokenAddress0];\n\n const isUnwrap = receiveToken.address === AddressZero;\n const isSwap = receiveToken.address !== tokenAddress0;\n\n if (isSwap) {\n if (isUnwrap && tokenAddress0 !== nativeTokenAddress) {\n path.push(nativeTokenAddress);\n } else if (!isUnwrap) {\n path.push(receiveToken.address);\n }\n }\n\n const withdrawETH = isUnwrap;\n\n const params = [\n path, // _path\n indexTokenAddress, // _indexToken\n collateralDelta, // _collateralDelta\n sizeDelta, // _sizeDelta\n position.isLong, // _isLong\n account, // _receiver\n priceLimit, // _acceptablePrice\n 0, // _minOut\n minExecutionFee, // _executionFee\n withdrawETH, // _withdrawETH\n // AddressZero, // _callbackTarget\n ];\n const sizeDeltaUsd = formatAmount(sizeDelta, USD_DECIMALS, 2);\n const successMsg = t`Requested decrease of ${position.indexToken.symbol} ${longOrShortText} by ${sizeDeltaUsd} USD.`;\n\n const contract = new ethers.Contract(positionRouterAddress, PositionRouter.abi, library.getSigner());\n\n callContract(chainId, contract, \"createDecreasePosition\", params, {\n value: minExecutionFee,\n sentMsg: t`Close submitted!`,\n successMsg,\n failMsg: t`Close failed.`,\n setPendingTxns,\n // for Arbitrum, sometimes the successMsg shows after the position has already been executed\n // hide the success message for Arbitrum as a workaround\n hideSuccessMsg: chainId === ARBITRUM,\n })\n .then(async (res) => {\n setFromValue(\"\");\n setIsVisible(false);\n\n let nextSize = position.size.sub(sizeDelta);\n\n pendingPositions[position.key] = {\n updatedAt: Date.now(),\n pendingChanges: {\n size: nextSize,\n },\n };\n\n setPendingPositions({ ...pendingPositions });\n })\n .finally(() => {\n setIsSubmitting(false);\n });\n };\n\n const renderExistingOrderWarning = useCallback(() => {\n if (!existingOrder) {\n return;\n }\n const indexToken = getTokenInfo(infoTokens, existingOrder.indexToken);\n const sizeInToken = formatAmount(\n existingOrder.sizeDelta.mul(PRECISION).div(existingOrder.triggerPrice),\n USD_DECIMALS,\n 4,\n true\n );\n const prefix = existingOrder.triggerAboveThreshold ? TRIGGER_PREFIX_ABOVE : TRIGGER_PREFIX_BELOW;\n return (\n
\n \n You have an active order to decrease {longOrShortText} {sizeInToken} {indexToken.symbol} ($\n {formatAmount(existingOrder.sizeDelta, USD_DECIMALS, 2, true)}) at {prefix}{\" \"}\n {formatPrice(existingOrder.triggerPrice, true)}\n \n
\n );\n }, [existingOrder, infoTokens, longOrShortText]);\n\n function renderMinProfitWarning() {\n if (MIN_PROFIT_TIME === 0) {\n return null;\n }\n\n if (profitPrice && nextDelta.eq(0) && nextHasProfit) {\n const minProfitExpiration = position.lastIncreasedTime + MIN_PROFIT_TIME;\n\n if (orderOption === MARKET) {\n return (\n
\n \n Reducing the position at the current price will forfeit a \n \n pending profit\n {\" \"}\n of {deltaStr}.
\n
\n \n
\n Profit price: {position.isLong ? \">\" : \"<\"} ${formatPrice(profitPrice, true)}. This rule\n applies for the next {getTimeRemaining(minProfitExpiration)}, until {formatDateTime(minProfitExpiration)}.\n
\n
\n );\n }\n return (\n
\n \n This order will forfeit a \n profit of{\" \"}\n {deltaStr}.
\n
\n \n Profit price: {position.isLong ? \">\" : \"<\"} ${formatPrice(profitPrice, true)}. This rule\n applies for the next {getTimeRemaining(minProfitExpiration)}, until {formatDateTime(minProfitExpiration)}.\n \n
\n );\n }\n }\n\n const profitPrice = getProfitPrice(orderOption === MARKET ? position.markPrice : triggerPriceUsd, position);\n\n let triggerPricePrefix;\n if (triggerPriceUsd) {\n triggerPricePrefix = triggerPriceUsd.gt(position.markPrice) ? TRIGGER_PREFIX_ABOVE : TRIGGER_PREFIX_BELOW;\n }\n\n const shouldShowExistingOrderWarning = false;\n\n return (\n
\n {position && (\n \n {flagOrdersEnabled && (\n \n )}\n
\n
\n
\n {convertedAmountFormatted && (\n
\n \n Close: {convertedAmountFormatted} {position.collateralToken.symbol}\n \n
\n )}\n {!convertedAmountFormatted && t`Close`}\n
\n {maxAmount && (\n
setFromValue(maxAmountFormattedFree)}>\n Max: {maxAmountFormatted}\n
\n )}\n
\n
\n
\n setFromValue(e.target.value)}\n />\n {fromValue !== maxAmountFormattedFree && (\n {\n setFromValue(maxAmountFormattedFree);\n }}\n >\n MAX\n
\n )}\n
\n
USD
\n
\n
\n {orderOption === STOP && (\n
\n
\n
\n Price\n
\n {\n setTriggerPriceValue(formatPrice(position.markPrice, false, true));\n }}\n >\n Mark: {formatPrice(position.markPrice, true)}\n
\n
\n
\n
\n \n
\n
USD
\n
\n \n )}\n {renderMinProfitWarning()}\n {shouldShowExistingOrderWarning && renderExistingOrderWarning()}\n
\n {minExecutionFeeErrorMessage && (\n
{minExecutionFeeErrorMessage}
\n )}\n {hasPendingProfit && orderOption !== STOP && (\n
\n \n Forfeit profit\n \n
\n )}\n
\n \n \n Keep leverage at {formatAmount(position.leverage, 4, 2)}x\n \n \n
\n {orderOption === MARKET && (\n
\n \n \n Allow up to 1% slippage\n \n \n
\n )}\n {orderOption === MARKET && (\n
\n \n {\n return (\n \n You can change this in the settings menu on the top right of the page.\n
\n
\n Note that a low allowed slippage, e.g. less than 0.5%, may result in failed orders if prices\n are volatile.\n
\n );\n }}\n />\n
\n
\n )}\n {orderOption === STOP && (\n
\n
\n Trigger Price\n
\n
\n {!triggerPriceUsd && \"-\"}\n {triggerPriceUsd && `${triggerPricePrefix} ${formatPrice(triggerPriceUsd, true)}`}\n
\n
\n )}\n
\n
\n Mark Price\n
\n
${formatPrice(position.markPrice, true)}
\n
\n
\n
\n Entry Price\n
\n
${formatPrice(position.averagePrice, true)}
\n
\n
\n
\n Liq. Price\n
\n
\n {isClosing && orderOption !== STOP && \"-\"}\n {(!isClosing || orderOption === STOP) && (\n
\n {(!nextLiquidationPrice || nextLiquidationPrice.eq(liquidationPrice)) && (\n
{`$${formatPrice(liquidationPrice, true)}`}
\n )}\n {nextLiquidationPrice && !nextLiquidationPrice.eq(liquidationPrice) && (\n
\n
\n ${formatPrice(liquidationPrice, true)}\n \n
\n ${formatPrice(nextLiquidationPrice, true)}\n
\n )}\n
\n )}\n
\n
\n
\n
\n Size\n
\n
\n {position && position.size && fromAmount && (\n
\n
\n ${formatAmount(position.size, USD_DECIMALS, 2, true)}\n \n
\n ${formatAmount(position.size.sub(fromAmount), USD_DECIMALS, 2, true)}\n
\n )}\n {position && position.size && !fromAmount && (\n
${formatAmount(position.size, USD_DECIMALS, 2, true)}
\n )}\n
\n
\n
\n
\n Collateral ({collateralToken.symbol})\n
\n
\n {nextCollateral && !nextCollateral.eq(position.collateral) ? (\n
\n
\n ${formatAmount(position.collateral, USD_DECIMALS, 2, true)}\n \n
\n ${formatAmount(nextCollateral, USD_DECIMALS, 2, true)}\n
\n ) : (\n `$${formatAmount(position.collateral, USD_DECIMALS, 4, true)}`\n )}\n
\n
\n {!keepLeverage && (\n
\n
\n Leverage\n
\n
\n {isClosing && \"-\"}\n {!isClosing && (\n
\n {!nextLeverage &&
{formatAmount(position.leverage, 4, 2)}x
}\n {nextLeverage && (\n
\n
\n {formatAmount(position.leverage, 4, 2)}x\n \n
\n {formatAmount(nextLeverage, 4, 2)}x\n
\n )}\n
\n )}\n
\n
\n )}\n
\n
\n PnL\n
\n
\n {deltaStr} ({deltaPercentageStr})\n
\n
\n\n
\n
\n Fees\n
\n
\n \n {totalFees ? `$${formatAmount(totalFees.add(executionFeeUsd), USD_DECIMALS, 2, true)}` : \"-\"}\n
\n }\n renderContent={() => (\n
\n {fundingFee && (\n \n )}\n\n {positionFee && (\n \n )}\n\n {swapFee && (\n \n )}\n\n \n\n
\n\n
\n \n More Info about\n fees.\n \n
\n
\n )}\n />\n
\n
\n
\n
\n Receive\n
\n\n {!isSwapAllowed && receiveToken && (\n
\n {formatAmount(convertedReceiveAmount, receiveToken.decimals, 4, true)} {receiveToken.symbol} ($\n {formatAmount(receiveAmount, USD_DECIMALS, 2, true)})\n
\n )}\n\n {isSwapAllowed && receiveToken && (\n
\n {\n setSwapToToken(token);\n setSavedRecieveTokenAddress(token.address);\n }}\n tokens={toTokens}\n getTokenState={(tokenOptionInfo) => {\n if (!shouldSwap(collateralToken, tokenOptionInfo)) {\n return;\n }\n\n const convertedTokenAmount = getTokenAmountFromUsd(\n infoTokens,\n tokenOptionInfo.address,\n receiveAmount\n );\n\n const isNotEnoughLiquidity =\n tokenOptionInfo.availableAmount.lt(convertedTokenAmount) ||\n tokenOptionInfo.bufferAmount.gt(tokenOptionInfo.poolAmount.sub(convertedTokenAmount));\n\n if (isNotEnoughLiquidity) {\n const { maxIn, maxOut, maxInUsd, maxOutUsd } = getSwapLimits(\n infoTokens,\n collateralToken.address,\n tokenOptionInfo.address\n );\n\n const collateralInfo = getTokenInfo(infoTokens, collateralToken.address);\n\n return {\n disabled: true,\n message: (\n
\n Insufficient Available Liquidity to swap to {tokenOptionInfo.symbol}:\n
\n
\n \n
\n \n
\n ),\n };\n }\n }}\n infoTokens={infoTokens}\n showTokenImgInDropdown={true}\n selectedTokenLabel={\n \n {formatAmount(convertedReceiveAmount, receiveToken.decimals, 4, true)} \n {receiveToken.symbol} (${formatAmount(receiveAmount, USD_DECIMALS, 2, true)})\n \n }\n />\n
\n )}\n
\n \n
\n \n
\n \n )}\n \n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport useSWR from \"swr\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { ethers } from \"ethers\";\nimport { BsArrowRight } from \"react-icons/bs\";\n\nimport { USD_DECIMALS, BASIS_POINTS_DIVISOR, DEPOSIT_FEE, DUST_BNB, getLiquidationPrice } from \"lib/legacy\";\nimport { getContract } from \"config/contracts\";\nimport Tab from \"../Tab/Tab\";\nimport Modal from \"../Modal/Modal\";\n\nimport PositionRouter from \"abis/PositionRouter.json\";\nimport Token from \"abis/Token.json\";\nimport Tooltip from \"../Tooltip/Tooltip\";\n\nimport { getChainName, getConstant, IS_NETWORK_DISABLED } from \"config/chains\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { callContract, contractFetcher } from \"lib/contracts\";\nimport { helperToast } from \"lib/helperToast\";\nimport { getTokenInfo } from \"domain/tokens/utils\";\nimport { approveTokens, shouldRaiseGasError } from \"domain/tokens\";\nimport { usePrevious } from \"lib/usePrevious\";\nimport { bigNumberify, expandDecimals, formatAmount, formatAmountFree, formatPrice, parseValue } from \"lib/numbers\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst DEPOSIT = \"Deposit\";\nconst WITHDRAW = \"Withdraw\";\nconst EDIT_OPTIONS = [DEPOSIT, WITHDRAW];\nconst { AddressZero } = ethers.constants;\n\nexport default function PositionEditor(props) {\n const {\n pendingPositions,\n setPendingPositions,\n positionsMap,\n positionKey,\n isVisible,\n setIsVisible,\n infoTokens,\n active,\n account,\n library,\n collateralTokenAddress,\n pendingTxns,\n setPendingTxns,\n getUsd,\n getLeverage,\n savedIsPnlInLeverage,\n positionRouterApproved,\n isWaitingForPositionRouterApproval,\n isPositionRouterApproving,\n approvePositionRouter,\n chainId,\n minExecutionFee,\n minExecutionFeeUSD,\n minExecutionFeeErrorMessage,\n } = props;\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const position = positionsMap && positionKey ? positionsMap[positionKey] : undefined;\n const [option, setOption] = useState(DEPOSIT);\n const [fromValue, setFromValue] = useState(\"\");\n const [isApproving, setIsApproving] = useState(false);\n const [isSwapping, setIsSwapping] = useState(false);\n const prevIsVisible = usePrevious(isVisible);\n const longOrShortText = position?.isLong ? t`Long` : t`Short`;\n\n const routerAddress = getContract(chainId, \"Router\");\n const positionRouterAddress = getContract(chainId, \"PositionRouter\");\n\n const { data: tokenAllowance } = useSWR(\n [active, chainId, collateralTokenAddress, \"allowance\", account, routerAddress],\n {\n fetcher: contractFetcher(library, Token),\n }\n );\n\n // const { data: minExecutionFee } = useSWR([active, chainId, positionRouterAddress, \"minExecutionFee\"], {\n // fetcher: fetcher(library, PositionRouter),\n // });\n\n const isDeposit = option === DEPOSIT;\n const isWithdrawal = option === WITHDRAW;\n\n const needPositionRouterApproval = !positionRouterApproved;\n\n let collateralToken;\n let maxAmount;\n let maxAmountFormatted;\n let maxAmountFormattedFree;\n let fromAmount;\n let needApproval;\n\n let convertedAmount;\n let convertedAmountFormatted;\n\n let nextLeverage;\n let nextLeverageExcludingPnl;\n let liquidationPrice;\n let nextLiquidationPrice;\n let nextCollateral;\n\n let title;\n let collateralDelta;\n if (position) {\n title = t`Edit ${longOrShortText} ${position.indexToken.symbol}`;\n collateralToken = position.collateralToken;\n liquidationPrice = getLiquidationPrice(position);\n\n if (isDeposit) {\n fromAmount = parseValue(fromValue, collateralToken.decimals);\n maxAmount = collateralToken ? collateralToken.balance : bigNumberify(0);\n maxAmountFormatted = formatAmount(maxAmount, collateralToken.decimals, 4, true);\n maxAmountFormattedFree = formatAmountFree(maxAmount, collateralToken.decimals, 8);\n if (fromAmount) {\n convertedAmount = getUsd(fromAmount, position.collateralToken.address, false, infoTokens);\n convertedAmountFormatted = formatAmount(convertedAmount, USD_DECIMALS, 2);\n }\n } else {\n fromAmount = parseValue(fromValue, USD_DECIMALS);\n maxAmount = position.collateral;\n maxAmountFormatted = formatAmount(maxAmount, USD_DECIMALS, 2, true);\n maxAmountFormattedFree = formatAmountFree(maxAmount, USD_DECIMALS, 2);\n if (fromAmount) {\n convertedAmount = fromAmount.mul(expandDecimals(1, collateralToken.decimals)).div(collateralToken.maxPrice);\n convertedAmountFormatted = formatAmount(convertedAmount, collateralToken.decimals, 4, true);\n }\n }\n needApproval = isDeposit && tokenAllowance && fromAmount && fromAmount.gt(tokenAllowance);\n\n if (fromAmount) {\n collateralDelta = isDeposit ? convertedAmount : fromAmount;\n if (position.isLong) {\n collateralDelta = collateralDelta.mul(BASIS_POINTS_DIVISOR - DEPOSIT_FEE).div(BASIS_POINTS_DIVISOR);\n }\n nextLeverage = getLeverage({\n size: position.size,\n collateral: position.collateral,\n collateralDelta,\n increaseCollateral: isDeposit,\n entryFundingRate: position.entryFundingRate,\n cumulativeFundingRate: position.cumulativeFundingRate,\n hasProfit: position.hasProfit,\n delta: position.delta,\n includeDelta: savedIsPnlInLeverage,\n });\n nextLeverageExcludingPnl = getLeverage({\n size: position.size,\n collateral: position.collateral,\n collateralDelta,\n increaseCollateral: isDeposit,\n entryFundingRate: position.entryFundingRate,\n cumulativeFundingRate: position.cumulativeFundingRate,\n hasProfit: position.hasProfit,\n delta: position.delta,\n includeDelta: false,\n });\n\n nextLiquidationPrice = getLiquidationPrice({\n isLong: position.isLong,\n size: position.size,\n collateral: position.collateral,\n averagePrice: position.averagePrice,\n entryFundingRate: position.entryFundingRate,\n cumulativeFundingRate: position.cumulativeFundingRate,\n collateralDelta,\n increaseCollateral: isDeposit,\n });\n\n nextCollateral = isDeposit ? position.collateral.add(collateralDelta) : position.collateral.sub(collateralDelta);\n }\n }\n\n const getError = () => {\n if (IS_NETWORK_DISABLED[chainId]) {\n if (isDeposit) return [t`Deposit disabled, pending ${getChainName(chainId)} upgrade`];\n return [t`Withdraw disabled, pending ${getChainName(chainId)} upgrade`];\n }\n if (!fromAmount) {\n return t`Enter an amount`;\n }\n if (nextLeverage && nextLeverage.eq(0)) {\n return t`Enter an amount`;\n }\n\n if (!isDeposit && fromAmount) {\n if (fromAmount.gte(position.collateral)) {\n return t`Min order: 10 USD`;\n }\n if (position.collateral.sub(fromAmount).lt(expandDecimals(10, USD_DECIMALS))) {\n return t`Min order: 10 USD`;\n }\n }\n\n if (!isDeposit && fromAmount && nextLiquidationPrice) {\n if (position.isLong && position.markPrice.lt(nextLiquidationPrice)) {\n return t`Invalid liq. price`;\n }\n if (!position.isLong && position.markPrice.gt(nextLiquidationPrice)) {\n return t`Invalid liq. price`;\n }\n }\n\n if (nextLeverageExcludingPnl && nextLeverageExcludingPnl.lt(1.1 * BASIS_POINTS_DIVISOR)) {\n return t`Min leverage: 1.1x`;\n }\n\n if (nextLeverageExcludingPnl && nextLeverageExcludingPnl.gt(30.5 * BASIS_POINTS_DIVISOR)) {\n return t`Max leverage: 30x`;\n }\n };\n\n const isPrimaryEnabled = () => {\n const error = getError();\n if (error) {\n return false;\n }\n if (isSwapping) {\n return false;\n }\n if (needPositionRouterApproval && isWaitingForPositionRouterApproval) {\n return false;\n }\n if (isPositionRouterApproving) {\n return false;\n }\n\n return true;\n };\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n if (isSwapping) {\n if (isDeposit) {\n return t`Depositing...`;\n }\n return t`Withdrawing...`;\n }\n\n if (isApproving) {\n return t`Approving ${position.collateralToken.symbol}...`;\n }\n if (needApproval) {\n return t`Approve ${position.collateralToken.symbol}`;\n }\n\n if (needPositionRouterApproval && isWaitingForPositionRouterApproval) {\n return t`Enabling Leverage`;\n }\n\n if (isPositionRouterApproving) {\n return t`Enabling Leverage...`;\n }\n\n if (needPositionRouterApproval) {\n return t`Enable Leverage`;\n }\n\n if (isDeposit) {\n return t`Deposit`;\n }\n\n return t`Withdraw`;\n };\n\n const resetForm = () => {\n setFromValue(\"\");\n };\n\n useEffect(() => {\n if (prevIsVisible !== isVisible) {\n resetForm();\n }\n }, [prevIsVisible, isVisible]);\n\n const depositCollateral = async () => {\n setIsSwapping(true);\n const tokenAddress0 = collateralTokenAddress === AddressZero ? nativeTokenAddress : collateralTokenAddress;\n const path = [tokenAddress0];\n const indexTokenAddress =\n position.indexToken.address === AddressZero ? nativeTokenAddress : position.indexToken.address;\n\n const priceBasisPoints = position.isLong ? 11000 : 9000;\n const priceLimit = position.indexToken.maxPrice.mul(priceBasisPoints).div(10000);\n\n const referralCode = ethers.constants.HashZero;\n let params = [\n path, // _path\n indexTokenAddress, // _indexToken\n fromAmount, // _amountIn\n 0, // _minOut\n 0, // _sizeDelta\n position.isLong, // _isLong\n priceLimit, // _acceptablePrice\n minExecutionFee, // _executionFee\n referralCode, // _referralCode\n // AddressZero, // _callbackTarget\n ];\n\n let method = \"createIncreasePosition\";\n let value = minExecutionFee;\n if (collateralTokenAddress === AddressZero) {\n method = \"createIncreasePositionETH\";\n value = fromAmount.add(minExecutionFee);\n params = [\n path, // _path\n indexTokenAddress, // _indexToken\n 0, // _minOut\n 0, // _sizeDelta\n position.isLong, // _isLong\n priceLimit, // _acceptablePrice\n minExecutionFee, // _executionFee\n referralCode, // _referralCode\n // AddressZero, // _callbackTarget\n ];\n }\n\n if (shouldRaiseGasError(getTokenInfo(infoTokens, collateralTokenAddress), fromAmount)) {\n setIsSwapping(false);\n helperToast.error(t`Leave at least ${formatAmount(DUST_BNB, 18, 3)} ETH for gas`);\n return;\n }\n\n const contract = new ethers.Contract(positionRouterAddress, PositionRouter.abi, library.getSigner());\n callContract(chainId, contract, method, params, {\n value,\n sentMsg: t`Deposit submitted.`,\n successMsg: t`Requested deposit of ${formatAmount(fromAmount, position.collateralToken.decimals, 4)} ${\n position.collateralToken.symbol\n } into ${position.indexToken.symbol} ${longOrShortText}.`,\n failMsg: t`Deposit failed.`,\n setPendingTxns,\n })\n .then(async (res) => {\n setFromValue(\"\");\n setIsVisible(false);\n\n pendingPositions[position.key] = {\n updatedAt: Date.now(),\n pendingChanges: {\n collateralSnapshot: position.collateral,\n expectingCollateralChange: true,\n },\n };\n\n setPendingPositions({ ...pendingPositions });\n })\n .finally(() => {\n setIsSwapping(false);\n });\n };\n\n const withdrawCollateral = async () => {\n setIsSwapping(true);\n const tokenAddress0 = collateralTokenAddress === AddressZero ? nativeTokenAddress : collateralTokenAddress;\n const indexTokenAddress =\n position.indexToken.address === AddressZero ? nativeTokenAddress : position.indexToken.address;\n const priceBasisPoints = position.isLong ? 9000 : 11000;\n const priceLimit = position.indexToken.maxPrice.mul(priceBasisPoints).div(10000);\n\n const withdrawETH = collateralTokenAddress === AddressZero || collateralTokenAddress === nativeTokenAddress;\n const params = [\n [tokenAddress0], // _path\n indexTokenAddress, // _indexToken\n fromAmount, // _collateralDelta\n 0, // _sizeDelta\n position.isLong, // _isLong\n account, // _receiver\n priceLimit, // _acceptablePrice\n 0, // _minOut\n minExecutionFee, // _executionFee\n withdrawETH, // _withdrawETH\n // AddressZero, // _callbackTarget\n ];\n\n const method = \"createDecreasePosition\";\n\n const contract = new ethers.Contract(positionRouterAddress, PositionRouter.abi, library.getSigner());\n callContract(chainId, contract, method, params, {\n value: minExecutionFee,\n sentMsg: t`Withdrawal submitted.`,\n successMsg: t`Requested withdrawal of ${formatAmount(fromAmount, USD_DECIMALS, 2)} USD from ${\n position.indexToken.symbol\n } ${longOrShortText}.`,\n failMsg: t`Withdrawal failed.`,\n setPendingTxns,\n })\n .then(async (res) => {\n setFromValue(\"\");\n setIsVisible(false);\n\n pendingPositions[position.key] = {\n updatedAt: Date.now(),\n pendingChanges: {\n collateralSnapshot: position.collateral,\n expectingCollateralChange: true,\n },\n };\n })\n .finally(() => {\n setIsSwapping(false);\n });\n };\n\n const onClickPrimary = () => {\n if (needApproval) {\n approveTokens({\n setIsApproving,\n library,\n tokenAddress: collateralTokenAddress,\n spender: routerAddress,\n chainId: chainId,\n infoTokens,\n getTokenInfo,\n pendingTxns,\n setPendingTxns,\n });\n return;\n }\n\n if (needPositionRouterApproval) {\n approvePositionRouter({\n sentMsg: isDeposit ? t`Enable deposit sent.` : t`Enable withdraw sent.`,\n failMsg: isDeposit ? t`Enable deposit failed.` : t`Enable withdraw failed.`,\n });\n return;\n }\n\n if (isDeposit) {\n depositCollateral();\n return;\n }\n\n withdrawCollateral();\n };\n const nativeTokenSymbol = getConstant(chainId, \"nativeTokenSymbol\");\n const EDIT_OPTIONS_LABELS = {\n [DEPOSIT]: t`Deposit`,\n [WITHDRAW]: t`Withdraw`,\n };\n\n return (\n
\n {position && (\n \n
\n \n {(isDeposit || isWithdrawal) && (\n
\n
\n
\n
\n {convertedAmountFormatted && (\n
\n {isDeposit ? t`Deposit` : t`Withdraw`}: {convertedAmountFormatted}{\" \"}\n {isDeposit ? \"USD\" : position.collateralToken.symbol}\n
\n )}\n {!convertedAmountFormatted && `${isDeposit ? t`Deposit` : t`Withdraw`}`}\n
\n {maxAmount && (\n
setFromValue(maxAmountFormattedFree)}>\n Max: {maxAmountFormatted}\n
\n )}\n
\n
\n
\n setFromValue(e.target.value)}\n />\n {fromValue !== maxAmountFormattedFree && (\n {\n setFromValue(maxAmountFormattedFree);\n }}\n >\n MAX\n
\n )}\n
\n
\n {isDeposit ? position.collateralToken.symbol : \"USD\"}\n
\n
\n
\n
\n {minExecutionFeeErrorMessage && (\n
{minExecutionFeeErrorMessage}
\n )}\n
\n
\n Size\n
\n
{formatAmount(position.size, USD_DECIMALS, 2, true)} USD
\n
\n
\n
\n Collateral\n
\n
\n {!nextCollateral &&
${formatAmount(position.collateral, USD_DECIMALS, 2, true)}
}\n {nextCollateral && (\n
\n
\n ${formatAmount(position.collateral, USD_DECIMALS, 2, true)}\n \n
\n ${formatAmount(nextCollateral, USD_DECIMALS, 2, true)}\n
\n )}\n
\n
\n
\n
\n Leverage\n
\n
\n {!nextLeverage &&
{formatAmount(position.leverage, 4, 2, true)}x
}\n {nextLeverage && (\n
\n
\n {formatAmount(position.leverage, 4, 2, true)}x\n \n
\n {formatAmount(nextLeverage, 4, 2, true)}x\n
\n )}\n
\n
\n
\n
\n Mark Price\n
\n
${formatPrice(position.markPrice, true)}
\n
\n
\n
\n Liq. Price\n
\n
\n {!nextLiquidationPrice && (\n
\n {!fromAmount && `$${formatPrice(liquidationPrice, true)}`}\n {fromAmount && \"-\"}\n
\n )}\n {nextLiquidationPrice && (\n
\n
\n ${formatPrice(liquidationPrice, true)}\n \n
\n ${formatPrice(nextLiquidationPrice, true)}\n
\n )}\n
\n
\n
\n
\n Execution Fee\n
\n
\n {\n const depositOrWithdrawalText = isDeposit ? t`deposit` : t`withdrawal`;\n return (\n <>\n \n
\n \n This is the network cost required to execute the {depositOrWithdrawalText}.\n
\n
\n \n More Info\n \n
\n \n );\n }}\n />\n
\n
\n
\n\n
\n \n {getPrimaryText()}\n \n
\n
\n )}\n
\n \n )}\n \n );\n}\n","import \"./SpinningLoader.css\";\n\nimport { ImSpinner2 } from \"react-icons/im\";\n\nfunction SpinningLoader({ size = \"1.25rem\" }) {\n return ;\n}\n\nexport default SpinningLoader;\n","export default async function downloadImage(dataURI: string, filename: string) {\n const blob = await (await fetch(dataURI)).blob();\n if (typeof window.navigator.msSaveBlob !== \"undefined\") {\n // IE doesn't allow using a blob object directly as link href.\n // Workaround for \"HTML7007: One or more blob URLs were\n // revoked by closing the blob for which they were created.\n // These URLs will no longer resolve as the data backing\n // the URL has been freed.\"\n window.navigator.msSaveBlob(blob, filename);\n return;\n }\n // Other browsers\n // Create a link pointing to the ObjectURL containing the blob\n const blobURL = window.URL.createObjectURL(blob);\n const tempLink = document.createElement(\"a\");\n tempLink.style.display = \"none\";\n tempLink.href = blobURL;\n tempLink.setAttribute(\"download\", filename);\n // Safari thinks _blank anchor are pop ups. We only want to set _blank\n // target if the browser does not support the HTML5 download attribute.\n // This allows you to download files in desktop safari if pop up blocking\n // is enabled.\n if (typeof tempLink.download === \"undefined\") {\n tempLink.setAttribute(\"target\", \"_blank\");\n }\n document.body.appendChild(tempLink);\n tempLink.click();\n document.body.removeChild(tempLink);\n setTimeout(() => {\n // For Firefox it is necessary to delay revoking the ObjectURL\n window.URL.revokeObjectURL(blobURL);\n }, 100);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { t, Trans } from \"@lingui/macro\";\nimport { toJpeg } from \"html-to-image\";\nimport cx from \"classnames\";\nimport { BiCopy } from \"react-icons/bi\";\nimport { RiFileDownloadLine } from \"react-icons/ri\";\nimport { FiTwitter } from \"react-icons/fi\";\nimport { useCopyToClipboard, useMedia } from \"react-use\";\nimport Modal from \"../Modal/Modal\";\n// import fxdxLogo from \"img/fxdx-logo-with-name.svg\";\nimport fxdxLogo from \"img/logo.png\";\nimport \"./PositionShare.css\";\nimport { QRCodeSVG } from \"qrcode.react\";\nimport { getHomeUrl, getRootShareApiUrl, getTwitterIntentURL } from \"lib/legacy\";\nimport { useAffiliateCodes } from \"domain/referrals\";\nimport SpinningLoader from \"../Common/SpinningLoader\";\nimport useLoadImage from \"lib/useLoadImage\";\nimport shareBgImg from \"img/position-share-bg.png\";\nimport { helperToast } from \"lib/helperToast\";\nimport { formatAmount, formatPrice } from \"lib/numbers\";\nimport downloadImage from \"lib/downloadImage\";\nconst ROOT_SHARE_URL = getRootShareApiUrl();\nconst UPLOAD_URL = ROOT_SHARE_URL + \"/api/upload\";\nconst UPLOAD_SHARE = ROOT_SHARE_URL + \"/api/s\";\nconst config = { quality: 0.95, canvasWidth: 518, canvasHeight: 292, type: \"image/jpeg\" };\n\nfunction getShareURL(imageInfo, ref) {\n if (!imageInfo) return;\n let url = `${UPLOAD_SHARE}?id=${imageInfo.id}`;\n if (ref.success && ref.code) {\n url = url + `&ref=${ref.code}`;\n }\n return url;\n}\n\nfunction PositionShare({ setIsPositionShareModalOpen, isPositionShareModalOpen, positionToShare, account, chainId }) {\n const userAffiliateCode = useAffiliateCodes(chainId, account);\n const [uploadedImageInfo, setUploadedImageInfo] = useState();\n const [uploadedImageError, setUploadedImageError] = useState();\n const [, copyToClipboard] = useCopyToClipboard();\n const sharePositionBgImg = useLoadImage(shareBgImg);\n const positionRef = useRef();\n const tweetLink = getTwitterIntentURL(\n `Latest $${positionToShare?.indexToken?.symbol} trade on @fxdxdex`,\n getShareURL(uploadedImageInfo, userAffiliateCode)\n );\n\n useEffect(() => {\n (async function () {\n const element = positionRef.current;\n if (element && userAffiliateCode.success && sharePositionBgImg && positionToShare) {\n // We have to call the toJpeg function multiple times to make sure the canvas renders all the elements like background image\n // @refer https://github.com/tsayen/dom-to-image/issues/343#issuecomment-652831863\n const image = await toJpeg(element, config)\n .then(() => toJpeg(element, config))\n .then(() => toJpeg(element, config));\n try {\n const imageInfo = await fetch(UPLOAD_URL, { method: \"POST\", body: image }).then((res) => res.json());\n setUploadedImageInfo(imageInfo);\n } catch {\n setUploadedImageInfo(null);\n setUploadedImageError(t`Image generation error, please refresh and try again.`);\n }\n }\n })();\n }, [userAffiliateCode, sharePositionBgImg, positionToShare]);\n\n async function handleDownload() {\n const element = positionRef.current;\n if (!element) return;\n const imgBlob = await toJpeg(element, config)\n .then(() => toJpeg(element, config))\n .then(() => toJpeg(element, config));\n downloadImage(imgBlob, \"share.jpeg\");\n }\n\n function handleCopy() {\n if (!uploadedImageInfo) return;\n const url = getShareURL(uploadedImageInfo, userAffiliateCode);\n copyToClipboard(url);\n helperToast.success(t`Link copied to clipboard.`);\n }\n return (\n \n \n {uploadedImageError && {uploadedImageError}}\n\n
\n \n \n
\n \n \n Tweet\n \n
\n
\n \n );\n}\n\nfunction PositionShareCard({\n positionRef,\n position,\n userAffiliateCode,\n uploadedImageInfo,\n uploadedImageError,\n sharePositionBgImg,\n}) {\n const isMobile = useMedia(\"(max-width: 400px)\");\n const { code, success } = userAffiliateCode;\n const { deltaAfterFeesPercentageStr, isLong, leverage, indexToken, averagePrice, markPrice } = position;\n\n const homeURL = getHomeUrl();\n return (\n
\n
\n \"fxdx\n
    \n
  • {isLong ? \"LONG\" : \"SHORT\"}
  • \n
  • {formatAmount(leverage, 4, 2, true)}x 
  • \n
  • {indexToken.symbol} USD
  • \n
\n

{deltaAfterFeesPercentageStr}

\n
\n
\n

Entry Price

\n

${formatPrice(averagePrice, true)}

\n
\n
\n

Index Price

\n

${formatPrice(markPrice, true)}

\n
\n
\n
\n
\n \n
\n
\n {success && code ? (\n <>\n

Referral Code:

\n

{code}

\n \n ) : (\n

https://fxdx.exchange

\n )}\n
\n
\n
\n {!uploadedImageInfo && !uploadedImageError && (\n
\n
\n \n

\n Generating shareable image...\n

\n
\n
\n )}\n
\n );\n}\n\nexport default PositionShare;\n","import { useEffect, useState } from \"react\";\n\nexport default function useLoadImage(src) {\n const [sourceLoaded, setSourceLoaded] = useState(null);\n\n useEffect(() => {\n const img = new Image();\n img.src = src;\n img.onload = () => setSourceLoaded(src);\n }, [src]);\n\n return sourceLoaded;\n}\n","import { Menu } from \"@headlessui/react\";\nimport { Trans } from \"@lingui/macro\";\nimport { HiDotsVertical } from \"react-icons/hi\";\nimport { AiOutlineEdit } from \"react-icons/ai\";\nimport { BiSelectMultiple } from \"react-icons/bi\";\n// import { RiShareBoxFill } from \"react-icons/ri\";\nimport \"./PositionDropdown.css\";\n\nfunction PositionDropdown({ handleEditCollateral, handleShare, handleMarketSelect }) {\n return (\n \n \n \n \n
\n \n \n
\n \n

\n Edit Collateral\n

\n
\n
\n \n
\n \n

\n Select Market\n

\n
\n
\n {/* \n
\n \n

\n Share Position\n

\n
\n
*/}\n
\n
\n
\n );\n}\n\nexport default PositionDropdown;\n","import React, { useState } from \"react\";\nimport cx from \"classnames\";\nimport { Trans, t, select } from \"@lingui/macro\";\nimport Tooltip from \"../Tooltip/Tooltip\";\nimport PositionSeller from \"./PositionSeller\";\nimport PositionEditor from \"./PositionEditor\";\nimport OrdersToa from \"./OrdersToa\";\n\nimport { ImSpinner2 } from \"react-icons/im\";\n\nimport {\n getLiquidationPrice,\n getLeverage,\n getOrderError,\n USD_DECIMALS,\n FUNDING_RATE_PRECISION,\n SWAP,\n LONG,\n SHORT,\n INCREASE,\n DECREASE,\n} from \"lib/legacy\";\nimport PositionShare from \"./PositionShare\";\nimport PositionDropdown from \"./PositionDropdown\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { helperToast } from \"lib/helperToast\";\nimport { getUsd } from \"domain/tokens/utils\";\nimport { bigNumberify, formatAmount, formatPrice } from \"lib/numbers\";\nimport { AiOutlineEdit } from \"react-icons/ai\";\n\nconst getOrdersForPosition = (account, position, orders, nativeTokenAddress) => {\n if (!orders || orders.length === 0) {\n return [];\n }\n /* eslint-disable array-callback-return */\n return orders\n .filter((order) => {\n if (order.type === SWAP) {\n return false;\n }\n const hasMatchingIndexToken =\n order.indexToken === nativeTokenAddress\n ? position.indexToken.isNative\n : order.indexToken === position.indexToken.address;\n const hasMatchingCollateralToken =\n order.collateralToken === nativeTokenAddress\n ? position.collateralToken.isNative\n : order.collateralToken === position.collateralToken.address;\n if (order.isLong === position.isLong && hasMatchingIndexToken && hasMatchingCollateralToken) {\n return true;\n }\n })\n .map((order) => {\n order.error = getOrderError(account, order, undefined, position);\n if (order.type === DECREASE && order.sizeDelta.gt(position.size)) {\n order.error = t`Order size is bigger than position, will only be executable if position increases`;\n }\n return order;\n });\n};\n\nexport default function PositionsList(props) {\n const {\n pendingPositions,\n setPendingPositions,\n positions,\n positionsDataIsLoading,\n positionsMap,\n infoTokens,\n active,\n account,\n library,\n pendingTxns,\n setPendingTxns,\n setListSection,\n flagOrdersEnabled,\n savedIsPnlInLeverage,\n chainId,\n nativeTokenAddress,\n orders,\n setIsWaitingForPluginApproval,\n approveOrderBook,\n isPluginApproving,\n isWaitingForPluginApproval,\n orderBookApproved,\n positionRouterApproved,\n isWaitingForPositionRouterApproval,\n isPositionRouterApproving,\n approvePositionRouter,\n showPnlAfterFees,\n setMarket,\n minExecutionFee,\n minExecutionFeeUSD,\n minExecutionFeeErrorMessage,\n usdfSupply,\n totalTokenWeights,\n } = props;\n\n const [positionToEditKey, setPositionToEditKey] = useState(undefined);\n const [positionToSellKey, setPositionToSellKey] = useState(undefined);\n const [positionToShare, setPositionToShare] = useState(null);\n const [isPositionEditorVisible, setIsPositionEditorVisible] = useState(undefined);\n const [isPositionSellerVisible, setIsPositionSellerVisible] = useState(undefined);\n const [collateralTokenAddress, setCollateralTokenAddress] = useState(undefined);\n const [isPositionShareModalOpen, setIsPositionShareModalOpen] = useState(false);\n const [ordersToaOpen, setOrdersToaOpen] = useState(false);\n const [isHigherSlippageAllowed, setIsHigherSlippageAllowed] = useState(false);\n\n const editPosition = (position) => {\n setCollateralTokenAddress(position.collateralToken.address);\n setPositionToEditKey(position.key);\n setIsPositionEditorVisible(true);\n };\n\n const sellPosition = (position) => {\n setPositionToSellKey(position.key);\n setIsPositionSellerVisible(true);\n setIsHigherSlippageAllowed(false);\n };\n\n const onPositionClick = (position) => {\n helperToast.success(\n t`${select(position.isLong, { true: \"Long\", false: \"Short\" })} ${position.indexToken.symbol} market selected`\n );\n setMarket(position.isLong ? LONG : SHORT, position.indexToken.address);\n };\n\n return (\n
\n \n {ordersToaOpen && (\n \n )}\n {isPositionShareModalOpen && (\n \n )}\n {ordersToaOpen && (\n \n )}\n {isPositionSellerVisible && (\n \n )}\n {positions && (\n
\n
\n {positions.length === 0 && positionsDataIsLoading && (\n
\n Loading...\n
\n )}\n {positions.length === 0 && !positionsDataIsLoading && (\n
\n No open positions\n
\n )}\n {positions.map((position) => {\n const positionOrders = getOrdersForPosition(account, position, orders, nativeTokenAddress);\n const liquidationPrice = getLiquidationPrice(position);\n const hasPositionProfit = position[showPnlAfterFees ? \"hasProfitAfterFees\" : \"hasProfit\"];\n const positionDelta =\n position[showPnlAfterFees ? \"pendingDeltaAfterFees\" : \"pendingDelta\"] || bigNumberify(0);\n let borrowFeeUSD;\n if (position.collateralToken && position.collateralToken.fundingRate) {\n const borrowFeeRate = position.collateralToken.fundingRate\n .mul(position.size)\n .mul(24)\n .div(FUNDING_RATE_PRECISION);\n borrowFeeUSD = formatAmount(borrowFeeRate, USD_DECIMALS, 2);\n }\n\n return (\n
\n
\n {position.indexToken.symbol}\n
\n
\n
\n
\n
\n Leverage\n
\n
\n {formatAmount(position.leverage, 4, 2, true)}x \n \n {position.isLong ? t`Long` : t`Short`}\n \n
\n
\n
\n
\n Size\n
\n
${formatAmount(position.size, USD_DECIMALS, 2, true)}
\n
\n
\n
\n Collateral\n
\n
\n {\n return (\n <>\n {position.hasLowCollateral && (\n
\n \n WARNING: This position has a low amount of collateral after deducting borrowing\n fees, deposit more collateral to reduce the position's liquidation risk.\n \n
\n
\n
\n )}\n \n \n \n \n Use the Edit Collateral icon to deposit or withdraw collateral.\n \n \n );\n }}\n />\n editPosition(position)}>\n \n \n
\n
\n
\n
\n PnL\n
\n
\n \n {position.deltaStr} ({position.deltaPercentageStr})\n \n
\n
\n
\n
\n Net Value\n
\n
\n {\n return (\n <>\n {showPnlAfterFees\n ? t`Net Value: Initial Collateral - Fees + PnL`\n : t`Net Value: Initial Collateral - Borrow Fee + PnL`}\n
\n
\n \n \n \n \n \n \n );\n }}\n />\n
\n
\n
\n
\n Orders\n
\n
\n {positionOrders.length === 0 && \"None\"}\n {positionOrders.map((order) => {\n const orderText = () => (\n <>\n {order.triggerAboveThreshold ? \">\" : \"<\"} {formatPrice(order.triggerPrice, true)}:\n {order.type === INCREASE ? \" +\" : \" -\"}${formatAmount(order.sizeDelta, USD_DECIMALS, 2, true)}\n \n );\n if (order.error) {\n return (\n
\n {order.error}}\n />\n
\n );\n } else {\n return (\n
\n {orderText()}\n
\n );\n }\n })}\n
\n
\n
\n
\n
\n
\n
\n Mark Price\n
\n
${formatPrice(position.markPrice, true)}
\n
\n
\n
\n Entry Price\n
\n
${formatPrice(position.averagePrice, true)}
\n
\n
\n
\n Liq. Price\n
\n
${formatPrice(liquidationPrice, true)}
\n
\n
\n
\n
\n sellPosition(position)}\n >\n Close\n \n editPosition(position)}\n >\n Edit Collateral\n \n {/* {\n setPositionToShare(position);\n setIsPositionShareModalOpen(true);\n }}\n disabled={position.size.eq(0)}\n >\n Share\n */}\n
\n
\n );\n })}\n
\n
\n )}\n \n \n \n \n \n \n \n \n \n \n \n \n \n {positions.length === 0 && positionsDataIsLoading && (\n \n \n \n )}\n {positions.length === 0 && !positionsDataIsLoading && (\n \n \n \n )}\n {positions.map((position) => {\n const liquidationPrice = getLiquidationPrice(position) || bigNumberify(0);\n const positionOrders = getOrdersForPosition(account, position, orders, nativeTokenAddress);\n const hasOrderError = !!positionOrders.find((order) => order.error);\n const hasPositionProfit = position[showPnlAfterFees ? \"hasProfitAfterFees\" : \"hasProfit\"];\n const positionDelta =\n position[showPnlAfterFees ? \"pendingDeltaAfterFees\" : \"pendingDelta\"] || bigNumberify(0);\n let borrowFeeUSD;\n if (position.collateralToken && position.collateralToken.fundingRate) {\n const borrowFeeRate = position.collateralToken.fundingRate\n .mul(position.size)\n .mul(24)\n .div(FUNDING_RATE_PRECISION);\n borrowFeeUSD = formatAmount(borrowFeeRate, USD_DECIMALS, 2);\n }\n\n return (\n \n \n \n \n \n \n \n \n\n \n \n \n );\n })}\n \n
\n Position\n \n Net Value\n \n Size\n \n Collateral\n \n Mark Price\n \n Entry Price\n \n Liq. Price\n
\n
Loading...
\n
\n
\n No open positions\n
\n
onPositionClick(position)}>\n
\n {position.indexToken.symbol}\n {position.hasPendingChanges && }\n
\n
\n {position.leverage && (\n {formatAmount(position.leverage, 4, 2, true)}x \n )}\n \n {position.isLong ? t`Long` : t`Short`}\n \n
\n
\n
\n {!position.netValue && t`Opening...`}\n {position.netValue && (\n {\n return (\n <>\n {showPnlAfterFees\n ? t`Net Value: Initial Collateral - Fees + PnL`\n : t`Net Value: Initial Collateral - Borrow Fee + PnL`}\n
\n
\n \n \n \n \n \n \n );\n }}\n />\n )}\n
\n {position.deltaStr && (\n \n {position.deltaStr} ({position.deltaPercentageStr})\n \n )}\n
\n
${formatAmount(position.size, USD_DECIMALS, 2, true)}
\n {positionOrders.length > 0 && (\n
setListSection && setListSection(\"Orders\")}>\n {\n return (\n <>\n \n Active Orders\n \n {positionOrders.map((order) => {\n return (\n \n {order.triggerAboveThreshold ? \">\" : \"<\"}{\" \"}\n {formatPrice(order.triggerPrice, true)}:\n {order.type === INCREASE ? \" +\" : \" -\"}${formatAmount(order.sizeDelta, USD_DECIMALS, 2, true)}\n {order.error && (\n <>\n , {order.error}\n \n )}\n
\n );\n })}\n \n );\n }}\n />\n \n )}\n
\n
\n {\n return (\n <>\n {position.hasLowCollateral && (\n
\n \n WARNING: This position has a low amount of collateral after deducting borrowing fees,\n deposit more collateral to reduce the position's liquidation risk.\n \n
\n
\n
\n )}\n\n \n \n \n
\n Use the Edit Collateral icon to deposit or withdraw collateral.\n \n );\n }}\n />\n editPosition(position)}>\n \n \n
\n
onPositionClick(position)}>\n {\n return (\n
\n \n Click on a row to select the position's market, then use the swap box to increase your\n position size if needed.\n \n
\n
\n \n Use the \"Close\" button to reduce your position size, or to set stop-loss / take-profit\n orders.\n \n
\n );\n }}\n />\n
onPositionClick(position)}>\n ${formatPrice(position.averagePrice, true)}\n onPositionClick(position)}>\n ${formatPrice(liquidationPrice, true)}\n \n sellPosition(position)}\n disabled={position.size.eq(0)}\n >\n Close\n \n \n {\n editPosition(position);\n }}\n handleShare={() => {\n setPositionToShare(position);\n setIsPositionShareModalOpen(true);\n }}\n handleMarketSelect={() => {\n onPositionClick(position);\n }}\n />\n
\n
\n );\n}\n","import React, { useState, useMemo } from \"react\";\nimport { BsArrowRight } from \"react-icons/bs\";\n\nimport {\n PRECISION,\n USD_DECIMALS,\n SWAP,\n DECREASE,\n INCREASE,\n isTriggerRatioInverted,\n getNextToAmount,\n getExchangeRate,\n getExchangeRateDisplay,\n calculatePositionDelta,\n getLiquidationPrice,\n} from \"lib/legacy\";\nimport { updateSwapOrder, updateIncreaseOrder, updateDecreaseOrder } from \"domain/legacy\";\nimport Modal from \"../Modal/Modal\";\nimport ExchangeInfoRow from \"./ExchangeInfoRow\";\nimport { getContract } from \"config/contracts\";\nimport { TRIGGER_PREFIX_ABOVE, TRIGGER_PREFIX_BELOW } from \"config/ui\";\nimport { getTokenInfo } from \"domain/tokens/utils\";\nimport { bigNumberify, formatAmount, formatAmountFree, formatPrice, parseValue } from \"lib/numbers\";\nimport { useChainId } from \"lib/chains\";\nimport { t, Trans } from \"@lingui/macro\";\n\nexport default function OrderEditor(props) {\n const {\n account,\n order,\n setEditingOrder,\n infoTokens,\n pendingTxns,\n setPendingTxns,\n library,\n totalTokenWeights,\n usdfSupply,\n getPositionForOrder,\n positionsMap,\n savedShouldDisableValidationForTesting,\n } = props;\n\n const { chainId } = useChainId();\n\n const position = order.type !== SWAP ? getPositionForOrder(account, order, positionsMap) : null;\n const liquidationPrice = order.type === DECREASE && position ? getLiquidationPrice(position) : null;\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const fromTokenInfo = order.type === SWAP\n ? getTokenInfo(infoTokens, order.path[0], true, nativeTokenAddress)\n : null;\n const toTokenInfo = order.type === SWAP\n ? getTokenInfo(infoTokens, order.path[order.path.length - 1], order.shouldUnwrap, nativeTokenAddress)\n : null;\n\n const triggerRatioInverted = useMemo(() => {\n if (order.type !== SWAP) {\n return null;\n }\n\n return isTriggerRatioInverted(fromTokenInfo, toTokenInfo);\n }, [toTokenInfo, fromTokenInfo, order.type]);\n\n let initialRatio = 0;\n if (order.triggerRatio) {\n initialRatio = triggerRatioInverted ? PRECISION.mul(PRECISION).div(order.triggerRatio) : order.triggerRatio;\n }\n const [triggerRatioValue, setTriggerRatioValue] = useState(formatAmountFree(initialRatio, USD_DECIMALS, 6));\n\n const [triggerPriceValue, setTriggerPriceValue] = useState(formatPrice(order.triggerPrice, false, true));\n const triggerPrice = useMemo(() => {\n return triggerPriceValue ? parseValue(triggerPriceValue, USD_DECIMALS) : 0;\n }, [triggerPriceValue]);\n\n const triggerRatio = useMemo(() => {\n if (!triggerRatioValue) {\n return bigNumberify(0);\n }\n let ratio = parseValue(triggerRatioValue, USD_DECIMALS);\n if (triggerRatioInverted) {\n ratio = PRECISION.mul(PRECISION).div(ratio);\n }\n return ratio;\n }, [triggerRatioValue, triggerRatioInverted]);\n\n const indexTokenMarkPrice = useMemo(() => {\n if (order.type === SWAP) {\n return;\n }\n const toTokenInfo = getTokenInfo(infoTokens, order.indexToken);\n return order.isLong ? toTokenInfo.maxPrice : toTokenInfo.minPrice;\n }, [infoTokens, order]);\n\n let toAmount;\n if (order.type === SWAP) {\n const { amount } = getNextToAmount(\n chainId,\n order.amountIn,\n order.path[0],\n order.path[order.path.length - 1],\n infoTokens,\n undefined,\n triggerRatio,\n usdfSupply,\n totalTokenWeights\n );\n toAmount = amount;\n }\n\n const onClickPrimary = () => {\n setIsSubmitting(true);\n\n let func;\n let params;\n\n if (order.type === SWAP) {\n func = updateSwapOrder;\n params = [\n chainId,\n library,\n order.index,\n toAmount,\n triggerRatio,\n order.triggerAboveThreshold,\n ];\n } else if (order.type === DECREASE) {\n func = updateDecreaseOrder;\n params = [\n chainId,\n library,\n order.index,\n order.collateralDelta,\n order.sizeDelta,\n triggerPrice,\n order.triggerAboveThreshold,\n ];\n } else if (order.type === INCREASE) {\n func = updateIncreaseOrder;\n params = [\n chainId,\n library,\n order.index,\n order.sizeDelta,\n triggerPrice,\n order.triggerAboveThreshold,\n ];\n }\n\n params.push({\n successMsg: t`Order updated!`,\n failMsg: t`Order update failed.`,\n sentMsg: t`Order update submitted!`,\n pendingTxns,\n setPendingTxns,\n });\n\n return func(...params)\n .then(() => {\n setEditingOrder(null);\n })\n .finally(() => {\n setIsSubmitting(false);\n });\n };\n\n const onTriggerRatioChange = (evt) => {\n setTriggerRatioValue(evt.target.value || \"\");\n };\n\n const onTriggerPriceChange = (evt) => {\n setTriggerPriceValue(evt.target.value || \"\");\n };\n\n const getError = () => {\n if ((!triggerRatio || triggerRatio.eq(0)) && (!triggerPrice || triggerPrice.eq(0))) {\n return t`Enter Price`;\n }\n if (order.type === SWAP && triggerRatio.eq(order.triggerRatio)) {\n return t`Enter new Price`;\n }\n if (order.type !== SWAP && triggerPrice.eq(order.triggerPrice)) {\n return t`Enter new Price`;\n }\n if (position) {\n if (order.type === DECREASE) {\n if (position.isLong && triggerPrice.lte(liquidationPrice)) {\n return t`Price below Liq. Price`;\n }\n if (!position.isLong && triggerPrice.gte(liquidationPrice)) {\n return t`Price above Liq. Price`;\n }\n }\n\n const { delta, hasProfit } = calculatePositionDelta(triggerPrice, position);\n if (hasProfit && delta.eq(0)) {\n return t`Invalid price, see warning`;\n }\n }\n\n if (order.type !== SWAP && indexTokenMarkPrice && !savedShouldDisableValidationForTesting) {\n if (order.triggerAboveThreshold && indexTokenMarkPrice.gt(triggerPrice)) {\n return t`Price below Mark Price`;\n }\n if (!order.triggerAboveThreshold && indexTokenMarkPrice.lt(triggerPrice)) {\n return t`Price above Mark Price`;\n }\n }\n\n if (order.type === SWAP) {\n const currentRate = getExchangeRate(fromTokenInfo, toTokenInfo);\n if (currentRate && !currentRate.gte(triggerRatio)) {\n return triggerRatioInverted ? t`Price is below Mark Price` : t`Price is above Mark Price`;\n }\n }\n };\n\n const isPrimaryEnabled = () => {\n if (isSubmitting) {\n return false;\n }\n const error = getError();\n if (error) {\n return false;\n }\n\n return true;\n };\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n\n if (isSubmitting) {\n return t`Updating Order...`;\n }\n return t`Update Order`;\n };\n\n if (order.type !== SWAP) {\n const triggerPricePrefix = order.triggerAboveThreshold\n ? TRIGGER_PREFIX_ABOVE\n : TRIGGER_PREFIX_BELOW;\n return (\n setEditingOrder(null)}\n label={t`Edit order`}\n >\n
\n
\n
\n Price\n
\n {\n setTriggerPriceValue(formatPrice(indexTokenMarkPrice, false, true));\n }}\n >\n Mark: {formatPrice(indexTokenMarkPrice)}\n
\n
\n
\n
\n \n
\n
USD
\n
\n
\n \n {triggerPrice && !triggerPrice.eq(order.triggerPrice) ? (\n <>\n \n {triggerPricePrefix} {formatPrice(order.triggerPrice, true)}\n \n  \n \n  \n {triggerPricePrefix} {formatPrice(triggerPrice, true)}\n \n ) : (\n \n {triggerPricePrefix} {formatPrice(order.triggerPrice, true)}\n \n )}\n \n {liquidationPrice && (\n
\n
\n Liq. Price\n
\n
\n {`$${formatPrice(liquidationPrice, true)}`}\n
\n
\n )}\n
\n \n {getPrimaryText()}\n \n
\n \n );\n }\n\n return (\n setEditingOrder(null)}\n label={t`Edit order`}\n >\n
\n
\n
\n Price\n
\n {fromTokenInfo && toTokenInfo && (\n {\n setTriggerRatioValue(\n formatAmountFree(\n getExchangeRate(fromTokenInfo, toTokenInfo, triggerRatioInverted),\n USD_DECIMALS,\n 10\n )\n );\n }}\n >\n Mark Price: \n {formatAmount(\n getExchangeRate(fromTokenInfo, toTokenInfo, triggerRatioInverted),\n USD_DECIMALS,\n 2\n )}\n
\n )}\n
\n
\n
\n \n
\n {(() => {\n if (!toTokenInfo) return;\n if (!fromTokenInfo) return;\n const [tokenA, tokenB] = triggerRatioInverted\n ? [toTokenInfo, fromTokenInfo]\n : [fromTokenInfo, toTokenInfo];\n return (\n
\n {tokenA.symbol} / {tokenB.symbol}\n
\n );\n })()}\n
\n
\n \n {triggerRatio && !triggerRatio.eq(order.triggerRatio) ? (\n <>\n \n {formatAmount(order.minOut, toTokenInfo.decimals, 4, true)}\n \n  \n \n  \n {formatAmount(toAmount, toTokenInfo.decimals, 4, true)}\n \n ) : (\n formatAmount(order.minOut, toTokenInfo.decimals, 4, true)\n )}\n  {toTokenInfo.symbol}\n \n \n {triggerRatio && !triggerRatio.eq(0) && !triggerRatio.eq(order.triggerRatio) ? (\n <>\n \n {getExchangeRateDisplay(order.triggerRatio, fromTokenInfo, toTokenInfo, {\n omitSymbols: !triggerRatio || !triggerRatio.eq(order.triggerRatio),\n })}\n \n  \n \n  \n {getExchangeRateDisplay(triggerRatio, fromTokenInfo, toTokenInfo)}\n \n ) : (\n getExchangeRateDisplay(order.triggerRatio, fromTokenInfo, toTokenInfo, {\n omitSymbols: !triggerRatio || !triggerRatio.eq(order.triggerRatio),\n })\n )}\n \n {fromTokenInfo && (\n
\n
\n {fromTokenInfo.symbol} price\n
\n
\n {formatPrice(fromTokenInfo.minPrice, true)} USD\n
\n
\n )}\n {toTokenInfo && (\n
\n
\n {toTokenInfo.symbol} price\n
\n
\n {formatPrice(toTokenInfo.maxPrice, true)} USD\n
\n
\n )}\n
\n \n {getPrimaryText()}\n \n
\n \n );\n}\n","import React, { useState, useCallback } from \"react\";\nimport { t, Trans } from \"@lingui/macro\";\n\nimport {\n SWAP,\n INCREASE,\n DECREASE,\n USD_DECIMALS,\n getOrderError,\n getExchangeRateDisplay,\n getExchangeRate,\n getPositionForOrder,\n} from \"lib/legacy.js\";\nimport { handleCancelOrder } from \"domain/legacy\";\nimport { getContract } from \"config/contracts\";\n\nimport Tooltip from \"../Tooltip/Tooltip\";\nimport OrderEditor from \"./OrderEditor\";\n\nimport \"./OrdersList.css\";\nimport Checkbox from \"../Checkbox/Checkbox\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { TRIGGER_PREFIX_ABOVE, TRIGGER_PREFIX_BELOW } from \"config/ui\";\nimport { getTokenInfo, getUsd } from \"domain/tokens/utils\";\nimport { formatAmount, formatPrice } from \"lib/numbers\";\n\nexport default function OrdersList(props) {\n const {\n account,\n library,\n setPendingTxns,\n pendingTxns,\n infoTokens,\n positionsMap,\n totalTokenWeights,\n usdfSupply,\n orders,\n hideActions,\n chainId,\n savedShouldDisableValidationForTesting,\n cancelOrderIdList,\n setCancelOrderIdList,\n } = props;\n\n const [editingOrder, setEditingOrder] = useState(null);\n\n const onCancelClick = useCallback(\n (order) => {\n handleCancelOrder(chainId, library, order, { pendingTxns, setPendingTxns });\n },\n [library, pendingTxns, setPendingTxns, chainId]\n );\n\n const onEditClick = useCallback(\n (order) => {\n setEditingOrder(order);\n },\n [setEditingOrder]\n );\n\n const renderHead = useCallback(() => {\n const isAllOrdersSelected =\n cancelOrderIdList?.length > 0 && cancelOrderIdList?.length === orders.length;\n\n return (\n \n {orders.length > 0 && (\n \n
\n {\n if (isAllOrdersSelected) {\n setCancelOrderIdList([]);\n } else {\n const allOrderIds = orders.map((o) => `${o.type}-${o.index}`);\n setCancelOrderIdList(allOrderIds);\n }\n }}\n />\n
\n \n )}\n\n \n
\n Type\n
\n \n \n
\n Order\n
\n \n \n
\n Price\n
\n \n \n
\n Mark Price\n
\n \n \n );\n }, [cancelOrderIdList, orders, setCancelOrderIdList]);\n\n const renderEmptyRow = useCallback(() => {\n if (orders && orders.length) {\n return null;\n }\n\n return (\n \n \n No open orders\n \n \n );\n }, [orders]);\n\n const renderActions = useCallback(\n (order) => {\n return (\n <>\n \n \n \n \n \n \n \n );\n },\n [onEditClick, onCancelClick]\n );\n\n const renderLargeList = useCallback(() => {\n if (!orders || !orders.length) {\n return null;\n }\n return orders.map((order) => {\n if (order.type === SWAP) {\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const fromTokenInfo = getTokenInfo(infoTokens, order.path[0], true, nativeTokenAddress);\n const toTokenInfo = getTokenInfo(\n infoTokens,\n order.path[order.path.length - 1],\n order.shouldUnwrap,\n nativeTokenAddress\n );\n\n const markExchangeRate = getExchangeRate(fromTokenInfo, toTokenInfo);\n const orderId = `${order.type}-${order.index}`;\n\n return (\n \n \n
\n {\n setCancelOrderIdList((prevState) => {\n if (prevState.includes(orderId)) {\n return prevState.filter((i) => i !== orderId);\n } else {\n return prevState.concat(orderId);\n }\n });\n }}\n />\n
\n \n \n Limit\n \n \n Swap{\" \"}\n {formatAmount(\n order.amountIn,\n fromTokenInfo.decimals,\n fromTokenInfo.isStable || fromTokenInfo.isUsdf ? 2 : 4,\n true\n )}{\" \"}\n {fromTokenInfo.symbol} for{\" \"}\n {formatAmount(\n order.minOut,\n toTokenInfo.decimals,\n toTokenInfo.isStable || toTokenInfo.isUsdf ? 2 : 4,\n true\n )}{\" \"}\n {toTokenInfo.symbol}\n \n \n t`\n You will receive at least ${formatAmount(\n order.minOut,\n toTokenInfo.decimals,\n toTokenInfo.isStable || toTokenInfo.isUsdf ? 2 : 4,\n true\n )} ${\n toTokenInfo.symbol\n } if this order is executed. The execution price may vary depending on swap fees at the time the order is executed.\n `}\n />\n \n {getExchangeRateDisplay(markExchangeRate, fromTokenInfo, toTokenInfo, true)}\n {!hideActions && renderActions(order)}\n \n );\n }\n\n const indexToken = getTokenInfo(infoTokens, order.indexToken);\n\n // Longs Increase: max price\n // Longs Decrease: min price\n // Short Increase: min price\n // Short Decrease: max price\n const maximisePrice = (order.type === INCREASE && order.isLong)\n || (order.type === DECREASE && !order.isLong);\n\n const markPrice = maximisePrice\n ? indexToken.contractMaxPrice\n : indexToken.contractMinPrice;\n const triggerPricePrefix = order.triggerAboveThreshold\n ? TRIGGER_PREFIX_ABOVE\n : TRIGGER_PREFIX_BELOW;\n const indexTokenSymbol = indexToken.isWrapped\n ? indexToken.baseSymbol\n : indexToken.symbol;\n\n const error = getOrderError(account, order, positionsMap);\n const orderId = `${order.type}-${order.index}`;\n const orderText = (\n <>\n {order.type === INCREASE ? t`Increase` : t`Decrease`} {indexTokenSymbol} {order.isLong ? t`Long` : t`Short`}\n  by ${formatAmount(order.sizeDelta, USD_DECIMALS, 2, true)}\n {error &&
{error}
}\n \n );\n\n return (\n \n \n
\n {\n setCancelOrderIdList((prevState) => {\n if (prevState.includes(orderId)) {\n return prevState.filter((i) => i !== orderId);\n } else {\n return prevState.concat(orderId);\n }\n });\n }}\n />\n
\n \n {order.type === INCREASE ? t`Limit` : t`Trigger`}\n \n {order.type === DECREASE ? (\n orderText\n ) : (\n {\n const collateralTokenInfo = getTokenInfo(infoTokens, order.purchaseToken);\n const collateralUSD = getUsd(order.purchaseTokenAmount, order.purchaseToken, false, infoTokens);\n return (\n \n );\n }}\n />\n )}\n \n \n {triggerPricePrefix} {formatPrice(order.triggerPrice, true)}\n \n \n {\n return (\n \n The price that orders can be executed at may differ slightly from the chart price, as market orders\n update oracle prices, while limit/trigger orders do not.\n \n );\n }}\n />\n \n {!hideActions && renderActions(order)}\n \n );\n });\n }, [\n orders,\n renderActions,\n infoTokens,\n positionsMap,\n hideActions,\n chainId,\n account,\n cancelOrderIdList,\n setCancelOrderIdList,\n ]);\n\n const renderSmallList = useCallback(() => {\n if (!orders || !orders.length) {\n return null;\n }\n\n return orders.map((order) => {\n if (order.type === SWAP) {\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const fromTokenInfo = getTokenInfo(infoTokens, order.path[0], true, nativeTokenAddress);\n const toTokenInfo = getTokenInfo(\n infoTokens,\n order.path[order.path.length - 1],\n order.shouldUnwrap,\n nativeTokenAddress\n );\n const markExchangeRate = getExchangeRate(fromTokenInfo, toTokenInfo);\n\n return (\n
\n
\n Swap {formatAmount(order.amountIn, fromTokenInfo.decimals, fromTokenInfo.isStable ? 2 : 4, true)}{\" \"}\n {fromTokenInfo.symbol} for{\" \"}\n {formatAmount(order.minOut, toTokenInfo.decimals, toTokenInfo.isStable ? 2 : 4, true)}{\" \"}\n {toTokenInfo.symbol}\n
\n
\n
\n
\n
\n Price\n
\n
\n t`\n You will receive at least ${formatAmount(\n order.minOut,\n toTokenInfo.decimals,\n toTokenInfo.isStable || toTokenInfo.isUsdf ? 2 : 4,\n true\n )} ${\n toTokenInfo.symbol\n } if this order is executed. The exact execution price may vary depending on fees at the time the order is executed.\n `}\n />\n
\n
\n
\n
\n Mark Price\n
\n
{getExchangeRateDisplay(markExchangeRate, fromTokenInfo, toTokenInfo)}
\n
\n {!hideActions && (\n <>\n
\n
\n \n \n
\n \n )}\n
\n
\n );\n }\n\n const indexToken = getTokenInfo(infoTokens, order.indexToken);\n const maximisePrice = (order.type === INCREASE && order.isLong) || (order.type === DECREASE && !order.isLong);\n const markPrice = maximisePrice ? indexToken.contractMaxPrice : indexToken.contractMinPrice;\n const triggerPricePrefix = order.triggerAboveThreshold ? TRIGGER_PREFIX_ABOVE : TRIGGER_PREFIX_BELOW;\n const indexTokenSymbol = indexToken.isWrapped ? indexToken.baseSymbol : indexToken.symbol;\n\n const collateralTokenInfo = getTokenInfo(infoTokens, order.purchaseToken);\n const collateralUSD = getUsd(order.purchaseTokenAmount, order.purchaseToken, true, infoTokens);\n\n const error = getOrderError(account, order, positionsMap);\n\n return (\n
\n
\n {order.type === INCREASE ? t`Increase` : t`Decrease`} {indexTokenSymbol} {order.isLong ? t`Long` : t`Short`}\n  by ${formatAmount(order.sizeDelta, USD_DECIMALS, 2, true)}\n {error &&
{error}
}\n
\n
\n
\n
\n
\n Price\n
\n
\n {triggerPricePrefix} {formatPrice(order.triggerPrice, true)}\n
\n
\n
\n
\n Mark Price\n
\n
\n {\n return (\n \n The price that the order can be executed at may differ slightly from the chart price as market\n orders can change the price while limit / trigger orders cannot.\n \n );\n }}\n />\n
\n
\n {order.type === INCREASE && (\n
\n
\n Collateral\n
\n
\n ${formatAmount(collateralUSD, USD_DECIMALS, 2, true)} (\n {formatAmount(order.purchaseTokenAmount, collateralTokenInfo.decimals, 4, true)}{\" \"}\n {collateralTokenInfo.baseSymbol || collateralTokenInfo.symbol})\n
\n
\n )}\n {!hideActions && (\n <>\n
\n
\n \n \n
\n \n )}\n
\n
\n );\n });\n }, [orders, onEditClick, onCancelClick, infoTokens, positionsMap, hideActions, chainId, account]);\n\n return (\n \n \n \n {renderHead()}\n {renderEmptyRow()}\n {renderLargeList()}\n \n
\n
\n {(!orders || orders.length === 0) && (\n
\n No open orders\n
\n )}\n {renderSmallList()}\n
\n {editingOrder && (\n \n )}\n
\n );\n}\n","import React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { ethers } from \"ethers\";\nimport { Link } from \"react-router-dom\";\nimport Tooltip from \"components/Tooltip/Tooltip\";\n\nimport {\n USD_DECIMALS,\n MAX_LEVERAGE,\n BASIS_POINTS_DIVISOR,\n LIQUIDATION_FEE,\n TRADES_PAGE_SIZE,\n deserialize,\n getExchangeRateDisplay,\n} from \"lib/legacy\";\nimport { useTrades, useLiquidationsData } from \"domain/legacy\";\nimport { getContract } from \"config/contracts\";\n\nimport \"./TradeHistory.css\";\nimport { getExplorerUrl } from \"config/chains\";\nimport { bigNumberify, formatAmount, formatPrice } from \"lib/numbers\";\nimport { formatDateTime } from \"lib/dates\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { select, t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst { AddressZero } = ethers.constants;\n\nfunction getPositionDisplay(increase, indexToken, isLong, sizeDelta) {\n const symbol = indexToken ? (indexToken.isWrapped ? indexToken.baseSymbol : indexToken.symbol) : \"\";\n return `\n ${increase ? t`Increase` : t`Decrease`} ${symbol} ${isLong ? t`Long` : t`Short`}\n ${increase ? \"+\" : \"-\"}${formatAmount(sizeDelta, USD_DECIMALS, 2, true)} USD`;\n}\n\nfunction getOrderActionTitle(action) {\n let actionDisplay;\n\n if (action.startsWith(\"Create\")) {\n actionDisplay = t`Create`;\n } else if (action.startsWith(\"Cancel\")) {\n actionDisplay = t`Cancel`;\n } else {\n actionDisplay = t`Update`;\n }\n\n return t`${actionDisplay} Order`;\n}\n\nfunction renderLiquidationTooltip(liquidationData, label) {\n const minCollateral = liquidationData.size.mul(BASIS_POINTS_DIVISOR).div(MAX_LEVERAGE);\n const text =\n liquidationData.type === \"full\"\n ? t`This position was liquidated as the max leverage of 100x was exceeded.`\n : t`Max leverage of 100x was exceeded, the remaining collateral after deducting losses and fees have been sent back to your account`;\n return (\n (\n <>\n {text}\n
\n
\n \n \n \n \n {liquidationData.type === \"full\" && (\n \n )}\n \n )}\n />\n );\n}\n\nfunction getLiquidationData(liquidationsDataMap, key, timestamp) {\n return liquidationsDataMap && liquidationsDataMap[`${key}:${timestamp}`];\n}\n\nexport default function TradeHistory(props) {\n const { account, infoTokens, getTokenInfo, chainId, nativeTokenAddress, shouldShowPaginationButtons } = props;\n const [pageIds, setPageIds] = useState({});\n const [pageIndex, setPageIndex] = useState(0);\n\n const getAfterId = () => {\n return pageIds[pageIndex];\n };\n\n const { trades, updateTrades } = useTrades(chainId, account, props.forSingleAccount, getAfterId());\n\n const liquidationsData = useLiquidationsData(chainId, account);\n const liquidationsDataMap = useMemo(() => {\n if (!liquidationsData) {\n return null;\n }\n return liquidationsData.reduce((memo, item) => {\n const liquidationKey = `${item.key}:${item.timestamp}`;\n memo[liquidationKey] = item;\n return memo;\n }, {});\n }, [liquidationsData]);\n\n useEffect(() => {\n const interval = setInterval(() => {\n updateTrades(undefined, true);\n }, 10 * 1000);\n return () => clearInterval(interval);\n }, [updateTrades]);\n\n const loadNextPage = () => {\n if (!trades || trades.length === 0) {\n return;\n }\n\n const lastTrade = trades[trades.length - 1];\n pageIds[pageIndex + 1] = lastTrade.id;\n setPageIds(pageIds);\n setPageIndex(pageIndex + 1);\n };\n\n const loadPrevPage = () => {\n setPageIndex(pageIndex - 1);\n };\n\n const getMsg = useCallback(\n (trade) => {\n const tradeData = trade.data;\n const params = JSON.parse(tradeData.params);\n const longOrShortText = params?.isLong ? t`Long` : t`Short`;\n const defaultMsg = \"\";\n\n if (tradeData.action === \"BuyUSDF\") {\n const token = getTokenInfo(infoTokens, params.token, true, nativeTokenAddress);\n if (!token) {\n return defaultMsg;\n }\n return t`Swap ${formatAmount(params.tokenAmount, token.decimals, 4, true)} ${token.symbol} for ${formatAmount(\n params.usdfAmount,\n 18,\n 4,\n true\n )} USDF`;\n }\n\n if (tradeData.action === \"SellUSDF\") {\n const token = getTokenInfo(infoTokens, params.token, true, nativeTokenAddress);\n if (!token) {\n return defaultMsg;\n }\n return t`Swap ${formatAmount(params.usdfAmount, 18, 4, true)} USDF for ${formatAmount(\n params.tokenAmount,\n token.decimals,\n 4,\n true\n )} ${token.symbol}`;\n }\n\n if (tradeData.action === \"Swap\") {\n const tokenIn = getTokenInfo(infoTokens, params.tokenIn, true, nativeTokenAddress);\n const tokenOut = getTokenInfo(infoTokens, params.tokenOut, true, nativeTokenAddress);\n if (!tokenIn || !tokenOut) {\n return defaultMsg;\n }\n return t`Swap ${formatAmount(params.amountIn, tokenIn.decimals, 4, true)} ${tokenIn.symbol} for ${formatAmount(\n params.amountOut,\n tokenOut.decimals,\n 4,\n true\n )} ${tokenOut.symbol}`;\n }\n\n if (tradeData.action === \"CreateIncreasePosition\") {\n const indexToken = getTokenInfo(infoTokens, params.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n\n if (bigNumberify(params.sizeDelta).eq(0)) {\n return t`Request deposit into ${indexToken.symbol} ${longOrShortText}`;\n }\n\n return t`Request increase ${indexToken.symbol} ${longOrShortText}, +${formatAmount(\n params.sizeDelta,\n USD_DECIMALS,\n 2,\n true\n )} USD, Acceptable Price: ${params.isLong ? \"<\" : \">\"} ${formatPrice(\n params.acceptablePrice,\n true\n )} USD`;\n }\n\n if (tradeData.action === \"CreateDecreasePosition\") {\n const indexToken = getTokenInfo(infoTokens, params.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n\n if (bigNumberify(params.sizeDelta).eq(0)) {\n return t`Request withdrawal from ${indexToken.symbol} ${longOrShortText}`;\n }\n\n return t`Request decrease ${indexToken.symbol} ${longOrShortText}, -${formatAmount(\n params.sizeDelta,\n USD_DECIMALS,\n 2,\n true\n )} USD, Acceptable Price: ${params.isLong ? \">\" : \"<\"} ${formatPrice(\n params.acceptablePrice,\n true\n )} USD`;\n }\n\n if (tradeData.action === \"CancelIncreasePosition\") {\n const indexToken = getTokenInfo(infoTokens, params.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n\n if (bigNumberify(params.sizeDelta).eq(0)) {\n return (\n \n Could not execute deposit into {indexToken.symbol} {longOrShortText}\n \n );\n }\n\n return (\n <>\n \n Could not increase {indexToken.symbol} {longOrShortText},\n {`+${formatAmount(params.sizeDelta, USD_DECIMALS, 2, true)}`} USD, Acceptable Price: \n {params.isLong ? \"<\" : \">\"} \n \n (\n Try increasing the \"Allowed Slippage\", under the Settings menu on the top right.\n )}\n />\n \n );\n }\n\n if (tradeData.action === \"CancelDecreasePosition\") {\n const indexToken = getTokenInfo(infoTokens, params.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n\n if (bigNumberify(params.sizeDelta).eq(0)) {\n return t`Could not execute withdrawal from ${indexToken.symbol} ${longOrShortText}`;\n }\n\n return (\n <>\n \n Could not decrease {indexToken.symbol} {longOrShortText},\n {`+${formatAmount(params.sizeDelta, USD_DECIMALS, 2, true)}`} USD, Acceptable Price: \n {params.isLong ? \">\" : \"<\"} \n \n (\n Try increasing the \"Allowed Slippage\", under the Settings menu on the top right\n )}\n />\n \n );\n }\n\n if (tradeData.action === \"IncreasePosition-Long\" || tradeData.action === \"IncreasePosition-Short\") {\n if (params.flags?.isOrderExecution) {\n return;\n }\n\n const indexToken = getTokenInfo(infoTokens, params.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n if (bigNumberify(params.sizeDelta).eq(0)) {\n return t`Deposit ${formatAmount(params.collateralDelta, USD_DECIMALS, 2, true)} USD into ${\n indexToken.symbol\n } ${longOrShortText}`;\n }\n return t`Increase ${indexToken.symbol} ${longOrShortText}, +${formatAmount(\n params.sizeDelta,\n USD_DECIMALS,\n 2,\n true\n )} USD, ${indexToken.symbol} Price: ${formatPrice(params.price, true)} USD`;\n }\n\n if (tradeData.action === \"DecreasePosition-Long\" || tradeData.action === \"DecreasePosition-Short\") {\n if (params.flags?.isOrderExecution) {\n return;\n }\n\n const indexToken = getTokenInfo(infoTokens, params.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n if (bigNumberify(params.sizeDelta).eq(0)) {\n return t`Withdraw ${formatAmount(params.collateralDelta, USD_DECIMALS, 2, true)} USD from ${\n indexToken.symbol\n } ${longOrShortText}`;\n }\n const isLiquidation = params.flags?.isLiquidation;\n const liquidationData = getLiquidationData(liquidationsDataMap, params.key, tradeData.timestamp);\n\n if (isLiquidation && liquidationData) {\n return (\n <>\n {renderLiquidationTooltip(liquidationData, t`Partial Liquidation`)} {indexToken.symbol} {longOrShortText},\n -{formatAmount(params.sizeDelta, USD_DECIMALS, 2, true)} USD, {indexToken.symbol}  Price: $\n {formatPrice(params.price, true)} USD\n \n );\n }\n const actionDisplay = isLiquidation ? t`Partially Liquidated` : t`Decreased`;\n return t`\n ${actionDisplay} ${indexToken.symbol} ${longOrShortText},\n -${formatAmount(params.sizeDelta, USD_DECIMALS, 2, true)} USD,\n ${indexToken.symbol} Price: ${formatPrice(params.price, true)} USD\n `;\n }\n\n if (tradeData.action === \"LiquidatePosition-Long\" || tradeData.action === \"LiquidatePosition-Short\") {\n const indexToken = getTokenInfo(infoTokens, params.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n const liquidationData = getLiquidationData(liquidationsDataMap, params.key, tradeData.timestamp);\n if (liquidationData) {\n return (\n \n {renderLiquidationTooltip(liquidationData, t`Liquidated`)} {indexToken.symbol} {longOrShortText}, -\n {formatAmount(params.size, USD_DECIMALS, 2, true)} USD, \n {indexToken.symbol} Price: ${formatPrice(params.markPrice, true)} USD\n \n );\n }\n return t`\n Liquidated ${indexToken.symbol} ${longOrShortText},\n -${formatAmount(params.size, USD_DECIMALS, 2, true)} USD,\n ${indexToken.symbol} Price: ${formatPrice(params.markPrice, true)} USD\n `;\n }\n\n if ([\"ExecuteIncreaseOrder\", \"ExecuteDecreaseOrder\"].includes(tradeData.action)) {\n const order = deserialize(params);\n const indexToken = getTokenInfo(infoTokens, order.indexToken, true, nativeTokenAddress);\n if (!indexToken) {\n return defaultMsg;\n }\n const longShortDisplay = order.isLong ? t`Long` : t`Short`;\n const executionPriceDisplay = formatPrice(order.executionPrice, true);\n const orderType = tradeData.action.includes(\"Increase\") ? \"Increase\" : \"Decrease\";\n const sizeDeltaDisplay = `${orderType === \"Increase\" ? \"+\" : \"-\"}${formatAmount(\n order.sizeDelta,\n USD_DECIMALS,\n 2,\n true\n )}`;\n return t`Execute Order: ${select(orderType, { Increase: \"Increase\", Decrease: \"Decrease\" })} ${\n indexToken.symbol\n } ${longShortDisplay} ${sizeDeltaDisplay} USD, Price: ${executionPriceDisplay} USD`;\n }\n\n if (\n [\n \"CreateIncreaseOrder\",\n \"CancelIncreaseOrder\",\n \"UpdateIncreaseOrder\",\n \"CreateDecreaseOrder\",\n \"CancelDecreaseOrder\",\n \"UpdateDecreaseOrder\",\n ].includes(tradeData.action)\n ) {\n const order = deserialize(params);\n const indexToken = getTokenInfo(infoTokens, order.indexToken);\n if (!indexToken) {\n return defaultMsg;\n }\n const increase = tradeData.action.includes(\"Increase\");\n const priceDisplay = `${order.triggerAboveThreshold ? \">\" : \"<\"} ${formatPrice(\n order.triggerPrice,\n true\n )}`;\n return t`\n ${getOrderActionTitle(tradeData.action)}:\n ${getPositionDisplay(increase, indexToken, order.isLong, order.sizeDelta)},\n Price: ${priceDisplay}\n `;\n }\n\n if (tradeData.action === \"ExecuteSwapOrder\") {\n const order = deserialize(params);\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const fromToken = getTokenInfo(infoTokens, order.path[0] === nativeTokenAddress ? AddressZero : order.path[0]);\n const toToken = getTokenInfo(infoTokens, order.shouldUnwrap ? AddressZero : order.path[order.path.length - 1]);\n if (!fromToken || !toToken) {\n return defaultMsg;\n }\n const fromAmountDisplay = formatAmount(order.amountIn, fromToken.decimals, fromToken.isStable ? 2 : 4, true);\n const toAmountDisplay = formatAmount(order.amountOut, toToken.decimals, toToken.isStable ? 2 : 4, true);\n return t`\n Execute Order: Swap ${fromAmountDisplay} ${fromToken.symbol} for ${toAmountDisplay} ${toToken.symbol}\n `;\n }\n\n if ([\"CreateSwapOrder\", \"UpdateSwapOrder\", \"CancelSwapOrder\"].includes(tradeData.action)) {\n const order = deserialize(params);\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const fromToken = getTokenInfo(infoTokens, order.path[0] === nativeTokenAddress ? AddressZero : order.path[0]);\n const toToken = getTokenInfo(infoTokens, order.shouldUnwrap ? AddressZero : order.path[order.path.length - 1]);\n if (!fromToken || !toToken) {\n return defaultMsg;\n }\n const amountInDisplay = fromToken\n ? formatAmount(order.amountIn, fromToken.decimals, fromToken.isStable ? 2 : 4, true)\n : \"\";\n const minOutDisplay = toToken\n ? formatAmount(order.minOut, toToken.decimals, toToken.isStable ? 2 : 4, true)\n : \"\";\n\n return t`\n ${getOrderActionTitle(tradeData.action)}:\n Swap ${amountInDisplay} ${fromToken?.symbol || \"\"} for ${minOutDisplay} ${toToken?.symbol || \"\"},\n Price: ${getExchangeRateDisplay(order.triggerRatio, fromToken, toToken)}`;\n }\n },\n [getTokenInfo, infoTokens, nativeTokenAddress, chainId, liquidationsDataMap]\n );\n\n const tradesWithMessages = useMemo(() => {\n if (!trades) {\n return [];\n }\n\n return trades\n .map((trade) => ({\n msg: getMsg(trade),\n ...trade,\n }))\n .filter((trade) => trade.msg);\n }, [trades, getMsg]);\n\n return (\n
\n {tradesWithMessages.length === 0 && (\n
\n No trades yet\n
\n )}\n {tradesWithMessages.length > 0 &&\n tradesWithMessages.map((trade, index) => {\n const tradeData = trade.data;\n const txUrl = getExplorerUrl(chainId) + \"tx/\" + tradeData.txhash;\n\n let msg = getMsg(trade);\n\n if (!msg) {\n return null;\n }\n\n return (\n
\n
\n
\n {formatDateTime(tradeData.timestamp)}\n {(!account || account.length === 0) && (\n \n {\" \"}\n ({tradeData.account})\n \n )}\n
\n \n {msg}\n \n
\n
\n );\n })}\n {shouldShowPaginationButtons && (\n
\n {pageIndex > 0 && (\n \n )}\n {trades && trades.length >= TRADES_PAGE_SIZE && (\n \n )}\n
\n )}\n
\n );\n}\n","import React from \"react\";\n\nimport \"./ExchangeWalletTokens.css\";\nimport { bigNumberify, expandDecimals, formatAmount } from \"lib/numbers\";\n\nexport default function ExchangeWalletTokens(props) {\n const { tokens, mintingCap, infoTokens, onSelectToken } = props;\n\n return (\n
\n {tokens.map((token) => {\n let info = infoTokens ? infoTokens[token.address] : {};\n let mintAmount;\n let balance = info.balance;\n if (mintingCap && info.usdfAmount) {\n mintAmount = mintingCap.sub(info.usdfAmount);\n }\n if (mintAmount && mintAmount.lt(0)) {\n mintAmount = bigNumberify(0);\n }\n let balanceUsd;\n if (balance && info.maxPrice) {\n balanceUsd = balance.mul(info.maxPrice).div(expandDecimals(1, token.decimals));\n }\n return (\n
onSelectToken(token)} key={token.address}>\n
\n
{token.symbol}
\n {balance && (\n
\n {balance.gt(0) && formatAmount(balance, token.decimals, 4, true)}\n {balance.eq(0) && \"-\"}\n
\n )}\n
\n
\n
{token.name}
\n {balanceUsd && balanceUsd.gt(0) && (\n
${formatAmount(balanceUsd, 30, 2, true)}
\n )}\n
\n
\n );\n })}\n
\n );\n}\n","import React from \"react\";\nimport { Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nimport \"./ExchangeBanner.css\";\n\nexport default function ExchangeBanner(props) {\n const { hideBanner } = props;\n\n return (\n
\n

\n \n Trade on fxdx and win $250.000 in prizes! Live until November\n 30th,{\" \"}\n \n click here\n {\" \"}\n to learn more.\n \n

\n {\n hideBanner();\n }}\n >\n \n \n \n \n
\n );\n}\n","import React, { useEffect, useState, useMemo, useCallback, forwardRef, useImperativeHandle } from \"react\";\nimport { Trans, t, Plural } from \"@lingui/macro\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport useSWR from \"swr\";\nimport { ethers } from \"ethers\";\nimport cx from \"classnames\";\n\nimport {\n FUNDING_RATE_PRECISION,\n BASIS_POINTS_DIVISOR,\n MARGIN_FEE_BASIS_POINTS,\n SWAP,\n LONG,\n SHORT,\n USD_DECIMALS,\n getPositionKey,\n getPositionContractKey,\n getLeverage,\n getDeltaStr,\n useAccountOrders,\n getPageTitle,\n} from \"lib/legacy\";\nimport { getConstant, getExplorerUrl } from \"config/chains\";\nimport { approvePlugin, useMinExecutionFee, cancelMultipleOrders } from \"domain/legacy\";\n\nimport { getContract } from \"config/contracts\";\n\nimport Reader from \"abis/Reader.json\";\nimport Vault from \"abis/Vault.json\";\nimport Router from \"abis/Router.json\";\nimport Token from \"abis/Token.json\";\n\nimport Checkbox from \"components/Checkbox/Checkbox\";\nimport SwapBox from \"components/Exchange/SwapBox\";\nimport ExchangeTVChart, { getChartToken } from \"components/Exchange/ExchangeTVChart\";\nimport PositionsList from \"components/Exchange/PositionsList\";\nimport OrdersList from \"components/Exchange/OrdersList\";\nimport TradeHistory from \"components/Exchange/TradeHistory\";\nimport ExchangeWalletTokens from \"components/Exchange/ExchangeWalletTokens\";\nimport ExchangeBanner from \"components/Exchange/ExchangeBanner\";\nimport Tab from \"components/Tab/Tab\";\nimport Footer from \"components/Footer/Footer\";\n\nimport \"./Exchange.css\";\nimport { contractFetcher } from \"lib/contracts\";\nimport { useInfoTokens } from \"domain/tokens\";\nimport { useLocalStorageByChainId, useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { helperToast } from \"lib/helperToast\";\nimport { getTokenInfo } from \"domain/tokens/utils\";\nimport { bigNumberify, formatAmount, formatPrice } from \"lib/numbers\";\nimport { getToken, getTokenBySymbol, getTokens, getWhitelistedTokens } from \"config/tokens\";\nimport { useChainId } from \"lib/chains\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\nconst { AddressZero } = ethers.constants;\n\nconst PENDING_POSITION_VALID_DURATION = 600 * 1000;\nconst UPDATED_POSITION_VALID_DURATION = 60 * 1000;\n\nconst notifications = {};\n\nfunction pushSuccessNotification(chainId, message, e) {\n const { transactionHash } = e;\n const id = ethers.utils.id(message + transactionHash);\n if (notifications[id]) {\n return;\n }\n\n notifications[id] = true;\n\n const txUrl = getExplorerUrl(chainId) + \"tx/\" + transactionHash;\n helperToast.success(\n
\n {message}{\" \"}\n \n View\n \n
\n );\n}\n\nfunction pushErrorNotification(chainId, message, e) {\n const { transactionHash } = e;\n const id = ethers.utils.id(message + transactionHash);\n if (notifications[id]) {\n return;\n }\n\n notifications[id] = true;\n\n const txUrl = getExplorerUrl(chainId) + \"tx/\" + transactionHash;\n helperToast.error(\n
\n {message}{\" \"}\n \n View\n \n
\n );\n}\n\nfunction getFundingFee(data) {\n let { entryFundingRate, cumulativeFundingRate, size } = data;\n if (entryFundingRate && cumulativeFundingRate) {\n return size.mul(cumulativeFundingRate.sub(entryFundingRate)).div(FUNDING_RATE_PRECISION);\n }\n return;\n}\n\nconst getTokenAddress = (token, nativeTokenAddress) => {\n if (token.address === AddressZero) {\n return nativeTokenAddress;\n }\n return token.address;\n};\n\nfunction applyPendingChanges(position, pendingPositions) {\n if (!pendingPositions) {\n return;\n }\n const { key } = position;\n\n if (\n pendingPositions[key] &&\n pendingPositions[key].updatedAt &&\n pendingPositions[key].pendingChanges &&\n pendingPositions[key].updatedAt + PENDING_POSITION_VALID_DURATION > Date.now()\n ) {\n const { pendingChanges } = pendingPositions[key];\n if (pendingChanges.size && position.size.eq(pendingChanges.size)) {\n return;\n }\n\n if (pendingChanges.expectingCollateralChange && !position.collateral.eq(pendingChanges.collateralSnapshot)) {\n return;\n }\n\n position.hasPendingChanges = true;\n position.pendingChanges = pendingChanges;\n }\n}\n\nexport function getPositions(\n chainId,\n positionQuery,\n positionData,\n infoTokens,\n includeDelta,\n showPnlAfterFees,\n account,\n pendingPositions,\n updatedPositions\n) {\n const propsLength = getConstant(chainId, \"positionReaderPropsLength\");\n const positions = [];\n const positionsMap = {};\n if (!positionData) {\n return { positions, positionsMap };\n }\n const { collateralTokens, indexTokens, isLong } = positionQuery;\n for (let i = 0; i < collateralTokens.length; i++) {\n const collateralToken = getTokenInfo(infoTokens, collateralTokens[i], true, getContract(chainId, \"NATIVE_TOKEN\"));\n const indexToken = getTokenInfo(infoTokens, indexTokens[i], true, getContract(chainId, \"NATIVE_TOKEN\"));\n const key = getPositionKey(account, collateralTokens[i], indexTokens[i], isLong[i]);\n let contractKey;\n if (account) {\n contractKey = getPositionContractKey(account, collateralTokens[i], indexTokens[i], isLong[i]);\n }\n\n const position = {\n key,\n contractKey,\n collateralToken,\n indexToken,\n isLong: isLong[i],\n size: positionData[i * propsLength],\n collateral: positionData[i * propsLength + 1],\n averagePrice: positionData[i * propsLength + 2],\n entryFundingRate: positionData[i * propsLength + 3],\n cumulativeFundingRate: collateralToken.cumulativeFundingRate,\n hasRealisedProfit: positionData[i * propsLength + 4].eq(1),\n realisedPnl: positionData[i * propsLength + 5],\n lastIncreasedTime: positionData[i * propsLength + 6].toNumber(),\n hasProfit: positionData[i * propsLength + 7].eq(1),\n delta: positionData[i * propsLength + 8],\n markPrice: isLong[i] ? indexToken.minPrice : indexToken.maxPrice,\n };\n\n if (\n updatedPositions &&\n updatedPositions[key] &&\n updatedPositions[key].updatedAt &&\n updatedPositions[key].updatedAt + UPDATED_POSITION_VALID_DURATION > Date.now()\n ) {\n const updatedPosition = updatedPositions[key];\n position.size = updatedPosition.size;\n position.collateral = updatedPosition.collateral;\n position.averagePrice = updatedPosition.averagePrice;\n position.entryFundingRate = updatedPosition.entryFundingRate;\n }\n\n let fundingFee = getFundingFee(position);\n position.fundingFee = fundingFee ? fundingFee : bigNumberify(0);\n position.collateralAfterFee = position.collateral.sub(position.fundingFee);\n\n position.closingFee = position.size.mul(MARGIN_FEE_BASIS_POINTS).div(BASIS_POINTS_DIVISOR);\n position.positionFee = position.size.mul(MARGIN_FEE_BASIS_POINTS).mul(2).div(BASIS_POINTS_DIVISOR);\n position.totalFees = position.positionFee.add(position.fundingFee);\n\n position.pendingDelta = position.delta;\n\n if (position.collateral.gt(0)) {\n position.hasLowCollateral =\n position.collateralAfterFee.lt(0) || position.size.div(position.collateralAfterFee.abs()).gt(50);\n\n if (position.averagePrice && position.markPrice) {\n const priceDelta = position.averagePrice.gt(position.markPrice)\n ? position.averagePrice.sub(position.markPrice)\n : position.markPrice.sub(position.averagePrice);\n position.pendingDelta = position.size.mul(priceDelta).div(position.averagePrice);\n\n position.delta = position.pendingDelta;\n\n if (position.isLong) {\n position.hasProfit = position.markPrice.gte(position.averagePrice);\n } else {\n position.hasProfit = position.markPrice.lte(position.averagePrice);\n }\n }\n\n position.deltaPercentage = position.pendingDelta.mul(BASIS_POINTS_DIVISOR).div(position.collateral);\n\n const { deltaStr, deltaPercentageStr } = getDeltaStr({\n delta: position.pendingDelta,\n deltaPercentage: position.deltaPercentage,\n hasProfit: position.hasProfit,\n });\n\n position.deltaStr = deltaStr;\n position.deltaPercentageStr = deltaPercentageStr;\n position.deltaBeforeFeesStr = deltaStr;\n\n let hasProfitAfterFees;\n let pendingDeltaAfterFees;\n\n if (position.hasProfit) {\n if (position.pendingDelta.gt(position.totalFees)) {\n hasProfitAfterFees = true;\n pendingDeltaAfterFees = position.pendingDelta.sub(position.totalFees);\n } else {\n hasProfitAfterFees = false;\n pendingDeltaAfterFees = position.totalFees.sub(position.pendingDelta);\n }\n } else {\n hasProfitAfterFees = false;\n pendingDeltaAfterFees = position.pendingDelta.add(position.totalFees);\n }\n\n position.hasProfitAfterFees = hasProfitAfterFees;\n position.pendingDeltaAfterFees = pendingDeltaAfterFees;\n position.deltaPercentageAfterFees = position.pendingDeltaAfterFees\n .mul(BASIS_POINTS_DIVISOR)\n .div(position.collateral);\n\n const { deltaStr: deltaAfterFeesStr, deltaPercentageStr: deltaAfterFeesPercentageStr } = getDeltaStr({\n delta: position.pendingDeltaAfterFees,\n deltaPercentage: position.deltaPercentageAfterFees,\n hasProfit: hasProfitAfterFees,\n });\n\n position.deltaAfterFeesStr = deltaAfterFeesStr;\n position.deltaAfterFeesPercentageStr = deltaAfterFeesPercentageStr;\n\n if (showPnlAfterFees) {\n position.deltaStr = position.deltaAfterFeesStr;\n position.deltaPercentageStr = position.deltaAfterFeesPercentageStr;\n }\n\n let netValue = position.hasProfit\n ? position.collateral.add(position.pendingDelta)\n : position.collateral.sub(position.pendingDelta);\n\n netValue = netValue.sub(position.fundingFee);\n\n if (showPnlAfterFees) {\n netValue = netValue.sub(position.closingFee);\n }\n\n position.netValue = netValue;\n }\n\n position.leverage = getLeverage({\n size: position.size,\n collateral: position.collateral,\n entryFundingRate: position.entryFundingRate,\n cumulativeFundingRate: position.cumulativeFundingRate,\n hasProfit: position.hasProfit,\n delta: position.delta,\n includeDelta,\n });\n\n positionsMap[key] = position;\n\n applyPendingChanges(position, pendingPositions);\n\n if (position.size.gt(0) || position.hasPendingChanges) {\n positions.push(position);\n }\n }\n\n return { positions, positionsMap };\n}\n\nexport function getPositionQuery(tokens, nativeTokenAddress) {\n const collateralTokens = [];\n const indexTokens = [];\n const isLong = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.isStable) {\n continue;\n }\n if (token.isWrapped) {\n continue;\n }\n collateralTokens.push(getTokenAddress(token, nativeTokenAddress));\n indexTokens.push(getTokenAddress(token, nativeTokenAddress));\n isLong.push(true);\n }\n\n for (let i = 0; i < tokens.length; i++) {\n const stableToken = tokens[i];\n if (!stableToken.isStable) {\n continue;\n }\n\n for (let j = 0; j < tokens.length; j++) {\n const token = tokens[j];\n if (token.isStable) {\n continue;\n }\n if (token.isWrapped) {\n continue;\n }\n collateralTokens.push(stableToken.address);\n indexTokens.push(getTokenAddress(token, nativeTokenAddress));\n isLong.push(false);\n }\n }\n\n return { collateralTokens, indexTokens, isLong };\n}\n\nexport const Exchange = forwardRef((props, ref) => {\n const {\n savedIsPnlInLeverage,\n setSavedIsPnlInLeverage,\n savedShowPnlAfterFees,\n savedSlippageAmount,\n pendingTxns,\n setPendingTxns,\n savedShouldShowPositionLines,\n setSavedShouldShowPositionLines,\n connectWallet,\n savedShouldDisableValidationForTesting,\n } = props;\n const [showBanner, setShowBanner] = useLocalStorageSerializeKey(\"showBanner\", true);\n const [bannerHidden, setBannerHidden] = useLocalStorageSerializeKey(\"bannerHidden\", null);\n\n const [pendingPositions, setPendingPositions] = useState({});\n const [updatedPositions, setUpdatedPositions] = useState({});\n\n const hideBanner = () => {\n const hiddenLimit = new Date(new Date().getTime() + 2 * 24 * 60 * 60 * 1000);\n setBannerHidden(hiddenLimit);\n setShowBanner(false);\n };\n\n useEffect(() => {\n if (new Date() > new Date(\"2021-11-30\")) {\n setShowBanner(false);\n } else {\n if (bannerHidden && new Date(bannerHidden) > new Date()) {\n setShowBanner(false);\n } else {\n setBannerHidden(null);\n setShowBanner(true);\n }\n }\n }, [showBanner, bannerHidden, setBannerHidden, setShowBanner]);\n\n const { active, account, library } = useWeb3React();\n const { chainId } = useChainId();\n const currentAccount = account;\n\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n\n const vaultAddress = getContract(chainId, \"Vault\");\n const positionRouterAddress = getContract(chainId, \"PositionRouter\");\n const readerAddress = getContract(chainId, \"Reader\");\n const usdfAddress = getContract(chainId, \"USDF\");\n\n const whitelistedTokens = getWhitelistedTokens(chainId);\n const whitelistedTokenAddresses = whitelistedTokens.map((token) => token.address);\n\n const positionQuery = getPositionQuery(whitelistedTokens, nativeTokenAddress);\n\n const defaultCollateralSymbol = getConstant(chainId, \"defaultCollateralSymbol\");\n const defaultTokenSelection = useMemo(\n () => ({\n [SWAP]: {\n from: AddressZero,\n to: getTokenBySymbol(chainId, defaultCollateralSymbol).address,\n },\n [LONG]: {\n from: AddressZero,\n to: AddressZero,\n },\n [SHORT]: {\n from: getTokenBySymbol(chainId, defaultCollateralSymbol).address,\n to: AddressZero,\n },\n }),\n [chainId, defaultCollateralSymbol]\n );\n\n const [tokenSelection, setTokenSelection] = useLocalStorageByChainId(\n chainId,\n \"Exchange-token-selection-v2\",\n defaultTokenSelection\n );\n const [swapOption, setSwapOption] = useLocalStorageByChainId(chainId, \"Swap-option-v2\", LONG);\n\n const fromTokenAddress = tokenSelection[swapOption].from;\n const toTokenAddress = tokenSelection[swapOption].to;\n\n const setFromTokenAddress = useCallback(\n (selectedSwapOption, address) => {\n const newTokenSelection = JSON.parse(JSON.stringify(tokenSelection));\n newTokenSelection[selectedSwapOption].from = address;\n setTokenSelection(newTokenSelection);\n },\n [tokenSelection, setTokenSelection]\n );\n\n const setToTokenAddress = useCallback(\n (selectedSwapOption, address) => {\n const newTokenSelection = JSON.parse(JSON.stringify(tokenSelection));\n newTokenSelection[selectedSwapOption].to = address;\n if (selectedSwapOption === LONG || selectedSwapOption === SHORT) {\n newTokenSelection[LONG].to = address;\n newTokenSelection[SHORT].to = address;\n }\n setTokenSelection(newTokenSelection);\n },\n [tokenSelection, setTokenSelection]\n );\n\n const setMarket = (selectedSwapOption, toTokenAddress) => {\n setSwapOption(selectedSwapOption);\n const newTokenSelection = JSON.parse(JSON.stringify(tokenSelection));\n newTokenSelection[selectedSwapOption].to = toTokenAddress;\n if (selectedSwapOption === LONG || selectedSwapOption === SHORT) {\n newTokenSelection[LONG].to = toTokenAddress;\n newTokenSelection[SHORT].to = toTokenAddress;\n }\n setTokenSelection(newTokenSelection);\n };\n\n const [isConfirming, setIsConfirming] = useState(false);\n const [isPendingConfirmation, setIsPendingConfirmation] = useState(false);\n\n const tokens = getTokens(chainId);\n\n const tokenAddresses = tokens.map((token) => token.address);\n const { data: tokenBalances } = useSWR(active && [active, chainId, readerAddress, \"getTokenBalances\", account], {\n fetcher: contractFetcher(library, Reader, [tokenAddresses]),\n });\n\n const { data: positionData, error: positionDataError } = useSWR(\n active && [active, chainId, readerAddress, \"getPositions\", vaultAddress, account],\n {\n fetcher: contractFetcher(library, Reader, [\n positionQuery.collateralTokens,\n positionQuery.indexTokens,\n positionQuery.isLong,\n ]),\n }\n );\n\n const positionsDataIsLoading = active && !positionData && !positionDataError;\n\n const { data: fundingRateInfo } = useSWR([active, chainId, readerAddress, \"getFundingRates\"], {\n fetcher: contractFetcher(library, Reader, [vaultAddress, nativeTokenAddress, whitelistedTokenAddresses]),\n });\n\n const { data: totalTokenWeights } = useSWR(\n [`Exchange:totalTokenWeights:${active}`, chainId, vaultAddress, \"totalTokenWeights\"],\n {\n fetcher: contractFetcher(library, Vault),\n }\n );\n\n const { data: usdfSupply } = useSWR([`Exchange:usdfSupply:${active}`, chainId, usdfAddress, \"totalSupply\"], {\n fetcher: contractFetcher(library, Token),\n });\n\n const orderBookAddress = getContract(chainId, \"OrderBook\");\n const routerAddress = getContract(chainId, \"Router\");\n const { data: orderBookApproved } = useSWR(\n active && [active, chainId, routerAddress, \"approvedPlugins\", account, orderBookAddress],\n {\n fetcher: contractFetcher(library, Router),\n }\n );\n\n const { data: positionRouterApproved } = useSWR(\n active && [active, chainId, routerAddress, \"approvedPlugins\", account, positionRouterAddress],\n {\n fetcher: contractFetcher(library, Router),\n }\n );\n\n const { infoTokens } = useInfoTokens(library, chainId, active, tokenBalances, fundingRateInfo);\n const { minExecutionFee, minExecutionFeeUSD, minExecutionFeeErrorMessage } = useMinExecutionFee(\n library,\n active,\n chainId,\n infoTokens\n );\n\n useEffect(() => {\n const fromToken = getTokenInfo(infoTokens, fromTokenAddress);\n const toToken = getTokenInfo(infoTokens, toTokenAddress);\n let selectedToken = getChartToken(swapOption, fromToken, toToken, chainId);\n let currentTokenPriceStr = formatPrice(selectedToken.maxPrice, true);\n let title = getPageTitle(currentTokenPriceStr + ` | ${selectedToken.symbol}${selectedToken.isStable ? \"\" : \"USD\"}`);\n document.title = title;\n }, [tokenSelection, swapOption, infoTokens, chainId, fromTokenAddress, toTokenAddress]);\n\n const { positions, positionsMap } = getPositions(\n chainId,\n positionQuery,\n positionData,\n infoTokens,\n savedIsPnlInLeverage,\n savedShowPnlAfterFees,\n account,\n pendingPositions,\n updatedPositions\n );\n\n useImperativeHandle(ref, () => ({\n onUpdatePosition(key, size, collateral, averagePrice, entryFundingRate, reserveAmount, realisedPnl) {\n for (let i = 0; i < positions.length; i++) {\n const position = positions[i];\n if (position.contractKey === key) {\n updatedPositions[position.key] = {\n size,\n collateral,\n averagePrice,\n entryFundingRate,\n reserveAmount,\n realisedPnl,\n updatedAt: Date.now(),\n };\n setUpdatedPositions({ ...updatedPositions });\n break;\n }\n }\n },\n onClosePosition(key, size, collateral, averagePrice, entryFundingRate, reserveAmount, realisedPnl, e) {\n for (let i = 0; i < positions.length; i++) {\n const position = positions[i];\n if (position.contractKey === key) {\n updatedPositions[position.key] = {\n size: bigNumberify(0),\n collateral: bigNumberify(0),\n averagePrice,\n entryFundingRate,\n reserveAmount,\n realisedPnl,\n updatedAt: Date.now(),\n };\n setUpdatedPositions({ ...updatedPositions });\n break;\n }\n }\n },\n\n onIncreasePosition(key, account, collateralToken, indexToken, collateralDelta, sizeDelta, isLong, price, fee, e) {\n if (account !== currentAccount) {\n return;\n }\n\n const indexTokenItem = getToken(chainId, indexToken);\n const tokenSymbol = indexTokenItem.isWrapped ? getConstant(chainId, \"nativeTokenSymbol\") : indexTokenItem.symbol;\n const longOrShortText = isLong ? t`Long` : t`Short`;\n let message;\n if (sizeDelta.eq(0)) {\n message = t`Deposited ${formatAmount(\n collateralDelta,\n USD_DECIMALS,\n 2,\n true\n )} USD into ${tokenSymbol} ${longOrShortText}`;\n } else {\n message = t`Increased ${tokenSymbol} ${longOrShortText}, +${formatAmount(\n sizeDelta,\n USD_DECIMALS,\n 2,\n true\n )} USD.`;\n }\n\n pushSuccessNotification(chainId, message, e);\n },\n\n onDecreasePosition(key, account, collateralToken, indexToken, collateralDelta, sizeDelta, isLong, price, fee, e) {\n if (account !== currentAccount) {\n return;\n }\n\n const indexTokenItem = getToken(chainId, indexToken);\n const tokenSymbol = indexTokenItem.isWrapped ? getConstant(chainId, \"nativeTokenSymbol\") : indexTokenItem.symbol;\n const longOrShortText = isLong ? t`Long` : t`Short`;\n\n let message;\n if (sizeDelta.eq(0)) {\n message = t`Withdrew ${formatAmount(\n collateralDelta,\n USD_DECIMALS,\n 2,\n true\n )} USD from ${tokenSymbol} ${longOrShortText}.`;\n } else {\n message = t`Decreased ${tokenSymbol} ${longOrShortText}, -${formatAmount(\n sizeDelta,\n USD_DECIMALS,\n 2,\n true\n )} USD.`;\n }\n\n pushSuccessNotification(chainId, message, e);\n },\n\n onCancelIncreasePosition(\n account,\n path,\n indexToken,\n amountIn,\n minOut,\n sizeDelta,\n isLong,\n acceptablePrice,\n executionFee,\n blockGap,\n timeGap,\n e\n ) {\n if (account !== currentAccount) {\n return;\n }\n const indexTokenItem = getToken(chainId, indexToken);\n const tokenSymbol = indexTokenItem.isWrapped ? getConstant(chainId, \"nativeTokenSymbol\") : indexTokenItem.symbol;\n const longOrShortText = isLong ? t`Long` : t`Short`;\n\n const message = t`Could not increase ${tokenSymbol} ${longOrShortText} within the allowed slippage, you can adjust the allowed slippage in the settings on the top right of the page.`;\n pushErrorNotification(chainId, message, e);\n\n const key = getPositionKey(account, path[path.length - 1], indexToken, isLong);\n pendingPositions[key] = {};\n setPendingPositions({ ...pendingPositions });\n },\n\n onCancelDecreasePosition(\n account,\n path,\n indexToken,\n collateralDelta,\n sizeDelta,\n isLong,\n receiver,\n acceptablePrice,\n minOut,\n executionFee,\n blockGap,\n timeGap,\n e\n ) {\n if (account !== currentAccount) {\n return;\n }\n const indexTokenItem = getToken(chainId, indexToken);\n const tokenSymbol = indexTokenItem.isWrapped ? getConstant(chainId, \"nativeTokenSymbol\") : indexTokenItem.symbol;\n const longOrShortText = isLong ? t`Long` : t`Short`;\n\n const message = t`Could not decrease ${tokenSymbol} ${longOrShortText} within the allowed slippage, you can adjust the allowed slippage in the settings on the top right of the page.`;\n\n pushErrorNotification(chainId, message, e);\n\n const key = getPositionKey(account, path[path.length - 1], indexToken, isLong);\n pendingPositions[key] = {};\n setPendingPositions({ ...pendingPositions });\n },\n }));\n\n const flagOrdersEnabled = true;\n const [orders] = useAccountOrders(flagOrdersEnabled);\n\n const [isWaitingForPluginApproval, setIsWaitingForPluginApproval] = useState(false);\n const [isWaitingForPositionRouterApproval, setIsWaitingForPositionRouterApproval] = useState(false);\n const [isPluginApproving, setIsPluginApproving] = useState(false);\n const [isPositionRouterApproving, setIsPositionRouterApproving] = useState(false);\n const [isCancelMultipleOrderProcessing, setIsCancelMultipleOrderProcessing] = useState(false);\n const [cancelOrderIdList, setCancelOrderIdList] = useState([]);\n\n const onMultipleCancelClick = useCallback(\n async function () {\n setIsCancelMultipleOrderProcessing(true);\n try {\n const tx = await cancelMultipleOrders(chainId, library, cancelOrderIdList, {\n successMsg: t`Orders cancelled.`,\n failMsg: t`Cancel failed.`,\n sentMsg: t`Cancel submitted.`,\n pendingTxns,\n setPendingTxns,\n });\n const receipt = await tx.wait();\n if (receipt.status === 1) {\n setCancelOrderIdList([]);\n }\n } catch (error) {\n console.error(error);\n } finally {\n setIsCancelMultipleOrderProcessing(false);\n }\n },\n [\n chainId,\n library,\n pendingTxns,\n setPendingTxns,\n setCancelOrderIdList,\n cancelOrderIdList,\n setIsCancelMultipleOrderProcessing,\n ]\n );\n\n const approveOrderBook = () => {\n setIsPluginApproving(true);\n return approvePlugin(chainId, orderBookAddress, {\n library,\n pendingTxns,\n setPendingTxns,\n sentMsg: t`Enable orders sent.`,\n failMsg: t`Enable orders failed.`,\n })\n .then(() => {\n setIsWaitingForPluginApproval(true);\n })\n .finally(() => {\n setIsPluginApproving(false);\n });\n };\n\n const approvePositionRouter = ({ sentMsg, failMsg }) => {\n setIsPositionRouterApproving(true);\n return approvePlugin(chainId, positionRouterAddress, {\n library,\n pendingTxns,\n setPendingTxns,\n sentMsg,\n failMsg,\n })\n .then(() => {\n setIsWaitingForPositionRouterApproval(true);\n })\n .finally(() => {\n setIsPositionRouterApproving(false);\n });\n };\n const POSITIONS = \"Positions\";\n const ORDERS = \"Orders\";\n const TRADES = \"Trades\";\n\n const LIST_SECTIONS = [POSITIONS, flagOrdersEnabled && ORDERS, TRADES].filter(Boolean);\n let [listSection, setListSection] = useLocalStorageByChainId(chainId, \"List-section-v2\", LIST_SECTIONS[0]);\n const LIST_SECTIONS_LABELS = {\n [ORDERS]: orders.length ? t`Orders (${orders.length})` : t`Orders`,\n [POSITIONS]: positions.length ? t`Positions (${positions.length})` : t`Positions`,\n [TRADES]: t`Trades`,\n };\n if (!LIST_SECTIONS.includes(listSection)) {\n listSection = LIST_SECTIONS[0];\n }\n\n if (!getToken(chainId, toTokenAddress)) {\n return null;\n }\n\n const renderCancelOrderButton = () => {\n if (cancelOrderIdList.length === 0) return;\n return (\n \n \n \n );\n };\n\n const getListSection = () => {\n return (\n
\n
\n setListSection(section)}\n type=\"inline\"\n className=\"Exchange-list-tabs\"\n />\n
\n {renderCancelOrderButton()}\n \n \n Chart positions\n \n \n
\n
\n {listSection === POSITIONS && (\n \n )}\n {listSection === ORDERS && (\n \n )}\n {listSection === TRADES && (\n \n )}\n
\n );\n };\n\n const onSelectWalletToken = (token) => {\n setFromTokenAddress(swapOption, token.address);\n };\n\n const renderChart = () => {\n return (\n \n );\n };\n\n return (\n
\n {showBanner && }\n
\n
\n {renderChart()}\n
{getListSection()}
\n
\n
\n \n
\n
\n \n
\n
\n
\n
{getListSection()}
\n
\n
\n
\n );\n});\n","import React from \"react\";\nimport useSWR from \"swr\";\nimport { ethers } from \"ethers\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport { useParams } from \"react-router-dom\";\n\nimport \"./Actions.css\";\n\nimport { getContract } from \"config/contracts\";\nimport { useAccountOrders } from \"lib/legacy\";\n\nimport { getPositions, getPositionQuery } from \"../Exchange/Exchange\";\n\nimport PositionsList from \"components/Exchange/PositionsList\";\nimport OrdersList from \"components/Exchange/OrdersList\";\n\nimport TradeHistory from \"components/Exchange/TradeHistory\";\nimport Reader from \"abis/Reader.json\";\n\nimport { Trans /*, t*/ } from \"@lingui/macro\";\n// import { getServerBaseUrl } from \"config/backend\";\nimport { contractFetcher } from \"lib/contracts\";\nimport { useInfoTokens } from \"domain/tokens\";\nimport { getTokenInfo } from \"domain/tokens/utils\";\n// import { formatAmount } from \"lib/numbers\";\nimport { getTokens, getWhitelistedTokens } from \"config/tokens\";\nimport { useChainId } from \"lib/chains\";\n\n// const USD_DECIMALS = 30;\n\nexport default function Actions() {\n const { account } = useParams();\n const { active, library } = useWeb3React();\n\n const { chainId } = useChainId();\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const vaultAddress = getContract(chainId, \"Vault\");\n const readerAddress = getContract(chainId, \"Reader\");\n\n // const shouldShowPnl = false;\n\n let checkSummedAccount = \"\";\n if (ethers.utils.isAddress(account)) {\n checkSummedAccount = ethers.utils.getAddress(account);\n }\n // const pnlUrl = `${getServerBaseUrl(chainId)}/pnl?account=${checkSummedAccount}`;\n // const { data: pnlData } = useSWR([pnlUrl], {\n // fetcher: (...args) => fetch(...args).then((res) => res.json()),\n // });\n\n const tokens = getTokens(chainId);\n const whitelistedTokens = getWhitelistedTokens(chainId);\n const positionQuery = getPositionQuery(whitelistedTokens, nativeTokenAddress);\n\n const whitelistedTokenAddresses = whitelistedTokens.map((token) => token.address);\n const tokenAddresses = tokens.map((token) => token.address);\n const { data: tokenBalances } = useSWR(checkSummedAccount && [active, chainId, readerAddress, \"getTokenBalances\", account], {\n fetcher: contractFetcher(library, Reader, [tokenAddresses]),\n });\n\n const { data: positionData } = useSWR(checkSummedAccount && [active, chainId, readerAddress, \"getPositions\", vaultAddress, account], {\n fetcher: contractFetcher(library, Reader, [\n positionQuery.collateralTokens,\n positionQuery.indexTokens,\n positionQuery.isLong,\n ]),\n });\n\n const { data: fundingRateInfo } = useSWR([active, chainId, readerAddress, \"getFundingRates\"], {\n fetcher: contractFetcher(library, Reader, [vaultAddress, nativeTokenAddress, whitelistedTokenAddresses]),\n });\n\n const { infoTokens } = useInfoTokens(library, chainId, active, tokenBalances, fundingRateInfo);\n const { positions, positionsMap } = getPositions(\n chainId,\n positionQuery,\n positionData,\n infoTokens,\n false,\n false,\n checkSummedAccount,\n undefined,\n undefined\n );\n\n const flagOrdersEnabled = true;\n const [orders, updateOrders] = useAccountOrders(flagOrdersEnabled, checkSummedAccount);\n\n return (\n
\n {checkSummedAccount.length > 0 && (\n
\n Account: {checkSummedAccount}\n
\n )}\n {/* {shouldShowPnl && (\n
\n
\n PnL\n
\n {(!pnlData || pnlData.length === 0) && (\n
\n No PnLs found\n
\n )}\n {pnlData &&\n pnlData.length > 0 &&\n pnlData.map((pnlRow, index) => {\n const token = getToken(chainId, pnlRow.data.indexToken);\n return (\n
\n
\n {token.symbol} {pnlRow.data.isLong ? t`Long` : t`Short`} Profit:{\" \"}\n {formatAmount(pnlRow.data.profit, USD_DECIMALS, 2, true)} USD\n
\n
\n {token.symbol} {pnlRow.data.isLong ? t`Long` : t`Short`} Loss:{\" \"}\n {formatAmount(pnlRow.data.loss, USD_DECIMALS, 2, true)} USD\n
\n
\n );\n })}\n
\n )} */}\n {checkSummedAccount.length > 0 && (\n
\n
\n Positions\n
\n \n
\n )}\n {flagOrdersEnabled && checkSummedAccount.length > 0 && (\n
\n
\n Orders\n
\n \n
\n )}\n
\n
\n Actions\n
\n \n
\n
\n );\n}\n","import { useWeb3React } from \"@web3-react/core\";\nimport cx from \"classnames\";\n\nimport { NavLink } from \"react-router-dom\";\n\nimport { getContract } from \"config/contracts\";\nimport * as Api from \"domain/legacy\";\nimport { useAllOrders, useAllOrdersStats, usePositionsForOrders } from \"domain/legacy\";\nimport {\n DECREASE,\n getExchangeRate,\n getExchangeRateDisplay,\n getOrderKey,\n INCREASE,\n shortenAddress,\n shouldInvertTriggerRatio,\n SWAP,\n USD_DECIMALS,\n} from \"lib/legacy\";\n\nimport \"./OrdersOverview.css\";\nimport { t, Trans } from \"@lingui/macro\";\nimport { getTokenInfo } from \"domain/tokens/utils\";\nimport { useInfoTokens } from \"domain/tokens\";\nimport { formatAmount, formatPrice } from \"lib/numbers\";\nimport { useChainId } from \"lib/chains\";\nimport { formatDateTime } from \"lib/dates\";\n\nexport default function OrdersOverview() {\n const { chainId } = useChainId();\n const { library, account, active } = useWeb3React();\n\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n\n const { infoTokens } = useInfoTokens(library, chainId, active, undefined, undefined);\n\n const orders = useAllOrders(chainId, library);\n const stats = useAllOrdersStats(chainId);\n\n const positionsForOrders = usePositionsForOrders(\n chainId,\n library,\n orders.filter((order) => order.type === DECREASE)\n );\n\n let openTotal;\n let executedTotal;\n let cancelledTotal;\n\n if (stats) {\n openTotal = stats.openDecrease + stats.openIncrease + stats.openSwap;\n executedTotal = stats.executedDecrease + stats.executedIncrease + stats.executedSwap;\n cancelledTotal = stats.cancelledDecrease + stats.cancelledIncrease + stats.cancelledSwap;\n }\n\n const NEAR_TRESHOLD = 98;\n\n const executeOrder = (evt, order) => {\n evt.preventDefault();\n\n const params = [chainId, library, order.account, order.index, account];\n let method;\n if (order.type === \"Swap\") {\n method = \"executeSwapOrder\";\n } else if (order.type === \"Increase\") {\n method = \"executeIncreaseOrder\";\n } else {\n method = \"executeDecreaseOrder\";\n }\n return Api[method](...params);\n };\n\n return (\n
\n {stats && (\n

\n \n Total active: {openTotal}, executed: {executedTotal}, cancelled: {cancelledTotal}\n \n
\n \n Increase active: {stats.openIncrease}, executed: {stats.executedIncrease}, cancelled:{\" \"}\n {stats.cancelledIncrease}\n \n
\n \n Decrease active: {stats.openDecrease}, executed: {stats.executedDecrease}, cancelled:{\" \"}\n {stats.cancelledDecrease}\n \n
\n \n Swap active: {stats.openSwap}, executed: {stats.executedSwap}, cancelled: {stats.cancelledSwap}\n \n
\n

\n )}\n

\n \n Price conditions are met\n \n
\n \n Close to execution price\n \n
\n \n Can't execute because of an error\n \n

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {orders.map((order) => {\n const { type } = order;\n const key = getOrderKey(order);\n if (type === SWAP) {\n const fromToken = getTokenInfo(infoTokens, order.path[0], true, nativeTokenAddress);\n const toTokenAddress = order.path[order.path.length - 1];\n const toToken = getTokenInfo(infoTokens, toTokenAddress, order.shoudUnwrap, nativeTokenAddress);\n\n let markExchangeRate;\n let prefix;\n let shouldExecute;\n let nearExecute;\n let diffPercent;\n let invalidToken = false;\n let error;\n if (fromToken && toToken) {\n const invert = shouldInvertTriggerRatio(fromToken, toToken);\n markExchangeRate = getExchangeRate(fromToken, toToken);\n prefix =\n (order.triggerAboveThreshold && !invert) || (!order.triggerAboveThreshold && invert) ? \"> \" : \"< \";\n shouldExecute = markExchangeRate && markExchangeRate.lt(order.triggerRatio);\n nearExecute = markExchangeRate && markExchangeRate.lt(order.triggerRatio.mul(100).div(NEAR_TRESHOLD));\n\n if (markExchangeRate) {\n const diff = order.triggerRatio.gt(markExchangeRate)\n ? order.triggerRatio.sub(markExchangeRate)\n : markExchangeRate.sub(order.triggerRatio);\n diffPercent = diff.mul(10000).div(markExchangeRate);\n }\n } else {\n invalidToken = true;\n error = t`Invalid token fromToken: \"${order.path0}\" toToken: \"${toTokenAddress}\"`;\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n } else {\n const indexToken = getTokenInfo(infoTokens, order.indexToken, true, nativeTokenAddress);\n const collateralToken = getTokenInfo(infoTokens, order.collateralToken, true, nativeTokenAddress);\n const purchaseToken = getTokenInfo(infoTokens, order.purchaseToken);\n\n let markPrice;\n let error;\n if (indexToken && collateralToken && (order.type === DECREASE || purchaseToken)) {\n markPrice = order.triggerAboveThreshold ? indexToken.minPrice : indexToken.maxPrice;\n } else {\n error = t`Invalid token indexToken: \"${order.indexToken}\" collateralToken: \"${order.collateralToken}\"`;\n if (order.type === \"increase\") {\n error += ` purchaseToken: ${order.purchaseToken}`;\n }\n }\n\n let shouldExecute;\n let nearExecute;\n let diffPercent;\n if (markPrice) {\n shouldExecute = order.triggerAboveThreshold\n ? markPrice.gt(order.triggerPrice)\n : markPrice.lt(order.triggerPrice);\n\n nearExecute = order.triggerAboveThreshold\n ? markPrice.gt(order.triggerPrice.mul(NEAR_TRESHOLD).div(100))\n : markPrice.lt(order.triggerPrice.mul(100).div(NEAR_TRESHOLD));\n\n const diff = markPrice.gt(order.triggerPrice)\n ? markPrice.sub(order.triggerPrice)\n : order.triggerPrice.sub(markPrice);\n diffPercent = diff.mul(10000).div(markPrice);\n }\n\n if (!error && type === DECREASE) {\n if (positionsForOrders && key in positionsForOrders) {\n const position = positionsForOrders[key];\n if (!position) {\n error = t`No position`;\n } else if (order.sizeDelta.gt(position[0])) {\n error = t`Order size exceeds position`;\n } else if (order.sizeDelta.eq(0)) {\n error = t`Order size is 0`;\n }\n }\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n })}\n \n
\n Type\n \n Order\n \n Price\n \n Mark Price\n \n Diff\n \n Account\n \n Created At\n \n Index\n
\n Swap\n \n {!invalidToken && (\n <>\n {formatAmount(order.amountIn, fromToken.decimals, 4, true)} {fromToken.symbol}\n  for \n {formatAmount(order.minOut, toToken.decimals, 4, true)} {toToken.symbol}\n \n )}\n \n {!invalidToken && prefix}\n {getExchangeRateDisplay(order.triggerRatio, fromToken, toToken)}\n \n {getExchangeRateDisplay(markExchangeRate, fromToken, toToken)}\n \n {formatAmount(diffPercent, 2, 2)}%\n \n {shortenAddress(order.account)}\n {formatDateTime(order.createdTimestamp)}{order.index}{error}\n \n
{order.type}\n {order.isLong ? t`Long` : t`Short`} {indexToken && indexToken.symbol}\n \n {type === INCREASE ? \"+\" : \"-\"}${formatAmount(order.sizeDelta, USD_DECIMALS, 2, true)}\n \n {order.triggerAboveThreshold ? \"> \" : \"< \"}\n {formatPrice(order.triggerPrice, true)}\n \n ${formatPrice(markPrice, true)}\n \n {formatAmount(diffPercent, 2, 2)}%\n \n {shortenAddress(order.account, 12)}\n {formatDateTime(order.createdTimestamp)}{order.index}{error}\n \n
\n
\n );\n}\n","import { Trans } from \"@lingui/macro\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport cx from \"classnames\";\n\nimport { useAllPositions } from \"domain/legacy\";\nimport { USD_DECIMALS } from \"lib/legacy\";\n\nimport \"./PositionsOverview.css\";\nimport { formatAmount } from \"lib/numbers\";\nimport { useChainId } from \"lib/chains\";\nimport { getTimeRemaining } from \"lib/dates\";\n\nexport default function PositionsOverview() {\n const { chainId } = useChainId();\n const { library } = useWeb3React();\n\n const positions = useAllPositions(chainId, library);\n\n return (\n
\n

\n \n Open positions: {positions.length}\n
\n Under risk: {positions.filter((p) => p.danger).length}\n
\n

\n \n \n \n \n \n \n \n \n \n \n \n {positions &&\n positions\n .filter((p) => p.danger)\n .map((position) => {\n const { size, account, collateral, fee, danger } = position;\n\n const diffToLiq = position.collateral.sub(position.fee);\n const fundingFee = 80;\n const feesPerHour = position.size.mul(fundingFee).div(1000000);\n const hoursToLiq = diffToLiq.div(feesPerHour);\n const liqTime = hoursToLiq.toNumber() * 60 * 60 + Date.now() / 1000;\n return (\n \n \n \n \n \n \n \n );\n })}\n \n
\n account\n \n size\n \n collateral\n \n fee\n \n time to liq\n
{account}${formatAmount(size, USD_DECIMALS, 2, true)}${formatAmount(collateral, USD_DECIMALS, 2, true)}${formatAmount(fee, USD_DECIMALS, 2, true)}\n {getTimeRemaining(liqTime)} (${formatAmount(feesPerHour, USD_DECIMALS, 2, true)}/h)\n
\n
\n );\n}\n","import \"./Loader.css\";\n\nexport default function Loader() {\n return (\n
\n
\n
\n
\n
\n );\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useDebounce(value, delay) {\n // State and setters for debounced value\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(\n () => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\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 },\n [value, delay] // Only re-call effect if value or delay changes\n );\n\n return debouncedValue;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport { setTraderReferralCodeByUser, validateReferralCodeExists } from \"domain/referrals\";\nimport { REFERRAL_CODE_REGEX } from \"./referralsHelper\";\nimport { useDebounce } from \"lib/useDebounce\";\n\nfunction JoinReferralCode({ setPendingTxns, pendingTxns, active, connectWallet }) {\n return (\n
\n

\n Enter Referral Code\n

\n

\n Please input a referral code to benefit from fee discounts.\n

\n
\n {active ? (\n \n ) : (\n \n )}\n
\n
\n );\n}\n\nexport function ReferralCodeForm({\n setPendingTxns,\n pendingTxns,\n callAfterSuccess,\n userReferralCodeString = \"\",\n type = \"join\",\n}) {\n const { account, library, chainId } = useWeb3React();\n const [referralCode, setReferralCode] = useState(\"\");\n const inputRef = useRef(\"\");\n const [isValidating, setIsValidating] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [referralCodeExists, setReferralCodeExists] = useState(true);\n const debouncedReferralCode = useDebounce(referralCode, 300);\n\n function getPrimaryText() {\n const isEdit = type === \"edit\";\n if (isEdit && debouncedReferralCode === userReferralCodeString) {\n return t`Same as current active code`;\n }\n if (isEdit && isSubmitting) {\n return t`Updating...`;\n }\n\n if (isSubmitting) {\n return t`Adding...`;\n }\n if (debouncedReferralCode === \"\") {\n return t`Enter Referral Code`;\n }\n if (isValidating) {\n return t`Checking code...`;\n }\n if (!referralCodeExists) {\n return t`Referral Code does not exist`;\n }\n\n return isEdit ? t`Update` : t`Submit`;\n }\n function isPrimaryEnabled() {\n if (\n debouncedReferralCode === \"\" ||\n isSubmitting ||\n isValidating ||\n !referralCodeExists ||\n debouncedReferralCode === userReferralCodeString\n ) {\n return false;\n }\n return true;\n }\n\n async function handleSubmit(event) {\n const isEdit = type === \"edit\";\n event.preventDefault();\n setIsSubmitting(true);\n\n try {\n const tx = await setTraderReferralCodeByUser(chainId, referralCode, library, {\n account,\n successMsg: isEdit ? t`Referral code updated!` : t`Referral code added!`,\n failMsg: isEdit ? t`Referral code updated failed.` : t`Adding referral code failed.`,\n setPendingTxns,\n pendingTxns,\n });\n if (callAfterSuccess) {\n callAfterSuccess();\n }\n const receipt = await tx.wait();\n if (receipt.status === 1) {\n setReferralCode(\"\");\n }\n } catch (error) {\n console.error(error);\n } finally {\n setIsSubmitting(false);\n setIsValidating(false);\n }\n }\n\n useEffect(() => {\n let cancelled = false;\n async function checkReferralCode() {\n if (debouncedReferralCode === \"\" || !REFERRAL_CODE_REGEX.test(debouncedReferralCode)) {\n setIsValidating(false);\n setReferralCodeExists(false);\n return;\n }\n\n setIsValidating(true);\n const codeExists = await validateReferralCodeExists(debouncedReferralCode, chainId);\n if (!cancelled) {\n setReferralCodeExists(codeExists);\n setIsValidating(false);\n }\n }\n checkReferralCode();\n return () => {\n cancelled = true;\n };\n }, [debouncedReferralCode, chainId]);\n\n useEffect(() => {\n inputRef.current.focus();\n }, []);\n\n return (\n
\n {\n const { value } = target;\n setReferralCode(value);\n }}\n />\n \n \n );\n}\nexport default JoinReferralCode;\n","import Tooltip from \"../Tooltip/Tooltip\";\nimport \"./Card.css\";\n\nfunction Card({ title, children, className, tooltipText }) {\n return (\n
\n {tooltipText ? (\n {title}
}\n position=\"left-bottom\"\n renderContent={() => tooltipText}\n />\n ) : (\n
{title}
\n )}\n
\n
{children}
\n \n );\n}\n\nexport default Card;\n","import Tooltip from \"../Tooltip/Tooltip\";\n\nfunction EmptyMessage({ message = \"\", tooltipText }) {\n return (\n
\n {tooltipText ? (\n {message}

} position=\"center-bottom\" renderContent={() => tooltipText} />\n ) : (\n

{message}

\n )}\n
\n );\n}\n\nexport default EmptyMessage;\n","import Tooltip from \"../Tooltip/Tooltip\";\n\nfunction InfoCard({ label, data, tooltipText, toolTipPosition = \"left-bottom\" }) {\n return (\n
\n
\n

\n {tooltipText ? (\n tooltipText} />\n ) : (\n label\n )}\n

\n
{data}
\n
\n
\n );\n}\n\nexport default InfoCard;\n","import { useEffect, useRef, useState } from \"react\";\nimport { Trans, t } from \"@lingui/macro\";\nimport cx from \"classnames\";\nimport { getCodeError, getReferralCodeTakenStatus, getSampleReferrarStat } from \"./referralsHelper\";\nimport { useWeb3React } from \"@web3-react/core\";\n// import { ARBITRUM } from \"config/chains\";\nimport { helperToast } from \"lib/helperToast\";\nimport { useDebounce } from \"lib/useDebounce\";\nimport { ethers } from \"ethers\";\n\nfunction AddAffiliateCode({\n handleCreateReferralCode,\n active,\n connectWallet,\n setRecentlyAddedCodes,\n recentlyAddedCodes,\n}) {\n return (\n
\n

\n Generate Referral Code\n

\n

\n \n Looks like you don't have a referral code to share.
Create one now and start earning rebates!\n
\n

\n
\n {active ? (\n \n ) : (\n \n )}\n
\n
\n );\n}\n\nexport function AffiliateCodeForm({\n handleCreateReferralCode,\n recentlyAddedCodes,\n setRecentlyAddedCodes,\n callAfterSuccess,\n}) {\n const [referralCode, setReferralCode] = useState(\"\");\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState(\"\");\n const inputRef = useRef(\"\");\n const [referralCodeCheckStatus, setReferralCodeCheckStatus] = useState(\"ok\");\n const debouncedReferralCode = useDebounce(referralCode, 300);\n const { account, chainId } = useWeb3React();\n useEffect(() => {\n inputRef.current.focus();\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n const checkCodeTakenStatus = async () => {\n if (error) {\n setReferralCodeCheckStatus(\"ok\");\n return;\n }\n const { status: takenStatus } = await getReferralCodeTakenStatus(account, debouncedReferralCode, chainId);\n // ignore the result if the referral code to check has changed\n if (cancelled) {\n return;\n }\n if (takenStatus === \"none\") {\n setReferralCodeCheckStatus(\"ok\");\n } else {\n setReferralCodeCheckStatus(\"taken\");\n }\n };\n setReferralCodeCheckStatus(\"checking\");\n checkCodeTakenStatus();\n return () => {\n cancelled = true;\n };\n }, [account, debouncedReferralCode, error, chainId]);\n\n function getButtonError() {\n if (!debouncedReferralCode) {\n return t`Enter a code`;\n }\n if (referralCodeCheckStatus === \"taken\") {\n return t`Code already taken`;\n }\n if (referralCodeCheckStatus === \"checking\") {\n return t`Checking code...`;\n }\n\n return false;\n }\n\n const buttonError = getButtonError();\n\n function getPrimaryText() {\n if (buttonError) {\n return buttonError;\n }\n\n if (isProcessing) {\n return t`Creating...`;\n }\n\n return t`Create`;\n }\n function isPrimaryEnabled() {\n if (buttonError) {\n return false;\n }\n if (error || isProcessing) {\n return false;\n }\n return true;\n }\n\n async function handleSubmit(event) {\n event.preventDefault();\n setIsProcessing(true);\n const { status: takenStatus /*, info: takenInfo*/ } = await getReferralCodeTakenStatus(account, referralCode, chainId);\n if ([\"all\", \"current\", \"other\"].includes(takenStatus)) {\n setIsProcessing(false);\n }\n\n if (takenStatus === \"none\" || takenStatus === \"other\") {\n // const ownerOnOtherNetwork = takenInfo[chainId === ARBITRUM ? \"ownerAvax\" : \"ownerArbitrum\"];\n try {\n const tx = await handleCreateReferralCode(referralCode);\n if (callAfterSuccess) {\n callAfterSuccess();\n }\n const receipt = await tx.wait();\n if (receipt.status === 1) {\n // recentlyAddedCodes.push(getSampleReferrarStat(referralCode, ownerOnOtherNetwork, account));\n recentlyAddedCodes.push(getSampleReferrarStat(referralCode, ethers.constants.AddressZero, account));\n\n helperToast.success(t`Referral code created!`);\n setRecentlyAddedCodes(recentlyAddedCodes);\n setReferralCode(\"\");\n }\n } catch (err) {\n console.error(err);\n } finally {\n setIsProcessing(false);\n }\n }\n }\n\n return (\n
\n {\n const { value } = target;\n setReferralCode(value);\n setError(getCodeError(value));\n }}\n />\n {error &&

{error}

}\n \n \n );\n}\n\nexport default AddAffiliateCode;\n","import { useMemo, useRef, useState } from \"react\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { FiPlus, FiTwitter } from \"react-icons/fi\";\nimport { useCopyToClipboard } from \"react-use\";\nimport { IoWarningOutline } from \"react-icons/io5\";\nimport { BiCopy, BiErrorCircle } from \"react-icons/bi\";\nimport Card from \"../Common/Card\";\nimport Modal from \"../Modal/Modal\";\nimport { shortenAddress } from \"lib/legacy\";\nimport EmptyMessage from \"./EmptyMessage\";\nimport InfoCard from \"./InfoCard\";\nimport {\n getReferralCodeTradeUrl,\n getTierIdDisplay,\n getTwitterShareUrl,\n getUSDValue,\n isRecentReferralCodeNotExpired,\n tierRebateInfo,\n} from \"./referralsHelper\";\nimport { AffiliateCodeForm } from \"./AddAffiliateCode\";\nimport TooltipWithPortal from \"../Tooltip/TooltipWithPortal\";\nimport { AVALANCHE, getExplorerUrl } from \"config/chains\";\nimport { helperToast } from \"lib/helperToast\";\nimport { bigNumberify, formatAmount } from \"lib/numbers\";\nimport { getNativeToken, getToken } from \"config/tokens\";\nimport { formatDate } from \"lib/dates\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nfunction AffiliatesStats({\n referralsData,\n handleCreateReferralCode,\n chainId,\n setRecentlyAddedCodes,\n recentlyAddedCodes,\n}) {\n const [isAddReferralCodeModalOpen, setIsAddReferralCodeModalOpen] = useState(false);\n const addNewModalRef = useRef(null);\n\n const [, copyToClipboard] = useCopyToClipboard();\n const open = () => setIsAddReferralCodeModalOpen(true);\n const close = () => setIsAddReferralCodeModalOpen(false);\n\n const { cumulativeStats, referrerTotalStats, rebateDistributions, referrerTierInfo } = referralsData;\n const allReferralCodes = referrerTotalStats.map((c) => c.referralCode.trim());\n const finalAffiliatesTotalStats = useMemo(\n () =>\n recentlyAddedCodes.filter(isRecentReferralCodeNotExpired).reduce((acc, cv) => {\n if (!allReferralCodes.includes(cv.referralCode)) {\n acc = acc.concat(cv);\n }\n return acc;\n }, referrerTotalStats),\n [allReferralCodes, referrerTotalStats, recentlyAddedCodes]\n );\n\n const tierId = referrerTierInfo?.tierId;\n let referrerRebates = bigNumberify(0);\n if (cumulativeStats && cumulativeStats.totalRebateUsd && cumulativeStats.discountUsd) {\n referrerRebates = cumulativeStats.totalRebateUsd.sub(cumulativeStats.discountUsd);\n }\n return (\n
\n
\n \n \n \n
\n
\n addNewModalRef.current?.focus()}\n >\n
\n \n
\n \n \n

\n Referral Codes{\" \"}\n \n {referrerTierInfo && t`Tier ${getTierIdDisplay(tierId)} (${tierRebateInfo[tierId]}% rebate)`}\n \n

\n \n
\n }\n >\n
\n \n \n \n \n \n \n \n \n \n \n {finalAffiliatesTotalStats.map((stat, index) => {\n const ownerOnOtherChain = stat?.ownerOnOtherChain;\n let referrerRebate = bigNumberify(0);\n if (stat && stat.totalRebateUsd && stat.discountUsd) {\n referrerRebate = stat.totalRebateUsd.sub(stat.discountUsd);\n }\n return (\n \n \n \n \n \n \n );\n })}\n \n
\n Referral Code\n \n Total Volume\n \n Traders Referred\n \n Total Rebates\n
\n
\n {stat.referralCode}\n {\n copyToClipboard(getReferralCodeTradeUrl(stat.referralCode));\n helperToast.success(\"Referral link copied to your clipboard\");\n }}\n className=\"referral-code-icon\"\n >\n \n
\n \n \n \n {ownerOnOtherChain && !ownerOnOtherChain?.isTaken && (\n
\n }\n renderContent={() => (\n
\n \n This code is not yet registered on{\" \"}\n {chainId === AVALANCHE ? \"Arbitrum\" : \"Avalanche\"}, you will not receive rebates\n there.\n
\n
\n Switch your network to create this code on{\" \"}\n {chainId === AVALANCHE ? \"Arbitrum\" : \"Avalanche\"}.\n
\n
\n )}\n />\n
\n )}\n {ownerOnOtherChain && ownerOnOtherChain?.isTaken && !ownerOnOtherChain?.isTakenByCurrentUser && (\n
\n }\n renderContent={() => (\n
\n \n This code has been taken by someone else on{\" \"}\n {chainId === AVALANCHE ? \"Arbitrum\" : \"Avalanche\"}, you will not receive rebates\n from traders using this code on {chainId === AVALANCHE ? \"Arbitrum\" : \"Avalanche\"}\n .\n \n
\n )}\n />\n
\n )}\n \n
{getUSDValue(stat.volume)}{stat.registeredReferralsCount}{getUSDValue(referrerRebate, 4)}
\n
\n \n
\n {rebateDistributions?.length > 0 ? (\n
\n \n
\n \n \n \n \n \n \n \n \n \n {rebateDistributions.map((rebate, index) => {\n let tokenInfo;\n try {\n tokenInfo = getToken(chainId, rebate.token);\n } catch {\n tokenInfo = getNativeToken(chainId);\n }\n const explorerURL = getExplorerUrl(chainId);\n return (\n \n \n \n \n \n );\n })}\n \n
\n Date\n \n Amount\n \n Transaction\n
\n {formatDate(rebate.timestamp)}\n \n {formatAmount(rebate.amount, tokenInfo.decimals, 6, true)} {tokenInfo.symbol}\n \n \n {shortenAddress(rebate.transactionHash, 13)}\n \n
\n
\n
\n
\n ) : (\n \n )}\n \n );\n}\n\nexport default AffiliatesStats;\n","import { useRef, useState } from \"react\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { BiEditAlt } from \"react-icons/bi\";\nimport Card from \"../Common/Card\";\nimport Modal from \"../Modal/Modal\";\nimport Tooltip from \"../Tooltip/Tooltip\";\nimport { shortenAddress } from \"lib/legacy\";\nimport EmptyMessage from \"./EmptyMessage\";\nimport InfoCard from \"./InfoCard\";\nimport { getTierIdDisplay, getUSDValue, tierDiscountInfo } from \"./referralsHelper\";\nimport { ReferralCodeForm } from \"./JoinReferralCode\";\nimport { getExplorerUrl } from \"config/chains\";\nimport { formatAmount } from \"lib/numbers\";\nimport { getNativeToken, getToken } from \"config/tokens\";\nimport { formatDate } from \"lib/dates\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nfunction TradersStats({ referralsData, traderTier, chainId, userReferralCodeString, setPendingTxns, pendingTxns }) {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const editModalRef = useRef(null);\n\n const open = () => setIsEditModalOpen(true);\n const close = () => setIsEditModalOpen(false);\n return (\n
\n
\n \n \n \n
\n {userReferralCodeString}\n \n
\n {traderTier && (\n
\n (\n

\n \n You will receive a {tierDiscountInfo[traderTier]}% discount on your opening and closing fees,\n this discount will be airdropped to your account every Wednesday\n \n

\n )}\n />\n
\n )}\n
\n }\n />\n editModalRef.current?.focus()}\n >\n
\n setIsEditModalOpen(false)}\n />\n
\n \n
\n {referralsData?.discountDistributions.length > 0 ? (\n
\n \n
\n \n \n \n \n \n \n \n \n \n {referralsData?.discountDistributions.map((rebate, index) => {\n let tokenInfo;\n try {\n tokenInfo = getToken(chainId, rebate.token);\n } catch {\n tokenInfo = getNativeToken(chainId);\n }\n const explorerURL = getExplorerUrl(chainId);\n return (\n \n \n \n \n \n );\n })}\n \n
\n Date\n \n Amount\n \n Transaction\n
{formatDate(rebate.timestamp)}\n {formatAmount(rebate.amount, tokenInfo.decimals, 6, true)} {tokenInfo.symbol}\n \n \n {shortenAddress(rebate.transactionHash, 20)}\n \n
\n
\n
\n
\n ) : (\n \n )}\n \n );\n}\n\nexport default TradersStats;\n","import \"./Referrals.css\";\nimport React from \"react\";\nimport { useLocalStorage } from \"react-use\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport { useParams } from \"react-router-dom\";\nimport SEO from \"components/Common/SEO\";\nimport Tab from \"components/Tab/Tab\";\nimport Loader from \"components/Common/Loader\";\nimport Footer from \"components/Footer/Footer\";\nimport { getPageTitle, isHashZero } from \"lib/legacy\";\nimport {\n useReferralsData,\n registerReferralCode,\n useCodeOwner,\n useReferrerTier,\n useUserReferralCode,\n} from \"domain/referrals\";\nimport JoinReferralCode from \"components/Referrals/JoinReferralCode\";\nimport AffiliatesStats from \"components/Referrals/AffiliatesStats\";\nimport TradersStats from \"components/Referrals/TradersStats\";\nimport AddAffiliateCode from \"components/Referrals/AddAffiliateCode\";\nimport { deserializeSampleStats, isRecentReferralCodeNotExpired } from \"components/Referrals/referralsHelper\";\nimport { ethers } from \"ethers\";\nimport { useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { REFERRALS_SELECTED_TAB_KEY } from \"config/localStorage\";\nimport { useChainId } from \"lib/chains\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst TRADERS = \"Traders\";\nconst AFFILIATES = \"Affiliates\";\nconst TAB_OPTIONS = [TRADERS, AFFILIATES];\n\nfunction Referrals({ connectWallet, setPendingTxns, pendingTxns }) {\n const { active, account: walletAccount, library } = useWeb3React();\n const { account: queryAccount } = useParams();\n let account;\n if (queryAccount && ethers.utils.isAddress(queryAccount)) {\n account = ethers.utils.getAddress(queryAccount);\n } else {\n account = walletAccount;\n }\n const { chainId } = useChainId();\n const [activeTab, setActiveTab] = useLocalStorage(REFERRALS_SELECTED_TAB_KEY, TRADERS);\n const { data: referralsData, loading } = useReferralsData(chainId, account);\n const [recentlyAddedCodes, setRecentlyAddedCodes] = useLocalStorageSerializeKey([chainId, \"REFERRAL\", account], [], {\n deserializer: deserializeSampleStats,\n });\n const { userReferralCode, userReferralCodeString } = useUserReferralCode(library, chainId, account);\n const { codeOwner } = useCodeOwner(library, chainId, account, userReferralCode);\n const { referrerTier: traderTier } = useReferrerTier(library, chainId, codeOwner);\n\n function handleCreateReferralCode(referralCode) {\n return registerReferralCode(chainId, referralCode, library, {\n sentMsg: t`Referral code submitted!`,\n failMsg: t`Referral code creation failed.`,\n pendingTxns,\n });\n }\n\n function renderAffiliatesTab() {\n const isReferralCodeAvailable =\n referralsData?.codes?.length > 0 || recentlyAddedCodes?.filter(isRecentReferralCodeNotExpired).length > 0;\n if (loading) return ;\n if (isReferralCodeAvailable) {\n return (\n \n );\n } else {\n return (\n \n );\n }\n }\n\n function renderTradersTab() {\n if (loading) return ;\n if (isHashZero(userReferralCode) || !account || !userReferralCode) {\n return (\n \n );\n }\n return (\n \n );\n }\n const TAB_OPTION_LABELS = { [TRADERS]: t`Traders`, [AFFILIATES]: t`Affiliates` };\n\n return (\n \n
\n
\n
\n
\n
\n Referrals\n
\n
\n \n Get fee discounts and earn rebates through the FXDX referral program.\n
\n For more information, please read the{\" \"}\n referral program details.\n
\n
\n
\n
\n
\n \n
\n {activeTab === AFFILIATES ? renderAffiliatesTab() : renderTradersTab()}\n
\n
\n \n );\n}\n\nexport default Referrals;\n","import React from \"react\";\nimport cx from \"classnames\";\nimport \"./BuyInputSection.css\";\nimport { Trans } from \"@lingui/macro\";\n\nexport default function BuyInputSection(props) {\n const {\n topLeftLabel,\n topRightLabel,\n onClickTopRightLabel,\n inputValue,\n onInputValueChange,\n onClickMax,\n showMaxButton,\n staticInput,\n balance,\n tokenBalance,\n } = props;\n\n return (\n
\n
\n
\n {topLeftLabel}: {balance}\n
\n
\n {topRightLabel} \n \n {tokenBalance} {/*(selectedToken && selectedToken.symbol) || defaultTokenName*/}\n \n
\n
\n
\n
\n {!staticInput && (\n \n )}\n {staticInput &&
{inputValue}
}\n {showMaxButton && (\n
\n MAX\n
\n )}\n
\n
{props.children}
\n
\n
\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { BigNumber } from \"ethers\";\nimport { ethers } from \"ethers\";\nimport Modal from \"../Modal/Modal\";\nimport { get1InchSwapUrl } from \"domain/common\";\nimport { getLowestFeeTokenForBuyFlp, InfoTokens, Token } from \"domain/tokens\";\nimport { getNativeToken } from \"config/tokens\";\nimport { t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst { AddressZero } = ethers.constants;\n\ntype Props = {\n swapToken: Token;\n isVisible: boolean;\n setIsVisible: () => void;\n chainId: number;\n flpAmount: BigNumber;\n usdfSupply: BigNumber;\n totalTokenWeights: BigNumber;\n flpPrice: BigNumber;\n swapUsdMin: BigNumber;\n infoTokens: InfoTokens;\n};\n\nexport default function SwapErrorModal({\n swapToken,\n isVisible,\n setIsVisible,\n chainId,\n flpAmount,\n usdfSupply,\n totalTokenWeights,\n flpPrice,\n infoTokens,\n swapUsdMin,\n}: Props) {\n const [lowestFeeToken, setLowestFeeToken] = useState<\n { token: Token; fees: number; amountLeftToDeposit: BigNumber } | undefined\n >();\n useEffect(() => {\n const lowestFeeTokenInfo = getLowestFeeTokenForBuyFlp(\n chainId,\n flpAmount,\n flpPrice,\n usdfSupply,\n totalTokenWeights,\n infoTokens,\n swapToken.address,\n swapUsdMin\n );\n setLowestFeeToken(lowestFeeTokenInfo);\n }, [chainId, flpAmount, flpPrice, usdfSupply, totalTokenWeights, infoTokens, swapUsdMin, swapToken.address]);\n\n const label = t`${swapToken?.symbol} Capacity Reached`;\n\n if (lowestFeeToken && swapUsdMin && swapUsdMin.gt(lowestFeeToken.amountLeftToDeposit)) {\n return (\n \n

\n \n There is not enough liquidity in a single token for your size. Please check the Save on Fees section and\n consider splitting your order into several different ones\n \n

\n

\n \n Swap on 1inch\n \n

\n
\n );\n }\n\n const nativeToken = getNativeToken(chainId);\n const inputCurrency = swapToken.address === AddressZero ? nativeToken.symbol : swapToken.address;\n const outputCurrency =\n lowestFeeToken?.token.address === AddressZero ? nativeToken.symbol : lowestFeeToken?.token.address;\n const oneInchUrl = get1InchSwapUrl(chainId, inputCurrency, outputCurrency);\n\n return (\n \n \n

The pool's capacity has been reached for {swapToken.symbol}. Please use another token to buy FLP.

\n

Check the \"Save on Fees\" section for tokens with the lowest fees.

\n
\n

\n \n \n Swap {swapToken.symbol} to {lowestFeeToken?.token.symbol} on 1inch\n \n \n

\n
\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport useSWR from \"swr\";\nimport { ethers } from \"ethers\";\nimport Tab from \"../Tab/Tab\";\nimport cx from \"classnames\";\nimport { getContract } from \"config/contracts\";\nimport {\n getBuyFlpToAmount,\n getBuyFlpFromAmount,\n getSellFlpFromAmount,\n getSellFlpToAmount,\n adjustForDecimals,\n FLP_DECIMALS,\n USD_DECIMALS,\n BASIS_POINTS_DIVISOR,\n FLP_COOLDOWN_DURATION,\n SECONDS_PER_YEAR,\n USDF_DECIMALS,\n PLACEHOLDER_ACCOUNT,\n importImage,\n} from \"lib/legacy\";\n\nimport { useFxdxPrice } from \"domain/legacy\";\n\nimport TokenSelector from \"../Exchange/TokenSelector\";\nimport BuyInputSection from \"../BuyInputSection/BuyInputSection\";\nimport Tooltip from \"../Tooltip/Tooltip\";\n\nimport Reader from \"abis/Reader.json\";\nimport RewardReader from \"abis/RewardReader.json\";\nimport Vault from \"abis/Vault.json\";\nimport FlpManager from \"abis/FlpManager.json\";\nimport RewardTracker from \"abis/RewardTracker.json\";\nimport Vester from \"abis/Vester.json\";\nimport RewardRouter from \"abis/RewardRouter.json\";\nimport Token from \"abis/Token.json\";\n\n// import flp24Icon from \"img/ic_flp_24.svg\";\n// import flp40Icon from \"img/ic_flp_40.svg\";\nimport arrowIcon from \"img/ic_convert_down.svg\";\n\n// import ethereum16Icon from \"img/ic_ethereum_16.svg\"\n// import avalanche16Icon from \"img/ic_avalanche_16.svg\";\n// import arbitrum16Icon from \"img/ic_arbitrum_16.svg\";\n// import moonbeam16Icon from \"img/ic_moonbeam_16.svg\";\n\nimport \"./FlpSwap.css\";\nimport AssetDropdown from \"pages/Dashboard/AssetDropdown\";\nimport SwapErrorModal from \"./SwapErrorModal\";\nimport StatsTooltipRow from \"../StatsTooltip/StatsTooltipRow\";\nimport { ARBITRUM, getChainName, IS_NETWORK_DISABLED /*GOERLI, MAINNET, AVALANCHE*/ } from \"config/chains\";\nimport { callContract, contractFetcher } from \"lib/contracts\";\nimport { approveTokens, useInfoTokens } from \"domain/tokens\";\nimport { useLocalStorageByChainId } from \"lib/localStorage\";\nimport { helperToast } from \"lib/helperToast\";\nimport { getTokenInfo, getUsd } from \"domain/tokens/utils\";\nimport {\n bigNumberify,\n expandDecimals,\n formatAmount,\n formatAmountFree,\n formatKeyAmount,\n formatKeyPrice,\n parseValue,\n} from \"lib/numbers\";\nimport { getNativeToken, getToken, getTokens, getWhitelistedTokens, getWrappedToken } from \"config/tokens\";\nimport { useChainId } from \"lib/chains\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nconst { AddressZero } = ethers.constants;\n\nfunction getStakingData(stakingInfo) {\n if (!stakingInfo || stakingInfo.length === 0) {\n return;\n }\n\n const keys = [\"stakedFlpTracker\", \"feeFlpTracker\"];\n const data = {};\n const propsLength = 5;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n data[key] = {\n claimable: stakingInfo[i * propsLength],\n tokensPerInterval: stakingInfo[i * propsLength + 1],\n averageStakedAmounts: stakingInfo[i * propsLength + 2],\n cumulativeRewards: stakingInfo[i * propsLength + 3],\n totalSupply: stakingInfo[i * propsLength + 4],\n };\n }\n\n return data;\n}\n\nfunction getTooltipContent(managedUsd, tokenInfo, token) {\n return (\n <>\n \n \n \n );\n}\n\nexport default function FlpSwap(props) {\n const {\n savedSlippageAmount,\n isBuying,\n setPendingTxns,\n connectWallet,\n setIsBuying,\n savedShouldDisableValidationForTesting,\n } = props;\n const history = useHistory();\n const swapLabel = isBuying ? \"BuyFlp\" : \"SellFlp\";\n const tabLabel = isBuying ? t`Buy FLP` : t`Sell FLP`;\n const { active, library, account } = useWeb3React();\n const { chainId } = useChainId();\n // const chainName = getChainName(chainId)\n const tokens = getTokens(chainId);\n const whitelistedTokens = getWhitelistedTokens(chainId);\n const tokenList = whitelistedTokens.filter((t) => !t.isWrapped);\n const visibleTokens = tokenList.filter((t) => !t.isTempHidden);\n const [swapValue, setSwapValue] = useState(\"\");\n const [flpValue, setFlpValue] = useState(\"\");\n const [swapTokenAddress, setSwapTokenAddress] = useLocalStorageByChainId(\n chainId,\n `${swapLabel}-swap-token-address`,\n AddressZero\n );\n const [isApproving, setIsApproving] = useState(false);\n const [isWaitingForApproval, setIsWaitingForApproval] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [anchorOnSwapAmount, setAnchorOnSwapAmount] = useState(true);\n const [feeBasisPoints, setFeeBasisPoints] = useState(\"\");\n const [modalError, setModalError] = useState(false);\n\n const readerAddress = getContract(chainId, \"Reader\");\n const rewardReaderAddress = getContract(chainId, \"RewardReader\");\n const vaultAddress = getContract(chainId, \"Vault\");\n const nativeTokenAddress = getContract(chainId, \"NATIVE_TOKEN\");\n const stakedFlpTrackerAddress = getContract(chainId, \"StakedFlpTracker\");\n const feeFlpTrackerAddress = getContract(chainId, \"FeeFlpTracker\");\n const usdfAddress = getContract(chainId, \"USDF\");\n const flpManagerAddress = getContract(chainId, \"FlpManager\");\n const rewardRouterAddress = getContract(chainId, \"RewardRouter\");\n const tokensForBalanceAndSupplyQuery = [stakedFlpTrackerAddress, usdfAddress];\n\n const tokenAddresses = tokens.map((token) => token.address);\n const { data: tokenBalances } = useSWR(\n [`FlpSwap:getTokenBalances:${active}`, chainId, readerAddress, \"getTokenBalances\", account || PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(library, Reader, [tokenAddresses]),\n }\n );\n\n const { data: balancesAndSupplies } = useSWR(\n [\n `FlpSwap:getTokenBalancesWithSupplies:${active}`,\n chainId,\n readerAddress,\n \"getTokenBalancesWithSupplies\",\n account || PLACEHOLDER_ACCOUNT,\n ],\n {\n fetcher: contractFetcher(library, Reader, [tokensForBalanceAndSupplyQuery]),\n }\n );\n\n const { data: aums } = useSWR([`FlpSwap:getAums:${active}`, chainId, flpManagerAddress, \"getAums\"], {\n fetcher: contractFetcher(library, FlpManager),\n });\n\n const { data: totalTokenWeights } = useSWR(\n [`FlpSwap:totalTokenWeights:${active}`, chainId, vaultAddress, \"totalTokenWeights\"],\n {\n fetcher: contractFetcher(library, Vault),\n }\n );\n\n const tokenAllowanceAddress = swapTokenAddress === AddressZero ? nativeTokenAddress : swapTokenAddress;\n const { data: tokenAllowance } = useSWR(\n [active, chainId, tokenAllowanceAddress, \"allowance\", account || PLACEHOLDER_ACCOUNT, flpManagerAddress],\n {\n fetcher: contractFetcher(library, Token),\n }\n );\n\n const { data: lastPurchaseTime } = useSWR(\n [`FlpSwap:lastPurchaseTime:${active}`, chainId, flpManagerAddress, \"lastAddedAt\", account || PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(library, FlpManager),\n }\n );\n\n const { data: flpBalance } = useSWR(\n [`FlpSwap:flpBalance:${active}`, chainId, feeFlpTrackerAddress, \"stakedAmounts\", account || PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(library, RewardTracker),\n }\n );\n\n const flpVesterAddress = getContract(chainId, \"FlpVester\");\n const { data: reservedAmount } = useSWR(\n [`FlpSwap:reservedAmount:${active}`, chainId, flpVesterAddress, \"pairAmounts\", account || PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(library, Vester),\n }\n );\n\n const { fxdxPrice } = useFxdxPrice(chainId, { arbitrum: chainId === ARBITRUM ? library : undefined }, active);\n\n const rewardTrackersForStakingInfo = [stakedFlpTrackerAddress, feeFlpTrackerAddress];\n const { data: stakingInfo } = useSWR(\n [`FlpSwap:stakingInfo:${active}`, chainId, rewardReaderAddress, \"getStakingInfo\", account || PLACEHOLDER_ACCOUNT],\n {\n fetcher: contractFetcher(library, RewardReader, [rewardTrackersForStakingInfo]),\n }\n );\n\n const stakingData = getStakingData(stakingInfo);\n\n const redemptionTime = lastPurchaseTime ? lastPurchaseTime.add(FLP_COOLDOWN_DURATION) : undefined;\n const inCooldownWindow = redemptionTime && parseInt(Date.now() / 1000) < redemptionTime;\n\n const flpSupply = balancesAndSupplies ? balancesAndSupplies[1] : bigNumberify(0);\n const usdfSupply = balancesAndSupplies ? balancesAndSupplies[3] : bigNumberify(0);\n let aum;\n if (aums && aums.length > 0) {\n aum = isBuying ? aums[0] : aums[1];\n }\n const flpPrice =\n aum && aum.gt(0) && flpSupply.gt(0)\n ? aum.mul(expandDecimals(1, FLP_DECIMALS)).div(flpSupply)\n : expandDecimals(1, USD_DECIMALS);\n let flpBalanceUsd;\n if (flpBalance) {\n flpBalanceUsd = flpBalance.mul(flpPrice).div(expandDecimals(1, FLP_DECIMALS));\n }\n const flpSupplyUsd = flpSupply.mul(flpPrice).div(expandDecimals(1, FLP_DECIMALS));\n\n let reserveAmountUsd;\n if (reservedAmount) {\n reserveAmountUsd = reservedAmount.mul(flpPrice).div(expandDecimals(1, FLP_DECIMALS));\n }\n\n let maxSellAmount = flpBalance;\n if (flpBalance && reservedAmount) {\n maxSellAmount = flpBalance.sub(reservedAmount);\n }\n\n const { infoTokens } = useInfoTokens(library, chainId, active, tokenBalances, undefined);\n const swapToken = getToken(chainId, swapTokenAddress);\n const swapTokenInfo = getTokenInfo(infoTokens, swapTokenAddress);\n\n const swapTokenBalance = swapTokenInfo && swapTokenInfo.balance ? swapTokenInfo.balance : bigNumberify(0);\n\n const swapAmount = parseValue(swapValue, swapToken && swapToken.decimals);\n const flpAmount = parseValue(flpValue, FLP_DECIMALS);\n\n const needApproval =\n isBuying && swapTokenAddress !== AddressZero && tokenAllowance && swapAmount && swapAmount.gt(tokenAllowance);\n\n const swapUsdMin = getUsd(swapAmount, swapTokenAddress, false, infoTokens);\n const flpUsdMax = flpAmount && flpPrice ? flpAmount.mul(flpPrice).div(expandDecimals(1, FLP_DECIMALS)) : undefined;\n\n let isSwapTokenCapReached;\n if (swapTokenInfo.managedUsd && swapTokenInfo.maxUsdfAmount) {\n isSwapTokenCapReached = swapTokenInfo.managedUsd.gt(\n adjustForDecimals(swapTokenInfo.maxUsdfAmount, USDF_DECIMALS, USD_DECIMALS)\n );\n }\n\n const onSwapValueChange = (e) => {\n setAnchorOnSwapAmount(true);\n setSwapValue(e.target.value);\n };\n\n const onFlpValueChange = (e) => {\n setAnchorOnSwapAmount(false);\n setFlpValue(e.target.value);\n };\n\n const onSelectSwapToken = (token) => {\n setSwapTokenAddress(token.address);\n setIsWaitingForApproval(false);\n };\n\n const nativeToken = getTokenInfo(infoTokens, AddressZero);\n\n let totalApr = bigNumberify(0);\n\n let feeFlpTrackerAnnualRewardsUsd;\n let feeFlpTrackerApr;\n if (\n stakingData &&\n stakingData.feeFlpTracker &&\n stakingData.feeFlpTracker.tokensPerInterval &&\n nativeToken &&\n nativeToken.minPrice &&\n flpSupplyUsd &&\n flpSupplyUsd.gt(0)\n ) {\n feeFlpTrackerAnnualRewardsUsd = stakingData.feeFlpTracker.tokensPerInterval\n .mul(SECONDS_PER_YEAR)\n .mul(nativeToken.minPrice)\n .div(expandDecimals(1, 18));\n feeFlpTrackerApr = feeFlpTrackerAnnualRewardsUsd.mul(BASIS_POINTS_DIVISOR).div(flpSupplyUsd);\n totalApr = totalApr.add(feeFlpTrackerApr);\n }\n\n let stakedFlpTrackerAnnualRewardsUsd;\n let stakedFlpTrackerApr;\n\n if (\n fxdxPrice &&\n stakingData &&\n stakingData.stakedFlpTracker &&\n stakingData.stakedFlpTracker.tokensPerInterval &&\n flpSupplyUsd &&\n flpSupplyUsd.gt(0)\n ) {\n stakedFlpTrackerAnnualRewardsUsd = stakingData.stakedFlpTracker.tokensPerInterval\n .mul(SECONDS_PER_YEAR)\n .mul(fxdxPrice)\n .div(expandDecimals(1, 18));\n stakedFlpTrackerApr = stakedFlpTrackerAnnualRewardsUsd.mul(BASIS_POINTS_DIVISOR).div(flpSupplyUsd);\n totalApr = totalApr.add(stakedFlpTrackerApr);\n }\n\n useEffect(() => {\n const updateSwapAmounts = () => {\n if (anchorOnSwapAmount) {\n if (!swapAmount) {\n setFlpValue(\"\");\n setFeeBasisPoints(\"\");\n return;\n }\n\n if (isBuying) {\n const { amount: nextAmount, feeBasisPoints: feeBps } = getBuyFlpToAmount(\n swapAmount,\n swapTokenAddress,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights\n );\n const nextValue = formatAmountFree(nextAmount, FLP_DECIMALS, FLP_DECIMALS);\n setFlpValue(nextValue);\n setFeeBasisPoints(feeBps);\n } else {\n const { amount: nextAmount, feeBasisPoints: feeBps } = getSellFlpFromAmount(\n swapAmount,\n swapTokenAddress,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights\n );\n const nextValue = formatAmountFree(nextAmount, FLP_DECIMALS, FLP_DECIMALS);\n setFlpValue(nextValue);\n setFeeBasisPoints(feeBps);\n }\n\n return;\n }\n\n if (!flpAmount) {\n setSwapValue(\"\");\n setFeeBasisPoints(\"\");\n return;\n }\n\n if (swapToken) {\n if (isBuying) {\n const { amount: nextAmount, feeBasisPoints: feeBps } = getBuyFlpFromAmount(\n flpAmount,\n swapTokenAddress,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights\n );\n const nextValue = formatAmountFree(nextAmount, swapToken.decimals, swapToken.decimals);\n setSwapValue(nextValue);\n setFeeBasisPoints(feeBps);\n } else {\n const { amount: nextAmount, feeBasisPoints: feeBps } = getSellFlpToAmount(\n flpAmount,\n swapTokenAddress,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights,\n true\n );\n\n const nextValue = formatAmountFree(nextAmount, swapToken.decimals, swapToken.decimals);\n setSwapValue(nextValue);\n setFeeBasisPoints(feeBps);\n }\n }\n };\n\n updateSwapAmounts();\n }, [\n isBuying,\n anchorOnSwapAmount,\n swapAmount,\n flpAmount,\n swapToken,\n swapTokenAddress,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights,\n ]);\n\n const switchSwapOption = (hash = \"\") => {\n history.push(`${history.location.pathname}#${hash}`);\n props.setIsBuying(hash === \"redeem\" ? false : true);\n };\n\n const fillMaxAmount = () => {\n if (isBuying) {\n setAnchorOnSwapAmount(true);\n setSwapValue(formatAmountFree(swapTokenBalance, swapToken.decimals, swapToken.decimals));\n return;\n }\n\n setAnchorOnSwapAmount(false);\n setFlpValue(formatAmountFree(maxSellAmount, FLP_DECIMALS, FLP_DECIMALS));\n };\n\n const getError = () => {\n if (IS_NETWORK_DISABLED[chainId]) {\n if (isBuying) return [t`FLP buy disabled, pending ${getChainName(chainId)} upgrade`];\n return [t`FLP sell disabled, pending ${getChainName(chainId)} upgrade`];\n }\n\n if (!isBuying && inCooldownWindow) {\n return [t`Redemption time not yet reached`];\n }\n\n if (!swapAmount || swapAmount.eq(0)) {\n return [t`Enter an amount`];\n }\n if (!flpAmount || flpAmount.eq(0)) {\n return [t`Enter an amount`];\n }\n\n if (isBuying) {\n const swapTokenInfo = getTokenInfo(infoTokens, swapTokenAddress);\n if (\n !savedShouldDisableValidationForTesting &&\n swapTokenInfo &&\n swapTokenInfo.balance &&\n swapAmount &&\n swapAmount.gt(swapTokenInfo.balance)\n ) {\n return [t`Insufficient ${swapTokenInfo.symbol} balance`];\n }\n\n if (swapTokenInfo.maxUsdfAmount && swapTokenInfo.usdfAmount && swapUsdMin) {\n const usdfFromAmount = adjustForDecimals(swapUsdMin, USD_DECIMALS, USDF_DECIMALS);\n const nextUsdfAmount = swapTokenInfo.usdfAmount.add(usdfFromAmount);\n if (swapTokenInfo.maxUsdfAmount.gt(0) && nextUsdfAmount.gt(swapTokenInfo.maxUsdfAmount)) {\n return [t`${swapTokenInfo.symbol} pool exceeded, try different token`, true];\n }\n }\n }\n\n if (!isBuying) {\n if (maxSellAmount && flpAmount && flpAmount.gt(maxSellAmount)) {\n return [t`Insufficient FLP balance`];\n }\n\n const swapTokenInfo = getTokenInfo(infoTokens, swapTokenAddress);\n if (\n swapTokenInfo &&\n swapTokenInfo.availableAmount &&\n swapAmount &&\n swapAmount.gt(swapTokenInfo.availableAmount)\n ) {\n return [t`Insufficient liquidity`];\n }\n }\n\n return [false];\n };\n\n const isPrimaryEnabled = () => {\n if (IS_NETWORK_DISABLED[chainId]) {\n return false;\n }\n if (!active) {\n return true;\n }\n const [error, modal] = getError();\n if (error && !modal) {\n return false;\n }\n if ((needApproval && isWaitingForApproval) || isApproving) {\n return false;\n }\n if (isApproving) {\n return false;\n }\n if (isSubmitting) {\n return false;\n }\n if (isBuying && isSwapTokenCapReached) {\n return false;\n }\n\n return true;\n };\n\n const getPrimaryText = () => {\n if (!active) {\n return t`Connect Wallet`;\n }\n const [error, modal] = getError();\n if (error && !modal) {\n return error;\n }\n if (isBuying && isSwapTokenCapReached) {\n return t`Max Capacity for ${swapToken.symbol} Reached`;\n }\n\n if (needApproval && isWaitingForApproval) {\n return t`Waiting for Approval`;\n }\n if (isApproving) {\n return t`Approving ${swapToken.symbol}...`;\n }\n if (needApproval) {\n return t`Approve ${swapToken.symbol}`;\n }\n\n if (isSubmitting) {\n return isBuying ? t`Buying...` : t`Selling...`;\n }\n\n return isBuying ? t`Buy FLP` : t`Sell FLP`;\n };\n\n const approveFromToken = () => {\n approveTokens({\n setIsApproving,\n library,\n tokenAddress: swapToken.address,\n spender: flpManagerAddress,\n chainId: chainId,\n onApproveSubmitted: () => {\n setIsWaitingForApproval(true);\n },\n infoTokens,\n getTokenInfo,\n });\n };\n\n const buyFlp = () => {\n setIsSubmitting(true);\n\n const minFlp = flpAmount.mul(BASIS_POINTS_DIVISOR - savedSlippageAmount).div(BASIS_POINTS_DIVISOR);\n\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n const method = swapTokenAddress === AddressZero ? \"mintAndStakeFlpETH\" : \"mintAndStakeFlp\";\n const params = swapTokenAddress === AddressZero ? [0, minFlp] : [swapTokenAddress, swapAmount, 0, minFlp];\n const value = swapTokenAddress === AddressZero ? swapAmount : 0;\n\n callContract(chainId, contract, method, params, {\n value,\n sentMsg: t`Buy submitted.`,\n failMsg: t`Buy failed.`,\n successMsg: t`${formatAmount(flpAmount, 18, 4, true)} FLP bought with ${formatAmount(\n swapAmount,\n swapTokenInfo.decimals,\n 4,\n true\n )} ${swapTokenInfo.symbol}!`,\n setPendingTxns,\n })\n .then(async () => {})\n .finally(() => {\n setIsSubmitting(false);\n });\n };\n\n const sellFlp = () => {\n setIsSubmitting(true);\n\n const minOut = swapAmount.mul(BASIS_POINTS_DIVISOR - savedSlippageAmount).div(BASIS_POINTS_DIVISOR);\n\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n const method = swapTokenAddress === AddressZero ? \"unstakeAndRedeemFlpETH\" : \"unstakeAndRedeemFlp\";\n const params =\n swapTokenAddress === AddressZero ? [flpAmount, minOut, account] : [swapTokenAddress, flpAmount, minOut, account];\n\n callContract(chainId, contract, method, params, {\n sentMsg: t`Sell submitted!`,\n failMsg: t`Sell failed.`,\n successMsg: t`${formatAmount(flpAmount, 18, 4, true)} FLP sold for ${formatAmount(\n swapAmount,\n swapTokenInfo.decimals,\n 4,\n true\n )} ${swapTokenInfo.symbol}!`,\n setPendingTxns,\n })\n .then(async () => {})\n .finally(() => {\n setIsSubmitting(false);\n });\n };\n\n const onClickPrimary = () => {\n if (!active) {\n connectWallet();\n return;\n }\n\n if (needApproval) {\n approveFromToken();\n return;\n }\n\n const [, modal] = getError();\n\n if (modal) {\n setModalError(true);\n return;\n }\n\n if (isBuying) {\n buyFlp();\n } else {\n sellFlp();\n }\n };\n\n let payLabel = t`Pay`;\n let receiveLabel = t`Receive`;\n let payBalance = \"$0.00\";\n let receiveBalance = \"$0.00\";\n if (isBuying) {\n if (swapUsdMin) {\n payBalance = `$${formatAmount(swapUsdMin, USD_DECIMALS, 2, true)}`;\n }\n if (flpUsdMax) {\n receiveBalance = `$${formatAmount(flpUsdMax, USD_DECIMALS, 2, true)}`;\n }\n } else {\n if (flpUsdMax) {\n payBalance = `$${formatAmount(flpUsdMax, USD_DECIMALS, 2, true)}`;\n }\n if (swapUsdMin) {\n receiveBalance = `$${formatAmount(swapUsdMin, USD_DECIMALS, 2, true)}`;\n }\n }\n\n const selectToken = (token) => {\n setAnchorOnSwapAmount(false);\n setSwapTokenAddress(token.address);\n helperToast.success(t`${token.symbol} selected in order form`);\n };\n\n let feePercentageText = formatAmount(feeBasisPoints, 2, 2, true, \"-\");\n if (feeBasisPoints !== undefined && feeBasisPoints.toString().length > 0) {\n feePercentageText += \"%\";\n }\n\n const wrappedTokenSymbol = getWrappedToken(chainId).symbol;\n const nativeTokenSymbol = getNativeToken(chainId).symbol;\n\n const onSwapOptionChange = (opt) => {\n if (opt === t`Sell FLP`) {\n switchSwapOption(\"redeem\");\n } else {\n switchSwapOption();\n }\n };\n\n return (\n
\n \n {/*
\n
{isBuying ? \"Buy FLP\" : \"Sell FLP\"}
\n {isBuying &&
\n Purchase FLP tokens to earn {nativeTokenSymbol} fees from swaps and leverage trading.
\n Note that there is a minimum holding time of 15 minutes after a purchase.
\n
View staking page.
\n
}\n {!isBuying &&
\n Redeem your FLP tokens for any supported asset.\n {inCooldownWindow &&
\n FLP tokens can only be redeemed 15 minutes after your most recent purchase.
\n Your last purchase was at {formatDateTime(lastPurchaseTime)}, you can redeem FLP tokens after {formatDateTime(redemptionTime)}.
\n
}\n
View staking page.
\n
}\n
*/}\n
\n
\n
\n
\n {/*
\n \"flp40Icon\"\n {chainId === GOERLI || chainId === MAINNET ? (\n \"ethereum16Icon\"\n ) : chainId === ARBITRUM ? (\n \"arbitrum16Icon\"\n ) : chainId === AVALANCHE ? (\n \"avalanche16Icon\"\n ) : (\n \"moonbeam16Icon\"\n )}\n
*/}\n
\n
FLP
\n
FLP
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n Price\n
\n
${formatAmount(flpPrice, USD_DECIMALS, 3, true)}
\n
\n
\n
\n Wallet\n
\n
\n {formatAmount(flpBalance, FLP_DECIMALS, 4, true)} FLP ($\n {formatAmount(flpBalanceUsd, USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n Staked\n
\n
\n {formatAmount(flpBalance, FLP_DECIMALS, 4, true)} FLP ($\n {formatAmount(flpBalanceUsd, USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n
\n {!isBuying && (\n
\n
\n Reserved\n
\n
\n \n t`${formatAmount(reservedAmount, 18, 4, true)} FLP have been reserved for vesting.`\n }\n />\n
\n
\n )}\n
\n
\n APR\n
\n
\n {\n return (\n <>\n \n \n \n );\n }}\n />\n
\n
\n
\n
\n Total Supply\n
\n
\n {formatAmount(flpSupply, FLP_DECIMALS, 4, true)} FLP ($\n {formatAmount(flpSupplyUsd, USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n
\n \n {isBuying && (\n \n \n \n )}\n\n {!isBuying && (\n \n
\n {/* FLP \"flp24Icon\" */}\n FLP\n
\n \n )}\n\n
\n
\n {\n setIsBuying(!isBuying);\n switchSwapOption(isBuying ? \"redeem\" : \"\");\n }}\n />\n
\n
\n\n {isBuying && (\n \n
\n {/* FLP \"flp24Icon\" */}\n FLP\n
\n \n )}\n\n {!isBuying && (\n \n \n \n )}\n\n
\n
\n
{feeBasisPoints > 50 ? t`WARNING: High Fees` : t`Fees`}
\n
\n {isBuying && (\n {\n if (!feeBasisPoints) {\n return (\n
\n Fees will be shown once you have entered an amount in the order form.\n
\n );\n }\n return (\n
\n {feeBasisPoints > 50 && To reduce fees, select a different asset to pay with.}\n Check the \"Save on Fees\" section below to get the lowest fee percentages.\n
\n );\n }}\n />\n )}\n {!isBuying && (\n {\n if (!feeBasisPoints) {\n return (\n
\n Fees will be shown once you have entered an amount in the order form.\n
\n );\n }\n return (\n
\n {feeBasisPoints > 50 && To reduce fees, select a different asset to receive.}\n Check the \"Save on Fees\" section below to get the lowest fee percentages.\n
\n );\n }}\n />\n )}\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n Save on Fees\n
\n {isBuying && (\n
\n \n Fees may vary depending on which asset you use to buy FLP.
\n Enter the amount of FLP you want to purchase in the order form, then check here to compare fees.\n
\n
\n )}\n {!isBuying && (\n
\n \n Fees may vary depending on which asset you sell FLP for.
\n Enter the amount of FLP you want to redeem in the order form, then check here to compare fees.\n
\n
\n )}\n
\n
\n {/*
*/}\n \n \n \n \n \n \n \n \n \n \n \n \n {visibleTokens.map((token) => {\n let tokenFeeBps;\n if (isBuying) {\n const { feeBasisPoints: feeBps } = getBuyFlpFromAmount(\n flpAmount,\n token.address,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights\n );\n tokenFeeBps = feeBps;\n } else {\n const { feeBasisPoints: feeBps } = getSellFlpToAmount(\n flpAmount,\n token.address,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights\n );\n tokenFeeBps = feeBps;\n }\n const tokenInfo = getTokenInfo(infoTokens, token.address);\n let managedUsd;\n if (tokenInfo && tokenInfo.managedUsd) {\n managedUsd = tokenInfo.managedUsd;\n }\n let availableAmountUsd;\n if (tokenInfo && tokenInfo.minPrice && tokenInfo.availableAmount) {\n availableAmountUsd = tokenInfo.availableAmount\n .mul(tokenInfo.minPrice)\n .div(expandDecimals(1, token.decimals));\n }\n let balanceUsd;\n if (tokenInfo && tokenInfo.minPrice && tokenInfo.balance) {\n balanceUsd = tokenInfo.balance.mul(tokenInfo.minPrice).div(expandDecimals(1, token.decimals));\n }\n const tokenImage = importImage(\"ic_\" + token.symbol.toLowerCase() + \"_40.svg\");\n let isCapReached = tokenInfo.managedAmount?.gt(tokenInfo.maxUsdfAmount);\n\n let amountLeftToDeposit = bigNumberify(0);\n if (tokenInfo.maxUsdfAmount && tokenInfo.maxUsdfAmount.gt(0)) {\n amountLeftToDeposit = tokenInfo.maxUsdfAmount\n .sub(tokenInfo.usdfAmount)\n .mul(expandDecimals(1, USD_DECIMALS))\n .div(expandDecimals(1, USDF_DECIMALS));\n }\n if (amountLeftToDeposit.lt(0)) {\n amountLeftToDeposit = bigNumberify(0);\n }\n function renderFees() {\n const swapUrl = `https://app.1inch.io/#/${chainId}/swap/`;\n switch (true) {\n case (isBuying && isCapReached) || (!isBuying && managedUsd?.lt(1)):\n return (\n (\n
\n \n Max pool capacity reached for {tokenInfo.symbol}\n
\n
\n Please mint FLP using another token\n
\n
\n

\n \n Swap {tokenInfo.symbol} on 1inch\n \n

\n
\n )}\n />\n );\n case (isBuying && !isCapReached) || (!isBuying && managedUsd?.gt(0)):\n return `${formatAmount(tokenFeeBps, 2, 2, true, \"-\")}${\n tokenFeeBps !== undefined && tokenFeeBps.toString().length > 0 ? \"%\" : \"\"\n }`;\n default:\n return \"\";\n }\n }\n\n return (\n
\n \n \n \n \n \n \n \n );\n })}\n \n
\n TOKEN\n \n PRICE\n \n {isBuying ? (\n (\n

\n Available amount to deposit into FLP.\n

\n )}\n />\n ) : (\n {\n return (\n

\n \n Available amount to withdraw from FLP. Funds not utilized by current open positions.\n \n

\n );\n }}\n />\n )}\n
\n WALLET\n \n {\n return (\n
\n Fees will be shown once you have entered an amount in the order form.\n
\n );\n }}\n />\n
\n
\n
\n {token.symbol}\n
\n
\n
{token.name}
\n
{token.symbol}
\n
\n
\n \n
\n
\n
${formatKeyPrice(tokenInfo, \"minPrice\", true)}\n {isBuying && (\n
\n getTooltipContent(managedUsd, tokenInfo, token)}\n />\n
\n )}\n {!isBuying && (\n
\n getTooltipContent(managedUsd, tokenInfo, token)}\n />\n
\n )}\n
\n {formatKeyAmount(tokenInfo, \"balance\", tokenInfo.decimals, 2, true)} {tokenInfo.symbol} ($\n {formatAmount(balanceUsd, USD_DECIMALS, 2, true)})\n {renderFees()}\n selectToken(token)}\n >\n {isBuying ? t`Buy with ${token.symbol}` : t`Sell for ${token.symbol}`}\n \n
\n
\n {visibleTokens.map((token) => {\n let tokenFeeBps;\n if (isBuying) {\n const { feeBasisPoints: feeBps } = getBuyFlpFromAmount(\n flpAmount,\n token.address,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights\n );\n tokenFeeBps = feeBps;\n } else {\n const { feeBasisPoints: feeBps } = getSellFlpToAmount(\n flpAmount,\n token.address,\n infoTokens,\n flpPrice,\n usdfSupply,\n totalTokenWeights\n );\n tokenFeeBps = feeBps;\n }\n const tokenInfo = getTokenInfo(infoTokens, token.address);\n let managedUsd;\n if (tokenInfo && tokenInfo.managedUsd) {\n managedUsd = tokenInfo.managedUsd;\n }\n let availableAmountUsd;\n if (tokenInfo && tokenInfo.minPrice && tokenInfo.availableAmount) {\n availableAmountUsd = tokenInfo.availableAmount\n .mul(tokenInfo.minPrice)\n .div(expandDecimals(1, token.decimals));\n }\n let balanceUsd;\n if (tokenInfo && tokenInfo.minPrice && tokenInfo.balance) {\n balanceUsd = tokenInfo.balance.mul(tokenInfo.minPrice).div(expandDecimals(1, token.decimals));\n }\n\n let amountLeftToDeposit = bigNumberify(0);\n if (tokenInfo.maxUsdfAmount && tokenInfo.maxUsdfAmount.gt(0)) {\n amountLeftToDeposit = tokenInfo.maxUsdfAmount\n .sub(tokenInfo.usdfAmount)\n .mul(expandDecimals(1, USD_DECIMALS))\n .div(expandDecimals(1, USDF_DECIMALS));\n }\n if (amountLeftToDeposit.lt(0)) {\n amountLeftToDeposit = bigNumberify(0);\n }\n let isCapReached = tokenInfo.managedAmount?.gt(tokenInfo.maxUsdfAmount);\n\n function renderFees() {\n switch (true) {\n case (isBuying && isCapReached) || (!isBuying && managedUsd?.lt(1)):\n return (\n (\n \n Max pool capacity reached for {tokenInfo.symbol}. Please mint FLP using another token\n \n )}\n />\n );\n case (isBuying && !isCapReached) || (!isBuying && managedUsd?.gt(0)):\n return `${formatAmount(tokenFeeBps, 2, 2, true, \"-\")}${\n tokenFeeBps !== undefined && tokenFeeBps.toString().length > 0 ? \"%\" : \"\"\n }`;\n default:\n return \"\";\n }\n }\n const tokenImage = importImage(\"ic_\" + token.symbol.toLowerCase() + \"_24.svg\");\n return (\n
\n
\n {token.symbol}\n
{token.symbol}
\n
\n \n
\n
\n
\n
\n
\n
\n Price\n
\n
${formatKeyPrice(tokenInfo, \"minPrice\", true)}
\n
\n {isBuying && (\n
\n (\n

\n Available amount to deposit into FLP.\n

\n )}\n />\n
\n getTooltipContent(managedUsd, tokenInfo, token)}\n />\n
\n
\n )}\n {!isBuying && (\n
\n
\n {\n return (\n

\n \n Available amount to withdraw from FLP. Funds not utilized by current open positions.\n \n

\n );\n }}\n />\n
\n\n
\n getTooltipContent(managedUsd, tokenInfo, token)}\n />\n
\n
\n )}\n\n
\n
\n Wallet\n
\n
\n {formatKeyAmount(tokenInfo, \"balance\", tokenInfo.decimals, 2, true)} {tokenInfo.symbol} ($\n {formatAmount(balanceUsd, USD_DECIMALS, 2, true)})\n
\n
\n
\n
\n {tokenFeeBps ? (\n t`Fees`\n ) : (\n (\n

\n Fees will be shown once you have entered an amount in the order form.\n

\n )}\n />\n )}\n
\n
{renderFees()}
\n
\n
\n
\n {isBuying && (\n \n )}\n {!isBuying && (\n \n )}\n
\n
\n
\n );\n })}\n
\n
\n
\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Link, useHistory } from \"react-router-dom\";\n\nimport FlpSwap from \"components/Flp/FlpSwap\";\nimport buyFLPIcon from \"img/ic_buy_flp.svg\";\nimport Footer from \"components/Footer/Footer\";\nimport \"./BuyFlp.css\";\n\nimport { Trans } from \"@lingui/macro\";\nimport { getNativeToken } from \"config/tokens\";\nimport { useChainId } from \"lib/chains\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\nimport { t } from \"@lingui/macro\";\n\nexport default function BuyFlp(props) {\n const { chainId } = useChainId();\n const history = useHistory();\n const [isBuying, setIsBuying] = useState(true);\n const nativeTokenSymbol = getNativeToken(chainId).symbol;\n\n useEffect(() => {\n const hash = history.location.hash.replace(\"#\", \"\");\n const buying = hash === \"redeem\" ? false : true;\n setIsBuying(buying);\n }, [history.location.hash]);\n\n return (\n
\n
\n
\n {t`Buy\n
\n
\n
\n Buy / Sell FLP\n
\n
\n \n Purchase FLP tokens to earn{\" \"}\n {nativeTokenSymbol} fees from swaps and leverages trading.\n \n
\n \n Note that there is a minimum holding time of 15 minutes after a purchase.\n
\n View staking page.\n
\n
\n
\n
\n \n
\n
\n );\n}\n","import React from \"react\";\nimport { Trans } from \"@lingui/macro\";\nimport Footer from \"components/Footer/Footer\";\nimport \"./Buy.css\";\nimport TokenCard from \"components/TokenCard/TokenCard\";\nimport buyFXDXIcon from \"img/buy_fxdx.svg\";\nimport SEO from \"components/Common/SEO\";\nimport { getPageTitle } from \"lib/legacy\";\n\nexport default function BuyFXDXFLP() {\n return (\n \n
\n
\n
\n
\n \"buyFXDXIcon\"\n
\n
\n
\n Buy FXDX or FLP\n
\n
\n
\n \n
\n
\n
\n
\n );\n}\n","import React, { useState } from \"react\";\nimport { ethers } from \"ethers\";\nimport { useWeb3React } from \"@web3-react/core\";\n\nimport ERC721 from \"abis/ERC721.json\";\n\nimport \"./NftWallet.css\";\nimport { t, Trans } from \"@lingui/macro\";\nimport { callContract } from \"lib/contracts\";\nimport { useChainId } from \"lib/chains\";\n\nexport default function NftWallet() {\n const [nftAddress, setNftAddress] = useState(\"\");\n const [nftId, setNftId] = useState(\"\");\n const [receiver, setReceiver] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(\"\");\n\n const { active, account, library } = useWeb3React();\n const { chainId } = useChainId();\n\n function getTransferError() {\n if (!active) {\n return t`Wallet not connected`;\n }\n if (!receiver || receiver.length === 0) {\n return t`Enter Receiver Address`;\n }\n if (!ethers.utils.isAddress(receiver)) {\n return t`Invalid Receiver Address`;\n }\n if (!nftAddress || nftAddress.length === 0) {\n return t`Enter NFT Address`;\n }\n if (!ethers.utils.isAddress(nftAddress)) {\n return t`Invalid NFT Address`;\n }\n if (!nftId || nftId.toString().length === 0) {\n return t`Enter NFT ID`;\n }\n }\n\n function getPrimaryText() {\n const transferError = getTransferError();\n if (transferError) {\n return transferError;\n }\n if (isSubmitting) {\n return t`Tranferring...`;\n }\n return t`Transfer NFT`;\n }\n\n function isPrimaryEnabled() {\n return !getTransferError();\n }\n\n function transferNft() {\n setIsSubmitting(true);\n const contract = new ethers.Contract(nftAddress, ERC721.abi, library.getSigner());\n callContract(chainId, contract, \"transferFrom\", [account, receiver, nftId], {\n sentMsg: t`Transfer submitted!`,\n failMsg: t`Transfer failed.`,\n }).finally(() => {\n setIsSubmitting(false);\n });\n }\n\n return (\n
\n
\n
\n NFT Wallet\n
\n
\n
\n
\n \n
\n setReceiver(e.target.value)} />\n
\n
\n
\n \n
\n setNftAddress(e.target.value)} />\n
\n
\n
\n \n
\n setNftId(e.target.value)} />\n
\n
\n
\n \n
\n
\n
\n );\n}\n","import React, { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport useSWR from \"swr\";\nimport { ethers } from \"ethers\";\nimport { useWeb3React } from \"@web3-react/core\";\n\nimport { getContract } from \"config/contracts\";\n\nimport Modal from \"components/Modal/Modal\";\nimport Footer from \"components/Footer/Footer\";\n\nimport Token from \"abis/Token.json\";\nimport Vester from \"abis/Vester.json\";\nimport RewardTracker from \"abis/RewardTracker.json\";\nimport RewardRouter from \"abis/RewardRouter.json\";\n\nimport { FaCheck, FaTimes } from \"react-icons/fa\";\n\nimport { Trans, t } from \"@lingui/macro\";\n\nimport \"./BeginAccountTransfer.css\";\nimport { callContract, contractFetcher } from \"lib/contracts\";\nimport { approveTokens } from \"domain/tokens\";\nimport { useChainId } from \"lib/chains\";\n\nfunction ValidationRow({ isValid, children }) {\n return (\n
\n
\n {isValid && }\n {!isValid && }\n
\n
{children}
\n
\n );\n}\n\nexport default function BeginAccountTransfer(props) {\n const { setPendingTxns } = props;\n const { active, library, account } = useWeb3React();\n const { chainId } = useChainId();\n\n const [receiver, setReceiver] = useState(\"\");\n const [isTransferring, setIsTransferring] = useState(false);\n const [isApproving, setIsApproving] = useState(false);\n const [isTransferSubmittedModalVisible, setIsTransferSubmittedModalVisible] = useState(false);\n let parsedReceiver = ethers.constants.AddressZero;\n if (ethers.utils.isAddress(receiver)) {\n parsedReceiver = receiver;\n }\n\n const fxdxAddress = getContract(chainId, \"FXDX\");\n const fxdxVesterAddress = getContract(chainId, \"FxdxVester\");\n const flpVesterAddress = getContract(chainId, \"FlpVester\");\n\n const rewardRouterAddress = getContract(chainId, \"RewardRouter\");\n\n const { data: fxdxVesterBalance } = useSWR([active, chainId, fxdxVesterAddress, \"balanceOf\", account], {\n fetcher: contractFetcher(library, Token),\n });\n\n const { data: flpVesterBalance } = useSWR([active, chainId, flpVesterAddress, \"balanceOf\", account], {\n fetcher: contractFetcher(library, Token),\n });\n\n const stakedFxdxTrackerAddress = getContract(chainId, \"StakedFxdxTracker\");\n const { data: cumulativeFxdxRewards } = useSWR(\n [active, chainId, stakedFxdxTrackerAddress, \"cumulativeRewards\", parsedReceiver],\n {\n fetcher: contractFetcher(library, RewardTracker),\n }\n );\n\n const stakedFlpTrackerAddress = getContract(chainId, \"StakedFlpTracker\");\n const { data: cumulativeFlpRewards } = useSWR(\n [active, chainId, stakedFlpTrackerAddress, \"cumulativeRewards\", parsedReceiver],\n {\n fetcher: contractFetcher(library, RewardTracker),\n }\n );\n\n const { data: transferredCumulativeFxdxRewards } = useSWR(\n [active, chainId, fxdxVesterAddress, \"transferredCumulativeRewards\", parsedReceiver],\n {\n fetcher: contractFetcher(library, Vester),\n }\n );\n\n const { data: transferredCumulativeFlpRewards } = useSWR(\n [active, chainId, flpVesterAddress, \"transferredCumulativeRewards\", parsedReceiver],\n {\n fetcher: contractFetcher(library, Vester),\n }\n );\n\n const { data: pendingReceiver } = useSWR([active, chainId, rewardRouterAddress, \"pendingReceivers\", account], {\n fetcher: contractFetcher(library, RewardRouter),\n });\n\n const { data: fxdxAllowance } = useSWR([active, chainId, fxdxAddress, \"allowance\", account, stakedFxdxTrackerAddress], {\n fetcher: contractFetcher(library, Token),\n });\n\n const { data: fxdxStaked } = useSWR(\n [active, chainId, stakedFxdxTrackerAddress, \"depositBalances\", account, fxdxAddress],\n {\n fetcher: contractFetcher(library, RewardTracker),\n }\n );\n\n const needApproval = fxdxAllowance && fxdxStaked && fxdxStaked.gt(fxdxAllowance);\n\n const hasVestedFxdx = fxdxVesterBalance && fxdxVesterBalance.gt(0);\n const hasVestedFlp = flpVesterBalance && flpVesterBalance.gt(0);\n const hasStakedFxdx =\n (cumulativeFxdxRewards && cumulativeFxdxRewards.gt(0)) ||\n (transferredCumulativeFxdxRewards && transferredCumulativeFxdxRewards.gt(0));\n const hasStakedFlp =\n (cumulativeFlpRewards && cumulativeFlpRewards.gt(0)) ||\n (transferredCumulativeFlpRewards && transferredCumulativeFlpRewards.gt(0));\n const hasPendingReceiver = pendingReceiver && pendingReceiver !== ethers.constants.AddressZero;\n\n const getError = () => {\n if (!account) {\n return t`Wallet is not connected`;\n }\n if (hasVestedFxdx) {\n return t`Vested FXDX not withdrawn`;\n }\n if (hasVestedFlp) {\n return t`Vested FLP not withdrawn`;\n }\n if (!receiver || receiver.length === 0) {\n return t`Enter Receiver Address`;\n }\n if (!ethers.utils.isAddress(receiver)) {\n return t`Invalid Receiver Address`;\n }\n if (hasStakedFxdx || hasStakedFlp) {\n return t`Invalid Receiver`;\n }\n if ((parsedReceiver || \"\").toString().toLowerCase() === (account || \"\").toString().toLowerCase()) {\n return t`Self-transfer not supported`;\n }\n\n if (\n (parsedReceiver || \"\").length > 0 &&\n (parsedReceiver || \"\").toString().toLowerCase() === (pendingReceiver || \"\").toString().toLowerCase()\n ) {\n return t`Transfer already initiated`;\n }\n };\n\n const isPrimaryEnabled = () => {\n const error = getError();\n if (error) {\n return false;\n }\n if (isApproving) {\n return false;\n }\n if (isTransferring) {\n return false;\n }\n return true;\n };\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n if (needApproval) {\n return t`Approve FXDX`;\n }\n if (isApproving) {\n return t`Approving...`;\n }\n if (isTransferring) {\n return t`Transferring`;\n }\n\n return t`Begin Transfer`;\n };\n\n const onClickPrimary = () => {\n if (needApproval) {\n approveTokens({\n setIsApproving,\n library,\n tokenAddress: fxdxAddress,\n spender: stakedFxdxTrackerAddress,\n chainId,\n });\n return;\n }\n\n setIsTransferring(true);\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n\n callContract(chainId, contract, \"signalTransfer\", [parsedReceiver], {\n sentMsg: t`Transfer submitted!`,\n failMsg: t`Transfer failed.`,\n setPendingTxns,\n })\n .then(async (res) => {\n setIsTransferSubmittedModalVisible(true);\n })\n .finally(() => {\n setIsTransferring(false);\n });\n };\n\n const completeTransferLink = `/complete_account_transfer/${account}/${parsedReceiver}`;\n const pendingTransferLink = `/complete_account_transfer/${account}/${pendingReceiver}`;\n\n return (\n
\n \n Your transfer has been initiated.\n
\n
\n \n Continue\n \n \n
\n
\n Transfer Account\n
\n
\n \n Please only use this for full account transfers.\n
\n This will transfer all your FXDX, esFXDX, FLP and Multiplier Points to your new account.\n
\n Transfers are only supported if the receiving account has not staked FXDX or FLP tokens before.\n
\n Transfers are one-way, you will not be able to transfer staked tokens back to the sending account.\n
\n
\n {hasPendingReceiver && (\n
\n \n You have a pending transfer to {pendingReceiver}.\n \n
\n )}\n
\n
\n
\n
\n \n
\n setReceiver(e.target.value)}\n className=\"text-input\"\n />\n
\n
\n
\n \n Sender has withdrawn all tokens from FXDX Vesting Vault\n \n \n Sender has withdrawn all tokens from FLP Vesting Vault\n \n \n Receiver has not staked FXDX tokens before\n \n \n Receiver has not staked FLP tokens before\n \n
\n
\n onClickPrimary()}\n >\n {getPrimaryText()}\n \n
\n
\n
\n
\n
\n );\n}\n","import React, { useState } from \"react\";\nimport { Link, useParams } from \"react-router-dom\";\nimport { ethers } from \"ethers\";\nimport { useWeb3React } from \"@web3-react/core\";\nimport { useCopyToClipboard } from \"react-use\";\n\nimport { getContract } from \"config/contracts\";\n\nimport Modal from \"components/Modal/Modal\";\nimport Footer from \"components/Footer/Footer\";\n\nimport RewardRouter from \"abis/RewardRouter.json\";\n\nimport \"./CompleteAccountTransfer.css\";\n\nimport { Trans, t } from \"@lingui/macro\";\nimport { callContract } from \"lib/contracts\";\nimport { helperToast } from \"lib/helperToast\";\nimport { useChainId } from \"lib/chains\";\n\nexport default function CompleteAccountTransfer(props) {\n const [, copyToClipboard] = useCopyToClipboard();\n const { sender, receiver } = useParams();\n const { setPendingTxns } = props;\n const { library, account } = useWeb3React();\n const [isTransferSubmittedModalVisible, setIsTransferSubmittedModalVisible] = useState(false);\n\n const { chainId } = useChainId();\n\n const [isConfirming, setIsConfirming] = useState(false);\n const isCorrectAccount = (account || \"\").toString().toLowerCase() === (receiver || \"\").toString().toLowerCase();\n\n const rewardRouterAddress = getContract(chainId, \"RewardRouter\");\n\n const getError = () => {\n if (!account) {\n return t`Wallet is not connected`;\n }\n if (!isCorrectAccount) {\n return t`Incorrect Account`;\n }\n };\n\n const isPrimaryEnabled = () => {\n const error = getError();\n if (error) {\n return false;\n }\n if (isConfirming) {\n return false;\n }\n return true;\n };\n\n const getPrimaryText = () => {\n const error = getError();\n if (error) {\n return error;\n }\n return t`Complete Transfer`;\n };\n\n const onClickPrimary = () => {\n setIsConfirming(true);\n\n const contract = new ethers.Contract(rewardRouterAddress, RewardRouter.abi, library.getSigner());\n\n callContract(chainId, contract, \"acceptTransfer\", [sender], {\n sentMsg: t`Transfer submitted!`,\n failMsg: t`Transfer failed.`,\n setPendingTxns,\n })\n .then(async (res) => {\n setIsTransferSubmittedModalVisible(true);\n })\n .finally(() => {\n setIsConfirming(false);\n });\n };\n\n return (\n
\n \n Your transfer has been completed.\n
\n
\n \n Continue\n \n \n
\n
\n Complete Account Transfer\n
\n {!isCorrectAccount && (\n
\n To complete the transfer, you must switch your connected account to {receiver}.\n
\n
\n \n You will need to be on this page to accept the transfer,{\" \"}\n {\n copyToClipboard(window.location.href);\n helperToast.success(\"Link copied to your clipboard\");\n }}\n >\n click here\n {\" \"}\n to copy the link to this page if needed.\n \n
\n
\n
\n )}\n {isCorrectAccount && (\n
\n You have a pending transfer from {sender}.\n
\n
\n )}\n
\n {isCorrectAccount && (\n
\n
\n
\n \n
\n
\n
\n )}\n
\n
\n );\n}\n","// date format: d MMM yyyy, H:mm, time should be specifed based on UTC time\n\nexport type EventData = {\n id: string;\n title: string;\n isActive?: boolean;\n validTill: string;\n bodyText: string;\n buttons: {\n text: string;\n link: string;\n newTab: boolean;\n }[];\n};\n\nexport const homeEventsData: EventData[] = [\n // {\n // id: \"app-fxdx-io-launch\",\n // title: \"Frontend Updates\",\n // isActive: true,\n // validTill: \"10 Jul 2022, 12:00\",\n // bodyText:\n // \"Updates have been applied to the FXDX frontend to inform users of the separation between fxdx.io and app.fxdx.io\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://fxdxdex.medium.com/fxdx-frontend-updates-8d13f2346e1e\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"arbitrum-nitro-upgrade\",\n // title: \"Arbitrum Nitro Upgrade\",\n // isActive: true,\n // validTill: \"31 Aug 2022, 20:00\",\n // bodyText: \"The Arbitrum Nitro upgrade has been completed.\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://fxdxdex.medium.com/arbitrum-nitro-5f88c03a46fe\",\n // newTab: true,\n // },\n // ],\n // },\n];\n\nexport const appEventsData: EventData[] = [\n // {\n // id: \"removal-of-min-profit-rule\",\n // title: \"Trading improvements\",\n // isActive: true,\n // validTill: \"1 Apr 2022, 12:00\",\n // bodyText: \"The 1.5% minimum profit rule has been removed\",\n // buttons: [\n // {\n // text: \"Read more\",\n // link: \"https://fxdx.gitbook.io/fxdx/roadmap#30-march-2022\",\n // newTab: true,\n // },\n // {\n // text: \"Trade Now\",\n // link: \"https://fxdx.io/trade\",\n // },\n // ],\n // },\n // {\n // id: \"shorting-of-link-uni-re-enabled\",\n // title: \"Shorting of LINK and UNI\",\n // isActive: true,\n // validTill: \"20 Apr 2022, 12:00\",\n // bodyText: \"Shorting has been re-enabled for LINK and UNI.\",\n // buttons: [\n // {\n // text: \"Trade Now\",\n // link: \"https://fxdx.io/trade\",\n // },\n // ],\n // },\n // {\n // id: \"speed-up-page-loading\",\n // title: \"Speed Up Page Loading\",\n // isActive: true,\n // validTill: \"4 May 2022, 12:00\",\n // bodyText: \"If you experience data loading issues, please use a free RPC URL from Alchemy.\",\n // buttons: [\n // {\n // text: \"Learn More\",\n // link: \"https://fxdx.gitbook.io/fxdx/trading#backup-rpc-urls\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"referral-program-launch\",\n // title: \"Referral Program Launch\",\n // isActive: true,\n // validTill: \"4 May 2022, 12:00\",\n // bodyText: \"The FXDX referral program is now live! Get fee discounts and refer traders to earn rewards.\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://fxdx.io/referrals\",\n // },\n // {\n // text: \"Join Now\",\n // link: \"https://fxdx.io/referrals\",\n // },\n // ],\n // },\n // {\n // id: \"fxdx-arbitrum-odyssey\",\n // title: \"FXDX Arbitrum Odyssey\",\n // isActive: true,\n // validTill: \"3 Jul 2022, 12:00\",\n // bodyText:\n // \"The FXDX Arbitrum Odyssey is taking place this week, all participants will receive prizes. Read on to find out more.\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://fxdxdex.medium.com/fxdx-arbitrum-odyssey-fc12cba2d10d\",\n // },\n // ],\n // },\n // {\n // id: \"fix-arbitrum-transaction-issues\",\n // title: \"Fix Arbitrum Transactions\",\n // isActive: true,\n // validTill: \"30 Jun 2022, 12:00\",\n // bodyText:\n // \"If you experience transaction errors on Arbitrum or data loading issues, please use a free RPC URL from Alchemy.\",\n // buttons: [\n // {\n // text: \"Learn More\",\n // link: \"https://fxdx.gitbook.io/fxdx/trading#backup-rpc-urls\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"fxdx-arbitrum-odyssey-paused\",\n // title: \"FXDX Arbitrum Odyssey Paused\",\n // isActive: true,\n // validTill: \"3 Jul 2022, 12:00\",\n // bodyText: \"The FXDX Arbitrum Odyssey has been paused. Please read the linked post for more information.\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://twitter.com/FXDX_IO/status/1542163585111150592\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"app-fxdx-io\",\n // title: \"Frontend Updates\",\n // isActive: true,\n // validTill: \"6 Jul 2022, 12:00\",\n // bodyText:\n // \"On 6 Jul 2022, updates will be applied to the FXDX frontend to inform users of the separation between fxdx.io and app.fxdx.io\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://fxdxdex.medium.com/fxdx-frontend-updates-8d13f2346e1e\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"degraded-alchemy-performance\",\n // title: \"Alchemy RPC\",\n // isActive: true,\n // validTill: \"3 Jul 2022, 12:00\",\n // bodyText:\n // \"There are ongoing syncing issues on Alchemy for Arbitrum at the moment, please check their status page and use the public Arbitrum RPC in the meantime\",\n // buttons: [\n // {\n // text: \"Check Status\",\n // link: \"https://status.alchemy.com/\",\n // newTab: true,\n // },\n // {\n // text: \"Public RPC URL\",\n // link: \"https://metamask.zendesk.com/hc/en-us/articles/4415758358299-Network-profile-Arbitrum\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"app-fxdx-io-settings\",\n // title: \"Frontend Updates\",\n // isActive: true,\n // validTill: \"10 Jul 2022, 12:00\",\n // bodyText:\n // \"You are currently using app.fxdx.io. Customized settings have been reset, you may need to adjust your settings by clicking on the menu in the top right after connecting your wallet.\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://fxdxdex.medium.com/fxdx-frontend-updates-8d13f2346e1e\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"use-alchemy-rpc-url\",\n // title: \"Use Alchemy RPC URL\",\n // isActive: true,\n // validTill: \"10 Jul 2022, 12:00\",\n // bodyText:\n // \"If you experience data loading or transaction issues on Arbitrum, please use a free RPC URL from Alchemy.\",\n // buttons: [\n // {\n // text: \"Learn More\",\n // link: \"https://fxdx.gitbook.io/fxdx/trading#backup-rpc-urls\",\n // newTab: true,\n // },\n // ],\n // },\n // {\n // id: \"arbitrum-nitro-upgrade\",\n // title: \"Arbitrum Nitro Upgrade\",\n // isActive: true,\n // validTill: \"31 Aug 2022, 20:00\",\n // bodyText: \"The Arbitrum Nitro upgrade has been completed.\",\n // buttons: [\n // {\n // text: \"Read More\",\n // link: \"https://fxdxdex.medium.com/arbitrum-nitro-5f88c03a46fe\",\n // newTab: true,\n // },\n // ],\n // },\n {\n id: \"position-router-updates\",\n title: \"Position Router Updates\",\n isActive: true,\n validTill: \"19 Oct 2022, 20:00\",\n bodyText: \"Position routers have been updated, existing users may have to re-enable leverage.\",\n buttons: [\n {\n text: \"Read More\",\n link: \"https://fxdxdex.medium.com/fxdx-deployment-updates-a6a470df445f\",\n newTab: true,\n },\n ],\n },\n];\n","function Icon({ className }) {\n return (\n \n \n \n );\n}\n\nexport default Icon;\n","import \"./EventToast.css\";\nimport Icon from \"./AnnouncementIcon\";\nimport { MdOutlineClose } from \"react-icons/md\";\n\nexport default function EventToast({ event, id, onClick, t }) {\n return (\n
\n
\n
\n \n

{event.title}

\n
\n \n
\n

{event.bodyText}

\n
\n {event.buttons.map((button) => {\n if (button.newTab) {\n return (\n \n {button.text}\n \n );\n } else {\n return (\n \n {button.text}\n \n );\n }\n })}\n
\n
\n );\n}\n","import { useLocalStorage } from \"react-use\";\nimport toast from \"react-hot-toast\";\nimport { homeEventsData, appEventsData } from \"config/events\";\nimport { useEffect } from \"react\";\nimport EventToast from \"./EventToast\";\nimport { isFuture, parse } from \"date-fns\";\nimport { isHomeSite } from \"lib/legacy\";\n\nfunction useEventToast() {\n const isHome = isHomeSite();\n const [visited, setVisited] = useLocalStorage(\"visited-announcements\", []);\n\n useEffect(() => {\n const eventsData = isHome ? homeEventsData : appEventsData;\n\n eventsData\n .filter((event) => event.isActive)\n .filter((event) => isFuture(parse(event.validTill + \", +00\", \"d MMM yyyy, H:mm, x\", new Date())))\n .filter((event) => Array.isArray(visited) && !visited.includes(event.id))\n .forEach((event) => {\n toast.custom(\n (t) => (\n {\n toast.dismiss(event.id);\n visited.push(event.id);\n setVisited(visited);\n }}\n />\n ),\n {\n id: event.id,\n style: {},\n }\n );\n });\n }, [visited, setVisited, isHome]);\n}\n\nexport default useEventToast;\n","import { Toaster } from \"react-hot-toast\";\nimport { useWindowScroll, createBreakpoint } from \"react-use\";\n\nfunction EventToastContainer() {\n let { y: scrollY } = useWindowScroll();\n const useBreakpoint = createBreakpoint({ XL: 1033, L: 768, S: 350 });\n const breakpoint = useBreakpoint();\n return (\n 60 ? \"30px\" : `${93 - scrollY}px`,\n right: breakpoint === \"XL\" ? \"30px\" : \"1rem\",\n }}\n toastOptions={{\n duration: Infinity,\n }}\n />\n );\n}\nexport default EventToastContainer;\n","import SEO from \"components/Common/SEO\";\nimport Footer from \"components/Footer/Footer\";\nimport { getPageTitle } from \"lib/legacy\";\nimport \"./PageNotFound.css\";\nimport { Trans } from \"@lingui/macro\";\nimport { getHomeUrl, getTradePageUrl } from \"lib/legacy\";\n\nfunction PageNotFound() {\n const homeUrl = getHomeUrl();\n const tradePageUrl = getTradePageUrl();\n\n return (\n \n
\n
\n
\n

\n Page not found\n

\n

\n \n Return to \n Homepage or Trade\n \n

\n
\n
\n
\n
\n
\n );\n}\n\nexport default PageNotFound;\n","import React from \"react\";\nimport Footer from \"components/Footer/Footer\";\nimport SEO from \"components/Common/SEO\";\nimport { getPageTitle } from \"lib/legacy\";\nimport \"./ReferralTerms.css\";\nimport { IS_TESTNET } from \"config/chains\";\n\nexport default function ReferralTerms() {\n return (\n \n
\n
\n
\n
FXDX Referral Program
\n
Terms and Conditions
\n
Last modified: August 1st, 2022
\n
\n
\n
\n

\n Welcome to fxdx.exchange (\"we,\" \"us,\" or \"our\"), the informational resource for FXDX Protocol, as defined below.\n

\n

\n fxdx.exchange provides information and resources about the fundamentals of the decentralized non-custodial\n protocol called the FXDX Protocol (the \"FXDX Protocol,\" \"Protocol,\" or \"FXDX DApp\"). fxdx.exchange is not an\n available access point to the FXDX Protocol.\n

\n

\n These Terms and Conditions and any other documents incorporated herein by reference (collectively, these\n \"Terms\") to you or the company or other legal entity you represent (\"you,\" \"your,\" \"the Referrer,\" \"the\n Affiliate\"), explains the terms and conditions by which you may use the FXDX Referral Program (\"Referral\n Program\") as defined below.\n

\n

\n Please do not use the Referral Program if you disagree with any of these Terms.\n

\n
\n
\n

1. USE OF THE REFERRAL PROGRAM

\n

All this content is for informational purposes only.

\n

\n The Referral Program allows you to advertise the FXDX DApp, thereby driving traffic to it, whereby you\n may earn a portion of the fees generated (\"Rebates\") if a person that is not you (\"Trader,\" \"Referred\n User\") trades in the FXDX DApp after being referred to it from a hyperlink (\"Link\") or manually input\n code (\"Referral Code\"). The Trader will benefit from a fee discount (\"Discount\") associated with the\n Referrer's tier.\n

\n

\n After being referred to the FXDX DApp from a Link, the Trader's browser will save your Referral Code,\n which will be assigned to the Trader on his first trade.\n

\n

\n A Trader can also manually enter your Referral Code in the Traders section and change it at any time.\n

\n
\n
\n

2. OBLIGATIONS

\n

\n 2.1 As an Affiliate, FXDX DApp provides you with the Links and Referral Codes necessary to promote the\n FXDX Protocol. You acknowledge and agree it is your sole responsibility to indicate your correct Referral\n Code. You may promote the FXDX Protocol offers in any manner you choose unless it misleads someone about\n the FXDX Protocol.\n

\n

\n 2.2 fxdx.exchange is not responsible for (i) lost sales or lost opportunity to earn Rebates due to any cause,\n such as technical difficulties or over-capacity, including system overload in the {IS_TESTNET ? 'Mumbai' : 'MoonBeam'}\n blockchain; (ii) tracking Rebates, Discounts, or any other data, as this is handled by independent,\n smart contracts.\n

\n

\n 2.3 You will be excluded from the Referral Program, following the directives of the FXDX tokenholders:\n (i) if you use any language libelous, defamatory, profane, obscene, pornographic, sexually explicit,\n indecent, lewd, vulgar, suggestive, harassing, stalking, hateful, threatening, offensive,\n discriminatory, bigoted, abusive, inflammatory, fraudulent, deceptive, or otherwise objectionable or\n likely or intended to incite, threaten, facilitate, promote, or encourage hate, racial intolerance, or\n violent acts against others; (ii) if you try any form of gaming through self-referrals.\n

\n
\n
\n

3. REBATES AND DISCOUNTS

\n

\n Referrers will receive rebates based on a sliding percentage of fees paid by Referred Users. Rebates\n will never be retroactive.\n

\n

\n fxdx.exchange is under no obligation for Rebates or Discounts to any Referrer or Trader. Rebates and Discounts\n are handled following the directives of the FXDX tokenholders.\n

\n

\n The Rebates and Discounts percentages for the default tier Tier 1, and instructions to upgrade to Tier 2\n and Tier 3, are contained in{\" \"}\n \n https://fxdx.gitbook.io/fxdx/referrals.\n \n

\n
\n
\n

4. LIMITATION OF LIABILITY

\n

\n Under no circumstances shall fxdx.exchange be liable for any direct, indirect, incidental, punitive, special,\n consequential damages, or similar damages or liabilities whatsoever for any reason whatsoever related to\n these Terms, your use or inability to use our web site(s), or the materials and content of the web\n site(s) or any other web sites linked to such web site(s) or your provision of any personally\n identifiable information to a backend service provider or any third party. This limitation applies\n regardless of whether the alleged liability is based on contract, tort, warranty, negligence, strict\n liability, or any other basis, even if we have been advised of the possibility of such damages or such\n damages were reasonably foreseeable.\n

\n

\n In no event shall fxdx.exchange's aggregate liability arising out of or in connection with the Site exceed five\n hundred Singapore Dollars (500 SGD).\n

\n
\n
\n

5. INDEMNIFICATION

\n

\n You will defend, indemnify, and hold harmless fxdx.exchange, its affiliates, members, member, managers,\n employees, attorneys, representatives, suppliers, and contractors from any claim, demand, lawsuit,\n action, proceeding, investigation, liability, damage, loss, cost or expense, including without\n limitation reasonable attorneys' fees, arising out of or relating to arising under these Terms, the\n service(s) provided by fxdx.exchange, or your use of the service(s) provided by fxdx.exchange, including, without\n limitation, an infringement by you, or by anyone else using such service(s) we provide to you, of any\n intellectual property or other proprietary rights of any person or entity, or from the violation of any\n of our operating rules or policies relating to the service(s) provided. When we may be involved in a\n suit involving a third party and which is related to our service(s) to you under these Terms, we may\n seek written assurances from you in which you promise to defend, indemnify and hold us harmless from the\n costs and liabilities described in this paragraph. Such written assurances may include, in our sole\n discretion, the posting of a performance bond(s) or other guarantees reasonably calculated to guarantee\n payment. We may consider your failure to provide such assurances a breach of these Terms by you. The\n terms of this paragraph will survive any termination or cancellation of the Terms.\n

\n
\n
\n

6. MODIFICATION, SUSPENSION, AND TERMINATION

\n

\n The Referral Program runs independently from fxdx.exchange, which the token holders of FXDX determine. Due to\n this, from time to time and with or without prior notice to you, the Referral Program could be subject\n to modifications, suspensions, or disabilities, in whole or in part, for any reason whatsoever.\n

\n

\n fxdx.exchange will not be liable for any losses suffered by you resulting from any modification to the Referral\n Program or from any modification, suspension, or termination, for any reason, of your access to all or\n any portion of the Interface or the Protocol.\n

\n

\n fxdx.exchange may revise these Terms from time to time. We will notify you by updating the date at the top of\n the Terms and maintaining a current version. The most current version of the Terms will always be at\n https://fxdx.exchange/referral-terms. All modifications will be effective when they are posted. By using the\n Referral Program after those revisions become effective, you agree to be bound by the revised Terms.\n

\n
\n
\n

7. GOVERNING LAW

\n

\n The interpretation and enforcement of these Terms, and any dispute related to these Terms, the Site, or\n the Interface, will be governed by and construed and enforced under the laws of the Bahamas, as\n applicable.\n

\n
\n
\n

8. GENERAL

\n

\n 8.1 These Terms, including other policies or agreements incorporated herein, constitute the entire and\n only agreement between you and fxdx.exchange concerning the subject matter of these Terms and supersede all\n prior or contemporaneous agreements, representations, warranties, and understandings, written or oral,\n concerning the subject matter of these Terms. Any failure by us to exercise or enforce any right or\n provision of the Terms shall not constitute a waiver of such right or provision.\n

\n

\n 8.2 You must legally be able to enter into the Terms. Using the Referral Program, you represent and\n warrant that you meet the eligibility requirement. If you do not meet the requirement, you must not\n access the Referral Program.\n

\n

\n 8.3 Nothing contained herein will be construed to create the relationship of principal and agent,\n employer and employee, partners or joint venturers. Each party shall ensure that the foregoing persons\n shall not represent to the contrary, either expressly, implicitly, by appearance, or otherwise.\n

\n

\n 8.4 If any provision of these Terms shall be unenforceable or invalid under any applicable law or be\n held by any applicable court decision, such unenforceability or invalidity shall not render these Terms\n unenforceable or invalid as a whole. fxdx.exchange will amend or replace such provision with one that is valid\n and enforceable and which achieves, to the extent possible, our original objectives and intent as\n reflected in the original provision.\n

\n

\n 8.5 You may not assign or transfer any right to use the Referral Program, or any of your rights or\n obligations under these Terms, without our express prior written consent, including by operation of law\n or in connection with any change of control. fxdx.exchange may assign or transfer any or all of our rights or\n obligations under these Terms, in whole or part, without notice or obtaining your consent or approval.\n

\n

\n 8.6 fxdx.exchange will have no responsibility or liability for any failure or delay in performance of the Site,\n or any loss or damage that you may incur, due to any circumstance or event beyond our control, including\n without limitation any flood, extraordinary weather conditions, earthquake, or other act of God, fire,\n war, insurrection, riot, labor dispute, accident, any law, order regulation, direction, action or\n request of the government, communications, power failure, or equipment or software malfunction.\n

\n
\n
\n

9. CONTACT INFORMATION

\n

\n If you have any questions about these Terms, the Site, or the Interface, please get in touch with fxdx.exchange\n on any of our official channels.\n

\n
\n
\n
\n
\n
\n
\n );\n}\n","import React from \"react\";\nimport Footer from \"components/Footer/Footer\";\nimport SEO from \"components/Common/SEO\";\nimport { getPageTitle } from \"lib/legacy\";\nimport \"./TermsAndConditions.css\";\nimport { IS_TESTNET } from \"config/chains\";\n\nexport default function TermsAndConditions() {\n return (\n \n
\n
\n
\n
FXDX
\n
Terms and Conditions
\n
Last modified: Dec 14th, 2022
\n
\n
\n
\n

\n Welcome to fxdx.exchange (\"we,\" \"us,\" or \"our\"), the informational resource for FXDX Protocol, as defined below.\n

\n

\n fxdx.exchange provides information and resources about the fundamentals of the decentralized non-custodial\n protocol called the FXDX Protocol (the \"FXDX Protocol,\" \"Protocol,\" or \"FXDX DApp\"). fxdx.exchange is not an\n available access point to the FXDX Protocol.\n

\n

\n These Terms and Conditions and any other documents incorporated herein by reference (collectively, these\n \"Terms\") to you or the company or other legal entity you represent (\"you\" or \"your\") explains the terms\n and conditions by which you may access fxdx.exchange (\"the Site\") and app.fxdx.exchange (\"the Interface\"). Please do\n not use the Site or Interface if you disagree with any of these Terms.\n

\n
\n
\n

1. USE OF THE SITE AND THE INTERFACE

\n

The fxdx.exchange site is for informational purposes only.

\n

\n fxdx.exchange is not part of any transaction on the blockchain networks underlying the FXDX Protocol; we do not\n have possession, custody, or control over any crypto assets appearing on the Interface; and we do not\n have possession, custody, or control over any user's funds. Further, we do not store, send, or receive\n any crypto assets. You understand that when you interact with any FXDX Protocol smart contracts, you\n always retain control over your crypto assets. We do not have access to your private keys.\n

\n
    \n
  • \n

    \n 1.1. As a condition to accessing or using the Site or Interface, you represent and warrant to fxdx.exchange\n the following:\n

    \n
      \n
    • \n

      \n 1.1.1. If you are an individual person, then you are of legal age in the jurisdiction in which\n you reside, and you have the legal capacity to enter into these Terms and be bound by them;\n

      \n
    • \n
    • \n

      \n 1.1.2. If you are an entity, then you must have the legal authority to accept these Terms on\n that entity's behalf, in which case \"you\" (except as used in this paragraph) will mean that\n entity;\n

      \n
    • \n
    • \n

      1.1.3. You are not a U.S. Person;

      \n
    • \n
    • \n

      \n 1.1.4. You are not a resident, national, or agent of any country to which the United States, the\n United Kingdom, or the European Union embargoes goods or imposes similar sanctions\n (collectively, \"Restricted Territories\");\n

      \n
    • \n
    • \n

      \n 1.1.5. You are not subject to economic or trade sanctions administered or enforced by any\n governmental authority; or otherwise, you are not a member of any sanctions list or equivalent\n maintained by the United States government, the United Kingdom government, the European Union,\n or the United Nations, including without limitation the U.S. Office of Foreign Asset Control\n Specifically Designated Nationals and Blocked Person List (collectively, \"Sanctions Lists\n Persons\");\n

      \n
    • \n
    • \n

      \n 1.1.6. You do intend to transact with any Restricted Person or Sanctions List Person;\n

      \n
    • \n
    • \n

      \n 1.1.7. You do not, and will not, use VPN software or any other privacy or anonymization tools or\n techniques, or other means, to circumvent, or attempt to circumvent, any restrictions that\n apply; and\n

      \n
    • \n
    • \n

      \n 1.1.8. Your access is not (a) prohibited by and does not otherwise violate or assist you in\n violating any domestic or foreign law, rule, statute, regulation, by-law, order, protocol, code,\n decree, letter, or another directive, requirement, guidance, or guideline, published or in force\n that applies to or is otherwise intended to govern or regulate any person, property,\n transaction, activity, event or other matter, including any rule, letter, order, judgment,\n directive or other requirements, guidance, or guideline issued by any domestic or foreign\n federal, provincial or state, municipal, local or other governmental, regulatory, judicial or\n administrative authority having jurisdiction over fxdx.exchange or you as otherwise duly enacted,\n enforceable by law, the common law or equity (collectively, \"Applicable Laws\"); or (b)\n contribute to or facilitate any illegal activity.\n

      \n
    • \n
    \n
  • \n
\n
    \n
  • \n

    \n 1.2. As a condition to accessing or using the Site or the Interface, you acknowledge, understand,\n and agree to the following:\n

    \n
      \n
    • \n

      \n 1.2.1. From time to time, the Site or the Interface may be inaccessible or inoperable for any\n reason, including, but not limited to: (a) equipment malfunctions; (b) periodic maintenance\n procedures or repairs that fxdx.exchange or any of its suppliers or contractors may undertake from time\n to time; (c) causes beyond fxdx.exchange's control or that fxdx.exchange could not reasonably foresee; (d)\n disruptions and temporary or permanent unavailability of underlying blockchain infrastructure;\n or (e) unavailability of third-party service providers or external partners for any reason;\n

      \n
    • \n
    • \n

      \n 1.2.2. We reserve the right to disable or modify access to the Site at any time in the event of\n any breach of these Terms, including, without limitation, if we reasonably believe any of your\n representations and warranties may be untrue or inaccurate, and we will not be liable to you for\n any losses or damages you may suffer as a result of or in connection with the Site or the\n Interface being inaccessible to you at any time or for any reason;\n

      \n
    • \n
    • \n

      \n 1.2.3. The Interface may evolve, which means third parties may apply changes, replace, or\n discontinue (temporarily or permanently) the access at any time in their sole discretion;\n

      \n
    • \n
    • \n

      \n 1.2.4. The pricing information provided on the Site or the Interface does not represent an\n offer, a solicitation of an offer, or any advice regarding, or recommendation to enter into, a\n transaction with fxdx.exchange;\n

      \n
    • \n
    • \n

      1.2.5. fxdx.exchange does not act as a broker or advisor for you;

      \n
    • \n
    • \n

      \n 1.2.6. You are solely responsible for your use of the Site or the Interface, including all of\n your transfers of digital assets;\n

      \n
    • \n
    • \n

      \n 1.2.7. To the fullest not prohibited by Applicable Law, we owe no fiduciary duties or\n liabilities to you or any other party, and that to the extent any such duties or liabilities may\n exist at law or in equity, you hereby irrevocably disclaim, waive, and eliminate those duties\n and liabilities;\n

      \n
    • \n
    • \n

      \n 1.2.8. You are solely responsible for reporting and paying any taxes applicable to your use of\n the Interface; and\n

      \n
    • \n
    • \n

      \n 1.2.9. We have no control over, or liability for, the delivery, quality, safety, legality, or\n any other aspect of any digital assets that you may transfer to or from a third party, and we\n are not responsible for ensuring that an entity with whom you transact completes the transaction\n or is authorized to do so. If you experience a problem with any transactions in digital assets\n using the Site or the Interface, you bear the entire risk.\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

2. FEES

\n

\n You are required to pay all fees for transactions involving certain blockchain networks. These fees may\n include gas costs and all other fees reflected on the Interface at your use, including trading-related\n fees. fxdx.exchange does not receive fees for any blockchain transactions or using the Site or the Interface.\n

\n
\n
\n

3. NO PROFESSIONAL ADVICE OR FIDUCIARY DUTIES

\n

\n Nothing herein constitutes legal, financial, business, or tax advice, and you are strongly advised to\n consult an advisor(s) before engaging in any activity in connection herewith. All information provided\n by the Site is for informational purposes only and should not be construed as professional advice. You\n should not take, or refrain from taking, any action based on any information contained on the Site or\n any other information that we make available at any time, including, without limitation, blog posts,\n articles, links to third-party content, discord content, news feeds, tutorials, tweets, and videos. The\n Terms are not intended to, and do not, create or impose any fiduciary duties on us.\n

\n
\n
\n

4. PROPRIETARY RIGHT

\n
    \n
  • \n

    \n 4.1. fxdx.exchange own all rights, names, logos, and other marks used on the Site and the Interface,\n including, without limitation, any copyrights in and to any content, code, data, or other materials\n that you may access or use on or through the Site or the Interface; however, the code for the FXDX\n Protocol and the Interface (app.fxdx.exchange) deployed on IPFS is open-sourced. Except as expressly set\n forth herein, your use of or access to the Site or the Interface does not grant you any ownership or\n other rights therein.\n

    \n
  • \n
  • \n

    \n 4.2. fxdx.exchange may use and share your comments, bug reports, ideas, or other feedback that you may\n provide, including suggestions about how we might improve. You agree that fxdx.exchange is free to use or\n not use any feedback we receive from you as we see fit, including copying and sharing such feedback\n with third parties, without any obligation to you.\n

    \n
  • \n
\n
\n
\n

5. MODIFICATION, SUSPENSION, AND TERMINATION

\n
    \n
  • \n

    \n 5.1. fxdx.exchange reserve the right, at our sole discretion, from time to time and with or without prior\n notice to you, to modify, suspend or disable (temporarily or permanently) the Site or our subdomain\n to the Interface, in whole or in part, for any reason whatsoever, including, without limitation.\n Upon termination of your access, your right to use the Site or the Interface from our subdomain will\n immediately cease. However, it would still be accessible via a third party since we do not host or\n own its code. fxdx.exchange will not be liable for any losses suffered by you resulting from any\n modification to the Site or the Interface or from any modification, suspension, or termination, for\n any reason, of your access to all or any portion of the Site or the Interface.\n

    \n
  • \n
  • \n

    \n 5.2. fxdx.exchange may revise these Terms from time to time. We will notify you by updating the date at the\n top of the Terms and maintaining a current version. The most current version of the Terms will\n always be at https://fxdx.exchange/terms-and-conditions. All modifications will be effective when they\n are posted. By continuing to access or use the Site or the Interface after those revisions become\n effective, you agree to be bound by the revised Terms.\n

    \n
  • \n
\n
\n
\n

6. RISKS

\n
    \n
  • \n

    \n 6.1. The use of technology related to blockchain, smart contracts, and cryptocurrencies, among\n others, entails a risk that by accessing transactions, you are assuming. fxdx.exchange does not own or\n control any underlying software through which blockchain networks are formed. The software\n underlying blockchain networks are open-source so anyone can use, copy, modify, and distribute it.\n By using the Interface, you acknowledge and agree:\n

    \n
      \n
    • \n

      \n 6.1.1. That fxdx.exchange is not responsible for the operation of the open-source software and networks\n underlying the Interface;\n

      \n
    • \n
    • \n

      \n 6.1.2. That there exists no guarantee of the functionality, security, or availability of that\n software and networks; and\n

      \n
    • \n
    • \n

      \n 6.1.3. That the underlying networks are subject to sudden changes in operating rules, such as\n those commonly referred to as \"forks,\" which may materially affect the Interface. You are\n responsible for securing your private key(s). We do not have access to your private key(s);\n losing control of your private key(s) will permanently and irreversibly deny you access to any\n blockchain-based network. Neither fxdx.exchange nor any other person or entity will be able to retrieve\n or protect your digital assets. If your private key(s) are lost, you will not be able to\n transfer your digital assets to any blockchain address or wallet. If this occurs, you will not\n be able to realize any value or utility from the digital assets you may hold.\n

      \n
    • \n
    \n
  • \n
  • \n

    \n 6.2. fxdx.exchange is not responsible for the content of any third party, including, but not limited to,\n information, materials, products, or services that fxdx.exchange does not own or control. In addition,\n third parties may offer promotions related to your access and use of the Interface. fxdx.exchange does not\n endorse or assume any responsibility for such resources or promotions. Suppose you access any such\n resources or participate in any such promotions. In that case, you do so at your own risk and\n understand that these Terms do not apply to your dealings or relationships with any third parties.\n You expressly relieve fxdx.exchange of all liability arising from using such resources or participating in\n such promotions.\n

    \n
  • \n
  • \n

    \n 6.3. You understand that the {IS_TESTNET ? 'Mumbai' : 'MoonBeam'} blockchain remains under development, which\n creates technological and security risks when using the Interface, in addition to uncertainty\n relating to digital assets and transactions therein. You acknowledge that the cost of transacting on\n the {IS_TESTNET ? 'Mumbai' : 'MoonBeam'} blockchain is variable and may increase at any time, causing an impact on\n any activities taking place on these blockchains, which may result in price fluctuations or\n increased costs when using the Interface.\n

    \n
  • \n
  • \n

    \n 6.4. Transactions entered into in connection with the Interface are irreversible and final, and\n there are no refunds. You acknowledge and agree that you will access and use the Interface at your\n own risk.\n

    \n
  • \n
  • \n

    \n 6.5. We must comply with Applicable Law, which may require us to, upon request by government\n agencies, take certain actions or provide information that may not be in your best interests.\n

    \n
  • \n
  • \n

    \n 6.6. You hereby assume and agree that fxdx.exchange will have no responsibility or liability for the risks\n in Section 9. You hereby irrevocably waive, release and discharge all claims, whether known or\n unknown to you, against fxdx.exchange, its affiliates, and their respective shareholders, members,\n directors, officers, employees, agents, representatives, suppliers, and contractors related to any\n of the risks set forth in this Section 6.\n

    \n
  • \n
\n
\n
\n

7. PROHIBITED USES

\n
    \n
  • \n

    \n 7.1 You agree not to engage in the prohibited uses set forth below. The specific activities set\n forth below are representative but not exhaustive. By using the Site or the Interface, you confirm\n that you will not do any of the following:\n

    \n
      \n
    • \n

      \n 7.1.1. Promote or facilitate illegal activities, including but not limited to money laundering,\n terrorist financing, tax evasion, buying or selling illegal drugs, contraband, counterfeit\n goods, or illegal weapons;\n

      \n
    • \n
    • \n

      \n 7.1.2. Engage in transactions involving items that infringe or violate any copyright, trademark,\n right of publicity, privacy, or any other proprietary right of fxdx.exchange;\n

      \n
    • \n
    • \n

      \n 7.1.3. Engage in improper or abusive trading practices, including but not limited to (a) any\n fraudulent act or scheme to defraud, deceive, trick, or mislead; (b) trading ahead of another\n user of the Site or the Interface or front-running; (c) fraudulent trading; (d) accommodation\n trading; (e) fictitious transactions; (f) pre-arranged or non-competitive transactions; or (g)\n cornering;\n

      \n
    • \n
    • \n

      \n 7.1.4. Uploading or transmitting viruses, worms, Trojan horses, time bombs, cancelbots, spiders,\n malware, or any other type of malicious code that will or may be used in any way that will\n affect the functionality or operation of the Site or the Interface;\n

      \n
    • \n
    • \n

      \n 7.1.5. Use the Site or Interface in any way that is, in our sole discretion, libelous,\n defamatory, profane, obscene, pornographic, sexually explicit, indecent, lewd, vulgar,\n suggestive, harassing, stalking, hateful, threatening, offensive, discriminatory, bigoted,\n abusive, inflammatory, fraudulent, deceptive, or otherwise objectionable or likely or intended\n to incite, threaten, facilitate, promote, or encourage hate, racial intolerance, or violent acts\n against others;\n

      \n
    • \n
    • \n

      \n 7.1.6. Harass, abuse, or harm another person or entity, including fxdx.exchange's collaborator and\n service providers;\n

      \n
    • \n
    • \n

      \n 7.1.7. Impersonate another user of the Site or the Interface or otherwise misrepresent yourself;\n or\n

      \n
    • \n
    • \n

      \n 7.1.8. Engage or attempt to engage or encourage, induce or assist any third party, or yourself\n attempt, to engage in any of the activities prohibited under this Section 4 or any other\n provision of these Terms.\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

8. DISCLOSURES; DISCLAIMERS

\n

\n fxdx.exchange is an informational site for the FXDX Protocol. fxdx.exchange does not operate an exchange platform or\n offer trade execution or clearing services and has no oversight, involvement, or control concerning your\n transactions using the Interface. All transactions between users of the Interface are executed\n peer-to-peer directly between the users' blockchain addresses through a third-party developed\n open-source smart contract.\n

\n

\n You are responsible for complying with all Applicable Laws that govern your Perpetual Contracts. As a\n result of restrictions under the Commodity Exchange Act and the regulations promulgated thereunder by\n the U.S. Commodity Futures Trading Commission (\"CFTC\"), no U.S. Person may enter into Perpetual\n Contracts using the Interface.\n

\n

\n You understand that fxdx.exchange is not registered or licensed by any regulatory agency or authority. No such\n agency or authority has reviewed or approved the use of the Site or the Interface.\n

\n

\n You agree that the Site and the Interface are provided on an \"AS IS\" and \"AS AVAILABLE\" basis. fxdx.exchange\n makes no guarantees of any kind or connection with the Site or the Interface.\n

\n
\n
\n

9. LIMITATION OF LIABILITY

\n

\n In no event shall fxdx.exchange, its affiliates, its suppliers and contractors, and its affiliates', suppliers'\n and contractors' respective stockholders, members, directors, officers, managers, employees, attorneys,\n agents, representatives, suppliers, and contractors shall be liable for any direct, indirect,\n incidental, special, punitive, consequential or similar damages or liabilities whatsoever (including,\n without limitation, damages for loss of fiat, assets, data, information, revenue, opportunities, use,\n goodwill, profits or other business or financial benefit) arising out of or in connection with the Site\n or the Interface, or other item provided by or on behalf of fxdx.exchange, whether under contract, tort\n (including negligence), civil liability, statute, strict liability, breach of warranties, or under any\n other theory of liability, and whether or not we have been advised of, knew of or should have known of\n the possibility of such damages and notwithstanding any failure of the essential purpose of these Terms\n or any limited remedy hereunder nor is fxdx.exchange in any way responsible for the execution or settlement of\n transactions between users of the Interface.\n

\n

\n In no event shall fxdx.exchange's aggregate liability arising out of or in connection with the Site or\n Interface exceed one thousand Singapore Dollars (1,000.00 SGD).\n

\n
\n
\n

10. INDEMNIFICATION

\n

\n You will defend, indemnify, and hold harmless fxdx.exchange, its affiliates, members, member, managers,\n employees, attorneys, representatives, suppliers, and contractors from any claim, demand, lawsuit,\n action, proceeding, investigation, liability, damage, loss, cost or expense, including without\n limitation reasonable attorneys' fees, arising out of or relating to (a) your use of or conduct in\n connection with the Site or the Interface (b) your violation of these Terms; or (c) your misuse of the\n Site or the Interface, or any smart contract and/or script related thereto; (d) your violation of any\n laws, rules, regulations, codes, statutes, ordinances, or orders of any governmental or\n quasi-governmental authorities; (e) your violation of the rights of any third party, including any\n intellectual property right, publicity, confidentiality, property, or privacy right; (f) your use of a\n third-party product, service, and/or website; or (g) any misrepresentation made by you. We reserve the\n right to assume, at your expense, the exclusive defense, and control of any matter subject to\n indemnification by you. You agree to cooperate with our defense of any claim. You will not, in any\n event, settle any claim without.\n

\n
\n
\n

11. DISPUTE RESOLUTION & ARBITRATION

\n

\n fxdx.exchange will use its best efforts to resolve potential disputes through informal, good faith\n negotiations. If a potential dispute arises, you must contact us by sending a written notice of your\n claim (\"Notice\") to fxdx.exchange on any of our official channels. The notice must (a) describe the nature and\n basis of the claim and (b) set forth the specific relief sought. Our notice to you will be similar in\n form to that described above. If you and fxdx.exchange cannot reach an agreement to resolve the claim within\n sixty (60) days of your email, then you and fxdx.exchange agree to resolve the potential dispute according to\n the process set forth below.\n

\n

\n Any claim or controversy arising out of or relating to the Site, the Interface, or these Terms, or any\n other acts or omissions for which you may contend that we are liable, including (but not limited to) any\n claim or controversy as to arbitrability (\"Dispute\"), shall be finally and exclusively settled by\n arbitration under the Corte Civil y Mercantil de Arbitraje (CIMA). You understand that you are required\n to resolve all Disputes by binding arbitration. The arbitration shall be confidential before a single\n arbitrator, who shall be selected pursuant to the CIMA rules. The arbitration will be held in Madrid,\n Spain, unless you and we both agree to hold it elsewhere. Unless we agree otherwise, the arbitrator may\n not consolidate your claims with those of any other party. Any judgment on the award rendered by the\n arbitrator may be entered in any court of competent jurisdiction.\n

\n

\n Any claim arising out of or related to these Terms or the Site or the Interface must be filed within one\n year after such claim arose; otherwise, the claim is permanently barred, which means that you and fxdx.exchange\n will not have the right to assert the claim.\n

\n
\n
\n

12. GOVERNING LAW

\n

\n The interpretation and enforcement of these Terms, and any dispute related to these Terms, the Site, or\n the Interface, will be governed by and construed and enforced under the laws of the Bahamas, as\n applicable.\n

\n
\n
\n

13. GENERAL INFORMATION

\n
    \n
  • \n

    \n 13.1. Any right or remedy of fxdx.exchange set forth in these Terms is in addition to, and not in lieu of,\n any other right or remedy whether described in these Terms, under Applicable Law, at law, or in\n equity. The failure or delay of fxdx.exchange in exercising any right, power, or privilege under these\n Terms shall not operate as a waiver thereof.\n

    \n
  • \n
  • \n

    \n 13.2. The following sections of these Terms will survive any termination of your access to the Site\n or the Interface, regardless of the reasons for its expiration or termination, in addition to any\n other provision which by law or by its nature should survive: Sections 3 through 12.\n

    \n
  • \n
  • \n

    \n 13.3. The invalidity or unenforceability of any of these Terms shall not affect the validity or\n enforceability of any other of these Terms, all of which shall remain in full force and effect.\n

    \n
  • \n
  • \n

    \n 13.4. fxdx.exchange will have no responsibility or liability for any failure or delay in performance of the\n Site or the Interface, or any loss or damage that you may incur, due to any circumstance or event\n beyond our control, including without limitation any flood, extraordinary weather conditions,\n earthquake, or other act of God, fire, war, insurrection, riot, labor dispute, accident, any law,\n order regulation, direction, action or request of the government, communications, power failure, or\n equipment or software malfunction.\n

    \n
  • \n
  • \n

    \n 13.5. You may not assign or transfer any right to use the Site, the Interface, or any of your rights\n or obligations under these Terms, without our express prior written consent, including by operation\n of law or in connection with any change of control. We may assign or transfer any or all of our\n rights or obligations under these Terms, in whole or part, without notice or obtaining your consent\n or approval.\n

    \n
  • \n
  • \n

    \n 13.6. These Terms contain the entire agreement between you and fxdx.exchange and supersede all prior and\n contemporaneous understandings between the parties regarding the Interface and the Site or the\n Interface.\n

    \n
  • \n
  • \n

    \n 13.7. In the event of any conflict between these Terms and any other agreement you may have with us,\n these Terms will control unless the other agreement specifically identifies these Terms and declares\n that the other agreement supersedes these Terms.\n

    \n
  • \n
  • \n

    \n 13.8. You agree that, except as otherwise expressly provided in these Terms, there shall be no\n third-party beneficiaries to the Terms other than the Indemnified Parties.\n

    \n
  • \n
\n
\n
\n

CONTACT INFORMATION

\n

\n If you have any questions about these Terms, the Site, or the Interface, please get in touch with fxdx.exchange\n on any of our official channels.\n

\n
\n
\n
\n
\n
\n
\n );\n}\n","import \"./RedirectModal.css\";\nimport Modal from \"../Modal/Modal\";\nimport Checkbox from \"../Checkbox/Checkbox\";\nimport { t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nexport function RedirectPopupModal({\n redirectModalVisible,\n setRedirectModalVisible,\n appRedirectUrl,\n setRedirectPopupTimestamp,\n setShouldHideRedirectModal,\n shouldHideRedirectModal,\n removeRedirectPopupTimestamp,\n}) {\n const onClickAgree = () => {\n if (shouldHideRedirectModal) {\n setRedirectPopupTimestamp(Date.now());\n }\n };\n\n return (\n \n You are leaving FXDX.io and will be redirected to a third party, independent website.\n
\n
\n \n The website is a community deployed and maintained instance of the open source{\" \"}\n FXDX front end, hosted and served on\n the distributed, peer-to-peer IPFS network.\n \n
\n
\n \n Alternative links can be found in the{\" \"}\n docs.\n
\n
\n By clicking Agree you accept the \n T&Cs\n {\" \"}\n and Referral T&Cs.\n
\n
\n
\n
\n \n Don't show this message again for 30 days.\n \n
\n onClickAgree()}>\n Agree\n \n \n );\n}\n","import React from \"react\";\nimport \"./Jobs.css\";\nimport SEO from \"components/Common/SEO\";\nimport Footer from \"components/Footer/Footer\";\nimport { getPageTitle } from \"lib/legacy\";\nimport Card from \"components/Common/Card\";\nimport { t, Trans } from \"@lingui/macro\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nfunction Jobs() {\n return (\n \n
\n
\n
\n
\n
\n Jobs\n
\n
\n Job openings at FXDX Exchange.\n
\n
\n
\n
\n \n
\n
\n
\n \n );\n}\n\nfunction NoJob() {\n return (\n \n
\n

\n \n FXDX Exchange is not actively looking for new hires at the moment. However, if you think you can contribute to the\n project, please email jobs@fxdx.exchange.\n \n

\n
\n
\n );\n}\n\n// function JobCard() {\n// return (\n// \n//
\n//

What you will do:

\n//
    \n//
  • Work closely with the FXDX team on the FXDX front-end website.
  • \n//
  • Collaborate and discuss features to be worked on.
  • \n//
  • Remote full-time position, flexible working hours.
  • \n//
\n//
\n//

What we are looking for:

\n//
    \n//
  • Required skills: HTML5, CSS3, React, Ethers, Web3 JS.
  • \n//
  • Bonus skills: Node JS.
  • \n//
  • 5+ years of experience.
  • \n//
  • Previous DeFi experience and knowledge.
  • \n//
  • Must speak fluent English and available to start right away.
  • \n//
  • Comfortable making changes to the interface following our current design guidelines.
  • \n//
\n//

The salary is 60,000 to 120,000 USD + 1,000 to 3,000 FXDX a year.

\n//

\n// If the job suits you, please get in touch with{\" \"}\n// \n// jobs@fxdx.io\n// {\" \"}\n// using the following email subject: Application for Senior front-end developer: [Your name]\n//

\n//
\n//
\n//
\n// );\n// }\n\nexport default Jobs;\n","import { i18n } from \"@lingui/core\";\nimport { en, es, zh, ko, ru, ja, fr, de } from \"make-plural/plurals\";\nimport { LANGUAGE_LOCALSTORAGE_KEY } from \"config/localStorage\";\nimport { isDevelopment } from \"./legacy\";\n\n// uses BCP-47 codes from https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html\nexport const locales = {\n en: \"English\",\n es: \"Spanish\",\n zh: \"Chinese\",\n ko: \"Korean\",\n // ru: \"Russian\",\n ja: \"Japanese\",\n // fr: \"French\", \n // de: \"German\",\n ...(isDevelopment() && { pseudo: \"Test\" }),\n};\n\nexport const defaultLocale = \"es\";\n\ni18n.loadLocaleData({\n en: { plurals: en },\n es: { plurals: es },\n zh: { plurals: zh },\n ko: { plurals: ko },\n ru: { plurals: ru },\n ja: { plurals: ja },\n fr: { plurals: fr },\n de: { plurals: de },\n ...(isDevelopment() && { pseudo: { plurals: en } }),\n});\n\nexport function isTestLanguage(locale) {\n return locale === \"pseudo\";\n}\n\nexport async function dynamicActivate(locale) {\n const { messages } = await import(`@lingui/loader!locales/${locale}/messages.po`);\n if (!isTestLanguage(locale)) {\n localStorage.setItem(LANGUAGE_LOCALSTORAGE_KEY, locale);\n }\n i18n.load(locale, messages);\n i18n.activate(locale);\n}\n","import \"./AddressDropdown.css\";\nimport { Menu } from \"@headlessui/react\";\nimport { Trans } from \"@lingui/macro\";\nimport { shortenAddress, useENS } from \"lib/legacy\";\nimport { useCopyToClipboard, createBreakpoint } from \"react-use\";\nimport externalLink from \"img/ic_new_link_16.svg\";\nimport copy from \"img/ic_copy_16.svg\";\nimport disconnect from \"img/ic_sign_out_16.svg\";\nimport { FaChevronDown } from \"react-icons/fa\";\nimport Davatar from \"@davatar/react\";\nimport { helperToast } from \"lib/helperToast\";\n\nfunction AddressDropdown({ account, accountUrl, disconnectAccountAndCloseSettings }) {\n const useBreakpoint = createBreakpoint({ L: 600, M: 550, S: 400 });\n const breakpoint = useBreakpoint();\n const [, copyToClipboard] = useCopyToClipboard();\n const { ensName } = useENS(account);\n\n return (\n \n \n \n \n
\n \n \n {\n copyToClipboard(account);\n helperToast.success(\"Address copied to your clipboard\");\n }}\n >\n \"Copy\n

\n Copy Address\n

\n
\n \n \n \n \"Open\n

\n View in Explorer\n

\n
\n
\n \n
\n \"Disconnect\n

\n Disconnect\n

\n
\n
\n \n
\n \n );\n}\n\nexport default AddressDropdown;\n","import { ReactNode } from \"react\";\nimport cx from \"classnames\";\nimport \"./Button.css\";\n\ntype Props = {\n imgSrc: string;\n children: ReactNode;\n onClick: () => void;\n className?: string;\n};\n\nexport default function ConnectWalletButton({ imgSrc, children, onClick, className }: Props) {\n let classNames = cx(\"btn btn-primary btn-sm connect-wallet\", className);\n return (\n \n );\n}\n","import Portal from \"../Common/Portal\";\nimport Modal from \"./Modal\";\n\nexport default function ModalWithPortal(props) {\n return (\n \n \n \n );\n}\n","import React, { useRef, useState } from \"react\";\nimport { Menu } from \"@headlessui/react\";\nimport ModalWithPortal from \"../Modal/ModalWithPortal\";\nimport { t, Trans } from \"@lingui/macro\";\nimport cx from \"classnames\";\nimport { HiDotsVertical } from \"react-icons/hi\";\nimport \"./NetworkDropdown.css\";\nimport language24Icon from \"img/ic_language24.svg\";\nimport settingsIcon from \"img/ic_settings_16.svg\";\nimport ethereumIcon from \"img/ic_ethereum_24.svg\";\nimport arbitrumIcon from \"img/ic_arbitrum_24.svg\";\nimport avaxIcon from \"img/ic_avalanche_24.svg\";\nimport moonbeamIcon from \"img/ic_moonbeam_24.svg\";\nimport checkedIcon from \"img/ic_checked.svg\";\nimport { importImage } from \"lib/legacy\";\nimport { defaultLocale, dynamicActivate, isTestLanguage, locales } from \"lib/i18n\";\nimport { LANGUAGE_LOCALSTORAGE_KEY } from \"config/localStorage\";\n\nconst LANGUAGE_MODAL_KEY = \"LANGUAGE\";\nconst NETWORK_MODAL_KEY = \"NETWORK\";\n\nexport default function NetworkDropdown(props) {\n const currentLanguage = useRef(localStorage.getItem(LANGUAGE_LOCALSTORAGE_KEY) || defaultLocale);\n const [activeModal, setActiveModal] = useState(null);\n\n function getModalContent(modalName) {\n switch (modalName) {\n case LANGUAGE_MODAL_KEY:\n return ;\n case NETWORK_MODAL_KEY:\n return (\n \n );\n default:\n return;\n }\n }\n\n function getModalProps(modalName) {\n switch (modalName) {\n case LANGUAGE_MODAL_KEY:\n return {\n className: \"language-popup\",\n isVisible: activeModal === LANGUAGE_MODAL_KEY,\n setIsVisible: () => setActiveModal(null),\n label: t`Select Language`,\n };\n case NETWORK_MODAL_KEY:\n return {\n className: \"network-popup\",\n isVisible: activeModal === NETWORK_MODAL_KEY,\n setIsVisible: () => setActiveModal(null),\n label: t`Networks and Settings`,\n };\n default:\n return {};\n }\n }\n\n return (\n <>\n {props.small ? (\n
setActiveModal(NETWORK_MODAL_KEY)}>\n
\n \n
\n
\n ) : (\n \n )}\n {getModalContent(activeModal)}\n \n );\n}\nfunction NavIcons({ selectorLabel }) {\n const iconsMap = {\n Ethereum: ethereumIcon,\n Goerli: ethereumIcon,\n Arbitrum: arbitrumIcon,\n ArbRinkeby: arbitrumIcon,\n Avalanche: avaxIcon,\n MoonBeam: moonbeamIcon,\n Mumbai: ethereumIcon,\n }\n return (\n <>\n \n
\n \n \n );\n}\n\nfunction DesktopDropdown({ setActiveModal, selectorLabel, networkOptions, onNetworkSelect, openSettings }) {\n return (\n
\n \n \n \n \n \n
\n Networks\n
\n
\n \n
\n
\n \n
\n
\n
\n \"\"\n
\n \n Settings\n \n
\n
\n
\n \n setActiveModal(LANGUAGE_MODAL_KEY)}\n >\n
\n
\n \"\"\n
\n \n Language\n \n
\n
\n \n
\n
\n
\n );\n}\n\nfunction NetworkMenuItems({ networkOptions, selectorLabel, onNetworkSelect }) {\n async function handleNetworkSelect(option) {\n await onNetworkSelect(option);\n }\n return networkOptions.map((network) => {\n const networkIcon = importImage(network.icon);\n return (\n \n handleNetworkSelect({ value: network.value })}\n >\n
\n
\n {network.label}\n
\n {network.label}\n
\n
\n
\n
\n
\n
\n );\n });\n}\n\nfunction LanguageModalContent({ currentLanguage }) {\n return Object.keys(locales).map((item) => {\n const image = !isTestLanguage(item) && importImage(`flag_${item}.svg`);\n return (\n {\n if (!isTestLanguage(item)) {\n localStorage.setItem(LANGUAGE_LOCALSTORAGE_KEY, item);\n }\n dynamicActivate(item);\n }}\n >\n
\n
\n {isTestLanguage(item) ? \"🫐\" : {locales[item]}}\n
\n {locales[item]}\n
\n
\n {currentLanguage.current === item && {locales[item]}}\n
\n
\n );\n });\n}\nfunction NetworkModalContent({ networkOptions, onNetworkSelect, selectorLabel, setActiveModal, openSettings }) {\n async function handleNetworkSelect(option) {\n await onNetworkSelect(option);\n }\n return (\n
\n
\n \n Networks\n \n\n {networkOptions.map((network) => {\n const networkIcon = importImage(network.icon);\n return (\n handleNetworkSelect({ value: network.value })}\n key={network.value}\n >\n
\n {network.label}\n {network.label}\n
\n
\n
\n );\n })}\n \n More Options\n \n {\n setActiveModal(LANGUAGE_MODAL_KEY);\n }}\n >\n
\n \"Select\n Language\n
\n
\n {\n openSettings();\n setActiveModal(null);\n }}\n >\n
\n \"\"\n \n Settings\n \n
\n
\n
\n
\n );\n}\n","import React, { useRef, useState } from \"react\";\nimport ModalWithPortal from \"../Modal/ModalWithPortal\";\nimport { t } from \"@lingui/macro\";\nimport cx from \"classnames\";\nimport \"./NetworkDropdown.css\";\nimport language24Icon from \"img/ic_language24.svg\";\nimport checkedIcon from \"img/ic_checked.svg\";\nimport { importImage, isHomeSite } from \"lib/legacy\";\nimport { defaultLocale, dynamicActivate, locales } from \"lib/i18n\";\nimport { LANGUAGE_LOCALSTORAGE_KEY } from \"config/localStorage\";\n\nexport default function LanguagePopupHome() {\n const currentLanguage = useRef(localStorage.getItem(LANGUAGE_LOCALSTORAGE_KEY) || defaultLocale);\n const [isLanguageModalOpen, setIsLanguageModalOpen] = useState(false);\n\n return (\n <>\n
setIsLanguageModalOpen(true)}>\n
\n \n
\n
\n\n \n {Object.keys(locales).map((item) => {\n const image = importImage(`flag_${item}.svg`);\n return (\n {\n localStorage.setItem(LANGUAGE_LOCALSTORAGE_KEY, item);\n dynamicActivate(item);\n }}\n >\n
\n
\n \"language-menu-open-icon\"\n
\n {locales[item]}\n
\n
\n {currentLanguage.current === item && {locales[item]}}\n
\n
\n );\n })}\n \n \n );\n}\n","import { useWeb3React } from \"@web3-react/core\";\nimport AddressDropdown from \"../AddressDropdown/AddressDropdown\";\nimport ConnectWalletButton from \"../Common/ConnectWalletButton\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { HeaderLink } from \"./HeaderLink\";\nimport connectWalletImg from \"img/ic_wallet_24.svg\";\n\nimport \"./Header.css\";\nimport { isHomeSite, getAccountUrl } from \"lib/legacy\";\n// import { isDevelopment } from \"lib/legacy\";\nimport cx from \"classnames\";\nimport { Trans } from \"@lingui/macro\";\nimport NetworkDropdown from \"../NetworkDropdown/NetworkDropdown\";\nimport LanguagePopupHome from \"../NetworkDropdown/LanguagePopupHome\";\nimport { getChainName, GOERLI, MUMBAI, IS_TESTNET, MOONBEAM } from \"config/chains\";\nimport { switchNetwork } from \"lib/wallets\";\nimport { useChainId } from \"lib/chains\";\n\ntype Props = {\n openSettings: () => void;\n small?: boolean;\n setWalletModalVisible: (visible: boolean) => void;\n disconnectAccountAndCloseSettings: () => void;\n redirectPopupTimestamp: number;\n showRedirectModal: (to: string) => void;\n};\n\nexport function AppHeaderUser({\n openSettings,\n small,\n setWalletModalVisible,\n disconnectAccountAndCloseSettings,\n redirectPopupTimestamp,\n showRedirectModal,\n}: Props) {\n const { chainId } = useChainId();\n const { active, account } = useWeb3React();\n const showConnectionOptions = !isHomeSite();\n\n const networkOptions = IS_TESTNET ? [\n {\n label: getChainName(MUMBAI),\n value: MUMBAI,\n icon: \"ic_ethereum_24.svg\",\n color: \"#264f79\",\n },\n ] : [\n {\n label: getChainName(MOONBEAM),\n value: MOONBEAM,\n icon: \"ic_moonbeam_24.svg\",\n color: \"#264f79\",\n },\n // {\n // label: getChainName(ARBITRUM),\n // value: ARBITRUM,\n // icon: \"ic_arbitrum_24.svg\",\n // color: \"#264f79\",\n // },\n // {\n // label: getChainName(AVALANCHE),\n // value: AVALANCHE,\n // icon: \"ic_avalanche_24.svg\",\n // color: \"#E841424D\",\n // },\n ];\n // if (isDevelopment()) {\n // networkOptions.push({\n // label: getChainName(ARBITRUM_TESTNET),\n // value: ARBITRUM_TESTNET,\n // icon: \"ic_arbitrum_24.svg\",\n // color: \"#264f79\",\n // });\n // }\n\n useEffect(() => {\n if (active) {\n setWalletModalVisible(false);\n }\n }, [active, setWalletModalVisible]);\n\n const onNetworkSelect = useCallback(\n (option) => {\n if (option.value === chainId) {\n return;\n }\n return switchNetwork(option.value, active);\n },\n [chainId, active]\n );\n\n const selectorLabel = getChainName(chainId);\n\n if (!active) {\n return (\n
\n
\n \n Trade\n \n
\n\n {showConnectionOptions ? (\n <>\n setWalletModalVisible(true)} imgSrc={connectWalletImg}>\n {small ? Connect : Connect Wallet}\n \n \n \n ) : (\n \n )}\n
\n );\n }\n\n const accountUrl = getAccountUrl(chainId, account);\n\n return (\n
\n
\n \n Trade\n \n
\n\n {showConnectionOptions ? (\n <>\n
\n \n
\n \n \n ) : (\n \n )}\n
\n );\n}\n","import React from \"react\";\nimport { FiX } from \"react-icons/fi\";\nimport { Trans } from \"@lingui/macro\";\nimport { Link } from \"react-router-dom\";\n\nimport { HeaderLink } from \"./HeaderLink\";\nimport \"./Header.css\";\nimport { isHomeSite } from \"lib/legacy\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\nimport logoImg from \"img/logo.png\";\n\ntype Props = {\n small?: boolean;\n clickCloseIcon?: () => void;\n openSettings?: () => void;\n redirectPopupTimestamp: number;\n showRedirectModal: (to: string) => void;\n};\n\nexport function AppHeaderLinks({\n small,\n openSettings,\n clickCloseIcon,\n redirectPopupTimestamp,\n showRedirectModal,\n}: Props) {\n return (\n
\n {small && (\n
\n \n \"FXDX\n \n clickCloseIcon && clickCloseIcon()}\n >\n \n
\n
\n )}\n
\n \n Dashboard\n \n
\n
\n \n Earn\n \n
\n
\n \n Buy\n \n
\n
\n \n Referrals\n \n
\n {/*
\n \n Ecosystem\n \n
*/}\n
\n \n About\n \n
\n {small && !isHomeSite() && (\n
\n {/* eslint-disable-next-line */}\n \n Settings\n \n
\n )}\n
\n );\n}\n","import React, { ReactNode, useEffect, useState } from \"react\";\nimport cx from \"classnames\";\n\nimport { AppHeaderUser } from \"./AppHeaderUser\";\nimport { AppHeaderLinks } from \"./AppHeaderLinks\";\n\nimport logoImg from \"img/logo.png\";\nimport logoSmallImg from \"img/logo.png\";\nimport { RiMenuLine } from \"react-icons/ri\";\nimport { FaTimes } from \"react-icons/fa\";\nimport { AnimatePresence as FramerAnimatePresence, motion } from \"framer-motion\";\n\nimport \"./Header.css\";\nimport { Link } from \"react-router-dom\";\n\n// Fix framer-motion old React FC type (solved in react 18)\nconst AnimatePresence = (props: React.ComponentProps & { children: ReactNode }) => (\n \n);\n\nconst fadeVariants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n};\n\nconst slideVariants = {\n hidden: { x: \"-100%\" },\n visible: { x: 0 },\n};\n\ntype Props = {\n disconnectAccountAndCloseSettings: () => void;\n openSettings: () => void;\n setWalletModalVisible: (visible: boolean) => void;\n redirectPopupTimestamp: number;\n showRedirectModal: (to: string) => void;\n};\n\nexport function Header({\n disconnectAccountAndCloseSettings,\n openSettings,\n setWalletModalVisible,\n redirectPopupTimestamp,\n showRedirectModal,\n}: Props) {\n const [isDrawerVisible, setIsDrawerVisible] = useState(false);\n const [isNativeSelectorModalVisible, setIsNativeSelectorModalVisible] = useState(false);\n\n useEffect(() => {\n if (isDrawerVisible) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"unset\";\n }\n\n return () => {\n document.body.style.overflow = \"unset\";\n };\n }, [isDrawerVisible]);\n\n return (\n <>\n {isDrawerVisible && (\n \n {isDrawerVisible && (\n setIsDrawerVisible(!isDrawerVisible)}\n >\n )}\n \n )}\n {isNativeSelectorModalVisible && (\n \n {isNativeSelectorModalVisible && (\n setIsNativeSelectorModalVisible(!isNativeSelectorModalVisible)}\n >\n )}\n \n )}\n
\n
\n
\n \n \"FXDX\n \"FXDX\n \n \n
\n
\n \n
\n
\n
\n \n
\n
setIsDrawerVisible(!isDrawerVisible)}>\n {!isDrawerVisible && }\n {isDrawerVisible && }\n
\n
setIsDrawerVisible(!isDrawerVisible)}>\n \"FXDX\n \"FXDX\n
\n
\n
\n \n
\n
\n
\n \n \n {isDrawerVisible && (\n setIsDrawerVisible(false)}\n className=\"App-header-links-container App-header-drawer\"\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n variants={slideVariants}\n transition={{ duration: 0.2 }}\n >\n setIsDrawerVisible(false)}\n redirectPopupTimestamp={redirectPopupTimestamp}\n showRedirectModal={showRedirectModal}\n />\n \n )}\n \n \n );\n}\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { SWRConfig } from \"swr\";\nimport { ethers } from \"ethers\";\nimport { Web3ReactProvider, useWeb3React } from \"@web3-react/core\";\nimport { Web3Provider } from \"@ethersproject/providers\";\nimport useScrollToTop from \"lib/useScrollToTop\";\n\nimport { Switch, Route, BrowserRouter as Router, Redirect, useLocation, useHistory } from \"react-router-dom\";\n\nimport {\n DEFAULT_SLIPPAGE_AMOUNT,\n BASIS_POINTS_DIVISOR,\n getAppBaseUrl,\n isHomeSite,\n isMobileDevice,\n REFERRAL_CODE_QUERY_PARAM,\n isDevelopment,\n} from \"lib/legacy\";\n\nimport Home from \"pages/Home/Home\";\nimport Dashboard from \"pages/Dashboard/Dashboard\";\n// import Ecosystem from \"pages/Ecosystem/Ecosystem\";\nimport Stake from \"pages/Stake/Stake\";\nimport { Exchange } from \"pages/Exchange/Exchange\";\nimport Actions from \"pages/Actions/Actions\";\nimport OrdersOverview from \"pages/OrdersOverview/OrdersOverview\";\nimport PositionsOverview from \"pages/PositionsOverview/PositionsOverview\";\nimport Referrals from \"pages/Referrals/Referrals\";\nimport BuyFlp from \"pages/BuyFlp/BuyFlp\";\n// import BuyFXDX from \"pages/BuyFXDX/BuyFXDX\";\nimport Buy from \"pages/Buy/Buy\";\nimport NftWallet from \"pages/NftWallet/NftWallet\";\n// import ClaimEsFxdx from \"pages/ClaimEsFxdx/ClaimEsFxdx\";\nimport BeginAccountTransfer from \"pages/BeginAccountTransfer/BeginAccountTransfer\";\nimport CompleteAccountTransfer from \"pages/CompleteAccountTransfer/CompleteAccountTransfer\";\n\nimport { cssTransition, ToastContainer } from \"react-toastify\";\nimport \"react-toastify/dist/ReactToastify.css\";\nimport Modal from \"components/Modal/Modal\";\nimport Checkbox from \"components/Checkbox/Checkbox\";\n\nimport \"styles/Shared.css\";\nimport \"styles/Font.css\";\nimport \"./App.scss\";\nimport \"styles/Input.css\";\n\nimport metamaskImg from \"img/metamask.png\";\nimport coinbaseImg from \"img/coinbaseWallet.png\";\nimport walletConnectImg from \"img/walletconnect-circle-blue.svg\";\nimport useEventToast from \"components/EventToast/useEventToast\";\nimport EventToastContainer from \"components/EventToast/EventToastContainer\";\nimport SEO from \"components/Common/SEO\";\nimport useRouteQuery from \"lib/useRouteQuery\";\nimport { encodeReferralCode, decodeReferralCode } from \"domain/referrals\";\n\nimport { getContract } from \"config/contracts\";\nimport Vault from \"abis/Vault.json\";\nimport PositionRouter from \"abis/PositionRouter.json\";\nimport PageNotFound from \"pages/PageNotFound/PageNotFound\";\nimport ReferralTerms from \"pages/ReferralTerms/ReferralTerms\";\nimport TermsAndConditions from \"pages/TermsAndConditions/TermsAndConditions\";\nimport { useLocalStorage } from \"react-use\";\nimport { RedirectPopupModal } from \"components/ModalViews/RedirectModal\";\nimport { REDIRECT_POPUP_TIMESTAMP_KEY } from \"config/ui\";\nimport Jobs from \"pages/Jobs/Jobs\";\n\nimport { i18n } from \"@lingui/core\";\nimport { I18nProvider } from \"@lingui/react\";\nimport { Trans, t } from \"@lingui/macro\";\nimport { defaultLocale, dynamicActivate } from \"lib/i18n\";\nimport { Header } from \"components/Header/Header\";\nimport { ARBITRUM, AVALANCHE, getAlchemyWsUrl, getExplorerUrl, GOERLI, MOONBEAM, MUMBAI } from \"config/chains\";\nimport { useLocalStorageSerializeKey } from \"lib/localStorage\";\nimport { helperToast } from \"lib/helperToast\";\nimport {\n CURRENT_PROVIDER_LOCALSTORAGE_KEY,\n DISABLE_ORDER_VALIDATION_KEY,\n IS_PNL_IN_LEVERAGE_KEY,\n LANGUAGE_LOCALSTORAGE_KEY,\n REFERRAL_CODE_KEY,\n SHOULD_EAGER_CONNECT_LOCALSTORAGE_KEY,\n SHOULD_SHOW_POSITION_LINES_KEY,\n SHOW_PNL_AFTER_FEES_KEY,\n SLIPPAGE_BPS_KEY,\n} from \"config/localStorage\";\nimport {\n activateInjectedProvider,\n clearWalletConnectData,\n clearWalletLinkData,\n getInjectedHandler,\n getWalletConnectHandler,\n hasCoinBaseWalletExtension,\n hasMetaMaskWalletExtension,\n useEagerConnect,\n useInactiveListener,\n} from \"lib/wallets\";\nimport { useChainId } from \"lib/chains\";\nimport ExternalLink from \"components/ExternalLink/ExternalLink\";\n\nif (\"ethereum\" in window) {\n window.ethereum.autoRefreshOnNetworkChange = false;\n}\n\nfunction getLibrary(provider) {\n const library = new Web3Provider(provider);\n return library;\n}\n\nconst Zoom = cssTransition({\n enter: \"zoomIn\",\n exit: \"zoomOut\",\n appendPosition: false,\n collapse: true,\n collapseDuration: 200,\n duration: 200,\n});\n\n// const goerliWsProvider = new ethers.providers.WebSocketProvider(\"wss://goerli.infura.io/ws/v3/5fe38fecbed34e5098225e7b279a2289\");\nconst goerliWsProvider = new ethers.providers.JsonRpcProvider(\"https://ethereum-goerli-rpc.allthatnode.com\")\nconst mumbaiWsProvider = new ethers.providers.JsonRpcProvider(\"https://matic-mumbai.chainstacklabs.com\")\n\nconst arbWsProvider = new ethers.providers.WebSocketProvider(getAlchemyWsUrl());\n\nconst avaxWsProvider = new ethers.providers.JsonRpcProvider(\"https://api.avax.network/ext/bc/C/rpc\");\n\nconst moonbeamWsProvider = new ethers.providers.JsonRpcProvider(\"https://rpc.api.moonbeam.network\");\n\nfunction getWsProvider(active, chainId) {\n if (!active) {\n return;\n }\n if (chainId === GOERLI) {\n return goerliWsProvider;\n }\n\n if (chainId === ARBITRUM) {\n return arbWsProvider;\n }\n\n if (chainId === AVALANCHE) {\n return avaxWsProvider;\n }\n\n if (chainId === MOONBEAM) {\n return moonbeamWsProvider;\n }\n if (chainId === MUMBAI) {\n return mumbaiWsProvider;\n }\n}\n\nfunction FullApp() {\n const isHome = isHomeSite();\n const exchangeRef = useRef();\n const { connector, library, deactivate, activate, active } = useWeb3React();\n const { chainId } = useChainId();\n const location = useLocation();\n const history = useHistory();\n useEventToast();\n const [activatingConnector, setActivatingConnector] = useState();\n useEffect(() => {\n if (activatingConnector && activatingConnector === connector) {\n setActivatingConnector(undefined);\n }\n }, [activatingConnector, connector, chainId]);\n const triedEager = useEagerConnect(setActivatingConnector);\n useInactiveListener(!triedEager || !!activatingConnector);\n\n const query = useRouteQuery();\n\n useEffect(() => {\n let referralCode = query.get(REFERRAL_CODE_QUERY_PARAM);\n if (!referralCode || referralCode.length === 0) {\n const params = new URLSearchParams(window.location.search);\n referralCode = params.get(REFERRAL_CODE_QUERY_PARAM);\n }\n\n if (referralCode && referralCode.length <= 20) {\n const encodedReferralCode = encodeReferralCode(referralCode);\n if (encodeReferralCode !== ethers.constants.HashZero) {\n localStorage.setItem(REFERRAL_CODE_KEY, encodedReferralCode);\n const queryParams = new URLSearchParams(location.search);\n if (queryParams.has(REFERRAL_CODE_QUERY_PARAM)) {\n queryParams.delete(REFERRAL_CODE_QUERY_PARAM);\n history.replace({\n search: queryParams.toString(),\n });\n }\n }\n }\n }, [query, history, location]);\n\n const disconnectAccount = useCallback(() => {\n // only works with WalletConnect\n clearWalletConnectData();\n // force clear localStorage connection for MM/CB Wallet (Brave legacy)\n clearWalletLinkData();\n deactivate();\n }, [deactivate]);\n\n const disconnectAccountAndCloseSettings = () => {\n disconnectAccount();\n localStorage.removeItem(SHOULD_EAGER_CONNECT_LOCALSTORAGE_KEY);\n localStorage.removeItem(CURRENT_PROVIDER_LOCALSTORAGE_KEY);\n setIsSettingsVisible(false);\n };\n\n const connectInjectedWallet = getInjectedHandler(activate);\n const activateWalletConnect = () => {\n getWalletConnectHandler(activate, deactivate, setActivatingConnector)();\n };\n\n const userOnMobileDevice = \"navigator\" in window && isMobileDevice(window.navigator);\n\n const activateMetaMask = () => {\n if (!hasMetaMaskWalletExtension()) {\n helperToast.error(\n
\n MetaMask not detected.\n
\n
\n {userOnMobileDevice ? (\n \n Install MetaMask, and use FXDX with its built-in\n browser\n \n ) : (\n \n Install MetaMask to start using FXDX\n \n )}\n
\n );\n return false;\n }\n attemptActivateWallet(\"MetaMask\");\n };\n const activateCoinBase = () => {\n if (!hasCoinBaseWalletExtension()) {\n helperToast.error(\n
\n Coinbase Wallet not detected.\n
\n
\n {userOnMobileDevice ? (\n \n Install Coinbase Wallet, and use FXDX\n with its built-in browser\n \n ) : (\n \n Install Coinbase Wallet to start using\n FXDX\n \n )}\n
\n );\n return false;\n }\n attemptActivateWallet(\"CoinBase\");\n };\n\n const attemptActivateWallet = (providerName) => {\n localStorage.setItem(SHOULD_EAGER_CONNECT_LOCALSTORAGE_KEY, true);\n localStorage.setItem(CURRENT_PROVIDER_LOCALSTORAGE_KEY, providerName);\n activateInjectedProvider(providerName);\n connectInjectedWallet();\n };\n\n const [walletModalVisible, setWalletModalVisible] = useState(false);\n const [redirectModalVisible, setRedirectModalVisible] = useState(false);\n const [shouldHideRedirectModal, setShouldHideRedirectModal] = useState(false);\n const [redirectPopupTimestamp, setRedirectPopupTimestamp, removeRedirectPopupTimestamp] =\n useLocalStorage(REDIRECT_POPUP_TIMESTAMP_KEY);\n const [selectedToPage, setSelectedToPage] = useState(\"\");\n const connectWallet = () => setWalletModalVisible(true);\n\n const [isSettingsVisible, setIsSettingsVisible] = useState(false);\n const [savedSlippageAmount, setSavedSlippageAmount] = useLocalStorageSerializeKey(\n [chainId, SLIPPAGE_BPS_KEY],\n DEFAULT_SLIPPAGE_AMOUNT\n );\n const [slippageAmount, setSlippageAmount] = useState(0);\n const [isPnlInLeverage, setIsPnlInLeverage] = useState(false);\n const [shouldDisableValidationForTesting, setShouldDisableValidationForTesting] = useState(false);\n const [showPnlAfterFees, setShowPnlAfterFees] = useState(false);\n\n const [savedIsPnlInLeverage, setSavedIsPnlInLeverage] = useLocalStorageSerializeKey(\n [chainId, IS_PNL_IN_LEVERAGE_KEY],\n false\n );\n\n const [savedShowPnlAfterFees, setSavedShowPnlAfterFees] = useLocalStorageSerializeKey(\n [chainId, SHOW_PNL_AFTER_FEES_KEY],\n false\n );\n const [savedShouldDisableValidationForTesting, setSavedShouldDisableValidationForTesting] =\n useLocalStorageSerializeKey([chainId, DISABLE_ORDER_VALIDATION_KEY], false);\n\n const [savedShouldShowPositionLines, setSavedShouldShowPositionLines] = useLocalStorageSerializeKey(\n [chainId, SHOULD_SHOW_POSITION_LINES_KEY],\n false\n );\n\n const openSettings = () => {\n const slippage = parseInt(savedSlippageAmount);\n setSlippageAmount((slippage / BASIS_POINTS_DIVISOR) * 100);\n setIsPnlInLeverage(savedIsPnlInLeverage);\n setShowPnlAfterFees(savedShowPnlAfterFees);\n setShouldDisableValidationForTesting(savedShouldDisableValidationForTesting);\n setIsSettingsVisible(true);\n };\n\n const saveAndCloseSettings = () => {\n const slippage = parseFloat(slippageAmount);\n if (isNaN(slippage)) {\n helperToast.error(t`Invalid slippage value`);\n return;\n }\n if (slippage > 5) {\n helperToast.error(t`Slippage should be less than 5%`);\n return;\n }\n\n const basisPoints = (slippage * BASIS_POINTS_DIVISOR) / 100;\n if (parseInt(basisPoints) !== parseFloat(basisPoints)) {\n helperToast.error(t`Max slippage precision is 0.01%`);\n return;\n }\n\n setSavedIsPnlInLeverage(isPnlInLeverage);\n setSavedShowPnlAfterFees(showPnlAfterFees);\n setSavedShouldDisableValidationForTesting(shouldDisableValidationForTesting);\n setSavedSlippageAmount(basisPoints);\n setIsSettingsVisible(false);\n };\n\n const localStorageCode = window.localStorage.getItem(REFERRAL_CODE_KEY);\n const baseUrl = getAppBaseUrl();\n let appRedirectUrl = baseUrl + selectedToPage;\n if (localStorageCode && localStorageCode.length > 0 && localStorageCode !== ethers.constants.HashZero) {\n const decodedRefCode = decodeReferralCode(localStorageCode);\n if (decodedRefCode) {\n appRedirectUrl = `${appRedirectUrl}?ref=${decodedRefCode}`;\n }\n }\n\n const [pendingTxns, setPendingTxns] = useState([]);\n\n const showRedirectModal = (to) => {\n setRedirectModalVisible(true);\n setSelectedToPage(to);\n };\n\n useEffect(() => {\n const checkPendingTxns = async () => {\n const updatedPendingTxns = [];\n for (let i = 0; i < pendingTxns.length; i++) {\n const pendingTxn = pendingTxns[i];\n const receipt = await library.getTransactionReceipt(pendingTxn.hash);\n if (receipt) {\n if (receipt.status === 0) {\n const txUrl = getExplorerUrl(chainId) + \"tx/\" + pendingTxn.hash;\n helperToast.error(\n
\n \n Txn failed. View\n \n
\n
\n );\n }\n if (receipt.status === 1 && pendingTxn.message) {\n const txUrl = getExplorerUrl(chainId) + \"tx/\" + pendingTxn.hash;\n helperToast.success(\n
\n {pendingTxn.message}{\" \"}\n \n View\n \n
\n
\n );\n }\n continue;\n }\n updatedPendingTxns.push(pendingTxn);\n }\n\n if (updatedPendingTxns.length !== pendingTxns.length) {\n setPendingTxns(updatedPendingTxns);\n }\n };\n\n const interval = setInterval(() => {\n checkPendingTxns();\n }, 2 * 1000);\n return () => clearInterval(interval);\n }, [library, pendingTxns, chainId]);\n\n const vaultAddress = getContract(chainId, \"Vault\");\n const positionRouterAddress = getContract(chainId, \"PositionRouter\");\n\n useEffect(() => {\n const wsVaultAbi = Vault.abi;\n const wsProvider = getWsProvider(active, chainId);\n if (!wsProvider) {\n return;\n }\n\n const wsVault = new ethers.Contract(vaultAddress, wsVaultAbi, wsProvider);\n const wsPositionRouter = new ethers.Contract(positionRouterAddress, PositionRouter.abi, wsProvider);\n\n const callExchangeRef = (method, ...args) => {\n if (!exchangeRef || !exchangeRef.current) {\n return;\n }\n\n exchangeRef.current[method](...args);\n };\n\n // handle the subscriptions here instead of within the Exchange component to avoid unsubscribing and re-subscribing\n // each time the Exchange components re-renders, which happens on every data update\n const onUpdatePosition = (...args) => callExchangeRef(\"onUpdatePosition\", ...args);\n const onClosePosition = (...args) => callExchangeRef(\"onClosePosition\", ...args);\n const onIncreasePosition = (...args) => callExchangeRef(\"onIncreasePosition\", ...args);\n const onDecreasePosition = (...args) => callExchangeRef(\"onDecreasePosition\", ...args);\n const onCancelIncreasePosition = (...args) => callExchangeRef(\"onCancelIncreasePosition\", ...args);\n const onCancelDecreasePosition = (...args) => callExchangeRef(\"onCancelDecreasePosition\", ...args);\n\n wsVault.on(\"UpdatePosition\", onUpdatePosition);\n wsVault.on(\"ClosePosition\", onClosePosition);\n wsVault.on(\"IncreasePosition\", onIncreasePosition);\n wsVault.on(\"DecreasePosition\", onDecreasePosition);\n wsPositionRouter.on(\"CancelIncreasePosition\", onCancelIncreasePosition);\n wsPositionRouter.on(\"CancelDecreasePosition\", onCancelDecreasePosition);\n\n return function cleanup() {\n wsVault.off(\"UpdatePosition\", onUpdatePosition);\n wsVault.off(\"ClosePosition\", onClosePosition);\n wsVault.off(\"IncreasePosition\", onIncreasePosition);\n wsVault.off(\"DecreasePosition\", onDecreasePosition);\n wsPositionRouter.off(\"CancelIncreasePosition\", onCancelIncreasePosition);\n wsPositionRouter.off(\"CancelDecreasePosition\", onCancelDecreasePosition);\n };\n }, [active, chainId, vaultAddress, positionRouterAddress]);\n\n return (\n <>\n
\n
\n \n {isHome && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n {!isHome && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {/* \n \n \n \n \n */}\n \n \n \n \n \n \n \n \n \n {/* \n \n */}\n \n \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 Allowed Slippage\n
\n
\n setSlippageAmount(e.target.value)}\n />\n
%
\n
\n
\n
\n \n Display PnL after fees\n \n
\n
\n \n Include PnL in leverage display\n \n
\n {isDevelopment() && (\n
\n \n Disable order validations\n \n
\n )}\n\n \n \n \n );\n}\n\nfunction App() {\n useScrollToTop();\n useEffect(() => {\n const defaultLanguage = localStorage.getItem(LANGUAGE_LOCALSTORAGE_KEY) || defaultLocale;\n dynamicActivate(defaultLanguage);\n }, []);\n return (\n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default App;\n","import React from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport default function useRouteQuery() {\n const { search } = useLocation();\n return React.useMemo(() => new URLSearchParams(search), [search]);\n}\n","import { useEffect } from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport default function useScrollToTop() {\n const history = useHistory();\n useEffect(() => {\n const unlisten = history.listen(() => {\n window.scrollTo(0, 0);\n });\n return () => {\n unlisten();\n };\n }, [history]);\n}\n","const reportWebVitals = (onPerfEntry) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"regenerator-runtime/runtime\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport App from \"./App/App\";\nimport reportWebVitals from \"./reportWebVitals\";\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.info))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}