/**
 * JSON serialization of provable types and values.
 */
import { NestedProvable } from './nested.ts';
import { ProvableType } from './o1js-missing.ts';
import { Field, UInt8, UInt32, UInt64, PublicKey, Signature, VerificationKey, Int64 } from 'o1js';
import { type SerializedFactory } from './provable-factory.ts';
import type { JSONValue } from './types.ts';
export { type SerializedType, type SerializedValue, type SerializedNestedType, serializeProvableType, serializeProvable, serializeProvableField, serializeProvablePublicKey, serializeNestedProvable, serializeNestedProvableValue, serializeSimplyNestedProvableValue, deserializeProvableType, deserializeProvable, deserializeNestedProvable, deserializeNestedProvableValue, replaceNull, replaceUndefined, };
declare const supportedTypes: {
    Field: typeof import("node_modules/o1js/dist/node/lib/provable/field.js").Field & ((x: string | number | bigint | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldConst | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldVar | import("node_modules/o1js/dist/node/lib/provable/field.js").Field) => import("node_modules/o1js/dist/node/lib/provable/field.js").Field);
    Bool: typeof import("node_modules/o1js/dist/node/lib/provable/bool.js").Bool & ((x: boolean | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldVar | import("node_modules/o1js/dist/node/lib/provable/bool.js").Bool) => import("node_modules/o1js/dist/node/lib/provable/bool.js").Bool);
    UInt8: typeof UInt8;
    UInt32: typeof UInt32;
    UInt64: typeof UInt64;
    Int64: typeof Int64;
    PublicKey: typeof PublicKey;
    Signature: typeof Signature;
    Undefined: import("node_modules/o1js/dist/node/lib/provable/types/struct.js").ProvablePureExtended<undefined, undefined, null>;
    VerificationKey: typeof VerificationKey;
};
type O1jsTypeName = keyof typeof supportedTypes;
type SerializedType = {
    _type: O1jsTypeName;
} | {
    _type: 'Struct';
    properties: SerializedNestedType;
} | {
    _type: 'Array';
    inner: SerializedType;
    size: number;
} | {
    _type: 'Constant';
    value: JSONValue;
} | {
    _type: 'Bytes';
    size: number;
} | {
    _type: 'Proof';
    proof: Record<string, any>;
} | {
    _type: 'String';
} | SerializedFactory;
type SerializedNestedType = SerializedType | {
    [key: string]: SerializedNestedType;
};
declare function serializeProvableType(type: ProvableType<any>): SerializedType;
type SerializedValue = SerializedType & {
    value: JSONValue;
};
type SerializedValueAny = SerializedType & {
    value: any;
};
type SerializedNestedValue = SerializedValue | string | number | boolean | {
    [key: string]: SerializedNestedValue;
};
declare function serializeProvable(value: any): SerializedValue;
declare function serializeProvableField(value: Field): {
    _type: "Field";
    value: string;
};
declare function serializeProvablePublicKey(value: PublicKey): {
    _type: "PublicKey";
    value: any;
};
declare function serializeNestedProvable(type: NestedProvable): SerializedNestedType;
declare function serializeNestedProvableValue(value: any): SerializedNestedValue;
declare function serializeSimplyNestedProvableValue(value: Record<string, any>): Record<string, SerializedValue>;
declare function deserializeProvableType(type: SerializedType): ProvableType<any>;
declare function deserializeProvable(json: SerializedValueAny): any;
declare function deserializeNestedProvable(type: SerializedNestedType): NestedProvable;
declare function deserializeNestedProvableValue(value: SerializedNestedValue): any;
declare function replaceNull<Input extends Record<string, JSONValue>>(obj: Input): {
    [K in keyof Input]: Input[K] extends infer T | null ? T | undefined : Input[K];
};
declare function replaceUndefined<Input extends Record<string, JSONValue | undefined>>(obj: Input): {
    [K in keyof Input]: Input[K] extends infer T | undefined ? T | null : Input[K];
};
