import type { Abi, Address, ExtractAbiEvent, ExtractAbiEventNames, FormatAbi, } from 'abitype' import type { CreateEventFilterParameters } from 'viem' import type { MaybeExtractEventArgsFromAbi } from 'viem/dist/types/types/contract' export type ValueOf = T[keyof T] export type Events< TName extends string, TAddresses extends Record, TAbi extends Abi, > = (options?: { chainId?: TChainId | number | undefined }) => { [TEventName in ExtractAbiEventNames]: (< TStrict extends boolean = false, >( params: Pick< CreateEventFilterParameters< ExtractAbiEvent, TStrict, TAbi, TEventName, MaybeExtractEventArgsFromAbi >, 'fromBlock' | 'toBlock' | 'args' | 'strict' >, ) => CreateEventFilterParameters< ExtractAbiEvent, TStrict, TAbi, TEventName, MaybeExtractEventArgsFromAbi > & { evmtsContractName: TName eventName: TEventName abi: [ExtractAbiEvent] }) & { address: ValueOf eventName: TEventName abi: [ExtractAbiEvent] humanReadableAbi: FormatAbi<[ExtractAbiEvent]> } }