From b283c74c8f3e9f4c044df71505b2538f5458eef8 Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Fri, 1 Nov 2024 00:02:26 +0400 Subject: [PATCH] sidecar --- crates/rpc-types-engine/src/lib.rs | 2 + crates/rpc-types-engine/src/prague.rs | 63 ++++++++++++++++++++++++++ crates/rpc-types-engine/src/sidecar.rs | 28 ++++++++---- 3 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 crates/rpc-types-engine/src/prague.rs diff --git a/crates/rpc-types-engine/src/lib.rs b/crates/rpc-types-engine/src/lib.rs index d91f05b69793..fcc63e4b1206 100644 --- a/crates/rpc-types-engine/src/lib.rs +++ b/crates/rpc-types-engine/src/lib.rs @@ -13,6 +13,8 @@ extern crate alloc; mod cancun; pub use cancun::*; +mod prague; +pub use prague::*; mod sidecar; pub use sidecar::*; diff --git a/crates/rpc-types-engine/src/prague.rs b/crates/rpc-types-engine/src/prague.rs new file mode 100644 index 000000000000..7d5b36d8dad6 --- /dev/null +++ b/crates/rpc-types-engine/src/prague.rs @@ -0,0 +1,63 @@ +//! Contains types related to the Prague hardfork that will be used by RPC to communicate with the +//! beacon consensus engine. + +use alloy_eips::eip7685::Requests; + +/// Fields introduced in `engine_newPayloadV4` that are not present in the `ExecutionPayload` RPC +/// object. +#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct PraguePayloadFields { + /// EIP-7685 requests. + pub requests: Requests, + /// Target number of blobs in the block. + pub target_blobs_per_block: u64, +} + +/// A container type for [PraguePayloadFields] that may or may not be present. +#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct MaybePraguePayloadFields { + fields: Option, +} + +impl MaybePraguePayloadFields { + /// Returns a new [`MaybePraguePayloadFields`] with no prague fields. + pub const fn none() -> Self { + Self { fields: None } + } + + /// Returns a new [`MaybePraguePayloadFields`] with the given prague fields. + pub fn into_inner(self) -> Option { + self.fields + } + + /// Returns the requests, if any. + pub fn requests(&self) -> Option<&Requests> { + self.fields.as_ref().map(|fields| &fields.requests) + } + + /// Returns the target blobs per block, if any. + pub fn target_blobs_per_block(&self) -> Option { + self.fields.as_ref().map(|fields| fields.target_blobs_per_block) + } + + /// Returns a reference to the inner fields. + pub const fn as_ref(&self) -> Option<&PraguePayloadFields> { + self.fields.as_ref() + } +} + +impl From for MaybePraguePayloadFields { + #[inline] + fn from(fields: PraguePayloadFields) -> Self { + Self { fields: Some(fields) } + } +} + +impl From> for MaybePraguePayloadFields { + #[inline] + fn from(fields: Option) -> Self { + Self { fields } + } +} diff --git a/crates/rpc-types-engine/src/sidecar.rs b/crates/rpc-types-engine/src/sidecar.rs index a640508bcd8c..267f92bf5462 100644 --- a/crates/rpc-types-engine/src/sidecar.rs +++ b/crates/rpc-types-engine/src/sidecar.rs @@ -1,6 +1,8 @@ //! Contains helpers for dealing with additional parameters of `newPayload` requests. -use crate::{CancunPayloadFields, MaybeCancunPayloadFields}; +use crate::{ + CancunPayloadFields, MaybeCancunPayloadFields, MaybePraguePayloadFields, PraguePayloadFields, +}; use alloc::vec::Vec; use alloy_eips::eip7685::Requests; use alloy_primitives::B256; @@ -15,23 +17,23 @@ pub struct ExecutionPayloadSidecar { cancun: MaybeCancunPayloadFields, /// The EIP-7685 requests provided as additional request params to `engine_newPayloadV4` that /// are not present in the `ExecutionPayload`. - prague: Option, + prague: MaybePraguePayloadFields, } impl ExecutionPayloadSidecar { /// Returns a new empty instance (pre-cancun, v1, v2) pub const fn none() -> Self { - Self { cancun: MaybeCancunPayloadFields::none(), prague: None } + Self { cancun: MaybeCancunPayloadFields::none(), prague: MaybePraguePayloadFields::none() } } /// Creates a new instance for cancun with the cancun fields for `engine_newPayloadV3` pub fn v3(cancun: CancunPayloadFields) -> Self { - Self { cancun: cancun.into(), prague: None } + Self { cancun: cancun.into(), prague: MaybePraguePayloadFields::none() } } /// Creates a new instance post prague for `engine_newPayloadV4` - pub fn v4(cancun: CancunPayloadFields, requests: Requests) -> Self { - Self { cancun: cancun.into(), prague: Some(requests) } + pub fn v4(cancun: CancunPayloadFields, prague: PraguePayloadFields) -> Self { + Self { cancun: cancun.into(), prague: prague.into() } } /// Returns a reference to the [`CancunPayloadFields`]. @@ -39,6 +41,11 @@ impl ExecutionPayloadSidecar { self.cancun.as_ref() } + /// Returns a reference to the [`PraguePayloadFields`]. + pub const fn prague(&self) -> Option<&PraguePayloadFields> { + self.prague.as_ref() + } + /// Returns the parent beacon block root, if any. pub fn parent_beacon_block_root(&self) -> Option { self.cancun.parent_beacon_block_root() @@ -50,7 +57,12 @@ impl ExecutionPayloadSidecar { } /// Returns the EIP-7685 requests - pub const fn requests(&self) -> Option<&Requests> { - self.prague.as_ref() + pub fn requests(&self) -> Option<&Requests> { + self.prague.requests() + } + + /// Returns the target blobs per block + pub fn target_blobs_per_block(&self) -> Option { + self.prague.target_blobs_per_block() } }