From c7f34d04c0dbcfece76f3e05165931ee6dac4638 Mon Sep 17 00:00:00 2001 From: durch Date: Mon, 12 May 2025 17:51:34 +0200 Subject: [PATCH 01/25] Support submitting to multiple APIs --- nym-network-monitor/Cargo.toml | 2 +- nym-network-monitor/src/accounting.rs | 93 ++++++++++++++------------- nym-network-monitor/src/main.rs | 12 ++-- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/nym-network-monitor/Cargo.toml b/nym-network-monitor/Cargo.toml index c693cb5b199..63d1f37559d 100644 --- a/nym-network-monitor/Cargo.toml +++ b/nym-network-monitor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-monitor" -version = "1.0.2" +version = "1.1.0" authors.workspace = true repository.workspace = true homepage.workspace = true diff --git a/nym-network-monitor/src/accounting.rs b/nym-network-monitor/src/accounting.rs index 157bbc7c17f..97938773e1f 100644 --- a/nym-network-monitor/src/accounting.rs +++ b/nym-network-monitor/src/accounting.rs @@ -17,7 +17,7 @@ use tokio::task::JoinHandle; use tokio_postgres::{binary_copy::BinaryCopyInWriter, types::Type, Client, NoTls}; use utoipa::ToSchema; -use crate::{NYM_API_URL, PRIVATE_KEY, TOPOLOGY}; +use crate::{NYM_API_URLS, PRIVATE_KEY, TOPOLOGY}; struct HydratedRoute { mix_nodes: Vec, @@ -491,49 +491,54 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> } if let Some(private_key) = PRIVATE_KEY.get() { - let node_stats = monitor_mixnode_results().await?; - let gateway_stats = monitor_gateway_results().await?; - - info!("Submitting metrics to {}", *NYM_API_URL); - let client = reqwest::Client::new(); - - let node_submit_url = format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_NODE}", &*NYM_API_URL); - let gateway_submit_url = - format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_GATEWAY}", &*NYM_API_URL); - - info!("Submitting {} mixnode measurements", node_stats.len()); - - node_stats - .chunks(10) - .map(|chunk| { - let monitor_message = MonitorMessage::new(chunk.to_vec(), private_key); - client.post(&node_submit_url).json(&monitor_message).send() - }) - .collect::>() - .collect::>>() - .await - .into_iter() - .collect::, _>>()?; - - info!("Submitting {} gateway measurements", gateway_stats.len()); - - gateway_stats - .chunks(10) - .map(|chunk| { - let monitor_message = MonitorMessage::new( - chunk.to_vec(), - PRIVATE_KEY.get().expect("We've set this!"), - ); - client - .post(&gateway_submit_url) - .json(&monitor_message) - .send() - }) - .collect::>() - .collect::>>() - .await - .into_iter() - .collect::, _>>()?; + if let Some(nym_api_urls) = NYM_API_URLS.get() { + for nym_api_url in nym_api_urls { + let node_stats = monitor_mixnode_results().await?; + let gateway_stats = monitor_gateway_results().await?; + + info!("Submitting metrics to {}", nym_api_url); + let client = reqwest::Client::new(); + + let node_submit_url = + format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_NODE}", nym_api_url); + let gateway_submit_url = + format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_GATEWAY}", nym_api_url); + + info!("Submitting {} mixnode measurements", node_stats.len()); + + node_stats + .chunks(10) + .map(|chunk| { + let monitor_message = MonitorMessage::new(chunk.to_vec(), private_key); + client.post(&node_submit_url).json(&monitor_message).send() + }) + .collect::>() + .collect::>>() + .await + .into_iter() + .collect::, _>>()?; + + info!("Submitting {} gateway measurements", gateway_stats.len()); + + gateway_stats + .chunks(10) + .map(|chunk| { + let monitor_message = MonitorMessage::new( + chunk.to_vec(), + PRIVATE_KEY.get().expect("We've set this!"), + ); + client + .post(&gateway_submit_url) + .json(&monitor_message) + .send() + }) + .collect::>() + .collect::>>() + .await + .into_iter() + .collect::, _>>()?; + } + } } NetworkAccount::empty_buffers(); diff --git a/nym-network-monitor/src/main.rs b/nym-network-monitor/src/main.rs index b1cedea18c3..5110cc226b2 100644 --- a/nym-network-monitor/src/main.rs +++ b/nym-network-monitor/src/main.rs @@ -13,7 +13,6 @@ use nym_sphinx::chunking::monitoring; use nym_topology::{HardcodedTopologyProvider, NymTopology}; use std::fs::File; use std::io::Write; -use std::sync::LazyLock; use std::time::Duration; use std::{ collections::VecDeque, @@ -25,9 +24,7 @@ use tokio::sync::OnceCell; use tokio::{signal::ctrl_c, sync::RwLock}; use tokio_util::sync::CancellationToken; -static NYM_API_URL: LazyLock = LazyLock::new(|| { - std::env::var(NYM_API).unwrap_or_else(|_| panic!("{} env var not set", NYM_API)) -}); +static NYM_API_URLS: OnceCell> = OnceCell::const_new(); static MIXNET_TIMEOUT: OnceCell = OnceCell::const_new(); static TOPOLOGY: OnceCell = OnceCell::const_new(); @@ -138,6 +135,9 @@ struct Args { #[arg(long, env = "DATABASE_URL")] database_url: Option, + + #[arg(long, env = "NYM_APIS")] + nym_apis: Option>, } fn generate_key_pair() -> Result<()> { @@ -200,6 +200,10 @@ async fn main() -> Result<()> { PRIVATE_KEY.set(pk).ok(); } + if let Some(nym_apis) = args.nym_apis { + NYM_API_URLS.set(nym_apis).ok(); + } + TOPOLOGY .set(if let Some(topology_file) = args.topology { NymTopology::new_from_file(topology_file)? From 9c7d79683be68c9db0b27a2b97c7c049c14e26c4 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 13 May 2025 10:46:25 +0200 Subject: [PATCH 02/25] Force routing through all nodes --- common/topology/src/lib.rs | 4 ++++ nym-network-monitor/src/main.rs | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index 1dc0fa695b1..6ba706f6ead 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -224,6 +224,10 @@ impl NymTopology { serde_json::from_reader(file).map_err(Into::into) } + pub fn node_details(&self) -> &HashMap { + &self.node_details + } + pub fn add_skimmed_nodes(&mut self, nodes: &[SkimmedNode]) { self.add_additional_nodes(nodes.iter()) } diff --git a/nym-network-monitor/src/main.rs b/nym-network-monitor/src/main.rs index 5110cc226b2..db41b13e34c 100644 --- a/nym-network-monitor/src/main.rs +++ b/nym-network-monitor/src/main.rs @@ -10,7 +10,7 @@ use nym_network_defaults::setup_env; use nym_network_defaults::var_names::NYM_API; use nym_sdk::mixnet::{self, MixnetClient}; use nym_sphinx::chunking::monitoring; -use nym_topology::{HardcodedTopologyProvider, NymTopology}; +use nym_topology::{HardcodedTopologyProvider, NymTopology, Role}; use std::fs::File; use std::io::Write; use std::time::Duration; @@ -155,7 +155,7 @@ fn generate_key_pair() -> Result<()> { Ok(()) } -async fn nym_topology_from_env() -> anyhow::Result { +async fn nym_topology_forced_all_from_env() -> anyhow::Result { let api_url = std::env::var(NYM_API)?; info!("Generating topology from {api_url}"); @@ -172,6 +172,18 @@ async fn nym_topology_from_env() -> anyhow::Result { let mut topology = NymTopology::new_empty(rewarded_set); topology.add_skimmed_nodes(&nodes); + let node_ids = topology.node_details().keys().cloned().collect::>(); + + // Force all nodes to active to participate in route selection + for (idx, node_id) in node_ids.iter().enumerate() { + match idx % 3 { + 0 => topology.force_set_active(*node_id, Role::Layer1), + 1 => topology.force_set_active(*node_id, Role::Layer2), + 2 => topology.force_set_active(*node_id, Role::Layer3), + _ => unreachable!(), // Unreachable since idx % 3 can only be 0, 1, or 2 + } + } + Ok(topology) } @@ -208,7 +220,7 @@ async fn main() -> Result<()> { .set(if let Some(topology_file) = args.topology { NymTopology::new_from_file(topology_file)? } else { - nym_topology_from_env().await? + nym_topology_forced_all_from_env().await? }) .ok(); From fcffebfe450b2e15cbaf12e4a597e8c8afca7869 Mon Sep 17 00:00:00 2001 From: durch Date: Thu, 15 May 2025 13:10:54 +0200 Subject: [PATCH 03/25] Raw route handling and reliability corrections --- .gitignore | 1 + Cargo.lock | 1112 ++++++++--------- common/types/src/monitoring.rs | 35 +- ...bad1e16988a3f9989d135840500e1143ce5e5.json | 32 - ...afa2525da6c0b871633aad80ad555db9cf47c.json | 32 - ...3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json | 12 - ...765854899103fd3c0fa670eb6809492270e02.json | 12 - ...2038a77ec37cca9f9aef18008dcd03030c2c4.json | 12 - ...e38b7f6ceb8e9191a7b9201922efcf6b07966.json | 12 - ...58c7a27b8c303bfa079cf74909354202dcc49.json | 12 + ...4d63462e9ea0049e2edafea1dc3f8476b33e4.json | 12 - ...de3eb76fed954b7336530401db72cd008aff3.json | 12 - ...15dcfcffb502ba8398caefd56c481f44eb84e.json | 12 - ...eafc9b5f64061b6c9a829e2912945b6cffc82.json | 32 - ...89dde284b38a3a4960afed758206d03ca1cf4.json | 12 - ...b253c071e04eb853d4b0f3b21782ea57c2f68.json | 12 - .../20250513104800_routes_table.sql | 16 + .../handlers/without_monitor.rs | 103 +- nym-api/src/support/storage/manager.rs | 180 ++- nym-api/src/support/storage/mod.rs | 12 +- nym-network-monitor/main-1747305481101.py | 104 ++ nym-network-monitor/src/accounting.rs | 32 +- 22 files changed, 1000 insertions(+), 811 deletions(-) delete mode 100644 nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json delete mode 100644 nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json delete mode 100644 nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json delete mode 100644 nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json delete mode 100644 nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json delete mode 100644 nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json create mode 100644 nym-api/.sqlx/query-66109c1d856e1ca2b5126e4bf4c58c7a27b8c303bfa079cf74909354202dcc49.json delete mode 100644 nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json delete mode 100644 nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json delete mode 100644 nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json delete mode 100644 nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json delete mode 100644 nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json delete mode 100644 nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json create mode 100644 nym-api/migrations/20250513104800_routes_table.sql create mode 100644 nym-network-monitor/main-1747305481101.py diff --git a/.gitignore b/.gitignore index 6eba9a6ef25..211bcf24d87 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ nym-api/redocly/formatted-openapi.json **/settings.sql **/enter_db.sh +CLAUDE.md \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 7b663ebae4e..3dde394738b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,14 +4,14 @@ version = 3 [[package]] name = "accessory" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb3791c4beae5b827e93558ac83a88e63a841aad61759a05d9b577ef16030470" +checksum = "28e416a3ab45838bac2ab2d81b1088d738d7b2d2c5272a54d39366565a29bd80" dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -91,15 +91,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.3.3", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -207,12 +207,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] @@ -409,7 +409,7 @@ dependencies = [ "rustc-hash", "serde", "serde_derive", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -447,9 +447,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.18" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07" dependencies = [ "brotli", "flate2", @@ -472,17 +472,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -502,7 +491,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -513,7 +502,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -712,7 +701,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -747,9 +736,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -786,9 +775,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "base85rs" @@ -798,9 +787,9 @@ checksum = "87678d33a2af71f019ed11f52db246ca6c5557edee2cccbe689676d1ad9c6b5a" [[package]] name = "basic-toml" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" dependencies = [ "serde", ] @@ -875,9 +864,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -917,9 +906,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.7.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -962,7 +951,7 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f6d7f06817e48ea4e17532fa61bc4e8b9a101437f0623f69d2ea54284f3a817" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "siphasher 1.0.1", ] @@ -990,9 +979,9 @@ checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790" [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1001,9 +990,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1058,9 +1047,9 @@ dependencies = [ [[package]] name = "bytesize" -version = "1.3.2" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" +checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659" [[package]] name = "camino" @@ -1122,9 +1111,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.2.14" +version = "1.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" dependencies = [ "jobserver", "libc", @@ -1163,6 +1152,15 @@ dependencies = [ "keystream", ] +[[package]] +name = "chacha" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4d0c4741f6b1d67dc11a9926348a2bbe4fcdb9693dd56ff9bd1f9bf8a13c30" +dependencies = [ + "keystream", +] + [[package]] name = "chacha20" version = "0.9.1" @@ -1290,7 +1288,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1527,7 +1525,7 @@ checksum = "a782b93fae93e57ca8ad3e9e994e784583f5933aeaaa5c80a545c4b437be2047" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1551,7 +1549,7 @@ checksum = "e01c9214319017f6ebd8e299036e1f717fa9bb6724e758f7d6fb2477599d1a29" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1589,9 +1587,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -1720,7 +1718,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "crossterm_winapi", "parking_lot", "rustix 0.38.44", @@ -1795,7 +1793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1893,7 +1891,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2006,9 +2004,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -2016,27 +2014,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2055,9 +2053,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "defguard_wireguard_rs" @@ -2089,14 +2087,14 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "pem-rfc7468", @@ -2132,7 +2130,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2161,7 +2159,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "unicode-xid", ] @@ -2173,7 +2171,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "unicode-xid", ] @@ -2242,7 +2240,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2291,9 +2289,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "easy-addr" @@ -2400,9 +2398,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ "serde", ] @@ -2451,7 +2449,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2494,9 +2492,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -2541,9 +2539,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener 5.4.0", "pin-project-lite", @@ -2583,14 +2581,14 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fancy_constructor" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac0fd7f4636276b4bd7b3148d0ba2c1c3fbede2b5214e47e7fedb70b02cde44" +checksum = "28a27643a5d05f3a22f5afd6e0d0e6e354f92d37907006f97b84b9cb79082198" dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2814,7 +2812,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2855,15 +2853,16 @@ checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" [[package]] name = "generator" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" dependencies = [ + "cc", "cfg-if", "libc", "log", "rustversion", - "windows 0.58.0", + "windows 0.61.1", ] [[package]] @@ -2889,9 +2888,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -2902,16 +2901,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", "wasm-bindgen", - "windows-targets 0.52.6", ] [[package]] @@ -2923,7 +2922,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3041,7 +3040,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.1", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -3050,9 +3049,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -3060,7 +3059,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.7.1", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -3069,9 +3068,9 @@ dependencies = [ [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -3086,7 +3085,7 @@ dependencies = [ "log", "pest", "pest_derive", - "quick-error 2.0.1", + "quick-error", "serde", "serde_json", ] @@ -3118,9 +3117,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] name = "hashlink" @@ -3200,9 +3199,9 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -3224,35 +3223,33 @@ checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] name = "hickory-proto" -version = "0.25.1" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d844af74f7b799e41c78221be863bade11c430d46042c3b49ca8ae0c6d27287" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" dependencies = [ - "async-recursion", "async-trait", "bytes", "cfg-if", - "critical-section", "data-encoding", "enum-as-inner", "futures-channel", "futures-io", "futures-util", - "h2 0.4.9", + "h2 0.4.10", "http 1.3.1", "idna", "ipnet", "once_cell", - "rand 0.9.0", + "rand 0.9.1", "ring", - "rustls 0.23.25", + "rustls 0.23.27", "thiserror 2.0.12", "tinyvec", "tokio", "tokio-rustls 0.26.2", "tracing", "url", - "webpki-roots 0.26.8", + "webpki-roots 0.26.11", ] [[package]] @@ -3268,15 +3265,15 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.0", + "rand 0.9.1", "resolv-conf", - "rustls 0.23.25", + "rustls 0.23.27", "smallvec", "thiserror 2.0.12", "tokio", "tokio-rustls 0.26.2", "tracing", - "webpki-roots 0.26.8", + "webpki-roots 0.26.11", ] [[package]] @@ -3318,17 +3315,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - [[package]] name = "html5ever" version = "0.31.0" @@ -3405,9 +3391,9 @@ checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpcodec" @@ -3507,20 +3493,19 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.25", + "rustls 0.23.27", "rustls-pki-types", "tokio", "tokio-rustls 0.26.2", "tower-service", - "webpki-roots 0.26.8", + "webpki-roots 1.0.0", ] [[package]] @@ -3537,9 +3522,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "cf9f1e950e0d9d1d3c47184416723cf29c0d1f93bd8cccf37e4beb6b44f31710" dependencies = [ "bytes", "futures-channel", @@ -3557,16 +3542,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.61.2", ] [[package]] @@ -3580,21 +3566,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -3603,31 +3590,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -3635,67 +3602,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -3715,9 +3669,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -3731,7 +3685,7 @@ checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3800,7 +3754,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3816,12 +3770,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -3861,9 +3815,9 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", "generic-array 0.14.7", @@ -3902,9 +3856,9 @@ checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" [[package]] name = "inventory" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b12ebb6799019b044deaf431eadfe23245b259bba5a2c0796acec3943a3cdb" +checksum = "ab08d7cd2c5897f2c949e5383ea7c7db03fb19130ffcfbf7eda795137ae3cb83" dependencies = [ "rustversion", ] @@ -3944,11 +3898,11 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi 0.5.1", "libc", "windows-sys 0.59.0", ] @@ -4004,15 +3958,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.4" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d699bc6dfc879fb1bf9bdff0d4c56f0884fc6f0d0eb0fba397a6d00cd9a6b85e" +checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" dependencies = [ "jiff-static", "log", @@ -4023,21 +3977,22 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.4" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d16e75759ee0aa64c57a56acbf43916987b20c77373cb7e808979e02b93c9f9" +checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] @@ -4073,9 +4028,9 @@ checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" [[package]] name = "kqueue" -version = "1.0.8" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" dependencies = [ "kqueue-sys", "libc", @@ -4139,15 +4094,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" @@ -4155,7 +4110,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "libc", "redox_syscall", ] @@ -4173,9 +4128,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.21" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" dependencies = [ "cc", "libc", @@ -4191,9 +4146,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "lioness" @@ -4203,15 +4158,15 @@ checksum = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" dependencies = [ "arrayref", "blake2 0.8.1", - "chacha", + "chacha 0.3.0", "keystream", ] [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" @@ -4223,12 +4178,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "lockfree-object-pool" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" - [[package]] name = "log" version = "0.4.27" @@ -4248,6 +4197,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac" version = "0.1.1" @@ -4274,7 +4229,7 @@ dependencies = [ "proc-macro2", "quote", "sealed", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -4286,7 +4241,7 @@ dependencies = [ "proc-macro2", "quote", "sealed", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -4299,7 +4254,7 @@ dependencies = [ "macroific_core", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -4319,12 +4274,6 @@ dependencies = [ "web_atoms", ] -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "match_token" version = "0.1.0" @@ -4333,7 +4282,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -4431,13 +4380,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4549,7 +4498,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55e5bda7ca0f9ac5e75b5debac3b75e29a8ac8e2171106a2c3bb466389a8dd83" dependencies = [ "anyhow", - "bitflags 2.8.0", + "bitflags 2.9.1", "byteorder", "libc", "log", @@ -4615,7 +4564,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "cfg-if", "libc", ] @@ -4626,7 +4575,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -5709,7 +5658,7 @@ name = "nym-gateway-client" version = "0.1.0" dependencies = [ "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "gloo-utils 0.2.0", "nym-bandwidth-controller", "nym-credential-storage", @@ -6089,7 +6038,7 @@ dependencies = [ [[package]] name = "nym-network-monitor" -version = "1.0.2" +version = "1.1.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -6185,7 +6134,7 @@ dependencies = [ "bs58", "cargo_metadata 0.18.1", "celes", - "chacha", + "chacha 0.4.0", "clap", "colored", "criterion", @@ -6454,7 +6403,7 @@ dependencies = [ "chacha20poly1305", "criterion", "fastrand 2.3.0", - "getrandom 0.2.15", + "getrandom 0.2.16", "log", "rand 0.8.5", "rayon", @@ -6854,7 +6803,7 @@ dependencies = [ "aes-gcm", "argon2", "generic-array 0.14.7", - "getrandom 0.2.15", + "getrandom 0.2.16", "rand 0.8.5", "serde", "serde_json", @@ -7089,7 +7038,7 @@ name = "nym-vpn-api-lib-wasm" version = "0.1.0" dependencies = [ "bs58", - "getrandom 0.2.15", + "getrandom 0.2.16", "js-sys", "nym-bin-common", "nym-compact-ecash", @@ -7275,11 +7224,17 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "oorandom" -version = "11.1.4" +version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "opaque-debug" @@ -7301,9 +7256,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -7491,9 +7446,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "peg" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" +checksum = "9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477" dependencies = [ "peg-macros", "peg-runtime", @@ -7501,9 +7456,9 @@ dependencies = [ [[package]] name = "peg-macros" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +checksum = "6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71" dependencies = [ "peg-runtime", "proc-macro2", @@ -7512,9 +7467,9 @@ dependencies = [ [[package]] name = "peg-runtime" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" +checksum = "132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fca" [[package]] name = "pem" @@ -7544,9 +7499,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" dependencies = [ "memchr", "thiserror 2.0.12", @@ -7555,9 +7510,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" dependencies = [ "pest", "pest_generator", @@ -7565,22 +7520,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "pest_meta" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" dependencies = [ "once_cell", "pest", @@ -7594,7 +7549,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.1", + "indexmap 2.9.0", ] [[package]] @@ -7637,7 +7592,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -7666,7 +7621,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -7704,9 +7659,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plain" @@ -7783,9 +7738,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] name = "portable-atomic-util" @@ -7809,7 +7764,7 @@ dependencies = [ "hmac", "md-5", "memchr", - "rand 0.9.0", + "rand 0.9.1", "sha2 0.10.9", "stringprep", ] @@ -7825,6 +7780,15 @@ dependencies = [ "postgres-protocol", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -7833,11 +7797,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -7884,14 +7848,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -7954,7 +7918,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -7988,9 +7952,9 @@ dependencies = [ [[package]] name = "psl" -version = "2.1.86" +version = "2.1.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e02ed846877ce4044391085ca68b470b0d379cd18a9be0666161764d35448" +checksum = "1c6b4c497a0c6bfb466f75167c728b1a861b0cdc39de9c35b877208a270a9590" dependencies = [ "psl-types", ] @@ -8011,12 +7975,6 @@ dependencies = [ "psl-types", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quick-error" version = "2.0.1" @@ -8025,9 +7983,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", "cfg_aliases", @@ -8035,7 +7993,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.25", + "rustls 0.23.27", "socket2", "thiserror 2.0.12", "tokio", @@ -8045,16 +8003,17 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.10" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", - "getrandom 0.3.1", - "rand 0.9.0", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.1", "ring", "rustc-hash", - "rustls 0.23.25", + "rustls 0.23.27", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -8065,9 +8024,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" dependencies = [ "cfg_aliases", "libc", @@ -8086,6 +8045,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -8105,13 +8070,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.1", - "zerocopy 0.8.20", + "rand_core 0.9.3", ] [[package]] @@ -8131,7 +8095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.1", + "rand_core 0.9.3", ] [[package]] @@ -8140,17 +8104,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] name = "rand_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", - "zerocopy 0.8.20", + "getrandom 0.3.3", ] [[package]] @@ -8185,11 +8148,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", ] [[package]] @@ -8198,7 +8161,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] @@ -8303,7 +8266,7 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.6.0", - "hyper-rustls 0.27.5", + "hyper-rustls 0.27.6", "hyper-util", "ipnet", "js-sys", @@ -8313,7 +8276,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.25", + "rustls 0.23.27", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -8331,29 +8294,24 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.8", + "webpki-roots 0.26.11", "windows-registry", ] [[package]] name = "reserve-port" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "359fc315ed556eb0e42ce74e76f4b1cd807b50fa6307f3de4e51f92dbe86e2d5" +checksum = "ba3747658ee2585ecf5607fa9887c92eff61b362ff5253dbf797dfeb73d33d78" dependencies = [ - "lazy_static", "thiserror 2.0.12", ] [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error 1.2.3", -] +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "rfc6979" @@ -8367,13 +8325,13 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.13" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -8421,9 +8379,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest 0.10.7", @@ -8441,9 +8399,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.5.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -8452,22 +8410,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.5.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.98", + "syn 2.0.101", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.5.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" dependencies = [ "sha2 0.10.9", "walkdir", @@ -8525,7 +8483,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -8534,14 +8492,14 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.1" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dade4812df5c384711475be5fcd8c162555352945401aed22a35bffeab61f657" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "errno", "libc", - "linux-raw-sys 0.9.2", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -8573,15 +8531,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.25" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.1", + "rustls-webpki 0.103.3", "subtle 2.6.1", "zeroize", ] @@ -8631,11 +8589,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", + "zeroize", ] [[package]] @@ -8661,9 +8620,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -8672,15 +8631,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -8723,7 +8682,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals 0.29.1", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -8749,13 +8708,13 @@ dependencies = [ [[package]] name = "scroll_derive" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -8776,7 +8735,7 @@ checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -8818,7 +8777,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -8916,7 +8875,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -8927,7 +8886,7 @@ checksum = "e578a843d40b4189a4d66bba51d7684f57da5bd7c304c64e14bd63efbef49509" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -8938,7 +8897,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -9000,14 +8959,14 @@ checksum = "aafbefbe175fa9bf03ca83ef89beecff7d2a95aaacd5732325b90ac8c3bd7b90" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ "itoa", "serde", @@ -9021,7 +8980,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -9055,7 +9014,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -9072,7 +9031,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -9081,7 +9040,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.9.0", "itoa", "ryu", "serde", @@ -9166,9 +9125,9 @@ checksum = "b72e7cd0744e007e382ba320435f1ed1ecd709409b4ebd5cfbc843d77b25a8aa" [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", @@ -9187,9 +9146,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -9244,9 +9203,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "smawk" @@ -9278,9 +9237,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -9297,7 +9256,7 @@ dependencies = [ "blake2 0.8.1", "bs58", "byteorder", - "chacha", + "chacha 0.3.0", "ctr", "curve25519-dalek", "digest 0.10.7", @@ -9376,7 +9335,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.7.1", + "indexmap 2.9.0", "log", "memchr", "once_cell", @@ -9445,7 +9404,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.8.0", + "bitflags 2.9.1", "byteorder", "bytes", "chrono", @@ -9489,7 +9448,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.8.0", + "bitflags 2.9.1", "byteorder", "chrono", "crc", @@ -9570,9 +9529,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string_cache" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", @@ -9651,7 +9610,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -9694,9 +9653,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -9720,13 +9679,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -9789,14 +9748,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand 2.3.0", - "getrandom 0.3.1", + "getrandom 0.3.3", "once_cell", - "rustix 1.0.1", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -9870,7 +9829,7 @@ dependencies = [ "bytes", "flex-error", "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "peg", "pin-project", "rand 0.8.5", @@ -9954,9 +9913,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", ] @@ -9987,7 +9946,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -9998,7 +9957,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -10069,9 +10028,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -10089,9 +10048,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -10104,14 +10063,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.3", + "mio 1.0.4", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -10139,7 +10098,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -10161,7 +10120,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.9.0", + "rand 0.9.1", "socket2", "tokio", "tokio-util", @@ -10195,7 +10154,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.25", + "rustls 0.23.27", "tokio", ] @@ -10273,7 +10232,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "pin-project-lite", "slab", "tokio", @@ -10315,7 +10274,7 @@ version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", @@ -10400,7 +10359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ "async-compression", - "bitflags 2.8.0", + "bitflags 2.9.1", "bytes", "futures-core", "futures-util", @@ -10452,7 +10411,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -10622,7 +10581,7 @@ checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "termcolor", ] @@ -10649,7 +10608,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals 0.28.0", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -10720,9 +10679,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -10800,7 +10759,7 @@ dependencies = [ "glob", "goblin", "heck 0.5.0", - "indexmap 2.7.1", + "indexmap 2.9.0", "once_cell", "serde", "tempfile", @@ -10842,10 +10801,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83b547d69d699e52f2129fde4b57ae0d00b5216e59ed5b56097c95c86ba06095" dependencies = [ "anyhow", - "indexmap 2.7.1", + "indexmap 2.9.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -10860,7 +10819,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.98", + "syn 2.0.101", "toml 0.5.11", "uniffi_meta", ] @@ -10885,7 +10844,7 @@ checksum = "54b5336a9a925b358183837d31541d12590b7fcec373256d3770de02dff24c69" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.7.1", + "indexmap 2.9.0", "tempfile", "uniffi_internal_macros", ] @@ -10948,12 +10907,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -10972,7 +10925,7 @@ version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435c6f69ef38c9017b4b4eea965dfb91e71e53d869e896db40d1cf2441dd75c0" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.9.0", "serde", "serde_json", "utoipa-gen", @@ -10987,7 +10940,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.98", + "syn 2.0.101", "uuid", ] @@ -11026,7 +10979,7 @@ checksum = "268d76aaebb80eba79240b805972e52d7d410d4bcc52321b951318b0f440cd60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -11037,18 +10990,20 @@ checksum = "382673bda1d05c85b4550d32fd4192ccd4cffe9a908543a0795d1e7682b36246" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "utoipauto-core", ] [[package]] name = "uuid" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.3", + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -11168,9 +11123,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -11203,7 +11158,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -11238,7 +11193,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -11273,7 +11228,7 @@ checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -11314,7 +11269,7 @@ name = "wasm-storage" version = "0.1.0" dependencies = [ "async-trait", - "getrandom 0.2.15", + "getrandom 0.2.16", "indexed_db_futures", "js-sys", "nym-store-cipher", @@ -11344,7 +11299,7 @@ version = "0.1.0" dependencies = [ "console_error_panic_hook", "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "gloo-net", "gloo-utils 0.2.0", "js-sys", @@ -11417,9 +11372,18 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.8" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" dependencies = [ "rustls-pki-types", ] @@ -11435,9 +11399,9 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ "redox_syscall", "wasite", @@ -11446,9 +11410,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -11493,21 +11457,24 @@ dependencies = [ [[package]] name = "windows" -version = "0.58.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link", + "windows-numerics", ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows-collections" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-targets 0.52.6", + "windows-core 0.61.2", ] [[package]] @@ -11524,15 +11491,26 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.58.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link", + "windows-threading", ] [[package]] @@ -11543,18 +11521,18 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "windows-implement" -version = "0.58.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -11565,25 +11543,35 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "windows-interface" -version = "0.58.0" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-numerics" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link", +] [[package]] name = "windows-registry" @@ -11591,7 +11579,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result 0.3.1", + "windows-result 0.3.4", "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -11607,37 +11595,27 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] @@ -11740,6 +11718,15 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -11941,24 +11928,18 @@ dependencies = [ [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -11983,13 +11964,12 @@ dependencies = [ [[package]] name = "xattr" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "linux-raw-sys 0.4.15", - "rustix 0.38.44", + "rustix 1.0.7", ] [[package]] @@ -12000,9 +11980,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -12012,75 +11992,54 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" -dependencies = [ - "zerocopy-derive 0.8.20", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.20" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "synstructure", ] @@ -12101,14 +12060,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -12117,27 +12087,27 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "zip" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938cc23ac49778ac8340e366ddc422b2227ea176edb447e23fc0627608dddadd" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" dependencies = [ "arbitrary", "crc32fast", "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.7.1", + "indexmap 2.9.0", "memchr", "thiserror 2.0.12", "zopfli", @@ -12150,7 +12120,7 @@ dependencies = [ "anyhow", "async-trait", "bs58", - "getrandom 0.2.15", + "getrandom 0.2.16", "js-sys", "nym-bin-common", "nym-compact-ecash", @@ -12172,41 +12142,39 @@ dependencies = [ [[package]] name = "zopfli" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" dependencies = [ "bumpalo", "crc32fast", - "lockfree-object-pool", "log", - "once_cell", "simd-adler32", ] [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/common/types/src/monitoring.rs b/common/types/src/monitoring.rs index 11d7a3f937a..d932c4ff5e4 100644 --- a/common/types/src/monitoring.rs +++ b/common/types/src/monitoring.rs @@ -11,6 +11,27 @@ static NETWORK_MONITORS: LazyLock> = LazyLock::new(|| { nm }); +#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone, ToSchema)] +pub struct RouteResult { + pub layer1: u32, + pub layer2: u32, + pub layer3: u32, + pub gw: u32, + pub success: bool, +} + +impl RouteResult { + pub fn new(layer1: u32, layer2: u32, layer3: u32, gw: u32, success: bool) -> Self { + RouteResult { + layer1, + layer2, + layer3, + gw, + success, + } + } +} + #[derive(Debug, Serialize, Deserialize, JsonSchema, Clone, ToSchema)] pub struct NodeResult { #[schema(value_type = u32)] @@ -29,23 +50,23 @@ impl NodeResult { } } -#[derive(Serialize, Deserialize, JsonSchema)] +#[derive(Serialize, Deserialize, JsonSchema, ToSchema)] #[serde(untagged)] pub enum MonitorResults { - Mixnode(Vec), - Gateway(Vec), + Node(Vec), + Route(Vec), } #[derive(Serialize, Deserialize, JsonSchema, ToSchema)] pub struct MonitorMessage { - results: Vec, + results: MonitorResults, signature: String, signer: String, timestamp: i64, } impl MonitorMessage { - fn message_to_sign(results: &[NodeResult], timestamp: i64) -> Vec { + fn message_to_sign(results: &MonitorResults, timestamp: i64) -> Vec { let mut msg = serde_json::to_vec(results).unwrap_or_default(); msg.extend_from_slice(×tamp.to_le_bytes()); msg @@ -60,7 +81,7 @@ impl MonitorMessage { now - self.timestamp < 5 } - pub fn new(results: Vec, private_key: &PrivateKey) -> Self { + pub fn new(results: MonitorResults, private_key: &PrivateKey) -> Self { let timestamp = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("Time went backwards") @@ -82,7 +103,7 @@ impl MonitorMessage { NETWORK_MONITORS.contains(&self.signer) } - pub fn results(&self) -> &[NodeResult] { + pub fn results(&self) -> &MonitorResults { &self.results } diff --git a/nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json b/nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json deleted file mode 100644 index 9c0c64d6648..00000000000 --- a/nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT epoch_id as \"epoch_id: u32\", serialised_signatures, serialization_revision as \"serialization_revision: u8\"\n FROM expiration_date_signatures\n WHERE expiration_date = ?\n ", - "describe": { - "columns": [ - { - "name": "epoch_id: u32", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "serialised_signatures", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "serialization_revision: u8", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5" -} diff --git a/nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json b/nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json deleted file mode 100644 index c8fbd219114..00000000000 --- a/nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT epoch_id as \"epoch_id: u32\", serialised_key, serialization_revision as \"serialization_revision: u8\"\n FROM master_verification_key WHERE epoch_id = ?\n ", - "describe": { - "columns": [ - { - "name": "epoch_id: u32", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "serialised_key", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "serialization_revision: u8", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c" -} diff --git a/nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json b/nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json deleted file mode 100644 index e4f26c50533..00000000000 --- a/nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n INSERT OR IGNORE INTO expiration_date_signatures(expiration_date, epoch_id, serialised_signatures, serialization_revision)\n VALUES (?, ?, ?, ?);\n UPDATE expiration_date_signatures\n SET\n serialised_signatures = ?,\n serialization_revision = ?\n WHERE expiration_date = ?\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 7 - }, - "nullable": [] - }, - "hash": "16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1" -} diff --git a/nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json b/nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json deleted file mode 100644 index 6ee25bbc1a4..00000000000 --- a/nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n INSERT INTO ecash_ticketbook\n (serialization_revision, ticketbook_data, expiration_date, ticketbook_type, epoch_id, total_tickets, used_tickets)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 7 - }, - "nullable": [] - }, - "hash": "284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02" -} diff --git a/nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json b/nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json deleted file mode 100644 index ea79b11bbd5..00000000000 --- a/nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "DELETE FROM ecash_ticketbook WHERE expiration_date <= ?", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - }, - "hash": "37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4" -} diff --git a/nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json b/nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json deleted file mode 100644 index ea667b0bc6f..00000000000 --- a/nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "DELETE FROM pending_issuance WHERE deposit_id = ?", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - }, - "hash": "5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966" -} diff --git a/nym-api/.sqlx/query-66109c1d856e1ca2b5126e4bf4c58c7a27b8c303bfa079cf74909354202dcc49.json b/nym-api/.sqlx/query-66109c1d856e1ca2b5126e4bf4c58c7a27b8c303bfa079cf74909354202dcc49.json new file mode 100644 index 00000000000..9ec70e1e555 --- /dev/null +++ b/nym-api/.sqlx/query-66109c1d856e1ca2b5126e4bf4c58c7a27b8c303bfa079cf74909354202dcc49.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n INSERT OR IGNORE INTO routes (layer1, layer2, layer3, gw, success) VALUES (?, ?, ?, ?, ?);\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 5 + }, + "nullable": [] + }, + "hash": "66109c1d856e1ca2b5126e4bf4c58c7a27b8c303bfa079cf74909354202dcc49" +} diff --git a/nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json b/nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json deleted file mode 100644 index ae81f52d0e9..00000000000 --- a/nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n INSERT INTO pending_issuance\n (deposit_id, serialization_revision, pending_ticketbook_data, expiration_date)\n VALUES (?, ?, ?, ?)\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 4 - }, - "nullable": [] - }, - "hash": "81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4" -} diff --git a/nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json b/nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json deleted file mode 100644 index 051c18bba2d..00000000000 --- a/nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE ecash_ticketbook SET used_tickets = used_tickets + ? WHERE id = ?", - "describe": { - "columns": [], - "parameters": { - "Right": 2 - }, - "nullable": [] - }, - "hash": "84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3" -} diff --git a/nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json b/nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json deleted file mode 100644 index 5fd4e4f2e65..00000000000 --- a/nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n INSERT OR IGNORE INTO master_verification_key(epoch_id, serialised_key, serialization_revision) VALUES (?, ?, ?);\n UPDATE master_verification_key\n SET\n serialised_key = ?,\n serialization_revision = ?\n WHERE epoch_id = ?\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 6 - }, - "nullable": [] - }, - "hash": "a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e" -} diff --git a/nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json b/nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json deleted file mode 100644 index e2f05399ee5..00000000000 --- a/nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT epoch_id as \"epoch_id: u32\", serialised_signatures, serialization_revision as \"serialization_revision: u8\"\n FROM coin_indices_signatures WHERE epoch_id = ?\n ", - "describe": { - "columns": [ - { - "name": "epoch_id: u32", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "serialised_signatures", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "serialization_revision: u8", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82" -} diff --git a/nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json b/nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json deleted file mode 100644 index ec7111bc5a8..00000000000 --- a/nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n UPDATE ecash_ticketbook\n SET used_tickets = used_tickets - ?\n WHERE id = ?\n AND used_tickets = ?\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - }, - "hash": "bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4" -} diff --git a/nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json b/nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json deleted file mode 100644 index a2077f76ae8..00000000000 --- a/nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n INSERT OR IGNORE INTO coin_indices_signatures(epoch_id, serialised_signatures, serialization_revision) VALUES (?, ?, ?);\n UPDATE coin_indices_signatures\n SET\n serialised_signatures = ?,\n serialization_revision = ?\n WHERE epoch_id = ?\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 6 - }, - "nullable": [] - }, - "hash": "bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68" -} diff --git a/nym-api/migrations/20250513104800_routes_table.sql b/nym-api/migrations/20250513104800_routes_table.sql new file mode 100644 index 00000000000..122c2304795 --- /dev/null +++ b/nym-api/migrations/20250513104800_routes_table.sql @@ -0,0 +1,16 @@ +-- Drop the table if it exists +DROP TABLE IF EXISTS routes; + +-- Create the routes table +CREATE TABLE routes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + layer1 INTEGER, + layer2 INTEGER, + layer3 INTEGER, + gw INTEGER, + success BOOLEAN +); + +-- Create an index on created_at +CREATE INDEX routes_created_at ON routes(created_at); diff --git a/nym-api/src/node_status_api/handlers/without_monitor.rs b/nym-api/src/node_status_api/handlers/without_monitor.rs index d66addae611..bddb67cb3da 100644 --- a/nym-api/src/node_status_api/handlers/without_monitor.rs +++ b/nym-api/src/node_status_api/handlers/without_monitor.rs @@ -20,7 +20,7 @@ use nym_api_requests::models::{ }; use nym_http_api_common::{FormattedResponse, OutputParams}; use nym_mixnet_contract_common::NodeId; -use nym_types::monitoring::MonitorMessage; +use nym_types::monitoring::{MonitorMessage, MonitorResults}; use tracing::error; pub(super) fn mandatory_routes() -> Router { @@ -33,6 +33,10 @@ pub(super) fn mandatory_routes() -> Router { "/submit-node-monitoring-results", post(submit_node_monitoring_results), ) + .route( + "/submit-route-monitoring-results", + post(submit_route_monitoring_results), + ) .nest( "/mixnode/:mix_id", Router::new() @@ -58,6 +62,53 @@ pub(super) fn mandatory_routes() -> Router { ) } +#[utoipa::path( + tag = "status", + post, + path = "/v1/status/submit-route-monitoring-results", + responses( + (status = 200), + (status = 400, body = String, description = "TBD"), + (status = 403, body = String, description = "TBD"), + (status = 500, body = String, description = "TBD"), + ), +)] +pub(crate) async fn submit_route_monitoring_results( + State(state): State, + Json(message): Json, +) -> AxumResult<()> { + if !message.is_in_allowed() { + return Err(AxumErrorResponse::forbidden( + "Monitor not registered to submit results", + )); + } + + if !message.timely() { + return Err(AxumErrorResponse::bad_request("Message is too old")); + } + + if !message.verify() { + return Err(AxumErrorResponse::bad_request("invalid signature")); + } + + match message.results() { + MonitorResults::Route(results) => { + match state.storage.submit_route_monitoring_results(results).await { + Ok(_) => Ok(()), + Err(err) => { + error!("failed to submit node monitoring results: {err}"); + Err(AxumErrorResponse::internal_msg( + "failed to submit node monitoring results", + )) + } + } + } + MonitorResults::Node(_results) => Err(AxumErrorResponse::bad_request( + "Node monitoring results not supported for this endpoint", + )), + } +} + #[utoipa::path( tag = "status", post, @@ -87,18 +138,21 @@ pub(crate) async fn submit_gateway_monitoring_results( return Err(AxumErrorResponse::bad_request("invalid signature")); } - match state - .storage - .submit_gateway_statuses_v2(message.results()) - .await - { - Ok(_) => Ok(()), - Err(err) => { - error!("failed to submit gateway monitoring results: {err}"); - Err(AxumErrorResponse::internal_msg( - "failed to submit gateway monitoring results", - )) + match message.results() { + MonitorResults::Node(results) => { + match state.storage.submit_gateway_statuses_v2(results).await { + Ok(_) => Ok(()), + Err(err) => { + error!("failed to submit node monitoring results: {err}"); + Err(AxumErrorResponse::internal_msg( + "failed to submit node monitoring results", + )) + } + } } + MonitorResults::Route(_results) => Err(AxumErrorResponse::bad_request( + "Gateway monitoring results not supported for this endpoint", + )), } } @@ -131,18 +185,21 @@ pub(crate) async fn submit_node_monitoring_results( return Err(AxumErrorResponse::bad_request("invalid signature")); } - match state - .storage - .submit_mixnode_statuses_v2(message.results()) - .await - { - Ok(_) => Ok(()), - Err(err) => { - error!("failed to submit node monitoring results: {err}"); - Err(AxumErrorResponse::internal_msg( - "failed to submit node monitoring results", - )) + match message.results() { + MonitorResults::Node(results) => { + match state.storage.submit_mixnode_statuses_v2(results).await { + Ok(_) => Ok(()), + Err(err) => { + error!("failed to submit node monitoring results: {err}"); + Err(AxumErrorResponse::internal_msg( + "failed to submit node monitoring results", + )) + } + } } + MonitorResults::Route(_results) => Err(AxumErrorResponse::bad_request( + "Node monitoring results not supported for this endpoint", + )), } } diff --git a/nym-api/src/support/storage/manager.rs b/nym-api/src/support/storage/manager.rs index e30b316c0d9..3d8bd07bfa0 100644 --- a/nym-api/src/support/storage/manager.rs +++ b/nym-api/src/support/storage/manager.rs @@ -10,10 +10,11 @@ use crate::support::storage::models::{ }; use crate::support::storage::DbIdCache; use nym_mixnet_contract_common::{EpochId, IdentityKey, NodeId}; -use nym_types::monitoring::NodeResult; +use nym_types::monitoring::{NodeResult, RouteResult}; use sqlx::FromRow; use time::{Date, OffsetDateTime}; use tracing::info; +use std::collections::HashMap; #[derive(Clone)] pub(crate) struct StorageManager { @@ -51,6 +52,25 @@ impl AvgGatewayReliability { } } +// Helper struct for in-memory state during calculation for an interval +#[derive(Debug, Default, Clone)] +struct NodeCorrectionIntervalState { + pos_samples: u32, + neg_samples: u32, + fail_seq: u32, +} + +// Output struct for the calculated corrected reliability for an interval +#[derive(Debug, serde::Serialize)] // Add utoipa::ToSchema if this struct is directly exposed via API +pub struct CorrectedNodeIntervalReliability { + pub node_id: NodeId, // nym_mixnet_contract_common::NodeId (typically u32) + pub identity: Option, // Base58 public key + pub reliability: f64, + pub pos_samples_in_interval: u32, + pub neg_samples_in_interval: u32, + pub final_fail_seq_in_interval: u32, +} + // all SQL goes here impl StorageManager { pub(super) async fn get_all_avg_mix_reliability_in_last_24hr( @@ -664,6 +684,33 @@ impl StorageManager { tx.commit().await } + pub(super) async fn submit_route_monitoring_results( + &self, + route_results: &[RouteResult], + ) -> Result<(), sqlx::Error> { + info!("Inserting {} route monitoring results", route_results.len()); + // insert it all in a transaction to make sure all nodes are updated at the same time + // (plus it's a nice guard against new nodes) + let mut tx = self.connection_pool.begin().await?; + + for route_result in route_results { + sqlx::query!( + r#" + INSERT OR IGNORE INTO routes (layer1, layer2, layer3, gw, success) VALUES (?, ?, ?, ?, ?); + "#, + route_result.layer1, + route_result.layer2, + route_result.layer3, + route_result.gw, + route_result.success, + ) + .execute(&mut *tx) + .await?; + } + + tx.commit().await + } + pub(super) async fn submit_gateway_statuses_v2( &self, gateway_results: &[NodeResult], @@ -1329,6 +1376,137 @@ impl StorageManager { .fetch_all(&self.connection_pool) .await } + + /// Fetches raw route results from the database for a given time interval. + /// Assumes the 'routes' table has layer1, layer2, layer3, gw, success, and a timestamp. + async fn get_raw_routes_in_interval( + &self, + start_ts_secs: i64, + end_ts_secs: i64, + ) -> Result, sqlx::Error> { + // Temporary struct to match the expected columns from the 'routes' table + // NodeId here is assumed to be compatible with how layer1, etc. are stored (e.g. u32/i32/i64) + struct RawRouteData { + layer1: NodeId, + layer2: NodeId, + layer3: NodeId, + gw: NodeId, + success: bool, + // timestamp: i64, // Not explicitly selected into struct, but used in WHERE and ORDER BY + } + + // Ensure your 'routes' table has: + // layer1 (NodeId type), layer2 (NodeId type), layer3 (NodeId type), + // gw (NodeId type), success (bool/INTEGER), timestamp (BIGINT/INTEGER) + // The "NodeId:" type hint for sqlx::query_as! helps map to nym_mixnet_contract_common::NodeId + let db_routes = sqlx::query_as!( + RawRouteData, + r#" + SELECT + layer1 as "layer1", + layer2 as "layer2", + layer3 as "layer3", + gw as "gw", + success + FROM routes + WHERE timestamp >= ? AND timestamp <= ? + ORDER BY timestamp ASC + "#, + start_ts_secs, + end_ts_secs + ) + .fetch_all(&self.connection_pool) + .await?; + + Ok(db_routes + .into_iter() + .map(|r| (r.layer1, r.layer2, r.layer3, r.gw, r.success)) + .collect()) + } + + pub async fn calculate_corrected_node_reliabilities_for_interval( + &self, + start_ts_secs: i64, + end_ts_secs: i64, + ) -> Result, anyhow::Error> { + let raw_routes = self + .get_raw_routes_in_interval(start_ts_secs, end_ts_secs) + .await?; + + let mut node_states: HashMap = HashMap::new(); + + for (l1, l2, l3, gw, success) in raw_routes { + let path_node_ids = [l1, l2, l3, gw]; + + if success { + for &node_id in &path_node_ids { + let state = node_states.entry(node_id).or_default(); + state.pos_samples += 1; + state.fail_seq = 0; + } + } else { + // Path test failed + let mut current_path_node_ids_for_blame: Vec = Vec::new(); + for &node_id in &path_node_ids { + let state = node_states.entry(node_id).or_default(); + state.fail_seq += 1; + current_path_node_ids_for_blame.push(node_id); + } + + let mut guilty_nodes_in_path: Vec = Vec::new(); + for &node_id in ¤t_path_node_ids_for_blame { + if let Some(state_after_update) = node_states.get(&node_id) { + if state_after_update.fail_seq > 2 { + guilty_nodes_in_path.push(node_id); + } + } + } + + if !guilty_nodes_in_path.is_empty() { + for &guilty_node_id in &guilty_nodes_in_path { + if let Some(state) = node_states.get_mut(&guilty_node_id) { + state.neg_samples += 1; + } + } + } else { + // No single guilty party, distribute blame + for &node_id_in_path in ¤t_path_node_ids_for_blame { + if let Some(state) = node_states.get_mut(&node_id_in_path) { + state.neg_samples += 1; + } + } + } + } + } + + let mut final_reliabilities = Vec::new(); + for (node_id, state) in node_states { + let total_samples = state.pos_samples + state.neg_samples; + let reliability = if total_samples == 0 { + 0.0 // Default for no samples in this interval. Consider Option or filtering. + } else { + state.pos_samples as f64 / total_samples as f64 + }; + + // Attempt to fetch identity, first as mixnode, then as gateway if not found. + // This assumes get_mixnode_identity_key and get_gateway_identity_key return Result, sqlx::Error> + let mut identity: Option = self.get_mixnode_identity_key(node_id).await.unwrap_or(None); + if identity.is_none() { + identity = self.get_gateway_identity_key(node_id).await.unwrap_or(None); + } + + final_reliabilities.push(CorrectedNodeIntervalReliability { + node_id, + identity, + reliability, + pos_samples_in_interval: state.pos_samples, + neg_samples_in_interval: state.neg_samples, + final_fail_seq_in_interval: state.fail_seq, + }); + } + + Ok(final_reliabilities) + } } pub(crate) mod v3_migration { diff --git a/nym-api/src/support/storage/mod.rs b/nym-api/src/support/storage/mod.rs index cc10d55e76c..1c7bc89a569 100644 --- a/nym-api/src/support/storage/mod.rs +++ b/nym-api/src/support/storage/mod.rs @@ -17,7 +17,7 @@ use crate::support::storage::models::{ }; use dashmap::DashMap; use nym_mixnet_contract_common::NodeId; -use nym_types::monitoring::NodeResult; +use nym_types::monitoring::{NodeResult, RouteResult}; use sqlx::sqlite::{SqliteAutoVacuum, SqliteSynchronous}; use sqlx::ConnectOptions; use std::path::Path; @@ -835,6 +835,16 @@ impl NymApiStorage { Ok(()) } + pub(crate) async fn submit_route_monitoring_results( + &self, + route_results: &[RouteResult], + ) -> Result<(), NymApiStorageError> { + self.manager + .submit_route_monitoring_results(route_results) + .await?; + Ok(()) + } + /// Obtains number of network monitor test runs that have occurred within the specified interval. /// /// # Arguments diff --git a/nym-network-monitor/main-1747305481101.py b/nym-network-monitor/main-1747305481101.py new file mode 100644 index 00000000000..261f900e50a --- /dev/null +++ b/nym-network-monitor/main-1747305481101.py @@ -0,0 +1,104 @@ +import csv +import arrow + + +class Measurement: + def __init__(self, serial, ts, route, received): #, tstamp): + self.serial = serial # serial number identifying the packet (ordered in time) + self.ts = ts # timestamp + self.route = route # route of the packet in the form [node_L1, node_L2, node_L3, gateway] + self.received = received # True if received, False if not + self.duplicates = 0 # increases with the number of duplicates + + +class Node: + def __init__(self, node_id): + self.node_id = node_id # serial number identifying the node + self.mix = False # it's set to true when the node is seen in a mix layer position + self.gateway = False # it's set to true when the node is seen in a gateway position + self.pos_samples = 0 # measurement samples routed by this node and successfully received + self.neg_samples = 0 # measurement samples considered as possibly dropped by this node + self.fail_seq = 0 # nr of packets dropped in a sequence + self.pos_samples_v2 = 0 # measurement samples routed by this node and successfully received (current system) + self.neg_samples_v2 = 0 # measurement samples considered as possibly dropped by this node (current system) + self.score = 0 # performance score computed after new postprocessing + self.score_v2 = 0 # current performance score + + +def read_input_file(file_name): + + list_measurements = [] + dict_nodes = {} + with open(file_name, newline='') as csvfile: + reader = csv.reader(csvfile, delimiter=',', quotechar='|') + for row in reader: + if row[0] == 'id': + continue + serial = int(row[0]) + ts = arrow.get(row[1]) + ts_seconds = ts.timestamp() + n1 = int(row[2]) + n2 = int(row[3]) + n3 = int(row[4]) + gw = int(row[5]) + if row[6] == 'false': + received = False + elif row[6] == 'true': + received = True + else: + exit('ERROR booloan from list, value = ' + str('row[6]')) + + if len(list_measurements) > 0: + last_msm = list_measurements[-1] + if n1 == last_msm.route[0] and n2 == last_msm.route[1] and n3 == last_msm.route[2] and gw == last_msm.route[3]: + last_msm.duplicates += 1 + else: + msm = Measurement(serial, ts_seconds, [n1, n2, n3, gw], received) + list_measurements.append(msm) + else: + msm = Measurement(serial, ts_seconds, [n1, n2, n3, gw], received) + list_measurements.append(msm) + + for n in [n1, n2, n3, gw]: + if n not in dict_nodes.keys(): + dict_nodes[n] = Node(n) + + return list_measurements, dict_nodes + + +def compute_node_scores(list_measurements, dict_nodes): + + for msg in list_measurements: + if msg.received: + for node in msg.route: + dict_nodes[node].pos_samples += 1 # count measurement as positive + dict_nodes[node].fail_seq = 0 # reset sequence of failed messages + dict_nodes[node].pos_samples_v2 += 1 # count measurement as positive + else: # message was dropped + guilty = [] # candidates for being responsible for the drop + for node in msg.route: + dict_nodes[node].fail_seq += 1 + dict_nodes[node].neg_samples_v2 += 1 # count measurement as negative + if dict_nodes[node].fail_seq > 2: + guilty.append(node) + dict_nodes[node].neg_samples += 1 + if len(guilty) == 0: # none of them is obviously dropping packets + for node in msg.route: + dict_nodes[node].neg_samples += 1 # punish all three with a negative sample + + for node in dict_nodes.values(): + if node.pos_samples + node.neg_samples == 0: + exit("not enough samples causes division by zero") + + estimated_performance = node.pos_samples / (node.pos_samples + node.neg_samples) + estimated_performance_v2 = node.pos_samples_v2 / (node.pos_samples_v2 + node.neg_samples_v2) + print("\nnode id: ", node.node_id) + print("estimated performance (new v2.5): ", round(estimated_performance, 2)) + print("estimated performance (current v2): ", round(estimated_performance_v2, 2)) + + +if __name__ == '__main__': + + file_name = 'routes_v0.csv' + list_measurements, dict_nodes = read_input_file(file_name) + compute_node_scores(list_measurements, dict_nodes) \ No newline at end of file diff --git a/nym-network-monitor/src/accounting.rs b/nym-network-monitor/src/accounting.rs index 97938773e1f..ea695a49638 100644 --- a/nym-network-monitor/src/accounting.rs +++ b/nym-network-monitor/src/accounting.rs @@ -8,7 +8,7 @@ use futures::{pin_mut, stream::FuturesUnordered, StreamExt}; use log::{debug, error, info}; use nym_sphinx::chunking::{monitoring, SentFragment}; use nym_topology::{NymRouteProvider, RoutingNode}; -use nym_types::monitoring::{MonitorMessage, NodeResult}; +use nym_types::monitoring::{MonitorMessage, MonitorResults, NodeResult, RouteResult}; use nym_validator_client::nym_api::routes::{API_VERSION, STATUS, SUBMIT_GATEWAY, SUBMIT_NODE}; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; @@ -439,6 +439,7 @@ async fn db_connection(database_url: Option<&String>) -> Result) -> anyhow::Result<()> { if let Some((client, handle)) = db_connection(database_url).await? { let client = Arc::new(client); @@ -509,7 +510,8 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> node_stats .chunks(10) .map(|chunk| { - let monitor_message = MonitorMessage::new(chunk.to_vec(), private_key); + let monitor_results = MonitorResults::Node(chunk.to_vec()); + let monitor_message = MonitorMessage::new(monitor_results, private_key); client.post(&node_submit_url).json(&monitor_message).send() }) .collect::>() @@ -523,8 +525,9 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> gateway_stats .chunks(10) .map(|chunk| { + let monitor_results = MonitorResults::Node(chunk.to_vec()); let monitor_message = MonitorMessage::new( - chunk.to_vec(), + monitor_results, PRIVATE_KEY.get().expect("We've set this!"), ); client @@ -537,6 +540,29 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> .await .into_iter() .collect::, _>>()?; + + let network_account = NetworkAccount::finalize()?; + let accounting_routes = network_account.accounting_routes; + let route_results = accounting_routes + .iter() + .map(|route| { + RouteResult::new( + route.mix_nodes.0, + route.mix_nodes.1, + route.mix_nodes.2, + route.gateway_node, + route.success, + ) + }) + .collect::>(); + + let monitor_results = MonitorResults::Route(route_results); + let monitor_message = MonitorMessage::new(monitor_results, private_key); + client + .post(&node_submit_url) + .json(&monitor_message) + .send() + .await?; } } } From 770078a9edcfc5538d595998976fafb2167ab8ae Mon Sep 17 00:00:00 2001 From: durch Date: Thu, 15 May 2025 13:14:08 +0200 Subject: [PATCH 04/25] Delete test script --- nym-network-monitor/main-1747305481101.py | 104 ---------------------- 1 file changed, 104 deletions(-) delete mode 100644 nym-network-monitor/main-1747305481101.py diff --git a/nym-network-monitor/main-1747305481101.py b/nym-network-monitor/main-1747305481101.py deleted file mode 100644 index 261f900e50a..00000000000 --- a/nym-network-monitor/main-1747305481101.py +++ /dev/null @@ -1,104 +0,0 @@ -import csv -import arrow - - -class Measurement: - def __init__(self, serial, ts, route, received): #, tstamp): - self.serial = serial # serial number identifying the packet (ordered in time) - self.ts = ts # timestamp - self.route = route # route of the packet in the form [node_L1, node_L2, node_L3, gateway] - self.received = received # True if received, False if not - self.duplicates = 0 # increases with the number of duplicates - - -class Node: - def __init__(self, node_id): - self.node_id = node_id # serial number identifying the node - self.mix = False # it's set to true when the node is seen in a mix layer position - self.gateway = False # it's set to true when the node is seen in a gateway position - self.pos_samples = 0 # measurement samples routed by this node and successfully received - self.neg_samples = 0 # measurement samples considered as possibly dropped by this node - self.fail_seq = 0 # nr of packets dropped in a sequence - self.pos_samples_v2 = 0 # measurement samples routed by this node and successfully received (current system) - self.neg_samples_v2 = 0 # measurement samples considered as possibly dropped by this node (current system) - self.score = 0 # performance score computed after new postprocessing - self.score_v2 = 0 # current performance score - - -def read_input_file(file_name): - - list_measurements = [] - dict_nodes = {} - with open(file_name, newline='') as csvfile: - reader = csv.reader(csvfile, delimiter=',', quotechar='|') - for row in reader: - if row[0] == 'id': - continue - serial = int(row[0]) - ts = arrow.get(row[1]) - ts_seconds = ts.timestamp() - n1 = int(row[2]) - n2 = int(row[3]) - n3 = int(row[4]) - gw = int(row[5]) - if row[6] == 'false': - received = False - elif row[6] == 'true': - received = True - else: - exit('ERROR booloan from list, value = ' + str('row[6]')) - - if len(list_measurements) > 0: - last_msm = list_measurements[-1] - if n1 == last_msm.route[0] and n2 == last_msm.route[1] and n3 == last_msm.route[2] and gw == last_msm.route[3]: - last_msm.duplicates += 1 - else: - msm = Measurement(serial, ts_seconds, [n1, n2, n3, gw], received) - list_measurements.append(msm) - else: - msm = Measurement(serial, ts_seconds, [n1, n2, n3, gw], received) - list_measurements.append(msm) - - for n in [n1, n2, n3, gw]: - if n not in dict_nodes.keys(): - dict_nodes[n] = Node(n) - - return list_measurements, dict_nodes - - -def compute_node_scores(list_measurements, dict_nodes): - - for msg in list_measurements: - if msg.received: - for node in msg.route: - dict_nodes[node].pos_samples += 1 # count measurement as positive - dict_nodes[node].fail_seq = 0 # reset sequence of failed messages - dict_nodes[node].pos_samples_v2 += 1 # count measurement as positive - else: # message was dropped - guilty = [] # candidates for being responsible for the drop - for node in msg.route: - dict_nodes[node].fail_seq += 1 - dict_nodes[node].neg_samples_v2 += 1 # count measurement as negative - if dict_nodes[node].fail_seq > 2: - guilty.append(node) - dict_nodes[node].neg_samples += 1 - if len(guilty) == 0: # none of them is obviously dropping packets - for node in msg.route: - dict_nodes[node].neg_samples += 1 # punish all three with a negative sample - - for node in dict_nodes.values(): - if node.pos_samples + node.neg_samples == 0: - exit("not enough samples causes division by zero") - - estimated_performance = node.pos_samples / (node.pos_samples + node.neg_samples) - estimated_performance_v2 = node.pos_samples_v2 / (node.pos_samples_v2 + node.neg_samples_v2) - print("\nnode id: ", node.node_id) - print("estimated performance (new v2.5): ", round(estimated_performance, 2)) - print("estimated performance (current v2): ", round(estimated_performance_v2, 2)) - - -if __name__ == '__main__': - - file_name = 'routes_v0.csv' - list_measurements, dict_nodes = read_input_file(file_name) - compute_node_scores(list_measurements, dict_nodes) \ No newline at end of file From 3be9e06bef1ea56c469d3234637c7e303ab381e4 Mon Sep 17 00:00:00 2001 From: durch Date: Thu, 15 May 2025 13:28:30 +0200 Subject: [PATCH 05/25] sqlx prepare, bunch of nits --- ...fb84ab5e7d7435297573523e2532560c2e302.json | 26 ----- ...027595b91739f3579e1f289b0c722ea91bbcc.json | 44 +++++++++ ...83ead09f4d7319b7997fa2a9bb628f9404166.json | 26 ----- .../20250513104800_routes_table.sql | 29 +++--- nym-api/src/support/storage/manager.rs | 97 ++++++++++--------- 5 files changed, 108 insertions(+), 114 deletions(-) delete mode 100644 nym-api/.sqlx/query-676299beb2004ab89f7b38cf21ffb84ab5e7d7435297573523e2532560c2e302.json create mode 100644 nym-api/.sqlx/query-6b2479c02cf1ef5ae674ce0ab4d027595b91739f3579e1f289b0c722ea91bbcc.json delete mode 100644 nym-api/.sqlx/query-c19e1b3768bf2929407599e6e8783ead09f4d7319b7997fa2a9bb628f9404166.json diff --git a/nym-api/.sqlx/query-676299beb2004ab89f7b38cf21ffb84ab5e7d7435297573523e2532560c2e302.json b/nym-api/.sqlx/query-676299beb2004ab89f7b38cf21ffb84ab5e7d7435297573523e2532560c2e302.json deleted file mode 100644 index 35be81ffcbc..00000000000 --- a/nym-api/.sqlx/query-676299beb2004ab89f7b38cf21ffb84ab5e7d7435297573523e2532560c2e302.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT\n d.node_id as \"node_id: NodeId\",\n CASE WHEN count(*) > 3 THEN AVG(reliability) ELSE 100 END as \"value: f32\"\n FROM\n gateway_details d\n JOIN\n gateway_status s on d.id = s.gateway_details_id\n WHERE\n timestamp >= ? AND\n timestamp <= ?\n GROUP BY 1\n ", - "describe": { - "columns": [ - { - "name": "node_id: NodeId", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "value: f32", - "ordinal": 1, - "type_info": "Int" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - true - ] - }, - "hash": "676299beb2004ab89f7b38cf21ffb84ab5e7d7435297573523e2532560c2e302" -} diff --git a/nym-api/.sqlx/query-6b2479c02cf1ef5ae674ce0ab4d027595b91739f3579e1f289b0c722ea91bbcc.json b/nym-api/.sqlx/query-6b2479c02cf1ef5ae674ce0ab4d027595b91739f3579e1f289b0c722ea91bbcc.json new file mode 100644 index 00000000000..f1ef38dc95c --- /dev/null +++ b/nym-api/.sqlx/query-6b2479c02cf1ef5ae674ce0ab4d027595b91739f3579e1f289b0c722ea91bbcc.json @@ -0,0 +1,44 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT\n layer1 as \"layer1\",\n layer2 as \"layer2\",\n layer3 as \"layer3\",\n gw as \"gw\",\n success\n FROM routes\n WHERE timestamp >= ? AND timestamp <= ?\n ORDER BY timestamp ASC\n ", + "describe": { + "columns": [ + { + "name": "layer1", + "ordinal": 0, + "type_info": "Int64" + }, + { + "name": "layer2", + "ordinal": 1, + "type_info": "Int64" + }, + { + "name": "layer3", + "ordinal": 2, + "type_info": "Int64" + }, + { + "name": "gw", + "ordinal": 3, + "type_info": "Int64" + }, + { + "name": "success", + "ordinal": 4, + "type_info": "Bool" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "6b2479c02cf1ef5ae674ce0ab4d027595b91739f3579e1f289b0c722ea91bbcc" +} diff --git a/nym-api/.sqlx/query-c19e1b3768bf2929407599e6e8783ead09f4d7319b7997fa2a9bb628f9404166.json b/nym-api/.sqlx/query-c19e1b3768bf2929407599e6e8783ead09f4d7319b7997fa2a9bb628f9404166.json deleted file mode 100644 index 0c6d2f6072b..00000000000 --- a/nym-api/.sqlx/query-c19e1b3768bf2929407599e6e8783ead09f4d7319b7997fa2a9bb628f9404166.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT\n d.mix_id as \"mix_id: NodeId\",\n AVG(s.reliability) as \"value: f32\"\n FROM\n mixnode_details d\n JOIN\n mixnode_status s on d.id = s.mixnode_details_id\n WHERE\n timestamp >= ? AND\n timestamp <= ?\n GROUP BY 1\n ", - "describe": { - "columns": [ - { - "name": "mix_id: NodeId", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "value: f32", - "ordinal": 1, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - true - ] - }, - "hash": "c19e1b3768bf2929407599e6e8783ead09f4d7319b7997fa2a9bb628f9404166" -} diff --git a/nym-api/migrations/20250513104800_routes_table.sql b/nym-api/migrations/20250513104800_routes_table.sql index 122c2304795..89d5c009cef 100644 --- a/nym-api/migrations/20250513104800_routes_table.sql +++ b/nym-api/migrations/20250513104800_routes_table.sql @@ -1,16 +1,17 @@ --- Drop the table if it exists -DROP TABLE IF EXISTS routes; - --- Create the routes table -CREATE TABLE routes ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - layer1 INTEGER, - layer2 INTEGER, - layer3 INTEGER, - gw INTEGER, - success BOOLEAN +-- Add routes table for storing route metrics data +CREATE TABLE IF NOT EXISTS routes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + layer1 INTEGER NOT NULL, -- NodeId of layer 1 mixnode + layer2 INTEGER NOT NULL, -- NodeId of layer 2 mixnode + layer3 INTEGER NOT NULL, -- NodeId of layer 3 mixnode + gw INTEGER NOT NULL, -- NodeId of gateway + success BOOLEAN NOT NULL, -- Whether the packet was delivered successfully + timestamp INTEGER NOT NULL DEFAULT (unixepoch()) -- When the measurement was taken ); --- Create an index on created_at -CREATE INDEX routes_created_at ON routes(created_at); +-- Add indexes for efficient querying +CREATE INDEX IF NOT EXISTS idx_routes_timestamp ON routes(timestamp); +CREATE INDEX IF NOT EXISTS idx_routes_layer1 ON routes(layer1); +CREATE INDEX IF NOT EXISTS idx_routes_layer2 ON routes(layer2); +CREATE INDEX IF NOT EXISTS idx_routes_layer3 ON routes(layer3); +CREATE INDEX IF NOT EXISTS idx_routes_gw ON routes(gw); \ No newline at end of file diff --git a/nym-api/src/support/storage/manager.rs b/nym-api/src/support/storage/manager.rs index 3d8bd07bfa0..836ea4b600c 100644 --- a/nym-api/src/support/storage/manager.rs +++ b/nym-api/src/support/storage/manager.rs @@ -96,27 +96,25 @@ impl StorageManager { start_ts_secs: i64, end_ts_secs: i64, ) -> Result, sqlx::Error> { - let result = sqlx::query_as!( - AvgMixnodeReliability, - r#" - SELECT - d.mix_id as "mix_id: NodeId", - AVG(s.reliability) as "value: f32" - FROM - mixnode_details d - JOIN - mixnode_status s on d.id = s.mixnode_details_id - WHERE - timestamp >= ? AND - timestamp <= ? - GROUP BY 1 - "#, - start_ts_secs, - end_ts_secs - ) - .fetch_all(&self.connection_pool) - .await?; - Ok(result) + let corrected_reliabilities = self + .calculate_corrected_node_reliabilities_for_interval(start_ts_secs, end_ts_secs) + .await + .map_err(|_e| sqlx::Error::PoolClosed)?; // Example: map anyhow::Error to sqlx::Error; adjust as needed + + let mut avg_mix_reliabilities = Vec::new(); + + for corrected_node_info in corrected_reliabilities { + // Check if this node_id is a mixnode by attempting to fetch its identity key as a mixnode. + // This relies on get_mixnode_identity_key returning Some for mixnodes and None (or error) for non-mixnodes. + if self.get_mixnode_identity_key(corrected_node_info.node_id).await?.is_some() { + avg_mix_reliabilities.push(AvgMixnodeReliability { + mix_id: corrected_node_info.node_id, + value: Some(corrected_node_info.reliability as f32), + }); + } + } + + Ok(avg_mix_reliabilities) } pub(super) async fn get_all_avg_gateway_reliability_in_interval( @@ -124,27 +122,30 @@ impl StorageManager { start_ts_secs: i64, end_ts_secs: i64, ) -> Result, sqlx::Error> { - let result = sqlx::query_as!( - AvgGatewayReliability, - r#" - SELECT - d.node_id as "node_id: NodeId", - CASE WHEN count(*) > 3 THEN AVG(reliability) ELSE 100 END as "value: f32" - FROM - gateway_details d - JOIN - gateway_status s on d.id = s.gateway_details_id - WHERE - timestamp >= ? AND - timestamp <= ? - GROUP BY 1 - "#, - start_ts_secs, - end_ts_secs - ) - .fetch_all(&self.connection_pool) - .await?; - Ok(result) + let corrected_reliabilities = self + .calculate_corrected_node_reliabilities_for_interval(start_ts_secs, end_ts_secs) + .await + .map_err(|_e| sqlx::Error::PoolClosed)?; // Example: map anyhow::Error to sqlx::Error; adjust as needed + + let mut avg_gateway_reliabilities = Vec::new(); + + for corrected_node_info in corrected_reliabilities { + // Check if this node_id is a gateway. + if self.get_gateway_identity_key(corrected_node_info.node_id).await?.is_some() { + let total_samples = corrected_node_info.pos_samples_in_interval + corrected_node_info.neg_samples_in_interval; + let reliability_value = if total_samples <= 3 { + 100.0 // Default to 100% if 3 or fewer samples + } else { + corrected_node_info.reliability as f32 + }; + + avg_gateway_reliabilities.push(AvgGatewayReliability { + node_id: corrected_node_info.node_id, // AvgGatewayReliability uses node_id + value: Some(reliability_value), + }); + } + } + Ok(avg_gateway_reliabilities) } /// Tries to obtain row id of given mixnode given its identity. @@ -1387,11 +1388,11 @@ impl StorageManager { // Temporary struct to match the expected columns from the 'routes' table // NodeId here is assumed to be compatible with how layer1, etc. are stored (e.g. u32/i32/i64) struct RawRouteData { - layer1: NodeId, - layer2: NodeId, - layer3: NodeId, - gw: NodeId, - success: bool, + layer1: i64, + layer2: i64, + layer3: i64, + gw: i64, + success: Option, // timestamp: i64, // Not explicitly selected into struct, but used in WHERE and ORDER BY } @@ -1420,7 +1421,7 @@ impl StorageManager { Ok(db_routes .into_iter() - .map(|r| (r.layer1, r.layer2, r.layer3, r.gw, r.success)) + .map(|r| (r.layer1 as NodeId, r.layer2 as NodeId, r.layer3 as NodeId, r.gw as NodeId, r.success.unwrap_or_default())) .collect()) } From 8d8ce291131a1aaf6bb5dbeaaccd76835c77e43a Mon Sep 17 00:00:00 2001 From: durch Date: Mon, 19 May 2025 16:42:37 +0200 Subject: [PATCH 06/25] Update NM readme, fmt --- nym-api/src/support/storage/manager.rs | 30 +++++++-- nym-network-monitor/README.md | 87 ++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 6 deletions(-) diff --git a/nym-api/src/support/storage/manager.rs b/nym-api/src/support/storage/manager.rs index 836ea4b600c..063819372ca 100644 --- a/nym-api/src/support/storage/manager.rs +++ b/nym-api/src/support/storage/manager.rs @@ -12,9 +12,9 @@ use crate::support::storage::DbIdCache; use nym_mixnet_contract_common::{EpochId, IdentityKey, NodeId}; use nym_types::monitoring::{NodeResult, RouteResult}; use sqlx::FromRow; +use std::collections::HashMap; use time::{Date, OffsetDateTime}; use tracing::info; -use std::collections::HashMap; #[derive(Clone)] pub(crate) struct StorageManager { @@ -106,7 +106,11 @@ impl StorageManager { for corrected_node_info in corrected_reliabilities { // Check if this node_id is a mixnode by attempting to fetch its identity key as a mixnode. // This relies on get_mixnode_identity_key returning Some for mixnodes and None (or error) for non-mixnodes. - if self.get_mixnode_identity_key(corrected_node_info.node_id).await?.is_some() { + if self + .get_mixnode_identity_key(corrected_node_info.node_id) + .await? + .is_some() + { avg_mix_reliabilities.push(AvgMixnodeReliability { mix_id: corrected_node_info.node_id, value: Some(corrected_node_info.reliability as f32), @@ -131,8 +135,13 @@ impl StorageManager { for corrected_node_info in corrected_reliabilities { // Check if this node_id is a gateway. - if self.get_gateway_identity_key(corrected_node_info.node_id).await?.is_some() { - let total_samples = corrected_node_info.pos_samples_in_interval + corrected_node_info.neg_samples_in_interval; + if self + .get_gateway_identity_key(corrected_node_info.node_id) + .await? + .is_some() + { + let total_samples = corrected_node_info.pos_samples_in_interval + + corrected_node_info.neg_samples_in_interval; let reliability_value = if total_samples <= 3 { 100.0 // Default to 100% if 3 or fewer samples } else { @@ -1421,7 +1430,15 @@ impl StorageManager { Ok(db_routes .into_iter() - .map(|r| (r.layer1 as NodeId, r.layer2 as NodeId, r.layer3 as NodeId, r.gw as NodeId, r.success.unwrap_or_default())) + .map(|r| { + ( + r.layer1 as NodeId, + r.layer2 as NodeId, + r.layer3 as NodeId, + r.gw as NodeId, + r.success.unwrap_or_default(), + ) + }) .collect()) } @@ -1491,7 +1508,8 @@ impl StorageManager { // Attempt to fetch identity, first as mixnode, then as gateway if not found. // This assumes get_mixnode_identity_key and get_gateway_identity_key return Result, sqlx::Error> - let mut identity: Option = self.get_mixnode_identity_key(node_id).await.unwrap_or(None); + let mut identity: Option = + self.get_mixnode_identity_key(node_id).await.unwrap_or(None); if identity.is_none() { identity = self.get_gateway_identity_key(node_id).await.unwrap_or(None); } diff --git a/nym-network-monitor/README.md b/nym-network-monitor/README.md index d63ba008146..0d34b2e9749 100644 --- a/nym-network-monitor/README.md +++ b/nym-network-monitor/README.md @@ -4,6 +4,14 @@ Monitors the Nym network by sending itself packages across the mixnet. Network monitor is running two tokio tasks, one manages mixnet clients and another manages monitoring itself. Monitor is designed to be driven externally, via an HTTP api. This means that it does not do any monitoring unless driven by something like [`locust`](https://locust.io/). This allows us to tailor the load externally, potentially distributing it across multiple monitors. +## Features + +- **Continuous Monitoring**: Periodically sends test packets through the network +- **Node Performance**: Tracks individual node reliability metrics +- **Route Performance**: Records route-level success rates through specific node combinations +- **Multi-API Submission**: Capable of submitting metrics to multiple API endpoints (fanout) +- **Force Routing**: Can force packets through all mixnet nodes for comprehensive testing + ### Client manager On start network monitor will spawn `C` clients, with 10 being the default. Random client is dropped every `T`, defaults to 60 seconds, and a new one is created. Clients chose a random gateway to connect to the mixnet. Meaning that on average all gateways will be tested in `NUMBER_OF_GATEWAYS/N*T`, assuming at least one request per client per T. @@ -40,8 +48,87 @@ Options: -m, --mixnet-timeout [default: 10] --generate-key-pair --private-key + --database-url SQLite database URL + --nym-apis Comma-separated list of Nym API URLs -h, --help Print help -V, --version Print version ``` +## Metrics Collection & Reporting + +### Node Metrics + +The Network Monitor tracks performance metrics for individual nodes: + +- **Reliability**: Percentage of successful packet handling +- **Failure Sequences**: Tracking consecutive failures +- **Volume**: Number of packets handled + +### Route Metrics + +Since version 1.1.0, the Network Monitor also tracks route-level metrics: + +- **Route Success Rates**: Tracking which specific combinations of nodes have successful packet delivery +- **Layer Analysis**: Identifying weak points in specific network layers +- **Path Correction**: Improved algorithms for attributing failures to specific nodes + +### Metrics Fanout + +The Network Monitor can submit metrics to multiple API endpoints simultaneously: + +1. Metrics are collected during each monitoring cycle +2. The collected metrics are submitted to each configured API endpoint +3. This provides redundancy and allows for distributed metrics collection + +To enable metrics fanout, use the `--nym-apis` parameter with a comma-separated list of API URLs: + +```bash +cargo run -p nym-network-monitor -- --nym-apis https://api1.example.com,https://api2.example.com +``` + +## Route Data Structure + +Route metrics use the following data structure: + +```rust +// Route performance data +pub struct RouteResult { + pub layer1: u32, // NodeId of layer 1 mixnode + pub layer2: u32, // NodeId of layer 2 mixnode + pub layer3: u32, // NodeId of layer 3 mixnode + pub gw: u32, // NodeId of gateway + pub success: bool, // Whether the packet was successfully delivered +} +``` + +## Forced Routing + +To ensure comprehensive testing of all nodes in the network, the Monitor supports forcing packets through all available nodes: + +- Each node is assigned to a specific layer (1, 2, or 3) deterministically +- This ensures all nodes participate in route testing +- The routing algorithm cycles through all possible node combinations + +Since version 1.1.0, Network Monitor automatically forces all available nodes to be active and distributes them evenly across the three layers (Layer 1, Layer 2, and Layer 3). This ensures every node in the network participates in testing, providing more comprehensive coverage and better metrics for all nodes, not just the popular ones. + +## Node Performance Calculation + +The Network Monitor uses a sophisticated algorithm for attributing failures to specific nodes: + +1. For successful packet deliveries, all nodes in the path receive a positive sample +2. For failed deliveries: + - Nodes with more than 2 consecutive failures are considered "guilty" + - If no node is clearly guilty, all nodes in the path receive negative samples +3. Final node reliability is calculated as: positive_samples / (positive_samples + negative_samples) + +## Changelog + +### Version 1.1.0 +- Added route-level metrics tracking and submission +- Implemented metrics fanout to multiple API endpoints +- Forced routing through all available nodes for comprehensive testing +- Improved reliability corrections with consecutive failure tracking +- Updated data structures for better metrics organization +### Version 1.0.2 +- Initial public release with basic monitoring capabilities \ No newline at end of file From 507ddf246c5d9c1129ad6225e057c42356f7a2da Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 20 May 2025 09:32:57 +0200 Subject: [PATCH 07/25] Stagger out route sending --- nym-network-monitor/src/accounting.rs | 46 ++++++++++++++++----------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/nym-network-monitor/src/accounting.rs b/nym-network-monitor/src/accounting.rs index ea695a49638..4f1596dcff7 100644 --- a/nym-network-monitor/src/accounting.rs +++ b/nym-network-monitor/src/accounting.rs @@ -543,26 +543,34 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> let network_account = NetworkAccount::finalize()?; let accounting_routes = network_account.accounting_routes; - let route_results = accounting_routes - .iter() - .map(|route| { - RouteResult::new( - route.mix_nodes.0, - route.mix_nodes.1, - route.mix_nodes.2, - route.gateway_node, - route.success, - ) + match accounting_routes + .chunks(10) + .map(|chunk| { + let route_results = chunk + .iter() + .map(|route| { + RouteResult::new( + route.mix_nodes.0, + route.mix_nodes.1, + route.mix_nodes.2, + route.gateway_node, + route.success, + ) + }) + .collect::>(); + let monitor_results = MonitorResults::Route(route_results); + let monitor_message = MonitorMessage::new(monitor_results, private_key); + client.post(&node_submit_url).json(&monitor_message).send() }) - .collect::>(); - - let monitor_results = MonitorResults::Route(route_results); - let monitor_message = MonitorMessage::new(monitor_results, private_key); - client - .post(&node_submit_url) - .json(&monitor_message) - .send() - .await?; + .collect::>() + .collect::>>() + .await + .into_iter() + .collect::, _>>() + { + Ok(_) => info!("Successfully submitted accounting routes to db"), + Err(e) => error!("Error submitting accounting routes to db: {}", e), + }; } } } From 09026307f4eea9496770ead311c487a8b2ef287f Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 20 May 2025 09:48:09 +0200 Subject: [PATCH 08/25] Debug logging for nym-api --- .../src/node_status_api/handlers/without_monitor.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/nym-api/src/node_status_api/handlers/without_monitor.rs b/nym-api/src/node_status_api/handlers/without_monitor.rs index bddb67cb3da..27cfeec416e 100644 --- a/nym-api/src/node_status_api/handlers/without_monitor.rs +++ b/nym-api/src/node_status_api/handlers/without_monitor.rs @@ -21,7 +21,7 @@ use nym_api_requests::models::{ use nym_http_api_common::{FormattedResponse, OutputParams}; use nym_mixnet_contract_common::NodeId; use nym_types::monitoring::{MonitorMessage, MonitorResults}; -use tracing::error; +use tracing::{error, info}; pub(super) fn mandatory_routes() -> Router { Router::new() @@ -77,6 +77,8 @@ pub(crate) async fn submit_route_monitoring_results( State(state): State, Json(message): Json, ) -> AxumResult<()> { + info!("############ Received route monitoring results"); + if !message.is_in_allowed() { return Err(AxumErrorResponse::forbidden( "Monitor not registered to submit results", @@ -93,8 +95,15 @@ pub(crate) async fn submit_route_monitoring_results( match message.results() { MonitorResults::Route(results) => { + info!( + "############ Submitting {} route monitoring results", + results.len() + ); match state.storage.submit_route_monitoring_results(results).await { - Ok(_) => Ok(()), + Ok(_) => { + info!("############ Successfully submitted route monitoring results"); + Ok(()) + } Err(err) => { error!("failed to submit node monitoring results: {err}"); Err(AxumErrorResponse::internal_msg( From eee9d8ab0ce06777b913a05c4ad28d2f126f304c Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 20 May 2025 10:00:13 +0200 Subject: [PATCH 09/25] DEBUG: disable epoch operations, less noisy logging --- .../nymsphinx/chunking/src/reconstruction.rs | 2 +- nym-api/src/support/cli/run.rs | 54 +++++++++---------- nym-network-monitor/src/accounting.rs | 10 +++- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/common/nymsphinx/chunking/src/reconstruction.rs b/common/nymsphinx/chunking/src/reconstruction.rs index 000b0ca6dc4..70d84bc91cb 100644 --- a/common/nymsphinx/chunking/src/reconstruction.rs +++ b/common/nymsphinx/chunking/src/reconstruction.rs @@ -124,7 +124,7 @@ impl ReconstructionBuffer { // TODO: what to do in that case? give up on the message? overwrite it? panic? // it *might* be due to lock ack-packet, but let's keep the `warn` level in case // it could be somehow exploited - warn!( + debug!( "duplicate fragment received! - frag - {} (set id: {})", fragment.current_fragment(), fragment.id() diff --git a/nym-api/src/support/cli/run.rs b/nym-api/src/support/cli/run.rs index 334a800657d..5e0eb28e3e7 100644 --- a/nym-api/src/support/cli/run.rs +++ b/nym-api/src/support/cli/run.rs @@ -262,33 +262,33 @@ async fn start_nym_api_tasks_axum(config: &Config) -> anyhow::Result( - config, - &nym_contract_cache_state, - described_nodes_cache.clone(), - node_status_cache_state.clone(), - &storage, - nyxd_client.clone(), - &task_manager, - ) - .await; - - HistoricalUptimeUpdater::start(storage.to_owned(), &task_manager); - - // start 'rewarding' if its enabled - if config.rewarding.enabled { - epoch_operations::ensure_rewarding_permission(&nyxd_client).await?; - EpochAdvancer::start( - nyxd_client, - &nym_contract_cache_state, - &node_status_cache_state, - described_nodes_cache.clone(), - &storage, - &task_manager, - ); - } - } + // if config.network_monitor.enabled { + // network_monitor::start::( + // config, + // &nym_contract_cache_state, + // described_nodes_cache.clone(), + // node_status_cache_state.clone(), + // &storage, + // nyxd_client.clone(), + // &task_manager, + // ) + // .await; + + // HistoricalUptimeUpdater::start(storage.to_owned(), &task_manager); + + // // start 'rewarding' if its enabled + // if config.rewarding.enabled { + // epoch_operations::ensure_rewarding_permission(&nyxd_client).await?; + // EpochAdvancer::start( + // nyxd_client, + // &nym_contract_cache_state, + // &node_status_cache_state, + // described_nodes_cache.clone(), + // &storage, + // &task_manager, + // ); + // } + // } let bind_address = config.base.bind_address.to_owned(); let server = router.build_server(&bind_address).await?; diff --git a/nym-network-monitor/src/accounting.rs b/nym-network-monitor/src/accounting.rs index 4f1596dcff7..1f41360a0f3 100644 --- a/nym-network-monitor/src/accounting.rs +++ b/nym-network-monitor/src/accounting.rs @@ -568,8 +568,14 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> .into_iter() .collect::, _>>() { - Ok(_) => info!("Successfully submitted accounting routes to db"), - Err(e) => error!("Error submitting accounting routes to db: {}", e), + Ok(_) => info!( + "Successfully submitted accounting routes to {}", + nym_api_url + ), + Err(e) => error!( + "Error submitting accounting routes to {}: {}", + nym_api_url, e + ), }; } } From e881da834b73a31cc1f282728646bcf7ac06ce16 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 20 May 2025 11:05:25 +0200 Subject: [PATCH 10/25] More NM logging --- nym-network-monitor/src/accounting.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/nym-network-monitor/src/accounting.rs b/nym-network-monitor/src/accounting.rs index 1f41360a0f3..f8ae606087e 100644 --- a/nym-network-monitor/src/accounting.rs +++ b/nym-network-monitor/src/accounting.rs @@ -543,6 +543,7 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> let network_account = NetworkAccount::finalize()?; let accounting_routes = network_account.accounting_routes; + info!("Submitting {} accounting routes", accounting_routes.len()); match accounting_routes .chunks(10) .map(|chunk| { From 58493a69aad2d576b5dde3be93466f59cae1c4b7 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 20 May 2025 11:15:11 +0200 Subject: [PATCH 11/25] Fix submission URLs --- .../validator-client/src/nym_api/routes.rs | 1 + nym-network-monitor/src/accounting.rs | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/common/client-libs/validator-client/src/nym_api/routes.rs b/common/client-libs/validator-client/src/nym_api/routes.rs index 320e9904ec9..6c315a3ab43 100644 --- a/common/client-libs/validator-client/src/nym_api/routes.rs +++ b/common/client-libs/validator-client/src/nym_api/routes.rs @@ -73,6 +73,7 @@ pub const STAKE_SATURATION: &str = "stake-saturation"; pub const INCLUSION_CHANCE: &str = "inclusion-probability"; pub const SUBMIT_GATEWAY: &str = "submit-gateway-monitoring-results"; pub const SUBMIT_NODE: &str = "submit-node-monitoring-results"; +pub const SUBMIT_ROUTE: &str = "submit-route-monitoring-results"; pub const SERVICE_PROVIDERS: &str = "services"; diff --git a/nym-network-monitor/src/accounting.rs b/nym-network-monitor/src/accounting.rs index f8ae606087e..f5d6ee97ee2 100644 --- a/nym-network-monitor/src/accounting.rs +++ b/nym-network-monitor/src/accounting.rs @@ -5,11 +5,13 @@ use std::{ use anyhow::Result; use futures::{pin_mut, stream::FuturesUnordered, StreamExt}; -use log::{debug, error, info}; +use log::{debug, error, info, warn}; use nym_sphinx::chunking::{monitoring, SentFragment}; use nym_topology::{NymRouteProvider, RoutingNode}; use nym_types::monitoring::{MonitorMessage, MonitorResults, NodeResult, RouteResult}; -use nym_validator_client::nym_api::routes::{API_VERSION, STATUS, SUBMIT_GATEWAY, SUBMIT_NODE}; +use nym_validator_client::nym_api::routes::{ + API_VERSION, STATUS, SUBMIT_GATEWAY, SUBMIT_NODE, SUBMIT_ROUTE, +}; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use serde::{Deserialize, Serialize}; @@ -493,17 +495,21 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> if let Some(private_key) = PRIVATE_KEY.get() { if let Some(nym_api_urls) = NYM_API_URLS.get() { + info!("Submitting metrics to {} nym apis", nym_api_urls.len()); for nym_api_url in nym_api_urls { + info!("Submitting metrics to {}", nym_api_url); let node_stats = monitor_mixnode_results().await?; let gateway_stats = monitor_gateway_results().await?; - - info!("Submitting metrics to {}", nym_api_url); let client = reqwest::Client::new(); let node_submit_url = - format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_NODE}", nym_api_url); - let gateway_submit_url = - format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_GATEWAY}", nym_api_url); + format!("{}/api/{API_VERSION}/{STATUS}/{SUBMIT_NODE}", nym_api_url); + let gateway_submit_url = format!( + "{}/api/{API_VERSION}/{STATUS}/{SUBMIT_GATEWAY}", + nym_api_url + ); + let route_submit_url = + format!("{}/api/{API_VERSION}/{STATUS}/{SUBMIT_ROUTE}", nym_api_url); info!("Submitting {} mixnode measurements", node_stats.len()); @@ -561,7 +567,7 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> .collect::>(); let monitor_results = MonitorResults::Route(route_results); let monitor_message = MonitorMessage::new(monitor_results, private_key); - client.post(&node_submit_url).json(&monitor_message).send() + client.post(&route_submit_url).json(&monitor_message).send() }) .collect::>() .collect::>>() @@ -580,6 +586,8 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> }; } } + } else { + warn!("No private key or nym api urls found"); } NetworkAccount::empty_buffers(); From 356cf0010683e88c308f168b420a5ac40496bef7 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 20 May 2025 11:21:54 +0200 Subject: [PATCH 12/25] Put the monitoring back properly --- nym-api/src/support/cli/run.rs | 54 +++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/nym-api/src/support/cli/run.rs b/nym-api/src/support/cli/run.rs index 5e0eb28e3e7..334a800657d 100644 --- a/nym-api/src/support/cli/run.rs +++ b/nym-api/src/support/cli/run.rs @@ -262,33 +262,33 @@ async fn start_nym_api_tasks_axum(config: &Config) -> anyhow::Result( - // config, - // &nym_contract_cache_state, - // described_nodes_cache.clone(), - // node_status_cache_state.clone(), - // &storage, - // nyxd_client.clone(), - // &task_manager, - // ) - // .await; - - // HistoricalUptimeUpdater::start(storage.to_owned(), &task_manager); - - // // start 'rewarding' if its enabled - // if config.rewarding.enabled { - // epoch_operations::ensure_rewarding_permission(&nyxd_client).await?; - // EpochAdvancer::start( - // nyxd_client, - // &nym_contract_cache_state, - // &node_status_cache_state, - // described_nodes_cache.clone(), - // &storage, - // &task_manager, - // ); - // } - // } + if config.network_monitor.enabled { + network_monitor::start::( + config, + &nym_contract_cache_state, + described_nodes_cache.clone(), + node_status_cache_state.clone(), + &storage, + nyxd_client.clone(), + &task_manager, + ) + .await; + + HistoricalUptimeUpdater::start(storage.to_owned(), &task_manager); + + // start 'rewarding' if its enabled + if config.rewarding.enabled { + epoch_operations::ensure_rewarding_permission(&nyxd_client).await?; + EpochAdvancer::start( + nyxd_client, + &nym_contract_cache_state, + &node_status_cache_state, + described_nodes_cache.clone(), + &storage, + &task_manager, + ); + } + } let bind_address = config.base.bind_address.to_owned(); let server = router.build_server(&bind_address).await?; From 06c412b3ba7e5d2c07de5880172507a5086196d6 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 20 May 2025 11:29:02 +0200 Subject: [PATCH 13/25] Remove debug logging --- .../src/node_status_api/handlers/without_monitor.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/nym-api/src/node_status_api/handlers/without_monitor.rs b/nym-api/src/node_status_api/handlers/without_monitor.rs index 27cfeec416e..bddb67cb3da 100644 --- a/nym-api/src/node_status_api/handlers/without_monitor.rs +++ b/nym-api/src/node_status_api/handlers/without_monitor.rs @@ -21,7 +21,7 @@ use nym_api_requests::models::{ use nym_http_api_common::{FormattedResponse, OutputParams}; use nym_mixnet_contract_common::NodeId; use nym_types::monitoring::{MonitorMessage, MonitorResults}; -use tracing::{error, info}; +use tracing::error; pub(super) fn mandatory_routes() -> Router { Router::new() @@ -77,8 +77,6 @@ pub(crate) async fn submit_route_monitoring_results( State(state): State, Json(message): Json, ) -> AxumResult<()> { - info!("############ Received route monitoring results"); - if !message.is_in_allowed() { return Err(AxumErrorResponse::forbidden( "Monitor not registered to submit results", @@ -95,15 +93,8 @@ pub(crate) async fn submit_route_monitoring_results( match message.results() { MonitorResults::Route(results) => { - info!( - "############ Submitting {} route monitoring results", - results.len() - ); match state.storage.submit_route_monitoring_results(results).await { - Ok(_) => { - info!("############ Successfully submitted route monitoring results"); - Ok(()) - } + Ok(_) => Ok(()), Err(err) => { error!("failed to submit node monitoring results: {err}"); Err(AxumErrorResponse::internal_msg( From 5d8bdc65704d95a2457c086a334223ac4da1e2d0 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 27 May 2025 10:28:00 +0200 Subject: [PATCH 14/25] Bunch of new query files --- ...bad1e16988a3f9989d135840500e1143ce5e5.json | 32 +++++++++++++++++++ ...afa2525da6c0b871633aad80ad555db9cf47c.json | 32 +++++++++++++++++++ ...3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json | 12 +++++++ ...765854899103fd3c0fa670eb6809492270e02.json | 12 +++++++ ...2038a77ec37cca9f9aef18008dcd03030c2c4.json | 12 +++++++ ...e38b7f6ceb8e9191a7b9201922efcf6b07966.json | 12 +++++++ ...4d63462e9ea0049e2edafea1dc3f8476b33e4.json | 12 +++++++ ...de3eb76fed954b7336530401db72cd008aff3.json | 12 +++++++ ...15dcfcffb502ba8398caefd56c481f44eb84e.json | 12 +++++++ ...eafc9b5f64061b6c9a829e2912945b6cffc82.json | 32 +++++++++++++++++++ ...89dde284b38a3a4960afed758206d03ca1cf4.json | 12 +++++++ ...b253c071e04eb853d4b0f3b21782ea57c2f68.json | 12 +++++++ 12 files changed, 204 insertions(+) create mode 100644 nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json create mode 100644 nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json create mode 100644 nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json create mode 100644 nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json create mode 100644 nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json create mode 100644 nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json create mode 100644 nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json create mode 100644 nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json create mode 100644 nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json create mode 100644 nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json create mode 100644 nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json create mode 100644 nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json diff --git a/nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json b/nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json new file mode 100644 index 00000000000..9c0c64d6648 --- /dev/null +++ b/nym-api/.sqlx/query-00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT epoch_id as \"epoch_id: u32\", serialised_signatures, serialization_revision as \"serialization_revision: u8\"\n FROM expiration_date_signatures\n WHERE expiration_date = ?\n ", + "describe": { + "columns": [ + { + "name": "epoch_id: u32", + "ordinal": 0, + "type_info": "Int64" + }, + { + "name": "serialised_signatures", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "serialization_revision: u8", + "ordinal": 2, + "type_info": "Int64" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "00d857b624e7edab1198114b17cbad1e16988a3f9989d135840500e1143ce5e5" +} diff --git a/nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json b/nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json new file mode 100644 index 00000000000..c8fbd219114 --- /dev/null +++ b/nym-api/.sqlx/query-0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT epoch_id as \"epoch_id: u32\", serialised_key, serialization_revision as \"serialization_revision: u8\"\n FROM master_verification_key WHERE epoch_id = ?\n ", + "describe": { + "columns": [ + { + "name": "epoch_id: u32", + "ordinal": 0, + "type_info": "Int64" + }, + { + "name": "serialised_key", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "serialization_revision: u8", + "ordinal": 2, + "type_info": "Int64" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "0112296b190328a3856d1adf51aafa2525da6c0b871633aad80ad555db9cf47c" +} diff --git a/nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json b/nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json new file mode 100644 index 00000000000..e4f26c50533 --- /dev/null +++ b/nym-api/.sqlx/query-16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n INSERT OR IGNORE INTO expiration_date_signatures(expiration_date, epoch_id, serialised_signatures, serialization_revision)\n VALUES (?, ?, ?, ?);\n UPDATE expiration_date_signatures\n SET\n serialised_signatures = ?,\n serialization_revision = ?\n WHERE expiration_date = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 7 + }, + "nullable": [] + }, + "hash": "16d10f0ac0ed9ce4239937f46df3797a6a9ee7db2aab9f1b5e55f7c13c53bcc1" +} diff --git a/nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json b/nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json new file mode 100644 index 00000000000..6ee25bbc1a4 --- /dev/null +++ b/nym-api/.sqlx/query-284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n INSERT INTO ecash_ticketbook\n (serialization_revision, ticketbook_data, expiration_date, ticketbook_type, epoch_id, total_tickets, used_tickets)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 7 + }, + "nullable": [] + }, + "hash": "284b3ceae42f9320c30323dde47765854899103fd3c0fa670eb6809492270e02" +} diff --git a/nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json b/nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json new file mode 100644 index 00000000000..ea79b11bbd5 --- /dev/null +++ b/nym-api/.sqlx/query-37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM ecash_ticketbook WHERE expiration_date <= ?", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "37f82c9ec26b53d01601a2d6df82038a77ec37cca9f9aef18008dcd03030c2c4" +} diff --git a/nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json b/nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json new file mode 100644 index 00000000000..ea667b0bc6f --- /dev/null +++ b/nym-api/.sqlx/query-5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM pending_issuance WHERE deposit_id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "5c5d4bfabf18bc6fa56e76a9b98e38b7f6ceb8e9191a7b9201922efcf6b07966" +} diff --git a/nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json b/nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json new file mode 100644 index 00000000000..ae81f52d0e9 --- /dev/null +++ b/nym-api/.sqlx/query-81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n INSERT INTO pending_issuance\n (deposit_id, serialization_revision, pending_ticketbook_data, expiration_date)\n VALUES (?, ?, ?, ?)\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 4 + }, + "nullable": [] + }, + "hash": "81a12a8a419c88b1c28a5533fde4d63462e9ea0049e2edafea1dc3f8476b33e4" +} diff --git a/nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json b/nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json new file mode 100644 index 00000000000..051c18bba2d --- /dev/null +++ b/nym-api/.sqlx/query-84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE ecash_ticketbook SET used_tickets = used_tickets + ? WHERE id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 2 + }, + "nullable": [] + }, + "hash": "84cad8b1078a4000830835e6349de3eb76fed954b7336530401db72cd008aff3" +} diff --git a/nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json b/nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json new file mode 100644 index 00000000000..5fd4e4f2e65 --- /dev/null +++ b/nym-api/.sqlx/query-a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n INSERT OR IGNORE INTO master_verification_key(epoch_id, serialised_key, serialization_revision) VALUES (?, ?, ?);\n UPDATE master_verification_key\n SET\n serialised_key = ?,\n serialization_revision = ?\n WHERE epoch_id = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 6 + }, + "nullable": [] + }, + "hash": "a5b18e66d77ff802e274623605e15dcfcffb502ba8398caefd56c481f44eb84e" +} diff --git a/nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json b/nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json new file mode 100644 index 00000000000..e2f05399ee5 --- /dev/null +++ b/nym-api/.sqlx/query-ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT epoch_id as \"epoch_id: u32\", serialised_signatures, serialization_revision as \"serialization_revision: u8\"\n FROM coin_indices_signatures WHERE epoch_id = ?\n ", + "describe": { + "columns": [ + { + "name": "epoch_id: u32", + "ordinal": 0, + "type_info": "Int64" + }, + { + "name": "serialised_signatures", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "serialization_revision: u8", + "ordinal": 2, + "type_info": "Int64" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "ba96344db31b0f2155e2af53eaaeafc9b5f64061b6c9a829e2912945b6cffc82" +} diff --git a/nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json b/nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json new file mode 100644 index 00000000000..ec7111bc5a8 --- /dev/null +++ b/nym-api/.sqlx/query-bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n UPDATE ecash_ticketbook\n SET used_tickets = used_tickets - ?\n WHERE id = ?\n AND used_tickets = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "bc823c54143e2dc590b91347cd089dde284b38a3a4960afed758206d03ca1cf4" +} diff --git a/nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json b/nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json new file mode 100644 index 00000000000..a2077f76ae8 --- /dev/null +++ b/nym-api/.sqlx/query-bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n INSERT OR IGNORE INTO coin_indices_signatures(epoch_id, serialised_signatures, serialization_revision) VALUES (?, ?, ?);\n UPDATE coin_indices_signatures\n SET\n serialised_signatures = ?,\n serialization_revision = ?\n WHERE epoch_id = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 6 + }, + "nullable": [] + }, + "hash": "bd1973696121b6128bd75ae80fab253c071e04eb853d4b0f3b21782ea57c2f68" +} From 7d041ddd4436d48e9a09af91f84c40df08ec6327 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 27 May 2025 13:02:38 +0200 Subject: [PATCH 15/25] Explicit mnemonic to entrypoint --- nym-api/entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-api/entrypoint.sh b/nym-api/entrypoint.sh index bf4c1942c38..9abee830343 100755 --- a/nym-api/entrypoint.sh +++ b/nym-api/entrypoint.sh @@ -2,4 +2,4 @@ set -e -/usr/src/nym/target/release/nym-api init && /usr/src/nym/target/release/nym-api run \ No newline at end of file +/usr/src/nym/target/release/nym-api init --mnemonic "$MNEMONIC" && /usr/src/nym/target/release/nym-api run From c6aec663b79c7444adaa7760af508aaeb9a4824c Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 27 May 2025 13:18:31 +0200 Subject: [PATCH 16/25] Bump nym-api version --- nym-api/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index f9aa37314df..a2e3b05104d 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -4,7 +4,7 @@ [package] name = "nym-api" license = "GPL-3.0" -version = "1.1.57" +version = "1.1.58" authors.workspace = true edition = "2021" rust-version.workspace = true From e0966565e68d14759110bedec69424fdeeb0c617 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 27 May 2025 13:38:13 +0200 Subject: [PATCH 17/25] Mnemonic to run, bump --- nym-api/Cargo.toml | 2 +- nym-api/entrypoint.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index a2e3b05104d..ef8d255256e 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -4,7 +4,7 @@ [package] name = "nym-api" license = "GPL-3.0" -version = "1.1.58" +version = "1.1.59" authors.workspace = true edition = "2021" rust-version.workspace = true diff --git a/nym-api/entrypoint.sh b/nym-api/entrypoint.sh index 9abee830343..6b528fc6a2d 100755 --- a/nym-api/entrypoint.sh +++ b/nym-api/entrypoint.sh @@ -2,4 +2,4 @@ set -e -/usr/src/nym/target/release/nym-api init --mnemonic "$MNEMONIC" && /usr/src/nym/target/release/nym-api run +/usr/src/nym/target/release/nym-api init --mnemonic "$MNEMONIC" && /usr/src/nym/target/release/nym-api run --mnemonic "$MNEMONIC" From 014b5f767a8efb3fd8c6b145f388799fcc83011b Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 27 May 2025 15:23:18 +0200 Subject: [PATCH 18/25] Log APIs used --- nym-network-monitor/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/nym-network-monitor/src/main.rs b/nym-network-monitor/src/main.rs index db41b13e34c..8284b44cda6 100644 --- a/nym-network-monitor/src/main.rs +++ b/nym-network-monitor/src/main.rs @@ -213,6 +213,7 @@ async fn main() -> Result<()> { } if let Some(nym_apis) = args.nym_apis { + info!("Using nym apis: {:?}", nym_apis); NYM_API_URLS.set(nym_apis).ok(); } From 6f79d39d48735017e31bc7f9208242eef66dfe12 Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 27 May 2025 15:40:33 +0200 Subject: [PATCH 19/25] Filter out non mixnodes --- nym-network-monitor/src/main.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nym-network-monitor/src/main.rs b/nym-network-monitor/src/main.rs index 8284b44cda6..6b395840de6 100644 --- a/nym-network-monitor/src/main.rs +++ b/nym-network-monitor/src/main.rs @@ -172,7 +172,12 @@ async fn nym_topology_forced_all_from_env() -> anyhow::Result { let mut topology = NymTopology::new_empty(rewarded_set); topology.add_skimmed_nodes(&nodes); - let node_ids = topology.node_details().keys().cloned().collect::>(); + let node_ids = topology + .node_details() + .iter() + .filter(|(_node_id, node)| node.supported_roles.mixnode) + .map(|(node_id, _)| *node_id) + .collect::>(); // Force all nodes to active to participate in route selection for (idx, node_id) in node_ids.iter().enumerate() { From 7626785ce4761bcf477b224448c7be081b7af07f Mon Sep 17 00:00:00 2001 From: durch Date: Tue, 27 May 2025 15:40:59 +0200 Subject: [PATCH 20/25] Bump NM version --- nym-network-monitor/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-network-monitor/Cargo.toml b/nym-network-monitor/Cargo.toml index 63d1f37559d..8b4963cecb0 100644 --- a/nym-network-monitor/Cargo.toml +++ b/nym-network-monitor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-monitor" -version = "1.1.0" +version = "1.1.1" authors.workspace = true repository.workspace = true homepage.workspace = true From bd966383be300f430863dadbdc62ad428d580a49 Mon Sep 17 00:00:00 2001 From: durch Date: Mon, 2 Jun 2025 09:30:36 +0200 Subject: [PATCH 21/25] Towards untangling nym-api client --- nym-network-monitor/src/accounting.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nym-network-monitor/src/accounting.rs b/nym-network-monitor/src/accounting.rs index f5d6ee97ee2..98fc385f095 100644 --- a/nym-network-monitor/src/accounting.rs +++ b/nym-network-monitor/src/accounting.rs @@ -503,13 +503,13 @@ pub async fn submit_metrics(database_url: Option<&String>) -> anyhow::Result<()> let client = reqwest::Client::new(); let node_submit_url = - format!("{}/api/{API_VERSION}/{STATUS}/{SUBMIT_NODE}", nym_api_url); + format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_NODE}", nym_api_url); let gateway_submit_url = format!( - "{}/api/{API_VERSION}/{STATUS}/{SUBMIT_GATEWAY}", + "{}/{API_VERSION}/{STATUS}/{SUBMIT_GATEWAY}", nym_api_url ); let route_submit_url = - format!("{}/api/{API_VERSION}/{STATUS}/{SUBMIT_ROUTE}", nym_api_url); + format!("{}/{API_VERSION}/{STATUS}/{SUBMIT_ROUTE}", nym_api_url); info!("Submitting {} mixnode measurements", node_stats.len()); From 21a56e307f047c612e4b2e0209ed39631ce29a71 Mon Sep 17 00:00:00 2001 From: durch Date: Mon, 2 Jun 2025 09:31:09 +0200 Subject: [PATCH 22/25] Bump NNM --- nym-network-monitor/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-network-monitor/Cargo.toml b/nym-network-monitor/Cargo.toml index 8b4963cecb0..e1d77a9163c 100644 --- a/nym-network-monitor/Cargo.toml +++ b/nym-network-monitor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-monitor" -version = "1.1.1" +version = "1.1.2" authors.workspace = true repository.workspace = true homepage.workspace = true From be36da68b10b24447767b291b9826f9b0e00098a Mon Sep 17 00:00:00 2001 From: durch Date: Mon, 2 Jun 2025 11:58:12 +0200 Subject: [PATCH 23/25] Clap value_delimiter --- nym-network-monitor/Cargo.toml | 2 +- nym-network-monitor/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nym-network-monitor/Cargo.toml b/nym-network-monitor/Cargo.toml index e1d77a9163c..ba4ef8df410 100644 --- a/nym-network-monitor/Cargo.toml +++ b/nym-network-monitor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-monitor" -version = "1.1.2" +version = "1.1.3" authors.workspace = true repository.workspace = true homepage.workspace = true diff --git a/nym-network-monitor/src/main.rs b/nym-network-monitor/src/main.rs index 6b395840de6..74adeb65198 100644 --- a/nym-network-monitor/src/main.rs +++ b/nym-network-monitor/src/main.rs @@ -136,7 +136,7 @@ struct Args { #[arg(long, env = "DATABASE_URL")] database_url: Option, - #[arg(long, env = "NYM_APIS")] + #[arg(long, env = "NYM_APIS", value_delimiter = ',')] nym_apis: Option>, } From 81162fba7e0e1187e57b701e0e06031050001fac Mon Sep 17 00:00:00 2001 From: durch Date: Mon, 2 Jun 2025 12:45:21 +0200 Subject: [PATCH 24/25] Allow nym-api init fail --- nym-api/entrypoint.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nym-api/entrypoint.sh b/nym-api/entrypoint.sh index 6b528fc6a2d..3461ecdea8c 100755 --- a/nym-api/entrypoint.sh +++ b/nym-api/entrypoint.sh @@ -2,4 +2,5 @@ set -e -/usr/src/nym/target/release/nym-api init --mnemonic "$MNEMONIC" && /usr/src/nym/target/release/nym-api run --mnemonic "$MNEMONIC" +# Init can fail if the mounted volume already has a config +/usr/src/nym/target/release/nym-api init --mnemonic "$MNEMONIC" || true && /usr/src/nym/target/release/nym-api run --mnemonic "$MNEMONIC" From e9dc848950948f2782e98dd9936274e3d2856bd1 Mon Sep 17 00:00:00 2001 From: durch Date: Mon, 2 Jun 2025 12:49:13 +0200 Subject: [PATCH 25/25] Bump nym-api --- nym-api/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index ef8d255256e..2e7b4cfef53 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -4,7 +4,7 @@ [package] name = "nym-api" license = "GPL-3.0" -version = "1.1.59" +version = "1.1.60" authors.workspace = true edition = "2021" rust-version.workspace = true