//! Additional Node command arguments. //! clap [Args](clap::Args) for optimism rollup configuration use op_alloy_consensus::interop::SafetyLevel; use reth_optimism_txpool::supervisor::DEFAULT_SUPERVISOR_URL; /// Parameters for rollup configuration #[derive(Debug, Clone, PartialEq, Eq, clap::Args)] #[command(next_help_heading = "Rollup")] pub struct RollupArgs { /// Endpoint for the sequencer mempool (can be both HTTP and WS) #[arg(long = "rollup.sequencer", visible_aliases = ["rollup.sequencer-http", "rollup.sequencer-ws"])] pub sequencer: Option, /// Disable transaction pool gossip #[arg(long = "rollup.disable-tx-pool-gossip")] pub disable_txpool_gossip: bool, /// Enable walkback to genesis on startup. This is useful for re-validating the existing DB /// prior to beginning normal syncing. #[arg(long = "rollup.enable-genesis-walkback")] pub enable_genesis_walkback: bool, /// By default the pending block equals the latest block /// to save resources and not leak txs from the tx-pool, /// this flag enables computing of the pending block /// from the tx-pool instead. /// /// If `compute_pending_block` is not enabled, the payload builder /// will use the payload attributes from the latest block. Note /// that this flag is not yet functional. #[arg(long = "rollup.compute-pending-block")] pub compute_pending_block: bool, /// enables discovery v4 if provided #[arg(long = "rollup.discovery.v4", default_value = "false")] pub discovery_v4: bool, /// Enable transaction conditional support on sequencer #[arg(long = "rollup.enable-tx-conditional", default_value = "false")] pub enable_tx_conditional: bool, /// HTTP endpoint for the supervisor #[arg( long = "rollup.supervisor-http", value_name = "SUPERVISOR_HTTP_URL", default_value = DEFAULT_SUPERVISOR_URL )] pub supervisor_http: String, /// Safety level for the supervisor #[arg( long = "rollup.supervisor-safety-level", default_value_t = SafetyLevel::CrossUnsafe, )] pub supervisor_safety_level: SafetyLevel, /// Optional headers to use when connecting to the sequencer. #[arg(long = "rollup.sequencer-headers", requires = "sequencer")] pub sequencer_headers: Vec, } impl Default for RollupArgs { fn default() -> Self { Self { sequencer: None, disable_txpool_gossip: false, enable_genesis_walkback: false, compute_pending_block: false, discovery_v4: false, enable_tx_conditional: false, supervisor_http: DEFAULT_SUPERVISOR_URL.to_string(), supervisor_safety_level: SafetyLevel::CrossUnsafe, sequencer_headers: Vec::new(), } } } #[cfg(test)] mod tests { use super::*; use clap::{Args, Parser}; /// A helper type to parse Args more easily #[derive(Parser)] struct CommandParser { #[command(flatten)] args: T, } #[test] fn test_parse_optimism_default_args() { let default_args = RollupArgs::default(); let args = CommandParser::::parse_from(["reth"]).args; assert_eq!(args, default_args); } #[test] fn test_parse_optimism_walkback_args() { let expected_args = RollupArgs { enable_genesis_walkback: true, ..Default::default() }; let args = CommandParser::::parse_from(["reth", "--rollup.enable-genesis-walkback"]) .args; assert_eq!(args, expected_args); } #[test] fn test_parse_optimism_compute_pending_block_args() { let expected_args = RollupArgs { compute_pending_block: true, ..Default::default() }; let args = CommandParser::::parse_from(["reth", "--rollup.compute-pending-block"]) .args; assert_eq!(args, expected_args); } #[test] fn test_parse_optimism_discovery_v4_args() { let expected_args = RollupArgs { discovery_v4: true, ..Default::default() }; let args = CommandParser::::parse_from(["reth", "--rollup.discovery.v4"]).args; assert_eq!(args, expected_args); } #[test] fn test_parse_optimism_sequencer_http_args() { let expected_args = RollupArgs { sequencer: Some("http://host:port".into()), ..Default::default() }; let args = CommandParser::::parse_from([ "reth", "--rollup.sequencer-http", "http://host:port", ]) .args; assert_eq!(args, expected_args); } #[test] fn test_parse_optimism_disable_txpool_args() { let expected_args = RollupArgs { disable_txpool_gossip: true, ..Default::default() }; let args = CommandParser::::parse_from(["reth", "--rollup.disable-tx-pool-gossip"]) .args; assert_eq!(args, expected_args); } #[test] fn test_parse_optimism_enable_tx_conditional() { let expected_args = RollupArgs { enable_tx_conditional: true, ..Default::default() }; let args = CommandParser::::parse_from(["reth", "--rollup.enable-tx-conditional"]) .args; assert_eq!(args, expected_args); } #[test] fn test_parse_optimism_many_args() { let expected_args = RollupArgs { disable_txpool_gossip: true, compute_pending_block: true, enable_genesis_walkback: true, enable_tx_conditional: true, sequencer: Some("http://host:port".into()), ..Default::default() }; let args = CommandParser::::parse_from([ "reth", "--rollup.disable-tx-pool-gossip", "--rollup.compute-pending-block", "--rollup.enable-genesis-walkback", "--rollup.enable-tx-conditional", "--rollup.sequencer-http", "http://host:port", ]) .args; assert_eq!(args, expected_args); } }