import { ForkName } from "@lodestar/params";
import { BlobsBundle, ExecutionPayload, ExecutionRequests, Root, Wei, bellatrix, capella } from "@lodestar/types";
import { BlobAndProof } from "@lodestar/types/deneb";
import { BlobAndProofV2 } from "@lodestar/types/fulu";
import { ExecutionPayloadStatus, PayloadAttributes, VersionedHashes } from "./interface.js";
import { WithdrawalV1 } from "./payloadIdCache.js";
import { DATA, QUANTITY } from "./utils.js";
export type EngineApiRpcParamTypes = {
    /**
     * 1. Object - Instance of ExecutionPayload
     */
    engine_newPayloadV1: [ExecutionPayloadRpc];
    engine_newPayloadV2: [ExecutionPayloadRpc];
    engine_newPayloadV3: [ExecutionPayloadRpc, VersionedHashesRpc, DATA];
    engine_newPayloadV4: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
    /**
     * 1. Object - Payload validity status with respect to the consensus rules:
     *   - blockHash: DATA, 32 Bytes - block hash value of the payload
     *   - status: String: VALID|INVALID - result of the payload validation with respect to the proof-of-stake consensus rules
     */
    engine_forkchoiceUpdatedV1: [
        forkChoiceData: {
            headBlockHash: DATA;
            safeBlockHash: DATA;
            finalizedBlockHash: DATA;
        },
        payloadAttributes?: PayloadAttributesRpc
    ];
    engine_forkchoiceUpdatedV2: [
        forkChoiceData: {
            headBlockHash: DATA;
            safeBlockHash: DATA;
            finalizedBlockHash: DATA;
        },
        payloadAttributes?: PayloadAttributesRpc
    ];
    engine_forkchoiceUpdatedV3: [
        forkChoiceData: {
            headBlockHash: DATA;
            safeBlockHash: DATA;
            finalizedBlockHash: DATA;
        },
        payloadAttributes?: PayloadAttributesRpc
    ];
    /**
     * 1. payloadId: QUANTITY, 64 Bits - Identifier of the payload building process
     */
    engine_getPayloadV1: [QUANTITY];
    engine_getPayloadV2: [QUANTITY];
    engine_getPayloadV3: [QUANTITY];
    engine_getPayloadV4: [QUANTITY];
    engine_getPayloadV5: [QUANTITY];
    /**
     * 1. Array of DATA - Array of block_hash field values of the ExecutionPayload structure
     *  */
    engine_getPayloadBodiesByHashV1: DATA[][];
    /**
     *  1. start: QUANTITY, 64 bits - Starting block number
     *  2. count: QUANTITY, 64 bits - Number of blocks to return
     */
    engine_getPayloadBodiesByRangeV1: [start: QUANTITY, count: QUANTITY];
    /**
     * Object - Instance of ClientVersion
     */
    engine_getClientVersionV1: [ClientVersionRpc];
    engine_getBlobsV1: [DATA[]];
    engine_getBlobsV2: [DATA[]];
};
export type PayloadStatus = {
    status: ExecutionPayloadStatus;
    latestValidHash: DATA | null;
    validationError: string | null;
};
export type EngineApiRpcReturnTypes = {
    /**
     * Object - Response object:
     * - status: String - the result of the payload execution:
     */
    engine_newPayloadV1: PayloadStatus;
    engine_newPayloadV2: PayloadStatus;
    engine_newPayloadV3: PayloadStatus;
    engine_newPayloadV4: PayloadStatus;
    engine_forkchoiceUpdatedV1: {
        payloadStatus: PayloadStatus;
        payloadId: QUANTITY | null;
    };
    engine_forkchoiceUpdatedV2: {
        payloadStatus: PayloadStatus;
        payloadId: QUANTITY | null;
    };
    engine_forkchoiceUpdatedV3: {
        payloadStatus: PayloadStatus;
        payloadId: QUANTITY | null;
    };
    /**
     * payloadId | Error: QUANTITY, 64 Bits - Identifier of the payload building process
     */
    engine_getPayloadV1: ExecutionPayloadRpc;
    engine_getPayloadV2: ExecutionPayloadResponse;
    engine_getPayloadV3: ExecutionPayloadResponse;
    engine_getPayloadV4: ExecutionPayloadResponse;
    engine_getPayloadV5: ExecutionPayloadResponse;
    engine_getPayloadBodiesByHashV1: (ExecutionPayloadBodyRpc | null)[];
    engine_getPayloadBodiesByRangeV1: (ExecutionPayloadBodyRpc | null)[];
    engine_getClientVersionV1: ClientVersionRpc[];
    engine_getBlobsV1: (BlobAndProofRpc | null)[];
    engine_getBlobsV2: BlobAndProofV2Rpc[] | null;
};
type ExecutionPayloadRpcWithValue = {
    executionPayload: ExecutionPayloadRpc;
    blockValue: QUANTITY;
    blobsBundle?: BlobsBundleRpc;
    executionRequests?: ExecutionRequestsRpc;
    shouldOverrideBuilder?: boolean;
};
type ExecutionPayloadResponse = ExecutionPayloadRpcWithValue;
export type ExecutionPayloadBodyRpc = {
    transactions: DATA[];
    withdrawals: WithdrawalV1[] | null | undefined;
};
export type ExecutionPayloadBody = {
    transactions: bellatrix.Transaction[];
    withdrawals: capella.Withdrawals | null;
};
export type ExecutionPayloadRpc = {
    parentHash: DATA;
    feeRecipient: DATA;
    stateRoot: DATA;
    receiptsRoot: DATA;
    logsBloom: DATA;
    prevRandao: DATA;
    blockNumber: QUANTITY;
    gasLimit: QUANTITY;
    gasUsed: QUANTITY;
    timestamp: QUANTITY;
    extraData: DATA;
    baseFeePerGas: QUANTITY;
    blockHash: DATA;
    transactions: DATA[];
    withdrawals?: WithdrawalRpc[];
    blobGasUsed?: QUANTITY;
    excessBlobGas?: QUANTITY;
};
export type WithdrawalRpc = {
    index: QUANTITY;
    validatorIndex: QUANTITY;
    address: DATA;
    amount: QUANTITY;
};
/**
 * ExecutionRequestsRpc only holds at most 3 elements and no repeated type:
 * - ssz'ed DepositRequests
 * - ssz'ed WithdrawalRequests
 * - ssz'ed ConsolidationRequests
 */
