import type { Abi, Address, ContractEventName } from 'viem' import type { Config } from '../../createConfig.js' import type { UnionCompute, UnionStrictOmit } from '../../types/utils.js' import { getChainId } from '../getChainId.js' import { type WatchContractEventParameters, type WatchContractEventReturnType, watchContractEvent, } from '../watchContractEvent.js' export type CreateWatchContractEventParameters< abi extends Abi | readonly unknown[], address extends Address | Record | undefined = undefined, eventName extends ContractEventName | undefined = undefined, > = { abi: abi | Abi | readonly unknown[] address?: address | Address | Record | undefined eventName?: eventName | ContractEventName | undefined } export type CreateWatchContractEventReturnType< abi extends Abi | readonly unknown[], address extends Address | Record | undefined, eventName extends ContractEventName | undefined, /// omittedProperties extends 'abi' | 'address' | 'chainId' | 'eventName' = | 'abi' | (address extends undefined ? never : 'address') | (address extends Record ? 'chainId' : never) | (eventName extends undefined ? never : 'eventName'), > = < config extends Config, name extends eventName extends ContractEventName ? eventName : ContractEventName, strict extends boolean | undefined = undefined, chainId extends config['chains'][number]['id'] = config['chains'][number]['id'], >( config: config, parameters: UnionCompute< UnionStrictOmit< WatchContractEventParameters, omittedProperties > > & (address extends Record ? { chainId?: keyof address | undefined } : unknown), ) => WatchContractEventReturnType export function createWatchContractEvent< const abi extends Abi | readonly unknown[], const address extends | Address | Record | undefined = undefined, eventName extends ContractEventName | undefined = undefined, >( c: CreateWatchContractEventParameters, ): CreateWatchContractEventReturnType { if (c.address !== undefined && typeof c.address === 'object') return (config, parameters) => { const configChainId = getChainId(config) const chainId = (parameters as { chainId?: number })?.chainId ?? configChainId return watchContractEvent(config, { ...(parameters as any), ...(c.eventName ? { eventName: c.eventName } : {}), address: c.address?.[chainId], abi: c.abi, }) } return (config, parameters) => { return watchContractEvent(config, { ...(parameters as any), ...(c.address ? { address: c.address } : {}), ...(c.eventName ? { eventName: c.eventName } : {}), abi: c.abi, }) } }