Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions config/networks/optimism.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"symbol": "ETH",
"tags": [
"rollup",
"optimism"
"optimism-based"
],
"type": "evm"
},
Expand All @@ -46,7 +46,7 @@
"tags": [
"deprecated",
"rollup",
"optimism"
"optimism-based"
]
},
{
Expand Down
9 changes: 6 additions & 3 deletions docs/modules/ROOT/pages/network_configuration.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -170,14 +170,17 @@ Some tags have special meaning and affect relayer behavior:
|`rollup`
|Identifies Layer 2 rollup networks (e.g., Arbitrum, Optimism, Base)

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

|`optimism` _(deprecated)_
|**DEPRECATED**: Use `optimism-based` instead. This tag will be removed in a future version.

|`arbitrum-based`
|Identifies Arbitrum-based networks using the Arbitrum Stack

|`no-mempool`
|Indicates networks that lack a traditional mempool (e.g., Arbitrum)
|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.

|`deprecated`
|Marks networks that are deprecated and may be removed in future versions
Expand Down Expand Up @@ -323,7 +326,7 @@ Here's an example showing a Stellar network configuration with passphrase:
"https://optimism.drpc.org"
],
"features": ["eip1559"],
"tags": ["rollup", "optimism"],
"tags": ["rollup", "optimism-based"],
"average_blocktime_ms": 2000,
"is_testnet": false
}
Expand Down
3 changes: 3 additions & 0 deletions src/constants/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,6 @@ pub use plugins::*;

mod transactions;
pub use transactions::*;

