import { useWeb3Provider } from "../../useWeb3Provider/useWeb3Provider"; import { useContracts } from "../../useContracts/useContracts"; import { useTokenDetails } from "../../useTokenDetails/useTokenDetails"; import { usePool } from "../../pools/usePool/usePool"; import { useEffect } from "react"; import { parseUnits } from "ethers/lib/utils"; import { doTransaction } from "../../../utils/transactions/transactions"; import { DepositMode, useCommonDepositLogic, } from "../useCommonDepositLogic/useCommonDepositLogic"; import { usePollForNewPosition } from "../usePollForNewPosition/usePollForNewPosition"; /** * A hook to open a new position (createRelicAndDeposit) */ export const useOpenPosition = (poolId: number) => { const { allowance, amount, approve, decimalPlaces, depositAsset, isDepositHelperUsed, mode, setAmount, setIsDepositHelperUsed, setMode, underlyingAsset, userBalance, useNativeToken, setUseNativeToken, } = useCommonDepositLogic(poolId); const { account } = useWeb3Provider(); const { depositHelper, reliquary } = useContracts(); const pool = usePool(poolId); const { fetchTokenDetails } = useTokenDetails(); const poll = usePollForNewPosition(); const openPosition = async () => { try { if (allowance < parseFloat(amount)) { await approve(DepositMode.DEPOSITING); } else { setMode(DepositMode.DEPOSITING); } const depositAmount = parseUnits(amount, decimalPlaces); const receipt = await doTransaction(() => { if (useNativeToken) { return depositHelper.createRelicAndDeposit(poolId, depositAmount, { value: depositAmount, }); } else { return isDepositHelperUsed ? depositHelper.createRelicAndDeposit(poolId, depositAmount) : reliquary.createRelicAndDeposit(account!, poolId, depositAmount); } }); return { poll: poll(), receipt }; } catch (e: any) { setMode(DepositMode.IDLE); throw e; } }; useEffect(() => { fetchTokenDetails(pool.lpAddress); fetchTokenDetails(depositAsset); }, [pool.lpAddress]); return { allowance, amount, approve, depositAsset, isDepositHelperUsed, mode, openPosition, setAmount, setIsDepositHelperUsed, underlyingAsset, userBalance, useNativeToken, setUseNativeToken, }; };