wagmi
Version:
React Hooks for Ethereum
102 lines (96 loc) • 3.37 kB
text/typescript
import type {
Config,
ResolvedRegister,
WatchContractEventParameters,
} from '@wagmi/core'
import type {
UnionCompute,
UnionExactPartial,
UnionStrictOmit,
} from '@wagmi/core/internal'
import type { Abi, Address, ContractEventName } from 'viem'
import type {
ConfigParameter,
EnabledParameter,
} from '../../types/properties.js'
import { useAccount } from '../useAccount.js'
import { useChainId } from '../useChainId.js'
import { useConfig } from '../useConfig.js'
import { useWatchContractEvent } from '../useWatchContractEvent.js'
export type CreateUseWatchContractEventParameters<
abi extends Abi | readonly unknown[],
address extends Address | Record<number, Address> | undefined = undefined,
eventName extends ContractEventName<abi> | undefined = undefined,
> = {
abi: abi | Abi | readonly unknown[]
address?: address | Address | Record<number, Address> | undefined
eventName?: eventName | ContractEventName<abi> | undefined
}
export type CreateUseWatchContractEventReturnType<
abi extends Abi | readonly unknown[],
address extends Address | Record<number, Address> | undefined,
eventName extends ContractEventName<abi> | undefined,
///
omittedProperties extends 'abi' | 'address' | 'chainId' | 'eventName' =
| 'abi'
| (address extends undefined ? never : 'address')
| (address extends Record<number, Address> ? 'chainId' : never)
| (eventName extends undefined ? never : 'eventName'),
> = <
name extends eventName extends ContractEventName<abi>
? eventName
: ContractEventName<abi>,
strict extends boolean | undefined = undefined,
config extends Config = ResolvedRegister['config'],
chainId extends
config['chains'][number]['id'] = config['chains'][number]['id'],
>(
parameters?: UnionCompute<
UnionExactPartial<
UnionStrictOmit<
WatchContractEventParameters<abi, name, strict, config, chainId>,
omittedProperties
>
> &
ConfigParameter<config> &
EnabledParameter
> &
(address extends Record<number, Address>
? { chainId?: keyof address | undefined }
: unknown),
) => void
export function createUseWatchContractEvent<
const abi extends Abi | readonly unknown[],
const address extends
| Address
| Record<number, Address>
| undefined = undefined,
eventName extends ContractEventName<abi> | undefined = undefined,
>(
props: CreateUseWatchContractEventParameters<abi, address, eventName>,
): CreateUseWatchContractEventReturnType<abi, address, eventName> {
if (props.address !== undefined && typeof props.address === 'object')
return (parameters) => {
const config = useConfig(parameters)
const configChainId = useChainId({ config })
const account = useAccount({ config })
const chainId =
(parameters as { chainId?: number })?.chainId ??
account.chainId ??
configChainId
return useWatchContractEvent({
...(parameters as any),
...(props.eventName ? { eventName: props.eventName } : {}),
address: props.address?.[chainId],
abi: props.abi,
})
}
return (parameters) => {
return useWatchContractEvent({
...(parameters as any),
...(props.address ? { address: props.address } : {}),
...(props.eventName ? { eventName: props.eventName } : {}),
abi: props.abi,
})
}
}