export type ExecutionRequestsRpc = (DepositRequestsRpc | WithdrawalRequestsRpc | ConsolidationRequestsRpc)[];
export type DepositRequestsRpc = DATA;
export type WithdrawalRequestsRpc = DATA;
export type ConsolidationRequestsRpc = DATA;
export type BlobAndProofRpc = {
    blob: DATA;
    proof: DATA;
};
export type BlobAndProofV2Rpc = {
    blob: DATA;
    proofs: DATA[];
};
export declare const BLOB_AND_PROOF_V2_RPC_BYTES: number;
export type VersionedHashesRpc = DATA[];
export type PayloadAttributesRpc = {
    /** QUANTITY, 64 Bits - value for the timestamp field of the new payload */
    timestamp: QUANTITY;
    /** DATA, 32 Bytes - value for the prevRandao field of the new payload */
    prevRandao: DATA;
    /** DATA, 20 Bytes - suggested value for the coinbase field of the new payload */
    suggestedFeeRecipient: DATA;
    withdrawals?: WithdrawalRpc[];
    /** DATA, 32 Bytes - value for the parentBeaconBlockRoot to be used for building block */
    parentBeaconBlockRoot?: DATA;
};
export type ClientVersionRpc = {
    /** ClientCode */
    code: string;
    /** string, Human-readable name of the client */
    name: string;
    /** string, the version string of the current implementation */
    version: string;
    /** DATA, 4 bytes - first four bytes of the latest commit hash of this build  */
    commit: DATA;
};
export interface BlobsBundleRpc {
    commitments: DATA[];
    blobs: DATA[];
    proofs: DATA[];
}
export declare function serializeExecutionPayload(fork: ForkName, data: ExecutionPayload): ExecutionPayloadRpc;
export declare function serializeVersionedHashes(vHashes: VersionedHashes): VersionedHashesRpc;
export declare function hasPayloadValue(response: ExecutionPayloadResponse | ExecutionPayloadRpc): response is ExecutionPayloadRpcWithValue;
export declare function parseExecutionPayload(fork: ForkName, response: ExecutionPayloadResponse | ExecutionPayloadRpc): {
    executionPayload: ExecutionPayload;
    executionPayloadValue: Wei;
    blobsBundle?: BlobsBundle;
    executionRequests?: ExecutionRequests;
    shouldOverrideBuilder?: boolean;
};
export declare function serializePayloadAttributes(data: PayloadAttributes): PayloadAttributesRpc;
export declare function serializeBeaconBlockRoot(data: Root): DATA;
export declare function deserializePayloadAttributes(data: PayloadAttributesRpc): PayloadAttributes;
export declare function parseBlobsBundle(data: BlobsBundleRpc): BlobsBundle;
export declare function serializeBlobsBundle(data: BlobsBundle): BlobsBundleRpc;
export declare function serializeWithdrawal(withdrawal: capella.Withdrawal): WithdrawalRpc;
export declare function deserializeWithdrawal(serialized: WithdrawalRpc): capella.Withdrawal;
/**
 * This is identical to get_execution_requests_list in
 * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.8/specs/electra/beacon-chain.md#new-get_execution_requests_list
 */
export declare function serializeExecutionRequests(executionRequests: ExecutionRequests): ExecutionRequestsRpc;
export declare function deserializeExecutionRequests(serialized: ExecutionRequestsRpc): ExecutionRequests;
export declare function deserializeExecutionPayloadBody(data: ExecutionPayloadBodyRpc | null): ExecutionPayloadBody | null;
export declare function serializeExecutionPayloadBody(data: ExecutionPayloadBody | null): ExecutionPayloadBodyRpc | null;
export declare function deserializeBlobAndProofs(data: BlobAndProofRpc | null): BlobAndProof | null;
export declare function deserializeBlobAndProofsV2(data: BlobAndProofV2Rpc): BlobAndProofV2;
/**
 * The same to deserializeBlobAndProofsV2 but using preallocated buffers since BlobAndProofV2Rpc is fixed size
 */
export declare function deserializeBlobAndProofsV2IntoBytes(data: BlobAndProofV2Rpc, buffer: Uint8Array): BlobAndProofV2;
export declare function assertReqSizeLimit(blockHashesReqCount: number, count: number): void;
export {};
//# sourceMappingURL=types.d.ts.map