Skip to main content

alloy_rpc_types_engine/
bogota.rs

1//! Contains types related to the Bogota hardfork that will be used by RPC to communicate with the
2//! beacon consensus engine.
3
4use alloc::vec::Vec;
5use alloy_primitives::Bytes;
6
7/// Maximum byte length of an inclusion list.
8///
9/// See also:
10/// <https://github.com/ethereum/execution-apis/blob/main/src/engine/bogota.md#constants>
11pub const MAX_BYTES_PER_INCLUSION_LIST: u64 = 8192;
12
13/// Fields introduced in `engine_newPayloadV6` that are not present in the `ExecutionPayload` RPC
14/// object.
15///
16/// See also:
17/// <https://github.com/ethereum/execution-apis/blob/main/src/engine/bogota.md#engine_newpayloadv6>
18#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
19#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
21pub struct BogotaPayloadFields {
22    /// EIP-7805 inclusion-list transactions.
23    pub inclusion_list_transactions: Vec<Bytes>,
24}
25
26impl BogotaPayloadFields {
27    /// Returns a new [`BogotaPayloadFields`] instance.
28    pub const fn new(inclusion_list_transactions: Vec<Bytes>) -> Self {
29        Self { inclusion_list_transactions }
30    }
31}
32
33impl From<Vec<Bytes>> for BogotaPayloadFields {
34    fn from(inclusion_list_transactions: Vec<Bytes>) -> Self {
35        Self::new(inclusion_list_transactions)
36    }
37}
38
39/// A container type for [`BogotaPayloadFields`] that may or may not be present.
40#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
41#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
42#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
43pub struct MaybeBogotaPayloadFields {
44    fields: Option<BogotaPayloadFields>,
45}
46
47impl MaybeBogotaPayloadFields {
48    /// Returns a new [`MaybeBogotaPayloadFields`] with no Bogota fields.
49    pub const fn none() -> Self {
50        Self { fields: None }
51    }
52
53    /// Returns `true` if no Bogota fields are present.
54    pub const fn is_none(&self) -> bool {
55        self.fields.is_none()
56    }
57
58    /// Consumes `self` and returns the contained [`BogotaPayloadFields`], if present.
59    pub fn into_inner(self) -> Option<BogotaPayloadFields> {
60        self.fields
61    }
62
63    /// Returns the inclusion-list transactions, if any.
64    pub fn inclusion_list_transactions(&self) -> Option<&Vec<Bytes>> {
65        self.fields.as_ref().map(|fields| &fields.inclusion_list_transactions)
66    }
67
68    /// Returns a reference to the inner fields.
69    pub const fn as_ref(&self) -> Option<&BogotaPayloadFields> {
70        self.fields.as_ref()
71    }
72}
73
74impl From<BogotaPayloadFields> for MaybeBogotaPayloadFields {
75    fn from(fields: BogotaPayloadFields) -> Self {
76        Self { fields: Some(fields) }
77    }
78}
79
80impl From<Option<BogotaPayloadFields>> for MaybeBogotaPayloadFields {
81    fn from(fields: Option<BogotaPayloadFields>) -> Self {
82        Self { fields }
83    }
84}
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89
90    #[test]
91    fn bogota_payload_fields_conversions() {
92        let transactions = vec![Bytes::from_static(&[0x01, 0x02])];
93        let fields: BogotaPayloadFields = transactions.clone().into();
94        assert_eq!(fields.inclusion_list_transactions, transactions);
95
96        let maybe_fields: MaybeBogotaPayloadFields = fields.into();
97        assert_eq!(maybe_fields.inclusion_list_transactions(), Some(&transactions));
98    }
99}