import { Abi, AbiEvent, ExtractAbiEvent, ExtractAbiEventNames, Narrow } from 'abitype'; import { AbiEventParametersToPrimitiveTypes, Event } from '../../types/contracts'; import { IsNever, NotEqual, Or } from '../../types/utils'; declare type ContractEventConfig = { /** Contract address */ address: string; /** Contract ABI */ abi: Narrow; /** Chain id to use for provider */ chainId?: number; /** Event to listen for */ eventName: IsNever extends true ? string : TEventName; /** Receive only a single event */ once?: boolean; }; declare type GetConfig = T extends { abi: infer TAbi extends Abi; } ? ContractEventConfig> : T extends { abi: infer TAbi extends readonly unknown[]; eventName: infer TEventName extends string; } ? ContractEventConfig : ContractEventConfig; export declare type WatchContractEventConfig = GetConfig<{ abi: TAbi; eventName: TEventName; }>; export declare type WatchContractEventCallback : never> = AbiEventParametersToPrimitiveTypes extends infer TArgs extends readonly unknown[] ? Or, NotEqual> extends true ? (...args: any) => void : (...args: [...args: TArgs, event: Event]) => void : never; export declare function watchContractEvent({ address, abi, chainId, eventName, once, }: WatchContractEventConfig, callback: WatchContractEventCallback): () => void; export {};