openzeppelin_relayer/constants/
evm_transaction.rs

1use crate::models::evm::Speed;
2use chrono::Duration;
3
4pub const DEFAULT_TX_VALID_TIMESPAN: i64 = 8 * 60 * 60 * 1000; // 8 hours in milliseconds
5
6pub const DEFAULT_TRANSACTION_SPEED: Speed = Speed::Fast;
7
8pub const DEFAULT_GAS_LIMIT: u64 = 21000;
9pub const ERC20_TRANSFER_GAS_LIMIT: u64 = 65_000;
10pub const ERC721_TRANSFER_GAS_LIMIT: u64 = 80_000;
11pub const COMPLEX_GAS_LIMIT: u64 = 200_000;
12pub const GAS_TX_CREATE_CONTRACT: u64 = 53000;
13
14pub const GAS_TX_DATA_ZERO: u64 = 4; // Cost per zero byte in data
15pub const GAS_TX_DATA_NONZERO: u64 = 16; // Cost per non-zero byte in data
16
17/// Gas limit buffer multiplier for automatic gas limit estimation, 10% increase
18pub const GAS_LIMIT_BUFFER_MULTIPLIER: u64 = 110;
19
20/// Minimum gas price bump factor for transaction replacements (10% increase)
21pub const MIN_BUMP_FACTOR: f64 = 1.1;
22
23// Maximum number of transaction attempts before considering a NOOP
24pub const MAXIMUM_TX_ATTEMPTS: usize = 50;
25// Maximum number of NOOP transactions to attempt
26pub const MAXIMUM_NOOP_RETRY_ATTEMPTS: u32 = 50;
27
28/// Time to resubmit for Arbitrum networks
29pub const ARBITRUM_TIME_TO_RESUBMIT: i64 = 20_000;
30
31// Gas limit for Arbitrum networks (mainly used for NOOP transactions (with no data), covers L1 + L2 costs)
32pub const ARBITRUM_GAS_LIMIT: u64 = 50_000;
33
34/// Gas price cache refresh timeout in seconds (5 minutes)
35/// Used to cleanup stuck refresh operations that may have failed to complete
36pub const GAS_PRICE_CACHE_REFRESH_TIMEOUT_SECS: u64 = 300;
37
38/// Number of historical blocks to fetch for fee history analysis
39pub const HISTORICAL_BLOCKS: u64 = 4;
40
41// EVM Status check and timeout constants
42
43/// Initial delay before first status check (in seconds)
44pub const EVM_STATUS_CHECK_INITIAL_DELAY_SECONDS: i64 = 8;
45
46/// Minimum age of transaction before allowing resubmission and timeout checks (in seconds)
47/// Transactions younger than this will still get status updates from blockchain,
48/// but resubmission logic and timeout checks are deferred to prevent premature actions.
49pub const EVM_MIN_AGE_FOR_RESUBMIT_SECONDS: i64 = 20;
50
51/// Timeout for preparation phase: Pending → Sent (in minutes)
52/// Increased from 1 to 2 minutes to provide wider recovery window
53pub const EVM_PREPARE_TIMEOUT_MINUTES: i64 = 2;
54
55/// Timeout for submission phase: Sent → Submitted (in minutes)
56pub const EVM_SUBMIT_TIMEOUT_MINUTES: i64 = 5;
57
58/// Timeout for resend phase: Sent → Submitted (in seconds)
59pub const EVM_RESEND_TIMEOUT_SECONDS: i64 = 25;
60
61/// Trigger recovery for stuck Pending transactions (in seconds)
62pub const EVM_PENDING_RECOVERY_TRIGGER_SECONDS: i64 = 20;
63
64/// Minimum age before attempting hash recovery for transactions (in minutes)
65pub const EVM_MIN_AGE_FOR_HASH_RECOVERY_MINUTES: i64 = 2;
66
67/// Minimum number of hashes required before attempting hash recovery
68pub const EVM_MIN_HASHES_FOR_RECOVERY: usize = 3;
69
70/// Get preparation timeout duration
71pub fn get_evm_prepare_timeout() -> Duration {
72    Duration::minutes(EVM_PREPARE_TIMEOUT_MINUTES)
73}
74
75/// Get submission timeout duration
76pub fn get_evm_submit_timeout() -> Duration {
77    Duration::minutes(EVM_SUBMIT_TIMEOUT_MINUTES)
78}
79
80/// Get resend timeout duration
81pub fn get_evm_resend_timeout() -> Duration {
82    Duration::seconds(EVM_RESEND_TIMEOUT_SECONDS)
83}
84
85/// Get pending recovery trigger duration
86pub fn get_evm_pending_recovery_trigger_timeout() -> Duration {
87    Duration::seconds(EVM_PENDING_RECOVERY_TRIGGER_SECONDS)
88}
89
90/// Get status check initial delay duration
91pub fn get_evm_status_check_initial_delay() -> Duration {
92    Duration::seconds(EVM_STATUS_CHECK_INITIAL_DELAY_SECONDS)
93}
94
95/// Get minimum age for hash recovery duration
96pub fn get_evm_min_age_for_hash_recovery() -> Duration {
97    Duration::minutes(EVM_MIN_AGE_FOR_HASH_RECOVERY_MINUTES)
98}