/** * A hook that polls for the user's balance to increase, fetching the new position when * it does. This is an unfortunate alternative to listening for the Transfer event to confirm the * position is opened as we seem to occasionally miss this event - see issues raised in Ethers.js */ import { useUserPositions } from "../useUserPositions/useUserPositions"; import { useContracts } from "../../useContracts/useContracts"; import { useWeb3Provider } from "../../useWeb3Provider/useWeb3Provider"; import { bigNumAsInt, wait } from "../../../utils"; import { UserPosition } from "../../../state"; export const usePollForNewPosition = () => { const { fetchUserPosition, userPositionsArray } = useUserPositions(); const { reliquary } = useContracts(); const { account } = useWeb3Provider(); const poll = async (): Promise => { const numberOfPositions = bigNumAsInt(await reliquary.balanceOf(account!)); if (numberOfPositions > userPositionsArray.length) { const newTokenId = await reliquary.tokenOfOwnerByIndex( account!, numberOfPositions - 1 ); const newPosition = await fetchUserPosition(bigNumAsInt(newTokenId)); if (!newPosition) { console.warn("Position not found, retrying..."); await wait(3000); return poll(); } return newPosition; } await wait(3000); return poll(); }; return poll; };