use alloc::vec::Vec; use alloy_eips::{ eip4895::{Withdrawal, Withdrawals}, eip7685::Requests, }; use alloy_primitives::{Address, B256, U256}; use alloy_rpc_types_engine::{PayloadAttributes as EthPayloadAttributes, PayloadId}; use core::fmt; use reth_chain_state::ExecutedBlockWithTrieUpdates; use reth_primitives_traits::{NodePrimitives, SealedBlock}; /// Represents a built payload type that contains a built `SealedBlock` and can be converted into /// engine API execution payloads. #[auto_impl::auto_impl(&, Arc)] pub trait BuiltPayload: Send + Sync + fmt::Debug { /// The node's primitive types type Primitives: NodePrimitives; /// Returns the built block (sealed) fn block(&self) -> &SealedBlock<::Block>; /// Returns the fees collected for the built block fn fees(&self) -> U256; /// Returns the entire execution data for the built block, if available. fn executed_block(&self) -> Option> { None } /// Returns the EIP-7685 requests for the payload if any. fn requests(&self) -> Option; } /// This can be implemented by types that describe a currently running payload job. /// /// This is used as a conversion type, transforming a payload attributes type that the engine API /// receives, into a type that the payload builder can use. pub trait PayloadBuilderAttributes: Send + Sync + fmt::Debug { /// The payload attributes that can be used to construct this type. Used as the argument in /// [`PayloadBuilderAttributes::try_new`]. type RpcPayloadAttributes; /// The error type used in [`PayloadBuilderAttributes::try_new`]. type Error: core::error::Error; /// Creates a new payload builder for the given parent block and the attributes. /// /// Derives the unique [`PayloadId`] for the given parent, attributes and version. fn try_new( parent: B256, rpc_payload_attributes: Self::RpcPayloadAttributes, version: u8, ) -> Result where Self: Sized; /// Returns the [`PayloadId`] for the running payload job. fn payload_id(&self) -> PayloadId; /// Returns the parent block hash for the running payload job. fn parent(&self) -> B256; /// Returns the timestamp for the running payload job. fn timestamp(&self) -> u64; /// Returns the parent beacon block root for the running payload job, if it exists. fn parent_beacon_block_root(&self) -> Option; /// Returns the suggested fee recipient for the running payload job. fn suggested_fee_recipient(&self) -> Address; /// Returns the prevrandao field for the running payload job. fn prev_randao(&self) -> B256; /// Returns the withdrawals for the running payload job. fn withdrawals(&self) -> &Withdrawals; } /// The execution payload attribute type the CL node emits via the engine API. /// This trait should be implemented by types that could be used to spawn a payload job. /// /// This type is emitted as part of the forkchoiceUpdated call pub trait PayloadAttributes: serde::de::DeserializeOwned + serde::Serialize + fmt::Debug + Clone + Send + Sync + 'static { /// Returns the timestamp to be used in the payload job. fn timestamp(&self) -> u64; /// Returns the withdrawals for the given payload attributes. fn withdrawals(&self) -> Option<&Vec>; /// Return the parent beacon block root for the payload attributes. fn parent_beacon_block_root(&self) -> Option; } impl PayloadAttributes for EthPayloadAttributes { fn timestamp(&self) -> u64 { self.timestamp } fn withdrawals(&self) -> Option<&Vec> { self.withdrawals.as_ref() } fn parent_beacon_block_root(&self) -> Option { self.parent_beacon_block_root } } #[cfg(feature = "op")] impl PayloadAttributes for op_alloy_rpc_types_engine::OpPayloadAttributes { fn timestamp(&self) -> u64 { self.payload_attributes.timestamp } fn withdrawals(&self) -> Option<&Vec> { self.payload_attributes.withdrawals.as_ref() } fn parent_beacon_block_root(&self) -> Option { self.payload_attributes.parent_beacon_block_root } } /// A builder that can return the current payload attribute. pub trait PayloadAttributesBuilder: Send + Sync + 'static { /// Return a new payload attribute from the builder. fn build(&self, timestamp: u64) -> Attributes; }