use crate::{DbSignetEvent, DbZenithHeader, Receipt, RecoveredTx, SealedHeader};
use alloy::primitives::BlockNumber;
use core::fmt;
use trevm::revm::database::BundleState;
#[derive(Debug, Clone)]
pub struct ExecutedBlock {
pub header: SealedHeader,
pub bundle: BundleState,
pub transactions: Vec<RecoveredTx>,
pub receipts: Vec<Receipt>,
pub signet_events: Vec<DbSignetEvent>,
pub zenith_header: Option<DbZenithHeader>,
}
impl ExecutedBlock {
pub const fn new(
header: SealedHeader,
bundle: BundleState,
transactions: Vec<RecoveredTx>,
receipts: Vec<Receipt>,
signet_events: Vec<DbSignetEvent>,
zenith_header: Option<DbZenithHeader>,
) -> Self {
Self { header, bundle, transactions, receipts, signet_events, zenith_header }
}
pub fn block_number(&self) -> BlockNumber {
self.header.number
}
pub const fn header(&self) -> &SealedHeader {
&self.header
}
pub const fn bundle(&self) -> &BundleState {
&self.bundle
}
}
#[derive(Debug, Default)]
pub struct ExecutedBlockBuilder {
header: Option<SealedHeader>,
bundle: Option<BundleState>,
transactions: Vec<RecoveredTx>,
receipts: Vec<Receipt>,
signet_events: Vec<DbSignetEvent>,
zenith_header: Option<DbZenithHeader>,
}
impl ExecutedBlockBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn header(mut self, header: SealedHeader) -> Self {
self.header = Some(header);
self
}
pub fn bundle(mut self, bundle: BundleState) -> Self {
self.bundle = Some(bundle);
self
}
pub fn transactions(mut self, transactions: Vec<RecoveredTx>) -> Self {
self.transactions = transactions;
self
}
pub fn receipts(mut self, receipts: Vec<Receipt>) -> Self {
self.receipts = receipts;
self
}
pub fn signet_events(mut self, events: Vec<DbSignetEvent>) -> Self {
self.signet_events = events;
self
}
pub const fn zenith_header(mut self, header: Option<DbZenithHeader>) -> Self {
self.zenith_header = header;
self
}
pub fn build(self) -> Result<ExecutedBlock, MissingFieldError> {
Ok(ExecutedBlock {
header: self.header.ok_or(MissingFieldError("header"))?,
bundle: self.bundle.ok_or(MissingFieldError("bundle"))?,
transactions: self.transactions,
receipts: self.receipts,
signet_events: self.signet_events,
zenith_header: self.zenith_header,
})
}
}
#[derive(Debug, Clone, Copy)]
pub struct MissingFieldError(&'static str);
impl fmt::Display for MissingFieldError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "missing required field: {}", self.0)
}
}
impl std::error::Error for MissingFieldError {}