kona_executor/executor/
builder.rsuse super::StatelessL2BlockExecutor;
use crate::db::TrieDB;
use alloy_consensus::{Header, Sealable, Sealed};
use kona_mpt::{TrieHinter, TrieProvider};
use op_alloy_genesis::RollupConfig;
use revm::{db::State, handler::register::EvmHandler};
pub type KonaHandleRegister<F, H> =
for<'i> fn(&mut EvmHandler<'i, (), &mut State<&mut TrieDB<F, H>>>);
#[derive(Debug)]
pub struct StatelessL2BlockExecutorBuilder<'a, F, H>
where
F: TrieProvider,
H: TrieHinter,
{
config: &'a RollupConfig,
provider: F,
hinter: H,
parent_header: Option<Sealed<Header>>,
handler_register: Option<KonaHandleRegister<F, H>>,
}
impl<'a, F, H> StatelessL2BlockExecutorBuilder<'a, F, H>
where
F: TrieProvider,
H: TrieHinter,
{
pub fn new(config: &'a RollupConfig, provider: F, hinter: H) -> Self {
Self { config, provider, hinter, parent_header: None, handler_register: None }
}
pub fn with_parent_header(mut self, parent_header: Sealed<Header>) -> Self {
self.parent_header = Some(parent_header);
self
}
pub fn with_handle_register(mut self, handler_register: KonaHandleRegister<F, H>) -> Self {
self.handler_register = Some(handler_register);
self
}
pub fn build(self) -> StatelessL2BlockExecutor<'a, F, H> {
let parent_header = self.parent_header.unwrap_or_else(|| {
let default_header = Header::default();
default_header.seal_slow()
});
let trie_db =
TrieDB::new(parent_header.state_root, parent_header, self.provider, self.hinter);
StatelessL2BlockExecutor {
config: self.config,
trie_db,
handler_register: self.handler_register,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use kona_mpt::{NoopTrieHinter, NoopTrieProvider};
#[test]
fn test_build_full() {
let config = RollupConfig::default();
let parent_header = Header::default().seal_slow();
fn test_handler_register<F, H>(_: &mut EvmHandler<'_, (), &mut State<&mut TrieDB<F, H>>>)
where
F: TrieProvider,
H: TrieHinter,
{
}
let executor =
StatelessL2BlockExecutorBuilder::new(&config, NoopTrieProvider, NoopTrieHinter)
.with_handle_register(test_handler_register)
.build();
assert_eq!(*executor.config, config);
assert_eq!(*executor.trie_db.parent_block_header(), parent_header);
}
}