diff --git a/Cargo.lock b/Cargo.lock index d8843203ba..7109658162 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5494,6 +5494,7 @@ version = "0.1.0" dependencies = [ "dotenvy", "log", + "regex", "schemars", "serde", "url", diff --git a/common/network-defaults/Cargo.toml b/common/network-defaults/Cargo.toml index 2cd2d4c443..cff301d891 100644 --- a/common/network-defaults/Cargo.toml +++ b/common/network-defaults/Cargo.toml @@ -23,3 +23,6 @@ default = ["env", "network"] env = ["dotenvy", "log"] network = ["schemars", "serde", "url"] utoipa = [ "dep:utoipa" ] + +[build-dependencies] +regex = { workspace = true } diff --git a/common/network-defaults/build.rs b/common/network-defaults/build.rs new file mode 100644 index 0000000000..067db307dc --- /dev/null +++ b/common/network-defaults/build.rs @@ -0,0 +1,64 @@ +use regex::Regex; +use std::{collections::HashMap, fs}; + +const TARGET_ENV_FILE: &str = "../../envs/mainnet.env"; + +/// Sync variable values defined in code with .env file +fn main() { + let file = include_str!("src/mainnet.rs"); + + 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(file) + .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(TARGET_ENV_FILE).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*"([^"]*)""#, 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(); + } + + fs::write(TARGET_ENV_FILE, contents).unwrap(); +} diff --git a/envs/mainnet.env b/envs/mainnet.env index e40e54a471..2be5300bd0 100644 --- a/envs/mainnet.env +++ b/envs/mainnet.env @@ -25,4 +25,4 @@ NYXD="https://rpc.nymtech.net" NYM_API="https://validator.nymtech.net/api/" 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.net/api/"