import type { Abi, AbiParameter, AbiParameterKind, AbiStateMutability, AbiType, MBits, SolidityArray, SolidityBytes, SolidityFixedArrayRange, SolidityFixedArraySizeLookup, SolidityInt, SolidityTuple, TypedData, TypedDataParameter, TypedDataType } from './abi.js'; import type { AbiParameterTupleNameLookup } from './generated.js'; import type { ResolvedRegister } from './register.js'; import type { Error, Merge, Pretty, Tuple } from './types.js'; /** * Converts {@link AbiType} to corresponding TypeScript primitive type. * * Does not include full array or tuple conversion. Use {@link AbiParameterToPrimitiveType} to fully convert arrays and tuples. * * @param abiType - {@link AbiType} to convert to TypeScript representation * @param abiParameterKind - Optional {@link AbiParameterKind} to narrow by parameter type * @returns TypeScript primitive type */ export type AbiTypeToPrimitiveType = abiType extends SolidityBytes ? PrimitiveTypeLookup[abiType][abiParameterKind] : PrimitiveTypeLookup[abiType]; interface PrimitiveTypeLookup extends SolidityIntMap, SolidityByteMap, SolidityArrayMap { address: ResolvedRegister['addressType']; bool: boolean; function: `${ResolvedRegister['addressType']}${string}`; string: string; tuple: Record; } type SolidityIntMap = { [_ in SolidityInt]: _ extends `${'u' | ''}int${infer bits extends keyof BitsTypeLookup}` ? BitsTypeLookup[bits] : never; }; type SolidityByteMap = { [_ in SolidityBytes]: ResolvedRegister['bytesType']; }; type SolidityArrayMap = { [_ in SolidityArray]: readonly unknown[]; }; type GreaterThan48Bits = Exclude; type LessThanOrEqualTo48Bits = Exclude; type NoBits = ''; type BitsTypeLookup = { [key in MBits]: ResolvedRegister[key extends LessThanOrEqualTo48Bits ? 'intType' : 'bigIntType']; }; /** * Converts {@link AbiParameter} to corresponding TypeScript primitive type. * * @param abiParameter - {@link AbiParameter} to convert to TypeScript representation * @param abiParameterKind - Optional {@link AbiParameterKind} to narrow by parameter type * @returns TypeScript primitive type */ export type AbiParameterToPrimitiveType = abiParameter['type'] extends AbiBasicType ? AbiTypeToPrimitiveType : abiParameter extends { type: SolidityTuple; components: infer components extends readonly AbiParameter[]; } ? AbiComponentsToPrimitiveType : MaybeExtractArrayParameterType extends [ infer head extends string, infer size ] ? AbiArrayToPrimitiveType : ResolvedRegister['strictAbiType'] extends true ? Error<`Unknown type '${abiParameter['type'] & string}'.`> : abiParameter extends { components: Error; } ? abiParameter['components'] : unknown; type AbiBasicType = Exclude; type AbiComponentsToPrimitiveType = components extends readonly [] ? [] : components[number]['name'] extends Exclude ? { [component in components[number] as component['name'] & {}]: AbiParameterToPrimitiveType; } : { [key in keyof components]: AbiParameterToPrimitiveType; }; type MaybeExtractArrayParameterType = /** * First, infer `Head` against a known size type (either fixed-length array value or `""`). * * | Input | Head | * | --------------- | ------------ | * | `string[]` | `string` | * | `string[][][3]` | `string[][]` | */ type extends `${infer head}[${'' | `${SolidityFixedArrayRange}`}]` ? type extends `${head}[${infer size}]` ? [head, size] : undefined : undefined; type AbiArrayToPrimitiveType = size extends keyof SolidityFixedArraySizeLookup ? Tuple, abiParameterKind>, SolidityFixedArraySizeLookup[size]> : readonly AbiParameterToPrimitiveType, abiParameterKind>[]; /** * Converts array of {@link AbiParameter} to corresponding TypeScript primitive types. * * @param abiParameters - Array of {@link AbiParameter} to convert to TypeScript representations * @param abiParameterKind - Optional {@link AbiParameterKind} to narrow by parameter type * @returns Array of TypeScript primitive types */ export type AbiParametersToPrimitiveTypes = experimental_namedTuples extends true ? AbiParametersToPrimitiveTypes_named : AbiParametersToPrimitiveTypes_mapped; export type AbiParametersToPrimitiveTypes_mapped = Pretty<{ [key in keyof abiParameters]: AbiParameterToPrimitiveType; }>; export type AbiParametersToPrimitiveTypes_named = depth['length'] extends 15 ? readonly unknown[] : abiParameters extends readonly [ infer head1 extends AbiParameter, infer head2 extends AbiParameter, infer head3 extends AbiParameter, infer head4 extends AbiParameter, infer head5 extends AbiParameter, infer head6 extends AbiParameter, ...infer tail extends readonly AbiParameter[] ] ? AbiParametersToPrimitiveTypes_named, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple ], [ ...depth, 1 ]> : abiParameters extends readonly [ infer head1 extends AbiParameter, infer head2 extends AbiParameter, infer head3 extends AbiParameter, infer head4 extends AbiParameter, infer head5 extends AbiParameter ] ? readonly [ ...acc, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple ] : abiParameters extends readonly [ infer head1 extends AbiParameter, infer head2 extends AbiParameter, infer head3 extends AbiParameter, infer head4 extends AbiParameter ] ? readonly [ ...acc, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple ] : abiParameters extends readonly [ infer head1 extends AbiParameter, infer head2 extends AbiParameter, infer head3 extends AbiParameter ] ? readonly [ ...acc, ...ToNamedTuple, ...ToNamedTuple, ...ToNamedTuple ] : abiParameters extends readonly [ infer head1 extends AbiParameter, infer head2 extends AbiParameter ] ? readonly [ ...acc, ...ToNamedTuple, ...ToNamedTuple ] : abiParameters extends readonly [infer head extends AbiParameter] ? readonly [...acc, ...ToNamedTuple] : acc extends readonly [] ? abiParameters extends readonly [] ? readonly [] : readonly unknown[] : acc; type ToNamedTuple = unwrapName, abiParameter['name']>; type unwrapName = name extends string ? AbiParameterTupleNameLookup[name] : [type]; /** * Checks if type is {@link Abi}. * * @param abi - {@link Abi} to check * @returns Boolean for whether {@link abi} is {@link Abi} */ export type IsAbi = abi extends Abi ? true : false; /** * Extracts all {@link AbiFunction} types from {@link Abi}. * * @param abi - {@link Abi} to extract functions from * @param abiStateMutability - {@link AbiStateMutability} to filter by * @returns All {@link AbiFunction} types from {@link Abi} */ export type ExtractAbiFunctions = Extract; /** * Extracts all {@link AbiFunction} names from {@link Abi}. * * @param abi - {@link Abi} to extract function names from * @param abiStateMutability - {@link AbiStateMutability} to filter by * @returns Union of function names */ export type ExtractAbiFunctionNames = ExtractAbiFunctions['name']; /** * Extracts {@link AbiFunction} with name from {@link Abi}. * * @param abi - {@link Abi} to extract {@link AbiFunction} from * @param functionName - String name of function to extract from {@link Abi} * @param abiStateMutability - {@link AbiStateMutability} to filter by * @returns Matching {@link AbiFunction} */ export type ExtractAbiFunction, abiStateMutability extends AbiStateMutability = AbiStateMutability> = Extract, { name: functionName; }>; /** * Extracts all {@link AbiEvent} types from {@link Abi}. * * @param abi - {@link Abi} to extract events from * @returns All {@link AbiEvent} types from {@link Abi} */ export type ExtractAbiEvents = Extract; /** * Extracts all {@link AbiEvent} names from {@link Abi}. * * @param abi - {@link Abi} to extract event names from * @returns Union of event names */ export type ExtractAbiEventNames = ExtractAbiEvents['name']; /** * Extracts {@link AbiEvent} with name from {@link Abi}. * * @param abi - {@link Abi} to extract {@link AbiEvent} from * @param eventName - String name of event to extract from {@link Abi} * @returns Matching {@link AbiEvent} */ export type ExtractAbiEvent> = Extract, { name: eventName; }>; /** * Extracts all {@link AbiError} types from {@link Abi}. * * @param abi - {@link Abi} to extract errors from * @returns All {@link AbiError} types from {@link Abi} */ export type ExtractAbiErrors = Extract; /** * Extracts all {@link AbiError} names from {@link Abi}. * * @param abi - {@link Abi} to extract error names from * @returns Union of error names */ export type ExtractAbiErrorNames = ExtractAbiErrors['name']; /** * Extracts {@link AbiError} with name from {@link Abi}. * * @param abi - {@link Abi} to extract {@link AbiError} from * @param errorName - String name of error to extract from {@link Abi} * @returns Matching {@link AbiError} */ export type ExtractAbiError> = Extract, { name: errorName; }>; /** * Checks if type is {@link TypedData}. * * @param typedData - {@link TypedData} to check * @returns Boolean for whether {@link typedData} is {@link TypedData} */ export type IsTypedData = typedData extends TypedData ? { [key in keyof typedData]: { [key2 in typedData[key][number] as key2['type'] extends keyof typedData ? never : key2['type'] extends `${keyof typedData & string}[${string}]` ? never : key2['type'] extends TypedDataType ? never : key2['name']]: false; }; } extends { [key in keyof typedData]: Record; } ? true : false : false; /** * Converts {@link typedData} to corresponding TypeScript primitive types. * * @param typedData - {@link TypedData} to convert * @param abiParameterKind - Optional {@link AbiParameterKind} to narrow by parameter type * @returns Union of TypeScript primitive types */ export type TypedDataToPrimitiveTypes = { [key in keyof typedData]: { [key2 in typedData[key][number] as key2['name']]: key2['type'] extends key ? Error<`Cannot convert self-referencing struct '${key2['type']}' to primitive type.`> : key2['type'] extends keyof typedData ? key2['type'] extends keyof keyReferences ? Error<`Circular reference detected. '${key2['type']}' is a circular reference.`> : TypedDataToPrimitiveTypes, abiParameterKind, keyReferences & { [_ in key2['type'] | key]: true; }>[key2['type']] : key2['type'] extends `${infer type extends keyof typedData & string}[${infer tail}]` ? AbiParameterToPrimitiveType<{ name: key2['name']; type: `tuple[${tail}]`; components: _TypedDataParametersToAbiParameters; }, abiParameterKind> : key2['type'] extends TypedDataType ? AbiParameterToPrimitiveType : Error<`Cannot convert unknown type '${key2['type']}' to primitive type.`>; }; } & unknown; type _TypedDataParametersToAbiParameters = { [key in keyof typedDataParameters]: typedDataParameters[key] extends infer typedDataParameter extends { name: string; type: unknown; } ? typedDataParameter['type'] extends keyof typedData & string ? { name: typedDataParameter['name']; type: 'tuple'; components: typedDataParameter['type'] extends keyof keyReferences ? Error<`Circular reference detected. '${typedDataParameter['type']}' is a circular reference.`> : _TypedDataParametersToAbiParameters; } : typedDataParameter['type'] extends `${infer type extends keyof typedData & string}[${infer tail}]` ? { name: typedDataParameter['name']; type: `tuple[${tail}]`; components: type extends keyof keyReferences ? Error<`Circular reference detected. '${typedDataParameter['type']}' is a circular reference.`> : _TypedDataParametersToAbiParameters; } : typedDataParameter : never; }; export {}; //# sourceMappingURL=utils.d.ts.map