import type { PrepareTransactionRequestRequest as viem_PrepareTransactionRequestRequest } from 'viem' import { type PrepareTransactionRequestErrorType, type PrepareTransactionRequestParameters, type PrepareTransactionRequestReturnType, prepareTransactionRequest, } from '../actions/prepareTransactionRequest.js' import type { Config } from '../createConfig.js' import type { SelectChains } from '../types/chain.js' import type { ScopeKeyParameter } from '../types/properties.js' import type { QueryOptions, QueryParameter } from '../types/query.js' import type { UnionExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type PrepareTransactionRequestOptions< config extends Config, chainId extends config['chains'][number]['id'] | undefined, request extends viem_PrepareTransactionRequestRequest< SelectChains[0], SelectChains[0] >, selectData = PrepareTransactionRequestData, > = UnionExactPartial< PrepareTransactionRequestParameters > & ScopeKeyParameter & QueryParameter< PrepareTransactionRequestQueryFnData, PrepareTransactionRequestErrorType, selectData, PrepareTransactionRequestQueryKey > export function prepareTransactionRequestQueryOptions< config extends Config, chainId extends config['chains'][number]['id'] | undefined, request extends viem_PrepareTransactionRequestRequest< SelectChains[0], SelectChains[0] >, selectData = PrepareTransactionRequestData, >( config: config, options: PrepareTransactionRequestOptions< config, chainId, request, selectData > = {} as any, ): PrepareTransactionRequestQueryOptions { const hasCalls = Array.isArray(options.calls) && options.calls.length > 0 return { ...options.query, enabled: Boolean( (options.to || hasCalls) && (options.query?.enabled ?? true), ), queryFn: async (context) => { const [, { scopeKey: _, ...parameters }] = context.queryKey const hasCalls = Array.isArray(parameters.calls) && parameters.calls.length > 0 if (!parameters.to && !hasCalls) throw new Error('to or calls is required') return prepareTransactionRequest(config, { ...(parameters as any), }) as unknown as Promise< PrepareTransactionRequestQueryFnData > }, queryKey: prepareTransactionRequestQueryKey( options, ) as PrepareTransactionRequestQueryKey, } } export type PrepareTransactionRequestQueryFnData< config extends Config, chainId extends config['chains'][number]['id'] | undefined, request extends viem_PrepareTransactionRequestRequest< SelectChains[0], SelectChains[0] >, > = PrepareTransactionRequestReturnType export type PrepareTransactionRequestData< config extends Config, chainId extends config['chains'][number]['id'] | undefined, request extends viem_PrepareTransactionRequestRequest< SelectChains[0], SelectChains[0] >, > = PrepareTransactionRequestQueryFnData export function prepareTransactionRequestQueryKey< config extends Config, chainId extends config['chains'][number]['id'] | undefined, request extends viem_PrepareTransactionRequestRequest< SelectChains[0], SelectChains[0] >, >( options: UnionExactPartial< PrepareTransactionRequestParameters > & ScopeKeyParameter = {} as any, ) { return ['prepareTransactionRequest', filterQueryOptions(options)] as const } export type PrepareTransactionRequestQueryKey< config extends Config, chainId extends config['chains'][number]['id'] | undefined, request extends viem_PrepareTransactionRequestRequest< SelectChains[0], SelectChains[0] >, > = ReturnType< typeof prepareTransactionRequestQueryKey > export type PrepareTransactionRequestQueryOptions< config extends Config, chainId extends config['chains'][number]['id'] | undefined, request extends viem_PrepareTransactionRequestRequest< SelectChains[0], SelectChains[0] >, selectData = PrepareTransactionRequestData, > = QueryOptions< PrepareTransactionRequestQueryFnData, PrepareTransactionRequestErrorType, selectData, PrepareTransactionRequestQueryKey >