diff --git a/CHANGELOG.md b/CHANGELOG.md index e58f5e8b5f..6842a3435b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,52 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +## [2026.10-waterloo] (2026-05-27) + +- Re-order default API urls for network details - Waterloo release ([#6799]) +- [bugfix] IPR v8<->v9 mismatch on Waterloo ([#6772]) +- Migrate to hickory 0.26.1 ([#6751]) +- add workflows for NM3 ([#6729]) +- credential proxy pool ([#6726]) +- chore: made sphinx version threshold assertion a compile time check ([#6718]) +- Feat/nmv3 updated performance calculation ([#6714]) +- feat: NMv3: submission of stress testing result into nym-api ([#6709]) +- feat: NMv3: Prometheus metrics for network monitor ([#6693]) +- feat: NMv3: add read-only results API to orchestrator ([#6689]) +- feat: NMv3: Eviction of stale testrun data ([#6685]) +- feat: NMv3: Wire up testrun assignment and result submission flow ([#6680]) +- feat: NMv3: Support multiple network monitor agents per host ([#6679]) +- Feat/nmv3 agent announcement ([#6673]) +- add node refresher for periodic scraping of bonded nym-node details ([#6626]) +- Feat/nmv3 orchestrator queue ([#6597]) +- feat: network monitor agent - standalone node stress-testing ([#6582]) +- [feat] propagate NM agent noise keys to nym-node routing ([#6577]) +- start mix stress testing topic branch ([#6575]) +- Feat/nmv3 agents subscription ([#6567]) +- Feat/nmv3 agents contract ([#6555]) + +[#6799]: https://github.com/nymtech/nym/pull/6799 +[#6772]: https://github.com/nymtech/nym/pull/6772 +[#6751]: https://github.com/nymtech/nym/pull/6751 +[#6729]: https://github.com/nymtech/nym/pull/6729 +[#6726]: https://github.com/nymtech/nym/pull/6726 +[#6718]: https://github.com/nymtech/nym/pull/6718 +[#6714]: https://github.com/nymtech/nym/pull/6714 +[#6709]: https://github.com/nymtech/nym/pull/6709 +[#6693]: https://github.com/nymtech/nym/pull/6693 +[#6689]: https://github.com/nymtech/nym/pull/6689 +[#6685]: https://github.com/nymtech/nym/pull/6685 +[#6680]: https://github.com/nymtech/nym/pull/6680 +[#6679]: https://github.com/nymtech/nym/pull/6679 +[#6673]: https://github.com/nymtech/nym/pull/6673 +[#6626]: https://github.com/nymtech/nym/pull/6626 +[#6597]: https://github.com/nymtech/nym/pull/6597 +[#6582]: https://github.com/nymtech/nym/pull/6582 +[#6577]: https://github.com/nymtech/nym/pull/6577 +[#6575]: https://github.com/nymtech/nym/pull/6575 +[#6567]: https://github.com/nymtech/nym/pull/6567 +[#6555]: https://github.com/nymtech/nym/pull/6555 + ## [2026.9-venaco] (2026-05-06) - Fix for v9 IPR ([#6710]) diff --git a/Cargo.lock b/Cargo.lock index 0ae68ee118..a78d5bd7d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7879,7 +7879,7 @@ dependencies = [ [[package]] name = "nym-node-status-api" -version = "4.6.2-rc5" +version = "4.6.2-rc7" dependencies = [ "ammonia", "anyhow", diff --git a/common/ecash-signer-check-types/src/helper_traits.rs b/common/ecash-signer-check-types/src/helper_traits.rs index c6d6becd33..814d61f208 100644 --- a/common/ecash-signer-check-types/src/helper_traits.rs +++ b/common/ecash-signer-check-types/src/helper_traits.rs @@ -6,7 +6,7 @@ use nym_coconut_dkg_common::verification_key::VerificationKeyShare; use nym_crypto::asymmetric::ed25519; use std::time::Duration; use time::OffsetDateTime; -use tracing::{debug, warn}; +use tracing::warn; pub trait Verifiable { fn verify_signature(&self, pub_key: &ed25519::PublicKey) -> bool; @@ -36,6 +36,7 @@ pub trait ChainResponse: Verifiable + TimestampedResponse { // we rely on information provided from the api itself AS LONG AS it's not too outdated if self.timestamp() + stale_response_threshold < now { + warn!("chain status response is stale"); return false; } self.chain_synced() @@ -96,26 +97,27 @@ pub trait SignerResponse: Verifiable + TimestampedResponse { // we rely on information provided from the api itself AS LONG AS it's not too outdated if self.timestamp() + stale_response_threshold < now { + warn!("stale signer response"); return false; } if !self.has_signing_keys() { - debug!("missing signing keys"); + warn!("missing signing keys"); return false; } if self.signer_disabled() { - debug!("signer functionalities explicitly disabled"); + warn!("signer functionalities are explicitly disabled"); return false; } if !self.is_ecash_signer() { - debug!("signer doesn't recognise it's a signer for this epoch"); + warn!("signer doesn't recognise it's a signer for this epoch"); return false; } if dkg_epoch_id != self.dkg_ecash_epoch_id() { - debug!( + warn!( "mismatched dkg epoch id. current: {dkg_epoch_id}, signer's: {}", self.dkg_ecash_epoch_id() ); diff --git a/common/ecash-signer-check-types/src/status.rs b/common/ecash-signer-check-types/src/status.rs index ea07862633..8ad6dd949f 100644 --- a/common/ecash-signer-check-types/src/status.rs +++ b/common/ecash-signer-check-types/src/status.rs @@ -11,10 +11,11 @@ use nym_crypto::asymmetric::ed25519; use serde::{Deserialize, Serialize}; use std::time::Duration; use time::OffsetDateTime; +use tracing::warn; use utoipa::ToSchema; -pub(crate) const CHAIN_STALL_THRESHOLD: Duration = Duration::from_secs(5 * 60); -pub(crate) const STALE_RESPONSE_THRESHOLD: Duration = Duration::from_secs(5 * 60); +pub(crate) const CHAIN_STALL_THRESHOLD: Duration = Duration::from_secs(10 * 60); +pub(crate) const STALE_RESPONSE_THRESHOLD: Duration = Duration::from_secs(10 * 60); // the reason for generics is not to remove duplication of code, // but because without them, we'd be having problems with circular dependencies, @@ -188,6 +189,7 @@ where }; let SignerStatus::Tested { result } = &self.status else { + warn!("no valid chain response"); return false; }; result @@ -239,6 +241,7 @@ where }; let SignerStatus::Tested { result } = &self.status else { + warn!("no valid signer response"); return false; }; result.signing_status.signing_available( diff --git a/nym-node-status-api/nym-node-status-api/Cargo.toml b/nym-node-status-api/nym-node-status-api/Cargo.toml index 55fa5db3f1..6a414e3743 100644 --- a/nym-node-status-api/nym-node-status-api/Cargo.toml +++ b/nym-node-status-api/nym-node-status-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-node-status-api" -version = "4.6.2-rc5" +version = "4.6.2-rc7" authors.workspace = true edition.workspace = true license.workspace = true diff --git a/nym-node-status-api/nym-node-status-api/src/ticketbook_manager/storage/auxiliary_models.rs b/nym-node-status-api/nym-node-status-api/src/ticketbook_manager/storage/auxiliary_models.rs index a40611ea08..3e97d1f67b 100644 --- a/nym-node-status-api/nym-node-status-api/src/ticketbook_manager/storage/auxiliary_models.rs +++ b/nym-node-status-api/nym-node-status-api/src/ticketbook_manager/storage/auxiliary_models.rs @@ -17,14 +17,15 @@ pub(crate) struct RetrievedTicketbook { impl RetrievedTicketbook { pub fn new(ticketbook: IssuedTicketBook) -> anyhow::Result { - let usable_index = ticketbook.spent_tickets() as u32 - 1; // spent_tickets is the post-increment number from the DB: the ticket we're // handing out has already been counted as "used" in the DB, but has NOT YET // been spent yet by the recipient. To get its 0-based index in the ticketbook, // subtract 1 (e.g. spent_tickets=1, the ticket at index 0). - if usable_index < 1 { + let spent = ticketbook.spent_tickets(); + if spent == 0 { bail!("Malformed ticket: cannot convert from ticket with spent_tickets=0"); } + let usable_index = (spent as u32) - 1; Ok(Self { usable_index, ticketbook,