import { useMemo, useState } from "react"; import { useContracts } from "../../useContracts/useContracts"; import { useTokenDetails } from "../../useTokenDetails/useTokenDetails"; import { usePool } from "../../pools"; import { config } from "../../../config"; import { useErc20 } from "../../useERC20/useERC20"; import { ethers } from "ethers"; import { doTransaction } from "../../../utils/transactions/transactions"; import { useDepositHelper } from "../useDepositHelper/useDepositHelper"; export enum DepositMode { IDLE, APPROVING, DEPOSITING, } /** * The logic common between openPosition and deposit */ export const useCommonDepositLogic = (poolId: number) => { const [mode, setMode] = useState(DepositMode.IDLE); const [amount, setAmount] = useState(""); const { depositHelper, reliquary } = useContracts(); const { tokenDetails, fetchTokenDetails } = useTokenDetails(); const { isDepositHelperUsed, setIsDepositHelperUsed } = useDepositHelper(); const [useNativeToken, setUseNativeToken] = useState(false); const pool = usePool(poolId); const depositAsset = useMemo(() => { if (useNativeToken) { return "0x"; } else { return isDepositHelperUsed ? config!.poolConfig[pool.poolId]!.underlyingFarmAsset[0].contractAddress : pool.lpAddress; } }, [pool, isDepositHelperUsed, useNativeToken]); const { approveContractForAmount } = useErc20(depositAsset); const { allowance = 0, depositHelperAllowance = 0, userBalance = "0", decimalPlaces = 18, } = tokenDetails[depositAsset] || {}; const approve = async (modeAfter = DepositMode.IDLE) => { try { setMode(DepositMode.APPROVING); const approveAmount = ethers.constants.MaxUint256; const tx = await doTransaction(() => approveContractForAmount( isDepositHelperUsed ? depositHelper.address : reliquary.address, approveAmount ) ); setMode(modeAfter); fetchTokenDetails(depositAsset); return tx; } catch (e) { setMode(DepositMode.IDLE); throw e; } }; return { allowance: isDepositHelperUsed ? depositHelperAllowance : allowance, amount, approve, decimalPlaces, depositAsset, isDepositHelperUsed, mode, setAmount, setIsDepositHelperUsed, setMode, underlyingAsset: config!.poolConfig[pool.poolId]!.underlyingFarmAsset, userBalance, useNativeToken, setUseNativeToken, }; };