diff --git a/common/network-defaults/src/mainnet.rs b/common/network-defaults/src/mainnet.rs index 2b54d174068..26981621970 100644 --- a/common/network-defaults/src/mainnet.rs +++ b/common/network-defaults/src/mainnet.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 #[cfg(feature = "network")] -use crate::{DenomDetails, ValidatorDetails}; +use crate::{ApiUrlConst, DenomDetails, ValidatorDetails}; pub const NETWORK_NAME: &str = "mainnet"; @@ -29,10 +29,36 @@ pub const COCONUT_DKG_CONTRACT_ADDRESS: &str = pub const REWARDING_VALIDATOR_ADDRESS: &str = "n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy"; pub const NYXD_URL: &str = "https://rpc.nymtech.net"; -pub const NYM_API: &str = "https://validator.nymtech.net/api/"; pub const NYXD_WS: &str = "wss://rpc.nymtech.net/websocket"; pub const EXPLORER_API: &str = "https://explorer.nymtech.net/api/"; +pub const NYM_API: &str = "https://validator.nymtech.net/api/"; +#[cfg(feature = "network")] +pub const NYM_APIS: &[ApiUrlConst] = &[ + ApiUrlConst { + url: NYM_API, + front_hosts: None, + }, + ApiUrlConst { + url: "https://nym-fronntdoor.vercel.app/api/", + front_hosts: Some(&["vercel.app", "vercel.com"]), + }, + ApiUrlConst { + url: "https://nym-frontdoor.global.ssl.fastly.net/api/", + front_hosts: Some(&["yelp.global.ssl.fastly.net"]), + }, +]; pub const NYM_VPN_API: &str = "https://nymvpn.com/api/"; +#[cfg(feature = "network")] +pub const NYM_VPN_APIS: &[ApiUrlConst] = &[ + ApiUrlConst { + url: NYM_VPN_API, + front_hosts: Some(&["vercel.app", "vercel.com"]), + }, + ApiUrlConst { + url: "https://nymvpn-frontdoor.global.ssl.fastly.net/api/", + front_hosts: Some(&["yelp.global.ssl.fastly.net"]), + }, +]; // I'm making clippy mad on purpose, because that url HAS TO be updated and deployed before merging pub const EXIT_POLICY_URL: &str = diff --git a/common/network-defaults/src/network.rs b/common/network-defaults/src/network.rs index 8cebe533409..e2b7ceb8226 100644 --- a/common/network-defaults/src/network.rs +++ b/common/network-defaults/src/network.rs @@ -37,6 +37,37 @@ pub struct NymNetworkDetails { pub contracts: NymContracts, pub explorer_api: Option, pub nym_vpn_api_url: Option, + pub nym_api_urls: Option>, + pub nym_vpn_api_urls: Option>, +} + +#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize, JsonSchema)] +#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))] +pub struct ApiUrl { + /// Expects a string formatted Url + /// + /// see https://docs.rs/url/latest/url/struct.Url.html + pub url: String, + /// Optional alternative equivalent hostnames. Each entry must parse as valid Host + /// + /// see https://docs.rs/url/latest/url/enum.Host.html + pub front_hosts: Option>, +} + +pub struct ApiUrlConst<'a> { + pub url: &'a str, + pub front_hosts: Option<&'a [&'a str]>, +} + +impl From> for ApiUrl { + fn from(value: ApiUrlConst) -> Self { + ApiUrl { + url: value.url.to_string(), + front_hosts: value + .front_hosts + .map(|slice| slice.iter().map(|s| s.to_string()).collect()), + } + } } // by default we assume the same defaults as mainnet, i.e. same prefixes and denoms @@ -67,6 +98,8 @@ impl NymNetworkDetails { contracts: Default::default(), explorer_api: Default::default(), nym_vpn_api_url: Default::default(), + nym_api_urls: Default::default(), + nym_vpn_api_urls: Default::default(), } } @@ -154,6 +187,8 @@ impl NymNetworkDetails { }, explorer_api: parse_optional_str(mainnet::EXPLORER_API), nym_vpn_api_url: parse_optional_str(mainnet::NYM_VPN_API), + nym_api_urls: None, + nym_vpn_api_urls: None, } } diff --git a/nym-wallet/nym-wallet-types/src/network/sandbox.rs b/nym-wallet/nym-wallet-types/src/network/sandbox.rs index c436c9f09e1..68d389ebfba 100644 --- a/nym-wallet/nym-wallet-types/src/network/sandbox.rs +++ b/nym-wallet/nym-wallet-types/src/network/sandbox.rs @@ -55,5 +55,7 @@ pub(crate) fn network_details() -> nym_network_defaults::NymNetworkDetails { }, explorer_api: parse_optional_str(EXPLORER_API), nym_vpn_api_url: None, + nym_vpn_api_urls: None, + nym_api_urls: None, } } diff --git a/tools/internal/testnet-manager/src/manager/network.rs b/tools/internal/testnet-manager/src/manager/network.rs index 6c65eda06cb..623a3d0a8ec 100644 --- a/tools/internal/testnet-manager/src/manager/network.rs +++ b/tools/internal/testnet-manager/src/manager/network.rs @@ -83,6 +83,8 @@ impl<'a> From<&'a LoadedNetwork> for nym_config::defaults::NymNetworkDetails { contracts, explorer_api: None, nym_vpn_api_url: None, + nym_vpn_api_urls: None, + nym_api_urls: None, } } } diff --git a/tools/internal/testnet-manager/src/manager/network_init.rs b/tools/internal/testnet-manager/src/manager/network_init.rs index 8e978e4fc6a..6deb16046bf 100644 --- a/tools/internal/testnet-manager/src/manager/network_init.rs +++ b/tools/internal/testnet-manager/src/manager/network_init.rs @@ -40,6 +40,8 @@ impl InitCtx { contracts: Default::default(), explorer_api: None, nym_vpn_api_url: None, + nym_vpn_api_urls: None, + nym_api_urls: None, }; Ok(Config::try_from_nym_network_details(&network_details)?) }