import { ChainForkConfig } from "@lodestar/config";
import { ExecutionStatus, IForkChoice, LVHInvalidResponse, LVHValidResponse, MaybeValidExecutionStatus, ProtoBlock } from "@lodestar/fork-choice";
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
import { SignedBeaconBlock, Slot, bellatrix } from "@lodestar/types";
import { Logger } from "@lodestar/utils";
import { IEth1ForBlockProduction } from "../../eth1/index.js";
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 { ImportBlockOpts } from "./types.js";
export type VerifyBlockExecutionPayloadModules = {
    eth1: IEth1ForBlockProduction;
    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;
    mergeBlockFound: bellatrix.BeaconBlock | null;
} | {
    execAborted: ExecAbortType;
    invalidSegmentLVH?: LVHInvalidResponse;
    mergeBlockFound: null;
};
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;
};
/**
 * 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, blocks: SignedBeaconBlock[], 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, block: SignedBeaconBlock, preState0: CachedBeaconStateAllForks, opts: BlockProcessOpts, isOptimisticallySafe: boolean, currentSlot: Slot): Promise<VerifyBlockExecutionResponse>;
export {};
//# sourceMappingURL=verifyBlocksExecutionPayloads.d.ts.map