From 35c044c3407c57fdcaee6da97d29451721a6cbde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C8=99u?= Date: Mon, 17 Jan 2022 17:21:05 +0200 Subject: [PATCH] Store all clients and discard mnemonic --- nym-wallet/src-tauri/src/config/mod.rs | 8 -- nym-wallet/src-tauri/src/network.rs | 6 ++ .../src/operations/mixnet/account.rs | 99 +++++++++++-------- .../src-tauri/src/operations/mixnet/bond.rs | 4 +- nym-wallet/src-tauri/src/state.rs | 33 +++++-- 5 files changed, 89 insertions(+), 61 deletions(-) diff --git a/nym-wallet/src-tauri/src/config/mod.rs b/nym-wallet/src-tauri/src/config/mod.rs index 5f0ff79043..95de5b345b 100644 --- a/nym-wallet/src-tauri/src/config/mod.rs +++ b/nym-wallet/src-tauri/src/config/mod.rs @@ -24,9 +24,6 @@ pub struct Config { pub struct Base { /// Information on all the networks that the wallet connects to. networks: SupportedNetworks, - - /// Mnemonic (currently of the network monitor) used for rewarding - mnemonic: String, } impl Default for Base { @@ -34,7 +31,6 @@ impl Default for Base { let networks = Network::iter().map(|network| network.into()).collect(); Base { networks: SupportedNetworks::new(networks), - mnemonic: String::default(), } } } @@ -112,8 +108,4 @@ impl Config { .parse() .expect("stored vesting contract address is not a valid account address") } - - pub fn get_mnemonic(&self) -> &str { - &self.base.mnemonic - } } diff --git a/nym-wallet/src-tauri/src/network.rs b/nym-wallet/src-tauri/src/network.rs index bcedcccb21..ff05ea86e2 100644 --- a/nym-wallet/src-tauri/src/network.rs +++ b/nym-wallet/src-tauri/src/network.rs @@ -15,6 +15,12 @@ pub enum Network { SANDBOX, } +impl Default for Network { + fn default() -> Self { + Network::SANDBOX + } +} + impl Into for Network { fn into(self) -> ConfigNetwork { match self { diff --git a/nym-wallet/src-tauri/src/operations/mixnet/account.rs b/nym-wallet/src-tauri/src/operations/mixnet/account.rs index 2bac7053fa..803e74d86f 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/account.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/account.rs @@ -3,11 +3,13 @@ use crate::error::BackendError; use crate::network::Network; use crate::nymd_client; use crate::state::State; + use bip39::{Language, Mnemonic}; use serde::{Deserialize, Serialize}; use std::convert::{TryFrom, TryInto}; use std::str::FromStr; use std::sync::Arc; +use strum::IntoEnumIterator; use tokio::sync::RwLock; #[cfg_attr(test, derive(ts_rs::TS))] @@ -16,7 +18,6 @@ pub struct Account { contract_address: String, client_address: String, denom: Denom, - mnemonic: Option, } #[cfg_attr(test, derive(ts_rs::TS))] @@ -32,12 +33,7 @@ pub async fn connect_with_mnemonic( state: tauri::State<'_, Arc>>, ) -> Result { let mnemonic = Mnemonic::from_str(&mnemonic)?; - _connect_with_mnemonic( - mnemonic, - Network::try_from(config::defaults::default_network())?, - state, - ) - .await + _connect_with_mnemonic(mnemonic, state).await } #[tauri::command] @@ -70,9 +66,8 @@ pub async fn create_new_account( state: tauri::State<'_, Arc>>, ) -> Result { let rand_mnemonic = random_mnemonic(); - let mut client = connect_with_mnemonic(rand_mnemonic.to_string(), state).await?; - client.mnemonic = Some(rand_mnemonic.to_string()); - Ok(client) + let account = connect_with_mnemonic(rand_mnemonic.to_string(), state).await?; + Ok(account) } #[tauri::command] @@ -80,11 +75,25 @@ pub async fn switch_network( state: tauri::State<'_, Arc>>, network: Network, ) -> Result { - let mnemonic = { + let account = { let r_state = state.read().await; - Mnemonic::from_str(r_state.config().get_mnemonic())? + let client = r_state.client(network)?; + + let contract_address = client.nymd.mixnet_contract_address()?.to_string(); + let client_address = client.nymd.address().to_string(); + let denom = client.nymd.denom()?; + + Account { + contract_address, + client_address, + denom: denom.try_into()?, + } }; - _connect_with_mnemonic(mnemonic, network, state).await + + let mut w_state = state.write().await; + w_state.set_network(network); + + Ok(account) } fn random_mnemonic() -> Mnemonic { @@ -94,38 +103,44 @@ fn random_mnemonic() -> Mnemonic { async fn _connect_with_mnemonic( mnemonic: Mnemonic, - network: Network, state: tauri::State<'_, Arc>>, ) -> Result { - let client = { - let config = state.read().await.config(); - match validator_client::Client::new_signing( - validator_client::Config::new( - config.get_nymd_validator_url(network), - config.get_validator_api_url(network), - Some(config.get_mixnet_contract_address(network)), - Some(config.get_vesting_contract_address(network)), - ), - mnemonic, - ) { - Ok(client) => client, - Err(e) => panic!("{}", e), + let default_network = Network::try_from(config::defaults::default_network())?; + let mut default_account = None; + for network in Network::iter() { + let client = { + let config = state.read().await.config(); + match validator_client::Client::new_signing( + validator_client::Config::new( + config.get_nymd_validator_url(network), + config.get_validator_api_url(network), + Some(config.get_mixnet_contract_address(network)), + Some(config.get_vesting_contract_address(network)), + ), + mnemonic.clone(), + ) { + Ok(client) => client, + Err(e) => panic!("{}", e), + } + }; + + if network == default_network { + let contract_address = client.nymd.mixnet_contract_address()?.to_string(); + let client_address = client.nymd.address().to_string(); + let denom = client.nymd.denom()?; + + default_account = Some(Account { + contract_address, + client_address, + denom: denom.try_into()?, + }); } - }; - let contract_address = client.nymd.mixnet_contract_address()?.to_string(); - let client_address = client.nymd.address().to_string(); - let denom = client.nymd.denom()?; + let mut w_state = state.write().await; + w_state.add_client(network, client); + } - let account = Account { - contract_address, - client_address, - denom: denom.try_into()?, - mnemonic: None, - }; - - let mut w_state = state.write().await; - w_state.set_client(client); - - Ok(account) + default_account.ok_or(BackendError::NetworkNotSupported( + config::defaults::default_network(), + )) } diff --git a/nym-wallet/src-tauri/src/operations/mixnet/bond.rs b/nym-wallet/src-tauri/src/operations/mixnet/bond.rs index 9a2cf0cb30..3180bbf991 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/bond.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/bond.rs @@ -66,7 +66,7 @@ pub async fn mixnode_bond_details( state: tauri::State<'_, Arc>>, ) -> Result, BackendError> { let guard = state.read().await; - let client = guard.client()?; + let client = guard.current_client()?; let bond = client.nymd.owns_mixnode(client.nymd.address()).await?; Ok(bond) } @@ -76,7 +76,7 @@ pub async fn gateway_bond_details( state: tauri::State<'_, Arc>>, ) -> Result, BackendError> { let guard = state.read().await; - let client = guard.client()?; + let client = guard.current_client()?; let bond = client.nymd.owns_gateway(client.nymd.address()).await?; Ok(bond) } diff --git a/nym-wallet/src-tauri/src/state.rs b/nym-wallet/src-tauri/src/state.rs index 2b423cf744..b54355d8b4 100644 --- a/nym-wallet/src-tauri/src/state.rs +++ b/nym-wallet/src-tauri/src/state.rs @@ -1,19 +1,30 @@ use crate::config::Config; use crate::error::BackendError; +use crate::network::Network; use validator_client::nymd::SigningNymdClient; use validator_client::Client; +use std::collections::HashMap; + #[derive(Default)] pub struct State { config: Config, - signing_client: Option>, + signing_clients: HashMap>, + current_network: Network, } impl State { - pub fn client(&self) -> Result<&Client, BackendError> { + pub fn client(&self, network: Network) -> Result<&Client, BackendError> { self - .signing_client - .as_ref() + .signing_clients + .get(&network) + .ok_or(BackendError::ClientNotInitialized) + } + + pub fn current_client(&self) -> Result<&Client, BackendError> { + self + .signing_clients + .get(&self.current_network) .ok_or(BackendError::ClientNotInitialized) } @@ -21,28 +32,32 @@ impl State { self.config.clone() } - pub fn set_client(&mut self, signing_client: Client) { - self.signing_client = Some(signing_client) + pub fn add_client(&mut self, network: Network, client: Client) { + self.signing_clients.insert(network, client); + } + + pub fn set_network(&mut self, network: Network) { + self.current_network = network; } } #[macro_export] macro_rules! client { ($state:ident) => { - $state.read().await.client()? + $state.read().await.current_client()? }; } #[macro_export] macro_rules! nymd_client { ($state:ident) => { - $state.read().await.client()?.nymd + $state.read().await.current_client()?.nymd }; } #[macro_export] macro_rules! api_client { ($state:ident) => { - $state.read().await.client()?.validator_api + $state.read().await.current_client()?.validator_api }; }