import { Proof, ProvableType, VerificationKey, ZkProgram } from 'o1js';
import { type Input, Spec, type PublicInputs, type UserInputs, type PrivateInputs, type Claims } from './program-spec.ts';
export { createProgram, type Program };
type Program<Output, Inputs extends Record<string, Input>> = {
    compile(): Promise<VerificationKey>;
    run(input: UserInputs<Inputs>): Promise<Proof<PublicInputs<Inputs>, Output>>;
    program: ZkProgram<{
        publicInput: ProvableType<PublicInputs<Inputs>>;
        publicOutput: ProvableType<Output>;
        methods: {
            run: {
                privateInputs: [ProvableType<PrivateInputs<Inputs>>];
                method(publicInput: PublicInputs<Inputs>, privateInput: PrivateInputs<Inputs>): Promise<{
                    publicOutput: Output;
                }>;
            };
        };
    }>;
    claimsType: ProvableType<Claims<Inputs>>;
    outputClaimType: ProvableType<Output>;
};
declare function createProgram<S extends Spec>(spec: S): Program<GetSpecData<S>, S['inputs']>;
type GetSpecData<S extends Spec> = S extends Spec<infer Data, any> ? Data : never;
