nym_cli_commands/context/
mod.rs

1// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::context::errors::ContextError;
5pub use nym_http_api_client::Client as NymApiClient;
6use nym_network_defaults::{
7    setup_env,
8    var_names::{MIXNET_CONTRACT_ADDRESS, NYM_API, NYXD, VESTING_CONTRACT_ADDRESS},
9    NymNetworkDetails,
10};
11use nym_validator_client::nyxd::{self, AccountId, NyxdClient};
12use nym_validator_client::{
13    DirectSigningHttpRpcNyxdClient, DirectSigningHttpRpcValidatorClient, QueryHttpRpcNyxdClient,
14    QueryHttpRpcValidatorClient,
15};
16use tap::prelude::*;
17
18pub mod errors;
19
20pub type SigningClient = DirectSigningHttpRpcNyxdClient;
21pub type QueryClient = QueryHttpRpcNyxdClient;
22pub type SigningClientWithNyxd = DirectSigningHttpRpcValidatorClient;
23pub type QueryClientWithNyxd = QueryHttpRpcValidatorClient;
24
25#[derive(Debug)]
26pub struct ClientArgs {
27    pub config_env_file: Option<std::path::PathBuf>,
28    pub nyxd_url: Option<String>,
29    pub nym_api_url: Option<String>,
30    pub mnemonic: Option<bip39::Mnemonic>,
31    pub mixnet_contract_address: Option<AccountId>,
32    pub vesting_contract_address: Option<AccountId>,
33}
34
35pub fn get_network_details(args: &ClientArgs) -> Result<NymNetworkDetails, ContextError> {
36    // let the network defaults crate handle setting up the env vars if the file arg is set, otherwise
37    // it will default to what is already in env vars, falling back to mainnet
38    setup_env(args.config_env_file.as_ref());
39
40    // override the env vars with user supplied arguments, if set
41    if let Some(nyxd_url) = args.nyxd_url.as_ref() {
42        std::env::set_var(NYXD, nyxd_url);
43    }
44    if let Some(nym_api_url) = args.nym_api_url.as_ref() {
45        std::env::set_var(NYM_API, nym_api_url);
46    }
47    if let Some(mixnet_contract_address) = args.mixnet_contract_address.as_ref() {
48        std::env::set_var(MIXNET_CONTRACT_ADDRESS, mixnet_contract_address.to_string());
49    }
50    if let Some(vesting_contract_address) = args.vesting_contract_address.as_ref() {
51        std::env::set_var(
52            VESTING_CONTRACT_ADDRESS,
53            vesting_contract_address.to_string(),
54        );
55    }
56
57    Ok(NymNetworkDetails::new_from_env())
58}
59
60pub fn create_signing_client(
61    args: ClientArgs,
62    network_details: &NymNetworkDetails,
63) -> Result<SigningClient, ContextError> {
64    let client_config = nyxd::Config::try_from_nym_network_details(network_details)
65        .tap_err(|err| log::error!("Failed to get client config - {err}"))?;
66
67    // get mnemonic
68    let mnemonic = match std::env::var("MNEMONIC") {
69        Ok(value) => bip39::Mnemonic::parse(value)?,
70        // env var MNEMONIC is not present, so try to fall back to arg --mnemonic ...
71        Err(_) => match args.mnemonic {
72            Some(value) => value,
73            None => return Err(ContextError::MnemonicNotProvided), // no env var or arg provided
74        },
75    };
76
77    let nyxd_url = network_details
78        .endpoints
79        .first()
80        .expect("network details are not defined")
81        .nyxd_url
82        .as_str();
83
84    match NyxdClient::connect_with_mnemonic(client_config, nyxd_url, mnemonic) {
85        Ok(client) => Ok(client),
86        Err(e) => Err(ContextError::NyxdError(format!("{e}"))),
87    }
88}
89
90pub fn create_query_client(
91    network_details: &NymNetworkDetails,
92) -> Result<QueryClient, ContextError> {
93    let client_config = nyxd::Config::try_from_nym_network_details(network_details)
94        .tap_err(|err| log::error!("Failed to get client config - {err}"))?;
95
96    let nyxd_url = network_details
97        .endpoints
98        .first()
99        .expect("network details are not defined")
100        .nyxd_url
101        .as_str();
102
103    match NyxdClient::connect(client_config, nyxd_url) {
104        Ok(client) => Ok(client),
105        Err(e) => Err(ContextError::NyxdError(format!("{e}"))),
106    }
107}
108
109pub fn create_signing_client_with_nym_api(
110    args: ClientArgs,
111    network_details: &NymNetworkDetails,
112) -> Result<SigningClientWithNyxd, ContextError> {
113    let client_config = nym_validator_client::Config::try_from_nym_network_details(network_details)
114        .tap_err(|err| log::error!("Failed to get client config - {err}"))?;
115
116    // get mnemonic
117    let mnemonic = match std::env::var("MNEMONIC") {
118        Ok(value) => bip39::Mnemonic::parse(value)?,
119        // env var MNEMONIC is not present, so try to fall back to arg --mnemonic ...
120        Err(_) => match args.mnemonic {
121            Some(value) => value,
122            None => return Err(ContextError::MnemonicNotProvided), // no env var or arg provided
123        },
124    };
125
126    match nym_validator_client::client::Client::new_signing(client_config, mnemonic) {
127        Ok(client) => Ok(client),
128        Err(e) => Err(ContextError::NyxdError(format!("{e}"))),
129    }
130}
131
132pub fn create_query_client_with_nym_api(
133    network_details: &NymNetworkDetails,
134) -> Result<QueryClientWithNyxd, ContextError> {
135    let client_config = nym_validator_client::Config::try_from_nym_network_details(network_details)
136        .tap_err(|err| log::error!("Failed to get client config - {err}"))?;
137
138    match nym_validator_client::client::Client::new_query(client_config) {
139        Ok(client) => Ok(client),
140        Err(e) => Err(ContextError::NyxdError(format!("{e}"))),
141    }
142}