From ceb5f090cf3c148c2c7fce4d3254b435e8fc4049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 4 Apr 2022 10:14:28 +0200 Subject: [PATCH] wallet: expose select, add and remove validators --- nym-wallet/src-tauri/src/config/mod.rs | 15 +++ nym-wallet/src-tauri/src/main.rs | 17 ++- nym-wallet/src-tauri/src/network_config.rs | 106 ++++++++++++++++++ .../src/operations/mixnet/account.rs | 48 +------- nym-wallet/src/types/rust/validatorurls.ts | 5 + 5 files changed, 140 insertions(+), 51 deletions(-) create mode 100644 nym-wallet/src-tauri/src/network_config.rs diff --git a/nym-wallet/src-tauri/src/config/mod.rs b/nym-wallet/src-tauri/src/config/mod.rs index c0972a77fa..2bcd2050b2 100644 --- a/nym-wallet/src-tauri/src/config/mod.rs +++ b/nym-wallet/src-tauri/src/config/mod.rs @@ -1,6 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::network_config; use crate::platform_constants::{CONFIG_DIR_NAME, CONFIG_FILENAME}; use crate::{error::BackendError, network::Network as WalletNetwork}; use config::defaults::all::Network; @@ -312,6 +313,20 @@ impl TryFrom for ValidatorUrl { } } +impl TryFrom for ValidatorUrl { + type Error = BackendError; + + fn try_from(validator: network_config::Validator) -> Result { + Ok(ValidatorUrl { + nymd_url: validator.nymd_url.parse()?, + api_url: match &validator.api_url { + Some(url) => Some(url.parse()?), + None => None, + }, + }) + } +} + impl fmt::Display for ValidatorUrl { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let s1 = format!("nymd_url: {}", self.nymd_url); diff --git a/nym-wallet/src-tauri/src/main.rs b/nym-wallet/src-tauri/src/main.rs index 61346a19cf..d8e107b29f 100644 --- a/nym-wallet/src-tauri/src/main.rs +++ b/nym-wallet/src-tauri/src/main.rs @@ -14,6 +14,7 @@ mod config; mod error; mod menu; mod network; +mod network_config; mod operations; mod platform_constants; mod state; @@ -35,19 +36,16 @@ fn main() { .manage(Arc::new(RwLock::new(State::default()))) .invoke_handler(tauri::generate_handler![ mixnet::account::connect_with_mnemonic, - mixnet::account::validate_mnemonic, mixnet::account::create_new_account, mixnet::account::create_new_mnemonic, mixnet::account::create_password, mixnet::account::does_password_file_exist, mixnet::account::get_balance, - mixnet::account::get_validator_nymd_urls, - mixnet::account::get_validator_api_urls, mixnet::account::logout, mixnet::account::remove_password, mixnet::account::sign_in_with_password, mixnet::account::switch_network, - mixnet::account::update_validator_urls, + mixnet::account::validate_mnemonic, mixnet::account::validate_mnemonic, mixnet::admin::get_contract_settings, mixnet::admin::update_contract_settings, @@ -61,11 +59,18 @@ fn main() { mixnet::bond::update_mixnode, mixnet::delegate::delegate_to_mixnode, mixnet::delegate::get_delegator_rewards, + mixnet::delegate::get_pending_delegation_events, mixnet::delegate::get_reverse_mix_delegations_paged, mixnet::delegate::undelegate_from_mixnode, - mixnet::delegate::get_pending_delegation_events, mixnet::epoch::get_current_epoch, mixnet::send::send, + network_config::add_validator, + network_config::get_validator_api_urls, + network_config::get_validator_nymd_urls, + network_config::remove_validator, + network_config::select_validator_api_url, + network_config::select_validator_nymd_url, + network_config::update_validator_urls, utils::major_to_minor, utils::minor_to_major, utils::outdated_get_approximate_fee, @@ -81,8 +86,8 @@ fn main() { vesting::bond::vesting_bond_mixnode, vesting::bond::vesting_unbond_gateway, vesting::bond::vesting_unbond_mixnode, - vesting::bond::withdraw_vested_coins, vesting::bond::vesting_update_mixnode, + vesting::bond::withdraw_vested_coins, vesting::delegate::vesting_delegate_to_mixnode, vesting::delegate::vesting_undelegate_from_mixnode, vesting::queries::delegated_free, diff --git a/nym-wallet/src-tauri/src/network_config.rs b/nym-wallet/src-tauri/src/network_config.rs new file mode 100644 index 0000000000..8205d079c8 --- /dev/null +++ b/nym-wallet/src-tauri/src/network_config.rs @@ -0,0 +1,106 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::error::BackendError; +use crate::network::Network as WalletNetwork; +use crate::state::State; + +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use tokio::sync::RwLock; + +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(export, export_to = "../src/types/rust/validatorurls.ts"))] +#[derive(Serialize, Deserialize)] +pub struct ValidatorUrls { + pub urls: Vec, +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(export, export_to = "../src/types/rust/validatorurls.ts"))] +#[derive(Serialize, Deserialize)] +pub struct Validator { + pub nymd_url: String, + pub api_url: Option, +} + +#[tauri::command] +pub async fn get_validator_nymd_urls( + network: WalletNetwork, + state: tauri::State<'_, Arc>>, +) -> Result { + let state = state.read().await; + let urls: Vec = state + .get_nymd_urls(network) + .map(|url| url.to_string()) + .collect(); + Ok(ValidatorUrls { urls }) +} + +#[tauri::command] +pub async fn get_validator_api_urls( + network: WalletNetwork, + state: tauri::State<'_, Arc>>, +) -> Result { + let state = state.read().await; + let urls: Vec = state + .get_api_urls(network) + .map(|url| url.to_string()) + .collect(); + Ok(ValidatorUrls { urls }) +} + +#[tauri::command] +pub async fn select_validator_nymd_url( + url: &str, + network: WalletNetwork, + state: tauri::State<'_, Arc>>, +) -> Result<(), BackendError> { + state + .write() + .await + .select_validator_nymd_url(url, network)?; + Ok(()) +} + +#[tauri::command] +pub async fn select_validator_api_url( + url: &str, + network: WalletNetwork, + state: tauri::State<'_, Arc>>, +) -> Result<(), BackendError> { + state.write().await.select_validator_api_url(url, network)?; + Ok(()) +} + +#[tauri::command] +pub async fn add_validator( + validator: Validator, + network: WalletNetwork, + state: tauri::State<'_, Arc>>, +) -> Result<(), BackendError> { + let url = validator.try_into()?; + state.write().await.add_validator_url(url, network); + Ok(()) +} + +#[tauri::command] +pub async fn remove_validator( + validator: Validator, + network: WalletNetwork, + state: tauri::State<'_, Arc>>, +) -> Result<(), BackendError> { + let url = validator.try_into()?; + state.write().await.remove_validator_url(url, network); + Ok(()) +} + +// Update the list of validators by fecthing additional ones remotely. If it fails, just ignore. +#[tauri::command] +pub async fn update_validator_urls( + state: tauri::State<'_, Arc>>, +) -> Result<(), BackendError> { + let mut w_state = state.write().await; + let _r = w_state.fetch_updated_validator_urls().await; + Ok(()) +} diff --git a/nym-wallet/src-tauri/src/operations/mixnet/account.rs b/nym-wallet/src-tauri/src/operations/mixnet/account.rs index 12901cc046..a79a6c92c3 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/account.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/account.rs @@ -2,6 +2,7 @@ use crate::coin::{Coin, Denom}; use crate::config::Config; use crate::error::BackendError; use crate::network::Network as WalletNetwork; +use crate::network_config; use crate::nymd_client; use crate::state::State; use crate::wallet_storage::{self, DEFAULT_WALLET_ACCOUNT_ID}; @@ -58,13 +59,6 @@ pub struct Balance { printable_balance: String, } -#[cfg_attr(test, derive(ts_rs::TS))] -#[cfg_attr(test, ts(export, export_to = "../src/types/rust/validatorurls.ts"))] -#[derive(Serialize, Deserialize)] -pub struct ValidatorUrls { - urls: Vec, -} - #[tauri::command] pub async fn connect_with_mnemonic( mnemonic: String, @@ -113,7 +107,7 @@ pub async fn create_new_account( } #[tauri::command] -pub async fn create_new_mnemonic() -> Result { +pub fn create_new_mnemonic() -> Result { let rand_mnemonic = random_mnemonic(); Ok(rand_mnemonic.to_string()) } @@ -157,42 +151,6 @@ fn random_mnemonic() -> Mnemonic { Mnemonic::generate_in_with(&mut rng, Language::English, 24).unwrap() } -#[tauri::command] -pub async fn update_validator_urls( - state: tauri::State<'_, Arc>>, -) -> Result<(), BackendError> { - // Update the list of validators by fecthing additional ones remotely. If it fails, just ignore. - let mut w_state = state.write().await; - let _r = w_state.fetch_updated_validator_urls().await; - Ok(()) -} - -#[tauri::command] -pub async fn get_validator_nymd_urls( - network: WalletNetwork, - state: tauri::State<'_, Arc>>, -) -> Result { - let state = state.read().await; - let urls: Vec = state - .get_nymd_urls(network) - .map(|url| url.to_string()) - .collect(); - Ok(ValidatorUrls { urls }) -} - -#[tauri::command] -pub async fn get_validator_api_urls( - network: WalletNetwork, - state: tauri::State<'_, Arc>>, -) -> Result { - let state = state.read().await; - let urls: Vec = state - .get_api_urls(network) - .map(|url| url.to_string()) - .collect(); - Ok(ValidatorUrls { urls }) -} - async fn _connect_with_mnemonic( mnemonic: Mnemonic, state: tauri::State<'_, Arc>>, @@ -202,7 +160,7 @@ async fn _connect_with_mnemonic( w_state.load_config_files(); } - update_validator_urls(state.clone()).await?; + network_config::update_validator_urls(state.clone()).await?; let config = { let state = state.read().await; diff --git a/nym-wallet/src/types/rust/validatorurls.ts b/nym-wallet/src/types/rust/validatorurls.ts index c4b4a7624e..c3c6bbe580 100644 --- a/nym-wallet/src/types/rust/validatorurls.ts +++ b/nym-wallet/src/types/rust/validatorurls.ts @@ -1,3 +1,8 @@ export interface ValidatorUrls { urls: Array; } + +export interface Validator { + nymd_url: string; + api_url: string | null; +}