diff --git a/Cargo.lock b/Cargo.lock index 7d5658fc4f..8cf82bec7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6203,6 +6203,7 @@ dependencies = [ "async-trait", "base64", "bip39", + "coconut-dkg-common", "coconut-interface", "colored", "config", diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index 32c5aa1b2a..9be4242d63 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -12,6 +12,7 @@ base64 = "0.13" colored = "2.0" mixnet-contract-common = { path= "../../cosmwasm-smart-contracts/mixnet-contract" } vesting-contract-common = { path= "../../cosmwasm-smart-contracts/vesting-contract" } +coconut-dkg-common = { path = "../../cosmwasm-smart-contracts/coconut-dkg-contract", optional = true } vesting-contract = { path = "../../../contracts/vesting" } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -54,3 +55,4 @@ nymd-client = [ "itertools", "cosmwasm-std", ] +dkg = ["nymd-client", "coconut-dkg-common"] diff --git a/common/client-libs/validator-client/src/client.rs b/common/client-libs/validator-client/src/client.rs index adcf4dd2f9..66aeb6b28a 100644 --- a/common/client-libs/validator-client/src/client.rs +++ b/common/client-libs/validator-client/src/client.rs @@ -42,6 +42,8 @@ pub struct Config { mixnet_contract_address: Option, vesting_contract_address: Option, erc20_bridge_contract_address: Option, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: Option, mixnode_page_limit: Option, gateway_page_limit: Option, @@ -65,6 +67,8 @@ impl Config { mixnet_contract_address, vesting_contract_address, erc20_bridge_contract_address, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: None, api_url, mixnode_page_limit: None, gateway_page_limit: None, @@ -92,6 +96,15 @@ impl Config { self.rewarded_set_page_limit = limit; self } + + #[cfg(feature = "dkg")] + pub fn with_coconut_dkg_contract( + mut self, + coconut_dkg_contract_address: Option, + ) -> Config { + self.coconut_dkg_contract_address = coconut_dkg_contract_address; + self + } } #[cfg(feature = "nymd-client")] @@ -100,6 +113,8 @@ pub struct Client { mixnet_contract_address: Option, vesting_contract_address: Option, erc20_bridge_contract_address: Option, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: Option, mnemonic: Option, mixnode_page_limit: Option, @@ -134,6 +149,8 @@ impl Client { mixnet_contract_address: config.mixnet_contract_address, vesting_contract_address: config.vesting_contract_address, erc20_bridge_contract_address: config.erc20_bridge_contract_address, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: config.coconut_dkg_contract_address, mnemonic: Some(mnemonic), mixnode_page_limit: config.mixnode_page_limit, gateway_page_limit: config.gateway_page_limit, @@ -192,6 +209,8 @@ impl Client { mixnet_contract_address: config.mixnet_contract_address, vesting_contract_address: config.vesting_contract_address, erc20_bridge_contract_address: config.erc20_bridge_contract_address, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: config.coconut_dkg_contract_address, mnemonic: None, mixnode_page_limit: config.mixnode_page_limit, gateway_page_limit: config.gateway_page_limit, @@ -219,6 +238,16 @@ impl Client { self.validator_api.change_url(new_endpoint) } + #[cfg(feature = "dkg")] + pub fn set_coconut_dkg_contract( + &mut self, + coconut_dkg_contract_address: Option, + ) { + self.nymd + .set_coconut_dkg_contract_address(coconut_dkg_contract_address.clone()); + self.coconut_dkg_contract_address = coconut_dkg_contract_address; + } + // use case: somebody initialised client without a contract in order to upload and initialise one // and now they want to actually use it without making new client pub fn set_mixnet_contract_address(&mut self, mixnet_contract_address: cosmrs::AccountId) { diff --git a/common/client-libs/validator-client/src/nymd/mod.rs b/common/client-libs/validator-client/src/nymd/mod.rs index a8c1f9d9c1..8d3b763243 100644 --- a/common/client-libs/validator-client/src/nymd/mod.rs +++ b/common/client-libs/validator-client/src/nymd/mod.rs @@ -58,6 +58,8 @@ pub struct NymdClient { mixnet_contract_address: Option, vesting_contract_address: Option, erc20_bridge_contract_address: Option, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: Option, client_address: Option>, custom_gas_limits: HashMap, simulated_gas_multiplier: f32, @@ -78,6 +80,8 @@ impl NymdClient { mixnet_contract_address, vesting_contract_address, erc20_bridge_contract_address, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: None, client_address: None, custom_gas_limits: HashMap::default(), simulated_gas_multiplier: DEFAULT_SIMULATED_GAS_MULTIPLIER, @@ -112,6 +116,8 @@ impl NymdClient { mixnet_contract_address, vesting_contract_address, erc20_bridge_contract_address, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: None, client_address: Some(client_address), custom_gas_limits: HashMap::default(), simulated_gas_multiplier: DEFAULT_SIMULATED_GAS_MULTIPLIER, @@ -145,6 +151,8 @@ impl NymdClient { mixnet_contract_address, vesting_contract_address, erc20_bridge_contract_address, + #[cfg(feature = "dkg")] + coconut_dkg_contract_address: None, client_address: Some(client_address), custom_gas_limits: HashMap::default(), simulated_gas_multiplier: DEFAULT_SIMULATED_GAS_MULTIPLIER, @@ -171,6 +179,21 @@ impl NymdClient { .ok_or(NymdError::NoContractAddressAvailable) } + #[cfg(feature = "dkg")] + pub fn set_coconut_dkg_contract_address( + &mut self, + coconut_dkg_contract_address: Option, + ) { + self.coconut_dkg_contract_address = coconut_dkg_contract_address; + } + + #[cfg(feature = "dkg")] + pub fn coconut_dkg_contract_address(&self) -> Result<&AccountId, NymdError> { + self.coconut_dkg_contract_address + .as_ref() + .ok_or(NymdError::NoContractAddressAvailable) + } + pub fn set_simulated_gas_multiplier(&mut self, multiplier: f32) { self.simulated_gas_multiplier = multiplier; } diff --git a/common/client-libs/validator-client/src/nymd/traits/dkg_client.rs b/common/client-libs/validator-client/src/nymd/traits/dkg_client.rs new file mode 100644 index 0000000000..88b71b7d18 --- /dev/null +++ b/common/client-libs/validator-client/src/nymd/traits/dkg_client.rs @@ -0,0 +1,26 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::nymd::error::NymdError; +use crate::nymd::{NymdClient, SigningCosmWasmClient}; +use async_trait::async_trait; +use coconut_dkg_common::msg::QueryMsg as DkgQueryMsg; +use coconut_dkg_common::types::Epoch; + +#[async_trait] +pub trait DkgClient { + async fn get_current_dkg_epoch(&self) -> Result; +} + +#[async_trait] +impl DkgClient for NymdClient +where + C: SigningCosmWasmClient + Send + Sync, +{ + async fn get_current_dkg_epoch(&self) -> Result { + let request = DkgQueryMsg::GetCurrentEpoch {}; + self.client + .query_contract_smart(self.coconut_dkg_contract_address()?, &request) + .await + } +} diff --git a/common/client-libs/validator-client/src/nymd/traits/mod.rs b/common/client-libs/validator-client/src/nymd/traits/mod.rs index 20834c9f86..71b11a22a7 100644 --- a/common/client-libs/validator-client/src/nymd/traits/mod.rs +++ b/common/client-libs/validator-client/src/nymd/traits/mod.rs @@ -1,8 +1,12 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +#[cfg(feature = "dkg")] +mod dkg_client; mod vesting_query_client; mod vesting_signing_client; +#[cfg(feature = "dkg")] +pub use dkg_client::DkgClient; pub use vesting_query_client::VestingQueryClient; pub use vesting_signing_client::VestingSigningClient; diff --git a/validator-api/Cargo.toml b/validator-api/Cargo.toml index 38b28d2a75..b063a12bad 100644 --- a/validator-api/Cargo.toml +++ b/validator-api/Cargo.toml @@ -65,7 +65,7 @@ mixnet-contract-common = { path= "../common/cosmwasm-smart-contracts/mixnet-cont nymsphinx = { path="../common/nymsphinx" } topology = { path="../common/topology" } validator-api-requests = { path = "validator-api-requests" } -validator-client = { path="../common/client-libs/validator-client", features = ["nymd-client"] } +validator-client = { path="../common/client-libs/validator-client", features = ["nymd-client", "dkg"] } version-checker = { path="../common/version-checker" } coconut-interface = { path = "../common/coconut-interface", optional = true } credentials = { path = "../common/credentials", optional = true } diff --git a/validator-api/src/nymd_client.rs b/validator-api/src/nymd_client.rs index 8ece9ec6aa..6aaa5eb28b 100644 --- a/validator-api/src/nymd_client.rs +++ b/validator-api/src/nymd_client.rs @@ -5,6 +5,7 @@ use crate::config::Config; use crate::rewarded_set_updater::error::RewardingError; #[cfg(feature = "coconut")] use async_trait::async_trait; +use coconut_dkg_common::types::Epoch as DkgEpoch; use config::defaults::{DEFAULT_NETWORK, DEFAULT_VALIDATOR_API_PORT}; use mixnet_contract_common::Interval; use mixnet_contract_common::{ @@ -16,6 +17,8 @@ use std::sync::Arc; use std::time::Duration; use tokio::sync::RwLock; use tokio::time::sleep; +use validator_client::nymd::error::NymdError; +use validator_client::nymd::traits::DkgClient; use validator_client::nymd::{ hash::{Hash, SHA256_HASH_SIZE}, CosmWasmClient, CosmosCoin, Fee, QueryNymdClient, SigningCosmWasmClient, SigningNymdClient, @@ -404,6 +407,13 @@ impl Client { } } } + + async fn get_dkg_epoch(&self) -> Result + where + C: SigningCosmWasmClient + Send + Sync, + { + self.0.read().await.nymd.get_current_dkg_epoch().await + } } #[async_trait]