mod network_tags;
pub use network_tags::*;
13 changes: 13 additions & 0 deletions src/constants/network_tags.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/// Network tag constants for EVM networks
pub const NO_MEMPOOL_TAG: &str = "no-mempool";
pub const ARBITRUM_BASED_TAG: &str = "arbitrum-based";
pub const OPTIMISM_BASED_TAG: &str = "optimism-based";
/// @deprecated Use OPTIMISM_BASED_TAG instead. Will be removed in a future version.
pub const OPTIMISM_TAG: &str = "optimism";
pub const ROLLUP_TAG: &str = "rollup";
pub const LACKS_MEMPOOL_TAGS: [&str; 4] = [
NO_MEMPOOL_TAG,
ARBITRUM_BASED_TAG,
OPTIMISM_BASED_TAG,
OPTIMISM_TAG,
];
5 changes: 3 additions & 2 deletions src/domain/transaction/evm/price_calculator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,7 @@ fn calculate_max_fee_per_gas(
#[cfg(test)]
mod tests {
use super::*;
use crate::constants::{ARBITRUM_BASED_TAG, NO_MEMPOOL_TAG};
use crate::models::{
evm::Speed, EvmNetwork, EvmTransactionData, NetworkType, RelayerEvmPolicy,
RelayerNetworkPolicy, RelayerRepoModel, U256,
Expand Down Expand Up @@ -740,7 +741,7 @@ mod tests {
explorer_urls: None,
average_blocktime_ms,
is_testnet: true,
tags: vec!["no-mempool".to_string()], // This makes lacks_mempool() return true
tags: vec![NO_MEMPOOL_TAG.to_string()], // This makes lacks_mempool() return true
chain_id: 42161,
required_confirmations: 1,
features: vec!["eip1559".to_string()], // This makes it use EIP1559 pricing
Expand Down Expand Up @@ -1915,7 +1916,7 @@ mod tests {
explorer_urls: None,
average_blocktime_ms: 1000, // 1 second for arbitrum
is_testnet: false,
tags: vec!["arbitrum-based".to_string()], // This makes is_arbitrum() return true
tags: vec![ARBITRUM_BASED_TAG.to_string()], // This makes is_arbitrum() return true
chain_id: 42161,
required_confirmations: 1,
features: vec!["eip1559".to_string()],
Expand Down
5 changes: 3 additions & 2 deletions src/domain/transaction/evm/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ pub fn get_age_of_sent_at(tx: &TransactionRepoModel) -> Result<Duration, Transac
#[cfg(test)]
mod tests {
use super::*;
use crate::constants::{ARBITRUM_BASED_TAG, ROLLUP_TAG};
use crate::models::{evm::Speed, NetworkTransactionData};
use crate::services::{MockEvmProviderTrait, ProviderError};

Expand All @@ -150,7 +151,7 @@ mod tests {
explorer_urls: None,
average_blocktime_ms: 1000,
is_testnet: false,
tags: vec!["rollup".to_string(), "arbitrum-based".to_string()],
tags: vec![ROLLUP_TAG.to_string(), ARBITRUM_BASED_TAG.to_string()],
chain_id: 42161,
required_confirmations: 1,
features: vec!["eip1559".to_string()],
Expand All @@ -165,7 +166,7 @@ mod tests {
explorer_urls: None,
average_blocktime_ms: 1000,
is_testnet: false,
tags: vec!["rollup".to_string(), "arbitrum-based".to_string()],
tags: vec![ROLLUP_TAG.to_string(), ARBITRUM_BASED_TAG.to_string()],
chain_id: 42170,
required_confirmations: 1,
features: vec!["eip1559".to_string()],
Expand Down
57 changes: 43 additions & 14 deletions src/models/network/evm/network.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
use crate::constants::{
ARBITRUM_BASED_TAG, LACKS_MEMPOOL_TAGS, OPTIMISM_BASED_TAG, OPTIMISM_TAG, ROLLUP_TAG,
};
use crate::models::{NetworkConfigData, NetworkRepoModel, RepositoryError};
use std::time::Duration;

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

impl EvmNetwork {
pub fn is_optimism(&self) -> bool {
self.tags.contains(&"optimism".to_string())
self.tags
.iter()
.any(|t| t == OPTIMISM_BASED_TAG || t == OPTIMISM_TAG)
}

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

/// Returns whether this network lacks mempool-like behavior (no public/pending pool).
///
/// Returns true if any tag in `constants::LACKS_MEMPOOL_TAGS` is present.
/// Currently includes:
/// - "no-mempool"
/// - "arbitrum-based"
/// - "optimism-based"
/// - "optimism" (deprecated; kept for compatibility)
pub fn lacks_mempool(&self) -> bool {
self.tags.contains(&"no-mempool".to_string())
self.tags
.iter()
.any(|t| LACKS_MEMPOOL_TAGS.contains(&t.as_str()))
}

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

pub fn is_testnet(&self) -> bool {
Expand Down Expand Up @@ -146,6 +161,7 @@ impl EvmNetwork {
mod tests {
use super::*;
use crate::config::{EvmNetworkConfig, NetworkConfigCommon};
use crate::constants::{NO_MEMPOOL_TAG, OPTIMISM_TAG};
use crate::models::{NetworkConfigData, NetworkRepoModel, NetworkType};

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

#[test]
fn test_is_optimism_with_optimism_tag() {
let network = create_test_evm_network_with_tags(vec!["optimism", "rollup"]);
let network = create_test_evm_network_with_tags(vec![OPTIMISM_BASED_TAG, ROLLUP_TAG]);
assert!(network.is_optimism());
}

#[test]
fn test_is_optimism_without_optimism_tag() {
let network = create_test_evm_network_with_tags(vec!["rollup", "mainnet"]);
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, "mainnet"]);
assert!(!network.is_optimism());
}

#[test]
fn test_is_optimism_with_deprecated_optimism_tag() {
let network = create_test_evm_network_with_tags(vec![OPTIMISM_TAG, ROLLUP_TAG]);
assert!(network.is_optimism());
}

#[test]
fn test_lacks_mempool_with_deprecated_optimism_tag() {
let network = create_test_evm_network_with_tags(vec![OPTIMISM_TAG, ROLLUP_TAG]);
assert!(network.lacks_mempool());
}

#[test]
fn test_is_rollup_with_rollup_tag() {
let network = create_test_evm_network_with_tags(vec!["rollup", "no-mempool"]);
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, NO_MEMPOOL_TAG]);
assert!(network.is_rollup());
}

Expand All @@ -189,30 +217,31 @@ mod tests {

#[test]
fn test_lacks_mempool_with_no_mempool_tag() {
let network = create_test_evm_network_with_tags(vec!["rollup", "no-mempool"]);
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, NO_MEMPOOL_TAG]);
assert!(network.lacks_mempool());
}

#[test]
fn test_lacks_mempool_without_no_mempool_tag() {
let network = create_test_evm_network_with_tags(vec!["rollup", "optimism"]);
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG]);
assert!(!network.lacks_mempool());
}

#[test]
fn test_arbitrum_like_network() {
let network = create_test_evm_network_with_tags(vec!["rollup", "no-mempool"]);
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, ARBITRUM_BASED_TAG]);
assert!(network.is_rollup());
assert!(network.is_arbitrum());
assert!(network.lacks_mempool());
assert!(!network.is_optimism());
}

#[test]
fn test_optimism_like_network() {
let network = create_test_evm_network_with_tags(vec!["rollup", "optimism"]);
let network = create_test_evm_network_with_tags(vec![ROLLUP_TAG, OPTIMISM_BASED_TAG]);
assert!(network.is_rollup());
assert!(network.is_optimism());
assert!(!network.lacks_mempool());
assert!(network.lacks_mempool());
}

#[test]
Expand Down Expand Up @@ -241,7 +270,7 @@ mod tests {
explorer_urls: None,
average_blocktime_ms: Some(12000),
is_testnet: Some(false),
tags: Some(vec!["rollup".to_string(), "optimism".to_string()]),
tags: Some(vec![ROLLUP_TAG.to_string(), OPTIMISM_BASED_TAG.to_string()]),
},
chain_id: Some(10),
required_confirmations: Some(1),
Expand All @@ -259,6 +288,6 @@ mod tests {
let network = EvmNetwork::try_from(repo_model).unwrap();
assert!(network.is_optimism());
assert!(network.is_rollup());
assert!(!network.lacks_mempool());
assert!(network.lacks_mempool());
}
}
3 changes: 2 additions & 1 deletion src/services/gas/network_extra_fee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ where
#[cfg(test)]
mod tests {
use super::*;
use crate::constants::OPTIMISM_BASED_TAG;
use crate::models::EvmNetwork;
use crate::services::MockEvmProviderTrait;
use alloy::primitives::Bytes;
Expand All @@ -84,7 +85,7 @@ mod tests {
explorer_urls: None,
average_blocktime_ms: 12000,
is_testnet: false,
tags: vec![if optimism { "optimism" } else { name }.to_string()],
tags: vec![if optimism { OPTIMISM_BASED_TAG } else { name }.to_string()],
chain_id: if optimism { 10 } else { 42161 },
required_confirmations: 1,
features: vec!["eip1559".to_string()],
Expand Down
Loading