1use crate::cli::config::RethTransactionPoolConfig;
4use alloy_eips::eip1559::{ETHEREUM_BLOCK_GAS_LIMIT_30M, MIN_PROTOCOL_BASE_FEE};
5use alloy_primitives::Address;
6use clap::{
7 builder::{RangedU64ValueParser, Resettable},
8 Args,
9};
10use reth_cli_util::{parse_duration_from_secs_or_ms, parsers::format_duration_as_secs_or_ms};
11use reth_transaction_pool::{
12 blobstore::disk::DEFAULT_MAX_CACHED_BLOBS,
13 maintain::MAX_QUEUED_TRANSACTION_LIFETIME,
14 pool::{NEW_TX_LISTENER_BUFFER_SIZE, PENDING_TX_LISTENER_BUFFER_SIZE},
15 validate::DEFAULT_MAX_TX_INPUT_BYTES,
16 LocalTransactionConfig, PoolConfig, PriceBumpConfig, SubPoolLimit, DEFAULT_PRICE_BUMP,
17 DEFAULT_TXPOOL_ADDITIONAL_VALIDATION_TASKS, MAX_NEW_PENDING_TXS_NOTIFICATIONS,
18 REPLACE_BLOB_PRICE_BUMP, TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER,
19 TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT, TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
20};
21use std::{path::PathBuf, sync::OnceLock, time::Duration};
22
23static TXPOOL_DEFAULTS: OnceLock<DefaultTxPoolValues> = OnceLock::new();
25
26#[derive(Debug, Clone)]
30pub struct DefaultTxPoolValues {
31 pending_max_count: usize,
32 pending_max_size: usize,
33 basefee_max_count: usize,
34 basefee_max_size: usize,
35 queued_max_count: usize,
36 queued_max_size: usize,
37 blobpool_max_count: usize,
38 blobpool_max_size: usize,
39 blob_cache_size: Option<u32>,
40 disable_blobs_support: bool,
41 max_account_slots: usize,
42 price_bump: u128,
43 minimal_protocol_basefee: u64,
44 minimum_priority_fee: Option<u128>,
45 enforced_gas_limit: u64,
46 max_tx_gas_limit: Option<u64>,
47 blob_transaction_price_bump: u128,
48 max_tx_input_bytes: usize,
49 max_cached_entries: u32,
50 no_locals: bool,
51 locals: Vec<Address>,
52 no_local_transactions_propagation: bool,
53 additional_validation_tasks: usize,
54 pending_tx_listener_buffer_size: usize,
55 new_tx_listener_buffer_size: usize,
56 max_new_pending_txs_notifications: usize,
57 max_queued_lifetime: Duration,
58 transactions_backup_path: Option<PathBuf>,
59 disable_transactions_backup: bool,
60 max_batch_size: usize,
61}
62
63impl DefaultTxPoolValues {
64 pub fn try_init(self) -> Result<(), Self> {
66 TXPOOL_DEFAULTS.set(self)
67 }
68
69 pub fn get_global() -> &'static Self {
71 TXPOOL_DEFAULTS.get_or_init(Self::default)
72 }
73
74 pub const fn with_pending_max_count(mut self, v: usize) -> Self {
76 self.pending_max_count = v;
77 self
78 }
79
80 pub const fn with_pending_max_size(mut self, v: usize) -> Self {
82 self.pending_max_size = v;
83 self
84 }
85
86 pub const fn with_basefee_max_count(mut self, v: usize) -> Self {
88 self.basefee_max_count = v;
89 self
90 }
91
92 pub const fn with_basefee_max_size(mut self, v: usize) -> Self {
94 self.basefee_max_size = v;
95 self
96 }
97
98 pub const fn with_queued_max_count(mut self, v: usize) -> Self {
100 self.queued_max_count = v;
101 self
102 }
103
104 pub const fn with_queued_max_size(mut self, v: usize) -> Self {
106 self.queued_max_size = v;
107 self
108 }
109
110 pub const fn with_blobpool_max_count(mut self, v: usize) -> Self {
112 self.blobpool_max_count = v;
113 self
114 }
115
116 pub const fn with_blobpool_max_size(mut self, v: usize) -> Self {
118 self.blobpool_max_size = v;
119 self
120 }
121
122 pub const fn with_blob_cache_size(mut self, v: Option<u32>) -> Self {
124 self.blob_cache_size = v;
125 self
126 }
127
128 pub const fn with_disable_blobs_support(mut self, v: bool) -> Self {
130 self.disable_blobs_support = v;
131 self
132 }
133
134 pub const fn with_max_account_slots(mut self, v: usize) -> Self {
136 self.max_account_slots = v;
137 self
138 }
139
140 pub const fn with_price_bump(mut self, v: u128) -> Self {
142 self.price_bump = v;
143 self
144 }
145
146 pub const fn with_minimal_protocol_basefee(mut self, v: u64) -> Self {
148 self.minimal_protocol_basefee = v;
149 self
150 }
151
152 pub const fn with_minimum_priority_fee(mut self, v: Option<u128>) -> Self {
154 self.minimum_priority_fee = v;
155 self
156 }
157
158 pub const fn with_enforced_gas_limit(mut self, v: u64) -> Self {
160 self.enforced_gas_limit = v;
161 self
162 }
163
164 pub const fn with_max_tx_gas_limit(mut self, v: Option<u64>) -> Self {
166 self.max_tx_gas_limit = v;
167 self
168 }
169
170 pub const fn with_blob_transaction_price_bump(mut self, v: u128) -> Self {
172 self.blob_transaction_price_bump = v;
173 self
174 }
175
176 pub const fn with_max_tx_input_bytes(mut self, v: usize) -> Self {
178 self.max_tx_input_bytes = v;
179 self
180 }
181
182 pub const fn with_max_cached_entries(mut self, v: u32) -> Self {
184 self.max_cached_entries = v;
185 self
186 }
187
188 pub const fn with_no_locals(mut self, v: bool) -> Self {
190 self.no_locals = v;
191 self
192 }
193
194 pub fn with_locals(mut self, v: Vec<Address>) -> Self {
196 self.locals = v;
197 self
198 }
199
200 pub const fn with_no_local_transactions_propagation(mut self, v: bool) -> Self {
202 self.no_local_transactions_propagation = v;
203 self
204 }
205
206 pub const fn with_additional_validation_tasks(mut self, v: usize) -> Self {
208 self.additional_validation_tasks = v;
209 self
210 }
211
212 pub const fn with_pending_tx_listener_buffer_size(mut self, v: usize) -> Self {
214 self.pending_tx_listener_buffer_size = v;
215 self
216 }
217
218 pub const fn with_new_tx_listener_buffer_size(mut self, v: usize) -> Self {
220 self.new_tx_listener_buffer_size = v;
221 self
222 }
223
224 pub const fn with_max_new_pending_txs_notifications(mut self, v: usize) -> Self {
226 self.max_new_pending_txs_notifications = v;
227 self
228 }
229
230 pub const fn with_max_queued_lifetime(mut self, v: Duration) -> Self {
232 self.max_queued_lifetime = v;
233 self
234 }
235
236 pub fn with_transactions_backup_path(mut self, v: Option<PathBuf>) -> Self {
238 self.transactions_backup_path = v;
239 self
240 }
241
242 pub const fn with_disable_transactions_backup(mut self, v: bool) -> Self {
244 self.disable_transactions_backup = v;
245 self
246 }
247
248 pub const fn with_max_batch_size(mut self, v: usize) -> Self {
250 self.max_batch_size = v;
251 self
252 }
253}
254
255impl Default for DefaultTxPoolValues {
256 fn default() -> Self {
257 Self {
258 pending_max_count: TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
259 pending_max_size: TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT,
260 basefee_max_count: TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
261 basefee_max_size: TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT,
262 queued_max_count: TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
263 queued_max_size: TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT,
264 blobpool_max_count: TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
265 blobpool_max_size: TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT,
266 blob_cache_size: None,
267 disable_blobs_support: false,
268 max_account_slots: TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER,
269 price_bump: DEFAULT_PRICE_BUMP,
270 minimal_protocol_basefee: MIN_PROTOCOL_BASE_FEE,
271 minimum_priority_fee: None,
272 enforced_gas_limit: ETHEREUM_BLOCK_GAS_LIMIT_30M,
273 max_tx_gas_limit: None,
274 blob_transaction_price_bump: REPLACE_BLOB_PRICE_BUMP,
275 max_tx_input_bytes: DEFAULT_MAX_TX_INPUT_BYTES,
276 max_cached_entries: DEFAULT_MAX_CACHED_BLOBS,
277 no_locals: false,
278 locals: Vec::new(),
279 no_local_transactions_propagation: false,
280 additional_validation_tasks: DEFAULT_TXPOOL_ADDITIONAL_VALIDATION_TASKS,
281 pending_tx_listener_buffer_size: PENDING_TX_LISTENER_BUFFER_SIZE,
282 new_tx_listener_buffer_size: NEW_TX_LISTENER_BUFFER_SIZE,
283 max_new_pending_txs_notifications: MAX_NEW_PENDING_TXS_NOTIFICATIONS,
284 max_queued_lifetime: MAX_QUEUED_TRANSACTION_LIFETIME,
285 transactions_backup_path: None,
286 disable_transactions_backup: false,
287 max_batch_size: 1,
288 }
289 }
290}
291
292#[derive(Debug, Clone, Args, PartialEq, Eq)]
294#[command(next_help_heading = "TxPool")]
295pub struct TxPoolArgs {
296 #[arg(long = "txpool.pending-max-count", alias = "txpool.pending_max_count", default_value_t = DefaultTxPoolValues::get_global().pending_max_count)]
298 pub pending_max_count: usize,
299 #[arg(long = "txpool.pending-max-size", alias = "txpool.pending_max_size", default_value_t = DefaultTxPoolValues::get_global().pending_max_size)]
301 pub pending_max_size: usize,
302
303 #[arg(long = "txpool.basefee-max-count", alias = "txpool.basefee_max_count", default_value_t = DefaultTxPoolValues::get_global().basefee_max_count)]
305 pub basefee_max_count: usize,
306 #[arg(long = "txpool.basefee-max-size", alias = "txpool.basefee_max_size", default_value_t = DefaultTxPoolValues::get_global().basefee_max_size)]
308 pub basefee_max_size: usize,
309
310 #[arg(long = "txpool.queued-max-count", alias = "txpool.queued_max_count", default_value_t = DefaultTxPoolValues::get_global().queued_max_count)]
312 pub queued_max_count: usize,
313 #[arg(long = "txpool.queued-max-size", alias = "txpool.queued_max_size", default_value_t = DefaultTxPoolValues::get_global().queued_max_size)]
315 pub queued_max_size: usize,
316
317 #[arg(long = "txpool.blobpool-max-count", alias = "txpool.blobpool_max_count", default_value_t = DefaultTxPoolValues::get_global().blobpool_max_count)]
319 pub blobpool_max_count: usize,
320 #[arg(long = "txpool.blobpool-max-size", alias = "txpool.blobpool_max_size", default_value_t = DefaultTxPoolValues::get_global().blobpool_max_size)]
322 pub blobpool_max_size: usize,
323
324 #[arg(long = "txpool.blob-cache-size", alias = "txpool.blob_cache_size", default_value = Resettable::from(DefaultTxPoolValues::get_global().blob_cache_size.map(|v| v.to_string().into())))]
326 pub blob_cache_size: Option<u32>,
327
328 #[arg(long = "txpool.disable-blobs-support", alias = "txpool.disable_blobs_support", default_value_t = DefaultTxPoolValues::get_global().disable_blobs_support, conflicts_with_all = ["blobpool_max_count", "blobpool_max_size", "blob_cache_size", "blob_transaction_price_bump"])]
330 pub disable_blobs_support: bool,
331
332 #[arg(long = "txpool.max-account-slots", alias = "txpool.max_account_slots", default_value_t = DefaultTxPoolValues::get_global().max_account_slots)]
334 pub max_account_slots: usize,
335
336 #[arg(long = "txpool.pricebump", default_value_t = DefaultTxPoolValues::get_global().price_bump)]
338 pub price_bump: u128,
339
340 #[arg(long = "txpool.minimal-protocol-fee", default_value_t = DefaultTxPoolValues::get_global().minimal_protocol_basefee)]
342 pub minimal_protocol_basefee: u64,
343
344 #[arg(long = "txpool.minimum-priority-fee", default_value = Resettable::from(DefaultTxPoolValues::get_global().minimum_priority_fee.map(|v| v.to_string().into())))]
348 pub minimum_priority_fee: Option<u128>,
349
350 #[arg(long = "txpool.gas-limit", default_value_t = DefaultTxPoolValues::get_global().enforced_gas_limit)]
352 pub enforced_gas_limit: u64,
353
354 #[arg(long = "txpool.max-tx-gas", default_value = Resettable::from(DefaultTxPoolValues::get_global().max_tx_gas_limit.map(|v| v.to_string().into())))]
357 pub max_tx_gas_limit: Option<u64>,
358
359 #[arg(long = "blobpool.pricebump", default_value_t = DefaultTxPoolValues::get_global().blob_transaction_price_bump)]
361 pub blob_transaction_price_bump: u128,
362
363 #[arg(long = "txpool.max-tx-input-bytes", alias = "txpool.max_tx_input_bytes", default_value_t = DefaultTxPoolValues::get_global().max_tx_input_bytes)]
365 pub max_tx_input_bytes: usize,
366
367 #[arg(long = "txpool.max-cached-entries", alias = "txpool.max_cached_entries", default_value_t = DefaultTxPoolValues::get_global().max_cached_entries)]
369 pub max_cached_entries: u32,
370
371 #[arg(long = "txpool.nolocals", default_value_t = DefaultTxPoolValues::get_global().no_locals)]
373 pub no_locals: bool,
374 #[arg(long = "txpool.locals", default_values = DefaultTxPoolValues::get_global().locals.iter().map(ToString::to_string))]
376 pub locals: Vec<Address>,
377 #[arg(long = "txpool.no-local-transactions-propagation", default_value_t = DefaultTxPoolValues::get_global().no_local_transactions_propagation)]
379 pub no_local_transactions_propagation: bool,
380
381 #[arg(long = "txpool.additional-validation-tasks", alias = "txpool.additional_validation_tasks", default_value_t = DefaultTxPoolValues::get_global().additional_validation_tasks)]
383 pub additional_validation_tasks: usize,
384
385 #[arg(long = "txpool.max-pending-txns", alias = "txpool.max_pending_txns", default_value_t = DefaultTxPoolValues::get_global().pending_tx_listener_buffer_size)]
387 pub pending_tx_listener_buffer_size: usize,
388
389 #[arg(long = "txpool.max-new-txns", alias = "txpool.max_new_txns", default_value_t = DefaultTxPoolValues::get_global().new_tx_listener_buffer_size)]
391 pub new_tx_listener_buffer_size: usize,
392
393 #[arg(long = "txpool.max-new-pending-txs-notifications", alias = "txpool.max-new-pending-txs-notifications", default_value_t = DefaultTxPoolValues::get_global().max_new_pending_txs_notifications)]
396 pub max_new_pending_txs_notifications: usize,
397
398 #[arg(long = "txpool.lifetime", value_parser = parse_duration_from_secs_or_ms, value_name = "DURATION", default_value = format_duration_as_secs_or_ms(DefaultTxPoolValues::get_global().max_queued_lifetime))]
400 pub max_queued_lifetime: Duration,
401
402 #[arg(long = "txpool.transactions-backup", alias = "txpool.journal", value_name = "PATH", default_value = Resettable::from(DefaultTxPoolValues::get_global().transactions_backup_path.as_ref().map(|v| v.to_string_lossy().into())))]
404 pub transactions_backup_path: Option<PathBuf>,
405
406 #[arg(
408 long = "txpool.disable-transactions-backup",
409 alias = "txpool.disable-journal",
410 conflicts_with = "transactions_backup_path",
411 default_value_t = DefaultTxPoolValues::get_global().disable_transactions_backup
412 )]
413 pub disable_transactions_backup: bool,
414
415 #[arg(long = "txpool.max-batch-size", value_parser = RangedU64ValueParser::<usize>::new().range(1..), default_value_t = DefaultTxPoolValues::get_global().max_batch_size)]
417 pub max_batch_size: usize,
418}
419
420impl TxPoolArgs {
421 pub const fn with_disabled_protocol_base_fee(self) -> Self {
425 self.with_protocol_base_fee(0)
426 }
427
428 pub const fn with_protocol_base_fee(mut self, protocol_base_fee: u64) -> Self {
433 self.minimal_protocol_basefee = protocol_base_fee;
434 self
435 }
436}
437
438impl Default for TxPoolArgs {
439 fn default() -> Self {
440 let DefaultTxPoolValues {
441 pending_max_count,
442 pending_max_size,
443 basefee_max_count,
444 basefee_max_size,
445 queued_max_count,
446 queued_max_size,
447 blobpool_max_count,
448 blobpool_max_size,
449 blob_cache_size,
450 disable_blobs_support,
451 max_account_slots,
452 price_bump,
453 minimal_protocol_basefee,
454 minimum_priority_fee,
455 enforced_gas_limit,
456 max_tx_gas_limit,
457 blob_transaction_price_bump,
458 max_tx_input_bytes,
459 max_cached_entries,
460 no_locals,
461 locals,
462 no_local_transactions_propagation,
463 additional_validation_tasks,
464 pending_tx_listener_buffer_size,
465 new_tx_listener_buffer_size,
466 max_new_pending_txs_notifications,
467 max_queued_lifetime,
468 transactions_backup_path,
469 disable_transactions_backup,
470 max_batch_size,
471 } = DefaultTxPoolValues::get_global().clone();
472 Self {
473 pending_max_count,
474 pending_max_size,
475 basefee_max_count,
476 basefee_max_size,
477 queued_max_count,
478 queued_max_size,
479 blobpool_max_count,
480 blobpool_max_size,
481 blob_cache_size,
482 disable_blobs_support,
483 max_account_slots,
484 price_bump,
485 minimal_protocol_basefee,
486 minimum_priority_fee,
487 enforced_gas_limit,
488 max_tx_gas_limit,
489 blob_transaction_price_bump,
490 max_tx_input_bytes,
491 max_cached_entries,
492 no_locals,
493 locals,
494 no_local_transactions_propagation,
495 additional_validation_tasks,
496 pending_tx_listener_buffer_size,
497 new_tx_listener_buffer_size,
498 max_new_pending_txs_notifications,
499 max_queued_lifetime,
500 transactions_backup_path,
501 disable_transactions_backup,
502 max_batch_size,
503 }
504 }
505}
506
507impl RethTransactionPoolConfig for TxPoolArgs {
508 fn pool_config(&self) -> PoolConfig {
510 let default_config = PoolConfig::default();
511 PoolConfig {
512 local_transactions_config: LocalTransactionConfig {
513 no_exemptions: self.no_locals,
514 local_addresses: self.locals.iter().copied().collect(),
515 propagate_local_transactions: !self.no_local_transactions_propagation,
516 },
517 pending_limit: SubPoolLimit {
518 max_txs: self.pending_max_count,
519 max_size: self.pending_max_size.saturating_mul(1024 * 1024),
520 },
521 basefee_limit: SubPoolLimit {
522 max_txs: self.basefee_max_count,
523 max_size: self.basefee_max_size.saturating_mul(1024 * 1024),
524 },
525 queued_limit: SubPoolLimit {
526 max_txs: self.queued_max_count,
527 max_size: self.queued_max_size.saturating_mul(1024 * 1024),
528 },
529 blob_limit: SubPoolLimit {
530 max_txs: self.blobpool_max_count,
531 max_size: self.blobpool_max_size.saturating_mul(1024 * 1024),
532 },
533 blob_cache_size: self.blob_cache_size,
534 max_account_slots: self.max_account_slots,
535 price_bumps: PriceBumpConfig {
536 default_price_bump: self.price_bump,
537 replace_blob_tx_price_bump: self.blob_transaction_price_bump,
538 },
539 minimal_protocol_basefee: self.minimal_protocol_basefee,
540 minimum_priority_fee: self.minimum_priority_fee,
541 gas_limit: self.enforced_gas_limit,
542 pending_tx_listener_buffer_size: self.pending_tx_listener_buffer_size,
543 new_tx_listener_buffer_size: self.new_tx_listener_buffer_size,
544 max_new_pending_txs_notifications: self.max_new_pending_txs_notifications,
545 max_queued_lifetime: self.max_queued_lifetime,
546 max_inflight_delegated_slot_limit: default_config.max_inflight_delegated_slot_limit,
547 enforce_tracked_nonce: default_config.enforce_tracked_nonce,
548 }
549 }
550
551 fn max_batch_size(&self) -> usize {
553 self.max_batch_size
554 }
555}
556
557#[cfg(test)]
558mod tests {
559
560 use super::*;
561 use clap::Parser;
562
563 #[derive(Parser)]
565 struct CommandParser<T: Args> {
566 #[command(flatten)]
567 args: T,
568 }
569
570 #[test]
571 fn txpool_args_default_sanity_test() {
572 let default_args = TxPoolArgs::default();
573 let args = CommandParser::<TxPoolArgs>::parse_from(["reth"]).args;
574 assert_eq!(args, default_args);
575 }
576
577 #[test]
578 fn txpool_parse_max_tx_lifetime() {
579 let args =
581 CommandParser::<TxPoolArgs>::parse_from(["reth", "--txpool.lifetime", "300"]).args;
582 assert_eq!(args.max_queued_lifetime, Duration::from_secs(300));
583
584 let args = CommandParser::<TxPoolArgs>::parse_from(["reth"]).args;
586 assert_eq!(args.max_queued_lifetime, Duration::from_secs(3 * 60 * 60)); }
588
589 #[test]
590 fn txpool_parse_max_tx_lifetime_invalid() {
591 let result =
592 CommandParser::<TxPoolArgs>::try_parse_from(["reth", "--txpool.lifetime", "invalid"]);
593
594 assert!(result.is_err(), "Expected an error for invalid duration");
595 }
596
597 #[test]
598 fn txpool_max_batch_size_must_be_nonzero() {
599 let zero =
600 CommandParser::<TxPoolArgs>::try_parse_from(["reth", "--txpool.max-batch-size", "0"]);
601 assert!(zero.is_err());
602
603 let valid =
604 CommandParser::<TxPoolArgs>::parse_from(["reth", "--txpool.max-batch-size", "1"]);
605 assert_eq!(valid.args.max_batch_size, 1);
606 }
607
608 #[test]
609 fn txpool_args() {
610 let args = TxPoolArgs {
611 pending_max_count: 1000,
612 pending_max_size: 200,
613 basefee_max_count: 2000,
614 basefee_max_size: 300,
615 queued_max_count: 3000,
616 queued_max_size: 400,
617 blobpool_max_count: 4000,
618 blobpool_max_size: 500,
619 blob_cache_size: Some(100),
620 disable_blobs_support: false,
621 max_account_slots: 20,
622 price_bump: 15,
623 minimal_protocol_basefee: 1000000000,
624 minimum_priority_fee: Some(2000000000),
625 enforced_gas_limit: 40000000,
626 max_tx_gas_limit: Some(50000000),
627 blob_transaction_price_bump: 25,
628 max_tx_input_bytes: 131072,
629 max_cached_entries: 200,
630 no_locals: true,
631 locals: vec![Address::with_last_byte(1), Address::with_last_byte(2)],
632 no_local_transactions_propagation: true,
633 additional_validation_tasks: 4,
634 pending_tx_listener_buffer_size: 512,
635 new_tx_listener_buffer_size: 256,
636 max_new_pending_txs_notifications: 128,
637 max_queued_lifetime: Duration::from_secs(7200),
638 transactions_backup_path: Some(PathBuf::from("/tmp/txpool-backup")),
639 disable_transactions_backup: false,
640 max_batch_size: 10,
641 };
642
643 let parsed_args = CommandParser::<TxPoolArgs>::parse_from([
644 "reth",
645 "--txpool.pending-max-count",
646 "1000",
647 "--txpool.pending-max-size",
648 "200",
649 "--txpool.basefee-max-count",
650 "2000",
651 "--txpool.basefee-max-size",
652 "300",
653 "--txpool.queued-max-count",
654 "3000",
655 "--txpool.queued-max-size",
656 "400",
657 "--txpool.blobpool-max-count",
658 "4000",
659 "--txpool.blobpool-max-size",
660 "500",
661 "--txpool.blob-cache-size",
662 "100",
663 "--txpool.max-account-slots",
664 "20",
665 "--txpool.pricebump",
666 "15",
667 "--txpool.minimal-protocol-fee",
668 "1000000000",
669 "--txpool.minimum-priority-fee",
670 "2000000000",
671 "--txpool.gas-limit",
672 "40000000",
673 "--txpool.max-tx-gas",
674 "50000000",
675 "--blobpool.pricebump",
676 "25",
677 "--txpool.max-tx-input-bytes",
678 "131072",
679 "--txpool.max-cached-entries",
680 "200",
681 "--txpool.nolocals",
682 "--txpool.locals",
683 "0x0000000000000000000000000000000000000001",
684 "--txpool.locals",
685 "0x0000000000000000000000000000000000000002",
686 "--txpool.no-local-transactions-propagation",
687 "--txpool.additional-validation-tasks",
688 "4",
689 "--txpool.max-pending-txns",
690 "512",
691 "--txpool.max-new-txns",
692 "256",
693 "--txpool.max-new-pending-txs-notifications",
694 "128",
695 "--txpool.lifetime",
696 "7200",
697 "--txpool.transactions-backup",
698 "/tmp/txpool-backup",
699 "--txpool.max-batch-size",
700 "10",
701 ])
702 .args;
703
704 assert_eq!(parsed_args, args);
705 }
706}