import type { Abi, AbiFunction, AbiParametersToPrimitiveTypes, AbiStateMutability, Address, ExtractAbiFunction, ExtractAbiFunctionNames, ResolvedRegister } from "abitype"; import type { Hex } from "./misc"; import type { IsUnion, UnionToTuple } from "./utils"; export type ContractFunctionName = ExtractAbiFunctionNames extends infer functionName extends string ? [functionName] extends [never] ? string : functionName : string; export type ContractFunctionArgs = ContractFunctionName> = AbiParametersToPrimitiveTypes["inputs"], "inputs"> extends infer args ? [args] extends [never] ? readonly unknown[] : args : readonly unknown[]; export type Widen = ([unknown] extends [type] ? unknown : never) | (type extends Function ? type : never) | (type extends ResolvedRegister["BigIntType"] ? bigint : never) | (type extends boolean ? boolean : never) | (type extends ResolvedRegister["IntType"] ? number : never) | (type extends string ? type extends ResolvedRegister["AddressType"] ? ResolvedRegister["AddressType"] : type extends ResolvedRegister["BytesType"]["inputs"] ? ResolvedRegister["BytesType"] : string : never) | (type extends readonly [] ? readonly [] : never) | (type extends Record ? { [K in keyof type]: Widen; } : never) | (type extends { length: number; } ? { [K in keyof type]: Widen; } extends infer Val extends readonly unknown[] ? readonly [...Val] : never : never); export type UnionWiden = type extends any ? Widen : never; export type ExtractAbiFunctionForArgs, args extends ContractFunctionArgs> = ExtractAbiFunction extends infer abiFunction extends AbiFunction ? IsUnion extends true ? UnionToTuple extends infer abiFunctions extends readonly AbiFunction[] ? { [k in keyof abiFunctions]: CheckArgs; }[number] : never : abiFunction : never; type CheckArgs = AbiParametersToPrimitiveTypes> = (readonly [] extends args ? readonly [] : args) extends targetArgs ? abiFunction : never; export type ContractFunctionParameters = ContractFunctionName, args extends ContractFunctionArgs = ContractFunctionArgs, deployless extends boolean = false, allFunctionNames = ContractFunctionName, allArgs = ContractFunctionArgs> = { abi: abi; functionName: allFunctionNames | (functionName extends allFunctionNames ? functionName : never); args?: (abi extends Abi ? UnionWiden : never) | allArgs | undefined; } & (readonly [] extends allArgs ? {} : { args: Widen; }) & (deployless extends true ? { address?: undefined; code: Hex; } : { address: Address; }); export {};