From ccfb97438eca588d86e03d25e54088f42f880e14 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Fri, 27 Dec 2024 15:45:00 +0100 Subject: [PATCH] feat: add tryfrom payloadv2 + v3 for block (#1853) * feat: add tryfrom payloadv2 for block * feat: add tryfrom payloadv3 for block * docs --- crates/rpc-types-engine/src/payload.rs | 46 ++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/crates/rpc-types-engine/src/payload.rs b/crates/rpc-types-engine/src/payload.rs index 6fe48bfcad3..bb397af6e22 100644 --- a/crates/rpc-types-engine/src/payload.rs +++ b/crates/rpc-types-engine/src/payload.rs @@ -298,6 +298,29 @@ impl ExecutionPayloadV2 { pub const fn timestamp(&self) -> u64 { self.payload_inner.timestamp } + + /// Converts [`ExecutionPayloadV2`] to [`Block`]. + /// + /// This performs the same conversion as the underlying V1 payload, but calculates the + /// withdrawals root and adds withdrawals. + /// + /// See also [`ExecutionPayloadV1::try_into_block`]. + pub fn try_into_block(self) -> Result, PayloadError> { + let mut base_sealed_block = self.payload_inner.try_into_block()?; + let withdrawals_root = + alloy_consensus::proofs::calculate_withdrawals_root(&self.withdrawals); + base_sealed_block.body.withdrawals = Some(self.withdrawals.into()); + base_sealed_block.header.withdrawals_root = Some(withdrawals_root); + Ok(base_sealed_block) + } +} + +impl TryFrom for Block { + type Error = PayloadError; + + fn try_from(value: ExecutionPayloadV2) -> Result { + value.try_into_block() + } } #[cfg(feature = "ssz")] @@ -422,6 +445,29 @@ impl ExecutionPayloadV3 { pub const fn timestamp(&self) -> u64 { self.payload_inner.payload_inner.timestamp } + + /// Converts [`ExecutionPayloadV3`] to [`Block`]. + /// + /// This performs the same conversion as the underlying V2 payload, but inserts the blob gas + /// used and excess blob gas. + /// + /// See also [`ExecutionPayloadV2::try_into_block`]. + pub fn try_into_block(self) -> Result, PayloadError> { + let mut base_block = self.payload_inner.try_into_block()?; + + base_block.header.blob_gas_used = Some(self.blob_gas_used); + base_block.header.excess_blob_gas = Some(self.excess_blob_gas); + + Ok(base_block) + } +} + +impl TryFrom for Block { + type Error = PayloadError; + + fn try_from(value: ExecutionPayloadV3) -> Result { + value.try_into_block() + } } #[cfg(feature = "ssz")]