diff --git a/packages/react-app/src/components/Exchange.js b/packages/react-app/src/components/Exchange.js index bc514e3..548218d 100644 --- a/packages/react-app/src/components/Exchange.js +++ b/packages/react-app/src/components/Exchange.js @@ -7,103 +7,161 @@ import { parseUnits } from "ethers/lib/utils"; import { getAvailableTokens, getCounterpartTokens, findPoolByTokens, isOperationPending, getFailureMessage, getSuccessMessage } from '../utils'; import { ROUTER_ADDRESS } from "../config"; -import AmountIn from "./"; -import AmountOut from "./"; -import Balance from "./"; +import AmountIn from "./AmountIn"; +import AmountOut from "./AmountOut"; +import Balance from "./Balance"; import styles from "../styles"; const Exchange = ({ pools }) => { - const { account } = useEthers(); - const [fromValue, setFromValue] = useState("0"); - const [fromToken, setFromToken] = useState(pools[0].token0Address); - const [toToken, setToToken] = useState(""); - const [resetState, setResetState] = useState(false) + const { account } = useEthers(); + const [fromValue, setFromValue] = useState("0"); + const [fromToken, setFromToken] = useState(pools[0].token0Address); // initialFromToken + const [toToken, setToToken] = useState(""); + const [resetState, setResetState] = useState(false) - const fromValueBigNumber = parseUnits(fromValue || "0"); - const availableTokens = getAvailableTokens(pools); //What tokens can we swap from? - const counterpartTokens = getCounterpartTokens(pools, fromToken); //What tokens can we swap to? - const pairAddress = findPoolByTokens(pools, fromToken, toToken)?.address ?? ""; //find a pair address ot that liquidity pair + const fromValueBigNumber = parseUnits(fromValue || "0"); // converse the string to bigNumber + const availableTokens = getAvailableTokens(pools); + const counterpartTokens = getCounterpartTokens(pools, fromToken); + const pairAddress = findPoolByTokens(pools, fromToken, toToken)?.address ?? ""; - //Get contract addresses - const routerContract = new Contract(ROUTER_ADDRESS, abis.router02); - const fromTokenContract = new Contract(fromToken, ERC20.abi); - const fromTokenBalance = useTokenBalance(fromToken, account); //Know balance of "from Token" - const toTokenBalance = useTokenBalance(toToken, account); //Know balance of "to Token" - const tokenAllowance = useTokenAllowance(fromToken, account, ROUTER_ADDRESS) || parseUnits("0"); - const approvedNeeded = fromValueBigNumber.gt(tokenAllowance); //We need to approve to make the swap - const formValueIsGreaterThan0 = fromValueBigNumber.gt(parseUnits("0")); //has to be greater than 0 - const hasEnoughBalance = fromValueBigNumber.lte(fromTokenBalance ?? parseUnits("0")); //lte = lower than or equal to + const routerContract = new Contract(ROUTER_ADDRESS, abis.router02); + const fromTokenContract = new Contract(fromToken, ERC20.abi); + const fromTokenBalance = useTokenBalance(fromToken, account); + const toTokenBalance = useTokenBalance(toToken, account); + const tokenAllowance = useTokenAllowance(fromToken, account, ROUTER_ADDRESS) || parseUnits("0"); + const approvedNeeded = fromValueBigNumber.gt(tokenAllowance); + const formValueIsGreaterThan0 = fromValueBigNumber.gt(parseUnits("0")); + const hasEnoughBalance = fromValueBigNumber.lte(fromTokenBalance ?? parseUnits("0")); - const isApproving = isOperationPending(swapApproveState); - const isSwapping = isOperationPending(swapExecuteState); + // approve initiating a contract call (similar to use state) -> gives the state and the sender... + const { state: swapApproveState, send: swapApproveSend } = + useContractFunction(fromTokenContract, "approve", { + transactionName: "onApproveRequested", + gasLimitBufferPercentage: 10, + }); + // swap initiating a contract call (similar to use state) -> gives the state and the sender... + const { state: swapExecuteState, send: swapExecuteSend } = + useContractFunction(routerContract, "swapExactTokensForTokens", { + transactionName: "swapExactTokensForTokens", + gasLimitBufferPercentage: 10, + }); - const successMessage = getSuccessMessage(swapApproveState, swapExecuteState); - const failureMessage = getFailureMessage(swapApproveState, swapExecuteState); + const isApproving = isOperationPending(swapApproveState); + const isSwapping = isOperationPending(swapExecuteState); + const canApprove = !isApproving && approvedNeeded; + const canSwap = !approvedNeeded && !isSwapping && formValueIsGreaterThan0 && hasEnoughBalance; - return ( -
{failureMessage}
- ) : successMessage ? ( -{successMessage}
- ) : ( - "" - )} -{failureMessage}
+ ) : successMessage ? ( +{successMessage}
+ ) : ( + "" + )} +{title}