"use client"; import { useEffect, useState } from "react"; import { Curve } from "./_components"; import type { NextPage } from "next"; import { Address as AddressType, formatEther, isAddress, parseEther } from "viem"; import { useAccount } from "wagmi"; import { Address, AddressInput, Balance, EtherInput, IntegerInput } from "~~/components/scaffold-eth"; import { useDeployedContractInfo, useScaffoldReadContract, useScaffoldWriteContract } from "~~/hooks/scaffold-eth"; import { useWatchBalance } from "~~/hooks/scaffold-eth/useWatchBalance"; // REGEX for number inputs (only allow numbers and a single decimal point) const NUMBER_REGEX = /^\.?\d+\.?\d*$/; const Dex: NextPage = () => { const [isLoading, setIsLoading] = useState(true); const [ethToTokenAmount, setEthToTokenAmount] = useState(""); const [tokenToETHAmount, setTokenToETHAmount] = useState(""); const [depositAmount, setDepositAmount] = useState(""); const [withdrawAmount, setWithdrawAmount] = useState(""); const [approveSpender, setApproveSpender] = useState(""); const [approveAmount, setApproveAmount] = useState(""); const [accountBalanceOf, setAccountBalanceOf] = useState(""); const { data: DEXInfo } = useDeployedContractInfo({ contractName: "DEX" }); const { data: BalloonsInfo } = useDeployedContractInfo({ contractName: "Balloons" }); const { address: connectedAccount } = useAccount(); const { data: DEXBalloonBalance } = useScaffoldReadContract({ contractName: "Balloons", functionName: "balanceOf", args: [DEXInfo?.address?.toString()], }); useEffect(() => { if (DEXBalloonBalance !== undefined) { setIsLoading(false); } }, [DEXBalloonBalance]); const { data: DEXtotalLiquidity } = useScaffoldReadContract({ contractName: "DEX", functionName: "totalLiquidity", }); const { writeContractAsync: writeDexContractAsync } = useScaffoldWriteContract({ contractName: "DEX" }); const { writeContractAsync: writeBalloonsContractAsync } = useScaffoldWriteContract({ contractName: "Balloons" }); const { data: balanceOfWrite } = useScaffoldReadContract({ contractName: "Balloons", functionName: "balanceOf", args: [accountBalanceOf as AddressType], query: { enabled: isAddress(accountBalanceOf), }, }); const { data: contractBalance } = useScaffoldReadContract({ contractName: "Balloons", functionName: "balanceOf", args: [DEXInfo?.address], }); const { data: userBalloons } = useScaffoldReadContract({ contractName: "Balloons", functionName: "balanceOf", args: [connectedAccount], }); const { data: userLiquidity } = useScaffoldReadContract({ contractName: "DEX", functionName: "getLiquidity", args: [connectedAccount], }); const { data: contractETHBalance } = useWatchBalance({ address: DEXInfo?.address }); return ( <>

🎈: {parseFloat(formatEther(userBalloons || 0n)).toFixed(4)} 💦💦: {parseFloat(formatEther(userLiquidity || 0n)).toFixed(4)} SpeedRunEthereum Challenge: ⚖️ Build a DEX

DEX Contract
{" "} ⚖️ {isLoading ? ( Loading... ) : ( 🎈 {parseFloat(formatEther(DEXBalloonBalance || 0n)).toFixed(4)} )}
ethToToken{" "} { setTokenToETHAmount(""); setEthToTokenAmount(value); }} name="ethToToken" />
tokenToETH{" "} { setEthToTokenAmount(""); setTokenToETHAmount(value.toString()); }} name="tokenToETH" disableMultiplyBy1e18 />

Liquidity ({DEXtotalLiquidity ? parseFloat(formatEther(DEXtotalLiquidity || 0n)).toFixed(4) : "None"})

Deposit setDepositAmount(value)} />
Withdraw setWithdrawAmount(value)} />
Balloons
Approve{" "} setApproveSpender(value)} placeholder="Address Spender" /> setApproveAmount(value.toString())} placeholder="Amount" disableMultiplyBy1e18 /> balanceOf{" "} setAccountBalanceOf(value)} placeholder="address Account" /> {balanceOfWrite === undefined ? (

) : ( BAL Balance: {parseFloat(formatEther(balanceOfWrite || 0n)).toFixed(4)} )}
); }; export default Dex;