Feature/configurable dkg signup (#2809)

* Refactored consts to config structure

* Nym-cli generate init for dkg contract
This commit is contained in:
Bogdan-Ștefan Neacşu
2023-01-10 16:33:16 +02:00
committed by GitHub
parent 8d3aea969e
commit ad8fdbdddf
17 changed files with 269 additions and 74 deletions
@@ -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<String>,
#[clap(long)]
pub public_key_submission_time_secs: Option<u64>,
#[clap(long)]
pub dealing_exchange_time_secs: Option<u64>,
#[clap(long)]
pub verification_key_submission_time_secs: Option<u64>,
#[clap(long)]
pub verification_key_validation_time_secs: Option<u64>,
#[clap(long)]
pub verification_key_finalization_time_secs: Option<u64>,
#[clap(long)]
pub in_progress_time_secs: Option<u64>,
#[clap(long)]
pub mix_denom: Option<String>,
}
@@ -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,
};
@@ -1,7 +1,7 @@
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
// 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<TimeConfiguration>,
pub mix_denom: String,
}
@@ -1,8 +1,10 @@
// Copyright 2022 - Nym Technologies SA <contact@nymtech.net>
// 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<Self, Self::Err> {
let times = s
.split(',')
.map(|t| t.parse())
.collect::<Result<Vec<u64>, _>>()
.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),
}
}
+2
View File
@@ -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";
+7 -1
View File
@@ -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", &[]);
@@ -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(
@@ -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 =
@@ -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)
);
}
@@ -21,7 +21,11 @@ pub(crate) fn advance_epoch_state(deps: DepsMut<'_>, env: Env) -> Result<Respons
let current_epoch = CURRENT_EPOCH.update::<_, ContractError>(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(),
@@ -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) {
@@ -17,6 +17,7 @@ pub fn init_contract() -> OwnedDeps<MemoryStorage, MockApi, MockQuerier<Empty>>
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();
@@ -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();
@@ -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
+21
View File
@@ -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"
+3 -1
View File
@@ -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"
+2
View File
@@ -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"
+2
View File
@@ -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"