reth_node_core/args/
dev.rs

1//! clap [Args](clap::Args) for Dev testnet configuration
2
3use std::time::Duration;
4
5use clap::Args;
6use humantime::parse_duration;
7
8/// Parameters for Dev testnet configuration
9#[derive(Debug, Args, PartialEq, Eq, Default, Clone, Copy)]
10#[command(next_help_heading = "Dev testnet")]
11pub struct DevArgs {
12    /// Start the node in dev mode
13    ///
14    /// This mode uses a local proof-of-authority consensus engine with either fixed block times
15    /// or automatically mined blocks.
16    /// Disables network discovery and enables local http server.
17    /// Prefunds 20 accounts derived by mnemonic "test test test test test test test test test test
18    /// test junk" with 10 000 ETH each.
19    #[arg(long = "dev", alias = "auto-mine", help_heading = "Dev testnet", verbatim_doc_comment)]
20    pub dev: bool,
21
22    /// How many transactions to mine per block.
23    #[arg(
24        long = "dev.block-max-transactions",
25        help_heading = "Dev testnet",
26        conflicts_with = "block_time"
27    )]
28    pub block_max_transactions: Option<usize>,
29
30    /// Interval between blocks.
31    ///
32    /// Parses strings using [`humantime::parse_duration`]
33    /// --dev.block-time 12s
34    #[arg(
35        long = "dev.block-time",
36        help_heading = "Dev testnet",
37        conflicts_with = "block_max_transactions",
38        value_parser = parse_duration,
39        verbatim_doc_comment
40    )]
41    pub block_time: Option<Duration>,
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47    use clap::Parser;
48
49    /// A helper type to parse Args more easily
50    #[derive(Parser)]
51    struct CommandParser<T: Args> {
52        #[command(flatten)]
53        args: T,
54    }
55
56    #[test]
57    fn test_parse_dev_args() {
58        let args = CommandParser::<DevArgs>::parse_from(["reth"]).args;
59        assert_eq!(args, DevArgs { dev: false, block_max_transactions: None, block_time: None });
60
61        let args = CommandParser::<DevArgs>::parse_from(["reth", "--dev"]).args;
62        assert_eq!(args, DevArgs { dev: true, block_max_transactions: None, block_time: None });
63
64        let args = CommandParser::<DevArgs>::parse_from(["reth", "--auto-mine"]).args;
65        assert_eq!(args, DevArgs { dev: true, block_max_transactions: None, block_time: None });
66
67        let args = CommandParser::<DevArgs>::parse_from([
68            "reth",
69            "--dev",
70            "--dev.block-max-transactions",
71            "2",
72        ])
73        .args;
74        assert_eq!(args, DevArgs { dev: true, block_max_transactions: Some(2), block_time: None });
75
76        let args =
77            CommandParser::<DevArgs>::parse_from(["reth", "--dev", "--dev.block-time", "1s"]).args;
78        assert_eq!(
79            args,
80            DevArgs {
81                dev: true,
82                block_max_transactions: None,
83                block_time: Some(std::time::Duration::from_secs(1))
84            }
85        );
86    }
87
88    #[test]
89    fn test_parse_dev_args_conflicts() {
90        let args = CommandParser::<DevArgs>::try_parse_from([
91            "reth",
92            "--dev",
93            "--dev.block-max-transactions",
94            "2",
95            "--dev.block-time",
96            "1s",
97        ]);
98        assert!(args.is_err());
99    }
100
101    #[test]
102    fn dev_args_default_sanity_check() {
103        let default_args = DevArgs::default();
104        let args = CommandParser::<DevArgs>::parse_from(["reth"]).args;
105        assert_eq!(args, default_args);
106    }
107}