diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/dkg_query_client.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/dkg_query_client.rs index ecb360b840..a6729bbcf3 100644 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/dkg_query_client.rs +++ b/common/client-libs/validator-client/src/nyxd/contract_traits/dkg_query_client.rs @@ -11,7 +11,8 @@ use nym_coconut_dkg_common::{ dealer::{DealerDetailsResponse, DealingResponse, PagedDealerResponse, PagedDealingsResponse}, msg::QueryMsg as DkgQueryMsg, types::{ - DealerDetails, DealingIndex, Epoch, EpochId, InitialReplacementData, PartialContractDealing, + DealerDetails, DealingIndex, Epoch, EpochId, InitialReplacementData, + PartialContractDealing, State, }, verification_key::{ContractVKShare, PagedVKSharesResponse}, }; @@ -24,6 +25,11 @@ pub trait DkgQueryClient { where for<'a> T: Deserialize<'a>; + async fn get_state(&self) -> Result { + let request = DkgQueryMsg::GetState {}; + self.query_dkg_contract(request).await + } + async fn get_current_epoch(&self) -> Result { let request = DkgQueryMsg::GetCurrentEpochState {}; self.query_dkg_contract(request).await @@ -174,6 +180,7 @@ mod tests { msg: DkgQueryMsg, ) { match msg { + DkgQueryMsg::GetState {} => client.get_state().ignore(), DkgQueryMsg::GetCurrentEpochState {} => client.get_current_epoch().ignore(), DkgQueryMsg::GetCurrentEpochThreshold {} => { client.get_current_epoch_threshold().ignore() diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/Cargo.toml b/common/cosmwasm-smart-contracts/coconut-dkg/Cargo.toml index b5872e102f..1779bd32fb 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/Cargo.toml +++ b/common/cosmwasm-smart-contracts/coconut-dkg/Cargo.toml @@ -10,6 +10,7 @@ license.workspace = true cosmwasm-schema = { workspace = true } cosmwasm-std = { workspace = true } cw-utils = { workspace = true } +cw4 = { workspace = true } contracts-common = { path = "../contracts-common", package = "nym-contracts-common" } nym-multisig-contract-common = { path = "../multisig-contract" } diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs index 39624313fc..afe1d23b2f 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs @@ -11,7 +11,7 @@ use cosmwasm_std::Addr; #[cfg(feature = "schema")] use crate::{ dealer::{DealerDetailsResponse, DealingResponse, PagedDealerResponse, PagedDealingsResponse}, - types::{Epoch, InitialReplacementData}, + types::{Epoch, InitialReplacementData, State}, verification_key::PagedVKSharesResponse, }; #[cfg(feature = "schema")] @@ -60,6 +60,9 @@ pub enum ExecuteMsg { #[cw_serde] #[cfg_attr(feature = "schema", derive(QueryResponses))] pub enum QueryMsg { + #[cfg_attr(feature = "schema", returns(State))] + GetState {}, + #[cfg_attr(feature = "schema", returns(Epoch))] GetCurrentEpochState {}, diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs index 99470ed445..df69b155a4 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs @@ -8,6 +8,7 @@ use std::str::FromStr; pub use crate::dealer::{DealerDetails, PagedDealerResponse}; pub use contracts_common::dealings::ContractSafeBytes; pub use cosmwasm_std::{Addr, Coin, Timestamp}; +pub use cw4::Cw4Contract; pub type EncodedBTEPublicKeyWithProof = String; pub type EncodedBTEPublicKeyWithProofRef<'a> = &'a str; @@ -17,6 +18,7 @@ pub type DealingIndex = u32; pub type ContractDealing = ContractSafeBytes; // 2 public attributes, 2 private attributes, 1 fixed for coconut credential +#[deprecated] pub const TOTAL_DEALINGS: usize = 2 + 2 + 1; #[cw_serde] @@ -25,6 +27,12 @@ pub struct PartialContractDealing { pub data: ContractDealing, } +impl PartialContractDealing { + pub fn new(index: DealingIndex, data: ContractDealing) -> Self { + PartialContractDealing { index, data } + } +} + impl From<(DealingIndex, ContractDealing)> for PartialContractDealing { fn from(value: (DealingIndex, ContractDealing)) -> Self { PartialContractDealing { @@ -90,6 +98,16 @@ impl Default for TimeConfiguration { } } +#[cw_serde] +pub struct State { + pub mix_denom: String, + pub multisig_addr: Addr, + pub group_addr: Cw4Contract, + + /// Specifies the number of elements in the derived keys + pub key_size: u32, +} + #[cw_serde] #[derive(Copy, Default)] pub struct Epoch { diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index 44d001026e..8307dbe37f 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -1236,6 +1236,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-utils", + "cw4", "nym-contracts-common", "nym-multisig-contract-common", ] diff --git a/contracts/coconut-dkg/src/contract.rs b/contracts/coconut-dkg/src/contract.rs index e1221bfc33..cd1f8579db 100644 --- a/contracts/coconut-dkg/src/contract.rs +++ b/contracts/coconut-dkg/src/contract.rs @@ -13,7 +13,8 @@ use crate::epoch_state::queries::{ use crate::epoch_state::storage::CURRENT_EPOCH; use crate::epoch_state::transactions::{advance_epoch_state, try_surpassed_threshold}; use crate::error::ContractError; -use crate::state::{State, MULTISIG, STATE}; +use crate::state::queries::query_state; +use crate::state::storage::{MULTISIG, STATE}; use crate::verification_key_shares::queries::query_vk_shares_paged; use crate::verification_key_shares::transactions::try_commit_verification_key_share; use crate::verification_key_shares::transactions::try_verify_verification_key_share; @@ -22,7 +23,7 @@ use cosmwasm_std::{ }; use cw4::Cw4Contract; use nym_coconut_dkg_common::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; -use nym_coconut_dkg_common::types::{Epoch, EpochState}; +use nym_coconut_dkg_common::types::{Epoch, EpochState, State}; /// Instantiate the contract. /// @@ -97,6 +98,7 @@ pub fn execute( #[entry_point] pub fn query(deps: Deps<'_>, _env: Env, msg: QueryMsg) -> Result { let response = match msg { + QueryMsg::GetState {} => to_binary(&query_state(deps.storage)?)?, QueryMsg::GetCurrentEpochState {} => to_binary(&query_current_epoch(deps.storage)?)?, QueryMsg::GetCurrentEpochThreshold {} => { to_binary(&query_current_epoch_threshold(deps.storage)?)? diff --git a/contracts/coconut-dkg/src/dealers/transactions.rs b/contracts/coconut-dkg/src/dealers/transactions.rs index 290bbd2349..58c64b9cf5 100644 --- a/contracts/coconut-dkg/src/dealers/transactions.rs +++ b/contracts/coconut-dkg/src/dealers/transactions.rs @@ -5,7 +5,7 @@ use crate::dealers::storage as dealers_storage; use crate::epoch_state::storage::INITIAL_REPLACEMENT_DATA; use crate::epoch_state::utils::check_epoch_state; use crate::error::ContractError; -use crate::state::STATE; +use crate::state::storage::STATE; use cosmwasm_std::{Addr, DepsMut, MessageInfo, Response}; use nym_coconut_dkg_common::types::{DealerDetails, EncodedBTEPublicKeyWithProof, EpochState}; diff --git a/contracts/coconut-dkg/src/dealings/transactions.rs b/contracts/coconut-dkg/src/dealings/transactions.rs index 0c806ab2d6..0723af0ce5 100644 --- a/contracts/coconut-dkg/src/dealings/transactions.rs +++ b/contracts/coconut-dkg/src/dealings/transactions.rs @@ -6,7 +6,7 @@ use crate::dealings::storage::StoredDealing; use crate::epoch_state::storage::{CURRENT_EPOCH, INITIAL_REPLACEMENT_DATA}; use crate::epoch_state::utils::check_epoch_state; use crate::error::ContractError; -use crate::state::STATE; +use crate::state::storage::STATE; use cosmwasm_std::{DepsMut, MessageInfo, Response}; use nym_coconut_dkg_common::types::{EpochState, PartialContractDealing}; diff --git a/contracts/coconut-dkg/src/epoch_state/transactions.rs b/contracts/coconut-dkg/src/epoch_state/transactions.rs index 46861104aa..dfdf8a2965 100644 --- a/contracts/coconut-dkg/src/epoch_state/transactions.rs +++ b/contracts/coconut-dkg/src/epoch_state/transactions.rs @@ -5,7 +5,7 @@ use crate::dealers::storage::{current_dealers, past_dealers}; use crate::epoch_state::storage::{CURRENT_EPOCH, INITIAL_REPLACEMENT_DATA, THRESHOLD}; use crate::epoch_state::utils::check_epoch_state; use crate::error::ContractError; -use crate::state::STATE; +use crate::state::storage::STATE; use crate::verification_key_shares::storage::verified_dealers; use cosmwasm_std::{Addr, Deps, DepsMut, Env, Order, Response, Storage}; use nym_coconut_dkg_common::types::{Epoch, EpochState, InitialReplacementData}; diff --git a/contracts/coconut-dkg/src/state/mod.rs b/contracts/coconut-dkg/src/state/mod.rs index bb829e0eb0..fffc20fcf1 100644 --- a/contracts/coconut-dkg/src/state/mod.rs +++ b/contracts/coconut-dkg/src/state/mod.rs @@ -1,22 +1,5 @@ -// Copyright 2022 - Nym Technologies SA +// Copyright 2022-2024 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use cosmwasm_std::Addr; -use cw4::Cw4Contract; -use cw_controllers::Admin; -use cw_storage_plus::Item; -use serde::{Deserialize, Serialize}; - -// unique items -pub const STATE: Item = Item::new("state"); -pub const MULTISIG: Admin = Admin::new("multisig"); - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct State { - pub mix_denom: String, - pub multisig_addr: Addr, - pub group_addr: Cw4Contract, - - /// Specifies the number of elements in the derived keys - pub key_size: u32, -} +pub mod queries; +pub mod storage; diff --git a/contracts/coconut-dkg/src/state/queries.rs b/contracts/coconut-dkg/src/state/queries.rs new file mode 100644 index 0000000000..b5364dcc85 --- /dev/null +++ b/contracts/coconut-dkg/src/state/queries.rs @@ -0,0 +1,10 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::state::storage::STATE; +use cosmwasm_std::{StdResult, Storage}; +use nym_coconut_dkg_common::types::State; + +pub(crate) fn query_state(storage: &dyn Storage) -> StdResult { + STATE.load(storage) +} diff --git a/contracts/coconut-dkg/src/state/storage.rs b/contracts/coconut-dkg/src/state/storage.rs new file mode 100644 index 0000000000..202b753809 --- /dev/null +++ b/contracts/coconut-dkg/src/state/storage.rs @@ -0,0 +1,10 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use cw_controllers::Admin; +use cw_storage_plus::Item; +use nym_coconut_dkg_common::types::State; + +// unique items +pub const STATE: Item = Item::new("state"); +pub const MULTISIG: Admin = Admin::new("multisig"); diff --git a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs index d532c5579a..ce5f9e908d 100644 --- a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs +++ b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs @@ -6,7 +6,7 @@ use crate::dealers::storage as dealers_storage; use crate::epoch_state::storage::CURRENT_EPOCH; use crate::epoch_state::utils::check_epoch_state; use crate::error::ContractError; -use crate::state::{MULTISIG, STATE}; +use crate::state::storage::{MULTISIG, STATE}; use crate::verification_key_shares::storage::vk_shares; use cosmwasm_std::{Addr, DepsMut, Env, MessageInfo, Response}; use nym_coconut_dkg_common::types::EpochState; diff --git a/contracts/ephemera/src/peers/transactions.rs b/contracts/ephemera/src/peers/transactions.rs index 6aa587bcb2..06df277206 100644 --- a/contracts/ephemera/src/peers/transactions.rs +++ b/contracts/ephemera/src/peers/transactions.rs @@ -3,7 +3,7 @@ use crate::error::ContractError; use crate::peers::storage::PEERS; -use crate::state::STATE; +use crate::state::storage::STATE; use cosmwasm_std::{DepsMut, MessageInfo, Response}; use nym_ephemera_common::types::JsonPeerInfo;