From f0a888d59c82f2a059c36ef65e238d03f469c7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 24 Aug 2023 15:34:49 +0200 Subject: [PATCH 1/3] Add EXPLORER_API configurable url --- .../topology_control/geo_aware_provider.rs | 17 +++++++++++++++-- common/network-defaults/src/lib.rs | 10 ++++++++++ common/network-defaults/src/mainnet.rs | 4 ++++ common/network-defaults/src/var_names.rs | 1 + envs/mainnet.env | 1 + envs/sandbox.env | 3 ++- 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/common/client-core/src/client/topology_control/geo_aware_provider.rs b/common/client-core/src/client/topology_control/geo_aware_provider.rs index 268f6612e0..62085796c6 100644 --- a/common/client-core/src/client/topology_control/geo_aware_provider.rs +++ b/common/client-core/src/client/topology_control/geo_aware_provider.rs @@ -2,6 +2,7 @@ use std::{collections::HashMap, fmt}; use log::{debug, error, info}; use nym_explorer_api_requests::PrettyDetailedMixNodeBond; +use nym_network_defaults::var_names::EXPLORER_API; use nym_topology::{ nym_topology_from_detailed, provider_trait::{async_trait, TopologyProvider}, @@ -13,11 +14,23 @@ use serde::{Deserialize, Serialize}; use url::Url; const MIN_NODES_PER_LAYER: usize = 1; -const EXPLORER_API_MIXNODES_URL: &str = "https://explorer.nymtech.net/api/v1/mix-nodes"; // TODO: create a explorer-api-client async fn fetch_mixnodes_from_explorer_api() -> Option> { - reqwest::get(EXPLORER_API_MIXNODES_URL) + let explorer_api_url = std::env::var(EXPLORER_API).ok()?; + let explorer_api_url = Url::parse(&explorer_api_url) + .ok()? + .join("v1/mix-nodes") + .ok()?; + + debug!("Fetching: {}", explorer_api_url); + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(5)) + .build() + .ok()?; + client + .get(explorer_api_url) + .send() .await .ok()? .json::>() diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index 8de0ed465c..1704608043 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -43,6 +43,7 @@ pub struct NymNetworkDetails { pub chain_details: ChainDetails, pub endpoints: Vec, pub contracts: NymContracts, + pub explorer_api: Option, } // by default we assume the same defaults as mainnet, i.e. same prefixes and denoms @@ -71,6 +72,7 @@ impl NymNetworkDetails { }, endpoints: Default::default(), contracts: Default::default(), + explorer_api: Default::default(), } } @@ -136,6 +138,7 @@ impl NymNetworkDetails { var_names::SERVICE_PROVIDER_DIRECTORY_CONTRACT_ADDRESS, )) .with_name_service_contract(get_optional_env(var_names::NAME_SERVICE_CONTRACT_ADDRESS)) + .with_explorer_api(get_optional_env(var_names::EXPLORER_API)) } pub fn new_mainnet() -> Self { @@ -167,6 +170,7 @@ impl NymNetworkDetails { service_provider_directory_contract_address: None, name_service_contract_address: None, }, + explorer_api: parse_optional_str(mainnet::EXPLORER_API), } } @@ -278,6 +282,12 @@ impl NymNetworkDetails { self.contracts.name_service_contract_address = contract.map(Into::into); self } + + #[must_use] + pub fn with_explorer_api>(mut self, endpoint: Option) -> Self { + self.explorer_api = endpoint.map(Into::into); + self + } } #[derive(Debug, Copy, Serialize, Deserialize, Clone, PartialEq, Eq)] diff --git a/common/network-defaults/src/mainnet.rs b/common/network-defaults/src/mainnet.rs index fbc25c4b00..bfb3f42531 100644 --- a/common/network-defaults/src/mainnet.rs +++ b/common/network-defaults/src/mainnet.rs @@ -26,6 +26,8 @@ pub(crate) const REWARDING_VALIDATOR_ADDRESS: &str = "n10yyd98e2tuwu0f7ypz9dy3hh pub const STATISTICS_SERVICE_DOMAIN_ADDRESS: &str = "https://mainnet-stats.nymte.ch:8090/"; pub const NYXD_URL: &str = "https://rpc.nymtech.net"; pub const NYM_API: &str = "https://validator.nymtech.net/api/"; +pub const EXPLORER_API: &str = "https://explorer.nymtech.net/api/"; + pub(crate) fn validators() -> Vec { vec![ValidatorDetails::new(NYXD_URL, Some(NYM_API))] } @@ -99,6 +101,7 @@ pub fn export_to_env() { ); set_var_to_default(var_names::NYXD, NYXD_URL); set_var_to_default(var_names::NYM_API, NYM_API); + set_var_to_default(var_names::EXPLORER_API, EXPLORER_API); } pub fn export_to_env_if_not_set() { @@ -145,4 +148,5 @@ pub fn export_to_env_if_not_set() { ); set_var_conditionally_to_default(var_names::NYXD, NYXD_URL); set_var_conditionally_to_default(var_names::NYM_API, NYM_API); + set_var_conditionally_to_default(var_names::EXPLORER_API, EXPLORER_API); } diff --git a/common/network-defaults/src/var_names.rs b/common/network-defaults/src/var_names.rs index 26b65b7f95..d082045a03 100644 --- a/common/network-defaults/src/var_names.rs +++ b/common/network-defaults/src/var_names.rs @@ -26,6 +26,7 @@ pub const SERVICE_PROVIDER_DIRECTORY_CONTRACT_ADDRESS: &str = pub const NAME_SERVICE_CONTRACT_ADDRESS: &str = "NAME_SERVICE_CONTRACT_ADDRESS"; pub const NYXD: &str = "NYXD"; pub const NYM_API: &str = "NYM_API"; +pub const EXPLORER_API: &str = "EXPLORER_API"; pub const DKG_TIME_CONFIGURATION: &str = "DKG_TIME_CONFIGURATION"; diff --git a/envs/mainnet.env b/envs/mainnet.env index 4bf406bd64..9dc5b5272d 100644 --- a/envs/mainnet.env +++ b/envs/mainnet.env @@ -22,5 +22,6 @@ REWARDING_VALIDATOR_ADDRESS=n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy STATISTICS_SERVICE_DOMAIN_ADDRESS="https://mainnet-stats.nymte.ch:8090" NYXD="https://rpc.nymtech.net" NYM_API="https://validator.nymtech.net/api/" +EXPLORER_API="https://explorer.nymtech.net/api/" DKG_TIME_CONFIGURATION="259200,300,300,60,60,1209600" diff --git a/envs/sandbox.env b/envs/sandbox.env index 95b0b4d49a..b4a66a70d1 100644 --- a/envs/sandbox.env +++ b/envs/sandbox.env @@ -23,4 +23,5 @@ EPHEMERA_CONTRACT_ADDRESS="nymt1gwk6muhmzeuxje7df7rjvqwl2vex0kj4t2hwuzmyx5k62kfu STATISTICS_SERVICE_DOMAIN_ADDRESS="http://0.0.0.0" NYXD="https://sandbox-validator1.nymtech.net" -NYM_API="https://sandbox-nym-api1.nymtech.net/api/" \ No newline at end of file +NYM_API="https://sandbox-nym-api1.nymtech.net/api/" +EXPLORER_API="https://sandbox-explorer.nymtech.net/api/" From 8a38c61065ba28014fa763b82b0b7dd7bb9c2177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 24 Aug 2023 15:43:48 +0200 Subject: [PATCH 2/3] Fix wallet build --- nym-wallet/nym-wallet-types/src/network/qa.rs | 3 +++ nym-wallet/nym-wallet-types/src/network/sandbox.rs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/nym-wallet/nym-wallet-types/src/network/qa.rs b/nym-wallet/nym-wallet-types/src/network/qa.rs index be282384f5..605cc63fdd 100644 --- a/nym-wallet/nym-wallet-types/src/network/qa.rs +++ b/nym-wallet/nym-wallet-types/src/network/qa.rs @@ -39,6 +39,8 @@ pub(crate) fn validators() -> Vec { )] } +pub(crate) const EXPLORER_API: &str = "https://qa-explorer.qa.nymte.ch/api/"; + pub(crate) fn network_details() -> nym_network_defaults::NymNetworkDetails { nym_network_defaults::NymNetworkDetails { network_name: NETWORK_NAME.into(), @@ -63,5 +65,6 @@ pub(crate) fn network_details() -> nym_network_defaults::NymNetworkDetails { ), name_service_contract_address: parse_optional_str(NAME_SERVICE_CONTRACT_ADDRESS), }, + explorer_api: parse_optional_str(EXPLORER_API), } } diff --git a/nym-wallet/nym-wallet-types/src/network/sandbox.rs b/nym-wallet/nym-wallet-types/src/network/sandbox.rs index 0499fa5420..ace2ff7663 100644 --- a/nym-wallet/nym-wallet-types/src/network/sandbox.rs +++ b/nym-wallet/nym-wallet-types/src/network/sandbox.rs @@ -35,6 +35,8 @@ pub(crate) fn validators() -> Vec { )] } +pub(crate) const EXPLORER_API: &str = "https://sandbox-explorer.nymtech.net/api/"; + pub(crate) fn network_details() -> nym_network_defaults::NymNetworkDetails { nym_network_defaults::NymNetworkDetails { network_name: NETWORK_NAME.into(), @@ -57,5 +59,6 @@ pub(crate) fn network_details() -> nym_network_defaults::NymNetworkDetails { service_provider_directory_contract_address: None, name_service_contract_address: None, }, + explorer_api: parse_optional_str(EXPLORER_API), } } From 6a327b0bd68ad7c94d3334ab78a6018874e5fb06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 24 Aug 2023 16:01:47 +0200 Subject: [PATCH 3/3] No timeout for wasm --- Cargo.lock | 1 + clients/webassembly/Cargo.lock | 1 + common/client-core/Cargo.toml | 1 + .../topology_control/geo_aware_provider.rs | 17 +++++++++++++---- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9024fa7ad6..98a64c657a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5891,6 +5891,7 @@ version = "1.1.15" dependencies = [ "async-trait", "base64 0.21.2", + "cfg-if", "dashmap 5.5.0", "dirs 4.0.0", "futures", diff --git a/clients/webassembly/Cargo.lock b/clients/webassembly/Cargo.lock index 8449b45ff6..529b241500 100644 --- a/clients/webassembly/Cargo.lock +++ b/clients/webassembly/Cargo.lock @@ -2503,6 +2503,7 @@ version = "1.1.15" dependencies = [ "async-trait", "base64 0.21.2", + "cfg-if 1.0.0", "dashmap", "dirs 4.0.0", "futures", diff --git a/common/client-core/Cargo.toml b/common/client-core/Cargo.toml index bcb21899fe..56733b5ab8 100644 --- a/common/client-core/Cargo.toml +++ b/common/client-core/Cargo.toml @@ -10,6 +10,7 @@ rust-version = "1.66" [dependencies] async-trait = { workspace = true } base64 = "0.21.2" +cfg-if = "1.0.0" dashmap = "5.4.0" dirs = "4.0" futures = { workspace = true } diff --git a/common/client-core/src/client/topology_control/geo_aware_provider.rs b/common/client-core/src/client/topology_control/geo_aware_provider.rs index 62085796c6..ece6e967a2 100644 --- a/common/client-core/src/client/topology_control/geo_aware_provider.rs +++ b/common/client-core/src/client/topology_control/geo_aware_provider.rs @@ -24,10 +24,19 @@ async fn fetch_mixnodes_from_explorer_api() -> Option