reth_ethereum_engine_primitives/
lib.rs1#![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#[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 let (payload, sidecar) =
57 ExecutionPayload::from_block_unchecked(block.hash(), &block.into_block());
58 ExecutionData { payload, sidecar }
59 }
60}
61
62impl<T> EngineTypes for EthEngineTypes<T>
63where
64 T: PayloadTypes<ExecutionData = ExecutionData>,
65 T::BuiltPayload: BuiltPayload<Primitives: NodePrimitives<Block = reth_ethereum_primitives::Block>>
66 + TryInto<ExecutionPayloadV1>
67 + TryInto<ExecutionPayloadEnvelopeV2>
68 + TryInto<ExecutionPayloadEnvelopeV3>
69 + TryInto<ExecutionPayloadEnvelopeV4>
70 + TryInto<ExecutionPayloadEnvelopeV5>
71 + TryInto<ExecutionPayloadEnvelopeV6>,
72{
73 type ExecutionPayloadEnvelopeV1 = ExecutionPayloadV1;
74 type ExecutionPayloadEnvelopeV2 = ExecutionPayloadEnvelopeV2;
75 type ExecutionPayloadEnvelopeV3 = ExecutionPayloadEnvelopeV3;
76 type ExecutionPayloadEnvelopeV4 = ExecutionPayloadEnvelopeV4;
77 type ExecutionPayloadEnvelopeV5 = ExecutionPayloadEnvelopeV5;
78 type ExecutionPayloadEnvelopeV6 = ExecutionPayloadEnvelopeV6;
79}
80
81#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
83#[non_exhaustive]
84pub struct EthPayloadTypes;
85
86impl PayloadTypes for EthPayloadTypes {
87 type BuiltPayload = EthBuiltPayload;
88 type PayloadAttributes = EthPayloadAttributes;
89 type PayloadBuilderAttributes = EthPayloadBuilderAttributes;
90 type ExecutionData = ExecutionData;
91
92 fn block_to_payload(
93 block: SealedBlock<
94 <<Self::BuiltPayload as BuiltPayload>::Primitives as NodePrimitives>::Block,
95 >,
96 ) -> Self::ExecutionData {
97 let (payload, sidecar) =
98 ExecutionPayload::from_block_unchecked(block.hash(), &block.into_block());
99 ExecutionData { payload, sidecar }
100 }
101}