diff --git a/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs index f3f1b2ffe5..7fe4cd60f6 100644 --- a/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs +++ b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs @@ -3,8 +3,10 @@ use clap::Parser; use log::{debug, info}; +use std::str::FromStr; use coconut_dkg_common::msg::InstantiateMsg; +use coconut_dkg_common::types::TimeConfiguration; #[derive(Debug, Parser)] pub struct Args { @@ -14,6 +16,24 @@ pub struct Args { #[clap(long)] pub multisig_addr: Option, + #[clap(long)] + pub public_key_submission_time_secs: Option, + + #[clap(long)] + pub dealing_exchange_time_secs: Option, + + #[clap(long)] + pub verification_key_submission_time_secs: Option, + + #[clap(long)] + pub verification_key_validation_time_secs: Option, + + #[clap(long)] + pub verification_key_finalization_time_secs: Option, + + #[clap(long)] + pub in_progress_time_secs: Option, + #[clap(long)] pub mix_denom: Option, } @@ -32,9 +52,42 @@ pub async fn generate(args: Args) { std::env::var(network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") }); + let mut time_configuration = + if let Ok(config) = std::env::var(network_defaults::var_names::DKG_TIME_CONFIGURATION) { + TimeConfiguration::from_str(&config).expect("Invalid env variable value") + } else { + TimeConfiguration::default() + }; + if let Some(public_key_submission_time_secs) = args.public_key_submission_time_secs { + time_configuration.public_key_submission_time_secs = public_key_submission_time_secs; + } + if let Some(dealing_exchange_time_secs) = args.dealing_exchange_time_secs { + time_configuration.dealing_exchange_time_secs = dealing_exchange_time_secs; + } + if let Some(verification_key_submission_time_secs) = args.verification_key_submission_time_secs + { + time_configuration.verification_key_submission_time_secs = + verification_key_submission_time_secs; + } + if let Some(verification_key_validation_time_secs) = args.verification_key_validation_time_secs + { + time_configuration.verification_key_validation_time_secs = + verification_key_validation_time_secs; + } + if let Some(verification_key_finalization_time_secs) = + args.verification_key_finalization_time_secs + { + time_configuration.verification_key_finalization_time_secs = + verification_key_finalization_time_secs; + } + if let Some(in_progress_time_secs) = args.in_progress_time_secs { + time_configuration.in_progress_time_secs = in_progress_time_secs; + } + let instantiate_msg = InstantiateMsg { group_addr: args.group_addr, multisig_addr, + time_configuration: Some(time_configuration), mix_denom, }; diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs index 7a85486eb0..57582313b0 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::types::{ContractSafeBytes, EncodedBTEPublicKeyWithProof}; +use crate::types::{ContractSafeBytes, EncodedBTEPublicKeyWithProof, TimeConfiguration}; use crate::verification_key::VerificationKeyShare; use cosmwasm_std::Addr; use schemars::JsonSchema; @@ -11,6 +11,7 @@ use serde::{Deserialize, Serialize}; pub struct InstantiateMsg { pub group_addr: String, pub multisig_addr: String, + pub time_configuration: Option, pub mix_denom: String, } diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs index 4de725cebf..ad51688b6f 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs @@ -1,8 +1,10 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt::{Display, Formatter}; +use std::str::FromStr; pub use crate::dealer::{DealerDetails, PagedDealerResponse}; pub use contracts_common::dealings::ContractSafeBytes; @@ -12,37 +14,91 @@ pub type EncodedBTEPublicKeyWithProof = String; pub type EncodedBTEPublicKeyWithProofRef<'a> = &'a str; pub type NodeIndex = u64; -// The time sign-up is open for dealers to join (2 minutes) -pub const PUBLIC_KEY_SUBMISSION_TIME_SECS: u64 = 60 * 2; -pub const DEALING_EXCHANGE_TIME_SECS: u64 = 60 * 5; -pub const VERIFICATION_KEY_SUBMISSION_TIME_SECS: u64 = 60 * 5; -pub const VERIFICATION_KEY_VALIDATION_TIME_SECS: u64 = 60; -pub const VERIFICATION_KEY_FINALIZATION_TIME_SECS: u64 = 60; -// The time an epoch lasts (2 weeks) -pub const IN_PROGRESS_TIME_SECS: u64 = 60 * 60 * 24 * 14; - // 2 public attributes, 2 private attributes, 1 fixed for coconut credential pub const TOTAL_DEALINGS: usize = 2 + 2 + 1; +#[derive( + Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd, JsonSchema, +)] +pub struct TimeConfiguration { + // The time sign-up is open for dealers to join + pub public_key_submission_time_secs: u64, + pub dealing_exchange_time_secs: u64, + pub verification_key_submission_time_secs: u64, + pub verification_key_validation_time_secs: u64, + pub verification_key_finalization_time_secs: u64, + // The time an epoch lasts + pub in_progress_time_secs: u64, +} + +impl FromStr for TimeConfiguration { + type Err = String; + + fn from_str(s: &str) -> Result { + let times = s + .split(',') + .map(|t| t.parse()) + .collect::, _>>() + .map_err(|_| String::from("Could not parse string"))?; + if times.len() != 6 { + Err(String::from("Not enough time specified")) + } else { + Ok(TimeConfiguration { + public_key_submission_time_secs: times[0], + dealing_exchange_time_secs: times[1], + verification_key_submission_time_secs: times[2], + verification_key_validation_time_secs: times[3], + verification_key_finalization_time_secs: times[4], + in_progress_time_secs: times[5], + }) + } + } +} + +impl Default for TimeConfiguration { + fn default() -> Self { + Self { + public_key_submission_time_secs: 60 * 10, // 10 minutes + dealing_exchange_time_secs: 60 * 5, // 5 minutes + verification_key_submission_time_secs: 60 * 5, // 5 minutes + verification_key_validation_time_secs: 60, // 1 minute + verification_key_finalization_time_secs: 60, // 1 minute + in_progress_time_secs: 60 * 60 * 24 * 14, // 2 weeks + } + } +} + #[derive(Serialize, Deserialize, Default, Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)] #[serde(rename_all = "snake_case")] pub struct Epoch { pub state: EpochState, + pub time_configuration: TimeConfiguration, pub finish_timestamp: Timestamp, } impl Epoch { - pub fn new(state: EpochState, current_timestamp: Timestamp) -> Self { + pub fn new( + state: EpochState, + time_configuration: TimeConfiguration, + current_timestamp: Timestamp, + ) -> Self { let duration = match state { - EpochState::PublicKeySubmission => PUBLIC_KEY_SUBMISSION_TIME_SECS, - EpochState::DealingExchange => DEALING_EXCHANGE_TIME_SECS, - EpochState::VerificationKeySubmission => VERIFICATION_KEY_SUBMISSION_TIME_SECS, - EpochState::VerificationKeyValidation => VERIFICATION_KEY_VALIDATION_TIME_SECS, - EpochState::VerificationKeyFinalization => VERIFICATION_KEY_FINALIZATION_TIME_SECS, - EpochState::InProgress => IN_PROGRESS_TIME_SECS, + EpochState::PublicKeySubmission => time_configuration.public_key_submission_time_secs, + EpochState::DealingExchange => time_configuration.dealing_exchange_time_secs, + EpochState::VerificationKeySubmission => { + time_configuration.verification_key_submission_time_secs + } + EpochState::VerificationKeyValidation => { + time_configuration.verification_key_validation_time_secs + } + EpochState::VerificationKeyFinalization => { + time_configuration.verification_key_finalization_time_secs + } + EpochState::InProgress => time_configuration.in_progress_time_secs, }; Epoch { state, + time_configuration, finish_timestamp: current_timestamp.plus_seconds(duration), } } diff --git a/common/network-defaults/src/var_names.rs b/common/network-defaults/src/var_names.rs index c6e4a450a2..f1b5c16055 100644 --- a/common/network-defaults/src/var_names.rs +++ b/common/network-defaults/src/var_names.rs @@ -21,6 +21,8 @@ pub const STATISTICS_SERVICE_DOMAIN_ADDRESS: &str = "STATISTICS_SERVICE_DOMAIN_A pub const NYXD: &str = "NYXD"; pub const NYM_API: &str = "NYM_API"; +pub const DKG_TIME_CONFIGURATION: &str = "DKG_TIME_CONFIGURATION"; + // we don't want to explicitly tag those with `#[deprecated]` because then our CI would be red and sad : ( pub const DEPRECATED_NYMD_VALIDATOR: &str = "NYMD_VALIDATOR"; pub const DEPRECATED_API_VALIDATOR: &str = "API_VALIDATOR"; diff --git a/contracts/coconut-dkg/src/contract.rs b/contracts/coconut-dkg/src/contract.rs index 650cf312f0..101964304e 100644 --- a/contracts/coconut-dkg/src/contract.rs +++ b/contracts/coconut-dkg/src/contract.rs @@ -52,7 +52,11 @@ pub fn instantiate( CURRENT_EPOCH.save( deps.storage, - &Epoch::new(EpochState::default(), env.block.time), + &Epoch::new( + EpochState::default(), + msg.time_configuration.unwrap_or_default(), + env.block.time, + ), )?; Ok(Response::default()) @@ -163,6 +167,7 @@ mod tests { let msg = InstantiateMsg { group_addr: group_contract_addr.to_string(), multisig_addr: MULTISIG_CONTRACT.to_string(), + time_configuration: None, mix_denom: TEST_MIX_DENOM.to_string(), }; app.instantiate_contract( @@ -197,6 +202,7 @@ mod tests { let msg = InstantiateMsg { group_addr: "group_addr".to_string(), multisig_addr: "multisig_addr".to_string(), + time_configuration: None, mix_denom: "nym".to_string(), }; let info = mock_info("creator", &[]); diff --git a/contracts/coconut-dkg/src/dealers/transactions.rs b/contracts/coconut-dkg/src/dealers/transactions.rs index 6566581221..44cc19d9b5 100644 --- a/contracts/coconut-dkg/src/dealers/transactions.rs +++ b/contracts/coconut-dkg/src/dealers/transactions.rs @@ -71,7 +71,7 @@ pub(crate) mod tests { use super::*; use crate::epoch_state::transactions::advance_epoch_state; use crate::support::tests::helpers; - use coconut_dkg_common::types::PUBLIC_KEY_SUBMISSION_TIME_SECS; + use coconut_dkg_common::types::TimeConfiguration; use cosmwasm_std::testing::{mock_env, mock_info}; #[test] @@ -83,7 +83,10 @@ pub(crate) mod tests { let bte_key_with_proof = String::from("bte_key_with_proof"); let announce_address = String::from("localhost:8000"); - env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = try_add_dealer( diff --git a/contracts/coconut-dkg/src/dealings/transactions.rs b/contracts/coconut-dkg/src/dealings/transactions.rs index fe2e5544cb..9cca53cb02 100644 --- a/contracts/coconut-dkg/src/dealings/transactions.rs +++ b/contracts/coconut-dkg/src/dealings/transactions.rs @@ -43,7 +43,7 @@ pub(crate) mod tests { use crate::support::tests::fixtures::dealing_bytes_fixture; use crate::support::tests::helpers; use coconut_dkg_common::dealer::DealerDetails; - use coconut_dkg_common::types::PUBLIC_KEY_SUBMISSION_TIME_SECS; + use coconut_dkg_common::types::TimeConfiguration; use cosmwasm_std::testing::{mock_env, mock_info}; use cosmwasm_std::Addr; @@ -65,7 +65,10 @@ pub(crate) mod tests { } ); - env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = diff --git a/contracts/coconut-dkg/src/epoch_state/queries.rs b/contracts/coconut-dkg/src/epoch_state/queries.rs index 3a68e0117c..386e9000c9 100644 --- a/contracts/coconut-dkg/src/epoch_state/queries.rs +++ b/contracts/coconut-dkg/src/epoch_state/queries.rs @@ -22,7 +22,7 @@ pub(crate) fn query_current_epoch_threshold( pub(crate) mod test { use super::*; use crate::support::tests::helpers::init_contract; - use coconut_dkg_common::types::{EpochState, PUBLIC_KEY_SUBMISSION_TIME_SECS}; + use coconut_dkg_common::types::{EpochState, TimeConfiguration}; use cosmwasm_std::testing::mock_env; #[test] @@ -35,7 +35,7 @@ pub(crate) mod test { mock_env() .block .time - .plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS) + .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs) ); } diff --git a/contracts/coconut-dkg/src/epoch_state/transactions.rs b/contracts/coconut-dkg/src/epoch_state/transactions.rs index e2e75a1678..f63327dd9e 100644 --- a/contracts/coconut-dkg/src/epoch_state/transactions.rs +++ b/contracts/coconut-dkg/src/epoch_state/transactions.rs @@ -21,7 +21,11 @@ pub(crate) fn advance_epoch_state(deps: DepsMut<'_>, env: Env) -> Result(deps.storage, |mut epoch| { // TODO: When defaulting to the first state, some action will probably need to be taken on the // rest of the contract, as we're starting with a new set of signers - epoch = Epoch::new(epoch.state.next().unwrap_or_default(), env.block.time); + epoch = Epoch::new( + epoch.state.next().unwrap_or_default(), + epoch.time_configuration, + env.block.time, + ); Ok(epoch) })?; if current_epoch.state == EpochState::DealingExchange { @@ -40,11 +44,7 @@ pub(crate) mod tests { use super::*; use crate::error::ContractError::EarlyEpochStateAdvancement; use crate::support::tests::helpers::init_contract; - use coconut_dkg_common::types::{ - DealerDetails, EpochState, DEALING_EXCHANGE_TIME_SECS, IN_PROGRESS_TIME_SECS, - PUBLIC_KEY_SUBMISSION_TIME_SECS, VERIFICATION_KEY_FINALIZATION_TIME_SECS, - VERIFICATION_KEY_SUBMISSION_TIME_SECS, VERIFICATION_KEY_VALIDATION_TIME_SECS, - }; + use coconut_dkg_common::types::{DealerDetails, EpochState, TimeConfiguration}; use cosmwasm_std::testing::mock_env; use cosmwasm_std::Addr; @@ -57,13 +57,15 @@ pub(crate) mod tests { assert_eq!(epoch.state, EpochState::PublicKeySubmission); assert_eq!( epoch.finish_timestamp, - env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS) + env.block + .time + .plus_seconds(epoch.time_configuration.public_key_submission_time_secs) ); env.block.time = env .block .time - .plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS - 1); + .plus_seconds(epoch.time_configuration.public_key_submission_time_secs - 1); assert_eq!( advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), EarlyEpochStateAdvancement(1) @@ -75,10 +77,15 @@ pub(crate) mod tests { assert_eq!(epoch.state, EpochState::DealingExchange); assert_eq!( epoch.finish_timestamp, - env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS) + env.block + .time + .plus_seconds(epoch.time_configuration.dealing_exchange_time_secs) ); - env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS - 2); + env.block.time = env + .block + .time + .plus_seconds(epoch.time_configuration.dealing_exchange_time_secs - 2); assert_eq!( advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), EarlyEpochStateAdvancement(2) @@ -90,15 +97,19 @@ pub(crate) mod tests { assert_eq!(epoch.state, EpochState::VerificationKeySubmission); assert_eq!( epoch.finish_timestamp, - env.block - .time - .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS) + env.block.time.plus_seconds( + epoch + .time_configuration + .verification_key_submission_time_secs + ) ); - env.block.time = env - .block - .time - .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS - 2); + env.block.time = env.block.time.plus_seconds( + epoch + .time_configuration + .verification_key_submission_time_secs + - 2, + ); assert_eq!( advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), EarlyEpochStateAdvancement(2) @@ -110,15 +121,19 @@ pub(crate) mod tests { assert_eq!(epoch.state, EpochState::VerificationKeyValidation); assert_eq!( epoch.finish_timestamp, - env.block - .time - .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS) + env.block.time.plus_seconds( + epoch + .time_configuration + .verification_key_validation_time_secs + ) ); - env.block.time = env - .block - .time - .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS - 3); + env.block.time = env.block.time.plus_seconds( + epoch + .time_configuration + .verification_key_validation_time_secs + - 3, + ); assert_eq!( advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), EarlyEpochStateAdvancement(3) @@ -130,15 +145,17 @@ pub(crate) mod tests { assert_eq!(epoch.state, EpochState::VerificationKeyFinalization); assert_eq!( epoch.finish_timestamp, - env.block - .time - .plus_seconds(VERIFICATION_KEY_FINALIZATION_TIME_SECS) + env.block.time.plus_seconds( + epoch + .time_configuration + .verification_key_finalization_time_secs + ) ); env.block.time = env .block .time - .plus_seconds(VERIFICATION_KEY_FINALIZATION_TIME_SECS - 1); + .plus_seconds(TimeConfiguration::default().verification_key_finalization_time_secs - 1); assert_eq!( advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), EarlyEpochStateAdvancement(1) @@ -150,10 +167,15 @@ pub(crate) mod tests { assert_eq!(epoch.state, EpochState::InProgress); assert_eq!( epoch.finish_timestamp, - env.block.time.plus_seconds(IN_PROGRESS_TIME_SECS) + env.block + .time + .plus_seconds(epoch.time_configuration.in_progress_time_secs) ); - env.block.time = env.block.time.plus_seconds(IN_PROGRESS_TIME_SECS - 100); + env.block.time = env + .block + .time + .plus_seconds(epoch.time_configuration.in_progress_time_secs - 100); assert_eq!( advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), EarlyEpochStateAdvancement(100) @@ -171,7 +193,9 @@ pub(crate) mod tests { assert_eq!(epoch.state, EpochState::PublicKeySubmission); assert_eq!( epoch.finish_timestamp, - env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS) + env.block + .time + .plus_seconds(epoch.time_configuration.public_key_submission_time_secs) ); } @@ -198,7 +222,10 @@ pub(crate) mod tests { .unwrap(); } - env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env).unwrap(); assert_eq!( THRESHOLD.may_load(deps.as_mut().storage).unwrap().unwrap(), diff --git a/contracts/coconut-dkg/src/epoch_state/utils.rs b/contracts/coconut-dkg/src/epoch_state/utils.rs index 280436ee2e..65cca74797 100644 --- a/contracts/coconut-dkg/src/epoch_state/utils.rs +++ b/contracts/coconut-dkg/src/epoch_state/utils.rs @@ -25,7 +25,7 @@ pub(crate) fn check_epoch_state( pub(crate) mod test { use super::*; use crate::support::tests::helpers::init_contract; - use coconut_dkg_common::types::Epoch; + use coconut_dkg_common::types::{Epoch, TimeConfiguration}; use cosmwasm_std::testing::mock_env; #[test] @@ -37,7 +37,7 @@ pub(crate) mod test { CURRENT_EPOCH .save( deps.as_mut().storage, - &Epoch::new(fixed_state, env.block.time), + &Epoch::new(fixed_state, TimeConfiguration::default(), env.block.time), ) .unwrap(); for against_state in EpochState::default().all_until(EpochState::InProgress) { diff --git a/contracts/coconut-dkg/src/support/tests/helpers.rs b/contracts/coconut-dkg/src/support/tests/helpers.rs index b59ee40bcf..43b3819b08 100644 --- a/contracts/coconut-dkg/src/support/tests/helpers.rs +++ b/contracts/coconut-dkg/src/support/tests/helpers.rs @@ -17,6 +17,7 @@ pub fn init_contract() -> OwnedDeps> let msg = InstantiateMsg { group_addr: String::from(GROUP_CONTRACT), multisig_addr: String::from(MULTISIG_CONTRACT), + time_configuration: None, mix_denom: TEST_MIX_DENOM.to_string(), }; let env = mock_env(); diff --git a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs index 69df1bad7b..c2e8ae377a 100644 --- a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs +++ b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs @@ -77,10 +77,7 @@ mod tests { use crate::support::tests::helpers; use crate::support::tests::helpers::MULTISIG_CONTRACT; use coconut_dkg_common::dealer::DealerDetails; - use coconut_dkg_common::types::{ - EpochState, DEALING_EXCHANGE_TIME_SECS, PUBLIC_KEY_SUBMISSION_TIME_SECS, - VERIFICATION_KEY_SUBMISSION_TIME_SECS, VERIFICATION_KEY_VALIDATION_TIME_SECS, - }; + use coconut_dkg_common::types::{EpochState, TimeConfiguration}; use cosmwasm_std::testing::{mock_env, mock_info}; use cw_controllers::AdminError; @@ -105,9 +102,15 @@ mod tests { expected_state: EpochState::VerificationKeySubmission.to_string() } ); - env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); - env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().dealing_exchange_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); let ret = try_commit_verification_key_share( deps.as_mut(), @@ -165,19 +168,25 @@ mod tests { } ); - env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); - advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); - env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); env.block.time = env .block .time - .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS); + .plus_seconds(TimeConfiguration::default().dealing_exchange_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); env.block.time = env .block .time - .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS); + .plus_seconds(TimeConfiguration::default().verification_key_submission_time_secs); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().verification_key_validation_time_secs); advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = @@ -203,9 +212,15 @@ mod tests { let share = "share".to_string(); let multisig_info = mock_info(MULTISIG_CONTRACT, &[]); - env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); - env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS); + env.block.time = env + .block + .time + .plus_seconds(TimeConfiguration::default().dealing_exchange_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); let dealer_details = DealerDetails { @@ -223,12 +238,12 @@ mod tests { env.block.time = env .block .time - .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS); + .plus_seconds(TimeConfiguration::default().verification_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); env.block.time = env .block .time - .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS); + .plus_seconds(TimeConfiguration::default().verification_key_validation_time_secs); advance_epoch_state(deps.as_mut(), env).unwrap(); try_verify_verification_key_share(deps.as_mut(), multisig_info, owner.clone()).unwrap(); diff --git a/contracts/coconut-test/src/submit_vk_creates_proposal.rs b/contracts/coconut-test/src/submit_vk_creates_proposal.rs index 1122115b6d..62f6af15f0 100644 --- a/contracts/coconut-test/src/submit_vk_creates_proposal.rs +++ b/contracts/coconut-test/src/submit_vk_creates_proposal.rs @@ -71,6 +71,7 @@ fn dkg_proposal() { let msg = DkgInstantiateMsg { group_addr: group_contract_addr.to_string(), multisig_addr: multisig_contract_addr.to_string(), + time_configuration: None, mix_denom: TEST_COIN_DENOM.to_string(), }; let coconut_dkg_contract_addr = app diff --git a/envs/local.env b/envs/local.env new file mode 100644 index 0000000000..3cc90e5ddf --- /dev/null +++ b/envs/local.env @@ -0,0 +1,21 @@ +CONFIGURED=true + +RUST_LOG=info +RUST_BACKTRACE=1 + +BECH32_PREFIX=n +MIX_DENOM=unym +MIX_DENOM_DISPLAY=nym +STAKE_DENOM=unyx +STAKE_DENOM_DISPLAY=nyx +DENOMS_EXPONENT=6 +MIXNET_CONTRACT_ADDRESS=n1xsml6tm6pnx8nsuz3a54cznh55g6nuwu9ug9t92ucjkq5ewp5w9syxeqsv +VESTING_CONTRACT_ADDRESS=n1xr3rq8yvd7qplsw5yx90ftsr2zdhg4e9z60h5duusgxpv72hud3sjkxkav +BANDWIDTH_CLAIM_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 +COCONUT_BANDWIDTH_CONTRACT_ADDRESS=n1lp5zex6685kd22agzskhqsylpnssxnweyuvsz4edr4p4ta92qf3q3dhmsx +MULTISIG_CONTRACT_ADDRESS=n1rw8fw2mpcpzzq3jpa4e52ufawnmj5a4u68p35umvgskewuw0nlzsaa5w4m +COCONUT_DKG_CONTRACT_ADDRESS=n15f5e6ffz33khfzaadaug9axjt5r38xfe84v9jvlhfs0y7mv9sxvs2xt0u6 +REWARDING_VALIDATOR_ADDRESS=n1tfzd4qz3a45u8p4mr5zmzv66457uwjgcl05jdq +STATISTICS_SERVICE_DOMAIN_ADDRESS="http://0.0.0.0" +NYMD_VALIDATOR="http://127.0.0.1:26657" +API_VALIDATOR="http://127.0.0.1:8000" diff --git a/envs/mainnet.env b/envs/mainnet.env index 3a8ec4b17c..a7c2db6070 100644 --- a/envs/mainnet.env +++ b/envs/mainnet.env @@ -17,5 +17,7 @@ MULTISIG_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 COCONUT_DKG_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 REWARDING_VALIDATOR_ADDRESS=n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy STATISTICS_SERVICE_DOMAIN_ADDRESS="https://mainnet-stats.nymte.ch:8090" -nyxd_VALIDATOR="https://rpc.nymtech.net"; +NYXD_VALIDATOR="https://rpc.nymtech.net"; API_VALIDATOR="https://validator.nymtech.net/api/" + +DKG_TIME_CONFIGURATION="259200,300,300,60,60,1209600" diff --git a/envs/qa-qwerty.env b/envs/qa-qwerty.env index 6bb6895d72..768203c353 100644 --- a/envs/qa-qwerty.env +++ b/envs/qa-qwerty.env @@ -19,3 +19,5 @@ REWARDING_VALIDATOR_ADDRESS=n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy STATISTICS_SERVICE_DOMAIN_ADDRESS="https://mainnet-stats.nymte.ch:8090" NYXD_VALIDATOR="https://qwerty-validator.qa.nymte.ch/" API_VALIDATOR="https://qwerty-validator-api.qa.nymte.ch/api" + +DKG_TIME_CONFIGURATION="600,300,300,60,60,1209600" diff --git a/envs/qa.env b/envs/qa.env index 999850f798..4d8eb56506 100644 --- a/envs/qa.env +++ b/envs/qa.env @@ -19,3 +19,5 @@ REWARDING_VALIDATOR_ADDRESS=n1tfzd4qz3a45u8p4mr5zmzv66457uwjgcl05jdq STATISTICS_SERVICE_DOMAIN_ADDRESS="http://0.0.0.0" NYXD_VALIDATOR="https://qa-validator.nymtech.net" API_VALIDATOR="https://qa-validator-api.nymtech.net/api" + +DKG_TIME_CONFIGURATION="600,300,300,60,60,1209600" \ No newline at end of file