alloy_rpc_types_engine/
prague.rs

1//! Contains types related to the Prague hardfork that will be used by RPC to communicate with the
2//! beacon consensus engine.
3
4use alloy_eips::eip7685::{Requests, RequestsOrHash};
5use alloy_primitives::B256;
6
7/// Fields introduced in `engine_newPayloadV4` that are not present in the `ExecutionPayload` RPC
8/// object.
9#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
12pub struct PraguePayloadFields {
13    /// EIP-7685 requests.
14    pub requests: RequestsOrHash,
15}
16
17impl PraguePayloadFields {
18    /// Returns a new [`PraguePayloadFields`] instance.
19    pub fn new(requests: impl Into<RequestsOrHash>) -> Self {
20        Self { requests: requests.into() }
21    }
22}
23
24/// A container type for [PraguePayloadFields] that may or may not be present.
25#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
26#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
27#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
28pub struct MaybePraguePayloadFields {
29    fields: Option<PraguePayloadFields>,
30}
31
32impl MaybePraguePayloadFields {
33    /// Returns a new [`MaybePraguePayloadFields`] with no prague fields.
34    pub const fn none() -> Self {
35        Self { fields: None }
36    }
37
38    /// Consumes `self` and returns the contained [`PraguePayloadFields`], if present.
39    pub fn into_inner(self) -> Option<PraguePayloadFields> {
40        self.fields
41    }
42
43    /// Returns the requests, if any.
44    pub fn requests(&self) -> Option<&Requests> {
45        self.fields.as_ref().and_then(|fields| fields.requests.requests())
46    }
47
48    /// Calculates or retrieves the requests hash.
49    ///
50    /// - If the `prague` field contains a list of requests, it calculates the requests hash
51    ///   dynamically.
52    /// - If it contains a precomputed hash (used for testing), it returns that hash directly.
53    pub fn requests_hash(&self) -> Option<B256> {
54        self.fields.as_ref().map(|fields| fields.requests.requests_hash())
55    }
56
57    /// Returns a reference to the inner fields.
58    pub const fn as_ref(&self) -> Option<&PraguePayloadFields> {
59        self.fields.as_ref()
60    }
61}
62
63impl From<PraguePayloadFields> for MaybePraguePayloadFields {
64    #[inline]
65    fn from(fields: PraguePayloadFields) -> Self {
66        Self { fields: Some(fields) }
67    }
68}
69
70impl From<Option<PraguePayloadFields>> for MaybePraguePayloadFields {
71    #[inline]
72    fn from(fields: Option<PraguePayloadFields>) -> Self {
73        Self { fields }
74    }
75}