import { type GetTransactionErrorType, type GetTransactionParameters, type GetTransactionReturnType, getTransaction, } from '../actions/getTransaction.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetTransactionOptions< config extends Config, chainId extends config['chains'][number]['id'], selectData = GetTransactionData, > = Compute< ExactPartial> & ScopeKeyParameter > & QueryParameter< GetTransactionQueryFnData, GetTransactionErrorType, selectData, GetTransactionQueryKey > export function getTransactionQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], selectData = GetTransactionData, >( config: config, options: GetTransactionOptions = {}, ): GetTransactionQueryOptions { return { ...options.query, enabled: Boolean( (options.hash || (options.index && (options.blockHash || options.blockNumber || options.blockTag))) && (options.query?.enabled ?? true), ), queryFn: async (context) => { const [, { scopeKey: _, ...parameters }] = context.queryKey if ( !( parameters.hash || (parameters.index && (parameters.blockHash || parameters.blockNumber || parameters.blockTag)) ) ) throw new Error( 'hash OR index AND blockHash, blockNumber, blockTag is required', ) return getTransaction( config, parameters as GetTransactionParameters, ) as unknown as Promise> }, queryKey: getTransactionQueryKey(options), } } export type GetTransactionQueryFnData< config extends Config, chainId extends config['chains'][number]['id'], > = GetTransactionReturnType export type GetTransactionData< config extends Config, chainId extends config['chains'][number]['id'], > = GetTransactionQueryFnData export function getTransactionQueryKey< config extends Config, chainId extends config['chains'][number]['id'], >( options: Compute< ExactPartial> & ScopeKeyParameter > = {}, ) { return ['transaction', filterQueryOptions(options)] as const } export type GetTransactionQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> export type GetTransactionQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], selectData = GetTransactionData, > = QueryOptions< GetTransactionQueryFnData, GetTransactionErrorType, selectData, GetTransactionQueryKey >