diff --git a/nym-wallet/src-tauri/src/error.rs b/nym-wallet/src-tauri/src/error.rs index cd97eb4c05..04c954e6cb 100644 --- a/nym-wallet/src-tauri/src/error.rs +++ b/nym-wallet/src-tauri/src/error.rs @@ -1,6 +1,7 @@ use nym_types::error::TypesError; use serde::{Serialize, Serializer}; use std::io; +use std::num::ParseIntError; use thiserror::Error; use validator_client::validator_api::error::ValidatorAPIError; use validator_client::{nymd::error::NymdError, ValidatorClientError}; @@ -101,6 +102,8 @@ pub enum BackendError { // WalletUnexpectedMultipleAccounts, #[error("Failed to derive address from mnemonic")] FailedToDeriveAddress, + #[error("{0}")] + ValueParseError(#[from] ParseIntError), } impl Serialize for BackendError { diff --git a/nym-wallet/src-tauri/src/main.rs b/nym-wallet/src-tauri/src/main.rs index 2b5a97e472..fcfcceac08 100644 --- a/nym-wallet/src-tauri/src/main.rs +++ b/nym-wallet/src-tauri/src/main.rs @@ -79,6 +79,7 @@ fn main() { utils::owns_gateway, utils::owns_mixnode, utils::get_env, + utils::get_old_and_incorrect_hardcoded_fee, validator_api::status::gateway_core_node_status, validator_api::status::mixnode_core_node_status, validator_api::status::mixnode_inclusion_probability, diff --git a/nym-wallet/src-tauri/src/utils.rs b/nym-wallet/src-tauri/src/utils.rs index 5204a858d4..212bc7ad6a 100644 --- a/nym-wallet/src-tauri/src/utils.rs +++ b/nym-wallet/src-tauri/src/utils.rs @@ -1,9 +1,12 @@ use crate::error::BackendError; use crate::nymd_client; use crate::state::State; +use nym_types::currency::MajorCurrencyAmount; use nym_wallet_types::app::AppEnv; +use serde::{Deserialize, Serialize}; use std::sync::Arc; use tokio::sync::RwLock; +use validator_client::nymd::{tx, Coin, CosmosCoin, Gas, GasPrice}; fn get_env_as_option(key: &str) -> Option { match ::std::env::var(key) { @@ -39,3 +42,115 @@ pub async fn owns_gateway( .await? .is_some()) } + +#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)] +pub enum Operation { + Upload, + Init, + Migrate, + ChangeAdmin, + Send, + + BondMixnode, + BondMixnodeOnBehalf, + UnbondMixnode, + UnbondMixnodeOnBehalf, + UpdateMixnodeConfig, + DelegateToMixnode, + DelegateToMixnodeOnBehalf, + UndelegateFromMixnode, + UndelegateFromMixnodeOnBehalf, + + BondGateway, + BondGatewayOnBehalf, + UnbondGateway, + UnbondGatewayOnBehalf, + + UpdateContractSettings, + + BeginMixnodeRewarding, + FinishMixnodeRewarding, + + TrackUnbondGateway, + TrackUnbondMixnode, + WithdrawVestedCoins, + TrackUndelegation, + CreatePeriodicVestingAccount, + + AdvanceCurrentInterval, + AdvanceCurrentEpoch, + WriteRewardedSet, + ClearRewardedSet, + UpdateMixnetAddress, + CheckpointMixnodes, + ReconcileDelegations, +} + +impl Operation { + fn default_gas_limit(&self) -> Gas { + match self { + Operation::Upload => 3_000_000u64.into(), + Operation::Init => 500_000u64.into(), + Operation::Migrate => 200_000u64.into(), + Operation::ChangeAdmin => 80_000u64.into(), + Operation::Send => 80_000u64.into(), + + Operation::BondMixnode => 175_000u64.into(), + Operation::BondMixnodeOnBehalf => 200_000u64.into(), + Operation::UnbondMixnode => 175_000u64.into(), + Operation::UnbondMixnodeOnBehalf => 175_000u64.into(), + Operation::UpdateMixnodeConfig => 175_000u64.into(), + Operation::DelegateToMixnode => 175_000u64.into(), + Operation::DelegateToMixnodeOnBehalf => 175_000u64.into(), + Operation::UndelegateFromMixnode => 175_000u64.into(), + Operation::UndelegateFromMixnodeOnBehalf => 175_000u64.into(), + + Operation::BondGateway => 175_000u64.into(), + Operation::BondGatewayOnBehalf => 200_000u64.into(), + Operation::UnbondGateway => 175_000u64.into(), + Operation::UnbondGatewayOnBehalf => 200_000u64.into(), + + Operation::UpdateContractSettings => 175_000u64.into(), + Operation::BeginMixnodeRewarding => 175_000u64.into(), + Operation::FinishMixnodeRewarding => 175_000u64.into(), + Operation::TrackUnbondGateway => 175_000u64.into(), + Operation::TrackUnbondMixnode => 175_000u64.into(), + Operation::WithdrawVestedCoins => 175_000u64.into(), + Operation::TrackUndelegation => 175_000u64.into(), + Operation::CreatePeriodicVestingAccount => 175_000u64.into(), + Operation::AdvanceCurrentInterval => 175_000u64.into(), + Operation::WriteRewardedSet => 175_000u64.into(), + Operation::ClearRewardedSet => 175_000u64.into(), + Operation::UpdateMixnetAddress => 80_000u64.into(), + Operation::CheckpointMixnodes => 175_000u64.into(), + Operation::ReconcileDelegations => 500_000u64.into(), + Operation::AdvanceCurrentEpoch => 175_000u64.into(), + } + } + + fn calculate_fee(gas_price: &GasPrice, gas_limit: Gas) -> CosmosCoin { + gas_price * gas_limit + } + + fn determine_custom_fee(gas_price: &GasPrice, gas_limit: Gas) -> tx::Fee { + let fee = Self::calculate_fee(gas_price, gas_limit); + tx::Fee::from_amount_and_gas(fee, gas_limit) + } + + fn default_fee(&self, gas_price: &GasPrice) -> tx::Fee { + Self::determine_custom_fee(gas_price, self.default_gas_limit()) + } +} + +#[tauri::command] +pub async fn get_old_and_incorrect_hardcoded_fee( + state: tauri::State<'_, Arc>>, + operation: Operation, +) -> Result { + let mut approximate_fee = operation.default_fee(nymd_client!(state).gas_price()); + // on all our chains it should only ever contain a single type of currency + assert_eq!(approximate_fee.amount.len(), 1); + let coin: Coin = approximate_fee.amount.pop().unwrap().into(); + log::info!("hardcoded fee for {:?} is {:?}", operation, coin); + Ok(coin.into()) +}