import { AbiRoot, AbiFunctionKind, AbiFunction, AbiParameters, Schema, SchemaObject, AbiType } from './abi_types.js'; import { Provider } from '@near-js/providers'; import { Account } from './account.js'; import { BlockReference, TxExecutionStatus } from '@near-js/types'; import '@near-js/transactions'; import '@near-js/crypto'; import '@near-js/signers'; import './connection-ESlMGe3P.js'; import '@near-js/tokens'; type IsNullable = [null] extends [T] ? true : false; type IsNever = [T] extends [never] ? true : false; type IsNarrowable = IsNever<(T extends U ? true : false) & (U extends T ? false : true)> extends true ? false : true; type IsFullyOptional = IsNever extends true ? true : { [K in keyof T]-?: {} extends Pick ? true : false; }[keyof T] extends true ? true : false; type Prettify = { [K in keyof T]: T[K]; } & {}; type ExtractAbiFunctions = Extract<_functions[number], { kind: abiFunctionKind; }>; type ExtractAbiFunction, abiFunctionKind extends AbiFunctionKind = AbiFunctionKind> = Extract, { name: functionName; }>; type ExtractAbiFunctionNames = ExtractAbiFunctions["name"]; type GetViewFunction, abiFunction extends AbiFunction = ExtractAbiFunction, _args extends Record = ContractFunctionArgs, _return extends unknown = ContractFunctionReturnType> = IsNarrowable extends true ? IsNever<_args> extends true ? (params?: { blockQuery?: BlockReference; }) => Promise> : IsFullyOptional<_args> extends true ? (params?: { blockQuery?: BlockReference; args?: _args; }) => Promise> : (params: { blockQuery?: BlockReference; args: _args; }) => Promise> : (params?: { blockQuery?: BlockReference; args?: Record; }) => Promise; type GetCallFunction, abiFunction extends AbiFunction = ExtractAbiFunction, _args extends Record = ContractFunctionArgs, _return extends unknown = ContractFunctionReturnType> = IsNarrowable extends true ? IsNever<_args> extends true ? (params: { deposit?: bigint; gas?: bigint; waitUntil?: TxExecutionStatus; account: Account; }) => Promise> : (params: { deposit?: bigint; gas?: bigint; args: _args; waitUntil?: TxExecutionStatus; account: Account; }) => Promise> : (params: { deposit?: bigint; gas?: bigint; args?: Record; waitUntil?: TxExecutionStatus; account: Account; }) => Promise; type ContractFunctionReturnType = abiFunction extends { result: infer Result; } ? Result extends AbiType ? Result["type_schema"] extends Schema ? ResolveSchemaType : unknown : unknown : void; type ContractFunctionArgs = abiFunction extends { params: infer Params; } ? Params extends AbiParameters ? Params["args"] extends { name: infer N; type_schema: infer S; }[] ? Prettify<{ [Arg in Params["args"][number] as IsNullable> extends false ? Arg["name"] & string : never]: ResolveSchemaType; } & { [Arg in Params["args"][number] as IsNullable> extends true ? Arg["name"] & string : never]?: ResolveSchemaType; }> : never : never : never; type ToArray = T extends any[] ? T : [T]; type JSONSchemaTypeMap = { string: string; integer: number; number: number; boolean: boolean; null: null; }; type EnumValue = NonNullable; type ResolveEnum = schema["enum"] extends (infer S)[] ? S : never; type ResolveType = ToArray extends (infer T)[] ? T extends "array" ? ResolveArrayType : T extends "object" ? ResolveObjectType : T extends keyof JSONSchemaTypeMap ? JSONSchemaTypeMap[T] : never : never; type ResolveArrayType = schema extends { items: infer Items; } ? Items extends Schema ? schema extends { uniqueItems: true; } ? Set> : ResolveSchemaType[] : unknown[] : unknown[]; type ResolveObjectType = schema extends { properties: Record; } ? schema extends { required: string[]; } ? Prettify<{ -readonly [Key in keyof schema["properties"] as Key extends schema["required"][number] ? Key : never]: ResolveSchemaType; } & { -readonly [Key in keyof schema["properties"] as Key extends schema["required"][number] ? never : Key]?: ResolveSchemaType; }> : { -readonly [Key in keyof schema["properties"]]?: ResolveSchemaType; } : schema extends { additionalProperties: Schema; } ? Record> : Record; type ResolveRef = ref extends keyof _definitions ? _definitions[ref] extends Schema ? ResolveSchemaType : never : never; /** @todo: it has to use advanced OneOf type that ensures only exact type is allowed */ type ResolveOneOf = schema["oneOf"] extends (infer S)[] ? S extends Schema ? ResolveSchemaType : never : never; type ResolveAnyOf = schema["anyOf"] extends (infer S)[] ? S extends Schema ? ResolveSchemaType : never : never; type ResolveSchemaType = schema extends boolean ? schema : schema extends { enum: EnumValue; } ? ResolveEnum : schema extends { type: infer Type; } ? ResolveType : schema extends { $ref: `#/definitions/${infer Ref}`; } ? ResolveRef : schema extends { oneOf: Schema[]; } ? ResolveOneOf : schema extends { anyOf: Schema[]; } ? ResolveAnyOf : never; type ContractParameters = { contractId: contractId; provider: Provider; abi: abi; }; type ContractReturnType : string, _callFunctionNames extends string = abi extends AbiRoot ? AbiRoot extends abi ? string : ExtractAbiFunctionNames : string> = Prettify<(IsNever<_viewFunctionNames> extends false ? { view: { [functionName in _viewFunctionNames]: GetViewFunction; }; } : {}) & (IsNever<_callFunctionNames> extends false ? { call: { [functionName in _callFunctionNames]: GetCallFunction; }; } : {}) & { abi: abi; contractId: contractId; }>; type ContractConstructor = { new (params: ContractParameters): ContractReturnType; new (params: Prettify, "abi">>): Prettify, "abi">>; }; declare const TypedContract: ContractConstructor; export { type ContractConstructor, type ContractReturnType, type IsNarrowable, TypedContract };