kona_node_service/service/standard/
node.rs

1//! Contains the [`RollupNode`] implementation.
2use crate::{
3    DerivationActor, DerivationBuilder, EngineActor, EngineBuilder, InteropMode, L1WatcherRpc,
4    L1WatcherRpcState, NetworkActor, NetworkBuilder, NetworkConfig, NodeMode, RollupNodeBuilder,
5    RollupNodeService, RpcActor, SequencerConfig,
6    actors::{SequencerActor, SequencerBuilder},
7};
8use alloy_provider::RootProvider;
9use async_trait::async_trait;
10use kona_derive::StatefulAttributesBuilder;
11use op_alloy_network::Optimism;
12use std::sync::Arc;
13
14use kona_genesis::RollupConfig;
15use kona_providers_alloy::{
16    AlloyChainProvider, AlloyL2ChainProvider, OnlineBeaconClient, OnlinePipeline,
17};
18use kona_rpc::RpcBuilder;
19
20/// The standard implementation of the [RollupNode] service, using the governance approved OP Stack
21/// configuration of components.
22#[derive(Debug)]
23pub struct RollupNode {
24    /// The rollup configuration.
25    pub(crate) config: Arc<RollupConfig>,
26    /// The interop mode for the node.
27    pub(crate) interop_mode: InteropMode,
28    /// The L1 EL provider.
29    pub(crate) l1_provider: RootProvider,
30    /// The L1 beacon API.
31    pub(crate) l1_beacon: OnlineBeaconClient,
32    /// The L2 EL provider.
33    pub(crate) l2_provider: RootProvider<Optimism>,
34    /// The [`EngineBuilder`] for the node.
35    pub(crate) engine_builder: EngineBuilder,
36    /// The [`RpcBuilder`] for the node.
37    pub(crate) rpc_builder: Option<RpcBuilder>,
38    /// The P2P [`NetworkConfig`] for the node.
39    pub(crate) p2p_config: NetworkConfig,
40    /// The [`SequencerConfig`] for the node.
41    pub(crate) sequencer_config: SequencerConfig,
42}
43
44impl RollupNode {
45    /// Creates a new [RollupNodeBuilder], instantiated with the given [RollupConfig].
46    pub fn builder(config: RollupConfig) -> RollupNodeBuilder {
47        RollupNodeBuilder::new(config)
48    }
49}
50
51#[async_trait]
52impl RollupNodeService for RollupNode {
53    type DataAvailabilityWatcher = L1WatcherRpc;
54
55    type AttributesBuilder = StatefulAttributesBuilder<AlloyChainProvider, AlloyL2ChainProvider>;
56    type SequencerActor = SequencerActor<SequencerBuilder>;
57
58    type DerivationPipeline = OnlinePipeline;
59    type DerivationActor = DerivationActor<DerivationBuilder>;
60
61    type RpcActor = RpcActor;
62    type EngineActor = EngineActor;
63    type NetworkActor = NetworkActor;
64
65    fn mode(&self) -> NodeMode {
66        self.engine_builder.mode
67    }
68
69    fn da_watcher_builder(&self) -> L1WatcherRpcState {
70        L1WatcherRpcState { rollup: self.config.clone(), l1_provider: self.l1_provider.clone() }
71    }
72
73    fn engine_builder(&self) -> EngineBuilder {
74        self.engine_builder.clone()
75    }
76
77    fn sequencer_builder(&self) -> SequencerBuilder {
78        SequencerBuilder {
79            seq_cfg: self.sequencer_config.clone(),
80            rollup_cfg: self.config.clone(),
81            l1_provider: self.l1_provider.clone(),
82            l2_provider: self.l2_provider.clone(),
83        }
84    }
85
86    fn rpc_builder(&self) -> Option<RpcBuilder> {
87        self.rpc_builder.clone()
88    }
89
90    fn network_builder(&self) -> NetworkBuilder {
91        NetworkBuilder::from(self.p2p_config.clone())
92    }
93
94    fn derivation_builder(&self) -> DerivationBuilder {
95        DerivationBuilder {
96            l1_provider: self.l1_provider.clone(),
97            l1_beacon: self.l1_beacon.clone(),
98            l2_provider: self.l2_provider.clone(),
99            rollup_config: self.config.clone(),
100            interop_mode: self.interop_mode,
101        }
102    }
103}