From 04a7f00cbcfe177bf99f04877c37cc666b43b341 Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 11 Dec 2024 14:49:08 +0300 Subject: [PATCH 01/12] add ob yaml and network related parsing --- crates/common/src/add_order.rs | 12 +- crates/settings/src/lib.rs | 2 + crates/settings/src/network.rs | 163 ++++++++++++++++++++++++-- crates/settings/src/test.rs | 6 +- crates/settings/src/yaml/mod.rs | 130 ++++++++++++++++++++ crates/settings/src/yaml/orderbook.rs | 157 +++++++++++++++++++++++++ 6 files changed, 456 insertions(+), 14 deletions(-) create mode 100644 crates/settings/src/yaml/mod.rs create mode 100644 crates/settings/src/yaml/orderbook.rs diff --git a/crates/common/src/add_order.rs b/crates/common/src/add_order.rs index a79e9ed13..050ea2c5a 100644 --- a/crates/common/src/add_order.rs +++ b/crates/common/src/add_order.rs @@ -329,7 +329,8 @@ mod tests { token::Token, }; use rain_orderbook_test_fixtures::LocalEvm; - use std::sync::Arc; + use std::sync::{Arc, RwLock}; + use strict_yaml_rust::StrictYaml; use url::Url; #[test] @@ -428,7 +429,8 @@ price: 2e18; #[tokio::test] async fn test_add_order_random_vault_id_generation() { let network = Network { - name: "test-network".to_string(), + document: Arc::new(RwLock::new(StrictYaml::String("".to_string()))), + key: "test-network".to_string(), rpc: Url::parse("https://some-rpc.com").unwrap(), chain_id: 137, label: None, @@ -526,7 +528,8 @@ _ _: 0 0; async fn test_into_add_order_call() { let local_evm = LocalEvm::new_with_tokens(2).await; let network = Network { - name: "test-network".to_string(), + document: Arc::new(RwLock::new(StrictYaml::String("".to_string()))), + key: "test-network".to_string(), rpc: Url::parse(&local_evm.url()).unwrap(), chain_id: 137, label: None, @@ -658,7 +661,8 @@ _ _: 0 0; #[tokio::test] async fn test_add_order_post_action() { let network = Network { - name: "test-network".to_string(), + document: Arc::new(RwLock::new(StrictYaml::String("".to_string()))), + key: "test-network".to_string(), rpc: Url::parse("https://some-rpc.com").unwrap(), chain_id: 137, label: None, diff --git a/crates/settings/src/lib.rs b/crates/settings/src/lib.rs index a9f8d7f67..d1f047a90 100644 --- a/crates/settings/src/lib.rs +++ b/crates/settings/src/lib.rs @@ -14,6 +14,7 @@ pub mod remote; pub mod scenario; pub mod token; pub mod unit_test; +pub mod yaml; pub(crate) use chart::*; pub(crate) use config_source::*; @@ -26,6 +27,7 @@ pub(crate) use orderbook::*; pub(crate) use plot_source::*; pub(crate) use scenario::*; pub(crate) use token::*; +pub(crate) use yaml::*; #[cfg(test)] pub mod test; diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index 7fd297220..fd4c74d9c 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -1,6 +1,13 @@ -use crate::config_source::*; +use crate::yaml::{optional_string, require_hash, require_string}; +use crate::{config_source::*, yaml::YamlError}; use serde::{Deserialize, Serialize}; -use std::num::ParseIntError; +use std::collections::HashMap; +use std::str::FromStr; +use std::{ + num::ParseIntError, + sync::{Arc, RwLock}, +}; +use strict_yaml_rust::StrictYaml; use thiserror::Error; use typeshare::typeshare; use url::{ParseError, Url}; @@ -9,11 +16,14 @@ use url::{ParseError, Url}; use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; #[typeshare] -#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "kebab-case")] +#[serde(default)] pub struct Network { - pub name: String, + #[serde(skip)] + pub document: Arc>, + pub key: String, #[typeshare(typescript(type = "string"))] #[cfg_attr(target_family = "wasm", tsify(type = "string"))] pub rpc: Url, @@ -27,7 +37,8 @@ pub struct Network { impl Network { pub fn dummy() -> Self { Network { - name: "".to_string(), + document: Arc::new(RwLock::new(StrictYaml::String("".to_string()))), + key: "".to_string(), rpc: Url::parse("http://rpc.com").unwrap(), chain_id: 1, label: None, @@ -35,10 +46,106 @@ impl Network { currency: None, } } + + pub fn parse_networks_from_yaml( + document: Arc>, + ) -> Result, YamlError> { + let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; + + let networks_hash = require_hash( + &document_read, + Some("networks"), + Some("missing field: networks".to_string()), + )?; + + let networks = networks_hash + .into_iter() + .map(|(key, value)| { + let key = key.as_str().unwrap_or_default().to_string(); + let network = Network { + document: document.clone(), + key: key.clone(), + rpc: Url::from_str(&require_string( + &value, + Some("rpc"), + Some(format!("rpc string missing in network: {key}")), + )?) + .map_err(|e| ParseNetworkConfigSourceError::RpcParseError(e))?, + chain_id: require_string( + &value, + Some("chain-id"), + Some(format!( + "chain-id number as string missing in network: {key}" + )), + )? + .parse::() + .map_err(ParseNetworkConfigSourceError::ChainIdParseError)?, + label: optional_string(&value, "label"), + network_id: optional_string(&value, "network-id") + .map(|id| id.parse::()) + .transpose() + .map_err(ParseNetworkConfigSourceError::NetworkIdParseError)?, + currency: optional_string(&value, "currency"), + }; + Ok((key, network)) + }) + .collect::, YamlError>>()?; + + Ok(networks) + } + + pub fn update_rpc(&mut self, rpc: &str) -> Result<(), YamlError> { + let mut document = self + .document + .write() + .map_err(|_| YamlError::WriteLockError)?; + + if let StrictYaml::Hash(ref mut document_hash) = *document { + if let Some(StrictYaml::Hash(ref mut networks)) = + document_hash.get_mut(&StrictYaml::String("networks".to_string())) + { + if let Some(StrictYaml::Hash(ref mut network)) = + networks.get_mut(&StrictYaml::String(self.key.to_string())) + { + network[&StrictYaml::String("rpc".to_string())] = + StrictYaml::String(rpc.to_string()); + self.rpc = + Url::parse(rpc).map_err(ParseNetworkConfigSourceError::RpcParseError)?; + } else { + return Err(YamlError::ParseError(format!( + "missing field: {} in networks", + self.key + ))); + } + } else { + return Err(YamlError::ParseError("missing field: networks".to_string())); + } + } else { + return Err(YamlError::ParseError("document parse error".to_string())); + } + + Ok(()) + } } #[cfg(target_family = "wasm")] impl_all_wasm_traits!(Network); +impl Default for Network { + fn default() -> Self { + Network::dummy() + } +} +impl PartialEq for Network { + fn eq(&self, other: &Self) -> bool { + self.key == other.key + && self.rpc == other.rpc + && self.chain_id == other.chain_id + && self.label == other.label + && self.network_id == other.network_id + && self.currency == other.currency + } +} + #[derive(Error, Debug, PartialEq)] pub enum ParseNetworkConfigSourceError { #[error("Failed to parse rpc: {}", 0)] @@ -50,9 +157,10 @@ pub enum ParseNetworkConfigSourceError { } impl NetworkConfigSource { - pub fn try_into_network(self, name: String) -> Result { + pub fn try_into_network(self, key: String) -> Result { Ok(Network { - name, + document: Arc::new(RwLock::new(StrictYaml::String("".to_string()))), + key, rpc: self.rpc, chain_id: self.chain_id, label: self.label, @@ -65,6 +173,7 @@ impl NetworkConfigSource { #[cfg(test)] mod tests { use super::*; + use strict_yaml_rust::StrictYamlLoader; use url::Url; #[test] @@ -86,6 +195,44 @@ mod tests { assert_eq!(network.network_id, Some(1)); assert_eq!(network.label, Some("Local Testnet".into())); assert_eq!(network.currency, Some("ETH".into())); - assert_eq!(network.name, "local"); + assert_eq!(network.key, "local"); + } + + fn get_document(yaml: &str) -> Arc> { + let document = StrictYamlLoader::load_from_str(yaml).unwrap()[0].clone(); + Arc::new(RwLock::new(document)) + } + + #[test] + fn test_parse_networks_from_yaml() { + let yaml = r#" +test: test +"#; + let error = Network::parse_networks_from_yaml(get_document(yaml)).unwrap_err(); + assert_eq!( + error, + YamlError::ParseError("missing field: networks".to_string()) + ); + + let yaml = r#" +networks: + mainnet: +"#; + let error = Network::parse_networks_from_yaml(get_document(yaml)).unwrap_err(); + assert_eq!( + error, + YamlError::ParseError("rpc string missing in network: mainnet".to_string()) + ); + + let yaml = r#" +networks: + mainnet: + rpc: https://mainnet.infura.io +"#; + let error = Network::parse_networks_from_yaml(get_document(yaml)).unwrap_err(); + assert_eq!( + error, + YamlError::ParseError("chain-id string missing in network: mainnet".to_string()) + ); } } diff --git a/crates/settings/src/test.rs b/crates/settings/src/test.rs index e76b5bcf9..f0201b3ab 100644 --- a/crates/settings/src/test.rs +++ b/crates/settings/src/test.rs @@ -1,11 +1,13 @@ use crate::*; use alloy::primitives::Address; -use std::sync::Arc; +use std::sync::{Arc, RwLock}; +use strict_yaml_rust::StrictYaml; // Helper function to create a mock network pub fn mock_network() -> Arc { Arc::new(Network { - name: "local".into(), + document: Arc::new(RwLock::new(StrictYaml::String("".to_string()))), + key: "local".into(), rpc: ("http://127.0.0.1:8545").parse().unwrap(), chain_id: 1, label: Some("Local Testnet".into()), diff --git a/crates/settings/src/yaml/mod.rs b/crates/settings/src/yaml/mod.rs new file mode 100644 index 000000000..1cf63aaa9 --- /dev/null +++ b/crates/settings/src/yaml/mod.rs @@ -0,0 +1,130 @@ +pub mod orderbook; + +use crate::ParseNetworkConfigSourceError; +use std::sync::{PoisonError, RwLockReadGuard, RwLockWriteGuard}; +use strict_yaml_rust::{ + strict_yaml::{Array, Hash}, + EmitError, ScanError, StrictYaml, StrictYamlLoader, +}; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum YamlError { + #[error(transparent)] + ScanError(#[from] ScanError), + #[error(transparent)] + EmitError(#[from] EmitError), + #[error(transparent)] + RwLockReadGuardError(#[from] PoisonError>), + #[error(transparent)] + RwLockWriteGuardError(#[from] PoisonError>), + #[error("Yaml file is empty")] + EmptyFile, + #[error("Yaml parse error: {0}")] + ParseError(String), + #[error("Missing custom message")] + MissingCustomMsg, + #[error("Key not found: {0}")] + KeyNotFound(String), + #[error("Error while converting to yaml string")] + ConvertError, + #[error("Document read lock error")] + ReadLockError, + #[error("Document write lock error")] + WriteLockError, + #[error(transparent)] + ParseNetworkConfigSourceError(#[from] ParseNetworkConfigSourceError), +} +impl PartialEq for YamlError { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::ScanError(a), Self::ScanError(b)) => a == b, + (Self::EmptyFile, Self::EmptyFile) => true, + (Self::ParseError(a), Self::ParseError(b)) => a == b, + (Self::MissingCustomMsg, Self::MissingCustomMsg) => true, + (Self::KeyNotFound(a), Self::KeyNotFound(b)) => a == b, + (Self::ConvertError, Self::ConvertError) => true, + (Self::ReadLockError, Self::ReadLockError) => true, + (Self::WriteLockError, Self::WriteLockError) => true, + (Self::ParseNetworkConfigSourceError(a), Self::ParseNetworkConfigSourceError(b)) => { + a == b + } + _ => false, + } + } +} + +pub fn load_yaml(yaml: &str) -> Result { + let docs = StrictYamlLoader::load_from_str(yaml)?; + if docs.is_empty() { + return Err(YamlError::EmptyFile); + } + Ok(docs[0].clone()) +} + +pub fn require_string( + value: &StrictYaml, + field: Option<&str>, + custom_msg: Option, +) -> Result { + match field { + Some(field) => value[field].as_str().map(|s| s.to_string()).ok_or_else(|| { + YamlError::ParseError(custom_msg.unwrap_or(format!("{field} must be a string"))) + }), + None => value + .as_str() + .map(|s| s.to_string()) + .ok_or(YamlError::ParseError( + custom_msg.ok_or(YamlError::MissingCustomMsg)?, + )), + } +} +pub fn optional_string(value: &StrictYaml, field: &str) -> Option { + value[field].as_str().map(|s| s.to_string()) +} + +pub fn require_hash<'a>( + value: &'a StrictYaml, + field: Option<&str>, + custom_msg: Option, +) -> Result<&'a Hash, YamlError> { + match field { + Some(field) => value[field].as_hash().ok_or_else(|| { + YamlError::ParseError(custom_msg.unwrap_or(format!("{field} must be a map"))) + }), + None => value.as_hash().ok_or(YamlError::ParseError( + custom_msg.ok_or(YamlError::MissingCustomMsg)?, + )), + } +} +pub fn optional_hash<'a>(value: &'a StrictYaml, field: &str) -> Option<&'a Hash> { + value[field].as_hash() +} + +pub fn get_hash_value<'a>( + hash: &'a Hash, + field: &str, + custom_msg: Option, +) -> Result<&'a StrictYaml, YamlError> { + hash.get(&StrictYaml::String(field.to_string())) + .ok_or(YamlError::ParseError( + custom_msg.unwrap_or(format!("{field} missing in map")), + )) +} + +pub fn get_hash_value_as_option<'a>(hash: &'a Hash, field: &str) -> Option<&'a StrictYaml> { + hash.get(&StrictYaml::String(field.to_string())) +} + +pub fn require_vec<'a>( + value: &'a StrictYaml, + field: &str, + custom_msg: Option, +) -> Result<&'a Array, YamlError> { + value[field].as_vec().ok_or_else(|| { + YamlError::ParseError(custom_msg.unwrap_or(format!("{field} must be a vector"))) + }) +} +pub fn optional_vec<'a>(value: &'a StrictYaml, field: &str) -> Option<&'a Array> { + value[field].as_vec() +} diff --git a/crates/settings/src/yaml/orderbook.rs b/crates/settings/src/yaml/orderbook.rs new file mode 100644 index 000000000..f6713c962 --- /dev/null +++ b/crates/settings/src/yaml/orderbook.rs @@ -0,0 +1,157 @@ +use super::*; +use crate::Network; +use std::sync::{Arc, RwLock}; +use strict_yaml_rust::StrictYamlEmitter; + +#[derive(Debug, Clone)] +pub struct OrderbookYaml { + pub document: Arc>, +} + +impl OrderbookYaml { + pub fn new(source: String, validate: bool) -> Result { + let docs = StrictYamlLoader::load_from_str(&source)?; + if docs.is_empty() { + return Err(YamlError::EmptyFile); + } + let doc = docs[0].clone(); + let document = Arc::new(RwLock::new(doc)); + + if validate { + Network::parse_networks_from_yaml(document.clone())?; + // SubgraphsYaml::try_from_string(&source)?; + // MetaboardsYaml::try_from_string(&source)?; + // OrderbookEntryYaml::try_from_string(&source)?; + // TokenYaml::try_from_string(&source)?; + // DeployerYaml::try_from_string(&source)?; + // AccountsYaml::try_from_string(&source)?; + // SentryYaml::try_from_string(&source)?; + } + Ok(OrderbookYaml { document }) + } + + pub fn get_yaml_string(&self) -> Result { + let document = self.document.read().unwrap(); + let mut out_str = String::new(); + let mut emitter = StrictYamlEmitter::new(&mut out_str); + emitter.dump(&document)?; + Ok(out_str) + } + + pub fn get_network_keys(&self) -> Result, YamlError> { + let networks = Network::parse_networks_from_yaml(self.document.clone())?; + Ok(networks.keys().cloned().collect()) + } + pub fn get_network<'a>(&'a self, key: &str) -> Result { + let networks = Network::parse_networks_from_yaml(self.document.clone())?; + let network = networks + .get(key) + .ok_or(YamlError::KeyNotFound(key.to_string()))?; + Ok(network.clone()) + } +} + +#[cfg(test)] +mod tests { + use url::Url; + + use super::*; + + const FULL_YAML: &str = r#" + networks: + mainnet: + rpc: https://mainnet.infura.io + chain-id: 1 + label: Ethereum Mainnet + network-id: 1 + currency: ETH + subgraphs: + mainnet: https://api.thegraph.com/subgraphs/name/xyz + secondary: https://api.thegraph.com/subgraphs/name/abc + metaboards: + board1: https://meta.example.com/board1 + board2: https://meta.example.com/board2 + orderbooks: + orderbook1: + address: 0x1234567890abcdef + network: mainnet + subgraph: main + label: Primary Orderbook + tokens: + token1: + network: mainnet + address: 0x2345678901abcdef + decimals: 18 + label: Wrapped Ether + symbol: WETH + deployers: + deployer1: + address: 0x3456789012abcdef + network: mainnet + label: Main Deployer + accounts: + admin: 0x4567890123abcdef + user: 0x5678901234abcdef + sentry: true + "#; + + const YAML_WITHOUT_OPTIONAL_FIELDS: &str = r#" + networks: + mainnet: + rpc: https://mainnet.infura.io + chain-id: 1 + subgraphs: + mainnet: https://api.thegraph.com/subgraphs/name/xyz + metaboards: + board1: https://meta.example.com/board1 + orderbooks: + orderbook1: + address: 0x1234567890abcdef + tokens: + token1: + network: mainnet + address: 0x2345678901abcdef + deployers: + deployer1: + address: 0x3456789012abcdef + "#; + + #[test] + fn test_full_yaml() { + let ob_yaml = OrderbookYaml::new(FULL_YAML.to_string(), false).unwrap(); + + assert_eq!(ob_yaml.get_network_keys().unwrap().len(), 1); + let network = ob_yaml.get_network("mainnet").unwrap(); + assert_eq!( + network.rpc, + Url::parse("https://mainnet.infura.io").unwrap() + ); + assert_eq!(network.chain_id, 1); + assert_eq!(network.label, Some("Ethereum Mainnet".to_string())); + assert_eq!(network.network_id, Some(1)); + assert_eq!(network.currency, Some("ETH".to_string())); + + assert!(OrderbookYaml::new(YAML_WITHOUT_OPTIONAL_FIELDS.to_string(), true).is_ok()); + } + + #[test] + fn test_update_network_rpc() { + let ob_yaml = OrderbookYaml::new(FULL_YAML.to_string(), false).unwrap(); + + let mut network = ob_yaml.get_network("mainnet").unwrap(); + assert_eq!( + network.rpc, + Url::parse("https://mainnet.infura.io").unwrap() + ); + + network + .update_rpc("https://some-random-rpc-address.com") + .unwrap(); + + let network = ob_yaml.get_network("mainnet").unwrap(); + assert_eq!( + network.rpc, + Url::parse("https://some-random-rpc-address.com").unwrap() + ); + } +} From aa47b4dbd28fdc19d5a6fd6d51b59e6a47cd6a6a Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 11 Dec 2024 14:56:54 +0300 Subject: [PATCH 02/12] fix field erros --- crates/cli/src/commands/order/orderbook_address.rs | 4 ++-- crates/cli/src/commands/words/mod.rs | 8 ++++---- crates/common/src/dotrain_order/filter.rs | 2 +- crates/common/src/dotrain_order/mod.rs | 4 ++-- crates/settings/src/config.rs | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/cli/src/commands/order/orderbook_address.rs b/crates/cli/src/commands/order/orderbook_address.rs index 5ef93352c..c5ac68d2f 100644 --- a/crates/cli/src/commands/order/orderbook_address.rs +++ b/crates/cli/src/commands/order/orderbook_address.rs @@ -44,11 +44,11 @@ impl Execute for OrderbookAddress { let orderbook_address = if let Some(v) = &deployment_ref.order.orderbook { v.address } else { - let network_name = &deployment_ref.scenario.deployer.network.name; + let network_key = &deployment_ref.scenario.deployer.network.key; order_config .orderbooks .iter() - .find(|(k, v)| *k == network_name || v.network.name == *network_name) + .find(|(k, v)| *k == network_key || v.network.key == *network_key) .ok_or(anyhow!("specified orderbook is undefined!"))? .1 .address diff --git a/crates/cli/src/commands/words/mod.rs b/crates/cli/src/commands/words/mod.rs index 3dd0d7b77..15dd1718a 100644 --- a/crates/cli/src/commands/words/mod.rs +++ b/crates/cli/src/commands/words/mod.rs @@ -111,7 +111,7 @@ impl Execute for Words { order .config() .metaboards - .get(&deployer.network.name) + .get(&deployer.network.key) .map(|v| v.to_string()) }) .ok_or(anyhow!("undefined metaboard subgraph url"))?; @@ -133,7 +133,7 @@ impl Execute for Words { .ok_or(anyhow!("undefined scenario"))? .deployer .network - .name + .key .clone(); order .config_mut() @@ -187,11 +187,11 @@ impl Execute for Words { // set the cli given metaboard url into the config if let Some(v) = &self.metaboard_subgraph { - let network_name = deployment.scenario.deployer.network.name.clone(); + let network_key = deployment.scenario.deployer.network.key.clone(); order .config_mut() .metaboards - .insert(network_name.to_string(), Arc::new(Url::from_str(v)?)); + .insert(network_key.to_string(), Arc::new(Url::from_str(v)?)); } let result = order.get_all_words_for_scenario(&scenario).await?; let mut words = vec![]; diff --git a/crates/common/src/dotrain_order/filter.rs b/crates/common/src/dotrain_order/filter.rs index e73a39114..db1b7e9b9 100644 --- a/crates/common/src/dotrain_order/filter.rs +++ b/crates/common/src/dotrain_order/filter.rs @@ -386,7 +386,7 @@ impl DotrainOrder { // same scenario network name as any previously added network for (chart_key, chart) in &self.config.charts { if chart.scenario.name.split('.').nth(0).unwrap() == scenario_key - || all_network_keys.contains(&chart.scenario.deployer.network.name.as_str()) + || all_network_keys.contains(&chart.scenario.deployer.network.key.as_str()) { new_config_source.charts.insert( chart_key.clone(), diff --git a/crates/common/src/dotrain_order/mod.rs b/crates/common/src/dotrain_order/mod.rs index 63fa7e8f5..c716e5fd5 100644 --- a/crates/common/src/dotrain_order/mod.rs +++ b/crates/common/src/dotrain_order/mod.rs @@ -282,8 +282,8 @@ impl DotrainOrder { let metaboard = self .config .metaboards - .get(&network.name) - .ok_or_else(|| DotrainOrderError::MetaboardNotFound(network.name.clone()))? + .get(&network.key) + .ok_or_else(|| DotrainOrderError::MetaboardNotFound(network.key.clone()))? .clone(); Ok( AuthoringMetaV2::fetch_for_contract(address, rpc.to_string(), metaboard.to_string()) diff --git a/crates/settings/src/config.rs b/crates/settings/src/config.rs index c000aa00f..b8f25a010 100644 --- a/crates/settings/src/config.rs +++ b/crates/settings/src/config.rs @@ -338,7 +338,7 @@ mod tests { Url::parse("https://mainnet.node").unwrap() ); assert_eq!(mainnet_network.chain_id, 1); - assert_eq!(mainnet_network.name, "mainnet".to_string()); + assert_eq!(mainnet_network.key, "mainnet".to_string()); // Verify subgraphs assert_eq!(config.subgraphs.len(), 1); From 28352bafb4562bc19cb79a59c4e6bd616df8e5c9 Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 11 Dec 2024 15:03:53 +0300 Subject: [PATCH 03/12] add trait for parsing yaml --- crates/settings/src/network.rs | 116 ++++++++++++++------------ crates/settings/src/yaml/mod.rs | 16 ++++ crates/settings/src/yaml/orderbook.rs | 13 +-- 3 files changed, 83 insertions(+), 62 deletions(-) diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index fd4c74d9c..8aa3c5bc9 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -1,4 +1,4 @@ -use crate::yaml::{optional_string, require_hash, require_string}; +use crate::yaml::{optional_string, require_hash, require_string, YamlParseable}; use crate::{config_source::*, yaml::YamlError}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -47,53 +47,6 @@ impl Network { } } - pub fn parse_networks_from_yaml( - document: Arc>, - ) -> Result, YamlError> { - let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; - - let networks_hash = require_hash( - &document_read, - Some("networks"), - Some("missing field: networks".to_string()), - )?; - - let networks = networks_hash - .into_iter() - .map(|(key, value)| { - let key = key.as_str().unwrap_or_default().to_string(); - let network = Network { - document: document.clone(), - key: key.clone(), - rpc: Url::from_str(&require_string( - &value, - Some("rpc"), - Some(format!("rpc string missing in network: {key}")), - )?) - .map_err(|e| ParseNetworkConfigSourceError::RpcParseError(e))?, - chain_id: require_string( - &value, - Some("chain-id"), - Some(format!( - "chain-id number as string missing in network: {key}" - )), - )? - .parse::() - .map_err(ParseNetworkConfigSourceError::ChainIdParseError)?, - label: optional_string(&value, "label"), - network_id: optional_string(&value, "network-id") - .map(|id| id.parse::()) - .transpose() - .map_err(ParseNetworkConfigSourceError::NetworkIdParseError)?, - currency: optional_string(&value, "currency"), - }; - Ok((key, network)) - }) - .collect::, YamlError>>()?; - - Ok(networks) - } - pub fn update_rpc(&mut self, rpc: &str) -> Result<(), YamlError> { let mut document = self .document @@ -130,6 +83,63 @@ impl Network { #[cfg(target_family = "wasm")] impl_all_wasm_traits!(Network); +impl YamlParseable for Network { + type Collection = HashMap; + type Item = Network; + + fn parse_all_from_yaml( + document: Arc>, + ) -> Result { + let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; + + let networks_hash = require_hash( + &document_read, + Some("networks"), + Some("missing field: networks".to_string()), + )?; + + networks_hash + .into_iter() + .map(|(key, value)| { + let key = key.as_str().unwrap_or_default().to_string(); + let network = Self::parse_from_yaml(document.clone(), key.clone(), value)?; + Ok((key, network)) + }) + .collect() + } + + fn parse_from_yaml( + document: Arc>, + key: String, + value: &StrictYaml, + ) -> Result { + Ok(Network { + document, + key: key.clone(), + rpc: Url::from_str(&require_string( + value, + Some("rpc"), + Some(format!("rpc string missing in network: {key}")), + )?) + .map_err(|e| ParseNetworkConfigSourceError::RpcParseError(e))?, + chain_id: require_string( + value, + Some("chain-id"), + Some(format!( + "chain-id number as string missing in network: {key}" + )), + )? + .parse::() + .map_err(ParseNetworkConfigSourceError::ChainIdParseError)?, + label: optional_string(value, "label"), + network_id: optional_string(value, "network-id") + .map(|id| id.parse::()) + .transpose() + .map_err(ParseNetworkConfigSourceError::NetworkIdParseError)?, + currency: optional_string(value, "currency"), + }) + } +} impl Default for Network { fn default() -> Self { Network::dummy() @@ -208,7 +218,7 @@ mod tests { let yaml = r#" test: test "#; - let error = Network::parse_networks_from_yaml(get_document(yaml)).unwrap_err(); + let error = Network::parse_all_from_yaml(get_document(yaml)).unwrap_err(); assert_eq!( error, YamlError::ParseError("missing field: networks".to_string()) @@ -218,7 +228,7 @@ test: test networks: mainnet: "#; - let error = Network::parse_networks_from_yaml(get_document(yaml)).unwrap_err(); + let error = Network::parse_all_from_yaml(get_document(yaml)).unwrap_err(); assert_eq!( error, YamlError::ParseError("rpc string missing in network: mainnet".to_string()) @@ -229,10 +239,12 @@ networks: mainnet: rpc: https://mainnet.infura.io "#; - let error = Network::parse_networks_from_yaml(get_document(yaml)).unwrap_err(); + let error = Network::parse_all_from_yaml(get_document(yaml)).unwrap_err(); assert_eq!( error, - YamlError::ParseError("chain-id string missing in network: mainnet".to_string()) + YamlError::ParseError( + "chain-id number as string missing in network: mainnet".to_string() + ) ); } } diff --git a/crates/settings/src/yaml/mod.rs b/crates/settings/src/yaml/mod.rs index 1cf63aaa9..ef35cd5e3 100644 --- a/crates/settings/src/yaml/mod.rs +++ b/crates/settings/src/yaml/mod.rs @@ -1,6 +1,7 @@ pub mod orderbook; use crate::ParseNetworkConfigSourceError; +use std::sync::{Arc, RwLock}; use std::sync::{PoisonError, RwLockReadGuard, RwLockWriteGuard}; use strict_yaml_rust::{ strict_yaml::{Array, Hash}, @@ -8,6 +9,21 @@ use strict_yaml_rust::{ }; use thiserror::Error; +pub trait YamlParseable { + type Collection; + type Item; + + fn parse_all_from_yaml( + document: Arc>, + ) -> Result; + + fn parse_from_yaml( + document: Arc>, + key: String, + value: &StrictYaml, + ) -> Result; +} + #[derive(Debug, Error)] pub enum YamlError { #[error(transparent)] diff --git a/crates/settings/src/yaml/orderbook.rs b/crates/settings/src/yaml/orderbook.rs index f6713c962..610fbc19a 100644 --- a/crates/settings/src/yaml/orderbook.rs +++ b/crates/settings/src/yaml/orderbook.rs @@ -18,14 +18,7 @@ impl OrderbookYaml { let document = Arc::new(RwLock::new(doc)); if validate { - Network::parse_networks_from_yaml(document.clone())?; - // SubgraphsYaml::try_from_string(&source)?; - // MetaboardsYaml::try_from_string(&source)?; - // OrderbookEntryYaml::try_from_string(&source)?; - // TokenYaml::try_from_string(&source)?; - // DeployerYaml::try_from_string(&source)?; - // AccountsYaml::try_from_string(&source)?; - // SentryYaml::try_from_string(&source)?; + Network::parse_all_from_yaml(document.clone())?; } Ok(OrderbookYaml { document }) } @@ -39,11 +32,11 @@ impl OrderbookYaml { } pub fn get_network_keys(&self) -> Result, YamlError> { - let networks = Network::parse_networks_from_yaml(self.document.clone())?; + let networks = Network::parse_all_from_yaml(self.document.clone())?; Ok(networks.keys().cloned().collect()) } pub fn get_network<'a>(&'a self, key: &str) -> Result { - let networks = Network::parse_networks_from_yaml(self.document.clone())?; + let networks = Network::parse_all_from_yaml(self.document.clone())?; let network = networks .get(key) .ok_or(YamlError::KeyNotFound(key.to_string()))?; From d98893d1fab9f882b5028cf730376359bc1f2c1b Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 11 Dec 2024 15:10:07 +0300 Subject: [PATCH 04/12] fix errors --- crates/settings/src/lib.rs | 1 - crates/settings/src/network.rs | 2 +- crates/settings/src/yaml/orderbook.rs | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/settings/src/lib.rs b/crates/settings/src/lib.rs index d1f047a90..dfcb6805e 100644 --- a/crates/settings/src/lib.rs +++ b/crates/settings/src/lib.rs @@ -27,7 +27,6 @@ pub(crate) use orderbook::*; pub(crate) use plot_source::*; pub(crate) use scenario::*; pub(crate) use token::*; -pub(crate) use yaml::*; #[cfg(test)] pub mod test; diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index 8aa3c5bc9..8cb6c1a30 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -121,7 +121,7 @@ impl YamlParseable for Network { Some("rpc"), Some(format!("rpc string missing in network: {key}")), )?) - .map_err(|e| ParseNetworkConfigSourceError::RpcParseError(e))?, + .map_err(ParseNetworkConfigSourceError::RpcParseError)?, chain_id: require_string( value, Some("chain-id"), diff --git a/crates/settings/src/yaml/orderbook.rs b/crates/settings/src/yaml/orderbook.rs index 610fbc19a..aa64f7187 100644 --- a/crates/settings/src/yaml/orderbook.rs +++ b/crates/settings/src/yaml/orderbook.rs @@ -35,7 +35,7 @@ impl OrderbookYaml { let networks = Network::parse_all_from_yaml(self.document.clone())?; Ok(networks.keys().cloned().collect()) } - pub fn get_network<'a>(&'a self, key: &str) -> Result { + pub fn get_network(&self, key: &str) -> Result { let networks = Network::parse_all_from_yaml(self.document.clone())?; let network = networks .get(key) From af55c4a3bd1920ad94e6c979151cf70e2f0ad183 Mon Sep 17 00:00:00 2001 From: findolor Date: Thu, 12 Dec 2024 16:29:55 +0300 Subject: [PATCH 05/12] add more traits --- crates/settings/src/network.rs | 87 +++++++++++++++++---------------- crates/settings/src/yaml/mod.rs | 21 ++++---- 2 files changed, 57 insertions(+), 51 deletions(-) diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index 8cb6c1a30..5c6111abc 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -1,5 +1,5 @@ -use crate::yaml::{optional_string, require_hash, require_string, YamlParseable}; -use crate::{config_source::*, yaml::YamlError}; +use crate::config_source::*; +use crate::yaml::{optional_string, require_hash, require_string, YamlError, YamlParsableHash}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::str::FromStr; @@ -83,15 +83,13 @@ impl Network { #[cfg(target_family = "wasm")] impl_all_wasm_traits!(Network); -impl YamlParseable for Network { - type Collection = HashMap; +impl YamlParsableHash for Network { type Item = Network; fn parse_all_from_yaml( document: Arc>, - ) -> Result { + ) -> Result, YamlError> { let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; - let networks_hash = require_hash( &document_read, Some("networks"), @@ -100,46 +98,51 @@ impl YamlParseable for Network { networks_hash .into_iter() - .map(|(key, value)| { - let key = key.as_str().unwrap_or_default().to_string(); - let network = Self::parse_from_yaml(document.clone(), key.clone(), value)?; - Ok((key, network)) + .map(|(key_yaml, network_yaml)| { + let network_key = key_yaml.as_str().unwrap_or_default().to_string(); + + let rpc_url = Url::from_str(&require_string( + network_yaml, + Some("rpc"), + Some(format!("rpc string missing in network: {network_key}")), + )?) + .map_err(|e| ParseNetworkConfigSourceError::RpcParseError(e))?; + + let chain_id = require_string( + network_yaml, + Some("chain-id"), + Some(format!( + "chain-id number as string missing in network: {network_key}" + )), + )? + .parse::() + .map_err(ParseNetworkConfigSourceError::ChainIdParseError)?; + + let label = optional_string(network_yaml, "label"); + + let network_id = optional_string(network_yaml, "network-id") + .map(|id| id.parse::()) + .transpose() + .map_err(ParseNetworkConfigSourceError::NetworkIdParseError)?; + + let currency = optional_string(network_yaml, "currency"); + + let network = Network { + document: document.clone(), + key: network_key.clone(), + rpc: rpc_url, + chain_id, + label, + network_id, + currency, + }; + + Ok((network_key, network)) }) .collect() } - - fn parse_from_yaml( - document: Arc>, - key: String, - value: &StrictYaml, - ) -> Result { - Ok(Network { - document, - key: key.clone(), - rpc: Url::from_str(&require_string( - value, - Some("rpc"), - Some(format!("rpc string missing in network: {key}")), - )?) - .map_err(ParseNetworkConfigSourceError::RpcParseError)?, - chain_id: require_string( - value, - Some("chain-id"), - Some(format!( - "chain-id number as string missing in network: {key}" - )), - )? - .parse::() - .map_err(ParseNetworkConfigSourceError::ChainIdParseError)?, - label: optional_string(value, "label"), - network_id: optional_string(value, "network-id") - .map(|id| id.parse::()) - .transpose() - .map_err(ParseNetworkConfigSourceError::NetworkIdParseError)?, - currency: optional_string(value, "currency"), - }) - } } + impl Default for Network { fn default() -> Self { Network::dummy() diff --git a/crates/settings/src/yaml/mod.rs b/crates/settings/src/yaml/mod.rs index ef35cd5e3..80ffc78a3 100644 --- a/crates/settings/src/yaml/mod.rs +++ b/crates/settings/src/yaml/mod.rs @@ -1,6 +1,7 @@ pub mod orderbook; use crate::ParseNetworkConfigSourceError; +use std::collections::HashMap; use std::sync::{Arc, RwLock}; use std::sync::{PoisonError, RwLockReadGuard, RwLockWriteGuard}; use strict_yaml_rust::{ @@ -9,19 +10,21 @@ use strict_yaml_rust::{ }; use thiserror::Error; -pub trait YamlParseable { - type Collection; +pub trait YamlParsableHash { type Item; - fn parse_all_from_yaml( document: Arc>, - ) -> Result; + ) -> Result, YamlError>; +} - fn parse_from_yaml( - document: Arc>, - key: String, - value: &StrictYaml, - ) -> Result; +pub trait YamlParsableVector { + type Item; + fn parse_all_from_yaml(document: Arc>) + -> Result, YamlError>; +} + +pub trait YamlParsableString { + fn parse_from_yaml(document: Arc>) -> Result; } #[derive(Debug, Error)] From b15e4d626a2a48a2fdcda0a2ca2eee067b5af4b0 Mon Sep 17 00:00:00 2001 From: findolor Date: Thu, 12 Dec 2024 16:33:09 +0300 Subject: [PATCH 06/12] use self for function return type --- crates/settings/src/network.rs | 4 +--- crates/settings/src/yaml/mod.rs | 11 ++++------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index 5c6111abc..fc8a74b9c 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -84,11 +84,9 @@ impl Network { impl_all_wasm_traits!(Network); impl YamlParsableHash for Network { - type Item = Network; - fn parse_all_from_yaml( document: Arc>, - ) -> Result, YamlError> { + ) -> Result, YamlError> { let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; let networks_hash = require_hash( &document_read, diff --git a/crates/settings/src/yaml/mod.rs b/crates/settings/src/yaml/mod.rs index 80ffc78a3..866fe0ace 100644 --- a/crates/settings/src/yaml/mod.rs +++ b/crates/settings/src/yaml/mod.rs @@ -10,17 +10,14 @@ use strict_yaml_rust::{ }; use thiserror::Error; -pub trait YamlParsableHash { - type Item; +pub trait YamlParsableHash: Sized { fn parse_all_from_yaml( document: Arc>, - ) -> Result, YamlError>; + ) -> Result, YamlError>; } -pub trait YamlParsableVector { - type Item; - fn parse_all_from_yaml(document: Arc>) - -> Result, YamlError>; +pub trait YamlParsableVector: Sized { + fn parse_all_from_yaml(document: Arc>) -> Result, YamlError>; } pub trait YamlParsableString { From 60ed0c1824d508601e2e692a49cca08e1265e94a Mon Sep 17 00:00:00 2001 From: findolor Date: Thu, 12 Dec 2024 16:34:07 +0300 Subject: [PATCH 07/12] fix closure error --- crates/settings/src/network.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index fc8a74b9c..37e2330c7 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -104,7 +104,7 @@ impl YamlParsableHash for Network { Some("rpc"), Some(format!("rpc string missing in network: {network_key}")), )?) - .map_err(|e| ParseNetworkConfigSourceError::RpcParseError(e))?; + .map_err(ParseNetworkConfigSourceError::RpcParseError)?; let chain_id = require_string( network_yaml, From bffcaa94d1f33f3c0c85a9b33dd67915b3d4dde6 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 13 Dec 2024 12:22:40 +0300 Subject: [PATCH 08/12] fix CI error --- packages/webapp/src/routes/deployment/+page.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/routes/deployment/+page.svelte b/packages/webapp/src/routes/deployment/+page.svelte index 8d263f977..c7457a600 100644 --- a/packages/webapp/src/routes/deployment/+page.svelte +++ b/packages/webapp/src/routes/deployment/+page.svelte @@ -131,7 +131,9 @@ // @ts-expect-error window.ethereum is not typed await window.ethereum?.request({ method: 'eth_requestAccounts' }); const walletClient = createWalletClient({ - chain: getChainById(gui.getCurrentDeployment().deployment.order.network['chain-id']), + chain: getChainById( + gui.getCurrentDeployment().deployment.order.network['chain-id'] as number + ), // @ts-expect-error window.ethereum is not typed transport: custom(window.ethereum!) }); From 3db17f27f207ea7476e849b48fb4b6ad1ab9f5d0 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 13 Dec 2024 12:38:40 +0300 Subject: [PATCH 09/12] return self in setter function --- crates/settings/src/network.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index 37e2330c7..d6e147636 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -47,7 +47,7 @@ impl Network { } } - pub fn update_rpc(&mut self, rpc: &str) -> Result<(), YamlError> { + pub fn update_rpc(&mut self, rpc: &str) -> Result { let mut document = self .document .write() @@ -77,7 +77,7 @@ impl Network { return Err(YamlError::ParseError("document parse error".to_string())); } - Ok(()) + Ok(self.clone()) } } #[cfg(target_family = "wasm")] From d70a9668bd17daf20e0d094c46e7618999bd2056 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 13 Dec 2024 13:19:50 +0300 Subject: [PATCH 10/12] use helpers for field validations --- crates/settings/src/network.rs | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index d6e147636..6d3452737 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -2,7 +2,6 @@ use crate::config_source::*; use crate::yaml::{optional_string, require_hash, require_string, YamlError, YamlParsableHash}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use std::str::FromStr; use std::{ num::ParseIntError, sync::{Arc, RwLock}, @@ -47,6 +46,20 @@ impl Network { } } + pub fn validate_rpc(value: &str) -> Result { + Url::parse(value).map_err(ParseNetworkConfigSourceError::RpcParseError) + } + pub fn validate_chain_id(value: &str) -> Result { + value + .parse::() + .map_err(ParseNetworkConfigSourceError::ChainIdParseError) + } + pub fn validate_network_id(value: &str) -> Result { + value + .parse::() + .map_err(ParseNetworkConfigSourceError::NetworkIdParseError) + } + pub fn update_rpc(&mut self, rpc: &str) -> Result { let mut document = self .document @@ -62,8 +75,7 @@ impl Network { { network[&StrictYaml::String("rpc".to_string())] = StrictYaml::String(rpc.to_string()); - self.rpc = - Url::parse(rpc).map_err(ParseNetworkConfigSourceError::RpcParseError)?; + self.rpc = Network::validate_rpc(rpc)?; } else { return Err(YamlError::ParseError(format!( "missing field: {} in networks", @@ -99,29 +111,25 @@ impl YamlParsableHash for Network { .map(|(key_yaml, network_yaml)| { let network_key = key_yaml.as_str().unwrap_or_default().to_string(); - let rpc_url = Url::from_str(&require_string( + let rpc_url = Network::validate_rpc(&require_string( network_yaml, Some("rpc"), Some(format!("rpc string missing in network: {network_key}")), - )?) - .map_err(ParseNetworkConfigSourceError::RpcParseError)?; + )?)?; - let chain_id = require_string( + let chain_id = Network::validate_chain_id(&require_string( network_yaml, Some("chain-id"), Some(format!( "chain-id number as string missing in network: {network_key}" )), - )? - .parse::() - .map_err(ParseNetworkConfigSourceError::ChainIdParseError)?; + )?)?; let label = optional_string(network_yaml, "label"); let network_id = optional_string(network_yaml, "network-id") - .map(|id| id.parse::()) - .transpose() - .map_err(ParseNetworkConfigSourceError::NetworkIdParseError)?; + .map(|id| Network::validate_network_id(&id)) + .transpose()?; let currency = optional_string(network_yaml, "currency"); From e5b1f6b91587d74c95b43f6234455aca62f768a2 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 13 Dec 2024 17:34:04 +0300 Subject: [PATCH 11/12] fix field naming --- .../src/lib/components/ModalExecute.svelte | 2 +- .../src/lib/components/ModalExecute.test.ts | 4 +-- tauri-app/src/lib/services/pickConfig.ts | 4 +-- tauri-app/src/tests/pickConfig.test.ts | 32 +++++++++---------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/tauri-app/src/lib/components/ModalExecute.svelte b/tauri-app/src/lib/components/ModalExecute.svelte index 07410ab37..9850b6397 100644 --- a/tauri-app/src/lib/components/ModalExecute.svelte +++ b/tauri-app/src/lib/components/ModalExecute.svelte @@ -110,7 +110,7 @@ {#if $walletconnectAccount && $walletConnectNetwork !== chainId}
You are connected to {getNetworkName($walletConnectNetwork)} network. Please connect your wallet - to {overrideNetwork?.name || $activeNetworkRef} network. + to {overrideNetwork?.key || $activeNetworkRef} network.
{/if} diff --git a/tauri-app/src/lib/components/ModalExecute.test.ts b/tauri-app/src/lib/components/ModalExecute.test.ts index a47bdf8d6..f2f1c5736 100644 --- a/tauri-app/src/lib/components/ModalExecute.test.ts +++ b/tauri-app/src/lib/components/ModalExecute.test.ts @@ -34,7 +34,7 @@ describe('ModalExecute', () => { executeWalletconnect: vi.fn(), isSubmitting: false, overrideNetwork: { - name: 'test', + key: 'test', rpc: 'https://test.com', 'chain-id': 2, }, @@ -66,7 +66,7 @@ describe('ModalExecute', () => { executeWalletconnect: vi.fn(), isSubmitting: false, overrideNetwork: { - name: 'test', + key: 'test', rpc: 'https://test.com', 'chain-id': 2, }, diff --git a/tauri-app/src/lib/services/pickConfig.ts b/tauri-app/src/lib/services/pickConfig.ts index ca432f586..7154c738a 100644 --- a/tauri-app/src/lib/services/pickConfig.ts +++ b/tauri-app/src/lib/services/pickConfig.ts @@ -11,7 +11,7 @@ export function pickDeployments( !isNil(mergedConfigSource?.orders) ? pickBy( mergedConfigSource.deployments, - (d) => mergedConfig?.scenarios?.[d.scenario]?.deployer?.network?.name === activeNetworkRef, + (d) => mergedConfig?.scenarios?.[d.scenario]?.deployer?.network?.key === activeNetworkRef, ) : {}; } @@ -21,6 +21,6 @@ export function pickScenarios( activeNetworkRef: string | undefined, ) { return !isNil(mergedConfig) - ? pickBy(mergedConfig.scenarios, (d) => d?.deployer?.network?.name === activeNetworkRef) + ? pickBy(mergedConfig.scenarios, (d) => d?.deployer?.network?.key === activeNetworkRef) : {}; } diff --git a/tauri-app/src/tests/pickConfig.test.ts b/tauri-app/src/tests/pickConfig.test.ts index ffcb4d473..f3dc5c430 100644 --- a/tauri-app/src/tests/pickConfig.test.ts +++ b/tauri-app/src/tests/pickConfig.test.ts @@ -6,12 +6,12 @@ import type { Config, ConfigSource, DeploymentConfigSource, Scenario } from '$li export const config: Config = { networks: { network1: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, network2: { - name: 'network2', + key: 'network2', rpc: 'rpc-url', 'chain-id': 137, }, @@ -26,7 +26,7 @@ export const config: Config = { network1: { address: '0x123456', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -37,7 +37,7 @@ export const config: Config = { network1: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -49,7 +49,7 @@ export const config: Config = { inputs: [], outputs: [], network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -58,7 +58,7 @@ export const config: Config = { inputs: [], outputs: [], network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -71,7 +71,7 @@ export const config: Config = { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -83,7 +83,7 @@ export const config: Config = { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -95,7 +95,7 @@ export const config: Config = { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -111,7 +111,7 @@ export const config: Config = { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -121,7 +121,7 @@ export const config: Config = { inputs: [], outputs: [], network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -134,7 +134,7 @@ export const config: Config = { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -144,7 +144,7 @@ export const config: Config = { inputs: [], outputs: [], network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -259,7 +259,7 @@ test('pick scenarios', () => { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -271,7 +271,7 @@ test('pick scenarios', () => { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, @@ -283,7 +283,7 @@ test('pick scenarios', () => { deployer: { address: '0xabcdef', network: { - name: 'network1', + key: 'network1', rpc: 'rpc-url', 'chain-id': 14, }, From c8da7eb75a5fb252593f8e632770c71242fa8167 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 13 Dec 2024 17:34:15 +0300 Subject: [PATCH 12/12] add additional test --- crates/settings/src/yaml/orderbook.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/settings/src/yaml/orderbook.rs b/crates/settings/src/yaml/orderbook.rs index aa64f7187..2531c8430 100644 --- a/crates/settings/src/yaml/orderbook.rs +++ b/crates/settings/src/yaml/orderbook.rs @@ -137,9 +137,13 @@ mod tests { Url::parse("https://mainnet.infura.io").unwrap() ); - network + let network = network .update_rpc("https://some-random-rpc-address.com") .unwrap(); + assert_eq!( + network.rpc, + Url::parse("https://some-random-rpc-address.com").unwrap() + ); let network = ob_yaml.get_network("mainnet").unwrap(); assert_eq!(