use std::fmt::Debug; use reth_node_api::FullNodeComponents; use reth_node_core::node_config::NodeConfig; use reth_primitives::Head; use reth_tasks::TaskExecutor; use tokio::sync::mpsc::{Receiver, UnboundedSender}; use crate::{ExExEvent, ExExNotification}; /// Captures the context that an `ExEx` has access to. pub struct ExExContext { /// The current head of the blockchain at launch. pub head: Head, /// The config of the node pub config: NodeConfig, /// The loaded node config pub reth_config: reth_config::Config, /// Channel used to send [`ExExEvent`]s to the rest of the node. /// /// # Important /// /// The exex should emit a `FinishedHeight` whenever a processed block is safe to prune. /// Additionally, the exex can pre-emptively emit a `FinishedHeight` event to specify what /// blocks to receive notifications for. pub events: UnboundedSender, /// Channel to receive [`ExExNotification`]s. /// /// # Important /// /// Once a an [`ExExNotification`] is sent over the channel, it is considered delivered by the /// node. pub notifications: Receiver, /// node components pub components: Node, } impl Debug for ExExContext { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ExExContext") .field("head", &self.head) .field("config", &self.config) .field("reth_config", &self.reth_config) .field("events", &self.events) .field("notifications", &self.notifications) .field("components", &"...") .finish() } } impl ExExContext { /// Returns the transaction pool of the node. pub fn pool(&self) -> &Node::Pool { self.components.pool() } /// Returns the node's evm config. pub fn evm_config(&self) -> &Node::Evm { self.components.evm_config() } /// Returns the node's executor type. pub fn block_executor(&self) -> &Node::Executor { self.components.block_executor() } /// Returns the provider of the node. pub fn provider(&self) -> &Node::Provider { self.components.provider() } /// Returns the handle to the network pub fn network(&self) -> &Node::Network { self.components.network() } /// Returns the handle to the payload builder service. pub fn payload_builder(&self) -> &reth_payload_builder::PayloadBuilderHandle { self.components.payload_builder() } /// Returns the task executor. pub fn task_executor(&self) -> &TaskExecutor { self.components.task_executor() } }