import type { ContractFunctionParameters } from 'viem' import { type ReadContractsErrorType, type ReadContractsParameters, type ReadContractsReturnType, readContracts, } from '../actions/readContracts.js' import type { Config } from '../createConfig.js' import type { ChainIdParameter, ScopeKeyParameter, } from '../types/properties.js' import type { StrictOmit } from '../types/utils.js' import type { InfiniteQueryOptions } from './types.js' import { filterQueryOptions } from './utils.js' export type InfiniteReadContractsOptions< contracts extends readonly unknown[], allowFailure extends boolean, pageParam, config extends Config, > = { cacheKey: string contracts( pageParam: pageParam, ): ReadContractsParameters['contracts'] } & StrictOmit< ReadContractsParameters, 'contracts' > & ScopeKeyParameter export function infiniteReadContractsQueryOptions< config extends Config, const contracts extends readonly ContractFunctionParameters[], allowFailure extends boolean = true, pageParam = unknown, >( config: config, options: InfiniteReadContractsOptions< contracts, allowFailure, pageParam, config > & ChainIdParameter & RequiredPageParamsParameters, ) { return { ...options.query, async queryFn({ pageParam, queryKey }) { const { contracts } = options const { cacheKey: _, scopeKey: _s, ...parameters } = queryKey[1] return (await readContracts(config, { ...parameters, contracts: contracts(pageParam as any), })) as ReadContractsReturnType }, queryKey: infiniteReadContractsQueryKey(options), } as const satisfies InfiniteQueryOptions< InfiniteReadContractsQueryFnData, ReadContractsErrorType, InfiniteReadContractsData, InfiniteReadContractsData, InfiniteReadContractsQueryKey, pageParam > } type RequiredPageParamsParameters< contracts extends readonly unknown[], allowFailure extends boolean, pageParam, > = { query: { initialPageParam: pageParam getNextPageParam( lastPage: InfiniteReadContractsQueryFnData, allPages: InfiniteReadContractsQueryFnData[], lastPageParam: pageParam, allPageParams: pageParam[], ): pageParam | undefined | null } } export type InfiniteReadContractsQueryFnData< contracts extends readonly unknown[], allowFailure extends boolean, > = ReadContractsReturnType export type InfiniteReadContractsData< contracts extends readonly unknown[], allowFailure extends boolean, > = InfiniteReadContractsQueryFnData export function infiniteReadContractsQueryKey< config extends Config, const contracts extends readonly unknown[], allowFailure extends boolean, pageParam, >( options: InfiniteReadContractsOptions< contracts, allowFailure, pageParam, config > & ChainIdParameter & RequiredPageParamsParameters, ) { const { contracts: _, ...parameters } = options return ['infiniteReadContracts', filterQueryOptions(parameters)] as const } export type InfiniteReadContractsQueryKey< contracts extends readonly unknown[], allowFailure extends boolean, pageParam, config extends Config, > = ReturnType< typeof infiniteReadContractsQueryKey< config, contracts, allowFailure, pageParam > >