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;
15pub use payload::{payload_id, BlobSidecars, EthBuiltPayload, EthPayloadBuilderAttributes};
16
17mod error;
18pub use error::*;
19
20use alloy_rpc_types_engine::{ExecutionData, ExecutionPayload};
21pub use alloy_rpc_types_engine::{
22    ExecutionPayloadEnvelopeV2, ExecutionPayloadEnvelopeV3, ExecutionPayloadEnvelopeV4,
23    ExecutionPayloadEnvelopeV5, ExecutionPayloadEnvelopeV6, ExecutionPayloadV1,
24    PayloadAttributes as EthPayloadAttributes,
25};
26use reth_engine_primitives::EngineTypes;
27use reth_payload_primitives::{BuiltPayload, PayloadTypes};
28use reth_primitives_traits::{NodePrimitives, SealedBlock};
29
30/// The types used in the default mainnet ethereum beacon consensus engine.
31#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
32#[non_exhaustive]
33pub struct EthEngineTypes<T: PayloadTypes = EthPayloadTypes> {
34    _marker: core::marker::PhantomData<T>,
35}
36
37impl<
38        T: PayloadTypes<
39            ExecutionData = ExecutionData,
40            BuiltPayload: BuiltPayload<
41                Primitives: NodePrimitives<Block = reth_ethereum_primitives::Block>,
42            >,
43        >,
44    > PayloadTypes for EthEngineTypes<T>
45{
46    type ExecutionData = T::ExecutionData;
47    type BuiltPayload = T::BuiltPayload;
48    type PayloadAttributes = T::PayloadAttributes;
49    type PayloadBuilderAttributes = T::PayloadBuilderAttributes;
50
51    fn block_to_payload(
52        block: SealedBlock<
53            <<Self::BuiltPayload as BuiltPayload>::Primitives as NodePrimitives>::Block,
54        >,
55    ) -> Self::ExecutionData {
56        T::block_to_payload(block)
57    }
58}
59
60impl<T> EngineTypes for EthEngineTypes<T>
61where
62    T: PayloadTypes<ExecutionData = ExecutionData>,
63    T::BuiltPayload: BuiltPayload<Primitives: NodePrimitives<Block = reth_ethereum_primitives::Block>>
64        + TryInto<ExecutionPayloadV1>
65        + TryInto<ExecutionPayloadEnvelopeV2>
66        + TryInto<ExecutionPayloadEnvelopeV3>
67        + TryInto<ExecutionPayloadEnvelopeV4>
68        + TryInto<ExecutionPayloadEnvelopeV5>
69        + TryInto<ExecutionPayloadEnvelopeV6>,
70{
71    type ExecutionPayloadEnvelopeV1 = ExecutionPayloadV1;
72    type ExecutionPayloadEnvelopeV2 = ExecutionPayloadEnvelopeV2;
73    type ExecutionPayloadEnvelopeV3 = ExecutionPayloadEnvelopeV3;
74    type ExecutionPayloadEnvelopeV4 = ExecutionPayloadEnvelopeV4;
75    type ExecutionPayloadEnvelopeV5 = ExecutionPayloadEnvelopeV5;
76    type ExecutionPayloadEnvelopeV6 = ExecutionPayloadEnvelopeV6;
77}
78
79/// A default payload type for [`EthEngineTypes`]
80#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
81#[non_exhaustive]
82pub struct EthPayloadTypes;
83
84impl PayloadTypes for EthPayloadTypes {
85    type BuiltPayload = EthBuiltPayload;
86    type PayloadAttributes = EthPayloadAttributes;
87    type PayloadBuilderAttributes = EthPayloadBuilderAttributes;
88    type ExecutionData = ExecutionData;
89
90    fn block_to_payload(
91        block: SealedBlock<
92            <<Self::BuiltPayload as BuiltPayload>::Primitives as NodePrimitives>::Block,
93        >,
94    ) -> Self::ExecutionData {
95        let (payload, sidecar) =
96            ExecutionPayload::from_block_unchecked(block.hash(), &block.into_block());
97        ExecutionData { payload, sidecar }
98    }
99}