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