use crate::{Batch, BatchValidationProvider, BatchValidity, BlockInfo, L2BlockInfo};
use kona_genesis::RollupConfig;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchWithInclusionBlock {
pub inclusion_block: BlockInfo,
pub batch: Batch,
}
impl BatchWithInclusionBlock {
pub const fn new(inclusion_block: BlockInfo, batch: Batch) -> Self {
Self { inclusion_block, batch }
}
pub async fn check_batch<BF: BatchValidationProvider>(
&self,
cfg: &RollupConfig,
l1_blocks: &[BlockInfo],
l2_safe_head: L2BlockInfo,
fetcher: &mut BF,
) -> BatchValidity {
match &self.batch {
Batch::Single(single_batch) => {
single_batch.check_batch(cfg, l1_blocks, l2_safe_head, &self.inclusion_block)
}
Batch::Span(span_batch) => {
span_batch
.check_batch(cfg, l1_blocks, l2_safe_head, &self.inclusion_block, fetcher)
.await
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utils::TestBatchValidator;
use alloc::vec;
#[tokio::test]
async fn test_single_batch_with_inclusion_block() {
let batch =
BatchWithInclusionBlock::new(BlockInfo::default(), Batch::Single(Default::default()));
let l1_blocks = vec![BlockInfo::default()];
let l2_safe_head = L2BlockInfo::default();
let cfg = RollupConfig::default();
let mut validator = TestBatchValidator::default();
let result = batch.check_batch(&cfg, &l1_blocks, l2_safe_head, &mut validator).await;
assert_eq!(result, BatchValidity::Accept);
}
#[tokio::test]
async fn test_span_batch_with_inclusion_block() {
let batch =
BatchWithInclusionBlock::new(BlockInfo::default(), Batch::Span(Default::default()));
let l1_blocks = vec![BlockInfo::default()];
let l2_safe_head = L2BlockInfo::default();
let cfg = RollupConfig::default();
let mut validator = TestBatchValidator::default();
let result = batch.check_batch(&cfg, &l1_blocks, l2_safe_head, &mut validator).await;
assert_eq!(result, BatchValidity::Undecided);
}
}