diff --git a/Cargo.lock b/Cargo.lock index 041918fe70..cf99c2a815 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5872,8 +5872,10 @@ dependencies = [ name = "nym-network-defaults" version = "0.1.0" dependencies = [ + "cargo_metadata 0.18.1", "dotenvy", "log", + "regex", "schemars", "serde", "url", diff --git a/common/network-defaults/Cargo.toml b/common/network-defaults/Cargo.toml index 2cd2d4c443..0446136e02 100644 --- a/common/network-defaults/Cargo.toml +++ b/common/network-defaults/Cargo.toml @@ -23,3 +23,7 @@ default = ["env", "network"] env = ["dotenvy", "log"] network = ["schemars", "serde", "url"] utoipa = [ "dep:utoipa" ] + +[build-dependencies] +regex = { workspace = true } +cargo_metadata = { version = "0.18" } diff --git a/common/network-defaults/build.rs b/common/network-defaults/build.rs new file mode 100644 index 0000000000..aa52baa876 --- /dev/null +++ b/common/network-defaults/build.rs @@ -0,0 +1,85 @@ +use cargo_metadata::MetadataCommand; +use regex::Regex; +use std::{collections::HashMap, fs, path::PathBuf}; + +/// Sync variable values defined in code with .env file +fn main() { + let source_of_truth = include_str!("src/mainnet.rs"); + let mut output_path = workspace_root(); + output_path.push("envs"); + output_path.push("mainnet.env"); + + println!("{}", output_path.display()); + + let variables_to_track = [ + "NETWORK_NAME", + "BECH32_PREFIX", + "MIXNET_CONTRACT_ADDRESS", + "VESTING_CONTRACT_ADDRESS", + "GROUP_CONTRACT_ADDRESS", + "ECASH_CONTRACT_ADDRESS", + "MULTISIG_CONTRACT_ADDRESS", + "COCONUT_DKG_CONTRACT_ADDRESS", + "REWARDING_VALIDATOR_ADDRESS", + "NYM_API", + "NYXD_WS", + "EXPLORER_API", + "NYM_VPN_API", + ]; + + let mut replace_with = HashMap::new(); + + for var in variables_to_track { + // if script fails, debug with `cargo check -vv`` + println!("Looking for {}", var); + + // read pattern that looks like: + // : &str = "" + let pattern = format!(r#"{}: &str\s*=\s*"([^"]*)""#, regex::escape(var)); + + let re = Regex::new(&pattern).unwrap(); + let value = re + .captures(source_of_truth) + .and_then(|caps| caps.get(1).map(|match_| match_.as_str().to_string())) + .expect("Couldn't find var in source file"); + println!("Storing {}={}", var, value); + replace_with.insert(var, value); + } + + let mut contents = fs::read_to_string(&output_path).unwrap(); + + for (var, value) in replace_with { + // match a pattern that looks like: + // = + // where `` is a variable name inserted into search pattern + let pattern = format!(r#"{}\s*=\s*([^\n]*)"#, regex::escape(var)); + + // replace matched pattern with + // = + let re = Regex::new(&pattern).unwrap(); + contents = re + .replace(&contents, |_: ®ex::Captures| { + format!(r#"{}={}"#, var, value) + }) + .to_string(); + } + + println!("File contents to write:\n{}", contents); + if output_path.exists() { + fs::write(output_path, contents).unwrap(); + } else { + panic!("{} doesn't exist", output_path.display()); + } +} + +fn workspace_root() -> PathBuf { + let metadata = MetadataCommand::new() + .exec() + .expect("Failed to get cargo metadata"); + + metadata + .workspace_root + .into_std_path_buf() + .canonicalize() + .expect("Failed to canonicalize path") +} diff --git a/envs/mainnet.env b/envs/mainnet.env index 419547bf97..ad1e2cd88e 100644 --- a/envs/mainnet.env +++ b/envs/mainnet.env @@ -20,9 +20,9 @@ MULTISIG_CONTRACT_ADDRESS=n1txayqfz5g9qww3rlflpg025xd26m9payz96u54x4fe3s2ktz39xq COCONUT_DKG_CONTRACT_ADDRESS=n19604yflqggs9mk2z26mqygq43q2kr3n932egxx630svywd5mpxjsztfpvx REWARDING_VALIDATOR_ADDRESS=n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy -STATISTICS_SERVICE_DOMAIN_ADDRESS="https://mainnet-stats.nymte.ch:8090" +STATISTICS_SERVICE_DOMAIN_ADDRESS=https://mainnet-stats.nymte.ch:8090 NYXD=https://rpc.nymtech.net NYM_API=https://validator.nymtech.net/api/ -NYXD_WS="wss://rpc.nymtech.net/websocket" +NYXD_WS=wss://rpc.nymtech.net/websocket EXPLORER_API=https://explorer.nymtech.net/api/ -NYM_VPN_API="https://nymvpn.com/api" +NYM_VPN_API=https://nymvpn.com/api/