Skip to main content

reth_ethereum_engine_primitives/
lib.rs

1//! Ethereum specific engine API types and impls.
2
3#![doc(
4    html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
5    html_favicon_url = "https://avatars0.githubusercontent.com/u/97369466?s=256",
6    issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
7)]
8#![cfg_attr(not(test), warn(unused_crate_dependencies))]
9#![cfg_attr(docsrs, feature(doc_cfg))]
10#![cfg_attr(not(feature = "std"), no_std)]
11
12extern crate alloc;
13
14mod payload;
15use alloy_primitives::Bytes;
16pub use payload::{BlobSidecars, EthBuiltPayload};
17
18mod error;
19pub use error::*;
20
21use alloy_rpc_types_engine::{ExecutionData, ExecutionPayload};
22pub use alloy_rpc_types_engine::{
23    ExecutionPayloadEnvelopeV2, ExecutionPayloadEnvelopeV3, ExecutionPayloadEnvelopeV4,
24    ExecutionPayloadEnvelopeV5, ExecutionPayloadEnvelopeV6, ExecutionPayloadV1,
25    PayloadAttributes as EthPayloadAttributes,
26};
27use reth_engine_primitives::EngineTypes;
28use reth_payload_primitives::{BuiltPayload, PayloadTypes};
29use reth_primitives_traits::{NodePrimitives, SealedBlock};
30
31/// The types used in the default mainnet ethereum beacon consensus engine.
32#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
33#[non_exhaustive]
34pub struct EthEngineTypes<T: PayloadTypes = EthPayloadTypes> {
35    _marker: core::marker::PhantomData<T>,
36}
37
38impl<T> PayloadTypes for EthEngineTypes<T>
39where
40    T: PayloadTypes<
41        ExecutionData = ExecutionData,
42        BuiltPayload: BuiltPayload<
43            Primitives: NodePrimitives<Block = reth_ethereum_primitives::Block>,
44        >,
45    >,
46    ExecutionData: From<T::BuiltPayload>,
47{
48    type ExecutionData = T::ExecutionData;
49    type BuiltPayload = T::BuiltPayload;
50    type PayloadAttributes = T::PayloadAttributes;
51
52    fn block_to_payload(
53        block: SealedBlock<
54            <<Self::BuiltPayload as BuiltPayload>::Primitives as NodePrimitives>::Block,
55        >,
56        bal: Option<Bytes>,
57    ) -> Self::ExecutionData {
58        T::block_to_payload(block, bal)
59    }
60}
61
62impl<T> EngineTypes for EthEngineTypes<T>
63where
64    T: PayloadTypes<ExecutionData = ExecutionData>,
65    ExecutionData: From<T::BuiltPayload>,
66    T::BuiltPayload: BuiltPayload<Primitives: NodePrimitives<Block = reth_ethereum_primitives::Block>>
67        + TryInto<ExecutionPayloadV1>
68        + TryInto<ExecutionPayloadEnvelopeV2>
69        + TryInto<ExecutionPayloadEnvelopeV3>
70        + TryInto<ExecutionPayloadEnvelopeV4>
71        + TryInto<ExecutionPayloadEnvelopeV5>
72        + TryInto<ExecutionPayloadEnvelopeV6>,
73{
74    type ExecutionPayloadEnvelopeV1 = ExecutionPayloadV1;
75    type ExecutionPayloadEnvelopeV2 = ExecutionPayloadEnvelopeV2;
76    type ExecutionPayloadEnvelopeV3 = ExecutionPayloadEnvelopeV3;
77    type ExecutionPayloadEnvelopeV4 = ExecutionPayloadEnvelopeV4;
78    type ExecutionPayloadEnvelopeV5 = ExecutionPayloadEnvelopeV5;
79    type ExecutionPayloadEnvelopeV6 = ExecutionPayloadEnvelopeV6;
80}
81
82/// A default payload type for [`EthEngineTypes`]
83#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
84#[non_exhaustive]
85pub struct EthPayloadTypes;
86
87impl PayloadTypes for EthPayloadTypes {
88    type BuiltPayload = EthBuiltPayload;
89    type PayloadAttributes = EthPayloadAttributes;
90    type ExecutionData = ExecutionData;
91
92    fn block_to_payload(
93        block: SealedBlock<
94            <<Self::BuiltPayload as BuiltPayload>::Primitives as NodePrimitives>::Block,
95        >,
96        bal: Option<Bytes>,
97    ) -> Self::ExecutionData {
98        let (payload, sidecar) = ExecutionPayload::from_block_unchecked_with_extras(
99            block.hash(),
100            &block.into_block(),
101            bal,
102        );
103        ExecutionData { payload, sidecar }
104    }
105}