mirror of
https://github.com/luxfhe/example-poker.git
synced 2026-10-30 18:13:22 +00:00
39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import { useTargetNetwork } from "./useTargetNetwork";
|
|
import { Abi, ExtractAbiEventNames } from "abitype";
|
|
import { Log } from "viem";
|
|
import { useContractEvent } from "wagmi";
|
|
import { addIndexedArgsToEvent, useDeployedContractInfo } from "~~/hooks/scaffold-eth";
|
|
import { ContractAbi, ContractName, UseScaffoldEventConfig } from "~~/utils/scaffold-eth/contract";
|
|
|
|
/**
|
|
* Wrapper around wagmi's useEventSubscriber hook which automatically loads (by name) the contract ABI and
|
|
* address from the contracts present in deployedContracts.ts & externalContracts.ts
|
|
* @param config - The config settings
|
|
* @param config.contractName - deployed contract name
|
|
* @param config.eventName - name of the event to listen for
|
|
* @param config.listener - the callback that receives events. If only interested in 1 event, call `unwatch` inside of the listener
|
|
*/
|
|
export const useScaffoldEventSubscriber = <
|
|
TContractName extends ContractName,
|
|
TEventName extends ExtractAbiEventNames<ContractAbi<TContractName>>,
|
|
>({
|
|
contractName,
|
|
eventName,
|
|
listener,
|
|
}: UseScaffoldEventConfig<TContractName, TEventName>) => {
|
|
const { data: deployedContractData } = useDeployedContractInfo(contractName);
|
|
const { targetNetwork } = useTargetNetwork();
|
|
|
|
const addIndexedArgsToLogs = (logs: Log[]) => logs.map(addIndexedArgsToEvent);
|
|
const listenerWithIndexedArgs = (logs: Log[]) =>
|
|
listener(addIndexedArgsToLogs(logs) as Parameters<typeof listener>[0]);
|
|
|
|
return useContractEvent({
|
|
address: deployedContractData?.address,
|
|
abi: deployedContractData?.abi as Abi,
|
|
chainId: targetNetwork.id,
|
|
listener: listenerWithIndexedArgs,
|
|
eventName,
|
|
});
|
|
};
|