Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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 @@ -50,7 +50,7 @@
"tags": [
"deprecated",
"rollup",
"optimism"
"optimism-based"
],
"type": "evm"
},
Expand Down
6 changes: 3 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,14 @@ 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)

|`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 +323,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::*;
6 changes: 6 additions & 0 deletions src/constants/network_tags.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/// 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";
pub const ROLLUP_TAG: &str = "rollup";
pub const LACKS_MEMPOOL_TAGS: [&str; 3] = [NO_MEMPOOL_TAG, ARBITRUM_BASED_TAG, OPTIMISM_BASED_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
39 changes: 25 additions & 14 deletions src/models/network/evm/network.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::constants::{ARBITRUM_BASED_TAG, LACKS_MEMPOOL_TAGS, OPTIMISM_BASED_TAG, ROLLUP_TAG};
use crate::models::{NetworkConfigData, NetworkRepoModel, RepositoryError};
use std::time::Duration;

Expand Down Expand Up @@ -93,19 +94,27 @@ 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)
}

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 of these tags are present:
/// - "no-mempool"
/// - "arbitrum-based"
/// - "optimism-based"
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 +155,7 @@ impl EvmNetwork {
mod tests {
use super::*;
use crate::config::{EvmNetworkConfig, NetworkConfigCommon};
use crate::constants::NO_MEMPOOL_TAG;
use crate::models::{NetworkConfigData, NetworkRepoModel, NetworkType};

fn create_test_evm_network_with_tags(tags: Vec<&str>) -> EvmNetwork {
Expand All @@ -165,19 +175,19 @@ 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_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 +199,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 +252,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 +270,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