import { Box, Container, Divider, Typography, InputLabel, FormControl, OutlinedInput, useMediaQuery, useTheme, } from "@mui/material"; import SettingsIcon from '@mui/icons-material/Settings'; import { useEffect, useState } from "react"; import { useParams, useLocation, useSearchParams } from "react-router-dom"; import { Helmet } from "react-helmet"; import ReactGA from "react-ga4"; import InfoTooltip from "../../components/Tooltip/InfoTooltip"; import Modal from "../../components/Modal/Modal"; import PageTitle from "../../components/PageTitle/PageTitle"; import Paper from "../../components/Paper/Paper"; import SwapCard from "../../components/Swap/SwapCard"; import GhostStyledIcon from "../../components/Icon/GhostIcon"; import { Tab, Tabs } from "../../components/Tabs/Tabs"; import { UNISWAP_V2_ROUTER, UNISWAP_V2_FACTORY, DAI_ADDRESSES, FTSO_ADDRESSES, } from "../../constants/addresses"; import { useTokenSymbol } from "../../hooks/tokens"; import PoolContainer from "./PoolContainer"; import SwapContainer from "./SwapContainer"; import TokenModal from "./TokenModal"; const Dex = ({ chainId, address, connect }) => { const location = useLocation(); const pathname = useParams(); const theme = useTheme(); const isSmallScreen = useMediaQuery("(max-width: 650px)"); const isVerySmallScreen = useMediaQuery("(max-width: 379px)"); const [currentQueryParameters, setSearchParams] = useSearchParams(); const newQueryParameters = new URLSearchParams(); const [isSwap, setIsSwap] = useState(false); const [settingsOpen, handleSettingsOpen] = useState(false); const [topTokenListOpen, setTopTokenListOpen] = useState(false); const [bottomTokenListOpen, setBottomTokenListOpen] = useState(false); const [secondsToWait, setSecondsToWait] = useState(localStorage.getItem("dex-deadline") || "60"); const [slippage, setSlippage] = useState(localStorage.getItem("dex-slippage") || "5"); const [formatDecimals, setFormatDecimals] = useState(localStorage.getItem("dex-decimals") || "5"); const [tokenAddressTop, setTokenAddressTop] = useState(DAI_ADDRESSES[chainId]); const [tokenAddressBottom, setTokenAddressBottom] = useState(FTSO_ADDRESSES[chainId]); const { symbol: tokenNameTop } = useTokenSymbol(chainId, tokenAddressTop); const { symbol: tokenNameBottom } = useTokenSymbol(chainId, tokenAddressBottom); useEffect(() => { if (currentQueryParameters.has("pool")) { setIsSwap(false); newQueryParameters.set("pool", true); } else { setIsSwap(true); newQueryParameters.delete("pool"); } if (currentQueryParameters.has("from")) { setTokenAddressTop(currentQueryParameters.get("from")); newQueryParameters.set("from", currentQueryParameters.get("from")); } else { setTokenAddressTop(DAI_ADDRESSES[chainId]); newQueryParameters.set("from", DAI_ADDRESSES[chainId]); } if (currentQueryParameters.has("to")) { setTokenAddressBottom(currentQueryParameters.get("to")); newQueryParameters.set("to", currentQueryParameters.get("to")); } else { setTokenAddressBottom(FTSO_ADDRESSES[chainId]); newQueryParameters.set("to", FTSO_ADDRESSES[chainId]); } setSearchParams(newQueryParameters) }, [currentQueryParameters]) useEffect(() => { ReactGA.send({ hitType: "pageview", page: location.pathname + location.search }); }, [location]) const dexAddresses = { router: UNISWAP_V2_ROUTER[chainId], factory: UNISWAP_V2_FACTORY[chainId], } const onCardsSwap = () => { const tmpFrom = currentQueryParameters.get("from"); const tmpTo = currentQueryParameters.get("to"); if (currentQueryParameters.has("pool")) newQueryParameters.set("pool", true); else newQueryParameters.delete("pool"); newQueryParameters.set("from", tmpTo); newQueryParameters.set("to", tmpFrom); setSearchParams(newQueryParameters); } const changeSwapTab = (swap) => { if (swap) newQueryParameters.delete("pool"); else newQueryParameters.set("pool", true); newQueryParameters.set("from", currentQueryParameters.get("from")); newQueryParameters.set("to", currentQueryParameters.get("to")); setSearchParams(newQueryParameters); } const setInnerTokenAddressTop = (tokenAddress) => { if (currentQueryParameters.has("pool")) newQueryParameters.set("pool", true); else newQueryParameters.delete("pool"); if (currentQueryParameters.get("to") === tokenAddress) { newQueryParameters.set("from", currentQueryParameters.get("from")); } else newQueryParameters.set("from", tokenAddress); newQueryParameters.set("to", currentQueryParameters.get("to")); setSearchParams(newQueryParameters); } const setInnerTokenAddressBottom = (tokenAddress) => { if (currentQueryParameters.has("pool")) newQueryParameters.set("pool", true); else newQueryParameters.delete("pool"); newQueryParameters.set("from", currentQueryParameters.get("from")); if (currentQueryParameters.get("from") === tokenAddress) { newQueryParameters.set("to", currentQueryParameters.get("to")); } else newQueryParameters.set("to", tokenAddress); setSearchParams(newQueryParameters); } const setSlippageInner = (value) => { const maybeValue = parseFloat(value); if (!maybeValue || parseFloat(value) <= 100) { setSlippage(value); localStorage.setItem("dex-slippage", value); } } const setSecondsToWaitInner = (value) => { localStorage.setItem("dex-deadline", value); setSecondsToWait(value); } const setFormatDecimalsInner = (value) => { if (Number(value) <= 17) { localStorage.setItem("dex-decimals", value); setFormatDecimals(value); } } return ( ghostSwap | The pure web3 legacy v2 swap handleSettingsOpen(false)} > Slippage setSlippageInner(event.currentTarget.value)} endAdornment="%" /> Transaction may revert if price changes by more than slippage % Transaction deadline setSecondsToWaitInner(event.currentTarget.value)} endAdornment="seconds" /> How long transaction is valid in the transaction pool Decimal representation setFormatDecimalsInner(event.currentTarget.value)} endAdornment="decimals" /> Number of decimals to be shown in token balances } headerContent={ changeSwapTab(view === 0)} TabIndicatorProps={{ style: { display: "none" } }} > } > {isSwap ? : } ) } export default Dex;