Skip to content

Commit 8803b7d

Browse files
authored
Move url to env file (#3506)
* refactor: move RPC URLs and API keys from CLI args to environment variables * centralize environment variable handling * fmt * organize .env.example by category * simplify environment variable handling * centralize environment configuration in new EnvConfig struct * fix comments * rename worker_base_url to pumpx_worker_url and reorder environment variable logging * use EnvConfig for parentchain URL configuration instead of direct env var access
1 parent a16626c commit 8803b7d

File tree

9 files changed

+218
-59
lines changed

9 files changed

+218
-59
lines changed

tee-worker/omni-executor/.env.example

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
1-
# sendgrid config
1+
# Sendgrid
22
OE_SENDGRID_API_KEY=
33
OE_SENDGRID_FROM_EMAIL=
44
OE_SENDGRID_FROM_NAME=
5-
# pumpX config
6-
OE_PUMPX_API_BASE_URL=
5+
6+
# Pumpx
7+
OE_PUMPX_API_BASE_URL=
8+
OE_PUMPX_SIGNER_URL=
9+
OE_PUMPX_WORKER_URL=
10+
11+
# Binance
12+
OE_BINANCE_API_KEY=
13+
OE_BINANCE_API_SECRET=
14+
OE_BINANCE_API_BASE_URL=
15+
16+
# Heima
17+
OE_PARENTCHAIN_URL=
18+
19+
# Ethereum
20+
OE_ETHEREUM_URL=
21+
OE_BSC_URL=
22+
OE_BSC_TESTNET_URL=
23+
24+
# Solana
25+
OE_SOLANA_URL=
26+

tee-worker/omni-executor/binance-api/src/lib.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,8 @@ pub enum BinanceApiResponse<T> {
5757
}
5858

5959
impl BinanceApiClient {
60-
pub fn new(api_key: String, api_secret: String, base_url: Option<String>) -> BinanceApiClient {
61-
let base_url = match base_url {
62-
Some(url) => Url::parse(&url).expect("Invalid base URL"),
63-
None => Url::parse("https://api.binance.com").unwrap(),
64-
};
60+
pub fn new(api_key: String, api_secret: String, base_url: String) -> BinanceApiClient {
61+
let base_url = Url::parse(&base_url).expect("Invalid base URL");
6562
let client = Client::new();
6663
BinanceApiClient { client, base_url, api_key, api_secret }
6764
}
@@ -246,7 +243,8 @@ mod tests {
246243
let api_secret =
247244
"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j".to_string();
248245
let query_string = "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559".to_string();
249-
let binance_api = BinanceApiClient::new(api_key, api_secret, None);
246+
let binance_api =
247+
BinanceApiClient::new(api_key, api_secret, "https://api.binance.com".to_string());
250248
let signature = binance_api.sign_request(&query_string);
251249

252250
assert_eq!(signature, "c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71");

tee-worker/omni-executor/executor-worker/src/cli.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ pub enum Commands {
1616

1717
#[derive(Args)]
1818
pub struct RunArgs {
19-
pub parentchain_url: String,
20-
pub ethereum_url: String,
21-
pub solana_url: String,
22-
pub pumpx_signer_url: String,
23-
pub worker_url: String,
24-
pub bsc_url: String,
25-
pub bsc_testnet_url: Option<String>,
2619
#[arg(long, short = 'b', default_value = "0", help = "Start block to sync from parentchain")]
2720
pub start_block: u64,
2821
#[arg(short, long, default_value = "local", value_name = "local directory path")]
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
// Copyright 2020-2024 Trust Computing GmbH.
2+
// This file is part of Litentry.
3+
//
4+
// Litentry is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// Litentry is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU General Public License
15+
// along with Litentry. If not, see <https://www.gnu.org/licenses/>.
16+
17+
use std::collections::HashMap;
18+
use tracing::info;
19+
20+
const DEFAULT_PUMPX_API_BASE_URL: &str = "https://api.pumpx.ai";
21+
const DEFAULT_BINANCE_API_BASE_URL: &str = "https://api.binance.com";
22+
23+
/// Configuration struct for environment variables used by the executor worker
24+
pub struct EnvConfig {
25+
pub parentchain_url: String,
26+
pub ethereum_url: String,
27+
pub solana_url: String,
28+
pub bsc_url: String,
29+
pub bsc_testnet_url: Option<String>,
30+
pub pumpx_signer_url: String,
31+
pub pumpx_api_base_url: String,
32+
pub pumpx_worker_url: String,
33+
pub binance_api_key: String,
34+
pub binance_api_secret: String,
35+
pub binance_api_base_url: String,
36+
}
37+
38+
impl EnvConfig {
39+
/// Creates a new EnvConfig by loading values from environment variables
40+
pub fn from_env() -> Self {
41+
let (env_map, sensitive_map) = Self::load_env_vars();
42+
43+
Self::log_env_vars(&env_map, &sensitive_map);
44+
45+
// Convert from HashMap to struct for better type safety and usage
46+
Self::from_map(env_map)
47+
}
48+
49+
/// Loads environment variables into a HashMap
50+
fn load_env_vars() -> (HashMap<&'static str, Option<String>>, HashMap<&'static str, bool>) {
51+
const SENSITIVE: bool = true;
52+
const NOT_SENSITIVE: bool = false;
53+
54+
let vars = [
55+
("OE_PARENTCHAIN_URL", "parentchain_url", NOT_SENSITIVE),
56+
("OE_ETHERUM_URL", "ethereum_url", NOT_SENSITIVE),
57+
("OE_SOLANA_URL", "solana_url", NOT_SENSITIVE),
58+
("OE_BSC_URL", "bsc_url", NOT_SENSITIVE),
59+
("OE_BSC_TESTNET_URL", "bsc_testnet_url", NOT_SENSITIVE),
60+
("OE_ALCHEMY_KEY", "alchemy_key", SENSITIVE),
61+
("OE_PUMPX_SIGNER_URL", "pumpx_signer_url", NOT_SENSITIVE),
62+
("OE_PUMPX_API_BASE_URL", "pumpx_api_base_url", NOT_SENSITIVE),
63+
("OE_PUMPX_WORKER_URL", "pumpx_worker_url", NOT_SENSITIVE),
64+
("OE_BINANCE_API_KEY", "binance_api_key", SENSITIVE),
65+
("OE_BINANCE_API_SECRET", "binance_api_secret", SENSITIVE),
66+
("OE_BINANCE_API_BASE_URL", "binance_api_base_url", NOT_SENSITIVE),
67+
];
68+
69+
let mut env_map = HashMap::new();
70+
let mut sensitive_map = HashMap::new();
71+
72+
// Load environment variables
73+
for (env_name, var_name, is_sensitive) in vars {
74+
let value = Some(std::env::var(env_name).unwrap_or_default());
75+
env_map.insert(var_name, value);
76+
sensitive_map.insert(var_name, is_sensitive);
77+
}
78+
79+
// Set default values for certain variables if they're empty
80+
let defaults = [
81+
("binance_api_base_url", DEFAULT_BINANCE_API_BASE_URL),
82+
("pumpx_api_base_url", DEFAULT_PUMPX_API_BASE_URL),
83+
];
84+
85+
for (key, default_value) in defaults {
86+
if env_map.get(key).and_then(|v| v.as_ref()).is_none_or(|v| v.is_empty()) {
87+
env_map.insert(key, Some(default_value.to_string()));
88+
}
89+
}
90+
91+
(env_map, sensitive_map)
92+
}
93+
94+
/// Logs non-sensitive environment variables
95+
fn log_env_vars(
96+
env_map: &HashMap<&'static str, Option<String>>,
97+
sensitive_map: &HashMap<&'static str, bool>,
98+
) {
99+
// Log command line arguments
100+
let args_string = std::env::args().collect::<Vec<String>>().join(" ");
101+
102+
for (name, value) in env_map {
103+
if let Some(is_sensitive) = sensitive_map.get(name) {
104+
if !*is_sensitive {
105+
if let Some(val) = value {
106+
info!("Environment variable {}: {}", name, val);
107+
}
108+
}
109+
}
110+
}
111+
112+
info!("Executing: {}", args_string);
113+
}
114+
115+
/// Converts a HashMap of environment variables to an EnvConfig struct
116+
fn from_map(env_map: HashMap<&'static str, Option<String>>) -> Self {
117+
let get_string = |key: &str| -> String {
118+
env_map
119+
.get(key)
120+
.and_then(|v| v.as_ref())
121+
.map_or_else(String::new, |v| v.clone())
122+
};
123+
124+
let ethereum_url = get_string("ethereum_url");
125+
let solana_url = get_string("solana_url");
126+
let bsc_url = get_string("bsc_url");
127+
let bsc_testnet_url =
128+
env_map.get("bsc_testnet_url").and_then(|v| v.clone()).filter(|v| !v.is_empty());
129+
let alchemy_key = get_string("alchemy_key");
130+
131+
// Append alchemy_key to URLs in the format: https://base-url/v2/{alchemy_key}
132+
let append_key = |url: &str| -> String {
133+
if !alchemy_key.is_empty() && url.contains("alchemy") {
134+
format!("{}{}", url, alchemy_key)
135+
} else {
136+
url.to_string()
137+
}
138+
};
139+
140+
EnvConfig {
141+
parentchain_url: get_string("parentchain_url"),
142+
ethereum_url: append_key(&ethereum_url),
143+
solana_url: append_key(&solana_url),
144+
bsc_url: append_key(&bsc_url),
145+
bsc_testnet_url: bsc_testnet_url.as_ref().map(|url| append_key(url)),
146+
pumpx_signer_url: get_string("pumpx_signer_url"),
147+
pumpx_api_base_url: get_string("pumpx_api_base_url"),
148+
pumpx_worker_url: get_string("pumpx_worker_url"),
149+
binance_api_key: get_string("binance_api_key"),
150+
binance_api_secret: get_string("binance_api_secret"),
151+
binance_api_base_url: get_string("binance_api_base_url"),
152+
}
153+
}
154+
}

tee-worker/omni-executor/executor-worker/src/main.rs

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ use rust_decimal::Decimal;
5959
use solana::SolanaRpcClient;
6060
use solana_intent_executor::SolanaIntentExecutor;
6161
use std::collections::HashMap;
62-
use std::env;
6362
use std::net::SocketAddr;
6463
use std::path::Path;
6564
use std::str::FromStr;
@@ -73,7 +72,8 @@ use tracing::info;
7372
use tracing::log::error;
7473
use tracing_subscriber::EnvFilter;
7574
use tracing_subscriber::FmtSubscriber;
76-
75+
mod env_config;
76+
use env_config::EnvConfig;
7777
mod cli;
7878

7979
#[tokio::main]
@@ -90,9 +90,7 @@ async fn main() -> Result<(), ()> {
9090

9191
match cli.cmd {
9292
Commands::Run(args) => {
93-
let args_string = std::env::args().collect::<Vec<String>>().join(" ");
94-
info!("Executing: {}", args_string);
95-
93+
let env_config = EnvConfig::from_env();
9694
let builder = PrometheusBuilder::new();
9795

9896
let address = SocketAddr::from_str(&format!("0.0.0.0:{}", args.metrics_port)).unwrap();
@@ -166,10 +164,12 @@ async fn main() -> Result<(), ()> {
166164
.unwrap()
167165
);
168166

169-
let storage_db =
170-
init_storage(&args.parentchain_url).await.expect("Could not initialize storage");
167+
let storage_db = init_storage(&env_config.parentchain_url)
168+
.await
169+
.expect("Could not initialize storage");
171170

172-
let client_factory = SubxtClientFactory::<CustomConfig>::new(&args.parentchain_url);
171+
let client_factory =
172+
SubxtClientFactory::<CustomConfig>::new(&env_config.parentchain_url);
173173
let metadata_provider = Arc::new(SubxtMetadataProvider::new(client_factory.clone()));
174174
let parentchain_rpc_client_factory = Arc::new(client_factory);
175175

@@ -209,45 +209,43 @@ async fn main() -> Result<(), ()> {
209209

210210
let pumpx_signer_client: Arc<Box<dyn signer_client::SignerClient>> =
211211
Arc::new(Box::new(pumpx::signer_client::PumpxSignerClient::new(
212-
args.pumpx_signer_url.clone(),
212+
env_config.pumpx_signer_url,
213213
pumpx_signer_pair,
214214
)));
215215

216-
let ethereum_intent_executor =
217-
EthereumIntentExecutor::new(&args.ethereum_url, &args.delegation_contract_address)?;
218-
let solana_intent_executor = SolanaIntentExecutor::new(&args.solana_url)?;
216+
let ethereum_intent_executor = EthereumIntentExecutor::new(
217+
&env_config.ethereum_url,
218+
&args.delegation_contract_address,
219+
)?;
220+
let solana_intent_executor = SolanaIntentExecutor::new(&env_config.solana_url)?;
219221

220222
let mut rpc_endpoint_registry = RpcEndpointRegistry::new();
221-
rpc_endpoint_registry.insert(Chain::Solana, args.solana_url.clone());
222-
rpc_endpoint_registry.insert(Chain::Ethereum(56), args.bsc_url.clone());
223+
rpc_endpoint_registry.insert(Chain::Solana, env_config.solana_url.to_string());
224+
rpc_endpoint_registry.insert(Chain::Ethereum(56), env_config.bsc_url.to_string());
223225

224-
if let Some(ref bsc_testnet_url) = args.bsc_testnet_url {
226+
if let Some(ref bsc_testnet_url) = env_config.bsc_testnet_url {
225227
rpc_endpoint_registry.insert(Chain::Ethereum(97), bsc_testnet_url.to_owned());
226228
}
227229

228-
let pumpx_api_base_url = std::env::var("OE_PUMPX_API_BASE_URL").ok();
229230
let pumpx_api: Arc<Box<dyn PumpxApi>> =
230-
Arc::new(Box::new(PumpxApiClient::new(pumpx_api_base_url)));
231+
Arc::new(Box::new(PumpxApiClient::new(env_config.pumpx_api_base_url.to_string())));
231232

232-
let binance_api_key = env::var("OE_BINANCE_API_KEY").unwrap_or("".to_string());
233-
let binance_api_secret = env::var("OE_BINANCE_API_SECRET").unwrap_or("".to_string());
234-
let binance_api_base_url = env::var("OE_BINANCE_API_BASE_URL").ok();
235233
let binance_api = Arc::new(BinanceApiClient::new(
236-
binance_api_key,
237-
binance_api_secret,
238-
binance_api_base_url,
234+
env_config.binance_api_key,
235+
env_config.binance_api_secret,
236+
env_config.binance_api_base_url,
239237
));
240238

241239
let solana_client: Arc<SolanaRpcClient> =
242-
Arc::new(SolanaRpcClient::new(&args.solana_url));
240+
Arc::new(SolanaRpcClient::new(&env_config.solana_url));
243241

244242
let accounting_contract_signer =
245243
PrivateKeySigner::from_slice(&evm_accounting_ecdsa_signer_key_pair.seed())
246244
.expect("Could not create accounting contract signer");
247245
let accounting_contract_wallet = EthereumWallet::from(accounting_contract_signer);
248246

249247
let bsc_rpc_provider = ethereum_rpc::AlloyRpcProvider::new_with_wallet(
250-
&args.bsc_url,
248+
&env_config.bsc_url,
251249
accounting_contract_wallet,
252250
);
253251
let evm_accounting_contract_client = EthereumAccountingContractClient::new(
@@ -256,19 +254,19 @@ async fn main() -> Result<(), ()> {
256254
);
257255
let solana_accounting_contract_client = SolanaAccountingContractClient::new(
258256
solana_accounting_ed25519_signer_key_pair,
259-
args.solana_url.clone(),
257+
env_config.solana_url.clone(),
260258
args.solana_accounting_contract_address.parse().unwrap(),
261259
);
262260

263261
let bsc_client: Arc<EthereumRpcClient> =
264-
Arc::new(EthereumRpcClient::new(&args.bsc_url));
262+
Arc::new(EthereumRpcClient::new(&env_config.bsc_url));
265263

266264
// wallet monitoring setup start
267265
let bsc_wallet_balance_fetcher: Arc<Box<dyn WalletBalanceFetcher>> =
268-
Arc::new(Box::new(ethereum_rpc::AlloyRpcProvider::new(&args.bsc_url)));
266+
Arc::new(Box::new(ethereum_rpc::AlloyRpcProvider::new(&env_config.bsc_url)));
269267

270268
let solana_wallet_balance_fetcher: Arc<Box<dyn WalletBalanceFetcher>> =
271-
Arc::new(Box::new(SolanaRpcClient::new(&args.solana_url)));
269+
Arc::new(Box::new(SolanaRpcClient::new(&env_config.solana_url)));
272270

273271
let mut balance_fetchers: HashMap<
274272
WalletNetworkType,
@@ -323,8 +321,8 @@ async fn main() -> Result<(), ()> {
323321
let native_task_sender =
324322
run_native_task_handler(MAX_CONCURRENT_TASKS, Arc::new(task_handler_context)).await;
325323

326-
info!("worker url: {:?}", args.worker_url);
327-
let worker_url = url::Url::parse(&args.worker_url).expect("Invalid worker url");
324+
let worker_url =
325+
url::Url::parse(&env_config.pumpx_worker_url).expect("Invalid worker url");
328326

329327
let shielding_key_store = ShieldingKeyStore::new(
330328
Path::new(&args.local_directory_path)
@@ -402,12 +400,13 @@ async fn listen_to_parentchain(
402400
args: RunArgs,
403401
storage_db: Arc<StorageDB>,
404402
) -> Result<JoinHandle<()>, ()> {
403+
let env_config = EnvConfig::from_env();
405404
let (_sub_stop_sender, sub_stop_receiver) = oneshot::channel();
406-
405+
let parentchain_url = env_config.parentchain_url;
407406
let mut parentchain_listener = parentchain_listener::create_listener(
408407
"heima",
409408
Handle::current(),
410-
&args.parentchain_url,
409+
&parentchain_url,
411410
sub_stop_receiver,
412411
storage_db,
413412
&Path::new(&args.local_directory_path)

0 commit comments

Comments
 (0)