Skip to content

Commit 63c04dc

Browse files
authored
feat: Unify mempool detection (#427)
1 parent 1725804 commit 63c04dc

File tree

8 files changed

+75
-24
lines changed

8 files changed

+75
-24
lines changed

config/networks/optimism.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"symbol": "ETH",
2424
"tags": [
2525
"rollup",
26-
"optimism"
26+
"optimism-based"
2727
],
2828
"type": "evm"
2929
},
@@ -46,7 +46,7 @@
4646
"tags": [
4747
"deprecated",
4848
"rollup",
49-
"optimism"
49+
"optimism-based"
5050
]
5151
},
5252
{

docs/modules/ROOT/pages/network_configuration.adoc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,17 @@ Some tags have special meaning and affect relayer behavior:
170170
|`rollup`
171171
|Identifies Layer 2 rollup networks (e.g., Arbitrum, Optimism, Base)
172172

173-
|`optimism`
173+
|`optimism-based`
174174
|Identifies Optimism-based networks using the OP Stack (e.g., Optimism, Base, World Chain)
175175

176+
|`optimism` _(deprecated)_
177+
|**DEPRECATED**: Use `optimism-based` instead. This tag will be removed in a future version.
178+
176179
|`arbitrum-based`
177180
|Identifies Arbitrum-based networks using the Arbitrum Stack
178181

179182
|`no-mempool`
180-
|Indicates networks that lack a traditional mempool (e.g., Arbitrum)
183+
|Indicates networks that lack a traditional mempool (e.g., Arbitrum). Note: The relayer also treats networks tagged as `arbitrum-based` or `optimism-based` as lacking a mempool, even if `no-mempool` is not present.
181184

182185
|`deprecated`
183186
|Marks networks that are deprecated and may be removed in future versions
@@ -323,7 +326,7 @@ Here's an example showing a Stellar network configuration with passphrase:
323326
"https://optimism.drpc.org"
324327
],
325328
"features": ["eip1559"],
326-
"tags": ["rollup", "optimism"],
329+
"tags": ["rollup", "optimism-based"],
327330
"average_blocktime_ms": 2000,
328331
"is_testnet": false
329332
}

src/constants/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ pub use plugins::*;
3434

3535
mod transactions;
3636
pub use transactions::*;
37+
38+
mod network_tags;
39+
pub use network_tags::*;

src/constants/network_tags.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// Network tag constants for EVM networks
2+
pub const NO_MEMPOOL_TAG: &str = "no-mempool";
3+
pub const ARBITRUM_BASED_TAG: &str = "arbitrum-based";
4+
pub const OPTIMISM_BASED_TAG: &str = "optimism-based";
5+
/// @deprecated Use OPTIMISM_BASED_TAG instead. Will be removed in a future version.
6+
pub const OPTIMISM_TAG: &str = "optimism";
7+
pub const ROLLUP_TAG: &str = "rollup";
8+
pub const LACKS_MEMPOOL_TAGS: [&str; 4] = [
9+
NO_MEMPOOL_TAG,
10+
ARBITRUM_BASED_TAG,
11+
OPTIMISM_BASED_TAG,
12+
OPTIMISM_TAG,
13+
];

