import type { MutateOptions, MutationOptions } from '@tanstack/query-core' import type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem' import { type WriteContractErrorType, type WriteContractParameters, type WriteContractReturnType, writeContract, } from '../actions/writeContract.js' import type { Config } from '../createConfig.js' import type { MutationParameter } from '../types/query.js' import type { Compute } from '../types/utils.js' export type WriteContractOptions< config extends Config, context = unknown, > = MutationParameter< WriteContractData, WriteContractErrorType, WriteContractVariables< Abi, string, readonly unknown[], config, config['chains'][number]['id'] >, context > export function writeContractMutationOptions( config: config, options: WriteContractOptions = {}, ): WriteContractMutationOptions { return { ...(options.mutation as any), mutationFn(variables) { return writeContract(config, variables) }, mutationKey: ['writeContract'], } } export type WriteContractMutationOptions = MutationOptions< WriteContractData, WriteContractErrorType, WriteContractVariables< Abi, string, readonly unknown[], config, config['chains'][number]['id'] > > export type WriteContractData = Compute export type WriteContractVariables< abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, args extends ContractFunctionArgs< abi, 'nonpayable' | 'payable', functionName >, config extends Config, chainId extends config['chains'][number]['id'], /// allFunctionNames = ContractFunctionName, > = WriteContractParameters< abi, functionName, args, config, chainId, allFunctionNames > export type WriteContractMutate = < const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, args extends ContractFunctionArgs< abi, 'nonpayable' | 'payable', functionName >, chainId extends config['chains'][number]['id'], >( variables: WriteContractVariables, options?: | MutateOptions< WriteContractData, WriteContractErrorType, WriteContractVariables< abi, functionName, args, config, chainId, // use `functionName` to make sure it's not union of all possible function names functionName >, context > | undefined, ) => void export type WriteContractMutateAsync< config extends Config, context = unknown, > = < const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, args extends ContractFunctionArgs< abi, 'nonpayable' | 'payable', functionName >, chainId extends config['chains'][number]['id'], >( variables: WriteContractVariables, options?: | MutateOptions< WriteContractData, WriteContractErrorType, WriteContractVariables< abi, functionName, args, config, chainId, // use `functionName` to make sure it's not union of all possible function names functionName >, context > | undefined, ) => Promise