import type { Config, ReadContractErrorType, ReadContractParameters, ResolvedRegister, } from '@wagmi/core' import type { ConfigParameter, QueryParameter, ScopeKeyParameter, UnionCompute, } from '@wagmi/core/internal' import type { ReadContractData, ReadContractQueryFnData, ReadContractQueryKey, } from '@wagmi/core/query' import type { Abi, Address, ContractFunctionArgs, ContractFunctionName, } from 'viem' import { useChainId } from '../useChainId.js' import { useConfig } from '../useConfig.js' import { type UseReadContractReturnType, useReadContract, } from '../useReadContract.js' type stateMutability = 'pure' | 'view' export type CreateUseReadContractParameters< abi extends Abi | readonly unknown[], address extends Address | Record | undefined = undefined, functionName extends | ContractFunctionName | undefined = undefined, > = { abi: abi | Abi | readonly unknown[] address?: address | Address | Record | undefined functionName?: | functionName | ContractFunctionName | undefined } /** Call-level options from ReadContractParameters (excludes abi, address, functionName, args). */ type ReadContractCallOptions = Omit< ReadContractParameters, 'abi' | 'address' | 'functionName' | 'args' > export type CreateUseReadContractReturnType< abi extends Abi | readonly unknown[], address extends Address | Record | undefined, functionName extends ContractFunctionName | undefined, > = < name extends functionName extends ContractFunctionName ? functionName : ContractFunctionName, const args extends ContractFunctionArgs, config extends Config = ResolvedRegister['config'], selectData = ReadContractData, >( parameters?: UnionCompute< { abi?: undefined address?: address extends undefined ? Address : undefined functionName?: functionName extends undefined ? name : undefined args?: args | undefined } & Partial> & ScopeKeyParameter & ConfigParameter & QueryParameter< ReadContractQueryFnData, ReadContractErrorType, selectData, ReadContractQueryKey > > & (address extends Record ? { chainId?: keyof address | undefined } : unknown), ) => UseReadContractReturnType export function createUseReadContract< const abi extends Abi | readonly unknown[], const address extends | Address | Record | undefined = undefined, functionName extends | ContractFunctionName | undefined = undefined, >( props: CreateUseReadContractParameters, ): CreateUseReadContractReturnType { if (props.address !== undefined && typeof props.address === 'object') return (parameters) => { const config = useConfig(parameters) const configChainId = useChainId({ config }) const chainId = (parameters as { chainId?: number })?.chainId ?? configChainId return useReadContract({ ...(parameters as any), ...(props.functionName ? { functionName: props.functionName } : {}), address: props.address?.[chainId], abi: props.abi, }) } return (parameters) => { return useReadContract({ ...(parameters as any), ...(props.address ? { address: props.address } : {}), ...(props.functionName ? { functionName: props.functionName } : {}), abi: props.abi, }) } }