src/domain/transaction/evm/price_calculator.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,7 @@ fn calculate_max_fee_per_gas(
698698
#[cfg(test)]
699699
mod tests {
700700
use super::*;
701+
use crate::constants::{ARBITRUM_BASED_TAG, NO_MEMPOOL_TAG};
701702
use crate::models::{
702703
evm::Speed, EvmNetwork, EvmTransactionData, NetworkType, RelayerEvmPolicy,
703704
RelayerNetworkPolicy, RelayerRepoModel, U256,
@@ -740,7 +741,7 @@ mod tests {
740741
explorer_urls: None,
741742
average_blocktime_ms,
742743
is_testnet: true,
743-
tags: vec!["no-mempool".to_string()], // This makes lacks_mempool() return true
744+
tags: vec![NO_MEMPOOL_TAG.to_string()], // This makes lacks_mempool() return true
744745
chain_id: 42161,
745746
required_confirmations: 1,
746747
features: vec!["eip1559".to_string()], // This makes it use EIP1559 pricing
@@ -1915,7 +1916,7 @@ mod tests {
19151916
explorer_urls: None,
19161917
average_blocktime_ms: 1000, // 1 second for arbitrum
19171918
is_testnet: false,
1918-
tags: vec!["arbitrum-based".to_string()], // This makes is_arbitrum() return true
1919+
tags: vec![ARBITRUM_BASED_TAG.to_string()], // This makes is_arbitrum() return true
19191920
chain_id: 42161,
19201921
required_confirmations: 1,
19211922
features: vec!["eip1559".to_string()],

src/domain/transaction/evm/utils.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ pub fn get_age_of_sent_at(tx: &TransactionRepoModel) -> Result<Duration, Transac
125125
#[cfg(test)]
126126
mod tests {
127127
use super::*;
128+
use crate::constants::{ARBITRUM_BASED_TAG, ROLLUP_TAG};
128129
use crate::models::{evm::Speed, NetworkTransactionData};
129130
use crate::services::{MockEvmProviderTrait, ProviderError};
130131

@@ -150,7 +151,7 @@ mod tests {
150151
explorer_urls: None,
151152
average_blocktime_ms: 1000,
152153
is_testnet: false,
153-
tags: vec!["rollup".to_string(), "arbitrum-based".to_string()],
154+
tags: vec![ROLLUP_TAG.to_string(), ARBITRUM_BASED_TAG.to_string()],
154155
chain_id: 42161,
155156
required_confirmations: 1,
156157
features: vec!["eip1559".to_string()],
@@ -165,7 +166,7 @@ mod tests {
165166
explorer_urls: None,
166167
average_blocktime_ms: 1000,
167168
is_testnet: false,
168-
tags: vec!["rollup".to_string(), "arbitrum-based".to_string()],
169+
tags: vec![ROLLUP_TAG.to_string(), ARBITRUM_BASED_TAG.to_string()],
169170
chain_id: 42170,
170171
required_confirmations: 1,
171172
features: vec!["eip1559".to_string()],

src/models/network/evm/network.rs

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
use crate::constants::{
2+
ARBITRUM_BASED_TAG, LACKS_MEMPOOL_TAGS, OPTIMISM_BASED_TAG, OPTIMISM_TAG, ROLLUP_TAG,
3+
};
14
use crate::models::{NetworkConfigData, NetworkRepoModel, RepositoryError};
25
use std::time::Duration;
36

@@ -93,19 +96,31 @@ impl TryFrom<NetworkRepoModel> for EvmNetwork {
9396

9497
impl EvmNetwork {
9598
pub fn is_optimism(&self) -> bool {
96-
self.tags.contains(&"optimism".to_string())
99+
self.tags
100+
.iter()
101+
.any(|t| t == OPTIMISM_BASED_TAG || t == OPTIMISM_TAG)
97102
}
98103

99104
pub fn is_rollup(&self) -> bool {
100-
self.tags.contains(&"rollup".to_string())
105+
self.tags.iter().any(|t| t == ROLLUP_TAG)
101106
}
102107

108+
/// Returns whether this network lacks mempool-like behavior (no public/pending pool).
109+
///
110+
/// Returns true if any tag in `constants::LACKS_MEMPOOL_TAGS` is present.
111+
/// Currently includes:
112+
/// - "no-mempool"
113+
/// - "arbitrum-based"
114+
/// - "optimism-based"
115+
/// - "optimism" (deprecated; kept for compatibility)
103116
pub fn lacks_mempool(&self) -> bool {
104-
self.tags.contains(&"no-mempool".to_string())
117+
self.tags
118+
.iter()
119+
.any(|t| LACKS_MEMPOOL_TAGS.contains(&t.as_str()))
105120
}
106121

107122
pub fn is_arbitrum(&self) -> bool {
108-
self.tags.contains(&"arbitrum-based".to_string())
123+
self.tags.iter().any(|t| t == ARBITRUM_BASED_TAG)
109124
}
110125

111126
pub fn is_testnet(&self) -> bool {
@@ -146,6 +161,7 @@ impl EvmNetwork {
146161
mod tests {
147162
use super::*;
148163
use crate::config::{EvmNetworkConfig, NetworkConfigCommon};
164+
use crate::constants::{NO_MEMPOOL_TAG, OPTIMISM_TAG};
149165
use crate::models::{NetworkConfigData, NetworkRepoModel, NetworkType};
150166

151167
fn create_test_evm_network_with_tags(tags: Vec<&str>) -> EvmNetwork {
@@ -165,19 +181,31 @@ mod tests {
165181

166182
#[test]
167183
fn test_is_optimism_with_optimism_tag() {
168-
let network = create_test_evm_network_with_tags(vec!["optimism", "rollup"]);
184+
let network = create_test_evm_network_with_tags(vec![OPTIMISM_BASED_TAG, ROLLUP_TAG]);
169185
assert!(network.is_optimism());
170186
}
171187

172188
#[test]
173189
fn test_is_optimism_without_optimism_tag() {
174-
let network = create_test_evm_network_with_tags(vec!["rollup", "mainnet"]);
190+
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, "mainnet"]);
175191
assert!(!network.is_optimism());
176192
}
177193

194+
#[test]
195+
fn test_is_optimism_with_deprecated_optimism_tag() {
196+
let network = create_test_evm_network_with_tags(vec![OPTIMISM_TAG, ROLLUP_TAG]);
197+
assert!(network.is_optimism());
198+
}
199+
200+
#[test]
201+
fn test_lacks_mempool_with_deprecated_optimism_tag() {
202+
let network = create_test_evm_network_with_tags(vec![OPTIMISM_TAG, ROLLUP_TAG]);
203+
assert!(network.lacks_mempool());
204+
}
205+
178206
#[test]
179207
fn test_is_rollup_with_rollup_tag() {
180-
let network = create_test_evm_network_with_tags(vec!["rollup", "no-mempool"]);
208+
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, NO_MEMPOOL_TAG]);
181209
assert!(network.is_rollup());
182210
}
183211

@@ -189,30 +217,31 @@ mod tests {
189217

190218
#[test]
191219
fn test_lacks_mempool_with_no_mempool_tag() {
192-
let network = create_test_evm_network_with_tags(vec!["rollup", "no-mempool"]);
220+
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, NO_MEMPOOL_TAG]);
193221
assert!(network.lacks_mempool());
194222
}
195223

196224
#[test]
197225
fn test_lacks_mempool_without_no_mempool_tag() {
198-
let network = create_test_evm_network_with_tags(vec!["rollup", "optimism"]);
226+
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG]);
199227
assert!(!network.lacks_mempool());
200228
}
201229

202230
#[test]
203231
fn test_arbitrum_like_network() {
204-
let network = create_test_evm_network_with_tags(vec!["rollup", "no-mempool"]);
232+
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, ARBITRUM_BASED_TAG]);
205233
assert!(network.is_rollup());
234+
assert!(network.is_arbitrum());
206235
assert!(network.lacks_mempool());
207236
assert!(!network.is_optimism());
208237
}
209238

210239
#[test]
211240
fn test_optimism_like_network() {
212-
let network = create_test_evm_network_with_tags(vec!["rollup", "optimism"]);
241+
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, OPTIMISM_BASED_TAG]);
213242
assert!(network.is_rollup());
214243
assert!(network.is_optimism());
215-
assert!(!network.lacks_mempool());
244+
assert!(network.lacks_mempool());
216245
}
217246

218247
#[test]
@@ -241,7 +270,7 @@ mod tests {
241270
explorer_urls: None,
242271
average_blocktime_ms: Some(12000),
243272
is_testnet: Some(false),
244-
tags: Some(vec!["rollup".to_string(), "optimism".to_string()]),
273+
tags: Some(vec![ROLLUP_TAG.to_string(), OPTIMISM_BASED_TAG.to_string()]),
245274
},
246275
chain_id: Some(10),
247276
required_confirmations: Some(1),
@@ -259,6 +288,6 @@ mod tests {
259288
let network = EvmNetwork::try_from(repo_model).unwrap();
260289
assert!(network.is_optimism());
261290
assert!(network.is_rollup());
262-
assert!(!network.lacks_mempool());
291+
assert!(network.lacks_mempool());
263292
}
264293
}

src/services/gas/network_extra_fee.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ where
7373
#[cfg(test)]
7474
mod tests {
7575
use super::*;
76+
use crate::constants::OPTIMISM_BASED_TAG;
7677
use crate::models::EvmNetwork;
7778
use crate::services::MockEvmProviderTrait;
7879
use alloy::primitives::Bytes;
@@ -84,7 +85,7 @@ mod tests {
8485
explorer_urls: None,
8586
average_blocktime_ms: 12000,
8687
is_testnet: false,
87-
tags: vec![if optimism { "optimism" } else { name }.to_string()],
88+
tags: vec![if optimism { OPTIMISM_BASED_TAG } else { name }.to_string()],
8889
chain_id: if optimism { 10 } else { 42161 },
8990
required_confirmations: 1,
9091
features: vec!["eip1559".to_string()],

0 commit comments

Comments
 (0)