alloy_rpc_types_engine/
sidecar.rs1use crate::{
4 CancunPayloadFields, MaybeCancunPayloadFields, MaybePraguePayloadFields, PraguePayloadFields,
5};
6use alloc::vec::Vec;
7use alloy_consensus::{Block, BlockHeader, Transaction};
8use alloy_eips::eip7685::Requests;
9use alloy_primitives::B256;
10
11#[derive(Debug, Clone, Default)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
16pub struct ExecutionPayloadSidecar {
17 cancun: MaybeCancunPayloadFields,
20 prague: MaybePraguePayloadFields,
23}
24
25impl ExecutionPayloadSidecar {
26 pub fn from_block<T, H>(block: &Block<T, H>) -> Self
34 where
35 T: Transaction,
36 H: BlockHeader,
37 {
38 let cancun =
39 block.parent_beacon_block_root().map(|parent_beacon_block_root| CancunPayloadFields {
40 parent_beacon_block_root,
41 versioned_hashes: block.body.blob_versioned_hashes_iter().copied().collect(),
42 });
43
44 let prague = block.requests_hash().map(PraguePayloadFields::new);
45
46 match (cancun, prague) {
47 (Some(cancun), Some(prague)) => Self::v4(cancun, prague),
48 (Some(cancun), None) => Self::v3(cancun),
49 _ => Self::none(),
50 }
51 }
52
53 pub const fn none() -> Self {
55 Self { cancun: MaybeCancunPayloadFields::none(), prague: MaybePraguePayloadFields::none() }
56 }
57
58 pub fn v3(cancun: CancunPayloadFields) -> Self {
60 Self { cancun: cancun.into(), prague: MaybePraguePayloadFields::none() }
61 }
62
63 pub fn v4(cancun: CancunPayloadFields, prague: PraguePayloadFields) -> Self {
65 Self { cancun: cancun.into(), prague: prague.into() }
66 }
67
68 pub const fn cancun(&self) -> Option<&CancunPayloadFields> {
70 self.cancun.as_ref()
71 }
72
73 pub fn into_cancun(self) -> Option<CancunPayloadFields> {
75 self.cancun.into_inner()
76 }
77
78 pub const fn prague(&self) -> Option<&PraguePayloadFields> {
80 self.prague.as_ref()
81 }
82
83 pub fn into_prague(self) -> Option<PraguePayloadFields> {
85 self.prague.into_inner()
86 }
87
88 pub fn parent_beacon_block_root(&self) -> Option<B256> {
90 self.cancun.parent_beacon_block_root()
91 }
92
93 pub fn versioned_hashes(&self) -> Option<&Vec<B256>> {
95 self.cancun.versioned_hashes()
96 }
97
98 pub fn requests(&self) -> Option<&Requests> {
103 self.prague.requests()
104 }
105
106 pub fn requests_hash(&self) -> Option<B256> {
112 self.prague.requests_hash()
113 }
114}