import { useCallback, useMemo } from "react" import { useAccount, useWatchContractEvent } from "wagmi" import { mainnetTokenContracts, MezoChainToken, testnetTokenContracts, } from "../lib/contracts" import { usePassportContext } from "./usePassportContext" import { CHAIN_ID } from "../constants" import { useRefreshPassport } from "./useRefreshPassport" import { simpleWssMezoConfig } from "../config" function useWatchTransferEvents(token: MezoChainToken) { const { address: userAddress } = useAccount() const { environment = "mainnet" } = usePassportContext() const { refreshTokensBalances, refreshBorrowData } = useRefreshPassport() const contract = useMemo(() => { const contracts = environment === "mainnet" ? mainnetTokenContracts : testnetTokenContracts return contracts[token] }, [environment, token]) // Memoize args to prevent useWatchContractEvent's useEffect from re-running // on every render, which causes a race condition creating multiple WebSocket // connections. const fromArgs = useMemo(() => ({ from: userAddress }), [userAddress]) const toArgs = useMemo(() => ({ to: userAddress }), [userAddress]) // Memoize callbacks for the same reason - unstable references cause the // effect to re-run. const onLogsFrom = useCallback(() => { console.log(`[${token}] Transfer from: ${userAddress}`) refreshTokensBalances() refreshBorrowData() }, [token, userAddress, refreshTokensBalances, refreshBorrowData]) const onLogsTo = useCallback(() => { console.log(`[${token}] Transfer to: ${userAddress}`) refreshTokensBalances() refreshBorrowData() }, [token, userAddress, refreshTokensBalances, refreshBorrowData]) useWatchContractEvent({ address: contract.address, abi: contract.abi, eventName: "Transfer", args: fromArgs, chainId: CHAIN_ID[environment], enabled: !!userAddress, config: simpleWssMezoConfig, onLogs: onLogsFrom, }) useWatchContractEvent({ address: contract.address, abi: contract.abi, eventName: "Transfer", args: toArgs, chainId: CHAIN_ID[environment], enabled: !!userAddress, config: simpleWssMezoConfig, onLogs: onLogsTo, }) } function useWatchTransferEventsForAllTokens() { useWatchTransferEvents("mcbBTC") useWatchTransferEvents("mDAI") useWatchTransferEvents("mFBTC") useWatchTransferEvents("mSolvBTC") useWatchTransferEvents("mswBTC") useWatchTransferEvents("mT") useWatchTransferEvents("mUSDC") useWatchTransferEvents("mUSDe") useWatchTransferEvents("mUSDT") useWatchTransferEvents("mxSolvBTC") useWatchTransferEvents("MUSD") useWatchTransferEvents("MEZO") } export { useWatchTransferEvents, useWatchTransferEventsForAllTokens }