attempt to retrieve auxiliary details v2 from nym-nodes when fetching self-described data

This commit is contained in:
Jędrzej Stuczyński
2026-05-22 12:55:25 +01:00
parent b6eb391e85
commit b9d96f337a
31 changed files with 185 additions and 89 deletions
@@ -1,6 +1,7 @@
// Copyright 2021-2023 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
pub use crate::nym_api::NymApiClientExt;
use crate::nyxd::{self, NyxdClient};
use crate::signing::direct_wallet::DirectSecp256k1HdWallet;
use crate::signing::signer::{NoSigner, OfflineSigner};
@@ -18,9 +19,11 @@ use nym_api_requests::ecash::{
BlindSignRequestBody, BlindedSignatureResponse, PartialCoinIndicesSignatureResponse,
PartialExpirationDateSignatureResponse, VerificationKeyResponse,
};
use nym_api_requests::models::described::v1::NymNodeDescriptionV1;
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::{
ApiHealthResponse, GatewayCoreStatusResponse, HistoricalPerformanceResponse,
MixnodeCoreStatusResponse, NymNodeDescriptionV1, NymNodeDescriptionV2,
MixnodeCoreStatusResponse,
};
use nym_api_requests::nym_nodes::{
NodesByAddressesResponse, SemiSkimmedNodesWithMetadata, SkimmedNodeV1, SkimmedNodesWithMetadata,
@@ -28,15 +31,13 @@ use nym_api_requests::nym_nodes::{
use nym_coconut_dkg_common::types::EpochId;
use nym_http_api_client::UserAgent;
use nym_mixnet_contract_common::EpochRewardedSet;
pub use nym_mixnet_contract_common::{
mixnode::MixNodeDetails, GatewayBond, IdentityKey, IdentityKeyRef, NodeId, NymNodeDetails,
};
use nym_network_defaults::NymNetworkDetails;
use std::net::IpAddr;
use time::Date;
use url::Url;
pub use crate::nym_api::NymApiClientExt;
pub use nym_mixnet_contract_common::{
mixnode::MixNodeDetails, GatewayBond, IdentityKey, IdentityKeyRef, NodeId, NymNodeDetails,
};
// re-export the type to not break existing imports
pub use crate::coconut::EcashApiClient;
@@ -15,16 +15,13 @@ use nym_api_requests::ecash::models::{
VerifyEcashTicketBody,
};
use nym_api_requests::ecash::VerificationKeyResponse;
use nym_api_requests::models::network_monitor::{
KnownNetworkMonitorResponse, StressTestBatchSubmission,
};
use nym_api_requests::models::node_families::NodeFamily;
use nym_api_requests::models::{
AnnotationResponseV1, AnnotationResponseV2, ApiHealthResponse, BinaryBuildInformationOwned,
ChainBlocksStatusResponse, ChainStatusResponse, KeyRotationInfoResponse,
NodePerformanceResponse, NodeRefreshBody, NymNodeDescriptionV1, NymNodeDescriptionV2,
PerformanceHistoryResponse, RewardedSetResponse, SignerInformationResponse,
StressTestBatchSubmissionResponse,
NodePerformanceResponse, NodeRefreshBody, PerformanceHistoryResponse, RewardedSetResponse,
SignerInformationResponse,
};
use nym_api_requests::pagination::PaginatedResponse;
use nym_http_api_client::{ApiClient, NO_PARAMS};
@@ -34,6 +31,11 @@ use time::format_description::BorrowedFormatItem;
use time::Date;
use tracing::instrument;
use nym_api_requests::models::described::v1::NymNodeDescriptionV1;
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::v3::{
KnownNetworkMonitorResponse, StressTestBatchSubmission, StressTestBatchSubmissionResponse,
};
pub use nym_api_requests::{
ecash::{
models::SpentCredentialsResponse, BlindSignRequestBody, BlindedSignatureResponse,
@@ -52,7 +54,6 @@ pub use nym_api_requests::{
},
NymNetworkDetailsResponse,
};
pub use nym_coconut_dkg_common::types::EpochId;
pub mod error;
+2 -3
View File
@@ -1,9 +1,10 @@
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use nym_api_requests::models::DeclaredRolesV1;
use nym_api_requests::models::described::type_translation::DeclaredRolesV1;
use nym_api_requests::nym_nodes::SkimmedNodeV1;
use nym_crypto::asymmetric::{ed25519, x25519};
pub use nym_mixnet_contract_common::LegacyMixLayer;
use nym_mixnet_contract_common::NodeId;
use nym_sphinx_addressing::nodes::NymNodeRoutingAddress;
use nym_sphinx_types::Node as SphinxNode;
@@ -12,8 +13,6 @@ use std::fmt::Debug;
use std::net::{IpAddr, SocketAddr};
use thiserror::Error;
pub use nym_mixnet_contract_common::LegacyMixLayer;
#[derive(Error, Debug)]
pub enum RoutingNodeError {
#[error("node {node_id} ('{identity}') has not provided any valid ip addresses")]
+1 -1
View File
@@ -7,9 +7,9 @@ use crate::measurements::{Config, PacketListener, PacketSender};
use crate::models::VerlocNodeResult;
use futures::StreamExt;
use futures::stream::FuturesUnordered;
use nym_api_requests::models::described::v1::NymNodeDescriptionV1;
use nym_crypto::asymmetric::ed25519;
use nym_task::ShutdownToken;
use nym_validator_client::models::NymNodeDescriptionV1;
use nym_validator_client::nym_api::NymApiClientExt;
use rand::prelude::SliceRandom;
use rand::thread_rng;
@@ -9,11 +9,7 @@ use utoipa::ToSchema;
pub mod type_translation;
pub mod v1;
pub mod v2;
// don't break existing imports
pub use type_translation::*;
pub use v1::*;
pub use v2::*;
pub mod v3;
#[derive(Clone, Debug, Serialize, Deserialize, schemars::JsonSchema, ToSchema)]
pub struct NoiseDetails {
@@ -77,7 +77,7 @@ pub struct AnnouncePortsV1 {
#[derive(
Clone, Copy, Debug, Default, Serialize, Deserialize, schemars::JsonSchema, ToSchema, PartialEq,
)]
pub struct AuxiliaryDetailsV1 {
pub struct NymNodeAuxiliaryDetailsV1 {
/// Optional ISO 3166 alpha-2 two-letter country code of the node's **physical** location
#[schema(example = "PL", value_type = Option<String>)]
#[schemars(with = "Option<String>")]
@@ -395,9 +395,11 @@ impl From<nym_node_requests::api::v1::node::models::AnnouncePorts> for AnnounceP
}
}
impl From<nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1> for AuxiliaryDetailsV1 {
impl From<nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1>
for NymNodeAuxiliaryDetailsV1
{
fn from(value: nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1) -> Self {
AuxiliaryDetailsV1 {
NymNodeAuxiliaryDetailsV1 {
location: value.location,
announce_ports: value.announce_ports.into(),
accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions,
@@ -405,6 +407,33 @@ impl From<nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1> for Auxi
}
}
impl From<nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1>
for super::v3::NymNodeAuxiliaryDetailsV3
{
fn from(value: nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1) -> Self {
super::v3::NymNodeAuxiliaryDetailsV3 {
location: value.location,
// v1 wire predates the chain-address field
address: None,
announce_ports: value.announce_ports.into(),
accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions,
}
}
}
impl From<nym_node_requests::api::v2::node::models::AuxiliaryDetailsV2>
for super::v3::NymNodeAuxiliaryDetailsV3
{
fn from(value: nym_node_requests::api::v2::node::models::AuxiliaryDetailsV2) -> Self {
super::v3::NymNodeAuxiliaryDetailsV3 {
location: value.location,
address: Some(value.address),
announce_ports: value.announce_ports.into(),
accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions,
}
}
}
impl From<nym_node_requests::api::v1::node::models::NodeRoles> for DeclaredRolesV1 {
fn from(value: nym_node_requests::api::v1::node::models::NodeRoles) -> Self {
DeclaredRolesV1 {
@@ -1,11 +1,11 @@
// Copyright 2026 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use crate::models::{
AuthenticatorDetailsV1, AuxiliaryDetailsV1, BinaryBuildInformationOwned, DeclaredRolesV1,
HostInformationV1, IpPacketRouterDetailsV1, NetworkRequesterDetailsV1,
OffsetDateTimeJsonSchemaWrapper, WebSocketsV1, WireguardDetailsV1,
use crate::models::described::type_translation::{
AuthenticatorDetailsV1, DeclaredRolesV1, HostInformationV1, IpPacketRouterDetailsV1,
NetworkRequesterDetailsV1, NymNodeAuxiliaryDetailsV1, WebSocketsV1, WireguardDetailsV1,
};
use crate::models::{BinaryBuildInformationOwned, OffsetDateTimeJsonSchemaWrapper};
use crate::nym_nodes::{BasicEntryInformation, NodeRole, SemiSkimmedNodeV1, SkimmedNodeV1};
use nym_crypto::asymmetric::{ed25519, x25519};
use nym_mixnet_contract_common::reward_params::Performance;
@@ -160,7 +160,7 @@ pub struct NymNodeDataV1 {
pub declared_role: DeclaredRolesV1,
#[serde(default)]
pub auxiliary_details: AuxiliaryDetailsV1,
pub auxiliary_details: NymNodeAuxiliaryDetailsV1,
// TODO: do we really care about ALL build info or just the version?
pub build_information: BinaryBuildInformationOwned,
@@ -1,12 +1,13 @@
// Copyright 2026 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use crate::models::{
AuthenticatorDetailsV1, AuxiliaryDetailsV1, BinaryBuildInformationOwned, DeclaredRolesV1,
DescribedNodeTypeV1, HostInformationV1, HostKeysV1, IpPacketRouterDetailsV1,
LewesProtocolDetailsV1, NetworkRequesterDetailsV1, NymNodeDataV1, NymNodeDescriptionV1,
OffsetDateTimeJsonSchemaWrapper, SphinxKeyV1, WebSocketsV1, WireguardDetailsV1,
use crate::models::described::type_translation::{
AnnouncePortsV1, AuthenticatorDetailsV1, DeclaredRolesV1, HostInformationV1, HostKeysV1,
IpPacketRouterDetailsV1, LewesProtocolDetailsV1, NetworkRequesterDetailsV1,
NymNodeAuxiliaryDetailsV1, SphinxKeyV1, WebSocketsV1, WireguardDetailsV1,
};
use crate::models::described::v1::{DescribedNodeTypeV1, NymNodeDataV1, NymNodeDescriptionV1};
use crate::models::{BinaryBuildInformationOwned, OffsetDateTimeJsonSchemaWrapper};
use crate::nym_nodes::{
BasicEntryInformation, NodeRole, SemiSkimmedNodeV1, SemiSkimmedNodeV3, SkimmedNodeV1,
};
@@ -22,7 +23,8 @@ use utoipa::ToSchema;
// no changes for the following types
pub type HostInformationV2 = HostInformationV1;
pub type DeclaredRolesV2 = DeclaredRolesV1;
pub type AuxiliaryDetailsV2 = AuxiliaryDetailsV1;
pub type AnnouncePortsV2 = AnnouncePortsV1;
pub type NymNodeAuxiliaryDetailsV2 = NymNodeAuxiliaryDetailsV1;
pub type NetworkRequesterDetailsV2 = NetworkRequesterDetailsV1;
pub type IpPacketRouterDetailsV2 = IpPacketRouterDetailsV1;
pub type AuthenticatorDetailsV2 = AuthenticatorDetailsV1;
@@ -172,7 +174,7 @@ pub struct NymNodeDataV2 {
pub declared_role: DeclaredRolesV2,
#[serde(default)]
pub auxiliary_details: AuxiliaryDetailsV2,
pub auxiliary_details: NymNodeAuxiliaryDetailsV2,
// TODO: do we really care about ALL build info or just the version?
pub build_information: BinaryBuildInformationOwned,
@@ -339,7 +341,7 @@ pub fn mock_nym_node_description(seed: u64) -> NymNodeDescriptionV2 {
exit_nr: true,
exit_ipr: true,
},
auxiliary_details: AuxiliaryDetailsV2 {
auxiliary_details: NymNodeAuxiliaryDetailsV2 {
location: Some(celes::Country::switzerland()),
announce_ports: Default::default(),
accepted_operator_terms_and_conditions: true,
@@ -0,0 +1,42 @@
// Copyright 2026 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: GPL-3.0-only
use crate::models::described::v2::{AnnouncePortsV2, NymNodeAuxiliaryDetailsV2};
use celes::Country;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
pub type AnnouncePortsV3 = AnnouncePortsV2;
#[derive(
Clone, Debug, Default, Serialize, Deserialize, schemars::JsonSchema, ToSchema, PartialEq,
)]
pub struct NymNodeAuxiliaryDetailsV3 {
/// Optional ISO 3166 alpha-2 two-letter country code of the node's **physical** location
#[schema(example = "PL", value_type = Option<String>)]
#[schemars(with = "Option<String>")]
#[schemars(length(equal = 2))]
pub location: Option<Country>,
/// On-chain address of this node
pub address: Option<String>,
#[serde(default)]
pub announce_ports: AnnouncePortsV3,
/// Specifies whether this node operator has agreed to the terms and conditions
/// as defined at <https://nymtech.net/terms-and-conditions/operators/v1.0.0>
// make sure to include the default deserialisation as this field hasn't existed when the struct was first created
#[serde(default)]
pub accepted_operator_terms_and_conditions: bool,
}
impl From<NymNodeAuxiliaryDetailsV3> for NymNodeAuxiliaryDetailsV2 {
fn from(value: NymNodeAuxiliaryDetailsV3) -> Self {
NymNodeAuxiliaryDetailsV2 {
location: value.location,
announce_ports: value.announce_ports,
accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions,
}
}
}
@@ -23,7 +23,6 @@ pub mod utility;
// don't break existing imports
pub use api_status::*;
pub use circulating_supply::*;
pub use described::*;
pub use legacy::*;
pub use mixnet::*;
pub use network::*;
@@ -75,8 +75,6 @@ pub struct GatewayCoreStatusResponse {
pub count: i64,
}
pub use v3::*;
/// Request/response types for the v3 network-monitor flow, in which an orchestrator submits
/// stress testing results to nym-api via signed batches.
pub mod v3 {
+3 -3
View File
@@ -1,9 +1,9 @@
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use crate::models::{
DeclaredRolesV1, LewesProtocolDetailsV1, NymNodeDataV1, OffsetDateTimeJsonSchemaWrapper,
};
use crate::models::described::type_translation::{DeclaredRolesV1, LewesProtocolDetailsV1};
use crate::models::described::v1::NymNodeDataV1;
use crate::models::OffsetDateTimeJsonSchemaWrapper;
use crate::pagination::{PaginatedResponse, Pagination};
use nym_crypto::asymmetric::ed25519::serde_helpers::bs58_ed25519_pubkey;
use nym_crypto::asymmetric::x25519::serde_helpers::bs58_x25519_pubkey;
+3 -3
View File
@@ -54,9 +54,9 @@ impl<T> SignedMessage<T> {
// make sure only our types can implement this trait (to ensure infallible serialisation)
pub(crate) mod sealed {
use crate::ecash::models::*;
use crate::models::network_monitor::v3::StressTestBatchSubmissionContent;
use crate::models::{
v3, ChainBlocksStatusResponseBody, DetailedSignersStatusResponseBody,
SignersStatusResponseBody,
ChainBlocksStatusResponseBody, DetailedSignersStatusResponseBody, SignersStatusResponseBody,
};
pub trait Sealed {}
@@ -75,5 +75,5 @@ pub(crate) mod sealed {
impl Sealed for DetailedSignersStatusResponseBody {}
// v3 stress testing
impl Sealed for v3::StressTestBatchSubmissionContent {}
impl Sealed for StressTestBatchSubmissionContent {}
}
@@ -8,7 +8,8 @@ use crate::node_describe_cache::cache::DescribedNodes;
use crate::node_describe_cache::NodeDescriptionTopologyExt;
use crate::node_status_api::NodeStatusCache;
use crate::support::caching::cache::SharedCache;
use nym_api_requests::models::{NodeAnnotationV2, NymNodeDescriptionV2};
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::NodeAnnotationV2;
use nym_crypto::asymmetric::{ed25519, x25519};
use nym_mixnet_contract_common::{LegacyMixLayer, NodeId};
use nym_node_tester_utils::node::{NodeType, TestableNode};
+3 -1
View File
@@ -1,7 +1,9 @@
// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: GPL-3.0-only
use nym_api_requests::models::{DescribedNodeTypeV2, NymNodeDataV2, NymNodeDescriptionV2};
use nym_api_requests::models::described::v2::{
DescribedNodeTypeV2, NymNodeDataV2, NymNodeDescriptionV2,
};
use nym_mixnet_contract_common::NodeId;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
+2 -1
View File
@@ -2,7 +2,8 @@
// SPDX-License-Identifier: GPL-3.0-only
use crate::support::caching::cache::UninitialisedCache;
use nym_api_requests::models::{NymNodeDescriptionV1, NymNodeDescriptionV2};
use nym_api_requests::models::described::v1::NymNodeDescriptionV1;
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_mixnet_contract_common::NodeId;
use nym_node_requests::api::client::NymNodeApiClientError;
use nym_topology::node::RoutingNodeError;
@@ -4,11 +4,12 @@
use crate::node_describe_cache::NodeDescribeCacheError;
use futures::future::{maybe_done, MaybeDone};
use futures::{FutureExt, TryFutureExt};
use nym_api_requests::models::{
AuthenticatorDetailsV2, AuxiliaryDetailsV2, DeclaredRolesV2, HostInformationV2,
IpPacketRouterDetailsV2, LewesProtocolDetailsV1, NetworkRequesterDetailsV2, NymNodeDataV2,
WebSocketsV2, WireguardDetailsV2,
use nym_api_requests::models::described::type_translation::LewesProtocolDetailsV1;
use nym_api_requests::models::described::v2::{
AuthenticatorDetailsV2, DeclaredRolesV2, HostInformationV2, IpPacketRouterDetailsV2,
NetworkRequesterDetailsV2, NymNodeDataV2, WebSocketsV2, WireguardDetailsV2,
};
use nym_api_requests::models::described::v3::NymNodeAuxiliaryDetailsV3;
use nym_bin_common::build_information::BinaryBuildInformationOwned;
use nym_config::defaults::mainnet;
use nym_mixnet_contract_common::NodeId;
@@ -37,6 +38,23 @@ async fn network_requester_future(
})
}
// try v2 first; nodes that haven't been upgraded yet won't expose it, so fall back to v1
// (the v1 path yields no chain address).
async fn auxiliary_details_future(client: &Client, node_id: NodeId) -> NymNodeAuxiliaryDetailsV3 {
if let Ok(v2) = client.get_auxiliary_details_v2().await {
return v2.into();
}
client
.get_auxiliary_details()
.await
.inspect_err(|err| {
debug!("could not obtain auxiliary details of node {node_id}: {err} is it running an old version?")
})
.map(Into::into)
.unwrap_or_default()
}
pub(crate) async fn query_for_described_data(
client: &Client,
node_id: NodeId,
@@ -50,13 +68,7 @@ pub(crate) async fn query_for_described_data(
NodeDescribedInfoMegaFuture::new(
client.get_build_information().map_err(map_query_err),
client.get_roles().ok_into().map_err(map_query_err),
client.get_auxiliary_details()
.inspect_err(|err| {
// old nym-nodes will not have this field, so use the default instead
debug!("could not obtain auxiliary details of node {node_id}: {err} is it running an old version?")
})
.ok_into()
.unwrap_or_else(|_| AuxiliaryDetailsV2::default()),
auxiliary_details_future(client, node_id),
client.get_mixnet_websockets().ok_into().map_err(map_query_err),
network_requester_future(client).map_err(map_query_err),
// `ok_into` ultimately calls `IpPacketRouter::into` to transform it into `IpPacketRouterDetails`
@@ -114,7 +126,7 @@ impl<F1, F2, F3, F4, F5, F6, F7, F8, F9> Future
where
F1: Future<Output = Result<BinaryBuildInformationOwned, NodeDescribeCacheError>>,
F2: Future<Output = Result<DeclaredRolesV2, NodeDescribeCacheError>>,
F3: Future<Output = AuxiliaryDetailsV2>,
F3: Future<Output = NymNodeAuxiliaryDetailsV3>,
F4: Future<Output = Result<WebSocketsV2, NodeDescribeCacheError>>,
F5: Future<Output = Result<Option<NetworkRequesterDetailsV2>, NodeDescribeCacheError>>,
F6: Future<Output = Option<IpPacketRouterDetailsV2>>,
@@ -205,7 +217,7 @@ struct ResolvedNodeDescribedInfo {
build_info: Result<BinaryBuildInformationOwned, NodeDescribeCacheError>,
roles: Result<DeclaredRolesV2, NodeDescribeCacheError>,
// TODO: in the future make it return a Result as well.
auxiliary_details: AuxiliaryDetailsV2,
auxiliary_details: NymNodeAuxiliaryDetailsV3,
websockets: Result<WebSocketsV2, NodeDescribeCacheError>,
network_requester: Result<Option<NetworkRequesterDetailsV2>, NodeDescribeCacheError>,
ipr: Option<IpPacketRouterDetailsV2>,
@@ -234,7 +246,7 @@ impl ResolvedNodeDescribedInfo {
pub(crate) struct UnwrappedResolvedNodeDescribedInfo {
pub(crate) build_info: BinaryBuildInformationOwned,
pub(crate) roles: DeclaredRolesV2,
pub(crate) auxiliary_details: AuxiliaryDetailsV2,
pub(crate) auxiliary_details: NymNodeAuxiliaryDetailsV3,
pub(crate) websockets: WebSocketsV2,
pub(crate) network_requester: Option<NetworkRequesterDetailsV2>,
pub(crate) ipr: Option<IpPacketRouterDetailsV2>,
@@ -258,7 +270,7 @@ impl UnwrappedResolvedNodeDescribedInfo {
wireguard: self.wireguard,
lewes_protocol: self.lewes_protocol,
mixnet_websockets: self.websockets,
auxiliary_details: self.auxiliary_details,
auxiliary_details: self.auxiliary_details.into(),
declared_role: self.roles,
}
}
+1 -1
View File
@@ -3,7 +3,7 @@
use crate::node_describe_cache::query_helpers::query_for_described_data;
use crate::node_describe_cache::NodeDescribeCacheError;
use nym_api_requests::models::{DescribedNodeTypeV2, NymNodeDescriptionV2};
use nym_api_requests::models::described::v2::{DescribedNodeTypeV2, NymNodeDescriptionV2};
use nym_bin_common::bin_info;
use nym_crypto::asymmetric::ed25519;
use nym_mixnet_contract_common::{NodeId, NymNodeDetails};
+2 -1
View File
@@ -2,7 +2,8 @@
// SPDX-License-Identifier: GPL-3.0-only
use crate::mixnet_contract_cache::cache::data::ConfigScoreData;
use nym_api_requests::models::{ConfigScore, NymNodeDescriptionV2};
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::ConfigScore;
use nym_contracts_common::NaiveFloat;
use nym_mixnet_contract_common::VersionScoreFormulaParams;
+4 -2
View File
@@ -7,10 +7,12 @@ use crate::support::http::state::AppState;
use axum::extract::{Path, Query, State};
use axum::routing::{get, post};
use axum::{Json, Router};
use nym_api_requests::models::described::v1::NymNodeDescriptionV1;
use nym_api_requests::models::described::NoiseDetails;
use nym_api_requests::models::{
AnnotationResponseV1, NodeDatePerformanceResponse, NodePerformanceResponse, NodeRefreshBody,
NoiseDetails, NymNodeDescriptionV1, PerformanceHistoryResponse, RewardedSetResponse,
StakeSaturationResponse, UptimeHistoryResponse,
PerformanceHistoryResponse, RewardedSetResponse, StakeSaturationResponse,
UptimeHistoryResponse,
};
use nym_api_requests::pagination::{PaginatedResponse, Pagination};
use nym_contracts_common::NaiveFloat;
+2 -1
View File
@@ -7,7 +7,8 @@ use crate::support::http::state::AppState;
use axum::extract::{Path, Query, State};
use axum::routing::get;
use axum::Router;
use nym_api_requests::models::{AnnotationResponseV2, NymNodeDescriptionV2};
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::AnnotationResponseV2;
use nym_api_requests::pagination::{PaginatedResponse, Pagination};
use nym_http_api_common::{FormattedResponse, OutputParams};
use tower_http::compression::CompressionLayer;
+3 -2
View File
@@ -7,8 +7,9 @@ use crate::support::storage::models::NymNodeStressTestingResult;
use axum::extract::{Path, State};
use axum::routing::{get, post};
use axum::{Json, Router};
use nym_api_requests::models::network_monitor::KnownNetworkMonitorResponse;
use nym_api_requests::models::{StressTestBatchSubmission, StressTestBatchSubmissionResponse};
use nym_api_requests::models::v3::{
KnownNetworkMonitorResponse, StressTestBatchSubmission, StressTestBatchSubmissionResponse,
};
use nym_crypto::asymmetric::ed25519;
use std::time::Duration;
use time::OffsetDateTime;
+2 -1
View File
@@ -1,7 +1,8 @@
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: GPL-3.0-only
use nym_api_requests::models::{StressTestResult, StressTestingScore, TestNode};
use nym_api_requests::models::v3::StressTestResult;
use nym_api_requests::models::{StressTestingScore, TestNode};
use nym_crypto::asymmetric::ed25519;
use nym_mixnet_contract_common::NodeId;
use sqlx::FromRow;
@@ -6,8 +6,9 @@ use crate::support::http::state::AppState;
use crate::unstable_routes::helpers::refreshed_at;
use crate::unstable_routes::v2::nym_nodes::helpers::NodesParamsWithRole;
use axum::extract::{Query, State};
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::{
NodeAnnotationV1, NodeAnnotationV2, NymNodeDescriptionV2, OffsetDateTimeJsonSchemaWrapper,
NodeAnnotationV1, NodeAnnotationV2, OffsetDateTimeJsonSchemaWrapper,
};
use nym_api_requests::nym_nodes::{NodeRole, PaginatedCachedNodesResponseV2, SemiSkimmedNodeV1};
use nym_api_requests::pagination::PaginatedResponse;
@@ -6,8 +6,9 @@ use crate::unstable_routes::helpers::refreshed_at;
use crate::unstable_routes::v2::nym_nodes::helpers::NodesParams;
use crate::unstable_routes::v2::nym_nodes::skimmed::PaginatedSkimmedNodes;
use axum::extract::{Query, State};
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::{
NodeAnnotationV1, NodeAnnotationV2, NymNodeDescriptionV2, OffsetDateTimeJsonSchemaWrapper,
NodeAnnotationV1, NodeAnnotationV2, OffsetDateTimeJsonSchemaWrapper,
};
use nym_api_requests::nym_nodes::{NodeRole, PaginatedCachedNodesResponseV2, SkimmedNodeV1};
use nym_http_api_common::Output;
@@ -5,8 +5,9 @@ use crate::node_status_api::models::AxumResult;
use crate::support::http::state::AppState;
use crate::unstable_routes::helpers::refreshed_at;
use axum::extract::{Query, State};
use nym_api_requests::models::described::v2::NymNodeDescriptionV2;
use nym_api_requests::models::{
NodeAnnotationV1, NodeAnnotationV2, NymNodeDescriptionV2, OffsetDateTimeJsonSchemaWrapper,
NodeAnnotationV1, NodeAnnotationV2, OffsetDateTimeJsonSchemaWrapper,
};
use nym_api_requests::nym_nodes::{NodeRole, PaginatedCachedNodesResponseV2, SemiSkimmedNodeV3};
use nym_api_requests::pagination::PaginatedResponse;
@@ -4,10 +4,10 @@
use crate::orchestrator::config::Config;
use crate::storage::NetworkMonitorStorage;
use anyhow::Context;
use nym_api_requests::models::v3::{StressTestBatchSubmissionContent, StressTestResult};
use nym_crypto::asymmetric::ed25519;
use nym_node_requests::api::Client;
use nym_task::ShutdownToken;
use nym_validator_client::models::{StressTestBatchSubmissionContent, StressTestResult};
use nym_validator_client::nym_api::NymApiClientExt;
use nym_validator_client::signable::SignableMessageBody;
use std::sync::Arc;
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-only
use anyhow::Context;
use nym_api_requests::models::network_monitor::StressTestResult;
use nym_api_requests::models::v3::StressTestResult;
use nym_crypto::asymmetric::{ed25519, x25519};
use nym_network_monitor_orchestrator_requests::models::{
self as api, LatencyDistribution, NymNodeData, TestRunData, TestRunInProgressData,
@@ -336,9 +336,9 @@ use mixnode::MixnodeSummary;
use nym_bin_common::build_information::BinaryBuildInformationOwned;
use nym_mixnet_contract_common::NodeId;
use nym_validator_client::models::{
AuthenticatorDetailsV2, AuxiliaryDetailsV2, DeclaredRolesV2, DescribedNodeTypeV2,
HostInformationV2, HostKeysV2, IpPacketRouterDetailsV2, LewesProtocolDetailsV1,
NetworkRequesterDetailsV2, NymNodeDataV2, NymNodeDescriptionV2,
AuthenticatorDetailsV2, DeclaredRolesV2, DescribedNodeTypeV2, HostInformationV2, HostKeysV2,
IpPacketRouterDetailsV2, LewesProtocolDetailsV1, NetworkRequesterDetailsV2,
NymNodeAuxiliaryDetailsV2, NymNodeDataV2, NymNodeDescriptionV2,
OffsetDateTimeJsonSchemaWrapper, SphinxKeyV1, VersionedNoiseKeyV1, WebSocketsV1,
WireguardDetailsV2,
};
@@ -743,7 +743,7 @@ pub struct NymNodeDataDeHelper {
pub declared_role: DeclaredRolesV2,
#[serde(default)]
pub auxiliary_details: AuxiliaryDetailsV2,
pub auxiliary_details: NymNodeAuxiliaryDetailsV2,
// TODO: do we really care about ALL build info or just the version?
pub build_information: BinaryBuildInformationOwned,
@@ -14,6 +14,7 @@ use crate::api::v1::node::models::{
AuxiliaryDetailsV1, NodeDescription, NodeRoles, SignedHostInformation,
};
use crate::api::v1::node_load::models::NodeLoad;
use crate::api::v2::node::models::AuxiliaryDetailsV2;
use crate::routes;
use async_trait::async_trait;
use nym_bin_common::build_information::BinaryBuildInformationOwned;
@@ -60,6 +61,11 @@ pub trait NymNodeApiClientExt: ApiClient {
.await
}
async fn get_auxiliary_details_v2(&self) -> Result<AuxiliaryDetailsV2, NymNodeApiClientError> {
self.get_json_from(routes::api::v2::auxiliary_absolute())
.await
}
// TODO: implement calls for other endpoints; for now I only care about the wss
async fn get_mixnet_websockets(&self) -> Result<WebSockets, NymNodeApiClientError> {
self.get_json_from(
+5 -7
View File
@@ -2,20 +2,18 @@
// SPDX-License-Identifier: GPL-3.0-only
use anyhow::Result;
use nym_task::ShutdownToken;
use celes::Country;
use nym_validator_client::models::NymNodeDescriptionV1;
use nym_http_api_client::Client;
use nym_task::ShutdownToken;
use nym_validator_client::client::NymApiClientExt;
use nym_validator_client::models::described::v1::NymNodeDescriptionV1;
use std::collections::HashMap;
use std::time::Duration;
use std::{net::IpAddr, sync::Arc};
use tokio::sync::RwLock;
use tokio::time::interval;
use url::Url;
use nym_http_api_client::Client;
use nym_validator_client::client::NymApiClientExt;
use tracing::{error, info, trace, warn};
use url::Url;
const NETWORK_CACHE_TTL: Duration = Duration::from_secs(600);