import { useQuery } from "@tanstack/solid-query"; import type { Config, ResolvedRegister } from "@wagmi/core"; import { readContractQueryOptions, type ReadContractData, type ReadContractOptions, type ReadContractQueryFnData, type ReadContractQueryKey, } from "@wagmi/core/query"; import type { UnionCompute } from "@wagmi/core/internal"; import { type Accessor } from "solid-js"; import { type Abi, type ContractFunctionArgs, type ContractFunctionName, type ReadContractErrorType, } from "viem"; import type { ConfigParameter, QueryParameter, UseQueryReturnType, } from "../types/index.js"; import { useConfig } from "./useConfig.js"; export type UseReadContractReturnType< abi extends Abi | readonly unknown[] = Abi, functionName extends ContractFunctionName< abi, "pure" | "view" > = ContractFunctionName, args extends ContractFunctionArgs< abi, "pure" | "view", functionName > = ContractFunctionArgs, selectData = ReadContractData > = UseQueryReturnType; export type UseReadContractParameters< abi extends Abi | readonly unknown[] = Abi, functionName extends ContractFunctionName< abi, "pure" | "view" > = ContractFunctionName, args extends ContractFunctionArgs< abi, "pure" | "view", functionName > = ContractFunctionArgs, config extends Config = Config, selectData = ReadContractData > = UnionCompute< ReadContractOptions & ConfigParameter & QueryParameter< ReadContractQueryFnData, ReadContractErrorType, selectData, ReadContractQueryKey > >; export function useReadContract< const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, const args extends ContractFunctionArgs, config extends Config = ResolvedRegister["config"], selectData = ReadContractData >( params: Accessor< UseReadContractParameters > ): UseReadContractReturnType { const config = useConfig(params); return useQuery(() => { const { address, abi, functionName, query = {} } = params(); const { initialData, ...queryLeftovers } = query; // @ts-ignore const code = params().code as Hex | undefined; const options = readContractQueryOptions( config(), params() ); const enabled = Boolean( (address || code) && abi && functionName && (query?.enabled ?? true) ); return { ...options, ...queryLeftovers, // Initial Data type gets messed up when wrapped in function initiData: initialData instanceof Function ? initialData()! : initialData!, enabled, }; }); }