import { ChainForkConfig } from "@lodestar/config";
import { ExecutionStatus, IForkChoice, LVHInvalidResponse, LVHValidResponse, MaybeValidExecutionStatus, ProtoBlock } from "@lodestar/fork-choice";
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
import { Logger } from "@lodestar/utils";
import { IExecutionEngine } from "../../execution/engine/interface.js";
import { Metrics } from "../../metrics/metrics.js";
import { IClock } from "../../util/clock.js";
import { BlockError } from "../errors/index.js";
import { BlockProcessOpts } from "../options.js";
import { IBlockInput } from "./blockInput/types.js";
import { ImportBlockOpts } from "./types.js";
export type VerifyBlockExecutionPayloadModules = {
    executionEngine: IExecutionEngine;
    clock: IClock;
    logger: Logger;
    metrics: Metrics | null;
    forkChoice: IForkChoice;
    config: ChainForkConfig;
};
type ExecAbortType = {
    blockIndex: number;
    execError: BlockError;
};
export type SegmentExecStatus = {
    execAborted: null;
    executionStatuses: MaybeValidExecutionStatus[];
    executionTime: number;
} | {
    execAborted: ExecAbortType;
    invalidSegmentLVH?: LVHInvalidResponse;
};
type VerifyExecutionErrorResponse = {
    executionStatus: ExecutionStatus.Invalid;
    lvhResponse: LVHInvalidResponse;
    execError: BlockError;
} | {
    executionStatus: null;
    lvhResponse: undefined;
    execError: BlockError;
};
type VerifyBlockExecutionResponse = VerifyExecutionErrorResponse | {
    executionStatus: ExecutionStatus.Valid;
    lvhResponse: LVHValidResponse;
    execError: null;
} | {
    executionStatus: ExecutionStatus.Syncing;
    lvhResponse?: LVHValidResponse;
    execError: null;
} | {
    executionStatus: ExecutionStatus.PreMerge;
    lvhResponse: undefined;
    execError: null;
} | {
    executionStatus: ExecutionStatus.PayloadSeparated;
    lvhResponse: undefined;
    execError: null;
};
/**
 * Verifies 1 or more execution payloads from a linear sequence of blocks.
 *
 * Since the EL client must be aware of each parent, all payloads must be submitted in sequence.
 */
export declare function verifyBlocksExecutionPayload(chain: VerifyBlockExecutionPayloadModules, parentBlock: ProtoBlock, blockInputs: IBlockInput[], preState0: CachedBeaconStateAllForks, signal: AbortSignal, opts: BlockProcessOpts & ImportBlockOpts): Promise<SegmentExecStatus>;
/**
 * Verifies a single block execution payload by sending it to the EL client (via HTTP).
 */
export declare function verifyBlockExecutionPayload(chain: VerifyBlockExecutionPayloadModules, blockInput: IBlockInput, preState0: CachedBeaconStateAllForks): Promise<VerifyBlockExecutionResponse>;
export {};
//# sourceMappingURL=verifyBlocksExecutionPayloads.d.ts.map