From 4f20085c0575e38bb13a37b5939c4d97803acf2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 1 Jun 2022 13:32:38 +0100 Subject: [PATCH] Introduced concept of denom details --- .../validator-client/src/nymd/mod.rs | 4 +- common/network-defaults/src/all.rs | 31 ++++-- common/network-defaults/src/lib.rs | 102 ++++++++++++------ common/network-defaults/src/mainnet.rs | 6 +- common/network-defaults/src/qa.rs | 6 +- common/network-defaults/src/sandbox.rs | 6 +- 6 files changed, 106 insertions(+), 49 deletions(-) diff --git a/common/client-libs/validator-client/src/nymd/mod.rs b/common/client-libs/validator-client/src/nymd/mod.rs index 536cc69d89..c777867cb6 100644 --- a/common/client-libs/validator-client/src/nymd/mod.rs +++ b/common/client-libs/validator-client/src/nymd/mod.rs @@ -100,7 +100,7 @@ impl NymdClient { where U: TryInto, { - let denom = network.denom(); + let denom = network.mix_denom().base; let client_address = signer .try_derive_accounts()? .into_iter() @@ -131,7 +131,7 @@ impl NymdClient { U: TryInto, { let prefix = network.bech32_prefix(); - let denom = network.denom(); + let denom = network.mix_denom().base; let wallet = DirectSecp256k1HdWallet::from_mnemonic(prefix, mnemonic)?; let client_address = wallet .try_derive_accounts()? diff --git a/common/network-defaults/src/all.rs b/common/network-defaults/src/all.rs index a7e4ea58d8..d858fffe48 100644 --- a/common/network-defaults/src/all.rs +++ b/common/network-defaults/src/all.rs @@ -5,7 +5,8 @@ use serde::{Deserialize, Serialize}; use std::{collections::HashMap, fmt, str::FromStr}; use crate::{ - DefaultNetworkDetails, ValidatorDetails, MAINNET_DEFAULTS, QA_DEFAULTS, SANDBOX_DEFAULTS, + DefaultNetworkDetails, DenomDetails, DenomDetailsOwned, ValidatorDetails, MAINNET_DEFAULTS, + QA_DEFAULTS, SANDBOX_DEFAULTS, }; use thiserror::Error; @@ -24,7 +25,7 @@ pub enum Network { } impl Network { - fn details(&self) -> &DefaultNetworkDetails<'_> { + fn details(&self) -> &DefaultNetworkDetails { match self { Self::QA => &QA_DEFAULTS, Self::SANDBOX => &SANDBOX_DEFAULTS, @@ -36,8 +37,12 @@ impl Network { self.details().bech32_prefix } - pub fn denom(&self) -> &str { - self.details().denom + pub fn mix_denom(&self) -> &DenomDetails { + &self.details().mix_denom + } + + pub fn stake_denom(&self) -> &DenomDetails { + &self.details().stake_denom } pub fn mixnet_contract_address(&self) -> &str { @@ -89,18 +94,20 @@ impl fmt::Display for Network { #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] pub struct NetworkDetails { bech32_prefix: String, - denom: String, + mix_denom: DenomDetailsOwned, + stake_denom: DenomDetailsOwned, mixnet_contract_address: String, vesting_contract_address: String, bandwidth_claim_contract_address: String, validators: Vec, } -impl From<&DefaultNetworkDetails<'_>> for NetworkDetails { - fn from(details: &DefaultNetworkDetails<'_>) -> Self { +impl From<&DefaultNetworkDetails> for NetworkDetails { + fn from(details: &DefaultNetworkDetails) -> Self { NetworkDetails { bech32_prefix: details.bech32_prefix.into(), - denom: details.denom.into(), + mix_denom: details.mix_denom.into(), + stake_denom: details.stake_denom.into(), mixnet_contract_address: details.mixnet_contract_address.into(), vesting_contract_address: details.vesting_contract_address.into(), bandwidth_claim_contract_address: details.bandwidth_claim_contract_address.into(), @@ -109,6 +116,12 @@ impl From<&DefaultNetworkDetails<'_>> for NetworkDetails { } } +impl NetworkDetails { + pub fn base_mix_denom(&self) -> &str { + &self.mix_denom.base + } +} + #[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)] pub struct SupportedNetworks { networks: HashMap, @@ -133,7 +146,7 @@ impl SupportedNetworks { pub fn denom(&self, network: Network) -> Option<&str> { self.networks .get(&network) - .map(|network_details| network_details.denom.as_str()) + .map(|network_details| network_details.base_mix_denom()) } pub fn mixnet_contract_address(&self, network: Network) -> Option<&str> { diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index a992d5bed6..10da7173f8 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -18,7 +18,7 @@ cfg_if::cfg_if! { if #[cfg(network = "mainnet")] { pub const DEFAULT_NETWORK: all::Network = all::Network::MAINNET; pub const DENOM: &str = mainnet::DENOM; - pub const STAKE_DENOM: &str = mainnet::STAKE_DENOM; + // pub const STAKE_DENOM: &str = mainnet::STAKE_DENOM; pub const ETH_CONTRACT_ADDRESS: [u8; 20] = mainnet::_ETH_CONTRACT_ADDRESS; pub const ETH_ERC20_CONTRACT_ADDRESS: [u8; 20] = mainnet::_ETH_ERC20_CONTRACT_ADDRESS; @@ -26,7 +26,7 @@ cfg_if::cfg_if! { } else if #[cfg(network = "qa")] { pub const DEFAULT_NETWORK: all::Network = all::Network::QA; pub const DENOM: &str = qa::DENOM; - pub const STAKE_DENOM: &str = qa::STAKE_DENOM; + // pub const STAKE_DENOM: &str = qa::STAKE_DENOM; pub const ETH_CONTRACT_ADDRESS: [u8; 20] = qa::_ETH_CONTRACT_ADDRESS; pub const ETH_ERC20_CONTRACT_ADDRESS: [u8; 20] = qa::_ETH_ERC20_CONTRACT_ADDRESS; @@ -34,7 +34,7 @@ cfg_if::cfg_if! { } else if #[cfg(network = "sandbox")] { pub const DEFAULT_NETWORK: all::Network = all::Network::SANDBOX; pub const DENOM: &str = sandbox::DENOM; - pub const STAKE_DENOM: &str = sandbox::STAKE_DENOM; + // pub const STAKE_DENOM: &str = sandbox::STAKE_DENOM; pub const ETH_CONTRACT_ADDRESS: [u8; 20] = sandbox::_ETH_CONTRACT_ADDRESS; pub const ETH_ERC20_CONTRACT_ADDRESS: [u8; 20] = sandbox::_ETH_ERC20_CONTRACT_ADDRESS; @@ -45,41 +45,43 @@ cfg_if::cfg_if! { // future. If we do this, and also get rid of the references we could potentially unify with // `NetworkDetails`. #[derive(Debug)] -pub struct DefaultNetworkDetails<'a> { - bech32_prefix: &'a str, - denom: &'a str, - mixnet_contract_address: &'a str, - vesting_contract_address: &'a str, - bandwidth_claim_contract_address: &'a str, - rewarding_validator_address: &'a str, +pub struct DefaultNetworkDetails { + bech32_prefix: &'static str, + mix_denom: DenomDetails, + stake_denom: DenomDetails, + mixnet_contract_address: &'static str, + vesting_contract_address: &'static str, + bandwidth_claim_contract_address: &'static str, + rewarding_validator_address: &'static str, validators: Vec, } -static MAINNET_DEFAULTS: Lazy> = - Lazy::new(|| DefaultNetworkDetails { - bech32_prefix: mainnet::BECH32_PREFIX, - denom: mainnet::DENOM, - mixnet_contract_address: mainnet::MIXNET_CONTRACT_ADDRESS, - vesting_contract_address: mainnet::VESTING_CONTRACT_ADDRESS, - bandwidth_claim_contract_address: mainnet::BANDWIDTH_CLAIM_CONTRACT_ADDRESS, - rewarding_validator_address: mainnet::REWARDING_VALIDATOR_ADDRESS, - validators: mainnet::validators(), - }); +static MAINNET_DEFAULTS: Lazy = Lazy::new(|| DefaultNetworkDetails { + bech32_prefix: mainnet::BECH32_PREFIX, + mix_denom: mainnet::MIX_DENOM, + stake_denom: mainnet::STAKE_DENOM, + mixnet_contract_address: mainnet::MIXNET_CONTRACT_ADDRESS, + vesting_contract_address: mainnet::VESTING_CONTRACT_ADDRESS, + bandwidth_claim_contract_address: mainnet::BANDWIDTH_CLAIM_CONTRACT_ADDRESS, + rewarding_validator_address: mainnet::REWARDING_VALIDATOR_ADDRESS, + validators: mainnet::validators(), +}); -static SANDBOX_DEFAULTS: Lazy> = - Lazy::new(|| DefaultNetworkDetails { - bech32_prefix: sandbox::BECH32_PREFIX, - denom: sandbox::DENOM, - mixnet_contract_address: sandbox::MIXNET_CONTRACT_ADDRESS, - vesting_contract_address: sandbox::VESTING_CONTRACT_ADDRESS, - bandwidth_claim_contract_address: sandbox::BANDWIDTH_CLAIM_CONTRACT_ADDRESS, - rewarding_validator_address: sandbox::REWARDING_VALIDATOR_ADDRESS, - validators: sandbox::validators(), - }); +static SANDBOX_DEFAULTS: Lazy = Lazy::new(|| DefaultNetworkDetails { + bech32_prefix: sandbox::BECH32_PREFIX, + mix_denom: sandbox::MIX_DENOM, + stake_denom: sandbox::STAKE_DENOM, + mixnet_contract_address: sandbox::MIXNET_CONTRACT_ADDRESS, + vesting_contract_address: sandbox::VESTING_CONTRACT_ADDRESS, + bandwidth_claim_contract_address: sandbox::BANDWIDTH_CLAIM_CONTRACT_ADDRESS, + rewarding_validator_address: sandbox::REWARDING_VALIDATOR_ADDRESS, + validators: sandbox::validators(), +}); -static QA_DEFAULTS: Lazy> = Lazy::new(|| DefaultNetworkDetails { +static QA_DEFAULTS: Lazy = Lazy::new(|| DefaultNetworkDetails { bech32_prefix: qa::BECH32_PREFIX, - denom: qa::DENOM, + mix_denom: qa::MIX_DENOM, + stake_denom: qa::STAKE_DENOM, mixnet_contract_address: qa::MIXNET_CONTRACT_ADDRESS, vesting_contract_address: qa::VESTING_CONTRACT_ADDRESS, bandwidth_claim_contract_address: qa::BANDWIDTH_CLAIM_CONTRACT_ADDRESS, @@ -87,6 +89,42 @@ static QA_DEFAULTS: Lazy> = Lazy::new(|| DefaultN validators: qa::validators(), }); +#[derive(Debug, Copy, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct DenomDetails { + pub base: &'static str, + pub display: &'static str, + // i.e. display_amount * 10^display_exponent = base_amount + pub display_exponent: u32, +} + +impl DenomDetails { + pub const fn new(base: &'static str, display: &'static str, display_exponent: u32) -> Self { + DenomDetails { + base, + display, + display_exponent, + } + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct DenomDetailsOwned { + pub base: String, + pub display: String, + // i.e. display_amount * 10^display_exponent = base_amount + pub display_exponent: u32, +} + +impl From for DenomDetailsOwned { + fn from(details: DenomDetails) -> Self { + DenomDetailsOwned { + base: details.base.to_owned(), + display: details.display.to_owned(), + display_exponent: details.display_exponent, + } + } +} + #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct ValidatorDetails { // it is assumed those values are always valid since they're being provided in our defaults file diff --git a/common/network-defaults/src/mainnet.rs b/common/network-defaults/src/mainnet.rs index 69f34c92a2..c760e0f8c6 100644 --- a/common/network-defaults/src/mainnet.rs +++ b/common/network-defaults/src/mainnet.rs @@ -1,11 +1,13 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::ValidatorDetails; +use crate::{DenomDetails, ValidatorDetails}; pub(crate) const BECH32_PREFIX: &str = "n"; pub const DENOM: &str = "unym"; -pub const STAKE_DENOM: &str = "unyx"; + +pub const MIX_DENOM: DenomDetails = DenomDetails::new("unym", "nym", 6); +pub const STAKE_DENOM: DenomDetails = DenomDetails::new("unyx", "nyx", 6); pub(crate) const MIXNET_CONTRACT_ADDRESS: &str = "n14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sjyvg3g"; diff --git a/common/network-defaults/src/qa.rs b/common/network-defaults/src/qa.rs index 38ada60537..9d6c92d43c 100644 --- a/common/network-defaults/src/qa.rs +++ b/common/network-defaults/src/qa.rs @@ -1,11 +1,13 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::ValidatorDetails; +use crate::{DenomDetails, ValidatorDetails}; pub(crate) const BECH32_PREFIX: &str = "n"; pub const DENOM: &str = "unym"; -pub const STAKE_DENOM: &str = "unyx"; + +pub const MIX_DENOM: DenomDetails = DenomDetails::new("unym", "nym", 6); +pub const STAKE_DENOM: DenomDetails = DenomDetails::new("unyx", "nyx", 6); pub(crate) const MIXNET_CONTRACT_ADDRESS: &str = "n1suhgf5svhu4usrurvxzlgn54ksxmn8gljarjtxqnapv8kjnp4nrsd3qaep"; diff --git a/common/network-defaults/src/sandbox.rs b/common/network-defaults/src/sandbox.rs index 3ec1f746a9..f916026e8f 100644 --- a/common/network-defaults/src/sandbox.rs +++ b/common/network-defaults/src/sandbox.rs @@ -1,11 +1,13 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::ValidatorDetails; +use crate::{DenomDetails, ValidatorDetails}; pub(crate) const BECH32_PREFIX: &str = "nymt"; pub const DENOM: &str = "unymt"; -pub const STAKE_DENOM: &str = "unyxt"; + +pub const MIX_DENOM: DenomDetails = DenomDetails::new("unymt", "nymt", 6); +pub const STAKE_DENOM: DenomDetails = DenomDetails::new("unyxt", "nyxt", 6); pub(crate) const MIXNET_CONTRACT_ADDRESS: &str = "nymt1ghd753shjuwexxywmgs4xz7x2q732vcnstz02j"; pub(crate) const VESTING_CONTRACT_ADDRESS: &str = "nymt14ejqjyq8um4p3xfqj74yld5waqljf88fn549lh";