From 8a9c50833f3356de26f578789a1cead0882a3398 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 01:00:28 +0100 Subject: [PATCH 01/35] save dev state --- mm2src/coins/utxo_signer/src/lib.rs | 5 +- mm2src/coins/utxo_signer/src/with_trezor.rs | 18 +-- mm2src/common/common.rs | 2 +- mm2src/crypto/src/crypto_ctx.rs | 8 +- mm2src/crypto/src/global_hd_ctx.rs | 12 +- mm2src/crypto/src/hw_client.rs | 20 ++-- mm2src/crypto/src/hw_ctx.rs | 16 ++- mm2src/crypto/src/hw_rpc_task.rs | 9 +- mm2src/crypto/src/mnemonic.rs | 9 +- mm2src/crypto/src/privkey.rs | 2 +- mm2src/crypto/src/slip21.rs | 4 +- mm2src/crypto/src/xpub.rs | 4 +- mm2src/mm2_err_handle/src/lib.rs | 2 +- mm2src/mm2_err_handle/src/map_mm_error.rs | 25 ++++ mm2src/mm2_err_handle/src/map_to_mm.rs | 2 +- mm2src/mm2_gui_storage/src/rpc_commands.rs | 126 +++++++++++++++----- mm2src/mm2_net/src/grpc_web.rs | 10 +- mm2src/mm2_net/src/native_http.rs | 2 +- mm2src/mm2_net/src/transport.rs | 2 +- mm2src/trezor/src/response.rs | 17 +-- mm2src/trezor/src/transport/usb.rs | 16 ++- 21 files changed, 212 insertions(+), 99 deletions(-) diff --git a/mm2src/coins/utxo_signer/src/lib.rs b/mm2src/coins/utxo_signer/src/lib.rs index 8032e9acf7..3f9ee23095 100644 --- a/mm2src/coins/utxo_signer/src/lib.rs +++ b/mm2src/coins/utxo_signer/src/lib.rs @@ -138,7 +138,7 @@ pub trait UtxoSignerOps { let signer = with_trezor::TrezorTxSigner { trezor, tx_provider: self.tx_provider(), - trezor_coin: self.trezor_coin()?, + trezor_coin: self.trezor_coin().map_mm_err()?, params, fork_id: self.fork_id(), branch_id: self.branch_id(), @@ -147,7 +147,8 @@ pub trait UtxoSignerOps { }, SignPolicy::WithKeyPair(key_pair) => { let signed = - with_key_pair::sign_tx(params.unsigned_tx, key_pair, params.signature_version, self.fork_id())?; + with_key_pair::sign_tx(params.unsigned_tx, key_pair, params.signature_version, self.fork_id()) + .map_mm_err()?; Ok(signed) }, } diff --git a/mm2src/coins/utxo_signer/src/with_trezor.rs b/mm2src/coins/utxo_signer/src/with_trezor.rs index 8da3b972bb..75d882fa49 100644 --- a/mm2src/coins/utxo_signer/src/with_trezor.rs +++ b/mm2src/coins/utxo_signer/src/with_trezor.rs @@ -23,12 +23,12 @@ pub struct TrezorTxSigner<'a, TxP> { impl<'a, TxP: TxProvider + Send + Sync> TrezorTxSigner<'a, TxP> { pub async fn sign_tx(mut self) -> UtxoSignTxResult { - let trezor_unsigned_tx = self.get_trezor_unsigned_tx().await?; + let trezor_unsigned_tx = self.get_trezor_unsigned_tx().await.map_mm_err()?; let TxSignResult { signatures, serialized_tx, - } = self.trezor.sign_utxo_tx(trezor_unsigned_tx).await?; + } = self.trezor.sign_utxo_tx(trezor_unsigned_tx).await.map_mm_err()?; debug!("Transaction signed by Trezor: {}", hex::encode(serialized_tx)); if signatures.len() != self.params.inputs_count() { return MmError::err(UtxoSignTxError::InvalidSignaturesNumber { @@ -56,7 +56,10 @@ impl<'a, TxP: TxProvider + Send + Sync> TrezorTxSigner<'a, TxP> { async fn get_trezor_unsigned_tx(&self) -> UtxoSignTxResult { let mut inputs = Vec::with_capacity(self.params.unsigned_tx.inputs.len()); for (unsigned_input, input_info) in self.params.inputs() { - let unsigned_input = self.get_trezor_unsigned_input(unsigned_input, input_info).await?; + let unsigned_input = self + .get_trezor_unsigned_input(unsigned_input, input_info) + .await + .map_mm_err()?; inputs.push(unsigned_input); } @@ -99,7 +102,7 @@ impl<'a, TxP: TxProvider + Send + Sync> TrezorTxSigner<'a, TxP> { input_info: &SpendingInputInfo, ) -> UtxoSignTxResult { let prev_tx_hash_json = H256Json::from(unsigned_input.previous_output.hash.reversed()); - let prev_tx = self.get_trezor_prev_tx(&prev_tx_hash_json).await?; + let prev_tx = self.get_trezor_prev_tx(&prev_tx_hash_json).await.map_mm_err()?; let (address_derivation_path, input_script_type) = match input_info { SpendingInputInfo::P2PKH { @@ -130,9 +133,10 @@ impl<'a, TxP: TxProvider + Send + Sync> TrezorTxSigner<'a, TxP> { } async fn get_trezor_prev_tx(&self, prev_tx_hash: &H256Json) -> UtxoSignTxResult { - let prev_verbose = self.tx_provider.get_rpc_transaction(prev_tx_hash).await?; - let prev_utxo: UtxoTx = - deserialize(prev_verbose.hex.as_slice()).map_to_mm(|e| UtxoSignTxError::Transport(e.to_string()))?; + let prev_verbose = self.tx_provider.get_rpc_transaction(prev_tx_hash).await.map_mm_err()?; + let prev_utxo: UtxoTx = deserialize(prev_verbose.hex.as_slice()) + .map_to_mm(|e| UtxoSignTxError::Transport(e.to_string())) + .map_mm_err()?; let prev_tx_inputs = prev_utxo .inputs diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index 078f601f66..4dfe2c0577 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -14,7 +14,7 @@ #![feature(integer_atomics, panic_info_message)] #![feature(async_closure)] #![feature(hash_raw_entry)] -#![feature(drain_filter)] +// #![feature(drain_filter)] #[macro_use] extern crate arrayref; #[macro_use] extern crate gstuff; diff --git a/mm2src/crypto/src/crypto_ctx.rs b/mm2src/crypto/src/crypto_ctx.rs index ffc83603a6..50c3bc5cf1 100644 --- a/mm2src/crypto/src/crypto_ctx.rs +++ b/mm2src/crypto/src/crypto_ctx.rs @@ -302,7 +302,7 @@ impl CryptoCtx { let (secp256k1_key_pair, key_pair_policy) = policy_builder.build(passphrase)?; let rmd160 = secp256k1_key_pair.public().address_hash(); - let shared_db_id = shared_db_id_from_seed(passphrase)?; + let shared_db_id = shared_db_id_from_seed(passphrase).map_mm_err()?; let crypto_ctx = CryptoCtx { secp256k1_key_pair, @@ -339,11 +339,11 @@ impl KeyPairPolicyBuilder { fn build(self, passphrase: &str) -> CryptoInitResult<(KeyPair, KeyPairPolicy)> { match self { KeyPairPolicyBuilder::Iguana => { - let secp256k1_key_pair = key_pair_from_seed(passphrase)?; + let secp256k1_key_pair = key_pair_from_seed(passphrase).map_mm_err()?; Ok((secp256k1_key_pair, KeyPairPolicy::Iguana)) }, KeyPairPolicyBuilder::GlobalHDAccount => { - let (mm2_internal_key_pair, global_hd_ctx) = GlobalHDAccountCtx::new(passphrase)?; + let (mm2_internal_key_pair, global_hd_ctx) = GlobalHDAccountCtx::new(passphrase).map_mm_err()?; let key_pair_policy = KeyPairPolicy::GlobalHDAccount(global_hd_ctx.into_arc()); Ok((mm2_internal_key_pair, key_pair_policy)) }, @@ -361,7 +361,7 @@ async fn init_check_hw_ctx_with_trezor( processor: Arc>, expected_pubkey: Option, ) -> MmResult<(HwDeviceInfo, HardwareWalletArc), HwCtxInitError> { - let (hw_device_info, hw_ctx) = HardwareWalletCtx::init_with_trezor(processor).await?; + let (hw_device_info, hw_ctx) = HardwareWalletCtx::init_with_trezor(processor).await.map_mm_err()?; let expected_pubkey = match expected_pubkey { Some(expected) => expected, None => return Ok((hw_device_info, hw_ctx)), diff --git a/mm2src/crypto/src/global_hd_ctx.rs b/mm2src/crypto/src/global_hd_ctx.rs index ad7c2bc63b..a2a3bb159a 100644 --- a/mm2src/crypto/src/global_hd_ctx.rs +++ b/mm2src/crypto/src/global_hd_ctx.rs @@ -29,9 +29,10 @@ pub struct GlobalHDAccountCtx { impl GlobalHDAccountCtx { pub fn new(passphrase: &str) -> CryptoInitResult<(Mm2InternalKeyPair, GlobalHDAccountCtx)> { - let bip39_seed = bip39_seed_from_passphrase(passphrase)?; - let bip39_secp_priv_key: ExtendedPrivateKey = - ExtendedPrivateKey::new(bip39_seed.0).map_to_mm(|e| PrivKeyError::InvalidPrivKey(e.to_string()))?; + let bip39_seed = bip39_seed_from_passphrase(passphrase).map_mm_err()?; + let bip39_secp_priv_key: ExtendedPrivateKey = ExtendedPrivateKey::new(bip39_seed.0) + .map_to_mm(|e| PrivKeyError::InvalidPrivKey(e.to_string())) + .map_mm_err()?; let derivation_path = mm2_internal_der_path(); @@ -39,10 +40,11 @@ impl GlobalHDAccountCtx { for child in derivation_path { internal_priv_key = internal_priv_key .derive_child(child) - .map_to_mm(|e| CryptoInitError::InvalidPassphrase(PrivKeyError::InvalidPrivKey(e.to_string())))?; + .map_to_mm(|e| CryptoInitError::InvalidPassphrase(PrivKeyError::InvalidPrivKey(e.to_string()))) + .map_mm_err()?; } - let mm2_internal_key_pair = key_pair_from_secret(internal_priv_key.private_key().as_ref())?; + let mm2_internal_key_pair = key_pair_from_secret(internal_priv_key.private_key().as_ref()).map_mm_err()?; let global_hd_ctx = GlobalHDAccountCtx { bip39_seed, diff --git a/mm2src/crypto/src/hw_client.rs b/mm2src/crypto/src/hw_client.rs index 4cb78b05b5..3ff696a1d4 100644 --- a/mm2src/crypto/src/hw_client.rs +++ b/mm2src/crypto/src/hw_client.rs @@ -95,7 +95,7 @@ impl HwClient { pub(crate) async fn trezor( processor: Arc>, ) -> MmResult> { - let timeout = processor.on_connect().await?; + let timeout = processor.on_connect().await.map_mm_err()?; let fut = async move { // `find_devices` in a browser leads to a popup that asks the user which device he wants to connect. @@ -109,16 +109,16 @@ impl HwClient { return MmError::err(HwProcessingError::HwError(HwError::NoTrezorDeviceAvailable)); } let device = devices.available.remove(0); - Ok(device.connect().await?) + Ok(device.connect().await.map_mm_err()?) }; match fut.await { Ok(transport) => { - processor.on_connected().await?; + processor.on_connected().await.map_mm_err()?; Ok(TrezorClient::from_transport(transport)) }, Err(e) => { - processor.on_connection_failed().await?; + processor.on_connection_failed().await.map_mm_err()?; Err(e) }, } @@ -136,7 +136,7 @@ impl HwClient { where C: ConnectableDeviceWrapper + 'static, { - let mut devices = C::find_devices().await?; + let mut devices = C::find_devices().await.map_mm_err()?; if devices.is_empty() { return Ok(None); } @@ -144,7 +144,7 @@ impl HwClient { return MmError::err(HwError::CannotChooseDevice { count: devices.len() }); } let device = devices.remove(0); - let transport = device.connect().await?; + let transport = device.connect().await.map_mm_err()?; let trezor = TrezorClient::from_transport(transport); Ok(Some(trezor)) } @@ -165,19 +165,19 @@ impl HwClient { } }; - let timeout = processor.on_connect().await?; + let timeout = processor.on_connect().await.map_mm_err()?; let result: Result, TimeoutError> = fut.boxed().timeout(timeout).await; match result { Ok(Ok(trezor)) => { - processor.on_connected().await?; + processor.on_connected().await.map_mm_err()?; Ok(trezor) }, Ok(Err(hw_err)) => { - processor.on_connection_failed().await?; + processor.on_connection_failed().await.map_mm_err()?; Err(hw_err.map(HwProcessingError::from)) }, Err(_timed_out) => { - processor.on_connection_failed().await?; + processor.on_connection_failed().await.map_mm_err()?; MmError::err(HwProcessingError::HwError(HwError::ConnectionTimedOut { timeout })) }, } diff --git a/mm2src/crypto/src/hw_ctx.rs b/mm2src/crypto/src/hw_ctx.rs index 8d2c84a8f9..cda40a1159 100644 --- a/mm2src/crypto/src/hw_ctx.rs +++ b/mm2src/crypto/src/hw_ctx.rs @@ -55,8 +55,10 @@ impl HardwareWalletCtx { let (hw_device_info, hw_internal_pubkey) = { let processor = processor.as_base_shared(); - let (device_info, mut session) = trezor.init_new_session(processor).await?; - let hw_internal_pubkey = HardwareWalletCtx::trezor_mm_internal_pubkey(&mut session).await?; + let (device_info, mut session) = trezor.init_new_session(processor).await.map_mm_err()?; + let hw_internal_pubkey = HardwareWalletCtx::trezor_mm_internal_pubkey(&mut session) + .await + .map_mm_err()?; (HwDeviceInfo::Trezor(device_info), hw_internal_pubkey) }; @@ -131,10 +133,14 @@ impl HardwareWalletCtx { SHOW_PUBKEY_ON_DISPLAY, IGNORE_XPUB_MAGIC, ) - .await? + .await + .map_mm_err()? .process(processor) - .await?; - let extended_pubkey = Secp256k1ExtendedPublicKey::from_str(&mm2_internal_xpub).map_to_mm(HwError::from)?; + .await + .map_mm_err()?; + let extended_pubkey = Secp256k1ExtendedPublicKey::from_str(&mm2_internal_xpub) + .map_to_mm(HwError::from) + .map_mm_err()?; Ok(H264::from(extended_pubkey.public_key().serialize())) } diff --git a/mm2src/crypto/src/hw_rpc_task.rs b/mm2src/crypto/src/hw_rpc_task.rs index 96b0c73c03..140bcfba81 100644 --- a/mm2src/crypto/src/hw_rpc_task.rs +++ b/mm2src/crypto/src/hw_rpc_task.rs @@ -125,20 +125,23 @@ where { async fn on_connect(&self) -> MmResult> { self.request_processor - .update_in_progress_status(self.on_connect.clone())?; + .update_in_progress_status(self.on_connect.clone()) + .map_mm_err()?; Ok(self.connect_timeout) } async fn on_connected(&self) -> MmResult<(), HwProcessingError> { Ok(self .request_processor - .update_in_progress_status(self.on_connected.clone())?) + .update_in_progress_status(self.on_connected.clone()) + .map_mm_err()?) } async fn on_connection_failed(&self) -> MmResult<(), HwProcessingError> { Ok(self .request_processor - .update_in_progress_status(self.on_connection_failed.clone())?) + .update_in_progress_status(self.on_connection_failed.clone()) + .map_mm_err()?) } fn as_base_shared(&self) -> Arc> { diff --git a/mm2src/crypto/src/mnemonic.rs b/mm2src/crypto/src/mnemonic.rs index 9d89b25fce..793609bef0 100644 --- a/mm2src/crypto/src/mnemonic.rs +++ b/mm2src/crypto/src/mnemonic.rs @@ -80,7 +80,7 @@ pub fn encrypt_mnemonic(mnemonic: &str, password: &str) -> MmResult MmResult MmResult { // Re-create the keys from the password and salts - let (key_aes, key_hmac) = derive_keys_for_mnemonic(password, &encrypted_data.key_derivation_details)?; + let (key_aes, key_hmac) = + derive_keys_for_mnemonic(password, &encrypted_data.key_derivation_details).map_mm_err()?; // Decrypt the ciphertext let decrypted_data = decrypt_data(encrypted_data, &key_aes, &key_hmac).mm_err(|e| MnemonicError::DecryptionError(e.to_string()))?; // Convert decrypted data back to a string - let mnemonic_str = String::from_utf8(decrypted_data).map_to_mm(|e| MnemonicError::DecodeError(e.to_string()))?; + let mnemonic_str = String::from_utf8(decrypted_data) + .map_to_mm(|e| MnemonicError::DecodeError(e.to_string())) + .map_mm_err()?; Ok(mnemonic_str) } diff --git a/mm2src/crypto/src/privkey.rs b/mm2src/crypto/src/privkey.rs index 4d296d72a8..506d52b11a 100644 --- a/mm2src/crypto/src/privkey.rs +++ b/mm2src/crypto/src/privkey.rs @@ -94,7 +94,7 @@ pub fn secp_privkey_from_hash(mut hash: Secp256k1Secret) -> Secp256k1Secret { } pub fn key_pair_from_seed(seed: &str) -> PrivKeyResult { - let private = private_from_seed(seed)?; + let private = private_from_seed(seed).map_mm_err()?; if !private.compressed { return MmError::err(PrivKeyError::ExpectedCompressedKeys); } diff --git a/mm2src/crypto/src/slip21.rs b/mm2src/crypto/src/slip21.rs index bc2bb976d5..131202f4c9 100644 --- a/mm2src/crypto/src/slip21.rs +++ b/mm2src/crypto/src/slip21.rs @@ -40,7 +40,7 @@ pub fn encrypt_with_slip21( // Derive encryption and authentication keys using SLIP-0021 let (key_aes, key_hmac) = - derive_encryption_authentication_keys(master_secret, &encryption_path, &authentication_path)?; + derive_encryption_authentication_keys(master_secret, &encryption_path, &authentication_path).map_mm_err()?; let key_derivation_details = KeyDerivationDetails::SLIP0021 { encryption_path, @@ -71,7 +71,7 @@ pub fn decrypt_with_slip21(encrypted_data: &EncryptedData, master_secret: &[u8; // Derive encryption and authentication keys using SLIP-0021 let (key_aes, key_hmac) = - derive_encryption_authentication_keys(master_secret, encryption_path, authentication_path)?; + derive_encryption_authentication_keys(master_secret, encryption_path, authentication_path).map_mm_err()?; decrypt_data(encrypted_data, &key_aes, &key_hmac).mm_err(|e| SLIP21Error::DecryptionFailed(e.to_string())) } diff --git a/mm2src/crypto/src/xpub.rs b/mm2src/crypto/src/xpub.rs index 3d97168975..aba5adccf9 100644 --- a/mm2src/crypto/src/xpub.rs +++ b/mm2src/crypto/src/xpub.rs @@ -31,7 +31,7 @@ impl XPubConverter { /// The input string must start with the standard `xpub` prefix and contain a valid checksum. pub fn is_standard_xpub(xpub: &str) -> MmResult<(), XpubError> { let bytes = bs58::decode(&xpub).with_check(None).into_vec()?; - if has_xpub_prefix(&bytes)? { + if has_xpub_prefix(&bytes).map_mm_err()? { Ok(()) } else { MmError::err(XpubError::UnknownPrefix) @@ -43,7 +43,7 @@ impl XPubConverter { pub fn replace_magic_prefix(xpub: XPub) -> MmResult { let mut bytes = bs58::decode(&xpub).with_check(None).into_vec()?; - if has_xpub_prefix(&bytes)? { + if has_xpub_prefix(&bytes).map_mm_err()? { return Ok(xpub); } diff --git a/mm2src/mm2_err_handle/src/lib.rs b/mm2src/mm2_err_handle/src/lib.rs index 93b5030af3..3df7ed9279 100644 --- a/mm2src/mm2_err_handle/src/lib.rs +++ b/mm2src/mm2_err_handle/src/lib.rs @@ -15,7 +15,7 @@ pub mod split_mm; pub mod prelude { pub use crate::common_errors::{WithInternal, WithTimeout}; pub use crate::discard_mm_trace::DiscardMmTrace; - pub use crate::map_mm_error::MapMmError; + pub use crate::map_mm_error::{MapMmError, MmResultExt}; pub use crate::map_to_mm::MapToMmResult; pub use crate::map_to_mm_fut::MapToMmFutureExt; pub use crate::mm_error::{MmError, MmResult, NotEqual, NotMmError, SerMmErrorType}; diff --git a/mm2src/mm2_err_handle/src/map_mm_error.rs b/mm2src/mm2_err_handle/src/map_mm_error.rs index 3f1e3718ec..0f3c597ace 100644 --- a/mm2src/mm2_err_handle/src/map_mm_error.rs +++ b/mm2src/mm2_err_handle/src/map_mm_error.rs @@ -37,3 +37,28 @@ where } } } + +pub trait MmResultExt { + /// Convert `Result>` into `Result>` + /// by applying `E2::from` to the inner `E1`. + #[track_caller] + fn map_mm_err(self) -> Result> + where + E2: From + NotMmError; +} + +impl MmResultExt for Result> +where + E1: NotMmError, +{ + #[track_caller] + fn map_mm_err(self) -> Result> + where + E2: From + NotMmError, + { + match self { + Ok(v) => Ok(v), + Err(err_e1) => Err(err_e1.map(E2::from)), + } + } +} diff --git a/mm2src/mm2_err_handle/src/map_to_mm.rs b/mm2src/mm2_err_handle/src/map_to_mm.rs index 568df94ab1..9e88551631 100644 --- a/mm2src/mm2_err_handle/src/map_to_mm.rs +++ b/mm2src/mm2_err_handle/src/map_to_mm.rs @@ -35,7 +35,7 @@ where { match self { Ok(x) => Ok(x), - Err(e1) => MmError::err(f(e1)), + Err(e1) => Err(MmError::new(f(e1))), } } } diff --git a/mm2src/mm2_gui_storage/src/rpc_commands.rs b/mm2src/mm2_gui_storage/src/rpc_commands.rs index 2c3363443c..87f658a836 100644 --- a/mm2src/mm2_gui_storage/src/rpc_commands.rs +++ b/mm2src/mm2_gui_storage/src/rpc_commands.rs @@ -172,20 +172,30 @@ pub struct SetBalanceRequest { /// /// This RPC affects the storage **only**. It doesn't affect MarketMaker. pub async fn enable_account(ctx: MmArc, req: EnableAccountRequest) -> MmResult { - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; let account_id = match req.policy { EnableAccountPolicy::Existing(account_id) => account_id, EnableAccountPolicy::New(new_account) => { let account_id = new_account.account_id; account_ctx .storage() - .await? + .await + .map_mm_err()? .upload_account(AccountInfo::from(new_account)) - .await?; + .await + .map_mm_err()?; account_id }, }; - account_ctx.storage().await?.enable_account(account_id).await?; + account_ctx + .storage() + .await + .map_mm_err()? + .enable_account(account_id) + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } @@ -197,12 +207,16 @@ pub async fn enable_account(ctx: MmArc, req: EnableAccountRequest) -> MmResult MmResult { validate_new_account(&req.account)?; - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; account_ctx .storage() - .await? + .await + .map_mm_err()? .upload_account(AccountInfo::from(req.account)) - .await?; + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } @@ -214,7 +228,13 @@ pub async fn add_account(ctx: MmArc, req: AddAccountRequest) -> MmResult MmResult { let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; - account_ctx.storage().await?.delete_account(req.account_id).await?; + account_ctx + .storage() + .await + .map_mm_err()? + .delete_account(req.account_id) + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } @@ -228,12 +248,16 @@ pub async fn get_accounts( ctx: MmArc, _req: GetAccountsRequest, ) -> MmResult, AccountRpcError> { - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; let accounts = account_ctx .storage() - .await? + .await + .map_mm_err()? .load_accounts_with_enabled_flag() - .await? + .await + .map_mm_err()? // The given `BTreeMap` accounts are sorted by `AccountId`. .into_values() .collect(); @@ -249,12 +273,16 @@ pub async fn get_account_coins( ctx: MmArc, req: GetAccountCoinsRequest, ) -> MmResult { - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; let coins = account_ctx .storage() - .await? + .await + .map_mm_err()? .load_account_coins(req.account_id.clone()) - .await?; + .await + .map_mm_err()?; Ok(GetAccountCoinsResponse { account_id: req.account_id, coins, @@ -271,16 +299,32 @@ pub async fn get_enabled_account( ctx: MmArc, _req: GetEnabledAccountRequest, ) -> MmResult { - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; - let account = account_ctx.storage().await?.load_enabled_account_with_coins().await?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; + let account = account_ctx + .storage() + .await + .map_mm_err()? + .load_enabled_account_with_coins() + .await + .map_mm_err()?; Ok(account) } /// Sets the account name. pub async fn set_account_name(ctx: MmArc, req: SetAccountNameRequest) -> MmResult { - validate_account_name(&req.name)?; - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; - account_ctx.storage().await?.set_name(req.account_id, req.name).await?; + validate_account_name(&req.name).map_mm_err()?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; + account_ctx + .storage() + .await + .map_mm_err()? + .set_name(req.account_id, req.name) + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } @@ -290,12 +334,16 @@ pub async fn set_account_description( req: SetAccountDescriptionRequest, ) -> MmResult { validate_account_desc(&req.description)?; - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; account_ctx .storage() - .await? + .await + .map_mm_err()? .set_description(req.account_id, req.description) - .await?; + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } @@ -305,12 +353,16 @@ pub async fn set_account_description( /// /// This RPC affects the storage **only**. It doesn't affect MarketMaker. pub async fn set_account_balance(ctx: MmArc, req: SetBalanceRequest) -> MmResult { - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; account_ctx .storage() - .await? + .await + .map_mm_err()? .set_balance(req.account_id, req.balance_usd) - .await?; + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } @@ -321,12 +373,16 @@ pub async fn set_account_balance(ctx: MmArc, req: SetBalanceRequest) -> MmResult /// This RPC affects the storage **only**. It doesn't affect MarketMaker. pub async fn activate_coins(ctx: MmArc, req: CoinRequest) -> MmResult { validate_tickers(&req.tickers)?; - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; account_ctx .storage() - .await? + .await + .map_mm_err()? .activate_coins(req.account_id, req.tickers) - .await?; + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } @@ -336,18 +392,22 @@ pub async fn activate_coins(ctx: MmArc, req: CoinRequest) -> MmResult MmResult { - let account_ctx = AccountContext::from_ctx(&ctx).map_to_mm(AccountRpcError::Internal)?; + let account_ctx = AccountContext::from_ctx(&ctx) + .map_to_mm(AccountRpcError::Internal) + .map_mm_err()?; account_ctx .storage() - .await? + .await + .map_mm_err()? .deactivate_coins(req.account_id, req.tickers) - .await?; + .await + .map_mm_err()?; Ok(SuccessResponse::new()) } fn validate_new_account(account: &NewAccount) -> MmResult<(), AccountRpcError> { - validate_account_name(&account.name)?; - validate_account_desc(&account.description) + validate_account_name(&account.name).map_mm_err()?; + validate_account_desc(&account.description).map_mm_err() } fn validate_account_name(name: &str) -> MmResult<(), AccountRpcError> { diff --git a/mm2src/mm2_net/src/grpc_web.rs b/mm2src/mm2_net/src/grpc_web.rs index 55f796df82..326343209a 100644 --- a/mm2src/mm2_net/src/grpc_web.rs +++ b/mm2src/mm2_net/src/grpc_web.rs @@ -153,11 +153,11 @@ where .uri(url) .header(CONTENT_TYPE, APPLICATION_GRPC_WEB) .header(ACCEPT, APPLICATION_GRPC_WEB) - .body(encode_body(req)?)?; + .body(encode_body(req).map_mm_err()?)?; - let response = slurp_req(request).await?; + let response = slurp_req(request).await.map_mm_err()?; - let reply = decode_body(response.2.into())?; + let reply = decode_body(response.2.into()).map_mm_err()?; Ok(reply) } @@ -176,9 +176,9 @@ where // https://github.com/grpc/grpc-web/issues/85#issue-217223001 .header(X_GRPC_WEB, "1"); - let response = request.request_array().await?; + let response = request.request_array().await.map_mm_err()?; - let reply = decode_body(response.1.into())?; + let reply = decode_body(response.1.into()).map_mm_err()?; Ok(reply) } diff --git a/mm2src/mm2_net/src/native_http.rs b/mm2src/mm2_net/src/native_http.rs index 6837c04655..b056c4ec03 100644 --- a/mm2src/mm2_net/src/native_http.rs +++ b/mm2src/mm2_net/src/native_http.rs @@ -245,7 +245,7 @@ pub async fn send_request_to_uri(uri: &str, auth_header: Option<&str>) -> MmResu } let request = request_builder.body(Body::empty())?; - let (status, _header, body) = slurp_req_body(request).await?; + let (status, _header, body) = slurp_req_body(request).await.map_mm_err()?; if !status.is_success() { return Err(MmError::new(GetInfoFromUriError::Transport(format!( "Status code not in 2xx range from {}: {}, {}", diff --git a/mm2src/mm2_net/src/transport.rs b/mm2src/mm2_net/src/transport.rs index 750d2561c2..cad2d553ed 100644 --- a/mm2src/mm2_net/src/transport.rs +++ b/mm2src/mm2_net/src/transport.rs @@ -113,7 +113,7 @@ impl From for GetInfoFromUriError { /// /// Returns an error if the HTTP status code of the response is not in the 2xx range. pub async fn send_post_request_to_uri(uri: &str, body: String) -> MmResult, GetInfoFromUriError> { - let (status, _header, body) = slurp_post_json(uri, body).await?; + let (status, _header, body) = slurp_post_json(uri, body).await.map_mm_err()?; if !status.is_success() { return Err(MmError::new(GetInfoFromUriError::Transport(format!( "Status code not in 2xx range from {}: {}", diff --git a/mm2src/trezor/src/response.rs b/mm2src/trezor/src/response.rs index 259db41840..c0bebc2415 100644 --- a/mm2src/trezor/src/response.rs +++ b/mm2src/trezor/src/response.rs @@ -118,22 +118,25 @@ where response = match response { TrezorResponse::Ready(result) => return Ok(result), TrezorResponse::ButtonRequest(button_req) => { - processor_req.on_button_request().await?; - button_req.ack().await? + processor_req.on_button_request().await.map_mm_err()?; + button_req.ack().await.map_mm_err()? }, TrezorResponse::PinMatrixRequest(pin_req) => { - let pin_response = processor_req.on_pin_request().await?; - pin_req.ack_pin(pin_response.pin).await? + let pin_response = processor_req.on_pin_request().await.map_mm_err()?; + pin_req.ack_pin(pin_response.pin).await.map_mm_err()? }, TrezorResponse::PassphraseRequest(passphrase_req) => { - let passphrase_response = processor_req.on_passphrase_request().await?; - passphrase_req.ack_passphrase(passphrase_response.passphrase).await? + let passphrase_response = processor_req.on_passphrase_request().await.map_mm_err()?; + passphrase_req + .ack_passphrase(passphrase_response.passphrase) + .await + .map_mm_err()? }, }; } }; let res = fut.await; - processor.on_ready().await?; + processor.on_ready().await.map_mm_err()?; res } } diff --git a/mm2src/trezor/src/transport/usb.rs b/mm2src/trezor/src/transport/usb.rs index cfdba0d36c..bf69871154 100644 --- a/mm2src/trezor/src/transport/usb.rs +++ b/mm2src/trezor/src/transport/usb.rs @@ -6,6 +6,7 @@ use crate::TrezorResult; use async_trait::async_trait; use hw_common::transport::libusb::{GetDevicesFilters, UsbAvailableDevice as UsbAvailableDeviceImpl, UsbContext, UsbDevice}; +use mm2_err_handle::prelude::MmResultExt; use std::time::Duration; pub use hw_common::transport::libusb::UsbDeviceInfo; @@ -44,17 +45,21 @@ struct UsbLink { impl Link for UsbLink { async fn write_chunk(&mut self, chunk: Vec) -> TrezorResult<()> { // don't try to reconnect since libusb requires to enumerate all devices, ope and, claim interface again - Ok(self.device.write_chunk(chunk, WRITE_TIMEOUT).await?) + Ok(self.device.write_chunk(chunk, WRITE_TIMEOUT).await.map_mm_err()?) } async fn read_chunk(&mut self, chunk_len: u32) -> TrezorResult> { // don't try to reconnect since libusb requires to enumerate all devices, ope and, claim interface again - Ok(self.device.read_chunk(chunk_len as usize, READ_TIMEOUT).await?) + Ok(self + .device + .read_chunk(chunk_len as usize, READ_TIMEOUT) + .await + .map_mm_err()?) } } async fn find_devices() -> TrezorResult> { - let context = UsbContext::new()?; + let context = UsbContext::new().map_mm_err()?; let filters = GetDevicesFilters { config_id: CONFIG_ID, interface_id: INTERFACE, @@ -62,7 +67,8 @@ async fn find_devices() -> TrezorResult> { interface_class_code: LIBUSB_CLASS_VENDOR_SPEC, }; Ok(context - .get_devices(filters)? + .get_devices(filters) + .map_mm_err()? .into_iter() .filter(is_trezor) .map(UsbAvailableDevice) @@ -75,7 +81,7 @@ impl UsbAvailableDevice { /// Please note [`hw_common::transport::libusb::UsbAvailableDevice::connect`] spawns a thread. async fn connect(&self) -> TrezorResult { let link = UsbLink { - device: self.0.connect()?, + device: self.0.connect().map_mm_err()?, }; Ok(UsbTransport { protocol: ProtocolV1 { link }, From 4584dbe27fc0c65bc098120ccae70bc4fff465e4 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 12:42:51 +0100 Subject: [PATCH 02/35] save dev state --- mm2src/coins/eth.rs | 40 +++++++++---------- .../eth/eth_swap_v2/eth_maker_swap_v2.rs | 4 +- .../eth/eth_swap_v2/eth_taker_swap_v2.rs | 6 +-- mm2src/coins/eth/nft_swap_v2/mod.rs | 4 +- mm2src/coins/eth/v2_activation.rs | 2 +- mm2src/coins/hd_wallet/mod.rs | 2 +- mm2src/coins/hd_wallet/storage/mod.rs | 2 +- mm2src/coins/lightning.rs | 2 +- mm2src/coins/lp_coins.rs | 6 +-- mm2src/coins/my_tx_history_v2.rs | 2 +- mm2src/coins/nft.rs | 18 ++++----- mm2src/coins/qrc20.rs | 14 +++---- mm2src/coins/qrc20/swap.rs | 10 ++--- mm2src/coins/rpc_command/account_balance.rs | 4 +- mm2src/coins/rpc_command/get_new_address.rs | 14 +++---- .../coins/rpc_command/init_account_balance.rs | 6 +-- .../coins/rpc_command/init_create_account.rs | 10 ++--- .../init_scan_for_new_addresses.rs | 6 +-- mm2src/coins/rpc_command/init_withdraw.rs | 6 +-- .../rpc_command/lightning/open_channel.rs | 2 +- mm2src/coins/tendermint/tendermint_coin.rs | 8 ++-- mm2src/coins/utxo/bch.rs | 2 +- mm2src/coins/utxo/qtum_delegation.rs | 14 +++---- mm2src/coins/utxo/slp.rs | 20 +++++----- .../utxo/utxo_builder/utxo_coin_builder.rs | 2 +- mm2src/coins/utxo/utxo_common.rs | 24 ++++++----- .../utxo_common/utxo_tx_history_v2_common.rs | 4 +- mm2src/coins/utxo/utxo_withdraw.rs | 4 +- mm2src/coins/z_coin.rs | 8 ++-- mm2src/coins/z_coin/z_htlc.rs | 6 +-- 30 files changed, 128 insertions(+), 124 deletions(-) diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index 7a82841687..fb0073c476 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -1087,7 +1087,7 @@ impl InitWithdrawCoin for EthCoin { pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> WithdrawNftResult { let coin = lp_coinfind_or_err(&ctx, withdraw_type.chain.to_ticker()).await?; let (to_addr, token_addr, eth_coin) = - get_valid_nft_addr_to_withdraw(coin, &withdraw_type.to, &withdraw_type.token_address)?; + get_valid_nft_addr_to_withdraw(coin, &withdraw_type.to, &withdraw_type.token_address).map_mm_err()?; let token_id_str = &withdraw_type.token_id.to_string(); let wallet_erc1155_amount = eth_coin.erc1155_balance(token_addr, token_id_str).await?; @@ -1112,9 +1112,9 @@ pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> Wit EthCoinType::Eth => { let function = ERC1155_CONTRACT.function("safeTransferFrom")?; let token_id_u256 = - U256::from_dec_str(token_id_str).map_to_mm(|e| NumConversError::new(format!("{:?}", e)))?; + U256::from_dec_str(token_id_str).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; let amount_u256 = - U256::from_dec_str(&amount_uint.to_string()).map_to_mm(|e| NumConversError::new(format!("{:?}", e)))?; + U256::from_dec_str(&amount_uint.to_string()).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; let data = function.encode_input(&[ Token::Address(my_address), Token::Address(to_addr), @@ -1160,10 +1160,10 @@ pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> Wit let tx = tx_builder .build() .map_to_mm(|e| WithdrawError::InternalError(e.to_string()))?; - let secret = eth_coin.priv_key_policy.activated_key_or_err()?.secret(); + let secret = eth_coin.priv_key_policy.activated_key_or_err().map_mm_err()?.secret(); let signed = tx.sign(secret, Some(eth_coin.chain_id))?; let signed_bytes = rlp::encode(&signed); - let fee_details = EthTxFeeDetails::new(gas, pay_for_gas_option, fee_coin)?; + let fee_details = EthTxFeeDetails::new(gas, pay_for_gas_option, fee_coin).map_mm_err()?; Ok(TransactionNftDetails { tx_hex: BytesJson::from(signed_bytes.to_vec()), // TODO: should we return tx_hex 0x-prefixed (everywhere)? @@ -1188,7 +1188,7 @@ pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> Wit pub async fn withdraw_erc721(ctx: MmArc, withdraw_type: WithdrawErc721) -> WithdrawNftResult { let coin = lp_coinfind_or_err(&ctx, withdraw_type.chain.to_ticker()).await?; let (to_addr, token_addr, eth_coin) = - get_valid_nft_addr_to_withdraw(coin, &withdraw_type.to, &withdraw_type.token_address)?; + get_valid_nft_addr_to_withdraw(coin, &withdraw_type.to, &withdraw_type.token_address).map_mm_err()?; let token_id_str = &withdraw_type.token_id.to_string(); let token_owner = eth_coin.erc721_owner(token_addr, token_id_str).await?; @@ -1205,7 +1205,7 @@ pub async fn withdraw_erc721(ctx: MmArc, withdraw_type: WithdrawErc721) -> Withd EthCoinType::Eth => { let function = ERC721_CONTRACT.function("safeTransferFrom")?; let token_id_u256 = U256::from_dec_str(&withdraw_type.token_id.to_string()) - .map_to_mm(|e| NumConversError::new(format!("{:?}", e)))?; + .map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; let data = function.encode_input(&[ Token::Address(my_address), Token::Address(to_addr), @@ -1251,10 +1251,10 @@ pub async fn withdraw_erc721(ctx: MmArc, withdraw_type: WithdrawErc721) -> Withd let tx = tx_builder .build() .map_to_mm(|e| WithdrawError::InternalError(e.to_string()))?; - let secret = eth_coin.priv_key_policy.activated_key_or_err()?.secret(); + let secret = eth_coin.priv_key_policy.activated_key_or_err().map_mm_err()?.secret(); let signed = tx.sign(secret, Some(eth_coin.chain_id))?; let signed_bytes = rlp::encode(&signed); - let fee_details = EthTxFeeDetails::new(gas, pay_for_gas_option, fee_coin)?; + let fee_details = EthTxFeeDetails::new(gas, pay_for_gas_option, fee_coin).map_mm_err()?; Ok(TransactionNftDetails { tx_hex: BytesJson::from(signed_bytes.to_vec()), @@ -2739,7 +2739,7 @@ async fn sign_and_send_transaction_with_metamask( /// Sign eth transaction async fn sign_raw_eth_tx(coin: &EthCoin, args: &SignEthTransactionParams) -> RawTransactionResult { - let value = wei_from_big_decimal(args.value.as_ref().unwrap_or(&BigDecimal::from(0)), coin.decimals)?; + let value = wei_from_big_decimal(args.value.as_ref().unwrap_or(&BigDecimal::from(0)), coin.decimals).map_mm_err()?; let action = if let Some(to) = &args.to { Call(Address::from_str(to).map_to_mm(|err| RawTransactionError::InvalidParam(err.to_string()))?) } else { @@ -2761,7 +2761,7 @@ async fn sign_raw_eth_tx(coin: &EthCoin, args: &SignEthTransactionParams) -> Raw let address_lock = coin.get_address_lock(my_address.to_string()).await; let _nonce_lock = address_lock.lock().await; let pay_for_gas_option = if let Some(ref pay_for_gas) = args.pay_for_gas { - pay_for_gas.clone().try_into()? + pay_for_gas.clone().try_into().map_mm_err()? } else { // use legacy gas_price() if not set info!(target: "sign-and-send", "get_gas_price…"); @@ -4476,7 +4476,7 @@ impl EthCoin { let balance_as_u256 = coin() .get_token_balance_for_address(address, info.token_address) .await?; - let balance_as_big_decimal = u256_to_big_decimal(balance_as_u256, info.decimals)?; + let balance_as_big_decimal = u256_to_big_decimal(balance_as_u256, info.decimals).map_mm_err()?; let balance = CoinBalance::new(balance_as_big_decimal); Ok((token_ticker, balance)) }; @@ -4522,7 +4522,7 @@ impl EthCoin { EthCoinType::Eth | EthCoinType::Nft { .. } => { let function = ERC1155_CONTRACT.function("balanceOf")?; let token_id_u256 = - U256::from_dec_str(token_id).map_to_mm(|e| NumConversError::new(format!("{:?}", e)))?; + U256::from_dec_str(token_id).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; let my_address = self.derivation_method.single_addr_or_err().await?; let data = function.encode_input(&[Token::Address(my_address), Token::Uint(token_id_u256)])?; let result = self @@ -4553,7 +4553,7 @@ impl EthCoin { EthCoinType::Eth | EthCoinType::Nft { .. } => { let function = ERC721_CONTRACT.function("ownerOf")?; let token_id_u256 = - U256::from_dec_str(token_id).map_to_mm(|e| NumConversError::new(format!("{:?}", e)))?; + U256::from_dec_str(token_id).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; let data = function.encode_input(&[Token::Uint(token_id_u256)])?; let my_address = self.derivation_method.single_addr_or_err().await?; let result = self @@ -6610,11 +6610,11 @@ pub async fn get_eth_address( ticker: &str, path_to_address: &HDPathAccountToAddressId, ) -> MmResult { - let crypto_ctx = CryptoCtx::from_ctx(ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(ctx).map_mm_err()?; let priv_key_policy = if crypto_ctx.hw_ctx().is_some() { PrivKeyBuildPolicy::Trezor } else { - PrivKeyBuildPolicy::detect_priv_key_policy(ctx)? + PrivKeyBuildPolicy::detect_priv_key_policy(ctx).map_mm_err()? } .into(); @@ -6700,7 +6700,7 @@ async fn get_eth_gas_details_from_withdraw_fee( ) -> MmResult { let pay_for_gas_option = match fee { Some(WithdrawFee::EthGas { gas_price, gas }) => { - let gas_price = wei_from_big_decimal(&gas_price, ETH_GWEI_DECIMALS)?; + let gas_price = wei_from_big_decimal(&gas_price, ETH_GWEI_DECIMALS).map_mm_err()?; return Ok((gas.into(), PayForGasOption::Legacy(LegacyGasPrice { gas_price }))); }, Some(WithdrawFee::EthGasEip1559 { @@ -6708,8 +6708,8 @@ async fn get_eth_gas_details_from_withdraw_fee( max_priority_fee_per_gas, gas_option: gas_limit, }) => { - let max_fee_per_gas = wei_from_big_decimal(&max_fee_per_gas, ETH_GWEI_DECIMALS)?; - let max_priority_fee_per_gas = wei_from_big_decimal(&max_priority_fee_per_gas, ETH_GWEI_DECIMALS)?; + let max_fee_per_gas = wei_from_big_decimal(&max_fee_per_gas, ETH_GWEI_DECIMALS).map_mm_err()?; + let max_priority_fee_per_gas = wei_from_big_decimal(&max_priority_fee_per_gas, ETH_GWEI_DECIMALS).map_mm_err()?; match gas_limit { EthGasLimitOption::Set(gas) => { return Ok(( @@ -6744,7 +6744,7 @@ async fn get_eth_gas_details_from_withdraw_fee( // covering edge case by deducting the standard transfer fee when we want to max withdraw ETH let eth_value_for_estimate = if fungible_max && eth_coin.coin_type == EthCoinType::Eth { - eth_value - calc_total_fee(U256::from(eth_coin.gas_limit.eth_send_coins), &pay_for_gas_option)? + eth_value - calc_total_fee(U256::from(eth_coin.gas_limit.eth_send_coins), &pay_for_gas_option).map_mm_err()? } else { eth_value }; diff --git a/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs b/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs index d576ee43f6..061986de7e 100644 --- a/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs +++ b/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs @@ -137,10 +137,10 @@ impl EthCoin { )) })?; let maker_address = public_to_address(args.maker_pub); - validate_from_to_addresses(tx_from_rpc, maker_address, maker_swap_v2_contract)?; + validate_from_to_addresses(tx_from_rpc, maker_address, maker_swap_v2_contract).map_mm_err()?; let validation_args = { - let amount = wei_from_big_decimal(&args.amount, self.decimals)?; + let amount = wei_from_big_decimal(&args.amount, self.decimals).map_mm_err()?; MakerValidationArgs { swap_id, amount, diff --git a/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs b/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs index ac0594cfa7..c6d7f3d614 100644 --- a/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs +++ b/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs @@ -166,11 +166,11 @@ impl EthCoin { )) })?; let taker_address = public_to_address(args.taker_pub); - validate_from_to_addresses(tx_from_rpc, taker_address, taker_swap_v2_contract)?; + validate_from_to_addresses(tx_from_rpc, taker_address, taker_swap_v2_contract).map_mm_err()?; let validation_args = { - let dex_fee = wei_from_big_decimal(&args.dex_fee.fee_amount().into(), self.decimals)?; - let payment_amount = wei_from_big_decimal(&(args.trading_amount + args.premium_amount), self.decimals)?; + let dex_fee = wei_from_big_decimal(&args.dex_fee.fee_amount().into(), self.decimals).map_mm_err()?; + let payment_amount = wei_from_big_decimal(&(args.trading_amount + args.premium_amount), self.decimals).map_mm_err()?; TakerValidationArgs { swap_id, amount: payment_amount, diff --git a/mm2src/coins/eth/nft_swap_v2/mod.rs b/mm2src/coins/eth/nft_swap_v2/mod.rs index ab81124792..812f59cadd 100644 --- a/mm2src/coins/eth/nft_swap_v2/mod.rs +++ b/mm2src/coins/eth/nft_swap_v2/mod.rs @@ -89,7 +89,7 @@ impl EthCoin { args.maker_payment_tx.tx_hash() )) })?; - validate_from_to_addresses(tx_from_rpc, maker_address, *token_address)?; + validate_from_to_addresses(tx_from_rpc, maker_address, *token_address).map_mm_err()?; let (decoded, bytes_index) = get_decoded_tx_data_and_bytes_index(contract_type, &tx_from_rpc.input.0)?; @@ -116,7 +116,7 @@ impl EthCoin { maker_secret_hash: args.maker_secret_hash.to_vec(), time_lock: U256::from(args.time_lock), }; - decode_and_validate_htlc_params(decoded, bytes_index, htlc_params)?; + decode_and_validate_htlc_params(decoded, bytes_index, htlc_params).map_mm_err()?; }, EthCoinType::Eth | EthCoinType::Erc20 { .. } => { return MmError::err(ValidatePaymentError::InternalError( diff --git a/mm2src/coins/eth/v2_activation.rs b/mm2src/coins/eth/v2_activation.rs index 4e04bfebed..52bf2c587f 100644 --- a/mm2src/coins/eth/v2_activation.rs +++ b/mm2src/coins/eth/v2_activation.rs @@ -768,7 +768,7 @@ pub(crate) async fn build_address_and_priv_key_policy( if trezor_coin.is_none() { return MmError::err(EthActivationV2Error::CoinDoesntSupportTrezor); } - let crypto_ctx = CryptoCtx::from_ctx(ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(ctx).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| EthActivationV2Error::HwContextNotInitialized)?; diff --git a/mm2src/coins/hd_wallet/mod.rs b/mm2src/coins/hd_wallet/mod.rs index 666293cb60..42ff49ba26 100644 --- a/mm2src/coins/hd_wallet/mod.rs +++ b/mm2src/coins/hd_wallet/mod.rs @@ -507,7 +507,7 @@ pub(crate) mod inner_impl { where Coin: HDWalletCoinOps + ?Sized + Sync, { - let known_addresses_number = hd_account.known_addresses_number(chain)?; + let known_addresses_number = hd_account.known_addresses_number(chain).map_mm_err()?; // Address IDs start from 0, so the `known_addresses_number = last_known_address_id + 1`. let new_address_id = known_addresses_number; let max_addresses_number = hd_account.address_limit(); diff --git a/mm2src/coins/hd_wallet/storage/mod.rs b/mm2src/coins/hd_wallet/storage/mod.rs index cb8f11b01d..c01712bfc9 100644 --- a/mm2src/coins/hd_wallet/storage/mod.rs +++ b/mm2src/coins/hd_wallet/storage/mod.rs @@ -229,7 +229,7 @@ impl Default for HDWalletCoinStorage { impl HDWalletCoinStorage { pub async fn init(ctx: &MmArc, coin: String) -> HDWalletStorageResult { let inner = Box::new(HDWalletStorageInstance::init(ctx).await?); - let crypto_ctx = CryptoCtx::from_ctx(ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(ctx).map_mm_err()?; let hd_wallet_rmd160 = crypto_ctx .hw_wallet_rmd160() .or_mm_err(|| HDWalletStorageError::HDWalletUnavailable)?; diff --git a/mm2src/coins/lightning.rs b/mm2src/coins/lightning.rs index 949c39a857..672c1014f3 100644 --- a/mm2src/coins/lightning.rs +++ b/mm2src/coins/lightning.rs @@ -486,7 +486,7 @@ impl LightningCoin { min_final_cltv_expiry: u64, ) -> Result, MmError> { // lightning decimals should be 11 in config since the smallest divisible unit in lightning coin is msat - let amt_msat = sat_from_big_decimal(&amount, self.decimals())?; + let amt_msat = sat_from_big_decimal(&amount, self.decimals()).map_mm_err()?; let payment_hash = payment_hash_from_slice(secret_hash).map_to_mm(|e| PaymentInstructionsErr::InternalError(e.to_string()))?; // note: No description is provided in the invoice to reduce the payload diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 785711e3f2..9b3c90b9bf 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -4314,7 +4314,7 @@ where { match xpub_extractor { Some(xpub_extractor) => { - let trezor_coin = coin.trezor_coin()?; + let trezor_coin = coin.trezor_coin().map_mm_err()?; let xpub = xpub_extractor.extract_xpub(trezor_coin, derivation_path).await?; Secp256k1ExtendedPublicKey::from_str(&xpub).map_to_mm(|e| HDExtractPubkeyError::InvalidXpub(e.to_string())) }, @@ -5195,7 +5195,7 @@ pub async fn delegations_info(ctx: MmArc, req: DelegationsInfo) -> Result match coin { - MmCoinEnum::Tendermint(t) => Ok(t.delegations_list(r.paging).await.map(|v| json!(v))?), + MmCoinEnum::Tendermint(t) => Ok(t.delegations_list(r.paging).await.map(|v| json!(v)).map_mm_err()?), MmCoinEnum::TendermintToken(_) => MmError::err(StakingInfoError::InvalidPayload { reason: "Tokens are not supported for delegation".into(), }), @@ -5211,7 +5211,7 @@ pub async fn ongoing_undelegations_info(ctx: MmArc, req: UndelegationsInfo) -> R match req.info_details { UndelegationsInfoDetails::Cosmos(r) => match coin { - MmCoinEnum::Tendermint(t) => Ok(t.ongoing_undelegations_list(r.paging).await.map(|v| json!(v))?), + MmCoinEnum::Tendermint(t) => Ok(t.ongoing_undelegations_list(r.paging).await.map(|v| json!(v)).map_mm_err()?), MmCoinEnum::TendermintToken(_) => MmError::err(StakingInfoError::InvalidPayload { reason: "Tokens are not supported for delegation".into(), }), diff --git a/mm2src/coins/my_tx_history_v2.rs b/mm2src/coins/my_tx_history_v2.rs index d35de25ddc..e3570293eb 100644 --- a/mm2src/coins/my_tx_history_v2.rs +++ b/mm2src/coins/my_tx_history_v2.rs @@ -388,7 +388,7 @@ pub(crate) async fn my_tx_history_v2_impl( where Coin: CoinWithTxHistoryV2 + MmCoin, { - let tx_history_storage = TxHistoryStorageBuilder::new(&ctx).build()?; + let tx_history_storage = TxHistoryStorageBuilder::new(&ctx).build().map_mm_err()?; let wallet_id = coin.history_wallet_id(); let is_storage_init = tx_history_storage.is_initialized_for(&wallet_id).await?; diff --git a/mm2src/coins/nft.rs b/mm2src/coins/nft.rs index ebd4c83146..8e903ad419 100644 --- a/mm2src/coins/nft.rs +++ b/mm2src/coins/nft.rs @@ -100,7 +100,7 @@ pub async fn get_nft_list(ctx: MmArc, req: NftListReq) -> MmResult MmResult MmResult MmResult<(), UpdateNftError> { - let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal)?; + let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal).map_mm_err()?; let p2p_ctx = P2PContext::fetch_from_mm_arc(&ctx); let storage = nft_ctx.lock_db().await?; @@ -477,7 +477,7 @@ fn prepare_uri_for_blocklist_endpoint( /// is identified as spam or matches with any phishing domains, the NFT's `possible_spam` and/or /// `possible_phishing` flags are set to true. pub async fn refresh_nft_metadata(ctx: MmArc, req: RefreshMetadataReq) -> MmResult<(), UpdateNftError> { - let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal)?; + let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal).map_mm_err()?; let p2p_ctx = P2PContext::fetch_from_mm_arc(&ctx); let storage = nft_ctx.lock_db().await?; @@ -519,7 +519,7 @@ pub async fn refresh_nft_metadata(ctx: MmArc, req: RefreshMetadataReq) -> MmResu })?; let token_uri = check_moralis_ipfs_bafy(moralis_meta.common.token_uri.as_deref()); let token_domain = get_domain_from_url(token_uri.as_deref()); - check_token_uri(&mut moralis_meta.common.possible_spam, token_uri.as_deref())?; + check_token_uri(&mut moralis_meta.common.possible_spam, token_uri.as_deref()).map_mm_err()?; drop_mutability!(moralis_meta); let uri_meta = get_uri_meta( token_uri.as_deref(), @@ -659,7 +659,7 @@ async fn get_moralis_nft_list( None => continue, }; let mut nft = build_nft_from_moralis(*chain, nft_moralis, contract_type, wrapper.url_antispam).await; - protect_from_nft_spam_links(&mut nft, false)?; + protect_from_nft_spam_links(&mut nft, false).map_mm_err()?; // collect NFTs from the page res_list.push(nft); } @@ -917,7 +917,7 @@ async fn get_moralis_metadata( None => return MmError::err(GetNftInfoError::ContractTypeIsNull), }; let mut nft_metadata = build_nft_from_moralis(*chain, nft_moralis, contract_type, wrapper.url_antispam).await; - protect_from_nft_spam_links(&mut nft_metadata, false)?; + protect_from_nft_spam_links(&mut nft_metadata, false).map_mm_err()?; Ok(nft_metadata) } @@ -1223,7 +1223,7 @@ async fn create_nft_from_moralis_metadata( ) -> MmResult { let token_uri = check_moralis_ipfs_bafy(moralis_meta.common.token_uri.as_deref()); let token_domain = get_domain_from_url(token_uri.as_deref()); - check_token_uri(&mut moralis_meta.common.possible_spam, token_uri.as_deref())?; + check_token_uri(&mut moralis_meta.common.possible_spam, token_uri.as_deref()).map_mm_err()?; let uri_meta = get_uri_meta( token_uri.as_deref(), moralis_meta.common.metadata.as_deref(), diff --git a/mm2src/coins/qrc20.rs b/mm2src/coins/qrc20.rs index 3049a56ec2..52dab25504 100644 --- a/mm2src/coins/qrc20.rs +++ b/mm2src/coins/qrc20.rs @@ -536,14 +536,14 @@ impl Qrc20Coin { .build() .await?; - let key_pair = self.utxo.priv_key_policy.activated_key_or_err()?; + let key_pair = self.utxo.priv_key_policy.activated_key_or_err().map_mm_err()?; let signed = sign_tx( unsigned, key_pair, self.utxo.conf.signature_version, self.utxo.conf.fork_id, - )?; + ).map_mm_err()?; let miner_fee = data.fee_amount + data.unused_change; Ok(GenerateQrc20TxResult { @@ -1383,13 +1383,13 @@ async fn qrc20_withdraw(coin: Qrc20Coin, req: WithdrawRequest) -> WithdrawResult // the qrc20_amount_sat is used only within smart contract calls let (qrc20_amount_sat, qrc20_amount) = if req.max { - let amount = wei_from_big_decimal(&qrc20_balance, coin.utxo.decimals)?; + let amount = wei_from_big_decimal(&qrc20_balance, coin.utxo.decimals).map_mm_err()?; if amount.is_zero() { return MmError::err(WithdrawError::ZeroBalanceToWithdrawMax); } (amount, qrc20_balance.clone()) } else { - let amount_sat = wei_from_big_decimal(&req.amount, coin.utxo.decimals)?; + let amount_sat = wei_from_big_decimal(&req.amount, coin.utxo.decimals).map_mm_err()?; if req.amount > qrc20_balance { return MmError::err(WithdrawError::NotSufficientBalance { coin: coin.ticker().to_owned(), @@ -1410,8 +1410,8 @@ async fn qrc20_withdraw(coin: Qrc20Coin, req: WithdrawRequest) -> WithdrawResult }; // [`Qrc20Coin::transfer_output`] shouldn't fail if the arguments are correct - let contract_addr = qtum::contract_addr_from_utxo_addr(to_addr.clone())?; - let transfer_output = coin.transfer_output(contract_addr, qrc20_amount_sat, gas_limit, gas_price)?; + let contract_addr = qtum::contract_addr_from_utxo_addr(to_addr.clone()).map_mm_err()?; + let transfer_output = coin.transfer_output(contract_addr, qrc20_amount_sat, gas_limit, gas_price).map_mm_err()?; let outputs = vec![transfer_output]; let GenerateQrc20TxResult { @@ -1432,7 +1432,7 @@ async fn qrc20_withdraw(coin: Qrc20Coin, req: WithdrawRequest) -> WithdrawResult let my_balance_change = &received_by_me - &qrc20_amount; // [`MarketCoinOps::my_address`] and [`UtxoCommonOps::display_address`] shouldn't fail - let my_address_string = coin.my_address()?; + let my_address_string = coin.my_address().map_mm_err()?; let to_address = to_addr.display_address().map_to_mm(WithdrawError::InternalError)?; let fee_details = Qrc20FeeDetails { diff --git a/mm2src/coins/qrc20/swap.rs b/mm2src/coins/qrc20/swap.rs index 26dea25ab8..4c07735ebc 100644 --- a/mm2src/coins/qrc20/swap.rs +++ b/mm2src/coins/qrc20/swap.rs @@ -135,7 +135,7 @@ impl Qrc20Coin { } let expected_call_bytes = { - let expected_value = wei_from_big_decimal(&amount, self.utxo.decimals)?; + let expected_value = wei_from_big_decimal(&amount, self.utxo.decimals).map_mm_err()?; let my_address = self.utxo.derivation_method.single_addr_or_err().await?; let expected_receiver = qtum::contract_addr_from_utxo_addr(my_address) .mm_err(|err| ValidatePaymentError::InternalError(err.to_string()))?; @@ -145,7 +145,7 @@ impl Qrc20Coin { time_lock, &secret_hash, expected_receiver, - )? + ).map_mm_err()? }; let erc20_payment = self .erc20_payment_details_from_tx(&payment_tx) @@ -454,10 +454,10 @@ impl Qrc20Coin { if allowance < value { if allowance > U256::zero() { // first reset the allowance to the 0 - outputs.push(self.approve_output(swap_contract_address, 0.into())?); + outputs.push(self.approve_output(swap_contract_address, 0.into()).map_mm_err()?); } // set the allowance from 0 to `my_balance` after the previous output is executed - outputs.push(self.approve_output(swap_contract_address, my_balance)?); + outputs.push(self.approve_output(swap_contract_address, my_balance).map_mm_err()?); } // when this output is executed, the allowance will be sufficient already @@ -468,7 +468,7 @@ impl Qrc20Coin { &secret_hash, receiver_addr, &swap_contract_address, - )?); + ).map_mm_err()?); Ok(outputs) } diff --git a/mm2src/coins/rpc_command/account_balance.rs b/mm2src/coins/rpc_command/account_balance.rs index 7e6587b788..d530a22fe7 100644 --- a/mm2src/coins/rpc_command/account_balance.rs +++ b/mm2src/coins/rpc_command/account_balance.rs @@ -93,11 +93,11 @@ pub mod common_impl { let account_id = params.account_index; let hd_account = coin .derivation_method() - .hd_wallet_or_err()? + .hd_wallet_or_err().map_mm_err()? .get_account(account_id) .await .or_mm_err(|| HDAccountBalanceRpcError::UnknownAccount { account_id })?; - let total_addresses_number = hd_account.known_addresses_number(params.chain)?; + let total_addresses_number = hd_account.known_addresses_number(params.chain).map_mm_err()?; let from_address_id = match params.paging_options { PagingOptionsEnum::FromId(from_address_id) => from_address_id + 1, diff --git a/mm2src/coins/rpc_command/get_new_address.rs b/mm2src/coins/rpc_command/get_new_address.rs index 1213905c74..b9d3021975 100644 --- a/mm2src/coins/rpc_command/get_new_address.rs +++ b/mm2src/coins/rpc_command/get_new_address.rs @@ -315,7 +315,7 @@ impl RpcTask for InitGetNewAddressTask { on_ready: GetNewAddressInProgressStatus::RequestingAccountBalance, }; let confirm_address: RpcTaskConfirmAddress = - RpcTaskConfirmAddress::new(ctx, task_handle, hw_statuses, trezor_message_type)?; + RpcTaskConfirmAddress::new(ctx, task_handle, hw_statuses, trezor_message_type).map_mm_err()?; coin.get_new_address_rpc(params, &confirm_address).await } @@ -387,7 +387,7 @@ pub async fn init_get_new_address( let spawner = coin.spawner(); let task = InitGetNewAddressTask { ctx, coin, req }; let task_id = - GetNewAddressTaskManager::spawn_rpc_task(&coins_ctx.get_new_address_manager, &spawner, task, client_id)?; + GetNewAddressTaskManager::spawn_rpc_task(&coins_ctx.get_new_address_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -414,7 +414,7 @@ pub async fn init_get_new_address_user_action( .get_new_address_manager .lock() .map_to_mm(|e| RpcTaskUserActionError::Internal(e.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -427,7 +427,7 @@ pub async fn cancel_get_new_address( .get_new_address_manager .lock() .map_to_mm(|e| CancelRpcTaskError::Internal(e.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -452,7 +452,7 @@ pub(crate) mod common_impl { Coin: HDWalletBalanceOps + CoinWithDerivationMethod + Sync + Send, HDCoinAddress: fmt::Display, { - let hd_wallet = coin.derivation_method().hd_wallet_or_err()?; + let hd_wallet = coin.derivation_method().hd_wallet_or_err().map_mm_err()?; let account_id = params.account_id; let mut hd_account = hd_wallet @@ -492,7 +492,7 @@ pub(crate) mod common_impl { Coin: HDWalletBalanceOps + CoinWithDerivationMethod + Send + Sync, HDCoinAddress: Display + Eq + Hash, { - let hd_wallet = coin.derivation_method().hd_wallet_or_err()?; + let hd_wallet = coin.derivation_method().hd_wallet_or_err().map_mm_err()?; let account_id = params.account_id; let mut hd_account = hd_wallet @@ -537,7 +537,7 @@ pub(crate) mod common_impl { Coin: HDWalletBalanceOps + Sync, HDCoinAddress: fmt::Display, { - let known_addresses_number = hd_account.known_addresses_number(chain)?; + let known_addresses_number = hd_account.known_addresses_number(chain).map_mm_err()?; if known_addresses_number == 0 || gap_limit > known_addresses_number { return Ok(()); } diff --git a/mm2src/coins/rpc_command/init_account_balance.rs b/mm2src/coins/rpc_command/init_account_balance.rs index b18e6bdbce..f8603313e2 100644 --- a/mm2src/coins/rpc_command/init_account_balance.rs +++ b/mm2src/coins/rpc_command/init_account_balance.rs @@ -98,7 +98,7 @@ pub async fn init_account_balance( let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(HDAccountBalanceRpcError::Internal)?; let task = InitAccountBalanceTask { coin, req }; let task_id = - AccountBalanceTaskManager::spawn_rpc_task(&coins_ctx.account_balance_task_manager, &spawner, task, client_id)?; + AccountBalanceTaskManager::spawn_rpc_task(&coins_ctx.account_balance_task_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -125,7 +125,7 @@ pub async fn cancel_account_balance( .account_balance_task_manager .lock() .map_to_mm(|e| CancelRpcTaskError::Internal(e.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -148,7 +148,7 @@ pub mod common_impl { let account_id = params.account_index; let hd_account = coin .derivation_method() - .hd_wallet_or_err()? + .hd_wallet_or_err().map_mm_err()? .get_account(account_id) .await .or_mm_err(|| HDAccountBalanceRpcError::UnknownAccount { account_id })?; diff --git a/mm2src/coins/rpc_command/init_create_account.rs b/mm2src/coins/rpc_command/init_create_account.rs index c323ffe78a..628eeb91c4 100644 --- a/mm2src/coins/rpc_command/init_create_account.rs +++ b/mm2src/coins/rpc_command/init_create_account.rs @@ -278,7 +278,7 @@ impl RpcTask for InitCreateAccountTask { task_handle, hw_statuses, coin_protocol, - )?) + ).map_mm_err()?) } else { None }; @@ -342,7 +342,7 @@ pub async fn init_create_new_account( task_state: CreateAccountState::default(), }; let task_id = - CreateAccountTaskManager::spawn_rpc_task(&coins_ctx.create_account_manager, &spawner, task, client_id)?; + CreateAccountTaskManager::spawn_rpc_task(&coins_ctx.create_account_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -369,7 +369,7 @@ pub async fn init_create_new_account_user_action( .create_account_manager .lock() .map_to_mm(|e| RpcTaskUserActionError::Internal(e.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -382,7 +382,7 @@ pub async fn cancel_create_new_account( .create_account_manager .lock() .map_to_mm(|e| CancelRpcTaskError::Internal(e.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -407,7 +407,7 @@ pub(crate) mod common_impl { XPubExtractor: HDXPubExtractor + Send, HDCoinHDAccount: HDAccountStorageOps, { - let hd_wallet = coin.derivation_method().hd_wallet_or_err()?; + let hd_wallet = coin.derivation_method().hd_wallet_or_err().map_mm_err()?; let mut new_account = create_new_account(coin, hd_wallet, xpub_extractor, params.account_id).await?; let account_index = new_account.account_id(); diff --git a/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs b/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs index d24c7229fe..a05b6c5dd4 100644 --- a/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs +++ b/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs @@ -117,7 +117,7 @@ pub async fn init_scan_for_new_addresses( let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(HDAccountBalanceRpcError::Internal)?; let task = InitScanAddressesTask { req, coin }; let task_id = - ScanAddressesTaskManager::spawn_rpc_task(&coins_ctx.scan_addresses_manager, &spawner, task, client_id)?; + ScanAddressesTaskManager::spawn_rpc_task(&coins_ctx.scan_addresses_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -144,7 +144,7 @@ pub async fn cancel_scan_for_new_addresses( .scan_addresses_manager .lock() .map_to_mm(|e| CancelRpcTaskError::Internal(e.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -163,7 +163,7 @@ pub mod common_impl { where Coin: CoinWithDerivationMethod + HDWalletBalanceOps + Sync, { - let hd_wallet = coin.derivation_method().hd_wallet_or_err()?; + let hd_wallet = coin.derivation_method().hd_wallet_or_err().map_mm_err()?; let account_id = params.account_index; let mut hd_account = hd_wallet diff --git a/mm2src/coins/rpc_command/init_withdraw.rs b/mm2src/coins/rpc_command/init_withdraw.rs index e82ccd4d63..bff70675d0 100644 --- a/mm2src/coins/rpc_command/init_withdraw.rs +++ b/mm2src/coins/rpc_command/init_withdraw.rs @@ -46,7 +46,7 @@ pub async fn init_withdraw( request, }; let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(WithdrawError::InternalError)?; - let task_id = WithdrawTaskManager::spawn_rpc_task(&coins_ctx.withdraw_task_manager, &spawner, task, client_id)?; + let task_id = WithdrawTaskManager::spawn_rpc_task(&coins_ctx.withdraw_task_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitWithdrawResponse { task_id }) } @@ -86,7 +86,7 @@ pub async fn withdraw_user_action( .withdraw_task_manager .lock() .map_to_mm(|e| WithdrawUserActionError::Internal(e.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -96,7 +96,7 @@ pub async fn cancel_withdraw(ctx: MmArc, req: CancelRpcTaskRequest) -> MmResult< .withdraw_task_manager .lock() .map_to_mm(|e| CancelRpcTaskError::Internal(e.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } diff --git a/mm2src/coins/rpc_command/lightning/open_channel.rs b/mm2src/coins/rpc_command/lightning/open_channel.rs index fdb5b9caa9..bccf16ea90 100644 --- a/mm2src/coins/rpc_command/lightning/open_channel.rs +++ b/mm2src/coins/rpc_command/lightning/open_channel.rs @@ -154,7 +154,7 @@ pub async fn open_channel(ctx: MmArc, req: OpenChannelRequest) -> OpenChannelRes FeePolicy::DeductFromOutput(0), ), ChannelOpenAmount::Exact(v) => { - let value = sat_from_big_decimal(&v, decimals)?; + let value = sat_from_big_decimal(&v, decimals).map_mm_err()?; (value, FeePolicy::SendExact) }, }; diff --git a/mm2src/coins/tendermint/tendermint_coin.rs b/mm2src/coins/tendermint/tendermint_coin.rs index 201e215c19..8d20948cbc 100644 --- a/mm2src/coins/tendermint/tendermint_coin.rs +++ b/mm2src/coins/tendermint/tendermint_coin.rs @@ -1815,7 +1815,7 @@ impl TendermintCoin { let sender = AccountId::new(&self.account_prefix, sender_pubkey_hash.as_slice()) .map_to_mm(|e| ValidatePaymentError::InvalidParameter(e.to_string()))?; - let amount = sat_from_big_decimal(&input.amount, decimals)?; + let amount = sat_from_big_decimal(&input.amount, decimals).map_mm_err()?; let amount = vec![Coin { denom, amount: amount.into(), @@ -2026,7 +2026,7 @@ impl TendermintCoin { let to_address = account_id_from_pubkey_hex(&self.account_prefix, DEX_FEE_ADDR_PUBKEY) .map_err(|e| MmError::new(TradePreimageError::InternalError(e.to_string())))?; - let amount = sat_from_big_decimal(&amount, decimals)?; + let amount = sat_from_big_decimal(&amount, decimals).map_mm_err()?; let create_htlc_tx = self .gen_create_htlc_tx(denom, &to_address, amount.into(), sha256(&sec).as_slice(), TIME_LOCK) @@ -2075,7 +2075,7 @@ impl TendermintCoin { ) -> TradePreimageResult { let to_address = account_id_from_pubkey_hex(&self.account_prefix, DEX_FEE_ADDR_PUBKEY) .map_err(|e| MmError::new(TradePreimageError::InternalError(e.to_string())))?; - let amount = sat_from_big_decimal(&dex_fee_amount.fee_amount().into(), decimals)?; + let amount = sat_from_big_decimal(&dex_fee_amount.fee_amount().into(), decimals).map_mm_err()?; let current_block = self.current_block().compat().await.map_err(|e| { MmError::new(TradePreimageError::InternalError(format!( @@ -2252,7 +2252,7 @@ impl TendermintCoin { .await? .perform(request) .await - .map_to_mm(TendermintCoinRpcError::from)?; + .map_to_mm(TendermintCoinRpcError::from).map_mm_err()?; match response.txs.first() { Some(raw_tx) => { let tx = cosmrs::Tx::from_bytes(&raw_tx.tx)?; diff --git a/mm2src/coins/utxo/bch.rs b/mm2src/coins/utxo/bch.rs index e38a59ce27..aff3b00147 100644 --- a/mm2src/coins/utxo/bch.rs +++ b/mm2src/coins/utxo/bch.rs @@ -492,7 +492,7 @@ impl BchCoin { ) -> MmResult { let token_genesis_tx = self.tx_from_storage_or_rpc(&token_id.into(), storage).await?; let maybe_genesis_script: Script = token_genesis_tx.outputs[0].script_pubkey.clone().into(); - let slp_details = parse_slp_script(&maybe_genesis_script)?; + let slp_details = parse_slp_script(&maybe_genesis_script).map_mm_err()?; match slp_details.transaction { SlpTransaction::Genesis(params) => Ok(params), _ => { diff --git a/mm2src/coins/utxo/qtum_delegation.rs b/mm2src/coins/utxo/qtum_delegation.rs index b83289d97c..2b81fa12b6 100644 --- a/mm2src/coins/utxo/qtum_delegation.rs +++ b/mm2src/coins/utxo/qtum_delegation.rs @@ -121,9 +121,9 @@ impl QtumCoin { reason: "Qtum doesn't support delegation for segwit".to_string(), }); } - let delegation_output = self.remove_delegation_output(QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT)?; + let delegation_output = self.remove_delegation_output(QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT).map_mm_err()?; let outputs = vec![delegation_output]; - let my_address = self.my_address()?; + let my_address = self.my_address().map_mm_err()?; self.generate_delegation_transaction( outputs, my_address, @@ -240,7 +240,7 @@ impl QtumCoin { .map_to_mm(DelegationError::AddressError)?; let fee = request.fee.unwrap_or(QTUM_DELEGATION_STANDARD_FEE); let _utxo_lock = UTXO_LOCK.lock(); - let staker_address_hex = qtum::contract_addr_from_utxo_addr(to_addr.clone())?; + let staker_address_hex = qtum::contract_addr_from_utxo_addr(to_addr.clone()).map_mm_err()?; let delegation_output = self.add_delegation_output( staker_address_hex, to_addr.hash().clone(), @@ -250,7 +250,7 @@ impl QtumCoin { )?; let outputs = vec![delegation_output]; - let my_address = self.my_address()?; + let my_address = self.my_address().map_mm_err()?; self.generate_delegation_transaction( outputs, my_address, @@ -269,7 +269,7 @@ impl QtumCoin { ) -> DelegationResult { let utxo = self.as_ref(); - let key_pair = utxo.priv_key_policy.activated_key_or_err()?; + let key_pair = utxo.priv_key_policy.activated_key_or_err().map_mm_err()?; let my_address = utxo.derivation_method.single_addr_or_err().await?; let (unspents, _) = self.get_unspent_ordered_list(&my_address).await?; @@ -292,7 +292,7 @@ impl QtumCoin { DelegationError::from_generate_tx_error(gen_tx_error, self.ticker().to_string(), utxo.decimals) })?; - let signed = sign_tx(unsigned, key_pair, utxo.conf.signature_version, utxo.conf.fork_id)?; + let signed = sign_tx(unsigned, key_pair, utxo.conf.signature_version, utxo.conf.fork_id).map_mm_err()?; let miner_fee = data.fee_amount + data.unused_change; let generated_tx = GenerateQrc20TxResult { @@ -309,7 +309,7 @@ impl QtumCoin { gas_price: QRC20_GAS_PRICE_DEFAULT, total_gas_fee: utxo_common::big_decimal_from_sat(generated_tx.gas_fee as i64, utxo.decimals), }; - let my_address_string = self.my_address()?; + let my_address_string = self.my_address().map_mm_err()?; let spent_by_me = utxo_common::big_decimal_from_sat(data.spent_by_me as i64, utxo.decimals); let qtum_amount = spent_by_me.clone(); diff --git a/mm2src/coins/utxo/slp.rs b/mm2src/coins/utxo/slp.rs index 1ca37e3eba..f35820c834 100644 --- a/mm2src/coins/utxo/slp.rs +++ b/mm2src/coins/utxo/slp.rs @@ -384,7 +384,7 @@ impl SlpToken { })); if change > 0 { - let my_public_key = self.platform_coin.my_public_key()?; + let my_public_key = self.platform_coin.my_public_key().map_mm_err()?; let slp_change_out = TransactionOutput { value: self.platform_dust(), script_pubkey: ScriptBuilder::build_p2pkh(&my_public_key.address_hash().into()).to_bytes(), @@ -446,7 +446,7 @@ impl SlpToken { )); } - let slp_satoshis = sat_from_big_decimal(&input.amount, self.decimals())?; + let slp_satoshis = sat_from_big_decimal(&input.amount, self.decimals()).map_mm_err()?; let slp_unspent = SlpUnspent { bch_unspent: UnspentInfo { @@ -462,7 +462,7 @@ impl SlpToken { }; validate_slp_utxos(self.platform_coin.bchd_urls(), &[slp_unspent], self.token_id()).await?; - let slp_tx: SlpTxDetails = parse_slp_script(tx.outputs[0].script_pubkey.as_slice())?; + let slp_tx: SlpTxDetails = parse_slp_script(tx.outputs[0].script_pubkey.as_slice()).map_mm_err()?; match slp_tx.transaction { SlpTransaction::Send { token_id, amounts } => { @@ -532,10 +532,10 @@ impl SlpToken { return MmError::err(SpendHtlcError::TxLackOfOutputs); } - let slp_tx: SlpTxDetails = parse_slp_script(tx.outputs[0].script_pubkey.as_slice())?; + let slp_tx: SlpTxDetails = parse_slp_script(tx.outputs[0].script_pubkey.as_slice()).map_mm_err()?; let other_pub = Public::from_slice(other_pub)?; - let my_public_key = self.platform_coin.my_public_key()?; + let my_public_key = self.platform_coin.my_public_key().map_mm_err()?; let redeem_script = payment_script(time_lock, secret_hash, my_public_key, &other_pub); let slp_amount = match slp_tx.transaction { @@ -636,7 +636,7 @@ impl SlpToken { let mut outputs = Vec::with_capacity(3); outputs.push(op_return_out_mm); - let my_public_key = self.platform_coin.my_public_key()?; + let my_public_key = self.platform_coin.my_public_key().map_mm_err()?; let my_script_pubkey = ScriptBuilder::build_p2pkh(&my_public_key.address_hash().into()); let slp_output = TransactionOutput { value: self.platform_dust(), @@ -656,7 +656,7 @@ impl SlpToken { unsigned.lock_time = tx_locktime; unsigned.inputs[0].sequence = input_sequence; - let my_key_pair = self.platform_coin.as_ref().priv_key_policy.activated_key_or_err()?; + let my_key_pair = self.platform_coin.as_ref().priv_key_policy.activated_key_or_err().map_mm_err()?; let signed_p2sh_input = p2sh_spend( &unsigned, 0, @@ -665,7 +665,7 @@ impl SlpToken { redeem_script, self.platform_coin.as_ref().conf.signature_version, self.platform_coin.as_ref().conf.fork_id, - )?; + ).map_mm_err()?; let signed_inputs: Result, _> = unsigned .inputs @@ -729,7 +729,7 @@ impl SlpToken { return MmError::err(ValidateDexFeeError::TxLackOfOutputs); } - let slp_tx: SlpTxDetails = parse_slp_script(tx.outputs[0].script_pubkey.as_slice())?; + let slp_tx: SlpTxDetails = parse_slp_script(tx.outputs[0].script_pubkey.as_slice()).map_mm_err()?; match slp_tx.transaction { SlpTransaction::Send { token_id, amounts } => { @@ -741,7 +741,7 @@ impl SlpToken { return MmError::err(ValidateDexFeeError::InvalidSlpDetails); } - let expected = sat_from_big_decimal(&amount, self.decimals())?; + let expected = sat_from_big_decimal(&amount, self.decimals()).map_mm_err()?; if amounts[0] != expected { return MmError::err(ValidateDexFeeError::InvalidSlpDetails); diff --git a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs index b916afc232..78b7055b79 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs @@ -235,7 +235,7 @@ async fn build_utxo_coin_fields_with_conf_and_policy( where Builder: UtxoCoinBuilderCommonOps + Sync + ?Sized, { - let key_pair = priv_key_policy.activated_key_or_err()?; + let key_pair = priv_key_policy.activated_key_or_err().map_mm_err()?; let addr_format = builder.address_format()?; let my_address = AddressBuilder::new( addr_format, diff --git a/mm2src/coins/utxo/utxo_common.rs b/mm2src/coins/utxo/utxo_common.rs index db7ad1f65a..eed7729617 100644 --- a/mm2src/coins/utxo/utxo_common.rs +++ b/mm2src/coins/utxo/utxo_common.rs @@ -295,7 +295,7 @@ pub async fn get_htlc_spend_fee( }; if coin.as_ref().conf.force_min_relay_fee { let relay_fee = coin.as_ref().rpc_client.get_relay_fee().compat().await?; - let relay_fee_sat = sat_from_big_decimal(&relay_fee, coin.as_ref().decimals)?; + let relay_fee_sat = sat_from_big_decimal(&relay_fee, coin.as_ref().decimals).map_mm_err()?; if fee < relay_fee_sat { fee = relay_fee_sat; } @@ -677,7 +677,7 @@ impl<'a, T: AsRef + UtxoTxGenerationOps> UtxoTxBuilder<'a, T> { self.min_relay_fee = if coin.as_ref().conf.force_min_relay_fee { let fee_dec = coin.as_ref().rpc_client.get_relay_fee().compat().await?; - let min_relay_fee = sat_from_big_decimal(&fee_dec, coin.as_ref().decimals)?; + let min_relay_fee = sat_from_big_decimal(&fee_dec, coin.as_ref().decimals).map_mm_err()?; Some(min_relay_fee) } else { None @@ -1073,7 +1073,8 @@ pub async fn gen_and_sign_taker_funding_spend_preimage( coin.as_ref().conf.signature_version, SIGHASH_ALL, coin.as_ref().conf.fork_id, - )?; + ) + .map_mm_err()?; Ok(TxPreimageWithSig { preimage: preimage.into(), signature: signature.take().into(), @@ -1146,7 +1147,8 @@ pub async fn validate_taker_funding_spend_preimage( coin.as_ref().conf.signature_version, SIGHASH_ALL, coin.as_ref().conf.fork_id, - )?; + ) + .map_mm_err()?; if !gen_args .maker_pub @@ -1357,7 +1359,8 @@ pub async fn gen_and_sign_taker_payment_spend_preimage( coin.as_ref().conf.signature_version, sig_hash_type, coin.as_ref().conf.fork_id, - )?; + ) + .map_mm_err()?; if !gen_args .taker_pub @@ -3885,7 +3889,7 @@ where } // Todo: https://github.com/KomodoPlatform/komodo-defi-framework/issues/1625 - let my_address = &coin.my_address()?; + let my_address = &coin.my_address().map_mm_err()?; let claimed_by_me = tx_details.from.iter().all(|from| from == my_address) && tx_details.to.contains(my_address); tx_details.kmd_rewards = Some(KmdRewardsDetails { @@ -4411,7 +4415,7 @@ pub async fn validate_payment<'a, T: UtxoCommonOps>( try_spv_proof_until: u64, confirmations: u64, ) -> ValidatePaymentResult<()> { - let amount = sat_from_big_decimal(&amount, coin.as_ref().decimals)?; + let amount = sat_from_big_decimal(&amount, coin.as_ref().decimals).map_mm_err()?; let expected_redeem = tx_type_with_secret_hash.redeem_script(time_lock, first_pub0, second_pub0); let tx_hash = tx.tx_hash_as_bytes(); @@ -4457,7 +4461,7 @@ pub async fn validate_payment<'a, T: UtxoCommonOps>( } if let Some(watcher_reward) = watcher_reward { - let expected_reward = sat_from_big_decimal(&watcher_reward.amount, coin.as_ref().decimals)?; + let expected_reward = sat_from_big_decimal(&watcher_reward.amount, coin.as_ref().decimals).map_mm_err()?; let actual_reward = actual_output.value - amount; validate_watcher_reward(expected_reward, actual_reward, false)?; } else if actual_output.value != amount { @@ -5024,7 +5028,7 @@ where let total_expected_amount = &args.dex_fee.total_spend_amount().to_decimal() + &args.premium_amount + &args.trading_amount; - let expected_amount_sat = sat_from_big_decimal(&total_expected_amount, coin.as_ref().decimals)?; + let expected_amount_sat = sat_from_big_decimal(&total_expected_amount, coin.as_ref().decimals).map_mm_err()?; let time_lock = args .funding_time_lock diff --git a/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs b/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs index 01f9750b03..96d3069881 100644 --- a/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs +++ b/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs @@ -39,7 +39,7 @@ where { match (coin.derivation_method(), target) { (DerivationMethod::SingleAddress(_), MyTxHistoryTarget::Iguana) => { - let my_address = coin.my_address()?; + let my_address = coin.my_address().map_mm_err()?; Ok(GetTxHistoryFilters::for_address(my_address)) }, (DerivationMethod::SingleAddress(_), target) => { @@ -98,7 +98,7 @@ where .await .or_mm_err(|| MyTxHistoryErrorV2::InvalidTarget(format!("No such account_id={}", hd_address_id.account_id)))?; - let is_address_activated = hd_account.is_address_activated(hd_address_id.chain, hd_address_id.address_id)?; + let is_address_activated = hd_account.is_address_activated(hd_address_id.chain, hd_address_id.address_id).map_mm_err()?; if !is_address_activated { let error = format!( "'{:?}:{}' address is not activated", diff --git a/mm2src/coins/utxo/utxo_withdraw.rs b/mm2src/coins/utxo/utxo_withdraw.rs index 29ef2f5963..2bb0aa75d2 100644 --- a/mm2src/coins/utxo/utxo_withdraw.rs +++ b/mm2src/coins/utxo/utxo_withdraw.rs @@ -463,13 +463,13 @@ where let from_address_string = from.address.display_address().map_to_mm(WithdrawError::InternalError)?; let key_pair = match from.derivation_path { - Some(der_path) => derive_hd_key_pair(&coin, &der_path)?, + Some(der_path) => derive_hd_key_pair(&coin, &der_path).map_mm_err()?, // [`WithdrawSenderAddress::derivation_path`] is not set, but the coin is initialized with an HD wallet derivation method. None if coin.has_hd_wallet_derivation_method() => { let error = "Cannot determine 'from' address derivation path".to_owned(); return MmError::err(WithdrawError::UnexpectedFromAddress(error)); }, - None => *coin.as_ref().priv_key_policy.activated_key_or_err()?, + None => *coin.as_ref().priv_key_policy.activated_key_or_err().map_mm_err()?, }; Ok(StandardUtxoWithdraw { diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 6a44bf2ddb..56d3a10e0a 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -446,7 +446,7 @@ impl ZCoin { } if change > BigDecimal::from(0u8) { - let change_sat = sat_from_big_decimal(&change, self.utxo_arc.decimals)?; + let change_sat = sat_from_big_decimal(&change, self.utxo_arc.decimals).map_mm_err()?; received_by_me += change_sat; tx_builder.add_sapling_output( @@ -481,8 +481,8 @@ impl ZCoin { let additional_data = AdditionalTxData { received_by_me, - spent_by_me: sat_from_big_decimal(&total_input_amount, self.decimals())?, - fee_amount: sat_from_big_decimal(&tx_fee, self.decimals())?, + spent_by_me: sat_from_big_decimal(&total_input_amount, self.decimals()).map_mm_err()?, + fee_amount: sat_from_big_decimal(&tx_fee, self.decimals()).map_mm_err()?, unused_change: 0, kmd_rewards: None, }; @@ -647,7 +647,7 @@ impl ZCoin { .transactions .into_iter() .map(|sql_item| self.tx_details_from_db_item(sql_item, &transactions, &prev_transactions, current_block)) - .collect::>()?; + .collect::>().map_mm_err()?; Ok(MyTxHistoryResponseV2 { coin: self.ticker().into(), diff --git a/mm2src/coins/z_coin/z_htlc.rs b/mm2src/coins/z_coin/z_htlc.rs index ffda1aba42..ad1fe2b862 100644 --- a/mm2src/coins/z_coin/z_htlc.rs +++ b/mm2src/coins/z_coin/z_htlc.rs @@ -56,7 +56,7 @@ pub async fn z_send_htlc( .build() .map_to_mm(SendOutputsErr::InternalError)?; - let amount_sat = sat_from_big_decimal(&amount, coin.utxo_arc.decimals)?; + let amount_sat = sat_from_big_decimal(&amount, coin.utxo_arc.decimals).map_mm_err()?; let address = htlc_address.to_string(); if let UtxoRpcClientEnum::Native(native) = coin.utxo_rpc_client() { native.import_address(&address, &address, false).compat().await.unwrap(); @@ -91,7 +91,7 @@ pub async fn z_send_dex_fee( if matches!(dex_fee, DexFee::NoFee) { return MmError::err(SendOutputsErr::InternalError("unexpected DexFee::NoFee".to_string())); } - let dex_fee_amount_sat = sat_from_big_decimal(&dex_fee.fee_amount().to_decimal(), coin.utxo_arc.decimals)?; + let dex_fee_amount_sat = sat_from_big_decimal(&dex_fee.fee_amount().to_decimal(), coin.utxo_arc.decimals).map_mm_err()?; // add dex fee output let dex_fee_out = ZOutput { to_addr: coin.z_fields.dex_fee_addr.clone(), @@ -102,7 +102,7 @@ pub async fn z_send_dex_fee( }; let mut outputs = vec![dex_fee_out]; if let Some(dex_burn_amount) = dex_fee.burn_amount() { - let dex_burn_amount_sat = sat_from_big_decimal(&dex_burn_amount.to_decimal(), coin.utxo_arc.decimals)?; + let dex_burn_amount_sat = sat_from_big_decimal(&dex_burn_amount.to_decimal(), coin.utxo_arc.decimals).map_mm_err()?; // add output to the dex burn address: let dex_burn_out = ZOutput { to_addr: coin.z_fields.dex_burn_addr.clone(), From 2bde002af57edb1e3bcccefcf73f6f567bca8a4c Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 12:54:10 +0100 Subject: [PATCH 03/35] more changes --- mm2src/coins/coin_balance.rs | 20 +- mm2src/coins/eth.rs | 73 +++--- .../eth/eth_swap_v2/eth_maker_swap_v2.rs | 2 +- .../eth/eth_swap_v2/eth_taker_swap_v2.rs | 5 +- mm2src/coins/eth/nft_swap_v2/mod.rs | 2 +- mm2src/coins/eth/v2_activation.rs | 14 +- mm2src/coins/hd_wallet/confirm_address.rs | 10 +- mm2src/coins/hd_wallet/mod.rs | 6 +- mm2src/coins/hd_wallet/pubkey.rs | 13 +- mm2src/coins/lp_coins.rs | 34 +-- mm2src/coins/lp_price.rs | 4 +- mm2src/coins/my_tx_history_v2.rs | 9 +- mm2src/coins/nft.rs | 207 +++++++++++------- mm2src/coins/qrc20.rs | 18 +- mm2src/coins/qrc20/swap.rs | 27 ++- mm2src/coins/rpc_command/account_balance.rs | 8 +- mm2src/coins/rpc_command/get_current_mtp.rs | 14 +- mm2src/coins/rpc_command/get_new_address.rs | 16 +- .../coins/rpc_command/init_account_balance.rs | 4 +- .../coins/rpc_command/init_create_account.rs | 8 +- .../init_scan_for_new_addresses.rs | 6 +- mm2src/coins/rpc_command/init_withdraw.rs | 2 +- .../rpc_command/lightning/close_channel.rs | 2 +- .../rpc_command/lightning/connect_to_node.rs | 2 +- .../rpc_command/lightning/generate_invoice.rs | 2 +- .../lightning/get_channel_details.rs | 2 +- .../lightning/get_claimable_balances.rs | 2 +- .../lightning/get_payment_details.rs | 2 +- .../rpc_command/lightning/list_channels.rs | 4 +- .../lightning/list_payments_by_filter.rs | 2 +- .../rpc_command/lightning/open_channel.rs | 8 +- .../rpc_command/lightning/send_payment.rs | 6 +- .../rpc_command/lightning/trusted_nodes.rs | 6 +- .../rpc_command/lightning/update_channel.rs | 2 +- .../coins/rpc_command/tendermint/staking.rs | 18 +- mm2src/coins/tendermint/tendermint_coin.rs | 44 ++-- mm2src/coins/utxo/bchd_grpc.rs | 6 +- mm2src/coins/utxo/qtum_delegation.rs | 16 +- .../utxo/rpc_clients/electrum_rpc/client.rs | 4 +- mm2src/coins/utxo/slp.rs | 40 ++-- mm2src/coins/utxo/utxo_common.rs | 49 +++-- .../utxo_common/utxo_tx_history_v2_common.rs | 39 +++- mm2src/coins/z_coin.rs | 28 ++- mm2src/coins/z_coin/z_htlc.rs | 8 +- mm2src/coins/z_coin/z_rpc.rs | 14 +- 45 files changed, 497 insertions(+), 311 deletions(-) diff --git a/mm2src/coins/coin_balance.rs b/mm2src/coins/coin_balance.rs index 3ec047ee80..cd9a1e5935 100644 --- a/mm2src/coins/coin_balance.rs +++ b/mm2src/coins/coin_balance.rs @@ -428,11 +428,12 @@ pub mod common_impl { HDCoinAddress: fmt::Display, { let gap_limit = hd_wallet.gap_limit(); - let mut addresses = coin.all_known_addresses_balances(hd_account).await?; + let mut addresses = coin.all_known_addresses_balances(hd_account).await.map_mm_err()?; if scan_new_addresses { addresses.extend( coin.scan_for_new_addresses(hd_wallet, hd_account, address_scanner, gap_limit) - .await?, + .await + .map_mm_err()?, ); } @@ -474,7 +475,7 @@ pub mod common_impl { HDCoinHDAccount: HDAccountStorageOps, { let mut accounts = hd_wallet.get_accounts_mut().await; - let address_scanner = coin.produce_hd_address_scanner().await?; + let address_scanner = coin.produce_hd_address_scanner().await.map_mm_err()?; let mut result = HDWalletBalance { accounts: Vec::with_capacity(accounts.len() + 1), @@ -489,8 +490,9 @@ pub mod common_impl { ); // Create new HD account. - let mut new_account = - create_new_account(coin, hd_wallet, xpub_extractor, Some(path_to_address.account_id)).await?; + let mut new_account = create_new_account(coin, hd_wallet, xpub_extractor, Some(path_to_address.account_id)) + .await + .map_mm_err()?; let scan_new_addresses = matches!( params.scan_policy, EnableCoinScanPolicy::ScanIfNewWallet | EnableCoinScanPolicy::Scan @@ -576,7 +578,10 @@ pub mod common_impl { let mut new_addresses = Vec::with_capacity(to_generate); let mut addresses_to_request = Vec::with_capacity(to_generate); for _ in 0..to_generate { - let hd_address = coin.generate_new_address(hd_wallet, hd_account, chain).await?; + let hd_address = coin + .generate_new_address(hd_wallet, hd_account, chain) + .await + .map_mm_err()?; new_addresses.push(HDAddressBalance { address: hd_address.address().display_address(), @@ -589,7 +594,8 @@ pub mod common_impl { let to_extend = coin .known_addresses_balances(addresses_to_request) - .await? + .await + .map_mm_err()? .into_iter() // The balances are guaranteed to be in the same order as they were requests. .zip(new_addresses) diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index fb0073c476..16b2cc646b 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -1085,12 +1085,14 @@ impl InitWithdrawCoin for EthCoin { /// `withdraw_erc1155` function returns details of `ERC-1155` transaction including tx hex, /// which should be sent to`send_raw_transaction` RPC to broadcast the transaction. pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> WithdrawNftResult { - let coin = lp_coinfind_or_err(&ctx, withdraw_type.chain.to_ticker()).await?; + let coin = lp_coinfind_or_err(&ctx, withdraw_type.chain.to_ticker()) + .await + .map_mm_err()?; let (to_addr, token_addr, eth_coin) = get_valid_nft_addr_to_withdraw(coin, &withdraw_type.to, &withdraw_type.token_address).map_mm_err()?; let token_id_str = &withdraw_type.token_id.to_string(); - let wallet_erc1155_amount = eth_coin.erc1155_balance(token_addr, token_id_str).await?; + let wallet_erc1155_amount = eth_coin.erc1155_balance(token_addr, token_id_str).await.map_mm_err()?; let amount_uint = if withdraw_type.max { wallet_erc1155_amount.clone() @@ -1107,14 +1109,16 @@ pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> Wit }); } - let my_address = eth_coin.derivation_method.single_addr_or_err().await?; + let my_address = eth_coin.derivation_method.single_addr_or_err().await.map_mm_err()?; let (eth_value, data, call_addr, fee_coin) = match eth_coin.coin_type { EthCoinType::Eth => { let function = ERC1155_CONTRACT.function("safeTransferFrom")?; - let token_id_u256 = - U256::from_dec_str(token_id_str).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; - let amount_u256 = - U256::from_dec_str(&amount_uint.to_string()).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; + let token_id_u256 = U256::from_dec_str(token_id_str) + .map_to_mm(|e| NumConversError::new(format!("{:?}", e))) + .map_mm_err()?; + let amount_u256 = U256::from_dec_str(&amount_uint.to_string()) + .map_to_mm(|e| NumConversError::new(format!("{:?}", e))) + .map_mm_err()?; let data = function.encode_input(&[ Token::Address(my_address), Token::Address(to_addr), @@ -1140,7 +1144,8 @@ pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> Wit call_addr, false, ) - .await?; + .await + .map_mm_err()?; let address_lock = eth_coin.get_address_lock(my_address.to_string()).await; let _nonce_lock = address_lock.lock().await; let (nonce, _) = eth_coin @@ -1186,13 +1191,15 @@ pub async fn withdraw_erc1155(ctx: MmArc, withdraw_type: WithdrawErc1155) -> Wit /// `withdraw_erc721` function returns details of `ERC-721` transaction including tx hex, /// which should be sent to`send_raw_transaction` RPC to broadcast the transaction. pub async fn withdraw_erc721(ctx: MmArc, withdraw_type: WithdrawErc721) -> WithdrawNftResult { - let coin = lp_coinfind_or_err(&ctx, withdraw_type.chain.to_ticker()).await?; + let coin = lp_coinfind_or_err(&ctx, withdraw_type.chain.to_ticker()) + .await + .map_mm_err()?; let (to_addr, token_addr, eth_coin) = get_valid_nft_addr_to_withdraw(coin, &withdraw_type.to, &withdraw_type.token_address).map_mm_err()?; let token_id_str = &withdraw_type.token_id.to_string(); - let token_owner = eth_coin.erc721_owner(token_addr, token_id_str).await?; - let my_address = eth_coin.derivation_method.single_addr_or_err().await?; + let token_owner = eth_coin.erc721_owner(token_addr, token_id_str).await.map_mm_err()?; + let my_address = eth_coin.derivation_method.single_addr_or_err().await.map_mm_err()?; if token_owner != my_address { return MmError::err(WithdrawError::MyAddressNotNftOwner { my_address: my_address.display_address(), @@ -1200,12 +1207,13 @@ pub async fn withdraw_erc721(ctx: MmArc, withdraw_type: WithdrawErc721) -> Withd }); } - let my_address = eth_coin.derivation_method.single_addr_or_err().await?; + let my_address = eth_coin.derivation_method.single_addr_or_err().await.map_mm_err()?; let (eth_value, data, call_addr, fee_coin) = match eth_coin.coin_type { EthCoinType::Eth => { let function = ERC721_CONTRACT.function("safeTransferFrom")?; let token_id_u256 = U256::from_dec_str(&withdraw_type.token_id.to_string()) - .map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; + .map_to_mm(|e| NumConversError::new(format!("{:?}", e))) + .map_mm_err()?; let data = function.encode_input(&[ Token::Address(my_address), Token::Address(to_addr), @@ -1230,7 +1238,8 @@ pub async fn withdraw_erc721(ctx: MmArc, withdraw_type: WithdrawErc721) -> Withd call_addr, false, ) - .await?; + .await + .map_mm_err()?; let address_lock = eth_coin.get_address_lock(my_address.to_string()).await; let _nonce_lock = address_lock.lock().await; @@ -2739,7 +2748,8 @@ async fn sign_and_send_transaction_with_metamask( /// Sign eth transaction async fn sign_raw_eth_tx(coin: &EthCoin, args: &SignEthTransactionParams) -> RawTransactionResult { - let value = wei_from_big_decimal(args.value.as_ref().unwrap_or(&BigDecimal::from(0)), coin.decimals).map_mm_err()?; + let value = + wei_from_big_decimal(args.value.as_ref().unwrap_or(&BigDecimal::from(0)), coin.decimals).map_mm_err()?; let action = if let Some(to) = &args.to { Call(Address::from_str(to).map_to_mm(|err| RawTransactionError::InvalidParam(err.to_string()))?) } else { @@ -2765,7 +2775,7 @@ async fn sign_raw_eth_tx(coin: &EthCoin, args: &SignEthTransactionParams) -> Raw } else { // use legacy gas_price() if not set info!(target: "sign-and-send", "get_gas_price…"); - let gas_price = coin.get_gas_price().await?; + let gas_price = coin.get_gas_price().await.map_mm_err()?; PayForGasOption::Legacy(LegacyGasPrice { gas_price }) }; sign_transaction_with_keypair( @@ -4487,7 +4497,7 @@ impl EthCoin { } pub async fn get_tokens_balance_list(&self) -> Result> { - let my_address = self.derivation_method.single_addr_or_err().await?; + let my_address = self.derivation_method.single_addr_or_err().await.map_mm_err()?; self.get_tokens_balance_list_for_address(my_address).await } @@ -4513,7 +4523,7 @@ impl EthCoin { } async fn get_token_balance(&self, token_address: Address) -> Result> { - let my_address = self.derivation_method.single_addr_or_err().await?; + let my_address = self.derivation_method.single_addr_or_err().await.map_mm_err()?; self.get_token_balance_for_address(my_address, token_address).await } @@ -4521,9 +4531,10 @@ impl EthCoin { let wallet_amount_uint = match self.coin_type { EthCoinType::Eth | EthCoinType::Nft { .. } => { let function = ERC1155_CONTRACT.function("balanceOf")?; - let token_id_u256 = - U256::from_dec_str(token_id).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; - let my_address = self.derivation_method.single_addr_or_err().await?; + let token_id_u256 = U256::from_dec_str(token_id) + .map_to_mm(|e| NumConversError::new(format!("{:?}", e))) + .map_mm_err()?; + let my_address = self.derivation_method.single_addr_or_err().await.map_mm_err()?; let data = function.encode_input(&[Token::Address(my_address), Token::Uint(token_id_u256)])?; let result = self .call_request(my_address, token_addr, None, Some(data.into()), BlockNumber::Latest) @@ -4552,10 +4563,11 @@ impl EthCoin { let owner_address = match self.coin_type { EthCoinType::Eth | EthCoinType::Nft { .. } => { let function = ERC721_CONTRACT.function("ownerOf")?; - let token_id_u256 = - U256::from_dec_str(token_id).map_to_mm(|e| NumConversError::new(format!("{:?}", e))).map_mm_err()?; + let token_id_u256 = U256::from_dec_str(token_id) + .map_to_mm(|e| NumConversError::new(format!("{:?}", e))) + .map_mm_err()?; let data = function.encode_input(&[Token::Uint(token_id_u256)])?; - let my_address = self.derivation_method.single_addr_or_err().await?; + let my_address = self.derivation_method.single_addr_or_err().await.map_mm_err()?; let result = self .call_request(my_address, token_addr, None, Some(data.into()), BlockNumber::Latest) .await?; @@ -4598,7 +4610,7 @@ impl EthCoin { /// because [`CallRequest::from`] is set to [`EthCoinImpl::my_address`]. async fn estimate_gas_for_contract_call(&self, contract_addr: Address, call_data: Bytes) -> Web3RpcResult { let coin = self.clone(); - let my_address = coin.derivation_method.single_addr_or_err().await?; + let my_address = coin.derivation_method.single_addr_or_err().await.map_mm_err()?; let fee_policy_for_estimate = get_swap_fee_policy_for_estimate(self.get_swap_transaction_fee_policy()); let pay_for_gas_option = coin.get_swap_pay_for_gas_option(fee_policy_for_estimate).await?; let eth_value = U256::zero(); @@ -6619,8 +6631,10 @@ pub async fn get_eth_address( .into(); let (_, derivation_method) = - build_address_and_priv_key_policy(ctx, ticker, conf, priv_key_policy, path_to_address, None).await?; - let my_address = derivation_method.single_addr_or_err().await?; + build_address_and_priv_key_policy(ctx, ticker, conf, priv_key_policy, path_to_address, None) + .await + .map_mm_err()?; + let my_address = derivation_method.single_addr_or_err().await.map_mm_err()?; Ok(MyWalletAddress { coin: ticker.to_owned(), @@ -6709,7 +6723,8 @@ async fn get_eth_gas_details_from_withdraw_fee( gas_option: gas_limit, }) => { let max_fee_per_gas = wei_from_big_decimal(&max_fee_per_gas, ETH_GWEI_DECIMALS).map_mm_err()?; - let max_priority_fee_per_gas = wei_from_big_decimal(&max_priority_fee_per_gas, ETH_GWEI_DECIMALS).map_mm_err()?; + let max_priority_fee_per_gas = + wei_from_big_decimal(&max_priority_fee_per_gas, ETH_GWEI_DECIMALS).map_mm_err()?; match gas_limit { EthGasLimitOption::Set(gas) => { return Ok(( @@ -6736,7 +6751,7 @@ async fn get_eth_gas_details_from_withdraw_fee( }, None => { // If WithdrawFee not set use legacy gas price (?) - let gas_price = eth_coin.get_gas_price().await?; + let gas_price = eth_coin.get_gas_price().await.map_mm_err()?; // go to gas estimate code PayForGasOption::Legacy(LegacyGasPrice { gas_price }) }, diff --git a/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs b/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs index 061986de7e..ec4f69b31a 100644 --- a/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs +++ b/mm2src/coins/eth/eth_swap_v2/eth_maker_swap_v2.rs @@ -10,7 +10,7 @@ use ethereum_types::{Address, Public, U256}; use ethkey::public_to_address; use futures::compat::Future01CompatExt; use mm2_err_handle::mm_error::MmError; -use mm2_err_handle::prelude::MapToMmResult; +use mm2_err_handle::prelude::{MapToMmResult, MmResultExt}; use std::convert::TryInto; use web3::types::TransactionId; diff --git a/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs b/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs index c6d7f3d614..3792e12526 100644 --- a/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs +++ b/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs @@ -12,7 +12,7 @@ use ethcore_transaction::Action; use ethereum_types::{Address, Public, U256}; use ethkey::public_to_address; use futures::compat::Future01CompatExt; -use mm2_err_handle::prelude::{MapToMmResult, MmError, MmResult}; +use mm2_err_handle::prelude::{MapToMmResult, MmError, MmResult, MmResultExt}; use std::convert::TryInto; use web3::types::{BlockNumber, TransactionId}; @@ -170,7 +170,8 @@ impl EthCoin { let validation_args = { let dex_fee = wei_from_big_decimal(&args.dex_fee.fee_amount().into(), self.decimals).map_mm_err()?; - let payment_amount = wei_from_big_decimal(&(args.trading_amount + args.premium_amount), self.decimals).map_mm_err()?; + let payment_amount = + wei_from_big_decimal(&(args.trading_amount + args.premium_amount), self.decimals).map_mm_err()?; TakerValidationArgs { swap_id, amount: payment_amount, diff --git a/mm2src/coins/eth/nft_swap_v2/mod.rs b/mm2src/coins/eth/nft_swap_v2/mod.rs index 812f59cadd..d0e4ca8163 100644 --- a/mm2src/coins/eth/nft_swap_v2/mod.rs +++ b/mm2src/coins/eth/nft_swap_v2/mod.rs @@ -3,7 +3,7 @@ use ethcore_transaction::Action; use ethereum_types::U256; use ethkey::public_to_address; use futures::compat::Future01CompatExt; -use mm2_err_handle::prelude::{MapToMmResult, MmError, MmResult}; +use mm2_err_handle::prelude::{MapToMmResult, MmError, MmResult, MmResultExt}; use mm2_number::BigDecimal; use num_traits::Signed; use web3::types::TransactionId; diff --git a/mm2src/coins/eth/v2_activation.rs b/mm2src/coins/eth/v2_activation.rs index 52bf2c587f..65daded657 100644 --- a/mm2src/coins/eth/v2_activation.rs +++ b/mm2src/coins/eth/v2_activation.rs @@ -515,7 +515,7 @@ impl EthCoin { let abortable_system = self.abortable_system.create_subsystem()?; // Todo: support HD wallet for NFTs, currently we get nfts for enabled address only and there might be some issues when activating NFTs while ETH is activated with HD wallet - let my_address = self.derivation_method.single_addr_or_err().await?; + let my_address = self.derivation_method.single_addr_or_err().await.map_mm_err()?; let proxy_sign = if komodo_proxy { let uri = Uri::from_str(original_url.as_ref()) @@ -527,7 +527,9 @@ impl EthCoin { None }; - let nft_infos = get_nfts_for_activation(&chain, &my_address, original_url, proxy_sign).await?; + let nft_infos = get_nfts_for_activation(&chain, &my_address, original_url, proxy_sign) + .await + .map_mm_err()?; let coin_type = EthCoinType::Nft { platform: self.ticker.clone(), }; @@ -740,7 +742,9 @@ pub(crate) async fn build_address_and_priv_key_policy( let hd_wallet_storage = HDWalletCoinStorage::init_with_rmd160(ctx, ticker.to_string(), hd_wallet_rmd160) .await .mm_err(EthActivationV2Error::from)?; - let accounts = load_hd_accounts_from_storage(&hd_wallet_storage, &path_to_coin).await?; + let accounts = load_hd_accounts_from_storage(&hd_wallet_storage, &path_to_coin) + .await + .map_mm_err()?; let gap_limit = gap_limit.unwrap_or(DEFAULT_GAP_LIMIT); let hd_wallet = EthHDWallet { hd_wallet_rmd160, @@ -776,7 +780,9 @@ pub(crate) async fn build_address_and_priv_key_policy( let hd_wallet_storage = HDWalletCoinStorage::init_with_rmd160(ctx, ticker.to_string(), hd_wallet_rmd160) .await .mm_err(EthActivationV2Error::from)?; - let accounts = load_hd_accounts_from_storage(&hd_wallet_storage, &path_to_coin).await?; + let accounts = load_hd_accounts_from_storage(&hd_wallet_storage, &path_to_coin) + .await + .map_mm_err()?; let gap_limit = gap_limit.unwrap_or(DEFAULT_GAP_LIMIT); let hd_wallet = EthHDWallet { hd_wallet_rmd160, diff --git a/mm2src/coins/hd_wallet/confirm_address.rs b/mm2src/coins/hd_wallet/confirm_address.rs index 39bb286322..f0daeff6a4 100644 --- a/mm2src/coins/hd_wallet/confirm_address.rs +++ b/mm2src/coins/hd_wallet/confirm_address.rs @@ -153,20 +153,20 @@ where let pubkey_processor = TrezorRpcTaskProcessor::new(task_handle, confirm_statuses); let pubkey_processor = Arc::new(pubkey_processor); - let mut trezor_session = hw_ctx.trezor(pubkey_processor.clone()).await?; + let mut trezor_session = hw_ctx.trezor(pubkey_processor.clone()).await.map_mm_err()?; let address = match trezor_message_type { TrezorMessageType::Bitcoin => { trezor_session .get_utxo_address(derivation_path, trezor_coin, SHOW_ADDRESS_ON_DISPLAY) - .await? + .await.map_mm_err()? .process(pubkey_processor.clone()) - .await? + .await.map_mm_err()? }, TrezorMessageType::Ethereum => trezor_session .get_eth_address(derivation_path, SHOW_ADDRESS_ON_DISPLAY) - .await? + .await.map_mm_err()? .process(pubkey_processor.clone()) - .await? + .await.map_mm_err()? .or_mm_err(|| HDConfirmAddressError::NoAddressReceived)?, }; diff --git a/mm2src/coins/hd_wallet/mod.rs b/mm2src/coins/hd_wallet/mod.rs index 42ff49ba26..544adeb06c 100644 --- a/mm2src/coins/hd_wallet/mod.rs +++ b/mm2src/coins/hd_wallet/mod.rs @@ -416,7 +416,7 @@ where let account_derivation_path: HDPathToAccount = hd_wallet.derivation_path().derive(account_child)?; let account_pubkey = coin .extract_extended_pubkey(xpub_extractor, account_derivation_path.to_derivation_path()) - .await?; + .await.map_mm_err()?; let new_account = HDAccount::new(new_account_id, account_pubkey, account_derivation_path); @@ -429,7 +429,7 @@ where return MmError::err(NewAccountCreationError::Internal(error)); } - hd_wallet.upload_new_account(new_account.to_storage_item()).await?; + hd_wallet.upload_new_account(new_account.to_storage_item()).await.map_mm_err()?; Ok(AsyncMutexGuard::map(accounts, |accounts| { accounts @@ -514,7 +514,7 @@ pub(crate) mod inner_impl { if new_address_id >= max_addresses_number { return MmError::err(NewAddressDerivingError::AddressLimitReached { max_addresses_number }); } - let address = coin.derive_address(hd_account, chain, new_address_id).await?; + let address = coin.derive_address(hd_account, chain, new_address_id).await.map_mm_err()?; Ok(NewAddress { hd_address: address, new_known_addresses_number: known_addresses_number + 1, diff --git a/mm2src/coins/hd_wallet/pubkey.rs b/mm2src/coins/hd_wallet/pubkey.rs index 7babb12bd5..3d9624eaa0 100644 --- a/mm2src/coins/hd_wallet/pubkey.rs +++ b/mm2src/coins/hd_wallet/pubkey.rs @@ -150,7 +150,7 @@ where ) -> MmResult { let pubkey_processor = TrezorRpcTaskProcessor::new(task_handle, statuses.to_trezor_request_statuses()); let pubkey_processor = Arc::new(pubkey_processor); - let mut trezor_session = hw_ctx.trezor(pubkey_processor.clone()).await?; + let mut trezor_session = hw_ctx.trezor(pubkey_processor.clone()).await.map_mm_err()?; let xpub = trezor_session .get_public_key( derivation_path, @@ -159,9 +159,11 @@ where SHOW_PUBKEY_ON_DISPLAY, IGNORE_XPUB_MAGIC, ) - .await? + .await + .map_mm_err()? .process(pubkey_processor.clone()) - .await?; + .await + .map_mm_err()?; // Despite we pass `IGNORE_XPUB_MAGIC` to the [`TrezorSession::get_public_key`] method, // Trezor sometimes returns pubkeys with magic prefixes like `dgub` prefix for DOGE coin. // So we need to replace the magic prefix manually. @@ -176,10 +178,11 @@ where ) -> MmResult { let pubkey_processor = TrezorRpcTaskProcessor::new(task_handle, statuses.to_trezor_request_statuses()); let pubkey_processor = Arc::new(pubkey_processor); - let mut trezor_session = hw_ctx.trezor(pubkey_processor.clone()).await?; + let mut trezor_session = hw_ctx.trezor(pubkey_processor.clone()).await.map_mm_err()?; trezor_session .get_eth_public_key(&derivation_path, SHOW_PUBKEY_ON_DISPLAY) - .await? + .await + .map_mm_err()? .process(pubkey_processor) .await .mm_err(HDExtractPubkeyError::from) diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 9b3c90b9bf..8303e5220e 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -5110,23 +5110,23 @@ pub async fn validate_address(ctx: MmArc, req: Json) -> Result> } pub async fn withdraw(ctx: MmArc, req: WithdrawRequest) -> WithdrawResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; coin.withdraw(req).compat().await } pub async fn get_raw_transaction(ctx: MmArc, req: RawTransactionRequest) -> RawTransactionResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; coin.get_raw_transaction(req).compat().await } pub async fn sign_message(ctx: MmArc, req: SignatureRequest) -> SignatureResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let signature = coin.sign_message(&req.message)?; Ok(SignatureResponse { signature }) } pub async fn verify_message(ctx: MmArc, req: VerificationRequest) -> VerificationResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let validate_address_result = coin.validate_address(&req.address); if !validate_address_result.is_valid { @@ -5141,12 +5141,12 @@ pub async fn verify_message(ctx: MmArc, req: VerificationRequest) -> Verificatio } pub async fn sign_raw_transaction(ctx: MmArc, req: SignRawTransactionRequest) -> RawTransactionResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; coin.sign_raw_tx(&req).await } pub async fn remove_delegation(ctx: MmArc, req: RemoveDelegateRequest) -> DelegationResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match req.staking_details { Some(StakingDetails::Cosmos(req)) => { @@ -5181,7 +5181,7 @@ pub async fn remove_delegation(ctx: MmArc, req: RemoveDelegateRequest) -> Delega } pub async fn delegations_info(ctx: MmArc, req: DelegationsInfo) -> Result> { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match req.info_details { DelegationsInfoDetails::Qtum => { @@ -5207,7 +5207,7 @@ pub async fn delegations_info(ctx: MmArc, req: DelegationsInfo) -> Result Result> { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match req.info_details { UndelegationsInfoDetails::Cosmos(r) => match coin { @@ -5223,7 +5223,7 @@ pub async fn ongoing_undelegations_info(ctx: MmArc, req: UndelegationsInfo) -> R } pub async fn validators_info(ctx: MmArc, req: ValidatorsInfo) -> Result> { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match req.info_details { ValidatorsInfoDetails::Cosmos(payload) => rpc_command::tendermint::staking::validators_rpc(coin, payload) @@ -5233,7 +5233,7 @@ pub async fn validators_info(ctx: MmArc, req: ValidatorsInfo) -> Result DelegationResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match req.staking_details { StakingDetails::Qtum(req) => { @@ -5260,7 +5260,7 @@ pub async fn add_delegation(ctx: MmArc, req: AddDelegateRequest) -> DelegationRe pub async fn claim_staking_rewards(ctx: MmArc, req: ClaimStakingRewardsRequest) -> DelegationResult { match req.claiming_details { ClaimingDetails::Cosmos(r) => { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let MmCoinEnum::Tendermint(tendermint) = coin else { return MmError::err(DelegationError::InvalidPayload { @@ -5836,7 +5836,7 @@ pub async fn get_my_address(ctx: MmArc, req: MyAddressReq) -> MmResult get_eth_address(&ctx, &conf, ticker, &req.path_to_address).await?, + CoinProtocol::ETH => get_eth_address(&ctx, &conf, ticker, &req.path_to_address).await.map_mm_err()?, _ => { return MmError::err(GetMyAddressError::CoinIsNotSupported(format!( "{} doesn't support get_my_address", @@ -5893,7 +5893,7 @@ pub trait Eip1559Ops { /// Get eip 1559 transaction fee per gas policy (low, medium, high) set for the coin pub async fn get_swap_transaction_fee_policy(ctx: MmArc, req: SwapTxFeePolicyRequest) -> SwapTxFeePolicyResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match coin { MmCoinEnum::EthCoin(eth_coin) => Ok(eth_coin.get_swap_transaction_fee_policy()), MmCoinEnum::Qrc20Coin(qrc20_coin) => Ok(qrc20_coin.get_swap_transaction_fee_policy()), @@ -5903,7 +5903,7 @@ pub async fn get_swap_transaction_fee_policy(ctx: MmArc, req: SwapTxFeePolicyReq /// Set eip 1559 transaction fee per gas policy (low, medium, high) pub async fn set_swap_transaction_fee_policy(ctx: MmArc, req: SwapTxFeePolicyRequest) -> SwapTxFeePolicyResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match coin { MmCoinEnum::EthCoin(eth_coin) => { eth_coin.set_swap_transaction_fee_policy(req.swap_tx_fee_policy); @@ -5941,7 +5941,7 @@ where let mut unused_addresses_counter = 0; let max_addresses_number = hd_account.address_limit(); while checking_address_id < max_addresses_number && unused_addresses_counter <= gap_limit { - let hd_address = coin.derive_address(hd_account, chain, checking_address_id).await?; + let hd_address = coin.derive_address(hd_account, chain, checking_address_id).await.map_mm_err()?; let checking_address = hd_address.address(); let checking_address_der_path = hd_address.derivation_path(); @@ -5956,7 +5956,7 @@ where .map(|address_id| HDAddressId { chain, address_id }); let empty_addresses = coin.derive_addresses(hd_account, address_ids) - .await? + .await.map_mm_err()? .into_iter() .map(|empty_address| HDAddressBalance { address: empty_address.address().display_address(), @@ -5988,7 +5988,7 @@ where chain, checking_address_id - unused_addresses_counter, ) - .await?; + .await.map_mm_err()?; Ok(balances) } diff --git a/mm2src/coins/lp_price.rs b/mm2src/coins/lp_price.rs index 1a720d3e3d..b47399811a 100644 --- a/mm2src/coins/lp_price.rs +++ b/mm2src/coins/lp_price.rs @@ -187,8 +187,10 @@ impl TickerInfosRegistry { #[cfg(not(target_arch = "wasm32"))] async fn process_price_request(price_url: &str) -> Result> { + use mm2_err_handle::prelude::MmResultExt; + debug!("Fetching price from: {}", price_url); - let (status, headers, body) = mm2_net::native_http::slurp_url(price_url).await?; + let (status, headers, body) = mm2_net::native_http::slurp_url(price_url).await.map_mm_err()?; let (status_code, body, _) = (status, std::str::from_utf8(&body)?.trim().into(), headers); if status_code != StatusCode::OK { return MmError::err(PriceServiceRequestError::HttpProcessError(body)); diff --git a/mm2src/coins/my_tx_history_v2.rs b/mm2src/coins/my_tx_history_v2.rs index e3570293eb..d1ecd6a411 100644 --- a/mm2src/coins/my_tx_history_v2.rs +++ b/mm2src/coins/my_tx_history_v2.rs @@ -369,7 +369,7 @@ pub async fn my_tx_history_v2_rpc( ctx: MmArc, request: MyTxHistoryRequestV2, ) -> Result, MmError> { - match lp_coinfind_or_err(&ctx, &request.coin).await? { + match lp_coinfind_or_err(&ctx, &request.coin).await.map_mm_err()? { MmCoinEnum::Bch(bch) => my_tx_history_v2_impl(ctx, &bch, request).await, MmCoinEnum::SlpToken(slp_token) => my_tx_history_v2_impl(ctx, &slp_token, request).await, MmCoinEnum::UtxoCoin(utxo) => my_tx_history_v2_impl(ctx, &utxo, request).await, @@ -391,7 +391,7 @@ where let tx_history_storage = TxHistoryStorageBuilder::new(&ctx).build().map_mm_err()?; let wallet_id = coin.history_wallet_id(); - let is_storage_init = tx_history_storage.is_initialized_for(&wallet_id).await?; + let is_storage_init = tx_history_storage.is_initialized_for(&wallet_id).await.map_mm_err()?; if !is_storage_init { let msg = format!("Storage is not initialized for {:?}", wallet_id); return MmError::err(MyTxHistoryErrorV2::StorageIsNotInitialized(msg)); @@ -405,7 +405,8 @@ where let filters = coin.get_tx_history_filters(request.target.clone()).await?; let history = tx_history_storage .get_history(&wallet_id, filters, request.paging_options.clone(), request.limit) - .await?; + .await + .map_mm_err()?; let coin_conf = coin_conf(&ctx, coin.ticker()); let protocol_type = coin_conf["protocol"]["type"].as_str().unwrap_or_default(); @@ -504,7 +505,7 @@ pub async fn z_coin_tx_history_rpc( ctx: MmArc, request: MyTxHistoryRequestV2, ) -> Result, MmError> { - match lp_coinfind_or_err(&ctx, &request.coin).await? { + match lp_coinfind_or_err(&ctx, &request.coin).await.map_mm_err()? { MmCoinEnum::ZCoin(z_coin) => z_coin.tx_history(request).await, other => MmError::err(MyTxHistoryErrorV2::NotSupportedFor(other.ticker().to_owned())), } diff --git a/mm2src/coins/nft.rs b/mm2src/coins/nft.rs index 8e903ad419..666c003d7b 100644 --- a/mm2src/coins/nft.rs +++ b/mm2src/coins/nft.rs @@ -1,6 +1,6 @@ use http::Uri; use mm2_core::mm_ctx::MmArc; -use mm2_err_handle::prelude::{MmError, MmResult}; +use mm2_err_handle::prelude::{MmError, MmResult, MmResultExt}; use mm2_p2p::p2p_ctx::P2PContext; use proxy_signature::{ProxySign, RawMessage}; use url::Url; @@ -89,15 +89,16 @@ pub type WithdrawNftResult = Result MmResult { let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal)?; - let storage = nft_ctx.lock_db().await?; + let storage = nft_ctx.lock_db().await.map_mm_err()?; for chain in req.chains.iter() { - if !NftListStorageOps::is_initialized(&storage, chain).await? { - NftListStorageOps::init(&storage, chain).await?; + if !NftListStorageOps::is_initialized(&storage, chain).await.map_mm_err()? { + NftListStorageOps::init(&storage, chain).await.map_mm_err()?; } } let mut nft_list = storage .get_nft_list(req.chains, req.max, req.limit, req.page_number, req.filters) - .await?; + .await + .map_mm_err()?; if req.protect_from_spam { for nft in &mut nft_list.nfts { protect_from_nft_spam_links(nft, true).map_mm_err()?; @@ -114,13 +115,17 @@ pub async fn get_nft_list(ctx: MmArc, req: NftListReq) -> MmResult MmResult { let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal)?; - let storage = nft_ctx.lock_db().await?; - if !NftListStorageOps::is_initialized(&storage, &req.chain).await? { - NftListStorageOps::init(&storage, &req.chain).await?; + let storage = nft_ctx.lock_db().await.map_mm_err()?; + if !NftListStorageOps::is_initialized(&storage, &req.chain) + .await + .map_mm_err()? + { + NftListStorageOps::init(&storage, &req.chain).await.map_mm_err()?; } let mut nft = storage .get_nft(&req.chain, format!("{:#02x}", req.token_address), req.token_id.clone()) - .await? + .await + .map_mm_err()? .ok_or_else(|| GetNftInfoError::TokenNotFoundInWallet { token_address: format!("{:#02x}", req.token_address), token_id: req.token_id.to_string(), @@ -154,24 +159,32 @@ pub async fn get_nft_metadata(ctx: MmArc, req: NftMetadataReq) -> MmResult MmResult { let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal)?; - let storage = nft_ctx.lock_db().await?; + let storage = nft_ctx.lock_db().await.map_mm_err()?; for chain in req.chains.iter() { - if !NftTransferHistoryStorageOps::is_initialized(&storage, chain).await? { - NftTransferHistoryStorageOps::init(&storage, chain).await?; + if !NftTransferHistoryStorageOps::is_initialized(&storage, chain) + .await + .map_mm_err()? + { + NftTransferHistoryStorageOps::init(&storage, chain).await.map_mm_err()?; } else { #[cfg(not(target_arch = "wasm32"))] - NftMigrationOps::migrate_tx_history_if_needed(&storage, chain).await?; + NftMigrationOps::migrate_tx_history_if_needed(&storage, chain) + .await + .map_mm_err()?; } } let mut transfer_history_list = storage .get_transfer_history(req.chains.clone(), req.max, req.limit, req.page_number, req.filters) - .await?; + .await + .map_mm_err()?; if req.protect_from_spam { for transfer in &mut transfer_history_list.transfer_history { protect_from_history_spam_links(transfer, true).map_mm_err()?; } } - process_transfers_confirmations(&ctx, req.chains, &mut transfer_history_list).await?; + process_transfers_confirmations(&ctx, req.chains, &mut transfer_history_list) + .await + .map_mm_err()?; Ok(transfer_history_list) } @@ -189,7 +202,7 @@ async fn process_transfers_confirmations( let futures = chains.into_iter().map(|chain| async move { let ticker = chain.to_ticker(); - let coin_enum = lp_coinfind_or_err(ctx, ticker).await?; + let coin_enum = lp_coinfind_or_err(ctx, ticker).await.map_mm_err()?; match coin_enum { MmCoinEnum::EthCoin(eth_coin) => { let current_block = current_block_impl(eth_coin).await?; @@ -222,7 +235,9 @@ async fn process_transfers_confirmations( /// data fetched from the provided `url`. The function ensures the local cache is in /// sync with the latest data from the source, validates against spam contract addresses and phishing domains. pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNftError> { - let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal).map_mm_err()?; + let nft_ctx = NftCtx::from_ctx(&ctx) + .map_to_mm(GetNftInfoError::Internal) + .map_mm_err()?; let p2p_ctx = P2PContext::fetch_from_mm_arc(&ctx); let storage = nft_ctx.lock_db().await?; @@ -238,7 +253,7 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft NftTransferHistoryStorageOps::init(&storage, chain).await?; None }; - let coin_enum = lp_coinfind_or_err(&ctx, chain.to_nft_ticker()).await?; + let coin_enum = lp_coinfind_or_err(&ctx, chain.to_nft_ticker()).await.map_mm_err()?; let global_nft = match coin_enum { MmCoinEnum::EthCoin(eth_coin) => eth_coin, _ => { @@ -247,7 +262,7 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft }) }, }; - let my_address = global_nft.derivation_method().single_addr_or_err().await?; + let my_address = global_nft.derivation_method().single_addr_or_err().await.map_mm_err()?; let my_address_str = my_address.addr_to_string(); let proxy_sign = if req.komodo_proxy { let uri = Uri::from_str(req.url.as_ref()).map_err(|e| UpdateNftError::Internal(e.to_string()))?; @@ -265,7 +280,9 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft proxy_sign, }; - let nft_transfers = get_moralis_nft_transfers(from_block, global_nft, &my_address_str, &wrapper).await?; + let nft_transfers = get_moralis_nft_transfers(from_block, global_nft, &my_address_str, &wrapper) + .await + .map_mm_err()?; storage.add_transfers_to_history(*chain, nft_transfers).await?; let nft_block = match NftListStorageOps::get_last_block_number(&storage, chain).await { @@ -275,8 +292,8 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft let nft_list = cache_nfts_from_moralis(&my_address_str, &storage, &wrapper).await?; update_meta_in_transfers(&storage, chain, nft_list).await?; update_transfers_with_empty_meta(&storage, &wrapper).await?; - update_spam(&storage, *chain, &req.url_antispam).await?; - update_phishing(&storage, chain, &req.url_antispam).await?; + update_spam(&storage, *chain, &req.url_antispam).await.map_mm_err()?; + update_phishing(&storage, chain, &req.url_antispam).await.map_mm_err()?; continue; }, Err(_) => { @@ -285,8 +302,8 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft let nft_list = cache_nfts_from_moralis(&my_address_str, &storage, &wrapper).await?; update_meta_in_transfers(&storage, chain, nft_list).await?; update_transfers_with_empty_meta(&storage, &wrapper).await?; - update_spam(&storage, *chain, &req.url_antispam).await?; - update_phishing(&storage, chain, &req.url_antispam).await?; + update_spam(&storage, *chain, &req.url_antispam).await.map_mm_err()?; + update_phishing(&storage, chain, &req.url_antispam).await.map_mm_err()?; continue; }, }; @@ -308,8 +325,8 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft update_nft_list(&storage, scanned_block + 1, &my_address_str, &wrapper).await?; update_nft_global_in_coins_ctx(&ctx, &storage, *chain).await?; update_transfers_with_empty_meta(&storage, &wrapper).await?; - update_spam(&storage, *chain, &req.url_antispam).await?; - update_phishing(&storage, chain, &req.url_antispam).await?; + update_spam(&storage, *chain, &req.url_antispam).await.map_mm_err()?; + update_phishing(&storage, chain, &req.url_antispam).await.map_mm_err()?; } Ok(()) } @@ -331,7 +348,10 @@ where .. }) = coins.get_mut(ticker) { - let nft_list = storage.get_nft_list(vec![chain], true, 1, None, None).await?; + let nft_list = storage + .get_nft_list(vec![chain], true, 1, None, None) + .await + .map_mm_err()?; update_nft_infos(nft_global, nft_list.nfts).await; return Ok(()); } @@ -376,7 +396,7 @@ async fn update_spam(storage: &T, chain: Chain, url_antispam: &Url) -> MmResu where T: NftListStorageOps + NftTransferHistoryStorageOps, { - let token_addresses = storage.get_token_addresses(chain).await?; + let token_addresses = storage.get_token_addresses(chain).await.map_mm_err()?; if !token_addresses.is_empty() { let addresses = token_addresses .iter() @@ -389,10 +409,12 @@ where let address_hex = address.addr_to_string(); storage .update_nft_spam_by_token_address(&chain, address_hex.clone(), is_spam) - .await?; + .await + .map_mm_err()?; storage .update_transfer_spam_by_token_address(&chain, address_hex, is_spam) - .await?; + .await + .map_mm_err()?; } } } @@ -403,8 +425,8 @@ async fn update_phishing(storage: &T, chain: &Chain, url_antispam: &Url) -> M where T: NftListStorageOps + NftTransferHistoryStorageOps, { - let transfer_domains = storage.get_domains(chain).await?; - let nft_domains = storage.get_animation_external_domains(chain).await?; + let transfer_domains = storage.get_domains(chain).await.map_mm_err()?; + let nft_domains = storage.get_animation_external_domains(chain).await.map_mm_err()?; let domains: HashSet = transfer_domains.union(&nft_domains).cloned().collect(); if !domains.is_empty() { let domains = domains.into_iter().collect::>().join(","); @@ -413,10 +435,12 @@ where if is_phishing { storage .update_nft_phishing_by_domain(chain, domain.clone(), is_phishing) - .await?; + .await + .map_mm_err()?; storage .update_transfer_phishing_by_domain(chain, domain, is_phishing) - .await?; + .await + .map_mm_err()?; } } } @@ -435,7 +459,9 @@ async fn send_spam_request( addresses, }; let req_spam_json = serde_json::to_string(&req_spam)?; - let scan_contract_res = send_post_request_to_uri(scan_contract_uri.as_str(), req_spam_json).await?; + let scan_contract_res = send_post_request_to_uri(scan_contract_uri.as_str(), req_spam_json) + .await + .map_mm_err()?; let spam_res: SpamContractRes = serde_json::from_slice(&scan_contract_res)?; Ok(spam_res) } @@ -448,7 +474,9 @@ async fn send_phishing_request( let scan_contract_uri = prepare_uri_for_blocklist_endpoint(url_antispam, BLOCKLIST_DOMAIN, BLOCKLIST_SCAN)?; let req_phishing = PhishingDomainReq { domains }; let req_phishing_json = serde_json::to_string(&req_phishing)?; - let scan_domains_res = send_post_request_to_uri(scan_contract_uri.as_str(), req_phishing_json).await?; + let scan_domains_res = send_post_request_to_uri(scan_contract_uri.as_str(), req_phishing_json) + .await + .map_mm_err()?; let phishing_res: PhishingDomainRes = serde_json::from_slice(&scan_domains_res)?; Ok(phishing_res) } @@ -477,7 +505,9 @@ fn prepare_uri_for_blocklist_endpoint( /// is identified as spam or matches with any phishing domains, the NFT's `possible_spam` and/or /// `possible_phishing` flags are set to true. pub async fn refresh_nft_metadata(ctx: MmArc, req: RefreshMetadataReq) -> MmResult<(), UpdateNftError> { - let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(GetNftInfoError::Internal).map_mm_err()?; + let nft_ctx = NftCtx::from_ctx(&ctx) + .map_to_mm(GetNftInfoError::Internal) + .map_mm_err()?; let p2p_ctx = P2PContext::fetch_from_mm_arc(&ctx); let storage = nft_ctx.lock_db().await?; @@ -562,7 +592,8 @@ where let transfer_meta = TransferMeta::from(nft.clone()); storage .update_transfers_meta_by_token_addr_id(chain, transfer_meta, nft.common.possible_spam) - .await?; + .await + .map_mm_err()?; Ok(()) } @@ -595,15 +626,19 @@ where T: NftListStorageOps + NftTransferHistoryStorageOps, { let address_hex = nft_db.common.token_address.addr_to_string(); - let spam_res = send_spam_request(chain, url_antispam, address_hex.clone()).await?; + let spam_res = send_spam_request(chain, url_antispam, address_hex.clone()) + .await + .map_mm_err()?; if let Some(true) = spam_res.result.get(&nft_db.common.token_address) { nft_db.common.possible_spam = true; storage .update_nft_spam_by_token_address(chain, address_hex.clone(), true) - .await?; + .await + .map_mm_err()?; storage .update_transfer_spam_by_token_address(chain, address_hex, true) - .await?; + .await + .map_mm_err()?; } Ok(()) } @@ -621,16 +656,18 @@ where { if !domains.is_empty() { let domain_list = domains.into_iter().collect::>().join(","); - let domain_res = send_phishing_request(url_antispam, domain_list).await?; + let domain_res = send_phishing_request(url_antispam, domain_list).await.map_mm_err()?; for (domain, is_phishing) in domain_res.result.into_iter() { if is_phishing { nft_db.possible_phishing = true; storage .update_transfer_phishing_by_domain(chain, domain.clone(), is_phishing) - .await?; + .await + .map_mm_err()?; storage .update_nft_phishing_by_domain(chain, domain, is_phishing) - .await?; + .await + .map_mm_err()?; } } } @@ -988,7 +1025,7 @@ fn construct_camo_url_with_token(token_uri: &str, url_antispam: &Url) -> Option< } async fn fetch_meta_from_url(url: Url) -> MmResult { - let response_meta = send_request_to_uri(url.as_str(), None).await?; + let response_meta = send_request_to_uri(url.as_str(), None).await.map_mm_err()?; serde_json::from_value(response_meta).map_err(|e| e.into()) } @@ -1019,7 +1056,10 @@ async fn update_nft_list( wrapper: &UrlSignWrapper<'_>, ) -> MmResult<(), UpdateNftError> { let chain = wrapper.chain; - let transfers = storage.get_transfers_from_block(*chain, scan_from_block).await?; + let transfers = storage + .get_transfers_from_block(*chain, scan_from_block) + .await + .map_mm_err()?; for transfer in transfers.into_iter() { handle_nft_transfer(storage, wrapper, transfer, wallet_address).await?; } @@ -1056,7 +1096,8 @@ async fn handle_send_erc721 transfer.common.token_address.addr_to_string(), transfer.token_id.clone(), ) - .await? + .await + .map_mm_err()? .ok_or_else(|| UpdateNftError::TokenNotFoundInWallet { token_address: transfer.common.token_address.addr_to_string(), token_id: transfer.token_id.to_string(), @@ -1068,7 +1109,8 @@ async fn handle_send_erc721 transfer.token_id, transfer.block_number, ) - .await?; + .await + .map_mm_err()?; Ok(()) } @@ -1082,7 +1124,8 @@ async fn handle_receive_erc721 { // An error is raised if user tries to receive an identical ERC-721 token they already own @@ -1095,7 +1138,8 @@ async fn handle_receive_erc721 { @@ -1116,7 +1160,8 @@ async fn handle_receive_erc721 { storage .remove_nft_from_list(chain, token_address_str, transfer.token_id, transfer.block_number) - .await?; + .await + .map_mm_err()?; }, Ordering::Greater => { nft_db.common.amount -= transfer.common.amount; storage .update_nft_amount(chain, nft_db.clone(), transfer.block_number) - .await?; + .await + .map_mm_err()?; }, Ordering::Less => { return MmError::err(UpdateNftError::InsufficientAmountInCache { @@ -1168,7 +1216,8 @@ async fn handle_receive_erc1155 { // if owner address == from address, then owner sent tokens to themself, @@ -1180,7 +1229,8 @@ async fn handle_receive_erc1155 MmResult { storage .update_nft_spam_by_token_address(chain, token_address_str.clone(), true) - .await?; + .await + .map_mm_err()?; storage .update_transfer_spam_by_token_address(chain, token_address_str, true) - .await?; + .await + .map_mm_err()?; Ok(build_nft_with_empty_meta(BuildNftFields { token_address: transfer.common.token_address, @@ -1290,13 +1343,15 @@ async fn cache_nfts_from_moralis, ) -> MmResult, UpdateNftError> { - let nft_list = get_moralis_nft_list(wallet_address, wrapper).await?; + let nft_list = get_moralis_nft_list(wallet_address, wrapper).await.map_mm_err()?; let last_scanned_block = NftTransferHistoryStorageOps::get_last_block_number(storage, wrapper.chain) - .await? + .await + .map_mm_err()? .unwrap_or(0); storage .add_nfts_to_list(*wrapper.chain, nft_list.clone(), last_scanned_block) - .await?; + .await + .map_mm_err()?; Ok(nft_list) } @@ -1317,7 +1372,7 @@ where T: NftListStorageOps + NftTransferHistoryStorageOps, { let chain = wrapper.chain; - let token_addr_id = storage.get_transfers_with_empty_meta(*chain).await?; + let token_addr_id = storage.get_transfers_with_empty_meta(*chain).await.map_mm_err()?; for addr_id_pair in token_addr_id.into_iter() { let mut nft_meta = match get_moralis_metadata(addr_id_pair.token_address.clone(), addr_id_pair.token_id, wrapper).await { @@ -1325,10 +1380,12 @@ where Err(_) => { storage .update_nft_spam_by_token_address(chain, addr_id_pair.token_address.clone(), true) - .await?; + .await + .map_mm_err()?; storage .update_transfer_spam_by_token_address(chain, addr_id_pair.token_address, true) - .await?; + .await + .map_mm_err()?; continue; }, }; @@ -1506,9 +1563,9 @@ pub(crate) fn get_domain_from_url(url: Option<&str>) -> Option { pub async fn clear_nft_db(ctx: MmArc, req: ClearNftDbReq) -> MmResult<(), ClearNftDbError> { if req.clear_all { let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(ClearNftDbError::Internal)?; - let storage = nft_ctx.lock_db().await?; - storage.clear_all_nft_data().await?; - storage.clear_all_history_data().await?; + let storage = nft_ctx.lock_db().await.map_mm_err()?; + storage.clear_all_nft_data().await.map_mm_err()?; + storage.clear_all_history_data().await.map_mm_err()?; return Ok(()); } @@ -1519,7 +1576,7 @@ pub async fn clear_nft_db(ctx: MmArc, req: ClearNftDbReq) -> MmResult<(), ClearN } let nft_ctx = NftCtx::from_ctx(&ctx).map_to_mm(ClearNftDbError::Internal)?; - let storage = nft_ctx.lock_db().await?; + let storage = nft_ctx.lock_db().await.map_mm_err()?; let mut errors = Vec::new(); for chain in req.chains.iter() { if let Err(e) = clear_data_for_chain(&storage, chain).await { @@ -1538,14 +1595,16 @@ where T: NftListStorageOps + NftTransferHistoryStorageOps, { let (is_nft_list_init, is_history_init) = ( - NftListStorageOps::is_initialized(storage, chain).await?, - NftTransferHistoryStorageOps::is_initialized(storage, chain).await?, + NftListStorageOps::is_initialized(storage, chain).await.map_mm_err()?, + NftTransferHistoryStorageOps::is_initialized(storage, chain) + .await + .map_mm_err()?, ); if is_nft_list_init { - storage.clear_nft_data(chain).await?; + storage.clear_nft_data(chain).await.map_mm_err()?; } if is_history_init { - storage.clear_history_data(chain).await?; + storage.clear_history_data(chain).await.map_mm_err()?; } Ok(()) } @@ -1574,6 +1633,6 @@ struct UrlSignWrapper<'a> { async fn build_and_send_request(uri: &str, proxy_sign: &Option) -> MmResult { let payload = proxy_sign.as_ref().map(|msg| serde_json::to_string(&msg)).transpose()?; - let response = send_request_to_uri(uri, payload.as_deref()).await?; + let response = send_request_to_uri(uri, payload.as_deref()).await.map_mm_err()?; Ok(response) } diff --git a/mm2src/coins/qrc20.rs b/mm2src/coins/qrc20.rs index 52dab25504..dd992dcce2 100644 --- a/mm2src/coins/qrc20.rs +++ b/mm2src/coins/qrc20.rs @@ -518,8 +518,8 @@ impl Qrc20Coin { &self, contract_outputs: Vec, ) -> Result> { - let my_address = self.utxo.derivation_method.single_addr_or_err().await?; - let (unspents, _) = self.get_unspent_ordered_list(&my_address).await?; + let my_address = self.utxo.derivation_method.single_addr_or_err().await.map_mm_err()?; + let (unspents, _) = self.get_unspent_ordered_list(&my_address).await.map_mm_err()?; let mut gas_fee = 0; let mut outputs = Vec::with_capacity(contract_outputs.len()); @@ -534,7 +534,8 @@ impl Qrc20Coin { .add_outputs(outputs) .with_gas_fee(gas_fee) .build() - .await?; + .await + .map_mm_err()?; let key_pair = self.utxo.priv_key_policy.activated_key_or_err().map_mm_err()?; @@ -543,7 +544,8 @@ impl Qrc20Coin { key_pair, self.utxo.conf.signature_version, self.utxo.conf.fork_id, - ).map_mm_err()?; + ) + .map_mm_err()?; let miner_fee = data.fee_amount + data.unused_change; Ok(GenerateQrc20TxResult { @@ -1379,7 +1381,7 @@ async fn qrc20_withdraw(coin: Qrc20Coin, req: WithdrawRequest) -> WithdrawResult let _utxo_lock = UTXO_LOCK.lock().await; - let qrc20_balance = coin.my_spendable_balance().compat().await?; + let qrc20_balance = coin.my_spendable_balance().compat().await.map_mm_err()?; // the qrc20_amount_sat is used only within smart contract calls let (qrc20_amount_sat, qrc20_amount) = if req.max { @@ -1411,7 +1413,9 @@ async fn qrc20_withdraw(coin: Qrc20Coin, req: WithdrawRequest) -> WithdrawResult // [`Qrc20Coin::transfer_output`] shouldn't fail if the arguments are correct let contract_addr = qtum::contract_addr_from_utxo_addr(to_addr.clone()).map_mm_err()?; - let transfer_output = coin.transfer_output(contract_addr, qrc20_amount_sat, gas_limit, gas_price).map_mm_err()?; + let transfer_output = coin + .transfer_output(contract_addr, qrc20_amount_sat, gas_limit, gas_price) + .map_mm_err()?; let outputs = vec![transfer_output]; let GenerateQrc20TxResult { @@ -1423,7 +1427,7 @@ async fn qrc20_withdraw(coin: Qrc20Coin, req: WithdrawRequest) -> WithdrawResult .await .mm_err(|gen_tx_error| gen_tx_error.into_withdraw_error(coin.platform.clone(), coin.utxo.decimals))?; - let my_address = coin.utxo.derivation_method.single_addr_or_err().await?; + let my_address = coin.utxo.derivation_method.single_addr_or_err().await.map_mm_err()?; let received_by_me = if to_addr == my_address { qrc20_amount.clone() } else { diff --git a/mm2src/coins/qrc20/swap.rs b/mm2src/coins/qrc20/swap.rs index 4c07735ebc..18e371bbdf 100644 --- a/mm2src/coins/qrc20/swap.rs +++ b/mm2src/coins/qrc20/swap.rs @@ -126,7 +126,8 @@ impl Qrc20Coin { let expected_swap_id = qrc20_swap_id(time_lock, &secret_hash); let status = self .payment_status(&expected_swap_contract_address, expected_swap_id.clone()) - .await?; + .await + .map_mm_err()?; if status != U256::from(PaymentState::Sent as u8) { return MmError::err(ValidatePaymentError::UnexpectedPaymentState(format!( "Payment state is not PAYMENT_STATE_SENT, got {}", @@ -136,7 +137,7 @@ impl Qrc20Coin { let expected_call_bytes = { let expected_value = wei_from_big_decimal(&amount, self.utxo.decimals).map_mm_err()?; - let my_address = self.utxo.derivation_method.single_addr_or_err().await?; + let my_address = self.utxo.derivation_method.single_addr_or_err().await.map_mm_err()?; let expected_receiver = qtum::contract_addr_from_utxo_addr(my_address) .mm_err(|err| ValidatePaymentError::InternalError(err.to_string()))?; self.erc20_payment_call_bytes( @@ -145,7 +146,8 @@ impl Qrc20Coin { time_lock, &secret_hash, expected_receiver, - ).map_mm_err()? + ) + .map_mm_err()? }; let erc20_payment = self .erc20_payment_details_from_tx(&payment_tx) @@ -461,14 +463,17 @@ impl Qrc20Coin { } // when this output is executed, the allowance will be sufficient already - outputs.push(self.erc20_payment_output( - id, - value, - time_lock, - &secret_hash, - receiver_addr, - &swap_contract_address, - ).map_mm_err()?); + outputs.push( + self.erc20_payment_output( + id, + value, + time_lock, + &secret_hash, + receiver_addr, + &swap_contract_address, + ) + .map_mm_err()?, + ); Ok(outputs) } diff --git a/mm2src/coins/rpc_command/account_balance.rs b/mm2src/coins/rpc_command/account_balance.rs index d530a22fe7..f3f224ef73 100644 --- a/mm2src/coins/rpc_command/account_balance.rs +++ b/mm2src/coins/rpc_command/account_balance.rs @@ -62,7 +62,7 @@ pub async fn account_balance( ctx: MmArc, req: HDAccountBalanceRequest, ) -> MmResult { - match lp_coinfind_or_err(&ctx, &req.coin).await? { + match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::UtxoCoin(utxo) => Ok(HDAccountBalanceResponseEnum::Map( utxo.account_balance_rpc(req.params).await?, )), @@ -93,7 +93,8 @@ pub mod common_impl { let account_id = params.account_index; let hd_account = coin .derivation_method() - .hd_wallet_or_err().map_mm_err()? + .hd_wallet_or_err() + .map_mm_err()? .get_account(account_id) .await .or_mm_err(|| HDAccountBalanceRpcError::UnknownAccount { account_id })?; @@ -107,7 +108,8 @@ pub mod common_impl { let addresses = coin .known_addresses_balances_with_ids(&hd_account, params.chain, from_address_id..to_address_id) - .await?; + .await + .map_mm_err()?; let page_balance = addresses .iter() diff --git a/mm2src/coins/rpc_command/get_current_mtp.rs b/mm2src/coins/rpc_command/get_current_mtp.rs index 24b4f563b9..6db7b5b59a 100644 --- a/mm2src/coins/rpc_command/get_current_mtp.rs +++ b/mm2src/coins/rpc_command/get_current_mtp.rs @@ -1,7 +1,7 @@ use common::{HttpStatusCode, StatusCode}; use derive_more::Display; use mm2_core::mm_ctx::MmArc; -use mm2_err_handle::prelude::MmError; +use mm2_err_handle::prelude::*; use crate::{lp_coinfind_or_err, utxo::{rpc_clients::UtxoRpcError, UtxoCommonOps}, @@ -50,22 +50,22 @@ pub async fn get_current_mtp_rpc( ctx: MmArc, req: GetCurrentMtpRequest, ) -> GetCurrentMtpRpcResult { - match lp_coinfind_or_err(&ctx, &req.coin).await? { + match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::UtxoCoin(utxo) => Ok(GetCurrentMtpResponse { - mtp: utxo.get_current_mtp().await?, + mtp: utxo.get_current_mtp().await.map_mm_err()?, }), MmCoinEnum::QtumCoin(qtum) => Ok(GetCurrentMtpResponse { - mtp: qtum.get_current_mtp().await?, + mtp: qtum.get_current_mtp().await.map_mm_err()?, }), MmCoinEnum::Qrc20Coin(qrc) => Ok(GetCurrentMtpResponse { - mtp: qrc.get_current_mtp().await?, + mtp: qrc.get_current_mtp().await.map_mm_err()?, }), #[cfg(not(target_arch = "wasm32"))] MmCoinEnum::ZCoin(zcoin) => Ok(GetCurrentMtpResponse { - mtp: zcoin.get_current_mtp().await?, + mtp: zcoin.get_current_mtp().await.map_mm_err()?, }), MmCoinEnum::Bch(bch) => Ok(GetCurrentMtpResponse { - mtp: bch.get_current_mtp().await?, + mtp: bch.get_current_mtp().await.map_mm_err()?, }), _ => Err(MmError::new(GetCurrentMtpError::NotSupportedCoin(req.coin))), } diff --git a/mm2src/coins/rpc_command/get_new_address.rs b/mm2src/coins/rpc_command/get_new_address.rs index b9d3021975..9e3ac924fc 100644 --- a/mm2src/coins/rpc_command/get_new_address.rs +++ b/mm2src/coins/rpc_command/get_new_address.rs @@ -360,7 +360,7 @@ pub async fn get_new_address( ctx: MmArc, req: GetNewAddressRequest, ) -> MmResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; match coin { MmCoinEnum::UtxoCoin(utxo) => Ok(GetNewAddressResponseEnum::Map( utxo.get_new_address_rpc_without_conf(req.params).await?, @@ -382,7 +382,7 @@ pub async fn init_get_new_address( req: RpcInitReq, ) -> MmResult { let (client_id, req) = (req.client_id, req.inner); - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(GetNewAddressRpcError::Internal)?; let spawner = coin.spawner(); let task = InitGetNewAddressTask { ctx, coin, req }; @@ -468,9 +468,9 @@ pub(crate) mod common_impl { let hd_address = coin .generate_new_address(hd_wallet, hd_account.deref_mut(), chain) - .await?; + .await.map_mm_err()?; let address = hd_address.address(); - let balance = coin.known_address_balance(&address).await?; + let balance = coin.known_address_balance(&address).await.map_mm_err()?; Ok(GetNewAddressResponse { new_address: HDAddressBalance { @@ -508,9 +508,9 @@ pub(crate) mod common_impl { let hd_address = coin .generate_and_confirm_new_address(hd_wallet, &mut hd_account, chain, confirm_address) - .await?; + .await.map_mm_err()?; let address = hd_address.address(); - let balance = coin.known_address_balance(&address).await?; + let balance = coin.known_address_balance(&address).await.map_mm_err()?; let formatted_address = address.display_address(); coin.prepare_addresses_for_balance_stream_if_enabled(HashSet::from([formatted_address.clone()])) @@ -547,7 +547,7 @@ pub(crate) mod common_impl { return MmError::err(GetNewAddressRpcError::AddressLimitReached { max_addresses_number }); } - let address_scanner = coin.produce_hd_address_scanner().await?; + let address_scanner = coin.produce_hd_address_scanner().await.map_mm_err()?; // Address IDs start from 0, so the `last_known_address_id = known_addresses_number - 1`. // At this point we are sure that `known_addresses_number > 0`. @@ -555,7 +555,7 @@ pub(crate) mod common_impl { for address_id in (0..=last_address_id).rev() { let address = coin.derive_address(hd_account, chain, address_id).await?.address(); - if address_scanner.is_address_used(&address).await? { + if address_scanner.is_address_used(&address).await.map_mm_err()? { return Ok(()); } diff --git a/mm2src/coins/rpc_command/init_account_balance.rs b/mm2src/coins/rpc_command/init_account_balance.rs index f8603313e2..01ed49193f 100644 --- a/mm2src/coins/rpc_command/init_account_balance.rs +++ b/mm2src/coins/rpc_command/init_account_balance.rs @@ -93,7 +93,7 @@ pub async fn init_account_balance( req: RpcInitReq, ) -> MmResult { let (client_id, req) = (req.client_id, req.inner); - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let spawner = coin.spawner(); let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(HDAccountBalanceRpcError::Internal)?; let task = InitAccountBalanceTask { coin, req }; @@ -153,7 +153,7 @@ pub mod common_impl { .await .or_mm_err(|| HDAccountBalanceRpcError::UnknownAccount { account_id })?; - let addresses = coin.all_known_addresses_balances(&hd_account).await?; + let addresses = coin.all_known_addresses_balances(&hd_account).await.map_mm_err()?; let total_balance = addresses .iter() diff --git a/mm2src/coins/rpc_command/init_create_account.rs b/mm2src/coins/rpc_command/init_create_account.rs index 628eeb91c4..630b3e931c 100644 --- a/mm2src/coins/rpc_command/init_create_account.rs +++ b/mm2src/coins/rpc_command/init_create_account.rs @@ -332,7 +332,7 @@ pub async fn init_create_new_account( req: RpcInitReq, ) -> MmResult { let (client_id, req) = (req.client_id, req.inner); - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(CreateAccountRpcError::Internal)?; let spawner = coin.spawner(); let task = InitCreateAccountTask { @@ -409,7 +409,7 @@ pub(crate) mod common_impl { { let hd_wallet = coin.derivation_method().hd_wallet_or_err().map_mm_err()?; - let mut new_account = create_new_account(coin, hd_wallet, xpub_extractor, params.account_id).await?; + let mut new_account = create_new_account(coin, hd_wallet, xpub_extractor, params.account_id).await.map_mm_err()?; let account_index = new_account.account_id(); let account_derivation_path = new_account.account_derivation_path(); @@ -418,9 +418,9 @@ pub(crate) mod common_impl { let addresses = if params.scan { let gap_limit = params.gap_limit.unwrap_or_else(|| hd_wallet.gap_limit()); - let address_scanner = coin.produce_hd_address_scanner().await?; + let address_scanner = coin.produce_hd_address_scanner().await.map_mm_err()?; coin.scan_for_new_addresses(hd_wallet, &mut new_account, &address_scanner, gap_limit) - .await? + .await.map_mm_err()? } else { Vec::new() }; diff --git a/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs b/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs index a05b6c5dd4..7c34e557ae 100644 --- a/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs +++ b/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs @@ -112,7 +112,7 @@ pub async fn init_scan_for_new_addresses( req: RpcInitReq, ) -> MmResult { let (client_id, req) = (req.client_id, req.inner); - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let spawner = coin.spawner(); let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(HDAccountBalanceRpcError::Internal)?; let task = InitScanAddressesTask { req, coin }; @@ -171,12 +171,12 @@ pub mod common_impl { .await .or_mm_err(|| HDAccountBalanceRpcError::CoinIsActivatedNotWithHDWallet)?; let account_derivation_path = hd_account.account_derivation_path(); - let address_scanner = coin.produce_hd_address_scanner().await?; + let address_scanner = coin.produce_hd_address_scanner().await.map_mm_err()?; let gap_limit = params.gap_limit.unwrap_or_else(|| hd_wallet.gap_limit()); let new_addresses = coin .scan_for_new_addresses(hd_wallet, hd_account.deref_mut(), &address_scanner, gap_limit) - .await?; + .await.map_mm_err()?; let addresses: HashSet<_> = new_addresses .iter() diff --git a/mm2src/coins/rpc_command/init_withdraw.rs b/mm2src/coins/rpc_command/init_withdraw.rs index bff70675d0..a26ec65025 100644 --- a/mm2src/coins/rpc_command/init_withdraw.rs +++ b/mm2src/coins/rpc_command/init_withdraw.rs @@ -38,7 +38,7 @@ pub async fn init_withdraw( request: RpcInitReq, ) -> WithdrawInitResult { let (client_id, request) = (request.client_id, request.inner); - let coin = lp_coinfind_or_err(&ctx, &request.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &request.coin).await.map_mm_err()?; let spawner = coin.spawner(); let task = WithdrawTask { ctx: ctx.clone(), diff --git a/mm2src/coins/rpc_command/lightning/close_channel.rs b/mm2src/coins/rpc_command/lightning/close_channel.rs index 716b7db969..cbcb237582 100644 --- a/mm2src/coins/rpc_command/lightning/close_channel.rs +++ b/mm2src/coins/rpc_command/lightning/close_channel.rs @@ -47,7 +47,7 @@ pub struct CloseChannelReq { } pub async fn close_channel(ctx: MmArc, req: CloseChannelReq) -> CloseChannelResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(CloseChannelError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/connect_to_node.rs b/mm2src/coins/rpc_command/lightning/connect_to_node.rs index 79ba0f1889..ab776cb49e 100644 --- a/mm2src/coins/rpc_command/lightning/connect_to_node.rs +++ b/mm2src/coins/rpc_command/lightning/connect_to_node.rs @@ -68,7 +68,7 @@ pub struct ConnectToNodeRequest { /// Connect to a certain node on the lightning network. pub async fn connect_to_node(ctx: MmArc, req: ConnectToNodeRequest) -> ConnectToNodeResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(ConnectToNodeError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/generate_invoice.rs b/mm2src/coins/rpc_command/lightning/generate_invoice.rs index 83d0fc41f6..051402b44c 100644 --- a/mm2src/coins/rpc_command/lightning/generate_invoice.rs +++ b/mm2src/coins/rpc_command/lightning/generate_invoice.rs @@ -75,7 +75,7 @@ pub async fn generate_invoice( ctx: MmArc, req: GenerateInvoiceRequest, ) -> GenerateInvoiceResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(GenerateInvoiceError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/get_channel_details.rs b/mm2src/coins/rpc_command/lightning/get_channel_details.rs index c96cf06e57..f806c0e916 100644 --- a/mm2src/coins/rpc_command/lightning/get_channel_details.rs +++ b/mm2src/coins/rpc_command/lightning/get_channel_details.rs @@ -62,7 +62,7 @@ pub async fn get_channel_details( ctx: MmArc, req: GetChannelDetailsRequest, ) -> GetChannelDetailsResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(GetChannelDetailsError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs b/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs index 5d1b84dad1..511892a1cd 100644 --- a/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs +++ b/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs @@ -44,7 +44,7 @@ pub async fn get_claimable_balances( ctx: MmArc, req: ClaimableBalancesReq, ) -> ClaimableBalancesResult> { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(ClaimableBalancesError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/get_payment_details.rs b/mm2src/coins/rpc_command/lightning/get_payment_details.rs index 0e7a4868c2..7823e04b5f 100644 --- a/mm2src/coins/rpc_command/lightning/get_payment_details.rs +++ b/mm2src/coins/rpc_command/lightning/get_payment_details.rs @@ -61,7 +61,7 @@ pub async fn get_payment_details( ctx: MmArc, req: GetPaymentDetailsRequest, ) -> GetPaymentDetailsResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(GetPaymentDetailsError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/list_channels.rs b/mm2src/coins/rpc_command/lightning/list_channels.rs index d3eb582633..3c857f2e0f 100644 --- a/mm2src/coins/rpc_command/lightning/list_channels.rs +++ b/mm2src/coins/rpc_command/lightning/list_channels.rs @@ -68,7 +68,7 @@ pub async fn list_open_channels_by_filter( ctx: MmArc, req: ListOpenChannelsRequest, ) -> ListChannelsResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(ListChannelsError::UnsupportedCoin(e.ticker().to_string())), }; @@ -111,7 +111,7 @@ pub async fn list_closed_channels_by_filter( ctx: MmArc, req: ListClosedChannelsRequest, ) -> ListChannelsResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(ListChannelsError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs b/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs index 0a6d0d3308..05f3a6a4f0 100644 --- a/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs +++ b/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs @@ -64,7 +64,7 @@ pub struct ListPaymentsResponse { } pub async fn list_payments_by_filter(ctx: MmArc, req: ListPaymentsReq) -> ListPaymentsResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(ListPaymentsError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/open_channel.rs b/mm2src/coins/rpc_command/lightning/open_channel.rs index bccf16ea90..fe7b3f454b 100644 --- a/mm2src/coins/rpc_command/lightning/open_channel.rs +++ b/mm2src/coins/rpc_command/lightning/open_channel.rs @@ -134,7 +134,7 @@ pub struct OpenChannelResponse { /// Opens a channel on the lightning network. pub async fn open_channel(ctx: MmArc, req: OpenChannelRequest) -> OpenChannelResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(OpenChannelError::UnsupportedCoin(e.ticker().to_string())), }; @@ -146,8 +146,8 @@ pub async fn open_channel(ctx: MmArc, req: OpenChannelRequest) -> OpenChannelRes let platform_coin = ln_coin.platform_coin().clone(); let decimals = platform_coin.as_ref().decimals; - let my_address = platform_coin.as_ref().derivation_method.single_addr_or_err().await?; - let (unspents, _) = platform_coin.get_unspent_ordered_list(&my_address).await?; + let my_address = platform_coin.as_ref().derivation_method.single_addr_or_err().await.map_mm_err()?; + let (unspents, _) = platform_coin.get_unspent_ordered_list(&my_address).await.map_mm_err()?; let (value, fee_policy) = match req.amount.clone() { ChannelOpenAmount::Max => ( unspents.iter().fold(0, |sum, unspent| sum + unspent.value), @@ -179,7 +179,7 @@ pub async fn open_channel(ctx: MmArc, req: OpenChannelRequest) -> OpenChannelRes .map_err(|e| OpenChannelError::RpcError(e.to_string()))?; tx_builder = tx_builder.with_fee(fee); - let (unsigned, _) = tx_builder.build().await?; + let (unsigned, _) = tx_builder.build().await.map_mm_err()?; let amount_in_sat = unsigned.outputs[0].value; let push_msat = req.push_msat; diff --git a/mm2src/coins/rpc_command/lightning/send_payment.rs b/mm2src/coins/rpc_command/lightning/send_payment.rs index 3efde180d4..0d3250c99c 100644 --- a/mm2src/coins/rpc_command/lightning/send_payment.rs +++ b/mm2src/coins/rpc_command/lightning/send_payment.rs @@ -85,7 +85,7 @@ pub struct SendPaymentResponse { } pub async fn send_payment(ctx: MmArc, req: SendPaymentReq) -> SendPaymentResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(SendPaymentError::UnsupportedCoin(e.ticker().to_string())), }; @@ -99,12 +99,12 @@ pub async fn send_payment(ctx: MmArc, req: SendPaymentReq) -> SendPaymentResult< )); } let payment_info = match req.payment { - Payment::Invoice { invoice } => ln_coin.pay_invoice(invoice, None).await?, + Payment::Invoice { invoice } => ln_coin.pay_invoice(invoice, None).await.map_mm_err()?, Payment::Keysend { destination, amount_in_msat, expiry, - } => ln_coin.keysend(destination.into(), amount_in_msat, expiry).await?, + } => ln_coin.keysend(destination.into(), amount_in_msat, expiry).await.map_mm_err()?, }; Ok(SendPaymentResponse { diff --git a/mm2src/coins/rpc_command/lightning/trusted_nodes.rs b/mm2src/coins/rpc_command/lightning/trusted_nodes.rs index 6f0f2fd36e..5527215def 100644 --- a/mm2src/coins/rpc_command/lightning/trusted_nodes.rs +++ b/mm2src/coins/rpc_command/lightning/trusted_nodes.rs @@ -53,7 +53,7 @@ pub struct AddTrustedNodeResponse { } pub async fn add_trusted_node(ctx: MmArc, req: AddTrustedNodeReq) -> TrustedNodeResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(TrustedNodeError::UnsupportedCoin(e.ticker().to_string())), }; @@ -82,7 +82,7 @@ pub async fn remove_trusted_node( ctx: MmArc, req: RemoveTrustedNodeReq, ) -> TrustedNodeResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(TrustedNodeError::UnsupportedCoin(e.ticker().to_string())), }; @@ -107,7 +107,7 @@ pub struct ListTrustedNodesResponse { } pub async fn list_trusted_nodes(ctx: MmArc, req: ListTrustedNodesReq) -> TrustedNodeResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(TrustedNodeError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/lightning/update_channel.rs b/mm2src/coins/rpc_command/lightning/update_channel.rs index ad7768831f..57b772764c 100644 --- a/mm2src/coins/rpc_command/lightning/update_channel.rs +++ b/mm2src/coins/rpc_command/lightning/update_channel.rs @@ -53,7 +53,7 @@ pub struct UpdateChannelResponse { /// Updates configuration for an open channel. pub async fn update_channel(ctx: MmArc, req: UpdateChannelReq) -> UpdateChannelResult { - let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await? { + let ln_coin = match lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()? { MmCoinEnum::LightningCoin(c) => c, e => return MmError::err(UpdateChannelError::UnsupportedCoin(e.ticker().to_string())), }; diff --git a/mm2src/coins/rpc_command/tendermint/staking.rs b/mm2src/coins/rpc_command/tendermint/staking.rs index 8a83e0e6cc..371cc02075 100644 --- a/mm2src/coins/rpc_command/tendermint/staking.rs +++ b/mm2src/coins/rpc_command/tendermint/staking.rs @@ -1,6 +1,6 @@ use common::PagingOptions; use cosmrs::staking::{Commission, Description, Validator}; -use mm2_err_handle::prelude::MmError; +use mm2_err_handle::prelude::{MmError, MmResultExt}; use mm2_number::BigDecimal; use crate::{hd_wallet::WithdrawFrom, tendermint::TendermintCoinRpcError, MmCoinEnum, StakingInfoError, WithdrawFee}; @@ -108,13 +108,15 @@ pub async fn validators_rpc( } let validators = match coin { - MmCoinEnum::Tendermint(coin) => coin.validators_list(req.filter_by_status, req.paging).await?, - MmCoinEnum::TendermintToken(token) => { - token - .platform_coin - .validators_list(req.filter_by_status, req.paging) - .await? - }, + MmCoinEnum::Tendermint(coin) => coin + .validators_list(req.filter_by_status, req.paging) + .await + .map_mm_err()?, + MmCoinEnum::TendermintToken(token) => token + .platform_coin + .validators_list(req.filter_by_status, req.paging) + .await + .map_mm_err()?, other => { return MmError::err(StakingInfoError::InvalidPayload { reason: format!("{} is not a Cosmos coin", other.ticker()), diff --git a/mm2src/coins/tendermint/tendermint_coin.rs b/mm2src/coins/tendermint/tendermint_coin.rs index 8d20948cbc..7d7bbd7273 100644 --- a/mm2src/coins/tendermint/tendermint_coin.rs +++ b/mm2src/coins/tendermint/tendermint_coin.rs @@ -796,7 +796,7 @@ impl TendermintCoin { target_address: target_address.to_string(), })?; - let channel = self.query_ibc_channel(channel_id, "transfer").await?; + let channel = self.query_ibc_channel(channel_id, "transfer").await.map_mm_err()?; // TODO: Extend the validation logic to also include: // @@ -1841,7 +1841,7 @@ impl TendermintCoin { } let hash = hex::encode_upper(sha256(&input.payment_tx).as_slice()); - let tx_from_rpc = self.request_tx(hash).await?; + let tx_from_rpc = self.request_tx(hash).await.map_mm_err()?; if input.payment_tx != tx_from_rpc.encode_to_vec() { return MmError::err(ValidatePaymentError::InvalidRpcResponse( "Tx from RPC doesn't match the input".into(), @@ -1850,7 +1850,7 @@ impl TendermintCoin { let htlc_id = self.calculate_htlc_id(&sender, &self.account_id, &amount, &input.secret_hash); - let htlc_response = self.query_htlc(htlc_id.clone()).await?; + let htlc_response = self.query_htlc(htlc_id.clone()).await.map_mm_err()?; let htlc_state = htlc_response .htlc_state() .or_mm_err(|| ValidatePaymentError::InvalidRpcResponse(format!("No HTLC data for {}", htlc_id)))?; @@ -2055,7 +2055,8 @@ impl TendermintCoin { TX_DEFAULT_MEMO, None, ) - .await?; + .await + .map_mm_err()?; let fee_amount = big_decimal_from_sat_unsigned(fee_uamount, self.decimals); @@ -2106,7 +2107,8 @@ impl TendermintCoin { TX_DEFAULT_MEMO, None, ) - .await?; + .await + .map_mm_err()?; let fee_amount = big_decimal_from_sat_unsigned(fee_uamount, decimals); Ok(TradeFee { @@ -2228,7 +2230,7 @@ impl TendermintCoin { let htlc = CreateHtlcMsg::try_from(htlc_proto)?; let htlc_id = self.calculate_htlc_id(htlc.sender(), htlc.to(), htlc.amount(), input.secret_hash); - let htlc_response = self.query_htlc(htlc_id.clone()).await?; + let htlc_response = self.query_htlc(htlc_id.clone()).await.map_mm_err()?; let htlc_state = match htlc_response.htlc_state() { Some(htlc_state) => htlc_state, @@ -2249,10 +2251,12 @@ impl TendermintCoin { let response = self .rpc_client() - .await? + .await + .map_mm_err()? .perform(request) .await - .map_to_mm(TendermintCoinRpcError::from).map_mm_err()?; + .map_to_mm(TendermintCoinRpcError::from) + .map_mm_err()?; match response.txs.first() { Some(raw_tx) => { let tx = cosmrs::Tx::from_bytes(&raw_tx.tx)?; @@ -2400,7 +2404,8 @@ impl TendermintCoin { let (balance_u64, balance_dec) = self .get_balance_as_unsigned_and_decimal(&delegator_address, &self.denom, self.decimals()) - .await?; + .await + .map_mm_err()?; let amount_u64 = if req.max { balance_u64 @@ -2438,7 +2443,8 @@ impl TendermintCoin { &req.memo, req.fee, ) - .await?; + .await + .map_mm_err()?; let fee_amount_dec = big_decimal_from_sat_unsigned(fee_amount_u64, self.decimals()); @@ -2468,7 +2474,7 @@ impl TendermintCoin { ) .map_err(|e| DelegationError::InternalError(e.to_string()))?; - let account_info = self.account_info(&delegator_address).await?; + let account_info = self.account_info(&delegator_address).await.map_mm_err()?; let tx = self .any_to_transaction_data( @@ -2576,7 +2582,8 @@ impl TendermintCoin { &req.memo, req.fee, ) - .await?; + .await + .map_mm_err()?; let fee_amount_dec = big_decimal_from_sat_unsigned(fee_amount_u64, self.decimals()); @@ -2598,7 +2605,7 @@ impl TendermintCoin { gas_limit, ); - let account_info = self.account_info(&delegator_address).await?; + let account_info = self.account_info(&delegator_address).await.map_mm_err()?; let tx = self .any_to_transaction_data( @@ -2656,7 +2663,8 @@ impl TendermintCoin { let raw_response = self .rpc_client() - .await? + .await + .map_mm_err()? .abci_query( Some(ABCI_DELEGATION_PATH.to_owned()), request.encode_to_vec(), @@ -2703,7 +2711,8 @@ impl TendermintCoin { let raw_response = self .rpc_client() - .await? + .await + .map_mm_err()? .abci_query( Some(ABCI_DELEGATION_REWARDS_PATH.to_owned()), query_payload.encode_to_vec(), @@ -2775,7 +2784,8 @@ impl TendermintCoin { &req.memo, req.fee, ) - .await?; + .await + .map_mm_err()?; let fee_amount_dec = big_decimal_from_sat_unsigned(fee_amount_u64, self.decimals()); @@ -2804,7 +2814,7 @@ impl TendermintCoin { gas_limit, ); - let account_info = self.account_info(&delegator_address).await?; + let account_info = self.account_info(&delegator_address).await.map_mm_err()?; let tx = self .any_to_transaction_data(maybe_priv_key, msg, &account_info, fee, timeout_height, &req.memo) diff --git a/mm2src/coins/utxo/bchd_grpc.rs b/mm2src/coins/utxo/bchd_grpc.rs index c7c01d073b..56c4bc3849 100644 --- a/mm2src/coins/utxo/bchd_grpc.rs +++ b/mm2src/coins/utxo/bchd_grpc.rs @@ -130,7 +130,8 @@ pub async fn validate_slp_utxos( .iter() .map(|url| url.as_ref().to_owned() + "/pb.bchrpc/GetSlpTrustedValidation") .collect(); - let responses: Vec<(_, GetSlpTrustedValidationResponse)> = grpc_web_multi_url_request(&urls, &request).await?; + let responses: Vec<(_, GetSlpTrustedValidationResponse)> = + grpc_web_multi_url_request(&urls, &request).await.map_mm_err()?; for (url, response) in responses { for validation_result in response.results { let actual_token_id = { @@ -253,7 +254,8 @@ pub async fn check_slp_transaction( .map(|url| url.as_ref().to_owned() + "/pb.bchrpc/CheckSlpTransaction") .collect(); - let responses: Vec<(_, CheckSlpTransactionResponse)> = grpc_web_multi_url_request(&urls, &request).await?; + let responses: Vec<(_, CheckSlpTransactionResponse)> = + grpc_web_multi_url_request(&urls, &request).await.map_mm_err()?; for (url, response) in responses { if !response.is_valid { return MmError::err(CheckSlpTransactionErr { diff --git a/mm2src/coins/utxo/qtum_delegation.rs b/mm2src/coins/utxo/qtum_delegation.rs index 2b81fa12b6..dc65b866e2 100644 --- a/mm2src/coins/utxo/qtum_delegation.rs +++ b/mm2src/coins/utxo/qtum_delegation.rs @@ -121,7 +121,9 @@ impl QtumCoin { reason: "Qtum doesn't support delegation for segwit".to_string(), }); } - let delegation_output = self.remove_delegation_output(QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT).map_mm_err()?; + let delegation_output = self + .remove_delegation_output(QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT) + .map_mm_err()?; let outputs = vec![delegation_output]; let my_address = self.my_address().map_mm_err()?; self.generate_delegation_transaction( @@ -142,7 +144,7 @@ impl QtumCoin { }, UtxoRpcClientEnum::Electrum(electrum) => electrum, }; - let address = self.my_addr_as_contract_addr().await?; + let address = self.my_addr_as_contract_addr().await.map_mm_err()?; let address_rpc = contract_addr_into_rpc_format(&address); let add_delegation_history = client .blockchain_contract_event_get_history(&address_rpc, &contract_address, QTUM_ADD_DELEGATION_TOPIC) @@ -198,10 +200,10 @@ impl QtumCoin { async fn get_delegation_infos_impl(&self) -> StakingInfosResult { let coin = self.as_ref(); - let my_address = coin.derivation_method.single_addr_or_err().await?; + let my_address = coin.derivation_method.single_addr_or_err().await.map_mm_err()?; let staker = self.am_i_currently_staking().await?; - let (unspents, _) = self.get_unspent_ordered_list(&my_address).await?; + let (unspents, _) = self.get_unspent_ordered_list(&my_address).await.map_mm_err()?; let lower_bound = QTUM_LOWER_BOUND_DELEGATION_AMOUNT .try_into() .expect("Conversion should succeed"); @@ -232,7 +234,7 @@ impl QtumCoin { reason: "Qtum doesn't support delegation for segwit".to_string(), }); } - if let Some(staking_addr) = self.am_i_currently_staking().await? { + if let Some(staking_addr) = self.am_i_currently_staking().await.map_mm_err()? { return MmError::err(DelegationError::AlreadyDelegating(staking_addr)); } let to_addr = @@ -270,9 +272,9 @@ impl QtumCoin { let utxo = self.as_ref(); let key_pair = utxo.priv_key_policy.activated_key_or_err().map_mm_err()?; - let my_address = utxo.derivation_method.single_addr_or_err().await?; + let my_address = utxo.derivation_method.single_addr_or_err().await.map_mm_err()?; - let (unspents, _) = self.get_unspent_ordered_list(&my_address).await?; + let (unspents, _) = self.get_unspent_ordered_list(&my_address).await.map_mm_err()?; let mut gas_fee = 0; let mut outputs = Vec::with_capacity(contract_outputs.len()); for output in contract_outputs { diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs index e7c5311db2..c88c06f823 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs @@ -688,7 +688,7 @@ impl ElectrumClient { &self, tx: &UtxoTx, ) -> Result<(TxMerkleBranch, BlockHeader, u64), MmError> { - let height = self.get_tx_height_from_storage(tx).await?; + let height = self.get_tx_height_from_storage(tx).await.map_mm_err()?; let merkle_branch = self .blockchain_transaction_get_merkle(tx.hash().reversed().into(), height) @@ -699,7 +699,7 @@ impl ElectrumClient { err: err.to_string(), })?; - let header = self.block_header_from_storage(height).await?; + let header = self.block_header_from_storage(height).await.map_mm_err()?; Ok((merkle_branch, header, height)) } diff --git a/mm2src/coins/utxo/slp.rs b/mm2src/coins/utxo/slp.rs index f35820c834..d19a9d09de 100644 --- a/mm2src/coins/utxo/slp.rs +++ b/mm2src/coins/utxo/slp.rs @@ -347,7 +347,7 @@ impl SlpToken { if slp_outputs.len() > 18 { return MmError::err(GenSlpSpendErr::TooManyOutputs); } - let (slp_unspents, bch_unspents, recently_spent) = self.slp_unspents_for_spend().await?; + let (slp_unspents, bch_unspents, recently_spent) = self.slp_unspents_for_spend().await.map_mm_err()?; let total_slp_output = slp_outputs.iter().fold(0, |cur, slp_out| cur + slp_out.amount); let mut total_slp_input = 0; @@ -392,7 +392,9 @@ impl SlpToken { outputs.push(slp_change_out); } - validate_slp_utxos(self.platform_coin.bchd_urls(), &inputs, self.token_id()).await?; + validate_slp_utxos(self.platform_coin.bchd_urls(), &inputs, self.token_id()) + .await + .map_mm_err()?; let preimage = SlpTxPreimage { slp_inputs: inputs, available_bch_inputs: bch_unspents, @@ -460,7 +462,9 @@ impl SlpToken { }, slp_amount: slp_satoshis, }; - validate_slp_utxos(self.platform_coin.bchd_urls(), &[slp_unspent], self.token_id()).await?; + validate_slp_utxos(self.platform_coin.bchd_urls(), &[slp_unspent], self.token_id()) + .await + .map_mm_err()?; let slp_tx: SlpTxDetails = parse_slp_script(tx.outputs[0].script_pubkey.as_slice()).map_mm_err()?; @@ -560,7 +564,7 @@ impl SlpToken { slp_amount, }; - let tx_locktime = self.platform_coin.p2sh_tx_locktime(time_lock).await?; + let tx_locktime = self.platform_coin.p2sh_tx_locktime(time_lock).await.map_mm_err()?; let script_data = ScriptBuilder::default().push_opcode(Opcode::OP_1).into_script(); let tx = self .spend_p2sh( @@ -571,7 +575,8 @@ impl SlpToken { redeem_script, htlc_keypair, ) - .await?; + .await + .map_mm_err()?; Ok(tx) } @@ -612,14 +617,15 @@ impl SlpToken { slp_amount, }; - let tx_locktime = self.platform_coin.p2sh_tx_locktime(time_lock).await?; + let tx_locktime = self.platform_coin.p2sh_tx_locktime(time_lock).await.map_mm_err()?; let script_data = ScriptBuilder::default() .push_data(secret) .push_opcode(Opcode::OP_0) .into_script(); let tx = self .spend_p2sh(slp_utxo, tx_locktime, SEQUENCE_FINAL, script_data, redeem, keypair) - .await?; + .await + .map_mm_err()?; Ok(tx) } @@ -644,19 +650,25 @@ impl SlpToken { }; outputs.push(slp_output); - let (_, bch_inputs, _recently_spent) = self.slp_unspents_for_spend().await?; + let (_, bch_inputs, _recently_spent) = self.slp_unspents_for_spend().await.map_mm_err()?; let (mut unsigned, _) = UtxoTxBuilder::new(&self.platform_coin) .await .add_required_inputs(std::iter::once(p2sh_utxo.bch_unspent)) .add_available_inputs(bch_inputs) .add_outputs(outputs) .build() - .await?; + .await + .map_mm_err()?; unsigned.lock_time = tx_locktime; unsigned.inputs[0].sequence = input_sequence; - let my_key_pair = self.platform_coin.as_ref().priv_key_policy.activated_key_or_err().map_mm_err()?; + let my_key_pair = self + .platform_coin + .as_ref() + .priv_key_policy + .activated_key_or_err() + .map_mm_err()?; let signed_p2sh_input = p2sh_spend( &unsigned, 0, @@ -665,7 +677,8 @@ impl SlpToken { redeem_script, self.platform_coin.as_ref().conf.signature_version, self.platform_coin.as_ref().conf.fork_id, - ).map_mm_err()?; + ) + .map_mm_err()?; let signed_inputs: Result, _> = unsigned .inputs @@ -683,7 +696,7 @@ impl SlpToken { }) .collect(); - let mut signed_inputs = signed_inputs?; + let mut signed_inputs = signed_inputs.map_mm_err()?; signed_inputs.insert(0, signed_p2sh_input); @@ -714,7 +727,8 @@ impl SlpToken { .rpc() .send_raw_transaction(serialize(&signed).into()) .compat() - .await?; + .await + .map_mm_err()?; Ok(signed) } diff --git a/mm2src/coins/utxo/utxo_common.rs b/mm2src/coins/utxo/utxo_common.rs index eed7729617..8f936ebd73 100644 --- a/mm2src/coins/utxo/utxo_common.rs +++ b/mm2src/coins/utxo/utxo_common.rs @@ -215,7 +215,7 @@ where T: UtxoCommonOps + GetUtxoListOps + MarketCoinOps, { if coin.as_ref().check_utxo_maturity { - let (unspents, _) = coin.get_mature_unspent_ordered_list(address).await?; + let (unspents, _) = coin.get_mature_unspent_ordered_list(address).await.map_mm_err()?; return Ok(unspents.to_coin_balance(coin.as_ref().decimals)); } @@ -239,7 +239,10 @@ where T: UtxoCommonOps + GetUtxoMapOps + MarketCoinOps, { if coin.as_ref().check_utxo_maturity { - let (unspents_map, _) = coin.get_mature_unspent_ordered_map(addresses.clone()).await?; + let (unspents_map, _) = coin + .get_mature_unspent_ordered_map(addresses.clone()) + .await + .map_mm_err()?; addresses .into_iter() .map(|address| { @@ -257,7 +260,8 @@ where .rpc_client .display_balances(addresses.clone(), coin.as_ref().decimals) .compat() - .await? + .await + .map_mm_err()? .into_iter() .map(|(address, spendable)| { let unspendable = BigDecimal::from(0); @@ -644,7 +648,7 @@ impl<'a, T: AsRef + UtxoTxGenerationOps> UtxoTxBuilder<'a, T> { let actual_tx_fee = match self.fee { Some(fee) => fee, - None => coin.get_tx_fee().await?, + None => coin.get_tx_fee().await.map_mm_err()?, }; true_or!(!self.tx.outputs.is_empty(), GenerateTxError::EmptyOutputs); @@ -1014,10 +1018,10 @@ async fn gen_taker_funding_spend_preimage( .value; let fee = match fee { - FundingSpendFeeSetting::GetFromCoin => { - coin.get_htlc_spend_fee(DEFAULT_SWAP_TX_SPEND_SIZE, &FeeApproxStage::WithoutApprox) - .await? - }, + FundingSpendFeeSetting::GetFromCoin => coin + .get_htlc_spend_fee(DEFAULT_SWAP_TX_SPEND_SIZE, &FeeApproxStage::WithoutApprox) + .await + .map_mm_err()?, FundingSpendFeeSetting::UseExact(f) => f, }; @@ -1109,7 +1113,8 @@ pub async fn validate_taker_funding_spend_preimage( let expected_fee = coin .get_htlc_spend_fee(DEFAULT_SWAP_TX_SPEND_SIZE, &FeeApproxStage::WithoutApprox) - .await?; + .await + .map_mm_err()?; let actual_fee = funding_amount - payment_amount; @@ -1128,7 +1133,8 @@ pub async fn validate_taker_funding_spend_preimage( NTimeSetting::UseValue(preimage.preimage.n_time), FundingSpendFeeSetting::UseExact(actual_fee), ) - .await?; + .await + .map_mm_err()?; let funding_time_lock = gen_args .funding_time_lock @@ -1263,7 +1269,8 @@ async fn gen_taker_payment_spend_preimage( })?; let tx_fee = coin .get_htlc_spend_fee(DEFAULT_SWAP_TX_SPEND_SIZE, &FeeApproxStage::WithoutApprox) - .await?; + .await + .map_mm_err()?; let dex_fee_value = if matches!(args.dex_fee, &DexFee::WithBurn { .. }) { outputs[0].value + outputs[1].value } else { @@ -1377,7 +1384,9 @@ pub async fn validate_taker_payment_spend_preimage( // Here, we have to use the exact lock time from the preimage because maker // can get different values (e.g. if MTP advances during preimage exchange/fee rate changes) let expected_preimage = - gen_taker_payment_spend_preimage(coin, gen_args, NTimeSetting::UseValue(preimage.preimage.n_time)).await?; + gen_taker_payment_spend_preimage(coin, gen_args, NTimeSetting::UseValue(preimage.preimage.n_time)) + .await + .map_mm_err()?; let time_lock = gen_args .time_lock @@ -3977,10 +3986,15 @@ where T: UtxoCommonOps + GetUtxoListOps, { let decimals = coin.as_ref().decimals; - let tx_fee = coin.get_tx_fee().await?; + let tx_fee = coin.get_tx_fee().await.map_mm_err()?; // [`FeePolicy::DeductFromOutput`] is used if the value is [`TradePreimageValue::UpperBound`] only let is_amount_upper_bound = matches!(fee_policy, FeePolicy::DeductFromOutput(_)); - let my_address = coin.as_ref().derivation_method.single_addr_or_err().await?; + let my_address = coin + .as_ref() + .derivation_method + .single_addr_or_err() + .await + .map_mm_err()?; match tx_fee { // if it's a dynamic fee, we should generate a swap transaction to get an actual trade fee @@ -3989,7 +4003,7 @@ where let dynamic_fee = coin.increase_dynamic_fee_by_stage(fee, stage); let outputs_count = outputs.len(); - let (unspents, _recently_sent_txs) = coin.get_unspent_ordered_list(&my_address).await?; + let (unspents, _recently_sent_txs) = coin.get_unspent_ordered_list(&my_address).await.map_mm_err()?; let actual_tx_fee = ActualTxFee::Dynamic(dynamic_fee); @@ -4018,7 +4032,7 @@ where }, ActualTxFee::FixedPerKb(fee) => { let outputs_count = outputs.len(); - let (unspents, _recently_sent_txs) = coin.get_unspent_ordered_list(&my_address).await?; + let (unspents, _recently_sent_txs) = coin.get_unspent_ordered_list(&my_address).await.map_mm_err()?; let mut tx_builder = UtxoTxBuilder::new(coin) .await @@ -5059,7 +5073,8 @@ where .rpc_client .get_transaction_bytes(&args.funding_tx.hash().reversed().into()) .compat() - .await?; + .await + .map_mm_err()?; let actual_tx_bytes = serialize(args.funding_tx).take(); if tx_bytes_from_rpc.0 != actual_tx_bytes { return MmError::err(ValidateSwapV2TxError::TxBytesMismatch { diff --git a/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs b/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs index 96d3069881..c677e5f513 100644 --- a/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs +++ b/mm2src/coins/utxo/utxo_common/utxo_tx_history_v2_common.rs @@ -73,8 +73,14 @@ where .await .or_mm_err(|| MyTxHistoryErrorV2::InvalidTarget(format!("No such account_id={account_id}")))?; - let external_addresses = coin.derive_known_addresses(&hd_account, Bip44Chain::External).await?; - let internal_addresses = coin.derive_known_addresses(&hd_account, Bip44Chain::Internal).await?; + let external_addresses = coin + .derive_known_addresses(&hd_account, Bip44Chain::External) + .await + .map_mm_err()?; + let internal_addresses = coin + .derive_known_addresses(&hd_account, Bip44Chain::Internal) + .await + .map_mm_err()?; let addresses_iter = external_addresses .into_iter() @@ -98,7 +104,9 @@ where .await .or_mm_err(|| MyTxHistoryErrorV2::InvalidTarget(format!("No such account_id={}", hd_address_id.account_id)))?; - let is_address_activated = hd_account.is_address_activated(hd_address_id.chain, hd_address_id.address_id).map_mm_err()?; + let is_address_activated = hd_account + .is_address_activated(hd_address_id.chain, hd_address_id.address_id) + .map_mm_err()?; if !is_address_activated { let error = format!( "'{:?}:{}' address is not activated", @@ -109,7 +117,8 @@ where let hd_address = coin .derive_address(&hd_account, hd_address_id.chain, hd_address_id.address_id) - .await?; + .await + .map_mm_err()?; Ok(GetTxHistoryFilters::for_address(hd_address.address().display_address())) } @@ -130,7 +139,8 @@ where .rpc_client .get_verbose_transaction(params.hash) .compat() - .await?; + .await + .map_mm_err()?; let tx: UtxoTx = deserialize(verbose_tx.hex.as_slice())?; let mut tx_builder = TxDetailsBuilder::new( @@ -227,11 +237,24 @@ where { let tx_hash_str = format!("{:02x}", tx_hash); let wallet_id = coin.history_wallet_id(); - let tx_bytes = match storage.tx_bytes_from_cache(&wallet_id, &tx_hash_str).await? { + let tx_bytes = match storage + .tx_bytes_from_cache(&wallet_id, &tx_hash_str) + .await + .map_mm_err()? + { Some(tx_bytes) => tx_bytes, None => { - let tx_bytes = coin.as_ref().rpc_client.get_transaction_bytes(tx_hash).compat().await?; - storage.add_tx_to_cache(&wallet_id, &tx_hash_str, &tx_bytes).await?; + let tx_bytes = coin + .as_ref() + .rpc_client + .get_transaction_bytes(tx_hash) + .compat() + .await + .map_mm_err()?; + storage + .add_tx_to_cache(&wallet_id, &tx_hash_str, &tx_bytes) + .await + .map_mm_err()?; tx_bytes }, }; diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 56d3a10e0a..52003a6d8b 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -385,9 +385,9 @@ impl ZCoin { t_outputs: Vec, z_outputs: Vec, ) -> Result<(ZTransaction, AdditionalTxData, SaplingSyncGuard<'_>), MmError> { - let sync_guard = self.wait_for_gen_tx_blockchain_sync().await?; + let sync_guard = self.wait_for_gen_tx_blockchain_sync().await.map_mm_err()?; - let tx_fee = self.get_one_kbyte_tx_fee().await?; + let tx_fee = self.get_one_kbyte_tx_fee().await.map_mm_err()?; let t_output_sat: u64 = t_outputs.iter().fold(0, |cur, out| cur + u64::from(out.value)); let z_output_sat: u64 = z_outputs.iter().fold(0, |cur, out| cur + u64::from(out.amount)); let total_output_sat = t_output_sat + z_output_sat; @@ -494,14 +494,15 @@ impl ZCoin { t_outputs: Vec, z_outputs: Vec, ) -> Result> { - let (tx, _, mut sync_guard) = self.gen_tx(t_outputs, z_outputs).await?; + let (tx, _, mut sync_guard) = self.gen_tx(t_outputs, z_outputs).await.map_mm_err()?; let mut tx_bytes = Vec::with_capacity(1024); tx.write(&mut tx_bytes).expect("Write should not fail"); self.utxo_rpc_client() .send_raw_transaction(tx_bytes.into()) .compat() - .await?; + .await + .map_mm_err()?; sync_guard.respawn_guard.watch_for_tx(tx.txid()); Ok(tx) @@ -621,15 +622,20 @@ impl ZCoin { &self, request: MyTxHistoryRequestV2, ) -> Result, MmError> { - let current_block = self.utxo_rpc_client().get_block_count().compat().await?; - let req_result = fetch_tx_history_from_db(self, request.limit, request.paging_options.clone()).await?; + let current_block = self.utxo_rpc_client().get_block_count().compat().await.map_mm_err()?; + let req_result = fetch_tx_history_from_db(self, request.limit, request.paging_options.clone()) + .await + .map_mm_err()?; let hashes_for_verbose = req_result .transactions .iter() .map(|item| H256Json::from(item.tx_hash)) .collect(); - let transactions = self.z_transactions_from_cache_or_rpc(hashes_for_verbose).await?; + let transactions = self + .z_transactions_from_cache_or_rpc(hashes_for_verbose) + .await + .map_mm_err()?; let prev_tx_hashes: HashSet<_> = transactions .iter() @@ -641,13 +647,17 @@ impl ZCoin { }) }) .collect(); - let prev_transactions = self.z_transactions_from_cache_or_rpc(prev_tx_hashes).await?; + let prev_transactions = self + .z_transactions_from_cache_or_rpc(prev_tx_hashes) + .await + .map_mm_err()?; let transactions = req_result .transactions .into_iter() .map(|sql_item| self.tx_details_from_db_item(sql_item, &transactions, &prev_transactions, current_block)) - .collect::>().map_mm_err()?; + .collect::>() + .map_mm_err()?; Ok(MyTxHistoryResponseV2 { coin: self.ticker().into(), diff --git a/mm2src/coins/z_coin/z_htlc.rs b/mm2src/coins/z_coin/z_htlc.rs index ad1fe2b862..0d68f7258e 100644 --- a/mm2src/coins/z_coin/z_htlc.rs +++ b/mm2src/coins/z_coin/z_htlc.rs @@ -91,7 +91,8 @@ pub async fn z_send_dex_fee( if matches!(dex_fee, DexFee::NoFee) { return MmError::err(SendOutputsErr::InternalError("unexpected DexFee::NoFee".to_string())); } - let dex_fee_amount_sat = sat_from_big_decimal(&dex_fee.fee_amount().to_decimal(), coin.utxo_arc.decimals).map_mm_err()?; + let dex_fee_amount_sat = + sat_from_big_decimal(&dex_fee.fee_amount().to_decimal(), coin.utxo_arc.decimals).map_mm_err()?; // add dex fee output let dex_fee_out = ZOutput { to_addr: coin.z_fields.dex_fee_addr.clone(), @@ -102,7 +103,8 @@ pub async fn z_send_dex_fee( }; let mut outputs = vec![dex_fee_out]; if let Some(dex_burn_amount) = dex_fee.burn_amount() { - let dex_burn_amount_sat = sat_from_big_decimal(&dex_burn_amount.to_decimal(), coin.utxo_arc.decimals).map_mm_err()?; + let dex_burn_amount_sat = + sat_from_big_decimal(&dex_burn_amount.to_decimal(), coin.utxo_arc.decimals).map_mm_err()?; // add output to the dex burn address: let dex_burn_out = ZOutput { to_addr: coin.z_fields.dex_burn_addr.clone(), @@ -166,7 +168,7 @@ pub async fn z_p2sh_spend( script_data: Script, htlc_keypair: &KeyPair, ) -> Result> { - let current_block = coin.utxo_arc.rpc_client.get_block_count().compat().await? as u32; + let current_block = coin.utxo_arc.rpc_client.get_block_count().compat().await.map_mm_err()? as u32; let mut tx_builder = ZTxBuilder::new(coin.consensus_params(), current_block.into()); tx_builder.set_lock_time(tx_locktime); diff --git a/mm2src/coins/z_coin/z_rpc.rs b/mm2src/coins/z_coin/z_rpc.rs index 40eef387c0..e4340beaee 100644 --- a/mm2src/coins/z_coin/z_rpc.rs +++ b/mm2src/coins/z_coin/z_rpc.rs @@ -516,7 +516,7 @@ pub(super) async fn init_light_client<'a>( let light_rpc_clients = LightRpcClient::new(lightwalletd_urls).await?; - let min_height = blocks_db.get_earliest_block().await? as u64; + let min_height = blocks_db.get_earliest_block().await.map_mm_err()? as u64; let current_block_height = light_rpc_clients .get_block_height() .await @@ -536,20 +536,22 @@ pub(super) async fn init_light_client<'a>( }; let maybe_checkpoint_block = light_rpc_clients .checkpoint_block_from_height(sync_height.max(sapling_activation_height), &coin) - .await?; + .await + .map_mm_err()?; // check if no sync_params was provided and continue syncing from last height in db if it's > 0 or skip_sync_params is true. let continue_from_prev_sync = (min_height > 0 && sync_params.is_none()) || (skip_sync_params && min_height < sapling_activation_height); - let wallet_db = - WalletDbShared::new(builder, maybe_checkpoint_block, z_spending_key, continue_from_prev_sync).await?; + let wallet_db = WalletDbShared::new(builder, maybe_checkpoint_block, z_spending_key, continue_from_prev_sync) + .await + .map_mm_err()?; // Check min_height in blocks_db and rewind blocks_db to 0 if sync_height != min_height if !continue_from_prev_sync && (sync_height != min_height) { // let user know we're clearing cache and re-syncing from new provided height. if min_height > 0 { info!("Older/Newer sync height detected!, rewinding blocks_db to new height: {sync_height:?}"); } - blocks_db.rewind_to_height(u32::MIN.into()).await?; + blocks_db.rewind_to_height(u32::MIN.into()).await.map_mm_err()?; }; let first_sync_block = FirstSyncBlock { @@ -771,7 +773,7 @@ impl SaplingSyncLoopHandle { async fn update_blocks_cache(&mut self, rpc: &dyn ZRpcOps) -> Result<(), MmError> { let current_block = rpc.get_block_height().await?; let block_db = self.blocks_db.clone(); - let current_block_in_db = &self.blocks_db.get_latest_block().await?; + let current_block_in_db = &self.blocks_db.get_latest_block().await.map_mm_err()?; let wallet_db = self.wallet_db.clone(); let extrema = wallet_db.db.block_height_extrema().await?; let mut from_block = self From 92426f892c09b44c2d50c8869e36403171388aa5 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 18:55:49 +0100 Subject: [PATCH 04/35] ssave state --- mm2src/coins/coin_balance.rs | 2 +- mm2src/coins/eth.rs | 168 ++++++++++-------- mm2src/coins/eth/eth_balance_events.rs | 4 +- mm2src/coins/eth/eth_hd_wallet.rs | 2 +- mm2src/coins/eth/eth_withdraw.rs | 55 +++--- .../eth/fee_estimation/eip1559/simple.rs | 3 +- mm2src/coins/hd_wallet/coin_ops.rs | 40 +++-- mm2src/coins/hd_wallet/confirm_address.rs | 2 +- mm2src/coins/hd_wallet/mod.rs | 2 +- mm2src/coins/hd_wallet/pubkey.rs | 2 +- mm2src/coins/hd_wallet/withdraw_ops.rs | 2 +- mm2src/coins/lightning.rs | 2 +- mm2src/coins/lightning/ln_utils.rs | 2 +- mm2src/coins/lp_coins.rs | 46 +++-- mm2src/coins/nft.rs | 51 ++++-- mm2src/coins/nft/storage/mod.rs | 4 +- mm2src/coins/nft/storage/sql_storage.rs | 4 +- mm2src/coins/qrc20.rs | 20 +-- mm2src/coins/rpc_command/get_new_address.rs | 15 +- mm2src/coins/tendermint/tendermint_coin.rs | 34 ++-- mm2src/coins/tendermint/tendermint_token.rs | 12 +- mm2src/coins/utxo.rs | 2 +- mm2src/coins/utxo/bch.rs | 10 +- mm2src/coins/utxo/qtum.rs | 4 +- mm2src/coins/utxo/qtum_delegation.rs | 8 +- mm2src/coins/utxo/rpc_clients.rs | 6 +- .../utxo/rpc_clients/electrum_rpc/client.rs | 7 +- mm2src/coins/utxo/slp.rs | 44 +++-- .../utxo/utxo_builder/utxo_coin_builder.rs | 22 +-- mm2src/coins/utxo/utxo_common.rs | 34 ++-- mm2src/coins/utxo/utxo_standard.rs | 4 +- mm2src/coins/utxo/utxo_withdraw.rs | 61 ++++--- mm2src/coins/z_coin.rs | 58 +++--- mm2src/coins/z_coin/z_rpc.rs | 6 +- .../src/bch_with_tokens_activation.rs | 52 ++++-- .../src/erc20_token_activation.rs | 17 +- .../src/eth_with_token_activation.rs | 18 +- .../src/init_erc20_token_activation.rs | 10 +- mm2src/coins_activation/src/init_token.rs | 30 ++-- mm2src/coins_activation/src/l2/init_l2.rs | 34 ++-- .../src/lightning_activation.rs | 22 +-- .../src/platform_coin_with_tokens.rs | 87 +++++---- .../src/slp_token_activation.rs | 2 +- .../standalone_coin/init_standalone_coin.rs | 42 +++-- .../src/tendermint_token_activation.rs | 5 +- mm2src/coins_activation/src/token.rs | 10 +- .../src/utxo_activation/common_impl.rs | 4 +- .../utxo_activation/init_bch_activation.rs | 2 +- .../utxo_activation/init_qtum_activation.rs | 2 +- .../init_utxo_standard_activation.rs | 4 +- .../coins_activation/src/z_coin_activation.rs | 12 +- 51 files changed, 654 insertions(+), 437 deletions(-) diff --git a/mm2src/coins/coin_balance.rs b/mm2src/coins/coin_balance.rs index cd9a1e5935..c6f89ecd44 100644 --- a/mm2src/coins/coin_balance.rs +++ b/mm2src/coins/coin_balance.rs @@ -337,7 +337,7 @@ pub trait HDWalletBalanceOps: HDWalletCoinOps { // Derive HD addresses and split addresses and their derivation paths into two collections. let (addresses, der_paths): (Vec<_>, Vec<_>) = self .derive_addresses(hd_account, address_ids) - .await? + .await.map_mm_err()? .into_iter() .map(|hd_address| (hd_address.address(), hd_address.derivation_path().clone())) .unzip(); diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index 16b2cc646b..98c29753b0 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -1686,23 +1686,25 @@ impl WatcherOps for EthCoin { .watcher_reward .clone() .ok_or_else(|| ValidatePaymentError::WatcherRewardError("Watcher reward not found".to_string()))); - let expected_reward_amount = try_f!(wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS)); + let expected_reward_amount = try_f!(wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS).map_mm_err()); let expected_swap_contract_address = try_f!(input .swap_contract_address .try_to_address() - .map_to_mm(ValidatePaymentError::InvalidParameter)); + .map_to_mm(ValidatePaymentError::InvalidParameter) + .map_mm_err()); let unsigned: UnverifiedTransactionWrapper = try_f!(rlp::decode(&input.payment_tx)); - let tx = - try_f!(SignedEthTx::new(unsigned) - .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string()))); + let tx = try_f!(SignedEthTx::new(unsigned) + .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())) + .map_mm_err()); let selfi = self.clone(); let time_lock = try_f!(input .time_lock .try_into() - .map_to_mm(ValidatePaymentError::TimelockOverflow)); + .map_to_mm(ValidatePaymentError::TimelockOverflow) + .map_mm_err()); let swap_id = selfi.etomic_swap_id(time_lock, &input.secret_hash); let decimals = self.decimals; let secret_hash = if input.secret_hash.len() == 32 { @@ -1710,10 +1712,11 @@ impl WatcherOps for EthCoin { } else { input.secret_hash.to_vec() }; - let maker_addr = - try_f!(addr_from_raw_pubkey(&input.maker_pub).map_to_mm(ValidatePaymentError::InvalidParameter)); + let maker_addr = try_f!(addr_from_raw_pubkey(&input.maker_pub) + .map_to_mm(ValidatePaymentError::InvalidParameter) + .map_mm_err()); - let trade_amount = try_f!(wei_from_big_decimal(&(input.amount), decimals)); + let trade_amount = try_f!(wei_from_big_decimal(&(input.amount), decimals).map_mm_err()); let fut = async move { match tx.unsigned().action() { Call(contract_address) => { @@ -1735,7 +1738,8 @@ impl WatcherOps for EthCoin { .payment_status(expected_swap_contract_address, Token::FixedBytes(swap_id.clone())) .compat() .await - .map_to_mm(ValidatePaymentError::Transport)?; + .map_to_mm(ValidatePaymentError::Transport) + .map_mm_err()?; let expected_status = match input.spend_type { WatcherSpendType::MakerPaymentSpend => U256::from(PaymentState::Spent as u8), WatcherSpendType::TakerPaymentRefund => U256::from(PaymentState::Refunded as u8), @@ -1759,7 +1763,7 @@ impl WatcherOps for EthCoin { .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string()))?; let swap_id_input = get_function_input_data(&decoded, function, 0) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if swap_id_input != Token::FixedBytes(swap_id.clone()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction invalid swap_id arg {:?}, expected {:?}", @@ -1771,7 +1775,7 @@ impl WatcherOps for EthCoin { let hash_input = match input.spend_type { WatcherSpendType::MakerPaymentSpend => { let secret_input = get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError)? + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? .into_fixed_bytes() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for secret hash argument".to_string()) @@ -1779,7 +1783,7 @@ impl WatcherOps for EthCoin { dhash160(&secret_input).to_vec() }, WatcherSpendType::TakerPaymentRefund => get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError)? + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? .into_fixed_bytes() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for secret argument".to_string()) @@ -1793,9 +1797,9 @@ impl WatcherOps for EthCoin { ))); } - let my_address = selfi.derivation_method.single_addr_or_err().await?; + let my_address = selfi.derivation_method.single_addr_or_err().await.map_mm_err()?; let sender_input = get_function_input_data(&decoded, function, 4) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; let expected_sender = match input.spend_type { WatcherSpendType::MakerPaymentSpend => maker_addr, WatcherSpendType::TakerPaymentRefund => my_address, @@ -1823,7 +1827,7 @@ impl WatcherOps for EthCoin { } let reward_target_input = get_function_input_data(&decoded, function, 6) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if reward_target_input != Token::Uint(U256::from(watcher_reward.reward_target as u8)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction reward target arg {:?} is invalid, expected {:?}", @@ -1833,7 +1837,7 @@ impl WatcherOps for EthCoin { } let contract_reward_input = get_function_input_data(&decoded, function, 7) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if contract_reward_input != Token::Bool(watcher_reward.send_contract_reward_on_spend) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction sends contract reward on spend arg {:?} is invalid, expected {:?}", @@ -1843,7 +1847,7 @@ impl WatcherOps for EthCoin { } let reward_amount_input = get_function_input_data(&decoded, function, 8) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if reward_amount_input != Token::Uint(expected_reward_amount) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction watcher reward amount arg {:?} is invalid, expected {:?}", @@ -1862,7 +1866,7 @@ impl WatcherOps for EthCoin { match &selfi.coin_type { EthCoinType::Eth => { let amount_input = get_function_input_data(&decoded, function, 1) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; let total_amount = match input.spend_type { WatcherSpendType::MakerPaymentSpend => { if !matches!(watcher_reward.reward_target, RewardTarget::None) @@ -1884,7 +1888,7 @@ impl WatcherOps for EthCoin { } let token_address_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if token_address_input != Token::Address(Address::default()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction token address arg {:?} is invalid, expected {:?}", @@ -1898,7 +1902,7 @@ impl WatcherOps for EthCoin { token_addr, } => { let amount_input = get_function_input_data(&decoded, function, 1) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if amount_input != Token::Uint(trade_amount) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction amount arg {:?} is invalid, expected {:?}", @@ -1908,7 +1912,7 @@ impl WatcherOps for EthCoin { } let token_address_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if token_address_input != Token::Address(*token_addr) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction token address arg {:?} is invalid, expected {:?}", @@ -1933,13 +1937,13 @@ impl WatcherOps for EthCoin { let unsigned: UnverifiedTransactionWrapper = try_f!(rlp::decode(&input.payment_tx)); let tx = try_f!(SignedEthTx::new(unsigned) - .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string()))); - let sender = try_f!(addr_from_raw_pubkey(&input.taker_pub).map_to_mm(ValidatePaymentError::InvalidParameter)); - let receiver = try_f!(addr_from_raw_pubkey(&input.maker_pub).map_to_mm(ValidatePaymentError::InvalidParameter)); + .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())).map_mm_err()); + let sender = try_f!(addr_from_raw_pubkey(&input.taker_pub).map_to_mm(ValidatePaymentError::InvalidParameter).map_mm_err()); + let receiver = try_f!(addr_from_raw_pubkey(&input.maker_pub).map_to_mm(ValidatePaymentError::InvalidParameter).map_mm_err()); let time_lock = try_f!(input .time_lock .try_into() - .map_to_mm(ValidatePaymentError::TimelockOverflow)); + .map_to_mm(ValidatePaymentError::TimelockOverflow).map_mm_err()); let selfi = self.clone(); let swap_id = selfi.etomic_swap_id(time_lock, &input.secret_hash); @@ -1982,7 +1986,7 @@ impl WatcherOps for EthCoin { .payment_status(swap_contract_address, Token::FixedBytes(swap_id.clone())) .compat() .await - .map_to_mm(ValidatePaymentError::Transport)?; + .map_to_mm(ValidatePaymentError::Transport).map_mm_err()?; if status != U256::from(PaymentState::Sent as u8) && status != U256::from(PaymentState::Spent as u8) { return MmError::err(ValidatePaymentError::UnexpectedPaymentState(format!( "{INVALID_PAYMENT_STATE_ERR_LOG}: Payment state is not PAYMENT_STATE_SENT or PAYMENT_STATE_SPENT, got {status}" @@ -1993,19 +1997,19 @@ impl WatcherOps for EthCoin { .get_taker_watcher_reward(&input.maker_coin, None, None, None, input.wait_until) .await .map_err(|err| ValidatePaymentError::WatcherRewardError(err.into_inner().to_string()))?; - let expected_reward_amount = wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS)?; + let expected_reward_amount = wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS).map_mm_err()?; match &selfi.coin_type { EthCoinType::Eth => { let function_name = get_function_name("ethPayment", true); let function = SWAP_CONTRACT .function(&function_name) - .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string()))?; + .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string())).map_mm_err()?; let decoded = decode_contract_call(function, &tx_from_rpc.input.0) - .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string()))?; + .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())).map_mm_err()?; let swap_id_input = get_function_input_data(&decoded, function, 0) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if swap_id_input != Token::FixedBytes(swap_id.clone()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_SWAP_ID_ERR_LOG}: Invalid 'swap_id' {decoded:?}, expected {swap_id:?}" @@ -2013,7 +2017,7 @@ impl WatcherOps for EthCoin { } let receiver_input = get_function_input_data(&decoded, function, 1) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if receiver_input != Token::Address(receiver) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_RECEIVER_ERR_LOG}: Payment tx receiver arg {receiver_input:?} is invalid, expected {:?}", Token::Address(receiver) @@ -2021,7 +2025,7 @@ impl WatcherOps for EthCoin { } let secret_hash_input = get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if secret_hash_input != Token::FixedBytes(secret_hash.to_vec()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx secret_hash arg {:?} is invalid, expected {:?}", @@ -2031,7 +2035,7 @@ impl WatcherOps for EthCoin { } let time_lock_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if time_lock_input != Token::Uint(U256::from(input.time_lock)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx time_lock arg {:?} is invalid, expected {:?}", @@ -2041,7 +2045,7 @@ impl WatcherOps for EthCoin { } let reward_target_input = get_function_input_data(&decoded, function, 4) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; let expected_reward_target = watcher_reward.reward_target as u8; if reward_target_input != Token::Uint(U256::from(expected_reward_target)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( @@ -2051,7 +2055,7 @@ impl WatcherOps for EthCoin { } let sends_contract_reward_input = get_function_input_data(&decoded, function, 5) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if sends_contract_reward_input != Token::Bool(watcher_reward.send_contract_reward_on_spend) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx sends_contract_reward_on_spend arg {:?} is invalid, expected {:?}", @@ -2060,13 +2064,13 @@ impl WatcherOps for EthCoin { } let reward_amount_input = get_function_input_data(&decoded, function, 6) - .map_to_mm(ValidatePaymentError::TxDeserializationError)? + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? .into_uint() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for reward amount argument".to_string()) })?; - validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false)?; + validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false).map_mm_err()?; // TODO: Validate the value }, @@ -2077,12 +2081,12 @@ impl WatcherOps for EthCoin { let function_name = get_function_name("erc20Payment", true); let function = SWAP_CONTRACT .function(&function_name) - .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string()))?; + .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string())).map_mm_err()?; let decoded = decode_contract_call(function, &tx_from_rpc.input.0) - .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string()))?; + .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())).map_mm_err()?; let swap_id_input = get_function_input_data(&decoded, function, 0) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if swap_id_input != Token::FixedBytes(swap_id.clone()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_SWAP_ID_ERR_LOG}: Invalid 'swap_id' {decoded:?}, expected {swap_id:?}" @@ -2090,7 +2094,7 @@ impl WatcherOps for EthCoin { } let token_addr_input = get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if token_addr_input != Token::Address(*token_addr) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx token_addr arg {:?} is invalid, expected {:?}", @@ -2100,7 +2104,7 @@ impl WatcherOps for EthCoin { } let receiver_addr_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if receiver_addr_input != Token::Address(receiver) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_RECEIVER_ERR_LOG}: Payment tx receiver arg {receiver_addr_input:?} is invalid, expected {:?}", Token::Address(receiver), @@ -2108,7 +2112,7 @@ impl WatcherOps for EthCoin { } let secret_hash_input = get_function_input_data(&decoded, function, 4) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if secret_hash_input != Token::FixedBytes(secret_hash.to_vec()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx secret_hash arg {:?} is invalid, expected {:?}", @@ -2118,7 +2122,7 @@ impl WatcherOps for EthCoin { } let time_lock_input = get_function_input_data(&decoded, function, 5) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if time_lock_input != Token::Uint(U256::from(input.time_lock)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx time_lock arg {:?} is invalid, expected {:?}", @@ -2128,7 +2132,7 @@ impl WatcherOps for EthCoin { } let reward_target_input = get_function_input_data(&decoded, function, 6) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; let expected_reward_target = watcher_reward.reward_target as u8; if reward_target_input != Token::Uint(U256::from(expected_reward_target)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( @@ -2138,7 +2142,7 @@ impl WatcherOps for EthCoin { } let sends_contract_reward_input = get_function_input_data(&decoded, function, 7) - .map_to_mm(ValidatePaymentError::TxDeserializationError)?; + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; if sends_contract_reward_input != Token::Bool(watcher_reward.send_contract_reward_on_spend) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx sends_contract_reward_on_spend arg {:?} is invalid, expected {:?}", @@ -2147,13 +2151,13 @@ impl WatcherOps for EthCoin { } let reward_amount_input = get_function_input_data(&decoded, function, 8) - .map_to_mm(ValidatePaymentError::TxDeserializationError)? + .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? .into_uint() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for reward amount argument".to_string()) })?; - validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false)?; + validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false).map_mm_err()?; if tx_from_rpc.value != reward_amount_input { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( @@ -2339,7 +2343,7 @@ impl MarketCoinOps for EthCoin { fn sign_message(&self, message: &str) -> SignatureResult { let message_hash = self.sign_message_hash(message).ok_or(SignatureError::PrefixNotFound)?; - let privkey = &self.priv_key_policy.activated_key_or_err()?.secret(); + let privkey = &self.priv_key_policy.activated_key_or_err().map_mm_err()?.secret(); let signature = sign(privkey, &H256::from(message_hash))?; Ok(format!("0x{}", signature)) } @@ -2360,7 +2364,7 @@ impl MarketCoinOps for EthCoin { let decimals = self.decimals; let fut = self .get_balance() - .and_then(move |result| Ok(u256_to_big_decimal(result, decimals)?)) + .and_then(move |result| Ok(u256_to_big_decimal(result, decimals).map_mm_err()?)) .map(|spendable| CoinBalance { spendable, unspendable: BigDecimal::from(0), @@ -2371,7 +2375,7 @@ impl MarketCoinOps for EthCoin { fn base_coin_balance(&self) -> BalanceFut { Box::new( self.eth_balance() - .and_then(move |result| Ok(u256_to_big_decimal(result, ETH_DECIMALS)?)), + .and_then(move |result| Ok(u256_to_big_decimal(result, ETH_DECIMALS).map_mm_err()?)), ) } @@ -4466,7 +4470,7 @@ impl EthCoin { fn get_balance(&self) -> BalanceFut { let coin = self.clone(); let fut = async move { - let my_address = coin.derivation_method.single_addr_or_err().await?; + let my_address = coin.derivation_method.single_addr_or_err().await.map_mm_err()?; coin.address_balance(my_address).compat().await }; Box::new(fut.boxed().compat()) @@ -4633,7 +4637,7 @@ impl EthCoin { fn eth_balance(&self) -> BalanceFut { let coin = self.clone(); let fut = async move { - let my_address = coin.derivation_method.single_addr_or_err().await?; + let my_address = coin.derivation_method.single_addr_or_err().await.map_mm_err()?; coin.balance(my_address, Some(BlockNumber::Latest)) .await .map_to_mm(BalanceError::from) @@ -4671,7 +4675,7 @@ impl EthCoin { )), EthCoinType::Erc20 { ref token_addr, .. } => { let function = ERC20_CONTRACT.function("allowance")?; - let my_address = coin.derivation_method.single_addr_or_err().await?; + let my_address = coin.derivation_method.single_addr_or_err().await.map_mm_err()?; let data = function.encode_input(&[Token::Address(my_address), Token::Address(spender)])?; let res = coin @@ -4825,7 +4829,7 @@ impl EthCoin { } else { input.secret_hash.to_vec() }; - let trade_amount = try_f!(wei_from_big_decimal(&(input.amount), decimals)); + let trade_amount = try_f!(wei_from_big_decimal(&(input.amount), decimals).map_mm_err()); let fut = async move { let status = selfi .payment_status(expected_swap_contract_address, Token::FixedBytes(swap_id.clone())) @@ -4851,7 +4855,7 @@ impl EthCoin { ))); } - let my_address = selfi.derivation_method.single_addr_or_err().await?; + let my_address = selfi.derivation_method.single_addr_or_err().await.map_mm_err()?; match &selfi.coin_type { EthCoinType::Eth => { let mut expected_value = trade_amount; @@ -4917,7 +4921,8 @@ impl EthCoin { ))); } - let expected_reward_amount = wei_from_big_decimal(&watcher_reward.amount, decimals)?; + let expected_reward_amount = + wei_from_big_decimal(&watcher_reward.amount, decimals).map_mm_err()?; let actual_reward_amount = decoded[6].clone().into_uint().ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for watcher reward argument".to_string()) })?; @@ -5023,15 +5028,15 @@ impl EthCoin { let expected_reward_amount = match watcher_reward.reward_target { RewardTarget::Contract | RewardTarget::PaymentSender => { - wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS)? + wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS).map_mm_err()? }, RewardTarget::PaymentSpender => { - wei_from_big_decimal(&watcher_reward.amount, selfi.decimals)? + wei_from_big_decimal(&watcher_reward.amount, selfi.decimals).map_mm_err()? }, _ => { // TODO tests passed without this change, need to research on how it worked if watcher_reward.send_contract_reward_on_spend { - wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS)? + wei_from_big_decimal(&watcher_reward.amount, ETH_DECIMALS).map_mm_err()? } else { 0.into() } @@ -5721,7 +5726,8 @@ impl MmCoin for EthCoin { ) -> TradePreimageResult { let pay_for_gas_option = self .get_swap_pay_for_gas_option(self.get_swap_transaction_fee_policy()) - .await?; + .await + .map_mm_err()?; let pay_for_gas_option = increase_gas_price_by_stage(pay_for_gas_option, &stage); let gas_limit = match self.coin_type { EthCoinType::Eth => { @@ -5736,20 +5742,21 @@ impl MmCoin for EthCoin { let mut gas = U256::from(self.gas_limit.erc20_payment); let value = match value { TradePreimageValue::Exact(value) | TradePreimageValue::UpperBound(value) => { - wei_from_big_decimal(&value, self.decimals)? + wei_from_big_decimal(&value, self.decimals).map_mm_err()? }, }; - let allowed = self.allowance(self.swap_contract_address).compat().await?; + let allowed = self.allowance(self.swap_contract_address).compat().await.map_mm_err()?; if allowed < value { // estimate gas for the `approve` contract call // Pass a dummy spender. Let's use `my_address`. - let spender = self.derivation_method.single_addr_or_err().await?; + let spender = self.derivation_method.single_addr_or_err().await.map_mm_err()?; let approve_function = ERC20_CONTRACT.function("approve")?; let approve_data = approve_function.encode_input(&[Token::Address(spender), Token::Uint(value)])?; let approve_gas_limit = self .estimate_gas_for_contract_call(token_addr, Bytes::from(approve_data)) - .await?; + .await + .map_mm_err()?; // this gas_limit includes gas for `approve`, `erc20Payment` contract calls gas += approve_gas_limit; @@ -5763,8 +5770,8 @@ impl MmCoin for EthCoin { EthCoinType::Nft { .. } => return MmError::err(TradePreimageError::NftProtocolNotSupported), }; - let total_fee = calc_total_fee(gas_limit, &pay_for_gas_option)?; - let amount = u256_to_big_decimal(total_fee, ETH_DECIMALS)?; + let total_fee = calc_total_fee(gas_limit, &pay_for_gas_option).map_mm_err()?; + let amount = u256_to_big_decimal(total_fee, ETH_DECIMALS).map_mm_err()?; let fee_coin = match &self.coin_type { EthCoinType::Eth => &self.ticker, EthCoinType::Erc20 { platform, .. } => platform, @@ -5782,20 +5789,22 @@ impl MmCoin for EthCoin { let fut = async move { let pay_for_gas_option = coin .get_swap_pay_for_gas_option(coin.get_swap_transaction_fee_policy()) - .await?; + .await + .map_mm_err()?; let pay_for_gas_option = increase_gas_price_by_stage(pay_for_gas_option, &stage); let (fee_coin, total_fee) = match &coin.coin_type { EthCoinType::Eth => ( &coin.ticker, - calc_total_fee(U256::from(coin.gas_limit.eth_receiver_spend), &pay_for_gas_option)?, + calc_total_fee(U256::from(coin.gas_limit.eth_receiver_spend), &pay_for_gas_option).map_mm_err()?, ), EthCoinType::Erc20 { platform, .. } => ( platform, - calc_total_fee(U256::from(coin.gas_limit.erc20_receiver_spend), &pay_for_gas_option)?, + calc_total_fee(U256::from(coin.gas_limit.erc20_receiver_spend), &pay_for_gas_option) + .map_mm_err()?, ), EthCoinType::Nft { .. } => return MmError::err(TradePreimageError::NftProtocolNotSupported), }; - let amount = u256_to_big_decimal(total_fee, ETH_DECIMALS)?; + let amount = u256_to_big_decimal(total_fee, ETH_DECIMALS).map_mm_err()?; Ok(TradeFee { coin: fee_coin.into(), amount: amount.into(), @@ -5810,11 +5819,11 @@ impl MmCoin for EthCoin { dex_fee_amount: DexFee, stage: FeeApproxStage, ) -> TradePreimageResult { - let dex_fee_amount = wei_from_big_decimal(&dex_fee_amount.fee_amount().into(), self.decimals)?; + let dex_fee_amount = wei_from_big_decimal(&dex_fee_amount.fee_amount().into(), self.decimals).map_mm_err()?; // pass the dummy params let to_addr = addr_from_raw_pubkey(&DEX_FEE_ADDR_RAW_PUBKEY) .expect("addr_from_raw_pubkey should never fail with DEX_FEE_ADDR_RAW_PUBKEY"); - let my_address = self.derivation_method.single_addr_or_err().await?; + let my_address = self.derivation_method.single_addr_or_err().await.map_mm_err()?; let (eth_value, data, call_addr, fee_coin) = match &self.coin_type { EthCoinType::Eth => (dex_fee_amount, Vec::new(), &to_addr, &self.ticker), EthCoinType::Erc20 { platform, token_addr } => { @@ -5825,7 +5834,10 @@ impl MmCoin for EthCoin { EthCoinType::Nft { .. } => return MmError::err(TradePreimageError::NftProtocolNotSupported), }; let fee_policy_for_estimate = get_swap_fee_policy_for_estimate(self.get_swap_transaction_fee_policy()); - let pay_for_gas_option = self.get_swap_pay_for_gas_option(fee_policy_for_estimate).await?; + let pay_for_gas_option = self + .get_swap_pay_for_gas_option(fee_policy_for_estimate) + .await + .map_mm_err()?; let pay_for_gas_option = increase_gas_price_by_stage(pay_for_gas_option, &stage); let estimate_gas_req = CallRequest { value: Some(eth_value), @@ -5841,8 +5853,8 @@ impl MmCoin for EthCoin { // Please note if the wallet's balance is insufficient to withdraw, then `estimate_gas` may fail with the `Exception` error. // Ideally we should determine the case when we have the insufficient balance and return `TradePreimageError::NotSufficientBalance` error. let gas_limit = self.estimate_gas_wrapper(estimate_gas_req).compat().await?; - let total_fee = calc_total_fee(gas_limit, &pay_for_gas_option)?; - let amount = u256_to_big_decimal(total_fee, ETH_DECIMALS)?; + let total_fee = calc_total_fee(gas_limit, &pay_for_gas_option).map_mm_err()?; + let amount = u256_to_big_decimal(total_fee, ETH_DECIMALS).map_mm_err()?; Ok(TradeFee { coin: fee_coin.into(), amount: amount.into(), @@ -5938,7 +5950,7 @@ fn validate_fee_impl(coin: EthCoin, validate_fee_args: EthValidateFeeArgs<'_>) - let min_block_number = validate_fee_args.min_block_number; let fut = async move { - let expected_value = wei_from_big_decimal(&amount, coin.decimals)?; + let expected_value = wei_from_big_decimal(&amount, coin.decimals).map_mm_err()?; let tx_from_rpc = coin.transaction(TransactionId::Hash(fee_tx_hash)).await?; let tx_from_rpc = tx_from_rpc.as_ref().ok_or_else(|| { diff --git a/mm2src/coins/eth/eth_balance_events.rs b/mm2src/coins/eth/eth_balance_events.rs index 0cb7afe134..ab896e3f2b 100644 --- a/mm2src/coins/eth/eth_balance_events.rs +++ b/mm2src/coins/eth/eth_balance_events.rs @@ -2,7 +2,7 @@ use super::EthCoin; use crate::{eth::{u256_to_big_decimal, Erc20TokenDetails}, BalanceError, CoinWithDerivationMethod}; use common::{executor::Timer, log, Future01CompatExt}; -use mm2_err_handle::prelude::MmError; +use mm2_err_handle::prelude::{MmError, MmResultExt}; use mm2_event_stream::{Broadcaster, Event, EventStreamer, NoDataIn, StreamHandlerInput}; use mm2_number::BigDecimal; @@ -132,7 +132,7 @@ async fn fetch_balance( let balance_as_big_decimal = u256_to_big_decimal(balance_as_u256, decimals).map_err(|e| BalanceFetchError { ticker: token_ticker.clone(), address: address.to_string(), - error: e.into(), + error: e.map(BalanceError::from), })?; Ok(BalanceData { diff --git a/mm2src/coins/eth/eth_hd_wallet.rs b/mm2src/coins/eth/eth_hd_wallet.rs index 1b1f2e1a6e..7d903851c8 100644 --- a/mm2src/coins/eth/eth_hd_wallet.rs +++ b/mm2src/coins/eth/eth_hd_wallet.rs @@ -144,7 +144,7 @@ impl HDWalletBalanceOps for EthCoin { async fn known_address_balance(&self, address: &Address) -> BalanceResult { let balance = self .address_balance(*address) - .and_then(move |result| Ok(u256_to_big_decimal(result, self.decimals())?)) + .and_then(move |result| Ok(u256_to_big_decimal(result, self.decimals()).map_mm_err()?)) .compat() .await?; diff --git a/mm2src/coins/eth/eth_withdraw.rs b/mm2src/coins/eth/eth_withdraw.rs index b3de177a89..6a36b9d95e 100644 --- a/mm2src/coins/eth/eth_withdraw.rs +++ b/mm2src/coins/eth/eth_withdraw.rs @@ -19,7 +19,7 @@ use futures::compat::Future01CompatExt; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::map_mm_error::MapMmError; use mm2_err_handle::mm_error::MmResult; -use mm2_err_handle::prelude::{MapToMmResult, MmError, OrMmError}; +use mm2_err_handle::prelude::{MapToMmResult, MmError, MmResultExt, OrMmError}; use std::ops::Deref; use std::sync::Arc; #[cfg(target_arch = "wasm32")] @@ -57,8 +57,8 @@ where async fn get_from_address(&self, req: &WithdrawRequest) -> Result> { let coin = self.coin(); match req.from { - Some(_) => Ok(coin.get_withdraw_sender_address(req).await?.address), - None => Ok(coin.derivation_method.single_addr_or_err().await?), + Some(_) => Ok(coin.get_withdraw_sender_address(req).await.map_mm_err()?.address), + None => Ok(coin.derivation_method.single_addr_or_err().await.map_mm_err()?), } } @@ -75,7 +75,8 @@ where let derivation_path = self.get_from_derivation_path(from)?; let raw_priv_key = coin .priv_key_policy - .hd_wallet_derived_priv_key_or_err(&derivation_path)?; + .hd_wallet_derived_priv_key_or_err(&derivation_path) + .map_mm_err()?; KeyPair::from_secret_slice(raw_priv_key.as_slice()) .map_to_mm(|e| WithdrawError::InternalError(e.to_string())) }, @@ -91,9 +92,14 @@ where #[allow(clippy::result_large_err)] fn get_from_derivation_path(&self, from: &WithdrawFrom) -> Result> { let coin = self.coin(); - let path_to_coin = &coin.deref().derivation_method.hd_wallet_or_err()?.derivation_path; - let path_to_address = from.to_address_path(path_to_coin.coin_type())?; - let derivation_path = path_to_address.to_derivation_path(path_to_coin)?; + let path_to_coin = &coin + .deref() + .derivation_method + .hd_wallet_or_err() + .map_mm_err()? + .derivation_path; + let path_to_address = from.to_address_path(path_to_coin.coin_type()).map_mm_err()?; + let derivation_path = path_to_address.to_derivation_path(path_to_coin).map_mm_err()?; Ok(derivation_path) } @@ -109,7 +115,8 @@ where let default_hd_address = &coin .deref() .derivation_method - .hd_wallet_or_err()? + .hd_wallet_or_err() + .map_mm_err()? .get_enabled_address() .await .ok_or_else(|| WithdrawError::InternalError("no enabled address".to_owned()))?; @@ -197,13 +204,13 @@ where self.on_generating_transaction()?; - let my_balance = coin.address_balance(my_address).compat().await?; - let my_balance_dec = u256_to_big_decimal(my_balance, coin.decimals)?; + let my_balance = coin.address_balance(my_address).compat().await.map_mm_err()?; + let my_balance_dec = u256_to_big_decimal(my_balance, coin.decimals).map_mm_err()?; let (mut wei_amount, dec_amount) = if req.max { (my_balance, my_balance_dec.clone()) } else { - let wei_amount = wei_from_big_decimal(&req.amount, coin.decimals)?; + let wei_amount = wei_from_big_decimal(&req.amount, coin.decimals).map_mm_err()?; (wei_amount, req.amount.clone()) }; if wei_amount > my_balance { @@ -222,7 +229,7 @@ where }, EthCoinType::Nft { .. } => return MmError::err(WithdrawError::NftProtocolNotSupported), }; - let eth_value_dec = u256_to_big_decimal(eth_value, coin.decimals)?; + let eth_value_dec = u256_to_big_decimal(eth_value, coin.decimals).map_mm_err()?; let (gas, pay_for_gas_option) = get_eth_gas_details_from_withdraw_fee( coin, @@ -233,9 +240,10 @@ where call_addr, false, ) - .await?; - let total_fee = calc_total_fee(gas, &pay_for_gas_option)?; - let total_fee_dec = u256_to_big_decimal(total_fee, coin.decimals)?; + .await + .map_mm_err()?; + let total_fee = calc_total_fee(gas, &pay_for_gas_option).map_mm_err()?; + let total_fee_dec = u256_to_big_decimal(total_fee, coin.decimals).map_mm_err()?; if req.max && coin.coin_type == EthCoinType::Eth { if eth_value < total_fee || wei_amount < total_fee { @@ -298,14 +306,14 @@ where let tx_hash_bytes = BytesJson::from(tx_hash.0.to_vec()); let tx_hash_str = format!("{:02x}", tx_hash_bytes); - let amount_decimal = u256_to_big_decimal(wei_amount, coin.decimals)?; + let amount_decimal = u256_to_big_decimal(wei_amount, coin.decimals).map_mm_err()?; let mut spent_by_me = amount_decimal.clone(); let received_by_me = if to_addr == my_address { amount_decimal.clone() } else { 0.into() }; - let fee_details = EthTxFeeDetails::new(gas, pay_for_gas_option, fee_coin)?; + let fee_details = EthTxFeeDetails::new(gas, pay_for_gas_option, fee_coin).map_mm_err()?; if coin.coin_type == EthCoinType::Eth { spent_by_me += &fee_details.total_fee; } @@ -346,13 +354,15 @@ impl EthWithdraw for InitEthWithdraw { fn on_generating_transaction(&self) -> Result<(), MmError> { Ok(self .task_handle - .update_in_progress_status(WithdrawInProgressStatus::GeneratingTransaction)?) + .update_in_progress_status(WithdrawInProgressStatus::GeneratingTransaction) + .map_mm_err()?) } fn on_finishing(&self) -> Result<(), MmError> { Ok(self .task_handle - .update_in_progress_status(WithdrawInProgressStatus::Finishing)?) + .update_in_progress_status(WithdrawInProgressStatus::Finishing) + .map_mm_err()?) } async fn sign_tx_with_trezor( @@ -361,7 +371,7 @@ impl EthWithdraw for InitEthWithdraw { unsigned_tx: &TransactionWrapper, ) -> Result> { let coin = self.coin(); - let crypto_ctx = CryptoCtx::from_ctx(&self.ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(&self.ctx).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| WithdrawError::HwError(HwRpcError::NoTrezorDeviceAvailable))?; @@ -373,10 +383,11 @@ impl EthWithdraw for InitEthWithdraw { }; let sign_processor = TrezorRpcTaskProcessor::new(self.task_handle.clone(), trezor_statuses); let sign_processor = Arc::new(sign_processor); - let mut trezor_session = hw_ctx.trezor(sign_processor).await?; + let mut trezor_session = hw_ctx.trezor(sign_processor).await.map_mm_err()?; let unverified_tx = trezor_session .sign_eth_tx(derivation_path, unsigned_tx, coin.chain_id) - .await?; + .await + .map_mm_err()?; Ok(SignedEthTx::new(unverified_tx).map_to_mm(|err| WithdrawError::InternalError(err.to_string()))?) } } diff --git a/mm2src/coins/eth/fee_estimation/eip1559/simple.rs b/mm2src/coins/eth/fee_estimation/eip1559/simple.rs index 995d27447c..fe42b03b8d 100644 --- a/mm2src/coins/eth/fee_estimation/eip1559/simple.rs +++ b/mm2src/coins/eth/fee_estimation/eip1559/simple.rs @@ -3,6 +3,7 @@ use crate::eth::web3_transport::FeeHistoryResult; use crate::eth::{wei_from_gwei_decimal, wei_to_gwei_decimal, EthCoin, Web3RpcError, Web3RpcResult}; use mm2_err_handle::mm_error::MmError; use mm2_err_handle::or_mm_error::OrMmError; +use mm2_err_handle::prelude::MmResultExt; use mm2_number::BigDecimal; use ethereum_types::U256; @@ -101,7 +102,7 @@ impl FeePerGasSimpleEstimator { Ok(FeePerGasLevel { max_priority_fee_per_gas, - max_fee_per_gas: wei_from_gwei_decimal(&max_fee_per_gas_dec)?, + max_fee_per_gas: wei_from_gwei_decimal(&max_fee_per_gas_dec).map_mm_err()?, // TODO: Consider adding default wait times if applicable (and mark them as uncertain). min_wait_time: None, max_wait_time: None, diff --git a/mm2src/coins/hd_wallet/coin_ops.rs b/mm2src/coins/hd_wallet/coin_ops.rs index 27b92d0aa6..bb6b2d9f64 100644 --- a/mm2src/coins/hd_wallet/coin_ops.rs +++ b/mm2src/coins/hd_wallet/coin_ops.rs @@ -6,7 +6,8 @@ use async_trait::async_trait; use bip32::{ChildNumber, DerivationPath}; use crypto::Bip44Chain; use itertools::Itertools; -use mm2_err_handle::mm_error::{MmError, MmResult}; +use mm2_err_handle::{mm_error::{MmError, MmResult}, + prelude::MmResultExt}; use std::collections::HashMap; type AddressDerivingResult = MmResult; @@ -137,7 +138,7 @@ pub trait HDWalletCoinOps { hd_account: &HDCoinHDAccount, chain: Bip44Chain, ) -> AddressDerivingResult>> { - let known_addresses_number = hd_account.known_addresses_number(chain)?; + let known_addresses_number = hd_account.known_addresses_number(chain).map_mm_err()?; let address_ids = (0..known_addresses_number).map(|address_id| HDAddressId { chain, address_id }); self.derive_addresses(hd_account, address_ids).await } @@ -155,7 +156,8 @@ pub trait HDWalletCoinOps { } = inner_impl::generate_new_address_immutable(self, hd_account, chain).await?; self.set_known_addresses_number(hd_wallet, hd_account, chain, new_known_addresses_number) - .await?; + .await + .map_mm_err()?; Ok(address) } @@ -178,22 +180,26 @@ pub trait HDWalletCoinOps { let inner_impl::NewAddress { hd_address, new_known_addresses_number, - } = inner_impl::generate_new_address_immutable(self, hd_account, chain).await?; + } = inner_impl::generate_new_address_immutable(self, hd_account, chain) + .await + .map_mm_err()?; - let trezor_coin = self.trezor_coin()?; + let trezor_coin = self.trezor_coin().map_mm_err()?; let derivation_path = hd_address.derivation_path().clone(); let expected_address = hd_address.address().display_address(); // Ask the user to confirm if the given `expected_address` is the same as on the HW display. confirm_address .confirm_address(trezor_coin, derivation_path, expected_address) - .await?; + .await + .map_mm_err()?; - let actual_known_addresses_number = hd_account.known_addresses_number(chain)?; + let actual_known_addresses_number = hd_account.known_addresses_number(chain).map_mm_err()?; // Check if the actual `known_addresses_number` hasn't been changed while we waited for the user confirmation. // If the actual value is greater than the new one, we don't need to update. if actual_known_addresses_number < new_known_addresses_number { self.set_known_addresses_number(hd_wallet, hd_account, chain, new_known_addresses_number) - .await?; + .await + .map_mm_err()?; } Ok(hd_address) @@ -213,16 +219,14 @@ pub trait HDWalletCoinOps { return MmError::err(AccountUpdatingError::AddressLimitReached { max_addresses_number }); } match chain { - Bip44Chain::External => { - hd_wallet - .update_external_addresses_number(hd_account.account_id(), new_known_addresses_number) - .await? - }, - Bip44Chain::Internal => { - hd_wallet - .update_internal_addresses_number(hd_account.account_id(), new_known_addresses_number) - .await? - }, + Bip44Chain::External => hd_wallet + .update_external_addresses_number(hd_account.account_id(), new_known_addresses_number) + .await + .map_mm_err()?, + Bip44Chain::Internal => hd_wallet + .update_internal_addresses_number(hd_account.account_id(), new_known_addresses_number) + .await + .map_mm_err()?, } hd_account.set_known_addresses_number(chain, new_known_addresses_number); diff --git a/mm2src/coins/hd_wallet/confirm_address.rs b/mm2src/coins/hd_wallet/confirm_address.rs index f0daeff6a4..f2e3274484 100644 --- a/mm2src/coins/hd_wallet/confirm_address.rs +++ b/mm2src/coins/hd_wallet/confirm_address.rs @@ -125,7 +125,7 @@ where statuses: HwConnectStatuses, trezor_message_type: TrezorMessageType, ) -> MmResult, HDConfirmAddressError> { - let crypto_ctx = CryptoCtx::from_ctx(ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(ctx).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| HDConfirmAddressError::HwContextNotInitialized)?; diff --git a/mm2src/coins/hd_wallet/mod.rs b/mm2src/coins/hd_wallet/mod.rs index 544adeb06c..8ce05dcb0c 100644 --- a/mm2src/coins/hd_wallet/mod.rs +++ b/mm2src/coins/hd_wallet/mod.rs @@ -216,7 +216,7 @@ where let account_child = ChildNumber::new(account_info.account_id, ACCOUNT_CHILD_HARDENED)?; let account_derivation_path = wallet_der_path .derive(account_child) - .map_to_mm(StandardHDPathError::from)?; + .map_to_mm(StandardHDPathError::from).map_mm_err()?; let extended_pubkey = ExtendedPublicKey::from_str(&account_info.account_xpub) .map_err(|e| HDWalletStorageError::ErrorDeserializing(e.to_string()))?; let capacity = diff --git a/mm2src/coins/hd_wallet/pubkey.rs b/mm2src/coins/hd_wallet/pubkey.rs index 3d9624eaa0..e3e0a8d51e 100644 --- a/mm2src/coins/hd_wallet/pubkey.rs +++ b/mm2src/coins/hd_wallet/pubkey.rs @@ -122,7 +122,7 @@ where statuses: HwConnectStatuses, coin_protocol: CoinProtocol, ) -> MmResult, HDExtractPubkeyError> { - let crypto_ctx = CryptoCtx::from_ctx(ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(ctx).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| HDExtractPubkeyError::HwContextNotInitialized)?; diff --git a/mm2src/coins/hd_wallet/withdraw_ops.rs b/mm2src/coins/hd_wallet/withdraw_ops.rs index 5b7ddf48cf..daa2c0ee5b 100644 --- a/mm2src/coins/hd_wallet/withdraw_ops.rs +++ b/mm2src/coins/hd_wallet/withdraw_ops.rs @@ -79,7 +79,7 @@ pub trait HDCoinWithdrawOps: HDWalletCoinOps { // If [`HDWalletCoinOps::derive_address`] succeeds, [`HDAccountOps::is_address_activated`] shouldn't fails with an `InvalidBip44ChainError`. .mm_err(|e| HDWithdrawError::InternalError(e.to_string()))?; - let hd_address = self.derive_address(&hd_account, chain, address_id).await?; + let hd_address = self.derive_address(&hd_account, chain, address_id).await.map_mm_err()?; let address = hd_address.address(); if !is_address_activated { let error = format!("'{}' address is not activated", address.display_address()); diff --git a/mm2src/coins/lightning.rs b/mm2src/coins/lightning.rs index 672c1014f3..a9f3af67a2 100644 --- a/mm2src/coins/lightning.rs +++ b/mm2src/coins/lightning.rs @@ -562,7 +562,7 @@ impl LightningCoin { .map_to_mm(|e| ValidatePaymentError::TxDeserializationError(e.to_string()))); let payment_hex = hex::encode(payment_hash.0); - let amt_msat = try_f!(sat_from_big_decimal(&input.amount, self.decimals())); + let amt_msat = try_f!(sat_from_big_decimal(&input.amount, self.decimals()).map_mm_err()); let coin = self.clone(); let fut = async move { diff --git a/mm2src/coins/lightning/ln_utils.rs b/mm2src/coins/lightning/ln_utils.rs index 79868908fa..3e57017d6b 100644 --- a/mm2src/coins/lightning/ln_utils.rs +++ b/mm2src/coins/lightning/ln_utils.rs @@ -108,7 +108,7 @@ pub fn init_keys_manager(platform: &Platform) -> EnableLightningResult BalanceFut; @@ -5211,7 +5216,11 @@ pub async fn ongoing_undelegations_info(ctx: MmArc, req: UndelegationsInfo) -> R match req.info_details { UndelegationsInfoDetails::Cosmos(r) => match coin { - MmCoinEnum::Tendermint(t) => Ok(t.ongoing_undelegations_list(r.paging).await.map(|v| json!(v)).map_mm_err()?), + MmCoinEnum::Tendermint(t) => Ok(t + .ongoing_undelegations_list(r.paging) + .await + .map(|v| json!(v)) + .map_mm_err()?), MmCoinEnum::TendermintToken(_) => MmError::err(StakingInfoError::InvalidPayload { reason: "Tokens are not supported for delegation".into(), }), @@ -5836,7 +5845,9 @@ pub async fn get_my_address(ctx: MmArc, req: MyAddressReq) -> MmResult get_eth_address(&ctx, &conf, ticker, &req.path_to_address).await.map_mm_err()?, + CoinProtocol::ETH => get_eth_address(&ctx, &conf, ticker, &req.path_to_address) + .await + .map_mm_err()?, _ => { return MmError::err(GetMyAddressError::CoinIsNotSupported(format!( "{} doesn't support get_my_address", @@ -5941,7 +5952,10 @@ where let mut unused_addresses_counter = 0; let max_addresses_number = hd_account.address_limit(); while checking_address_id < max_addresses_number && unused_addresses_counter <= gap_limit { - let hd_address = coin.derive_address(hd_account, chain, checking_address_id).await.map_mm_err()?; + let hd_address = coin + .derive_address(hd_account, chain, checking_address_id) + .await + .map_mm_err()?; let checking_address = hd_address.address(); let checking_address_der_path = hd_address.derivation_path(); @@ -5954,16 +5968,17 @@ where // First, derive all empty addresses and put it into `balances` with default balance. let address_ids = (last_non_empty_address_id..checking_address_id) .map(|address_id| HDAddressId { chain, address_id }); - let empty_addresses = - coin.derive_addresses(hd_account, address_ids) - .await.map_mm_err()? - .into_iter() - .map(|empty_address| HDAddressBalance { - address: empty_address.address().display_address(), - derivation_path: RpcDerivationPath(empty_address.derivation_path().clone()), - chain, - balance: HDWalletBalanceObject::::new(), - }); + let empty_addresses = coin + .derive_addresses(hd_account, address_ids) + .await + .map_mm_err()? + .into_iter() + .map(|empty_address| HDAddressBalance { + address: empty_address.address().display_address(), + derivation_path: RpcDerivationPath(empty_address.derivation_path().clone()), + chain, + balance: HDWalletBalanceObject::::new(), + }); balances.extend(empty_addresses); // Then push this non-empty address. @@ -5988,7 +6003,8 @@ where chain, checking_address_id - unused_addresses_counter, ) - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(balances) } diff --git a/mm2src/coins/nft.rs b/mm2src/coins/nft.rs index 666c003d7b..9c7ad4fa09 100644 --- a/mm2src/coins/nft.rs +++ b/mm2src/coins/nft.rs @@ -240,17 +240,23 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft .map_mm_err()?; let p2p_ctx = P2PContext::fetch_from_mm_arc(&ctx); - let storage = nft_ctx.lock_db().await?; + let storage = nft_ctx.lock_db().await.map_mm_err()?; for chain in req.chains.iter() { - let transfer_history_initialized = NftTransferHistoryStorageOps::is_initialized(&storage, chain).await?; + let transfer_history_initialized = NftTransferHistoryStorageOps::is_initialized(&storage, chain) + .await + .map_mm_err()?; let from_block = if transfer_history_initialized { #[cfg(not(target_arch = "wasm32"))] - NftMigrationOps::migrate_tx_history_if_needed(&storage, chain).await?; - let last_transfer_block = NftTransferHistoryStorageOps::get_last_block_number(&storage, chain).await?; + NftMigrationOps::migrate_tx_history_if_needed(&storage, chain) + .await + .map_mm_err()?; + let last_transfer_block = NftTransferHistoryStorageOps::get_last_block_number(&storage, chain) + .await + .map_mm_err()?; last_transfer_block.map(|b| b + 1) } else { - NftTransferHistoryStorageOps::init(&storage, chain).await?; + NftTransferHistoryStorageOps::init(&storage, chain).await.map_mm_err()?; None }; let coin_enum = lp_coinfind_or_err(&ctx, chain.to_nft_ticker()).await.map_mm_err()?; @@ -283,7 +289,10 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft let nft_transfers = get_moralis_nft_transfers(from_block, global_nft, &my_address_str, &wrapper) .await .map_mm_err()?; - storage.add_transfers_to_history(*chain, nft_transfers).await?; + storage + .add_transfers_to_history(*chain, nft_transfers) + .await + .map_mm_err()?; let nft_block = match NftListStorageOps::get_last_block_number(&storage, chain).await { Ok(Some(block)) => block, @@ -298,7 +307,7 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft }, Err(_) => { // if there is an error, then NFT LIST table doesn't exist, so we need to cache nft list from moralis. - NftListStorageOps::init(&storage, chain).await?; + NftListStorageOps::init(&storage, chain).await.map_mm_err()?; let nft_list = cache_nfts_from_moralis(&my_address_str, &storage, &wrapper).await?; update_meta_in_transfers(&storage, chain, nft_list).await?; update_transfers_with_empty_meta(&storage, &wrapper).await?; @@ -307,13 +316,13 @@ pub async fn update_nft(ctx: MmArc, req: UpdateNftReq) -> MmResult<(), UpdateNft continue; }, }; - let scanned_block = - storage - .get_last_scanned_block(chain) - .await? - .ok_or_else(|| UpdateNftError::LastScannedBlockNotFound { - last_nft_block: nft_block.to_string(), - })?; + let scanned_block = storage + .get_last_scanned_block(chain) + .await + .map_mm_err()? + .ok_or_else(|| UpdateNftError::LastScannedBlockNotFound { + last_nft_block: nft_block.to_string(), + })?; // if both block numbers exist, last scanned block should be equal // or higher than last block number from NFT LIST table. if scanned_block < nft_block { @@ -510,7 +519,7 @@ pub async fn refresh_nft_metadata(ctx: MmArc, req: RefreshMetadataReq) -> MmResu .map_mm_err()?; let p2p_ctx = P2PContext::fetch_from_mm_arc(&ctx); - let storage = nft_ctx.lock_db().await?; + let storage = nft_ctx.lock_db().await.map_mm_err()?; let proxy_sign = if req.komodo_proxy { let uri = Uri::from_str(req.url.as_ref()).map_err(|e| UpdateNftError::Internal(e.to_string()))?; @@ -533,16 +542,19 @@ pub async fn refresh_nft_metadata(ctx: MmArc, req: RefreshMetadataReq) -> MmResu Err(_) => { storage .update_nft_spam_by_token_address(&req.chain, token_address_str.clone(), true) - .await?; + .await + .map_mm_err()?; storage .update_transfer_spam_by_token_address(&req.chain, token_address_str.clone(), true) - .await?; + .await + .map_mm_err()?; return Ok(()); }, }; let mut nft_db = storage .get_nft(&req.chain, token_address_str.clone(), req.token_id.clone()) - .await? + .await + .map_mm_err()? .ok_or_else(|| GetNftInfoError::TokenNotFoundInWallet { token_address: token_address_str, token_id: req.token_id.to_string(), @@ -578,7 +590,8 @@ pub async fn refresh_nft_metadata(ctx: MmArc, req: RefreshMetadataReq) -> MmResu }; storage .refresh_nft_metadata(&moralis_meta.chain, nft_db.clone()) - .await?; + .await + .map_mm_err()?; update_transfer_meta_using_nft(&storage, &req.chain, &mut nft_db).await?; Ok(()) } diff --git a/mm2src/coins/nft/storage/mod.rs b/mm2src/coins/nft/storage/mod.rs index 3eed941b5d..de61d04a40 100644 --- a/mm2src/coins/nft/storage/mod.rs +++ b/mm2src/coins/nft/storage/mod.rs @@ -4,7 +4,7 @@ use crate::nft::nft_structs::{Chain, Nft, NftList, NftListFilters, NftTokenAddrI use async_trait::async_trait; use ethereum_types::Address; use mm2_err_handle::mm_error::MmResult; -use mm2_err_handle::mm_error::{NotEqual, NotMmError}; +use mm2_err_handle::mm_error::NotMmError; use mm2_number::{BigDecimal, BigUint}; use serde::{Deserialize, Serialize}; use std::collections::HashSet; @@ -25,7 +25,7 @@ pub enum RemoveNftResult { } /// Defines the standard errors that can occur in NFT storage operations -pub trait NftStorageError: std::fmt::Debug + NotMmError + NotEqual + Send {} +pub trait NftStorageError: std::fmt::Debug + NotMmError + Send {} /// Provides asynchronous operations for handling and querying NFT listings. #[async_trait] diff --git a/mm2src/coins/nft/storage/sql_storage.rs b/mm2src/coins/nft/storage/sql_storage.rs index c3e575b321..1829f8d500 100644 --- a/mm2src/coins/nft/storage/sql_storage.rs +++ b/mm2src/coins/nft/storage/sql_storage.rs @@ -605,7 +605,7 @@ impl NftListStorageOps for AsyncMutexGuard<'_, AsyncConnection> { type Error = AsyncConnError; async fn init(&self, chain: &Chain) -> MmResult<(), Self::Error> { - let sql_nft_list = create_nft_list_table_sql(chain)?; + let sql_nft_list = create_nft_list_table_sql(chain).map_mm_err()?; self.call(move |conn| { conn.execute(&sql_nft_list, []).map(|_| ())?; conn.execute(&create_scanned_nft_blocks_sql()?, []).map(|_| ())?; @@ -843,7 +843,7 @@ impl NftListStorageOps for AsyncMutexGuard<'_, AsyncConnection> { } async fn get_last_scanned_block(&self, chain: &Chain) -> MmResult, Self::Error> { - let sql = select_last_scanned_block_sql()?; + let sql = select_last_scanned_block_sql().map_mm_err()?; let params = [chain.to_ticker()]; self.call(move |conn| { let block_number = query_single_row(conn, &sql, params, block_number_from_row)?; diff --git a/mm2src/coins/qrc20.rs b/mm2src/coins/qrc20.rs index dd992dcce2..b4c64e3b8f 100644 --- a/mm2src/coins/qrc20.rs +++ b/mm2src/coins/qrc20.rs @@ -148,7 +148,7 @@ impl Qrc20ActivationParams { .map_to_mm(Qrc20FromLegacyReqErr::InvalidSwapContractAddr)?; let fallback_swap_contract = json::from_value(req["fallback_swap_contract"].clone()) .map_to_mm(Qrc20FromLegacyReqErr::InvalidFallbackSwapContract)?; - let utxo_params = UtxoActivationParams::from_legacy_req(req)?; + let utxo_params = UtxoActivationParams::from_legacy_req(req).map_mm_err()?; Ok(Qrc20ActivationParams { swap_contract_address, fallback_swap_contract, @@ -858,7 +858,7 @@ impl SwapOps for Qrc20Coin { let fee_addr = self .contract_address_from_raw_pubkey(self.dex_pubkey()) .map_to_mm(ValidatePaymentError::WrongPaymentTx)?; - let expected_value = wei_from_big_decimal(&validate_fee_args.dex_fee.fee_amount().into(), self.utxo.decimals)?; + let expected_value = wei_from_big_decimal(&validate_fee_args.dex_fee.fee_amount().into(), self.utxo.decimals).map_mm_err()?; self.validate_fee_impl( fee_tx_hash, @@ -1065,9 +1065,9 @@ impl MarketCoinOps for Qrc20Coin { .rpc_client .rpc_contract_call(ViewContractCallType::BalanceOf, &contract_address, ¶ms) .compat() - .await?; + .await.map_mm_err()?; let spendable = match tokens.first() { - Some(Token::Uint(bal)) => u256_to_big_decimal(*bal, decimals)?, + Some(Token::Uint(bal)) => u256_to_big_decimal(*bal, decimals).map_mm_err()?, _ => { let error = format!("Expected U256 as balanceOf result but got {:?}", tokens); return MmError::err(BalanceError::InvalidResponse(error)); @@ -1216,7 +1216,7 @@ impl MmCoin for Qrc20Coin { let my_balance = U256::max_value(); let value = match value { TradePreimageValue::Exact(value) | TradePreimageValue::UpperBound(value) => { - wei_from_big_decimal(&value, decimals)? + wei_from_big_decimal(&value, decimals).map_mm_err()? }, }; @@ -1231,7 +1231,7 @@ impl MmCoin for Qrc20Coin { receiver_addr, self.swap_contract_address, ) - .await?; + .await.map_mm_err()?; self.preimage_trade_fee_required_to_send_outputs(erc20_payment_outputs, &stage) .await? }; @@ -1239,7 +1239,7 @@ impl MmCoin for Qrc20Coin { // Optionally calculate refund fee. let sender_refund_fee = if include_refund_fee { let sender_refund_output = - self.sender_refund_output(&self.swap_contract_address, swap_id, value, secret_hash, receiver_addr)?; + self.sender_refund_output(&self.swap_contract_address, swap_id, value, secret_hash, receiver_addr).map_mm_err()?; self.preimage_trade_fee_required_to_send_outputs(vec![sender_refund_output], &stage) .await? } else { @@ -1267,7 +1267,7 @@ impl MmCoin for Qrc20Coin { // see `generate_contract_call_script_pubkey` let value = u64::MAX.into(); let output = - selfi.receiver_spend_output(&selfi.swap_contract_address, swap_id, value, secret, sender_addr)?; + selfi.receiver_spend_output(&selfi.swap_contract_address, swap_id, value, secret, sender_addr).map_mm_err()?; let total_fee = selfi .preimage_trade_fee_required_to_send_outputs(vec![output], &stage) @@ -1286,12 +1286,12 @@ impl MmCoin for Qrc20Coin { dex_fee_amount: DexFee, stage: FeeApproxStage, ) -> TradePreimageResult { - let amount = wei_from_big_decimal(&dex_fee_amount.fee_amount().into(), self.utxo.decimals)?; + let amount = wei_from_big_decimal(&dex_fee_amount.fee_amount().into(), self.utxo.decimals).map_mm_err()?; // pass the dummy params let to_addr = H160::default(); let transfer_output = - self.transfer_output(to_addr, amount, QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT)?; + self.transfer_output(to_addr, amount, QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT).map_mm_err()?; let total_fee = self .preimage_trade_fee_required_to_send_outputs(vec![transfer_output], &stage) diff --git a/mm2src/coins/rpc_command/get_new_address.rs b/mm2src/coins/rpc_command/get_new_address.rs index 9e3ac924fc..a43225d864 100644 --- a/mm2src/coins/rpc_command/get_new_address.rs +++ b/mm2src/coins/rpc_command/get_new_address.rs @@ -387,7 +387,8 @@ pub async fn init_get_new_address( let spawner = coin.spawner(); let task = InitGetNewAddressTask { ctx, coin, req }; let task_id = - GetNewAddressTaskManager::spawn_rpc_task(&coins_ctx.get_new_address_manager, &spawner, task, client_id).map_mm_err()?; + GetNewAddressTaskManager::spawn_rpc_task(&coins_ctx.get_new_address_manager, &spawner, task, client_id) + .map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -468,7 +469,8 @@ pub(crate) mod common_impl { let hd_address = coin .generate_new_address(hd_wallet, hd_account.deref_mut(), chain) - .await.map_mm_err()?; + .await + .map_mm_err()?; let address = hd_address.address(); let balance = coin.known_address_balance(&address).await.map_mm_err()?; @@ -508,7 +510,8 @@ pub(crate) mod common_impl { let hd_address = coin .generate_and_confirm_new_address(hd_wallet, &mut hd_account, chain, confirm_address) - .await.map_mm_err()?; + .await + .map_mm_err()?; let address = hd_address.address(); let balance = coin.known_address_balance(&address).await.map_mm_err()?; @@ -554,7 +557,11 @@ pub(crate) mod common_impl { let last_address_id = known_addresses_number - 1; for address_id in (0..=last_address_id).rev() { - let address = coin.derive_address(hd_account, chain, address_id).await?.address(); + let address = coin + .derive_address(hd_account, chain, address_id) + .await + .map_mm_err()? + .address(); if address_scanner.is_address_used(&address).await.map_mm_err()? { return Ok(()); } diff --git a/mm2src/coins/tendermint/tendermint_coin.rs b/mm2src/coins/tendermint/tendermint_coin.rs index 7d7bbd7273..4c6ef2fd7e 100644 --- a/mm2src/coins/tendermint/tendermint_coin.rs +++ b/mm2src/coins/tendermint/tendermint_coin.rs @@ -1882,7 +1882,7 @@ impl TendermintCoin { let expected_dex_address = AccountId::new(&self.account_prefix, dex_pubkey_hash.as_slice()) .map_to_mm(|r| ValidatePaymentError::InvalidParameter(r.to_string()))?; - let fee_amount_as_u64 = dex_fee.fee_amount_as_u64(decimals)?; + let fee_amount_as_u64 = dex_fee.fee_amount_as_u64(decimals).map_mm_err()?; let expected_dex_amount = CoinProto { denom, amount: fee_amount_as_u64.to_string(), @@ -1938,12 +1938,12 @@ impl TendermintCoin { let expected_burn_address = AccountId::new(&self.account_prefix, burn_pubkey_hash.as_slice()) .map_to_mm(|r| ValidatePaymentError::InvalidParameter(r.to_string()))?; - let fee_amount_as_u64 = dex_fee.fee_amount_as_u64(decimals)?; + let fee_amount_as_u64 = dex_fee.fee_amount_as_u64(decimals).map_mm_err()?; let expected_dex_amount = CoinProto { denom: denom.clone(), amount: fee_amount_as_u64.to_string(), }; - let burn_amount_as_u64 = dex_fee.burn_amount_as_u64(decimals)?.unwrap_or_default(); + let burn_amount_as_u64 = dex_fee.burn_amount_as_u64(decimals).map_mm_err()?.unwrap_or_default(); let expected_burn_amount = CoinProto { denom, amount: burn_amount_as_u64.to_string(), @@ -2587,7 +2587,7 @@ impl TendermintCoin { let fee_amount_dec = big_decimal_from_sat_unsigned(fee_amount_u64, self.decimals()); - let my_balance = self.my_balance().compat().await?.spendable; + let my_balance = self.my_balance().compat().await.map_mm_err()?.spendable; if fee_amount_dec > my_balance { return MmError::err(DelegationError::NotSufficientBalance { @@ -2789,7 +2789,7 @@ impl TendermintCoin { let fee_amount_dec = big_decimal_from_sat_unsigned(fee_amount_u64, self.decimals()); - let my_balance = self.my_balance().compat().await?.spendable; + let my_balance = self.my_balance().compat().await.map_mm_err()?.spendable; if fee_amount_dec > my_balance { return MmError::err(DelegationError::NotSufficientBalance { @@ -3032,13 +3032,17 @@ impl MmCoin for TendermintCoin { let (balance_denom, balance_dec) = coin .get_balance_as_unsigned_and_decimal(&account_id, &coin.denom, coin.decimals()) - .await?; + .await + .map_mm_err()?; let (amount_denom, amount_dec) = if req.max { let amount_denom = balance_denom; (amount_denom, big_decimal_from_sat_unsigned(amount_denom, coin.decimals)) } else { - (sat_from_big_decimal(&req.amount, coin.decimals)?, req.amount.clone()) + ( + sat_from_big_decimal(&req.amount, coin.decimals).map_mm_err()?, + req.amount.clone(), + ) }; if !coin.is_tx_amount_enough(coin.decimals, &amount_dec) { @@ -3097,7 +3101,8 @@ impl MmCoin for TendermintCoin { &memo, req.fee, ) - .await?; + .await + .map_mm_err()?; let fee_amount_u64 = if coin.is_keplr_from_ledger { // When using `SIGN_MODE_LEGACY_AMINO_JSON`, Keplr ignores the fee we calculated @@ -3141,7 +3146,7 @@ impl MmCoin for TendermintCoin { }); } - (sat_from_big_decimal(&req.amount, coin.decimals)?, total) + (sat_from_big_decimal(&req.amount, coin.decimals).map_mm_err()?, total) }; let msg_payload = create_withdraw_msg_as_any( @@ -3153,7 +3158,7 @@ impl MmCoin for TendermintCoin { ) .await?; - let account_info = coin.account_info(&account_id).await?; + let account_info = coin.account_info(&account_id).await.map_mm_err()?; let tx = coin .any_to_transaction_data(maybe_priv_key, msg_payload, &account_info, fee, timeout_height, &memo) @@ -3198,7 +3203,7 @@ impl MmCoin for TendermintCoin { let coin = self.clone(); let fut = async move { req.tx_hash.make_ascii_uppercase(); - let tx_from_rpc = coin.request_tx(req.tx_hash).await?; + let tx_from_rpc = coin.request_tx(req.tx_hash).await.map_mm_err()?; Ok(RawTransactionRes { tx_hex: tx_from_rpc.encode_to_vec().into(), }) @@ -3214,7 +3219,7 @@ impl MmCoin for TendermintCoin { RawTransactionError::InvalidHashError(format!("Invalid hash length: expected 32, got {}", len)) })?; let hash = hex::encode_upper(H256::from(hash)); - let tx_from_rpc = coin.request_tx(hash).await?; + let tx_from_rpc = coin.request_tx(hash).await.map_mm_err()?; Ok(RawTransactionRes { tx_hex: tx_from_rpc.encode_to_vec().into(), }) @@ -3331,7 +3336,7 @@ impl MarketCoinOps for TendermintCoin { fn my_address(&self) -> MmResult { Ok(self.account_id.to_string()) } async fn get_public_key(&self) -> Result> { - let key = SigningKey::from_slice(self.activation_policy.activated_key_or_err()?.as_slice()) + let key = SigningKey::from_slice(self.activation_policy.activated_key_or_err().map_mm_err()?.as_slice()) .expect("privkey validity is checked on coin creation"); Ok(key.public_key().to_string()) } @@ -3356,7 +3361,8 @@ impl MarketCoinOps for TendermintCoin { let fut = async move { let balance_denom = coin .account_balance_for_denom(&coin.account_id, coin.denom.to_string()) - .await?; + .await + .map_mm_err()?; Ok(CoinBalance { spendable: big_decimal_from_sat_unsigned(balance_denom, coin.decimals), unspendable: BigDecimal::default(), diff --git a/mm2src/coins/tendermint/tendermint_token.rs b/mm2src/coins/tendermint/tendermint_token.rs index b30d07c1a5..0400fe4350 100644 --- a/mm2src/coins/tendermint/tendermint_token.rs +++ b/mm2src/coins/tendermint/tendermint_token.rs @@ -287,7 +287,7 @@ impl MarketCoinOps for TendermintToken { let balance_denom = coin .platform_coin .account_balance_for_denom(&coin.platform_coin.account_id, coin.denom.to_string()) - .await?; + .await.map_mm_err()?; Ok(CoinBalance { spendable: big_decimal_from_sat_unsigned(balance_denom, coin.decimals), unspendable: BigDecimal::default(), @@ -386,11 +386,11 @@ impl MmCoin for TendermintToken { let (base_denom_balance, base_denom_balance_dec) = platform .get_balance_as_unsigned_and_decimal(&account_id, &platform.denom, token.decimals()) - .await?; + .await.map_mm_err()?; let (balance_denom, balance_dec) = platform .get_balance_as_unsigned_and_decimal(&account_id, &token.denom, token.decimals()) - .await?; + .await.map_mm_err()?; let (amount_denom, amount_dec, total_amount) = if req.max { ( @@ -408,7 +408,7 @@ impl MmCoin for TendermintToken { } ( - sat_from_big_decimal(&req.amount, token.decimals())?, + sat_from_big_decimal(&req.amount, token.decimals()).map_mm_err()?, req.amount.clone(), req.amount, ) @@ -469,7 +469,7 @@ impl MmCoin for TendermintToken { &memo, req.fee, ) - .await?; + .await.map_mm_err()?; let fee_amount_dec = big_decimal_from_sat_unsigned(fee_amount_u64, platform.decimals()); @@ -488,7 +488,7 @@ impl MmCoin for TendermintToken { let fee = Fee::from_amount_and_gas(fee_amount, gas_limit); - let account_info = platform.account_info(&account_id).await?; + let account_info = platform.account_info(&account_id).await.map_mm_err()?; let tx = platform .any_to_transaction_data(maybe_priv_key, msg_payload, &account_info, fee, timeout_height, &memo) diff --git a/mm2src/coins/utxo.rs b/mm2src/coins/utxo.rs index 35e7281d4e..a55f1891d5 100644 --- a/mm2src/coins/utxo.rs +++ b/mm2src/coins/utxo.rs @@ -242,7 +242,7 @@ impl From for TxProviderError { #[async_trait] impl TxProvider for UtxoRpcClientEnum { async fn get_rpc_transaction(&self, tx_hash: &H256Json) -> Result> { - Ok(self.get_verbose_transaction(tx_hash).compat().await?) + Ok(self.get_verbose_transaction(tx_hash).compat().await.map_mm_err()?) } } diff --git a/mm2src/coins/utxo/bch.rs b/mm2src/coins/utxo/bch.rs index aff3b00147..7f67cd588c 100644 --- a/mm2src/coins/utxo/bch.rs +++ b/mm2src/coins/utxo/bch.rs @@ -63,7 +63,7 @@ impl BchActivationRequest { pub fn from_legacy_req(req: &Json) -> Result> { let bchd_urls = json::from_value(req["bchd_urls"].clone()).map_to_mm(BchFromLegacyReqErr::InvalidBchdUrls)?; let allow_slp_unsafe_conf = req["allow_slp_unsafe_conf"].as_bool().unwrap_or_default(); - let utxo_params = UtxoActivationParams::from_legacy_req(req)?; + let utxo_params = UtxoActivationParams::from_legacy_req(req).map_mm_err()?; Ok(BchActivationRequest { allow_slp_unsafe_conf, @@ -1158,8 +1158,8 @@ impl MarketCoinOps for BchCoin { fn my_balance(&self) -> BalanceFut { let coin = self.clone(); let fut = async move { - let my_address = coin.as_ref().derivation_method.single_addr_or_err().await?; - let bch_unspents = coin.bch_unspents_for_display(&my_address).await?; + let my_address = coin.as_ref().derivation_method.single_addr_or_err().await.map_mm_err()?; + let bch_unspents = coin.bch_unspents_for_display(&my_address).await.map_mm_err()?; Ok(bch_unspents.platform_balance(coin.as_ref().decimals)) }; Box::new(fut.boxed().compat()) @@ -1472,7 +1472,7 @@ impl CoinWithTxHistoryV2 for BchCoin { return MmError::err(MyTxHistoryErrorV2::InvalidTarget(error)); }, } - let my_address = self.my_address()?; + let my_address = self.my_address().map_mm_err()?; Ok(GetTxHistoryFilters::for_address(my_address)) } } @@ -1480,7 +1480,7 @@ impl CoinWithTxHistoryV2 for BchCoin { #[async_trait] impl UtxoTxHistoryOps for BchCoin { async fn my_addresses(&self) -> MmResult, UtxoMyAddressesHistoryError> { - let addresses = self.all_addresses().await?; + let addresses = self.all_addresses().await.map_mm_err()?; Ok(addresses) } diff --git a/mm2src/coins/utxo/qtum.rs b/mm2src/coins/utxo/qtum.rs index 82da94209b..36f7c1bbbf 100644 --- a/mm2src/coins/utxo/qtum.rs +++ b/mm2src/coins/utxo/qtum.rs @@ -155,7 +155,7 @@ pub trait QtumBasedCoin: UtxoCommonOps + MarketCoinOps { } async fn my_addr_as_contract_addr(&self) -> MmResult { - let my_address = self.as_ref().derivation_method.single_addr_or_err().await?; + let my_address = self.as_ref().derivation_method.single_addr_or_err().await.map_mm_err()?; contract_addr_from_utxo_addr(my_address).mm_err(Qrc20AddressError::from) } @@ -1198,7 +1198,7 @@ impl CoinWithTxHistoryV2 for QtumCoin { #[async_trait] impl UtxoTxHistoryOps for QtumCoin { async fn my_addresses(&self) -> MmResult, UtxoMyAddressesHistoryError> { - let addresses = self.all_addresses().await?; + let addresses = self.all_addresses().await.map_mm_err()?; Ok(addresses) } diff --git a/mm2src/coins/utxo/qtum_delegation.rs b/mm2src/coins/utxo/qtum_delegation.rs index dc65b866e2..1432048738 100644 --- a/mm2src/coins/utxo/qtum_delegation.rs +++ b/mm2src/coins/utxo/qtum_delegation.rs @@ -105,11 +105,11 @@ impl QtumDelegationOps for QtumCoin { let mut buffer = b"\x15Qtum Signed Message:\n\x28".to_vec(); buffer.append(&mut addr_hash.to_string().into_bytes()); let hashed = dhash256(&buffer); - let key_pair = self.as_ref().priv_key_policy.activated_key_or_err()?; + let key_pair = self.as_ref().priv_key_policy.activated_key_or_err().map_mm_err()?; let signature = key_pair .private() .sign_compact(&hashed) - .map_to_mm(|e| QtumStakingAbiError::PodSigningError(e.to_string()))?; + .map_to_mm(|e| QtumStakingAbiError::PodSigningError(e.to_string())).map_mm_err()?; Ok(signature) } } @@ -348,7 +348,7 @@ impl QtumCoin { gas_limit, gas_price, QTUM_DELEGATE_CONTRACT_ADDRESS.as_bytes(), - )? + ).map_mm_err()? .to_bytes(); Ok(ContractCallOutput { value: OUTPUT_QTUM_AMOUNT, @@ -380,7 +380,7 @@ impl QtumCoin { gas_limit, gas_price, QTUM_DELEGATE_CONTRACT_ADDRESS.as_bytes(), - )? + ).map_mm_err()? .to_bytes(); Ok(ContractCallOutput { value: OUTPUT_QTUM_AMOUNT, diff --git a/mm2src/coins/utxo/rpc_clients.rs b/mm2src/coins/utxo/rpc_clients.rs index fce6afa82a..4996af9aac 100644 --- a/mm2src/coins/utxo/rpc_clients.rs +++ b/mm2src/coins/utxo/rpc_clients.rs @@ -785,7 +785,7 @@ impl UtxoRpcClientOps for NativeClient { .and_then(move |unspents| { unspents .into_iter() - .map(|unspent| Ok(UnspentInfo::from_native(unspent, decimals, None)?)) + .map(|unspent| Ok(UnspentInfo::from_native(unspent, decimals, None).map_mm_err()?)) .collect::>() }); Box::new(fut) @@ -814,7 +814,7 @@ impl UtxoRpcClientOps for NativeClient { UtxoRpcError::InvalidResponse(format!("Unexpected address '{}'", unspent.address)) })? .clone(); - let unspent_info = UnspentInfo::from_native(unspent, decimals, None)?; + let unspent_info = UnspentInfo::from_native(unspent, decimals, None).map_mm_err()?; Ok((orig_address, unspent_info)) }) // Collect `(Address, UnspentInfo)` items into `HashMap>` grouped by the addresses. @@ -991,7 +991,7 @@ impl UtxoRpcClientOps for NativeClient { } async fn get_block_timestamp(&self, height: u64) -> Result> { - let block = self.get_block_by_height(height).await?; + let block = self.get_block_by_height(height).await.map_mm_err()?; Ok(block.time as u64) } } diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs index c88c06f823..a0528adf56 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs @@ -610,7 +610,12 @@ impl ElectrumClient { // This method should always be used if the block headers are saved to the DB async fn get_tx_height_from_storage(&self, tx: &UtxoTx) -> Result> { let tx_hash = tx.hash().reversed(); - let blockhash = self.get_verbose_transaction(&tx_hash.into()).compat().await?.blockhash; + let blockhash = self + .get_verbose_transaction(&tx_hash.into()) + .compat() + .await + .map_mm_err()? + .blockhash; Ok(self .block_headers_storage() .get_block_height_by_hash(blockhash.into()) diff --git a/mm2src/coins/utxo/slp.rs b/mm2src/coins/utxo/slp.rs index d19a9d09de..d5971e62b6 100644 --- a/mm2src/coins/utxo/slp.rs +++ b/mm2src/coins/utxo/slp.rs @@ -1079,7 +1079,12 @@ impl UtxoTxBroadcastOps for SlpToken { .await .mm_err(|e| BroadcastTxErr::Other(e.to_string()))?; - let hash = self.rpc().send_raw_transaction(tx_bytes.into()).compat().await?; + let hash = self + .rpc() + .send_raw_transaction(tx_bytes.into()) + .compat() + .await + .map_mm_err()?; Ok(hash) } @@ -1154,7 +1159,7 @@ impl MarketCoinOps for SlpToken { fn my_balance(&self) -> BalanceFut { let coin = self.clone(); - let fut = async move { Ok(coin.my_coin_balance().await?) }; + let fut = async move { Ok(coin.my_coin_balance().await.map_mm_err()?) }; Box::new(fut.boxed().compat()) } @@ -1507,7 +1512,12 @@ impl MmCoin for SlpToken { )); } - let key_pair = coin.platform_coin.as_ref().priv_key_policy.activated_key_or_err()?; + let key_pair = coin + .platform_coin + .as_ref() + .priv_key_policy + .activated_key_or_err() + .map_mm_err()?; let address = CashAddress::decode(&req.to).map_to_mm(WithdrawError::InvalidAddress)?; if address.prefix != *coin.slp_prefix() { @@ -1518,9 +1528,9 @@ impl MmCoin for SlpToken { ))); }; let amount = if req.max { - coin.my_balance_sat().await? + coin.my_balance_sat().await.map_mm_err()? } else { - sat_from_big_decimal(&req.amount, coin.decimals())? + sat_from_big_decimal(&req.amount, coin.decimals()).map_mm_err()? }; let address_hash = address.hash.clone(); @@ -1544,7 +1554,7 @@ impl MmCoin for SlpToken { }, }; let slp_output = SlpOutput { amount, script_pubkey }; - let (slp_preimage, _) = coin.generate_slp_tx_preimage(vec![slp_output]).await?; + let (slp_preimage, _) = coin.generate_slp_tx_preimage(vec![slp_output]).await.map_mm_err()?; let mut tx_builder = UtxoTxBuilder::new(&coin.platform_coin) .await .add_required_inputs(slp_preimage.slp_inputs.into_iter().map(|slp| slp.bch_unspent)) @@ -1554,11 +1564,11 @@ impl MmCoin for SlpToken { let platform_decimals = coin.platform_decimals(); match req.fee { Some(WithdrawFee::UtxoFixed { amount }) => { - let fixed = sat_from_big_decimal(&amount, platform_decimals)?; + let fixed = sat_from_big_decimal(&amount, platform_decimals).map_mm_err()?; tx_builder = tx_builder.with_fee(ActualTxFee::FixedPerKb(fixed)) }, Some(WithdrawFee::UtxoPerKbyte { amount }) => { - let dynamic = sat_from_big_decimal(&amount, platform_decimals)?; + let dynamic = sat_from_big_decimal(&amount, platform_decimals).map_mm_err()?; tx_builder = tx_builder.with_fee(ActualTxFee::Dynamic(dynamic)); }, Some(fee_policy) => { @@ -1580,12 +1590,13 @@ impl MmCoin for SlpToken { key_pair, coin.platform_conf().signature_version, coin.platform_conf().fork_id, - )?; + ) + .map_mm_err()?; let fee_details = SlpFeeDetails { amount: big_decimal_from_sat_unsigned(tx_data.fee_amount, coin.platform_decimals()), coin: coin.platform_coin.ticker().into(), }; - let my_address_string = coin.my_address()?; + let my_address_string = coin.my_address().map_mm_err()?; let to_address = address.encode().map_to_mm(WithdrawError::InternalError)?; let total_amount = big_decimal_from_sat_unsigned(amount, coin.decimals()); @@ -1674,7 +1685,7 @@ impl MmCoin for SlpToken { ) -> TradePreimageResult { let slp_amount = match value { TradePreimageValue::Exact(decimal) | TradePreimageValue::UpperBound(decimal) => { - sat_from_big_decimal(&decimal, self.decimals())? + sat_from_big_decimal(&decimal, self.decimals()).map_mm_err()? }, }; // can use dummy P2SH script_pubkey here @@ -1683,7 +1694,7 @@ impl MmCoin for SlpToken { amount: slp_amount, script_pubkey, }; - let (preimage, _) = self.generate_slp_tx_preimage(vec![slp_out]).await?; + let (preimage, _) = self.generate_slp_tx_preimage(vec![slp_out]).await.map_mm_err()?; let fee = utxo_common::preimage_trade_fee_required_to_send_outputs( &self.platform_coin, self.platform_ticker(), @@ -1707,7 +1718,8 @@ impl MmCoin for SlpToken { let htlc_fee = coin .platform_coin .get_htlc_spend_fee(SLP_HTLC_SPEND_SIZE, &FeeApproxStage::WithoutApprox) - .await?; + .await + .map_mm_err()?; let amount = (big_decimal_from_sat_unsigned(htlc_fee, coin.platform_decimals()) + coin.platform_dust_dec()).into(); Ok(TradeFee { @@ -1725,14 +1737,14 @@ impl MmCoin for SlpToken { dex_fee_amount: DexFee, stage: FeeApproxStage, ) -> TradePreimageResult { - let slp_amount = sat_from_big_decimal(&dex_fee_amount.fee_amount().into(), self.decimals())?; + let slp_amount = sat_from_big_decimal(&dex_fee_amount.fee_amount().into(), self.decimals()).map_mm_err()?; // can use dummy P2PKH script_pubkey here let script_pubkey = ScriptBuilder::build_p2pkh(&H160::default().into()).into(); let slp_out = SlpOutput { amount: slp_amount, script_pubkey, }; - let (preimage, _) = self.generate_slp_tx_preimage(vec![slp_out]).await?; + let (preimage, _) = self.generate_slp_tx_preimage(vec![slp_out]).await.map_mm_err()?; let fee = utxo_common::preimage_trade_fee_required_to_send_outputs( &self.platform_coin, self.platform_ticker(), @@ -1801,7 +1813,7 @@ impl CoinWithTxHistoryV2 for SlpToken { MyTxHistoryTarget::Iguana => (), target => return MmError::err(MyTxHistoryErrorV2::with_expected_target(target, "Iguana")), } - let my_address = self.my_address()?; + let my_address = self.my_address().map_mm_err()?; Ok(GetTxHistoryFilters::for_address(my_address).with_token_id(self.token_id().to_string())) } } diff --git a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs index 78b7055b79..89dabd6c36 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs @@ -142,7 +142,7 @@ pub trait UtxoFieldsWithIguanaSecretBuilder: UtxoCoinBuilderCommonOps { &self, priv_key: IguanaPrivKey, ) -> UtxoCoinBuildResult { - let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()).build()?; + let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()).build().map_mm_err()?; let private = Private { prefix: conf.wif_prefix, secret: priv_key, @@ -172,13 +172,13 @@ pub trait UtxoFieldsWithGlobalHDBuilder: UtxoCoinBuilderCommonOps { &self, global_hd_ctx: GlobalHDAccountArc, ) -> UtxoCoinBuildResult { - let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()).build()?; + let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()).build().map_mm_err()?; let path_to_address = self.activation_params().path_to_address; let path_to_coin = conf .derivation_path .as_ref() - .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet)?; + .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet).map_mm_err()?; let secret = global_hd_ctx .derive_secp256k1_secret( &path_to_address @@ -203,7 +203,7 @@ pub trait UtxoFieldsWithGlobalHDBuilder: UtxoCoinBuilderCommonOps { let address_format = self.address_format()?; let hd_wallet_rmd160 = *self.ctx().rmd160(); let hd_wallet_storage = - HDWalletCoinStorage::init_with_rmd160(self.ctx(), self.ticker().to_owned(), hd_wallet_rmd160).await?; + HDWalletCoinStorage::init_with_rmd160(self.ctx(), self.ticker().to_owned(), hd_wallet_rmd160).await.map_mm_err()?; let accounts = load_hd_accounts_from_storage(&hd_wallet_storage, path_to_coin) .await .mm_err(UtxoCoinBuildError::from)?; @@ -291,7 +291,7 @@ where pub trait UtxoFieldsWithHardwareWalletBuilder: UtxoCoinBuilderCommonOps { async fn build_utxo_fields_with_trezor(&self) -> UtxoCoinBuildResult { let ticker = self.ticker().to_owned(); - let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), &ticker).build()?; + let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), &ticker).build().map_mm_err()?; if !self.supports_trezor(&conf) { return MmError::err(UtxoCoinBuildError::CoinDoesntSupportTrezor); @@ -307,9 +307,9 @@ pub trait UtxoFieldsWithHardwareWalletBuilder: UtxoCoinBuilderCommonOps { let path_to_coin = conf .derivation_path .clone() - .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet)?; + .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet).map_mm_err()?; - let hd_wallet_storage = HDWalletCoinStorage::init(self.ctx(), ticker).await?; + let hd_wallet_storage = HDWalletCoinStorage::init(self.ctx(), ticker).await.map_mm_err()?; let accounts = load_hd_accounts_from_storage(&hd_wallet_storage, &path_to_coin) .await @@ -369,7 +369,7 @@ pub trait UtxoFieldsWithHardwareWalletBuilder: UtxoCoinBuilderCommonOps { fn supports_trezor(&self, conf: &UtxoCoinConf) -> bool { conf.trezor_coin.is_some() } fn trezor_wallet_rmd160(&self) -> UtxoCoinBuildResult { - let crypto_ctx = CryptoCtx::from_ctx(self.ctx())?; + let crypto_ctx = CryptoCtx::from_ctx(self.ctx()).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| UtxoCoinBuildError::HwContextNotInitialized)?; @@ -379,7 +379,7 @@ pub trait UtxoFieldsWithHardwareWalletBuilder: UtxoCoinBuilderCommonOps { } fn check_if_trezor_is_initialized(&self) -> UtxoCoinBuildResult<()> { - let crypto_ctx = CryptoCtx::from_ctx(self.ctx())?; + let crypto_ctx = CryptoCtx::from_ctx(self.ctx()).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| UtxoCoinBuildError::HwContextNotInitialized)?; @@ -402,7 +402,7 @@ pub trait UtxoCoinBuilderCommonOps { fn address_format(&self) -> UtxoCoinBuildResult { let format_from_req = self.activation_params().address_format.clone(); let format_from_conf = json::from_value::>(self.conf()["address_format"].clone()) - .map_to_mm(|e| UtxoConfError::InvalidAddressFormat(e.to_string()))? + .map_to_mm(|e| UtxoConfError::InvalidAddressFormat(e.to_string())).map_mm_err()? .unwrap_or(UtxoAddressFormat::Standard); let mut address_format = match format_from_req { @@ -624,7 +624,7 @@ pub trait UtxoCoinBuilderCommonOps { None => { let name = conf["name"] .as_str() - .or_mm_err(|| UtxoConfError::CurrencyNameIsNotSet)?; + .or_mm_err(|| UtxoConfError::CurrencyNameIsNotSet).map_mm_err()?; (name, false) }, } diff --git a/mm2src/coins/utxo/utxo_common.rs b/mm2src/coins/utxo/utxo_common.rs index 8f936ebd73..deeebb9270 100644 --- a/mm2src/coins/utxo/utxo_common.rs +++ b/mm2src/coins/utxo/utxo_common.rs @@ -143,7 +143,9 @@ pub async fn produce_hd_address_scanner(coin: &T) -> BalanceResult, { - Ok(UtxoAddressScanner::init(coin.as_ref().rpc_client.clone()).await?) + UtxoAddressScanner::init(coin.as_ref().rpc_client.clone()) + .await + .map_mm_err() } pub async fn scan_for_new_addresses( @@ -393,7 +395,7 @@ pub fn my_public_key(coin: &UtxoCoinFields) -> Result<&Public, MmError(coin: &T, address: &str) -> MmResult { let addr = address_from_str_unchecked(coin.as_ref(), address)?; - check_withdraw_address_supported(coin, &addr)?; + check_withdraw_address_supported(coin, &addr).map_mm_err()?; Ok(addr) } @@ -754,9 +756,9 @@ impl<'a, T: AsRef + UtxoTxGenerationOps> UtxoTxBuilder<'a, T> { kmd_rewards: None, }; - Ok(coin - .calc_interest_if_required(self.tx, data, change_script_pubkey, dust) - .await?) + coin.calc_interest_if_required(self.tx, data, change_script_pubkey, dust) + .await + .map_mm_err() } /// Generates unsigned transaction (TransactionInputSigner) from specified utxos and outputs. @@ -2217,7 +2219,7 @@ fn validate_dex_output( dex_address: &Address, fee_amount: &MmNumber, ) -> MmResult<(), ValidatePaymentError> { - let fee_amount_u64 = sat_from_big_decimal(&fee_amount.to_decimal(), coin.as_ref().decimals)?; + let fee_amount_u64 = sat_from_big_decimal(&fee_amount.to_decimal(), coin.as_ref().decimals).map_mm_err()?; match tx.outputs.get(output_index) { Some(out) => { let expected_script_pubkey = Builder::build_p2pkh(dex_address.hash()).to_bytes(); @@ -2252,7 +2254,7 @@ fn validate_burn_output( burn_script_pubkey: &Script, burn_amount: &MmNumber, ) -> MmResult<(), ValidatePaymentError> { - let burn_amount_u64 = sat_from_big_decimal(&burn_amount.to_decimal(), coin.as_ref().decimals)?; + let burn_amount_u64 = sat_from_big_decimal(&burn_amount.to_decimal(), coin.as_ref().decimals).map_mm_err()?; match tx.outputs.get(output_index) { Some(out) => { if out.script_pubkey != burn_script_pubkey.to_bytes() { @@ -2307,7 +2309,8 @@ pub fn validate_fee( .rpc_client .get_verbose_transaction(&tx.hash().reversed().into()) .compat() - .await?; + .await + .map_mm_err()?; let tx_confirmed_before_block = is_tx_confirmed_before_block(&coin, &tx_from_rpc, min_block_number) .await @@ -2505,7 +2508,12 @@ pub fn validate_payment_spend_or_refund( let coin = coin.clone(); let fut = async move { - let my_address = coin.as_ref().derivation_method.single_addr_or_err().await?; + let my_address = coin + .as_ref() + .derivation_method + .single_addr_or_err() + .await + .map_mm_err()?; let expected_script_pubkey = output_script(&my_address).map(|script| script.to_bytes())?; let output = payment_spend_tx .outputs @@ -2770,7 +2778,7 @@ pub fn sign_message_hash(coin: &UtxoCoinFields, message: &str) -> Option<[u8; 32 pub fn sign_message(coin: &UtxoCoinFields, message: &str) -> SignatureResult { let message_hash = sign_message_hash(coin, message).ok_or(SignatureError::PrefixNotFound)?; - let private_key = coin.priv_key_policy.activated_key_or_err()?.private(); + let private_key = coin.priv_key_policy.activated_key_or_err().map_mm_err()?.private(); let signature = private_key.sign_compact(&H256::from(message_hash))?; Ok(STANDARD.encode(&*signature)) } @@ -2785,7 +2793,7 @@ pub fn verify_message( let signature = CompactSignature::try_from(STANDARD.decode(signature_base64)?) .map_to_mm(|err| VerificationError::SignatureDecodingError(err.to_string()))?; let recovered_pubkey = Public::recover_compact(&H256::from(message_hash), &signature)?; - let received_address = checked_address_from_str(coin, address)?; + let received_address = checked_address_from_str(coin, address).map_mm_err()?; Ok(AddressHashEnum::from(recovered_pubkey.address_hash()) == *received_address.hash()) } @@ -4115,7 +4123,9 @@ where /// The fee to spend (receive) other payment is deducted from the trading amount so we should display it pub fn get_receiver_trade_fee(coin: T) -> TradePreimageFut { let fut = async move { - let amount_sat = get_htlc_spend_fee(&coin, DEFAULT_SWAP_TX_SPEND_SIZE, &FeeApproxStage::WithoutApprox).await?; + let amount_sat = get_htlc_spend_fee(&coin, DEFAULT_SWAP_TX_SPEND_SIZE, &FeeApproxStage::WithoutApprox) + .await + .map_mm_err()?; let amount = big_decimal_from_sat_unsigned(amount_sat, coin.as_ref().decimals).into(); Ok(TradeFee { coin: coin.as_ref().conf.ticker.clone(), diff --git a/mm2src/coins/utxo/utxo_standard.rs b/mm2src/coins/utxo/utxo_standard.rs index 99a97d846f..f4cbe18637 100644 --- a/mm2src/coins/utxo/utxo_standard.rs +++ b/mm2src/coins/utxo/utxo_standard.rs @@ -816,7 +816,7 @@ impl TakerCoinSwapOpsV2 for UtxoStandardCoin { wait_until, 10., ) - .await?; + .await.map_mm_err()?; Ok(res) } @@ -1285,7 +1285,7 @@ impl CoinWithTxHistoryV2 for UtxoStandardCoin { #[async_trait] impl UtxoTxHistoryOps for UtxoStandardCoin { async fn my_addresses(&self) -> MmResult, UtxoMyAddressesHistoryError> { - let addresses = self.all_addresses().await?; + let addresses = self.all_addresses().await.map_mm_err()?; Ok(addresses) } diff --git a/mm2src/coins/utxo/utxo_withdraw.rs b/mm2src/coins/utxo/utxo_withdraw.rs index 2bb0aa75d2..e9a21ffd33 100644 --- a/mm2src/coins/utxo/utxo_withdraw.rs +++ b/mm2src/coins/utxo/utxo_withdraw.rs @@ -101,7 +101,8 @@ where let secret = coin .as_ref() .priv_key_policy - .hd_wallet_derived_priv_key_or_err(derivation_path)?; + .hd_wallet_derived_priv_key_or_err(derivation_path) + .map_mm_err()?; let private = Private { prefix: coin.as_ref().conf.wif_prefix, @@ -150,7 +151,7 @@ where let decimals = coin.as_ref().decimals; let req = self.request(); - let to = coin.address_from_str(&req.to)?; + let to = coin.address_from_str(&req.to).map_mm_err()?; // Generate unsigned transaction. self.on_generating_transaction()?; @@ -158,14 +159,17 @@ where let script_pubkey = output_script(&to).map(|script| script.to_bytes())?; let _utxo_lock = UTXO_LOCK.lock().await; - let (unspents, _) = coin.get_unspent_ordered_list(&self.sender_address()).await?; + let (unspents, _) = coin + .get_unspent_ordered_list(&self.sender_address()) + .await + .map_mm_err()?; let (value, fee_policy) = if req.max { ( unspents.iter().fold(0, |sum, unspent| sum + unspent.value), FeePolicy::DeductFromOutput(0), ) } else { - let value = sat_from_big_decimal(&req.amount, decimals)?; + let value = sat_from_big_decimal(&req.amount, decimals).map_mm_err()?; (value, FeePolicy::SendExact) }; let outputs = vec![TransactionOutput { value, script_pubkey }]; @@ -179,11 +183,11 @@ where match req.fee { Some(WithdrawFee::UtxoFixed { ref amount }) => { - let fixed = sat_from_big_decimal(amount, decimals)?; + let fixed = sat_from_big_decimal(amount, decimals).map_mm_err()?; tx_builder = tx_builder.with_fee(ActualTxFee::FixedPerKb(fixed)); }, Some(WithdrawFee::UtxoPerKbyte { ref amount }) => { - let dynamic = sat_from_big_decimal(amount, decimals)?; + let dynamic = sat_from_big_decimal(amount, decimals).map_mm_err()?; tx_builder = tx_builder.with_fee(ActualTxFee::Dynamic(dynamic)); }, Some(ref fee_policy) => { @@ -275,20 +279,21 @@ where amount_display, self.req.coin, self.from_address_string, self.req.to, ); - Ok(self - .task_handle - .update_in_progress_status(WithdrawInProgressStatus::GeneratingTransaction)?) + self.task_handle + .update_in_progress_status(WithdrawInProgressStatus::GeneratingTransaction) + .map_mm_err() } fn on_finishing(&self) -> Result<(), MmError> { - Ok(self - .task_handle - .update_in_progress_status(WithdrawInProgressStatus::Finishing)?) + self.task_handle + .update_in_progress_status(WithdrawInProgressStatus::Finishing) + .map_mm_err() } async fn sign_tx(&self, unsigned_tx: TransactionInputSigner) -> Result> { self.task_handle - .update_in_progress_status(WithdrawInProgressStatus::SigningTransaction)?; + .update_in_progress_status(WithdrawInProgressStatus::SigningTransaction) + .map_mm_err()?; let mut sign_params = UtxoSignTxParamsBuilder::new(); @@ -332,19 +337,20 @@ where sign_params .with_signature_version(self.signature_version()) .with_unsigned_tx(unsigned_tx); - let sign_params = sign_params.build()?; + let sign_params = sign_params.build().map_mm_err()?; let signed = match self.coin.as_ref().priv_key_policy { - PrivKeyPolicy::Iguana(ref key_pair) => { - self.coin - .sign_tx(sign_params, SignPolicy::WithKeyPair(key_pair)) - .await? - }, + PrivKeyPolicy::Iguana(ref key_pair) => self + .coin + .sign_tx(sign_params, SignPolicy::WithKeyPair(key_pair)) + .await + .map_mm_err()?, PrivKeyPolicy::HDWallet { .. } => { - let from_key_pair = derive_hd_key_pair(self.coin(), &self.from_derivation_path)?; + let from_key_pair = derive_hd_key_pair(self.coin(), &self.from_derivation_path).map_mm_err()?; self.coin() .sign_tx(sign_params, SignPolicy::WithKeyPair(&from_key_pair)) - .await? + .await + .map_mm_err()? }, PrivKeyPolicy::Trezor => { let trezor_statuses = TrezorRequestStatuses { @@ -355,16 +361,18 @@ where }; let sign_processor = TrezorRpcTaskProcessor::new(self.task_handle.clone(), trezor_statuses); let sign_processor = Arc::new(sign_processor); - let crypto_ctx = CryptoCtx::from_ctx(&self.ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(&self.ctx).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| WithdrawError::HwError(HwRpcError::NoTrezorDeviceAvailable))?; - let trezor_session = hw_ctx.trezor(sign_processor).await?; + let trezor_session = hw_ctx.trezor(sign_processor).await.map_mm_err()?; self.task_handle - .update_in_progress_status(WithdrawInProgressStatus::WaitingForUserToConfirmSigning)?; + .update_in_progress_status(WithdrawInProgressStatus::WaitingForUserToConfirmSigning) + .map_mm_err()?; self.coin .sign_tx(sign_params, SignPolicy::WithTrezor(trezor_session)) - .await? + .await + .map_mm_err()? }, #[cfg(target_arch = "wasm32")] PrivKeyPolicy::Metamask(_) => { @@ -446,7 +454,8 @@ where &self.key_pair, self.signature_version(), self.coin.as_ref().conf.fork_id, - )?) + ) + .map_mm_err()?) } } diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 52003a6d8b..3b8eab4659 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -917,7 +917,7 @@ impl<'a> UtxoCoinBuilder for ZCoinBuilder<'a> { fn priv_key_policy(&self) -> PrivKeyBuildPolicy { self.priv_key_policy.clone() } async fn build(self) -> MmResult { - let utxo = self.build_utxo_fields().await?; + let utxo = self.build_utxo_fields().await.map_mm_err()?; let utxo_arc = UtxoArc::new(utxo); let z_spending_key = match self.z_spending_key { @@ -953,29 +953,30 @@ impl<'a> UtxoCoinBuilder for ZCoinBuilder<'a> { &my_z_addr, ); - let blocks_db = self.init_blocks_db().await?; + let blocks_db = self.init_blocks_db().await.map_mm_err()?; let (sync_state_connector, light_wallet_db) = match &self.z_coin_params.mode { #[cfg(not(target_arch = "wasm32"))] ZcoinRpcMode::Native => { - init_native_client(&self, self.native_client()?, blocks_db, &z_spending_key).await? + init_native_client(&self, self.native_client().map_mm_err()?, blocks_db, &z_spending_key) + .await + .map_mm_err()? }, ZcoinRpcMode::Light { light_wallet_d_servers, sync_params, skip_sync_params, .. - } => { - init_light_client( - &self, - light_wallet_d_servers.clone(), - blocks_db, - sync_params, - skip_sync_params.unwrap_or_default(), - &z_spending_key, - ) - .await? - }, + } => init_light_client( + &self, + light_wallet_d_servers.clone(), + blocks_db, + sync_params, + skip_sync_params.unwrap_or_default(), + &z_spending_key, + ) + .await + .map_mm_err()?, }; let z_fields = Arc::new(ZCoinFields { @@ -1432,8 +1433,14 @@ impl SwapOps for ZCoin { ))) }, }; - let fee_amount_sat = validate_fee_args.dex_fee.fee_amount_as_u64(self.utxo_arc.decimals)?; - let burn_amount_sat = validate_fee_args.dex_fee.burn_amount_as_u64(self.utxo_arc.decimals)?; + let fee_amount_sat = validate_fee_args + .dex_fee + .fee_amount_as_u64(self.utxo_arc.decimals) + .map_mm_err()?; + let burn_amount_sat = validate_fee_args + .dex_fee + .burn_amount_as_u64(self.utxo_arc.decimals) + .map_mm_err()?; let expected_memo = MemoBytes::from_bytes(validate_fee_args.uuid).expect("Uuid length < 512"); let tx_hash = H256::from(z_tx.txid().0).reversed(); @@ -1676,7 +1683,7 @@ impl MmCoin for ZCoin { ) -> TradePreimageResult { Ok(TradeFee { coin: self.ticker().to_owned(), - amount: self.get_one_kbyte_tx_fee().await?.into(), + amount: self.get_one_kbyte_tx_fee().await.map_mm_err()?.into(), paid_from_trading_vol: false, }) } @@ -1692,7 +1699,7 @@ impl MmCoin for ZCoin { ) -> TradePreimageResult { Ok(TradeFee { coin: self.ticker().to_owned(), - amount: self.get_one_kbyte_tx_fee().await?.into(), + amount: self.get_one_kbyte_tx_fee().await.map_mm_err()?.into(), paid_from_trading_vol: false, }) } @@ -1915,27 +1922,30 @@ impl InitWithdrawCoin for ZCoin { .map_to_mm(|e| WithdrawError::InvalidAddress(format!("{}", e)))? .or_mm_err(|| WithdrawError::InvalidAddress(format!("Address {} decoded to None", req.to)))?; let amount = if req.max { - let fee = self.get_one_kbyte_tx_fee().await?; - let balance = self.my_balance().compat().await?; + let fee = self.get_one_kbyte_tx_fee().await.map_mm_err()?; + let balance = self.my_balance().compat().await.map_mm_err()?; balance.spendable - fee } else { req.amount }; - task_handle.update_in_progress_status(WithdrawInProgressStatus::GeneratingTransaction)?; - let satoshi = sat_from_big_decimal(&amount, self.decimals())?; + task_handle + .update_in_progress_status(WithdrawInProgressStatus::GeneratingTransaction) + .map_mm_err()?; + let satoshi = sat_from_big_decimal(&amount, self.decimals()).map_mm_err()?; let memo = req.memo.as_deref().map(interpret_memo_string).transpose()?; let z_output = ZOutput { to_addr, amount: Amount::from_u64(satoshi) - .map_to_mm(|_| NumConversError(format!("Failed to get ZCash amount from {}", amount)))?, + .map_to_mm(|_| NumConversError(format!("Failed to get ZCash amount from {}", amount))) + .map_mm_err()?, // TODO add optional viewing_key and memo fields to the WithdrawRequest viewing_key: Some(self.z_fields.evk.fvk.ovk), memo, }; - let (tx, data, _sync_guard) = self.gen_tx(vec![], vec![z_output]).await?; + let (tx, data, _sync_guard) = self.gen_tx(vec![], vec![z_output]).await.map_mm_err()?; let mut tx_bytes = Vec::with_capacity(1024); tx.write(&mut tx_bytes) .map_to_mm(|e| WithdrawError::InternalError(e.to_string()))?; diff --git a/mm2src/coins/z_coin/z_rpc.rs b/mm2src/coins/z_coin/z_rpc.rs index e4340beaee..27baba3ab3 100644 --- a/mm2src/coins/z_coin/z_rpc.rs +++ b/mm2src/coins/z_coin/z_rpc.rs @@ -382,7 +382,7 @@ impl ZRpcOps for LightRpcClient { #[async_trait] impl ZRpcOps for NativeClient { async fn get_block_height(&self) -> Result> { - Ok(self.get_block_count().compat().await?) + Ok(self.get_block_count().compat().await.map_mm_err()?) } async fn get_tree_state(&self, _height: u64) -> Result> { todo!() } @@ -395,13 +395,13 @@ impl ZRpcOps for NativeClient { handler: &mut SaplingSyncLoopHandle, ) -> Result<(), MmError> { for height in start_block..=last_block { - let block = self.get_block_by_height(height).await?; + let block = self.get_block_by_height(height).await.map_mm_err()?; debug!("Got block {:?}", block); let mut compact_txs = Vec::with_capacity(block.tx.len()); // By default, CompactBlocks only contain CompactTxs for transactions that contain Sapling spends or outputs. // Create and push compact_tx during iteration. for (tx_id, hash_tx) in block.tx.iter().enumerate() { - let tx_bytes = self.get_transaction_bytes(hash_tx).compat().await?; + let tx_bytes = self.get_transaction_bytes(hash_tx).compat().await.map_mm_err()?; let tx = ZTransaction::read(tx_bytes.as_slice()).unwrap(); let mut spends = Vec::new(); let mut outputs = Vec::new(); diff --git a/mm2src/coins_activation/src/bch_with_tokens_activation.rs b/mm2src/coins_activation/src/bch_with_tokens_activation.rs index b38c1bee36..289c0785a6 100644 --- a/mm2src/coins_activation/src/bch_with_tokens_activation.rs +++ b/mm2src/coins_activation/src/bch_with_tokens_activation.rs @@ -226,7 +226,7 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { activation_request: Self::ActivationRequest, protocol_conf: Self::PlatformProtocolInfo, ) -> Result> { - let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx)?; + let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx).map_mm_err::()?; let slp_prefix = CashAddrPrefix::from_str(&protocol_conf.slp_prefix).map_to_mm(|error| { BchWithTokensActivationError::InvalidSlpPrefix { @@ -245,7 +245,9 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { priv_key_policy, ) .await - .map_to_mm(|error| BchWithTokensActivationError::PlatformCoinCreationError { ticker, error })?; + .map_to_mm(|error| BchWithTokensActivationError::PlatformCoinCreationError { ticker, error }) + .map_mm_err::()?; + Ok(platform_coin) } @@ -280,26 +282,53 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { activation_request: &Self::ActivationRequest, _nft_global: &Option, ) -> Result> { - let current_block = self.as_ref().rpc_client.get_block_count().compat().await?; + let current_block = self + .as_ref() + .rpc_client + .get_block_count() + .compat() + .await + .map_mm_err::()?; - let my_address = self.as_ref().derivation_method.single_addr_or_err().await?; + let my_address = self + .as_ref() + .derivation_method + .single_addr_or_err() + .await + .map_mm_err::()?; let my_slp_address = self .get_my_slp_address() .await - .map_to_mm(BchWithTokensActivationError::Internal)? + .map_to_mm(BchWithTokensActivationError::Internal) + .map_mm_err::()? .encode() - .map_to_mm(BchWithTokensActivationError::Internal)?; - let pubkey = self.my_public_key()?.to_string(); + .map_to_mm(BchWithTokensActivationError::Internal) + .map_mm_err::()?; + + let pubkey = self + .my_public_key() + .map_mm_err::()? + .to_string(); let mut bch_address_info = CoinAddressInfo { - derivation_method: self.as_ref().derivation_method.to_response().await?, + derivation_method: self + .as_ref() + .derivation_method + .to_response() + .await + .map_mm_err::()?, pubkey: pubkey.clone(), balances: None, tickers: None, }; let mut slp_address_info = CoinAddressInfo { - derivation_method: self.as_ref().derivation_method.to_response().await?, + derivation_method: self + .as_ref() + .derivation_method + .to_response() + .await + .map_mm_err::()?, pubkey: pubkey.clone(), balances: None, tickers: None, @@ -318,7 +347,10 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { }); } - let bch_unspents = self.bch_unspents_for_display(&my_address).await?; + let bch_unspents = self + .bch_unspents_for_display(&my_address) + .await + .map_mm_err::()?; bch_address_info.balances = Some(bch_unspents.platform_balance(self.decimals())); drop_mutability!(bch_address_info); diff --git a/mm2src/coins_activation/src/erc20_token_activation.rs b/mm2src/coins_activation/src/erc20_token_activation.rs index c73672d9e8..aa9d66ddeb 100644 --- a/mm2src/coins_activation/src/erc20_token_activation.rs +++ b/mm2src/coins_activation/src/erc20_token_activation.rs @@ -150,9 +150,15 @@ impl TokenActivationOps for EthCoin { erc20_protocol, is_custom, ) - .await?; + .await + .map_mm_err::()?; - let address = token.derivation_method().single_addr_or_err().await?.display_address(); + let address = token + .derivation_method() + .single_addr_or_err() + .await + .map_mm_err::()? + .display_address(); let token_contract_address = token.erc20_token_address().ok_or_else(|| { EthTokenActivationError::InternalError("Token contract address is missing".to_string()) })?; @@ -186,9 +192,10 @@ impl TokenActivationOps for EthCoin { )); } let nft_global = match &nft_init_params.provider { - NftProviderEnum::Moralis { url, komodo_proxy } => { - platform_coin.initialize_global_nft(url, *komodo_proxy).await? - }, + NftProviderEnum::Moralis { url, komodo_proxy } => platform_coin + .initialize_global_nft(url, *komodo_proxy) + .await + .map_mm_err::()?, }; let nfts = nft_global.nfts_infos.lock().await.clone(); let init_result = EthTokenInitResult::Nft(NftInitResult { diff --git a/mm2src/coins_activation/src/eth_with_token_activation.rs b/mm2src/coins_activation/src/eth_with_token_activation.rs index d8c4a0f49e..20f261488d 100644 --- a/mm2src/coins_activation/src/eth_with_token_activation.rs +++ b/mm2src/coins_activation/src/eth_with_token_activation.rs @@ -302,7 +302,10 @@ impl PlatformCoinWithTokensActivationOps for EthCoin { }, None => return Ok(None), }; - let nft_global = self.initialize_global_nft(url, proxy_auth).await?; + let nft_global = self + .initialize_global_nft(url, proxy_auth) + .await + .map_mm_err::()?; Ok(Some(MmCoinEnum::EthCoin(nft_global))) } @@ -344,15 +347,15 @@ impl PlatformCoinWithTokensActivationOps for EthCoin { match self.derivation_method() { DerivationMethod::SingleAddress(my_address) => { - let pubkey = self.get_public_key().await?; + let pubkey = self.get_public_key().await.map_mm_err()?; let mut eth_address_info = CoinAddressInfo { - derivation_method: self.derivation_method().to_response().await?, + derivation_method: self.derivation_method().to_response().await.map_mm_err()?, pubkey: pubkey.clone(), balances: None, tickers: None, }; let mut erc20_address_info = CoinAddressInfo { - derivation_method: self.derivation_method().to_response().await?, + derivation_method: self.derivation_method().to_response().await.map_mm_err()?, pubkey, balances: None, tickers: None, @@ -425,7 +428,8 @@ impl PlatformCoinWithTokensActivationOps for EthCoin { activation_request.platform_request.enable_params.clone(), &activation_request.platform_request.path_to_address, ) - .await?; + .await + .map_mm_err()?; Ok(EthWithTokensActivationResult::HD(HDEthWithTokensActivationResult { current_block, @@ -457,7 +461,9 @@ fn eth_priv_key_build_policy( activation_policy: &EthPrivKeyActivationPolicy, ) -> MmResult { match activation_policy { - EthPrivKeyActivationPolicy::ContextPrivKey => Ok(EthPrivKeyBuildPolicy::detect_priv_key_policy(ctx)?), + EthPrivKeyActivationPolicy::ContextPrivKey => { + Ok(EthPrivKeyBuildPolicy::detect_priv_key_policy(ctx).map_mm_err::()?) + }, #[cfg(target_arch = "wasm32")] EthPrivKeyActivationPolicy::Metamask => { let metamask_ctx = crypto::CryptoCtx::from_ctx(ctx)? diff --git a/mm2src/coins_activation/src/init_erc20_token_activation.rs b/mm2src/coins_activation/src/init_erc20_token_activation.rs index f162cb1754..fc73786357 100644 --- a/mm2src/coins_activation/src/init_erc20_token_activation.rs +++ b/mm2src/coins_activation/src/init_erc20_token_activation.rs @@ -138,7 +138,7 @@ impl InitTokenActivationOps for EthCoin { protocol_conf, is_custom, ) - .await?; + .await.map_mm_err()?; Ok(token) } @@ -156,7 +156,7 @@ impl InitTokenActivationOps for EthCoin { .current_block() .compat() .await - .map_to_mm(EthTokenActivationError::Transport)?; + .map_to_mm(EthTokenActivationError::Transport).map_mm_err()?; let xpub_extractor = if self.is_trezor() { Some( @@ -172,15 +172,15 @@ impl InitTokenActivationOps for EthCoin { None }; - task_handle.update_in_progress_status(InitTokenInProgressStatus::RequestingWalletBalance)?; + task_handle.update_in_progress_status(InitTokenInProgressStatus::RequestingWalletBalance).map_mm_err()?; let wallet_balance = self .enable_coin_balance( xpub_extractor, activation_request.enable_params.clone(), &activation_request.path_to_address, ) - .await?; - task_handle.update_in_progress_status(InitTokenInProgressStatus::ActivatingCoin)?; + .await.map_mm_err()?; + task_handle.update_in_progress_status(InitTokenInProgressStatus::ActivatingCoin).map_mm_err()?; let token_contract_address = self .erc20_token_address() diff --git a/mm2src/coins_activation/src/init_token.rs b/mm2src/coins_activation/src/init_token.rs index 6b32f83622..2ed7b7b80d 100644 --- a/mm2src/coins_activation/src/init_token.rs +++ b/mm2src/coins_activation/src/init_token.rs @@ -12,7 +12,7 @@ use crypto::hw_rpc_task::{HwConnectStatuses, HwRpcTaskAwaitingStatus, HwRpcTaskU use crypto::HwRpcError; use derive_more::Display; use mm2_core::mm_ctx::MmArc; -use mm2_err_handle::mm_error::{MmError, MmResult, NotEqual, NotMmError}; +use mm2_err_handle::mm_error::{MmError, MmResult, NotMmError}; use mm2_err_handle::prelude::*; use rpc_task::rpc_common::{CancelRpcTaskError, CancelRpcTaskRequest, InitRpcTaskResponse, RpcTaskStatusError, RpcTaskStatusRequest, RpcTaskUserActionError, RpcTaskUserActionRequest}; @@ -49,13 +49,7 @@ pub trait InitTokenActivationOps: Into + TokenOf + Clone + Send + Sy type ActivationRequest: Clone + Send + Sync; type ProtocolInfo: TokenProtocolParams + TryFromCoinProtocol + Clone + Send + Sync; type ActivationResult: CurrentBlock + serde::Serialize + Clone + Send + Sync; - type ActivationError: From - + Into - + NotEqual - + SerMmErrorType - + Clone - + Send - + Sync; + type ActivationError: From + Into + SerMmErrorType + Clone + Send + Sync; type InProgressStatus: InitTokenInitialStatus + serde::Serialize + Clone + Send + Sync; type AwaitingStatus: serde::Serialize + Clone + Send + Sync; type UserAction: NotMmError + Send + Sync; @@ -93,7 +87,6 @@ where Token: InitTokenActivationOps + Send + Sync + 'static, Token::InProgressStatus: InitTokenInitialStatus, InitTokenError: From, - (Token::ActivationError, InitTokenError): NotEqual, { let (client_id, request) = (request.client_id, request.inner); if let Ok(Some(_)) = lp_coinfind(&ctx, &request.ticker).await { @@ -101,7 +94,7 @@ where } let (token_conf, token_protocol): (_, Token::ProtocolInfo) = - coin_conf_with_protocol(&ctx, &request.ticker, request.protocol.clone())?; + coin_conf_with_protocol(&ctx, &request.ticker, request.protocol.clone()).map_mm_err::()?; let platform_coin = lp_coinfind_or_err(&ctx, token_protocol.platform_coin_ticker()) .await @@ -113,7 +106,9 @@ where token_ticker: request.ticker.clone(), })?; - let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx).map_to_mm(InitTokenError::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(InitTokenError::Internal) + .map_mm_err::()?; let spawner = ctx.spawner(); let task = InitTokenTask:: { ctx, @@ -160,7 +155,9 @@ pub async fn init_token_user_action( let mut task_manager = Token::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitTokenUserActionError::Internal(poison.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + task_manager + .on_user_action(req.task_id, req.user_action) + .map_mm_err::()?; Ok(SuccessResponse::new()) } @@ -173,7 +170,9 @@ pub async fn cancel_init_token( let mut task_manager = Standalone::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| CancelInitTokenError::Internal(poison.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager + .cancel_task(req.task_id) + .map_mm_err::()?; Ok(SuccessResponse::new()) } @@ -237,7 +236,10 @@ where log::info!("{} current block {}", ticker, activation_result.current_block()); let coins_ctx = CoinsContext::from_ctx(&self.ctx).unwrap(); - coins_ctx.add_token(token.clone().into()).await?; + coins_ctx + .add_token(token.clone().into()) + .await + .map_mm_err::()?; self.platform_coin.register_token_info(&token); diff --git a/mm2src/coins_activation/src/l2/init_l2.rs b/mm2src/coins_activation/src/l2/init_l2.rs index 3dd3276ec6..cbe31dbf5c 100644 --- a/mm2src/coins_activation/src/l2/init_l2.rs +++ b/mm2src/coins_activation/src/l2/init_l2.rs @@ -81,7 +81,8 @@ where return MmError::err(InitL2Error::L2IsAlreadyActivated(ticker)); } - let (coin_conf_json, protocol_conf): (Json, L2::ProtocolInfo) = coin_conf_with_protocol(&ctx, &ticker, None)?; + let (coin_conf_json, protocol_conf): (Json, L2::ProtocolInfo) = + coin_conf_with_protocol(&ctx, &ticker, None).map_mm_err::()?; let coin_conf = L2::coin_conf_from_json(coin_conf_json)?; let platform_coin = lp_coinfind_or_err(&ctx, protocol_conf.platform_coin_ticker()) @@ -98,7 +99,9 @@ where let validated_params = L2::validate_activation_params(req.activation_params.clone())?; - let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx).map_to_mm(InitL2Error::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(InitL2Error::Internal) + .map_mm_err::()?; let spawner = ctx.spawner(); let task = InitL2Task:: { ctx, @@ -126,7 +129,9 @@ pub async fn init_l2_status( where InitL2Error: From, { - let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx).map_to_mm(InitL2StatusError::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(InitL2StatusError::Internal) + .map_mm_err::()?; let mut task_manager = L2::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitL2StatusError::Internal(poison.to_string()))?; @@ -140,11 +145,15 @@ pub async fn init_l2_user_action( ctx: MmArc, req: InitL2UserActionRequest, ) -> MmResult { - let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx).map_to_mm(InitL2UserActionError::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(InitL2UserActionError::Internal) + .map_mm_err::()?; let mut task_manager = L2::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitL2UserActionError::Internal(poison.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + task_manager + .on_user_action(req.task_id, req.user_action) + .map_mm_err::()?; Ok(SuccessResponse::new()) } @@ -152,11 +161,14 @@ pub async fn cancel_init_l2( ctx: MmArc, req: CancelRpcTaskRequest, ) -> MmResult { - let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx).map_to_mm(CancelInitL2Error::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(CancelInitL2Error::Internal) + .map_mm_err::()?; let mut task_manager = L2::rpc_task_manager(&coins_act_ctx) .lock() - .map_to_mm(|poison| CancelInitL2Error::Internal(poison.to_string()))?; - task_manager.cancel_task(req.task_id)?; + .map_to_mm(|poison| CancelInitL2Error::Internal(poison.to_string())) + .map_mm_err::()?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -205,8 +217,10 @@ where ) .await?; - let c_ctx = CoinsContext::from_ctx(&self.ctx).map_to_mm(RegisterCoinError::Internal)?; - c_ctx.add_l2(coin.into()).await?; + let c_ctx = CoinsContext::from_ctx(&self.ctx) + .map_to_mm(RegisterCoinError::Internal) + .map_mm_err()?; + c_ctx.add_l2(coin.into()).await.map_mm_err()?; Ok(result) } diff --git a/mm2src/coins_activation/src/lightning_activation.rs b/mm2src/coins_activation/src/lightning_activation.rs index 1d2f9ec232..ad8f6be537 100644 --- a/mm2src/coins_activation/src/lightning_activation.rs +++ b/mm2src/coins_activation/src/lightning_activation.rs @@ -276,7 +276,7 @@ impl InitL2ActivationOps for LightningCoin { activation_params.color.unwrap_or_else(|| "000000".into()), &mut node_color as &mut [u8], ) - .map_to_mm(|_| LightningValidationErr::InvalidRequest("Invalid Hex Color".into()))?; + .map_to_mm(|_| LightningValidationErr::InvalidRequest("Invalid Hex Color".into())).map_mm_err()?; let listening_port = activation_params.listening_port.unwrap_or(DEFAULT_LISTENING_PORT); @@ -305,10 +305,10 @@ impl InitL2ActivationOps for LightningCoin { validated_params, task_handle, ) - .await?; + .await.map_mm_err()?; Timer::sleep(10.).await; - let address = lightning_coin.my_address()?; + let address = lightning_coin.my_address().map_mm_err()?; let balance = lightning_coin .my_balance() .compat() @@ -344,8 +344,8 @@ async fn start_lightning( protocol_conf.network.clone(), protocol_conf.confirmation_targets, )?); - task_handle.update_in_progress_status(LightningInProgressStatus::GettingFeesFromRPC)?; - platform.set_latest_fees().await?; + task_handle.update_in_progress_status(LightningInProgressStatus::GettingFeesFromRPC).map_mm_err()?; + platform.set_latest_fees().await.map_mm_err()?; // Initialize the Logger let logger = ctx.log.0.clone(); @@ -357,7 +357,7 @@ async fn start_lightning( let keys_manager = init_keys_manager(&platform)?; // Initialize the P2PGossipSync. This is used for providing routes to send payments over - task_handle.update_in_progress_status(LightningInProgressStatus::ReadingNetworkGraphFromFile)?; + task_handle.update_in_progress_status(LightningInProgressStatus::ReadingNetworkGraphFromFile).map_mm_err()?; let network_graph = Arc::new( persister .get_network_graph(protocol_conf.network.into(), logger.clone()) @@ -374,7 +374,7 @@ async fn start_lightning( let db = init_db(ctx, conf.ticker.clone()).await?; // Initialize the ChannelManager - task_handle.update_in_progress_status(LightningInProgressStatus::InitializingChannelManager)?; + task_handle.update_in_progress_status(LightningInProgressStatus::InitializingChannelManager).map_mm_err()?; let (chain_monitor, channel_manager) = init_channel_manager( platform.clone(), logger.clone(), @@ -386,7 +386,7 @@ async fn start_lightning( .await?; // Initialize the PeerManager - task_handle.update_in_progress_status(LightningInProgressStatus::InitializingPeerManager)?; + task_handle.update_in_progress_status(LightningInProgressStatus::InitializingPeerManager).map_mm_err()?; let peer_manager = init_peer_manager( ctx.clone(), &platform, @@ -412,7 +412,7 @@ async fn start_lightning( )); // Initialize routing Scorer - task_handle.update_in_progress_status(LightningInProgressStatus::ReadingScorerFromFile)?; + task_handle.update_in_progress_status(LightningInProgressStatus::ReadingScorerFromFile).map_mm_err()?; // status_notifier // .try_send(LightningInProgressStatus::ReadingScorerFromFile) // .debug_log_with_msg("No one seems interested in LightningInProgressStatus"); @@ -445,7 +445,7 @@ async fn start_lightning( // InvoicePayer will act as our event handler as it handles some of the payments related events before // delegating it to LightningEventHandler. // note: background_processor stops automatically when dropped since BackgroundProcessor implements the Drop trait. - task_handle.update_in_progress_status(LightningInProgressStatus::InitializingBackgroundProcessor)?; + task_handle.update_in_progress_status(LightningInProgressStatus::InitializingBackgroundProcessor).map_mm_err()?; let background_processor = Arc::new(BackgroundProcessor::start( persister.clone(), invoice_payer.clone(), @@ -458,7 +458,7 @@ async fn start_lightning( )); // If channel_nodes_data file exists, read channels nodes data from disk and reconnect to channel nodes/peers if possible. - task_handle.update_in_progress_status(LightningInProgressStatus::ReadingChannelsAddressesFromFile)?; + task_handle.update_in_progress_status(LightningInProgressStatus::ReadingChannelsAddressesFromFile).map_mm_err()?; let open_channels_nodes = Arc::new(PaMutex::new( get_open_channels_nodes_addresses(persister.clone(), channel_manager.clone()).await?, )); diff --git a/mm2src/coins_activation/src/platform_coin_with_tokens.rs b/mm2src/coins_activation/src/platform_coin_with_tokens.rs index 5c1677865e..ddcc5c927a 100644 --- a/mm2src/coins_activation/src/platform_coin_with_tokens.rs +++ b/mm2src/coins_activation/src/platform_coin_with_tokens.rs @@ -127,7 +127,6 @@ impl TokenAsMmCoinInitializer for T where T: TokenInitializer + Send + Sync, InitTokensAsMmCoinsError: From, - (T::InitTokensError, InitTokensAsMmCoinsError): NotEqual, { type PlatformCoin = ::PlatformCoin; type ActivationRequest = ::ActivationRequest; @@ -142,7 +141,8 @@ where .into_iter() .map(|req| -> Result<_, MmError> { let (token_conf, protocol): (_, T::TokenProtocol) = - coin_conf_with_protocol(&ctx, &req.ticker, req.protocol.clone())?; + coin_conf_with_protocol(&ctx, &req.ticker, req.protocol.clone()) + .map_mm_err::()?; Ok(TokenActivationParams { ticker: req.ticker, conf: token_conf, @@ -151,9 +151,13 @@ where is_custom: req.protocol.is_some(), }) }) - .collect::, _>>()?; + .collect::, _>>() + .map_mm_err::()?; - let tokens = self.enable_tokens(token_params).await?; + let tokens = self + .enable_tokens(token_params) + .await + .map_mm_err::()?; for token in tokens.iter() { self.platform_coin().register_token_info(token); } @@ -170,13 +174,7 @@ pub trait PlatformCoinWithTokensActivationOps: Into + Clone + Send + type ActivationRequest: Clone + Send + Sync + TxHistory + ActivationRequestInfo; type PlatformProtocolInfo: TryFromCoinProtocol + Send; type ActivationResult: GetPlatformBalance + CurrentBlock + serde::Serialize + Send + Clone + Sync + 'static; - type ActivationError: NotMmError - + std::fmt::Debug - + NotEqual - + Into - + Clone - + Send - + Sync; + type ActivationError: NotMmError + std::fmt::Debug + Into + Clone + Send + Sync; type InProgressStatus: InitPlatformCoinWithTokensInitialStatus + serde::Serialize + Clone + Send + Sync; type AwaitingStatus: serde::Serialize + Clone + Send + Sync; @@ -389,19 +387,25 @@ pub async fn re_enable_passive_platform_coin_with_tokens( where Platform: PlatformCoinWithTokensActivationOps + Clone, EnablePlatformCoinWithTokensError: From, - (Platform::ActivationError, EnablePlatformCoinWithTokensError): NotEqual, { let mut mm_tokens = Vec::new(); for initializer in platform_coin.token_initializers() { - let tokens = initializer.enable_tokens_as_mm_coins(ctx.clone(), &req.request).await?; + let tokens = initializer + .enable_tokens_as_mm_coins(ctx.clone(), &req.request) + .await + .map_mm_err::()?; mm_tokens.extend(tokens); } - let nft_global = platform_coin.enable_global_nft(&req.request).await?; + let nft_global = platform_coin + .enable_global_nft(&req.request) + .await + .map_mm_err::()?; let activation_result = platform_coin .get_activation_result(task_handle, &req.request, &nft_global) - .await?; + .await + .map_mm_err::()?; log::info!("{} current block {}", req.ticker, activation_result.current_block()); let coins_ctx = CoinsContext::from_ctx(&ctx).unwrap(); @@ -420,7 +424,6 @@ pub async fn enable_platform_coin_with_tokens( where Platform: PlatformCoinWithTokensActivationOps, EnablePlatformCoinWithTokensError: From, - (Platform::ActivationError, EnablePlatformCoinWithTokensError): NotEqual, { if req.request.is_hw_policy() { return MmError::err(EnablePlatformCoinWithTokensError::UnexpectedDeviceActivationPolicy); @@ -436,7 +439,6 @@ pub async fn enable_platform_coin_with_tokens_impl( where Platform: PlatformCoinWithTokensActivationOps + Clone, EnablePlatformCoinWithTokensError: From, - (Platform::ActivationError, EnablePlatformCoinWithTokensError): NotEqual, { if let Ok(Some(coin)) = lp_coinfind_any(&ctx, &req.ticker).await { if !coin.is_available() { @@ -450,7 +452,8 @@ where )); } - let (platform_conf, platform_protocol) = coin_conf_with_protocol(&ctx, &req.ticker, None)?; + let (platform_conf, platform_protocol) = + coin_conf_with_protocol(&ctx, &req.ticker, None).map_mm_err::()?; let platform_coin = Platform::enable_platform_coin( ctx.clone(), @@ -459,25 +462,35 @@ where req.request.clone(), platform_protocol, ) - .await?; + .await + .map_mm_err::()?; let mut mm_tokens = Vec::new(); for initializer in platform_coin.token_initializers() { - let tokens = initializer.enable_tokens_as_mm_coins(ctx.clone(), &req.request).await?; + let tokens = initializer + .enable_tokens_as_mm_coins(ctx.clone(), &req.request) + .await + .map_mm_err::()?; mm_tokens.extend(tokens); } - let nft_global = platform_coin.enable_global_nft(&req.request).await?; + let nft_global = platform_coin + .enable_global_nft(&req.request) + .await + .map_mm_err::()?; let activation_result = platform_coin .get_activation_result(task_handle, &req.request, &nft_global) - .await?; + .await + .map_mm_err::()?; log::info!("{} current block {}", req.ticker, activation_result.current_block()); if req.request.tx_history() { platform_coin.start_history_background_fetching( ctx.clone(), - TxHistoryStorageBuilder::new(&ctx).build()?, + TxHistoryStorageBuilder::new(&ctx) + .build() + .map_mm_err::()?, activation_result.get_platform_balance(), ); } @@ -560,7 +573,6 @@ where Platform: PlatformCoinWithTokensActivationOps + Send + Sync + 'static + Clone, Platform::InProgressStatus: InitPlatformCoinWithTokensInitialStatus, EnablePlatformCoinWithTokensError: From, - (Platform::ActivationError, EnablePlatformCoinWithTokensError): NotEqual, { let (client_id, request) = (request.client_id, request.inner); if let Ok(Some(_)) = lp_coinfind(&ctx, &request.ticker).await { @@ -616,12 +628,16 @@ pub async fn init_platform_coin_with_tokens_user_action, { - let coins_act_ctx = - CoinsActivationContext::from_ctx(&ctx).map_to_mm(InitPlatformCoinWithTokensUserActionError::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(InitPlatformCoinWithTokensUserActionError::Internal) + .map_mm_err::()?; let mut task_manager = Platform::rpc_task_manager(&coins_act_ctx) .lock() - .map_to_mm(|poison| InitPlatformCoinWithTokensUserActionError::Internal(poison.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + .map_to_mm(|poison| InitPlatformCoinWithTokensUserActionError::Internal(poison.to_string())) + .map_mm_err::()?; + task_manager + .on_user_action(req.task_id, req.user_action) + .map_mm_err::()?; Ok(SuccessResponse::new()) } @@ -633,12 +649,16 @@ pub async fn cancel_init_platform_coin_with_tokens, { - let coins_act_ctx = - CoinsActivationContext::from_ctx(&ctx).map_to_mm(CancelInitPlatformCoinWithTokensError::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(CancelInitPlatformCoinWithTokensError::Internal) + .map_mm_err::()?; let mut task_manager = Platform::rpc_task_manager(&coins_act_ctx) .lock() - .map_to_mm(|poison| CancelInitPlatformCoinWithTokensError::Internal(poison.to_string()))?; - task_manager.cancel_task(req.task_id)?; + .map_to_mm(|poison| CancelInitPlatformCoinWithTokensError::Internal(poison.to_string())) + .map_mm_err::()?; + task_manager + .cancel_task(req.task_id) + .map_mm_err::()?; Ok(SuccessResponse::new()) } @@ -663,7 +683,7 @@ pub mod for_tests { use super::{init_platform_coin_with_tokens, init_platform_coin_with_tokens_status, EnablePlatformCoinWithTokensError, EnablePlatformCoinWithTokensReq, - EnablePlatformCoinWithTokensStatusRequest, InitPlatformCoinWithTokensInitialStatus, NotEqual, + EnablePlatformCoinWithTokensStatusRequest, InitPlatformCoinWithTokensInitialStatus, PlatformCoinWithTokensActivationOps}; /// test helper to activate platform coin with waiting for the result @@ -675,7 +695,6 @@ pub mod for_tests { Platform: PlatformCoinWithTokensActivationOps + Clone + Send + Sync + 'static, Platform::InProgressStatus: InitPlatformCoinWithTokensInitialStatus, EnablePlatformCoinWithTokensError: From, - (Platform::ActivationError, EnablePlatformCoinWithTokensError): NotEqual, { let request = RpcInitReq { client_id: 0, diff --git a/mm2src/coins_activation/src/slp_token_activation.rs b/mm2src/coins_activation/src/slp_token_activation.rs index 91dbf95ea7..66ea8d18a4 100644 --- a/mm2src/coins_activation/src/slp_token_activation.rs +++ b/mm2src/coins_activation/src/slp_token_activation.rs @@ -102,7 +102,7 @@ impl TokenActivationOps for SlpToken { required_confirmations, )?; let balance = token.my_coin_balance().await.mm_err(EnableSlpError::GetBalanceError)?; - let my_address = token.my_address()?; + let my_address = token.my_address().map_mm_err()?; let balances = HashMap::from([(my_address, balance)]); let init_result = SlpInitResult { balances, diff --git a/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs b/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs index 002d87c872..4cb210d124 100644 --- a/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs +++ b/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs @@ -87,16 +87,19 @@ where Standalone: InitStandaloneCoinActivationOps + Send + Sync + 'static, Standalone::InProgressStatus: InitStandaloneCoinInitialStatus, InitStandaloneCoinError: From, - (Standalone::ActivationError, InitStandaloneCoinError): NotEqual, { let (client_id, request) = (request.client_id, request.inner); if let Ok(Some(_)) = lp_coinfind(&ctx, &request.ticker).await { return MmError::err(InitStandaloneCoinError::CoinIsAlreadyActivated { ticker: request.ticker }); } - let (coin_conf, protocol_info) = coin_conf_with_protocol(&ctx, &request.ticker, None)?; + let (coin_conf, protocol_info) = + coin_conf_with_protocol(&ctx, &request.ticker, None).map_mm_err::()?; + + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(InitStandaloneCoinError::Internal) + .map_mm_err::()?; - let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx).map_to_mm(InitStandaloneCoinError::Internal)?; let spawner = ctx.spawner(); let task = InitStandaloneCoinTask:: { ctx, @@ -141,12 +144,16 @@ pub async fn init_standalone_coin_user_action, ) -> MmResult { - let coins_act_ctx = - CoinsActivationContext::from_ctx(&ctx).map_to_mm(InitStandaloneCoinUserActionError::Internal)?; + let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) + .map_to_mm(InitStandaloneCoinUserActionError::Internal) + .map_mm_err::()?; let mut task_manager = Standalone::rpc_task_manager(&coins_act_ctx) .lock() - .map_to_mm(|poison| InitStandaloneCoinUserActionError::Internal(poison.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + .map_to_mm(|poison| InitStandaloneCoinUserActionError::Internal(poison.to_string())) + .map_mm_err::()?; + task_manager + .on_user_action(req.task_id, req.user_action) + .map_mm_err::()?; Ok(SuccessResponse::new()) } @@ -157,8 +164,11 @@ pub async fn cancel_init_standalone_coin()?; + task_manager + .cancel_task(req.task_id) + .map_mm_err::()?; Ok(SuccessResponse::new()) } @@ -206,11 +216,13 @@ where self.protocol_info.clone(), task_handle.clone(), ) - .await?; + .await + .map_mm_err::()?; let result = coin .get_activation_result(self.ctx.clone(), task_handle, &self.request.activation_params) - .await?; + .await + .map_mm_err::()?; log::info!("{} current block {}", ticker, result.current_block()); let tx_history = self.request.activation_params.tx_history(); @@ -218,13 +230,17 @@ where let current_balances = result.get_addresses_balances(); coin.start_history_background_fetching( self.ctx.metrics.clone(), - TxHistoryStorageBuilder::new(&self.ctx).build()?, + TxHistoryStorageBuilder::new(&self.ctx) + .build() + .map_mm_err::()?, self.ctx.event_stream_manager.clone(), current_balances, ); } - lp_register_coin(&self.ctx, coin.into(), RegisterCoinParams { ticker }).await?; + lp_register_coin(&self.ctx, coin.into(), RegisterCoinParams { ticker }) + .await + .map_mm_err::()?; Ok(result) } diff --git a/mm2src/coins_activation/src/tendermint_token_activation.rs b/mm2src/coins_activation/src/tendermint_token_activation.rs index 12808505a9..5b10c09dcd 100644 --- a/mm2src/coins_activation/src/tendermint_token_activation.rs +++ b/mm2src/coins_activation/src/tendermint_token_activation.rs @@ -5,7 +5,8 @@ use coins::{tendermint::{TendermintCoin, TendermintToken, TendermintTokenActivat TendermintTokenProtocolInfo}, CoinBalance, MarketCoinOps, MmCoinEnum}; use common::Future01CompatExt; -use mm2_err_handle::prelude::{MapMmError, MmError}; +use mm2_err_handle::{map_mm_error::MmResultExt, + prelude::{MapMmError, MmError}}; use serde::Serialize; use serde_json::Value as Json; use std::collections::HashMap; @@ -67,7 +68,7 @@ impl TokenActivationOps for TendermintToken { .await .mm_err(|e| TendermintTokenInitError::CouldNotFetchBalance(e.to_string()))?; - let my_address = token.my_address()?; + let my_address = token.my_address().map_mm_err()?; let balances = HashMap::from([(my_address, balance)]); let init_result = TendermintTokenInitResult { diff --git a/mm2src/coins_activation/src/token.rs b/mm2src/coins_activation/src/token.rs index 5001a0f3de..97fa6c5d86 100644 --- a/mm2src/coins_activation/src/token.rs +++ b/mm2src/coins_activation/src/token.rs @@ -129,7 +129,7 @@ where } let (token_conf, token_protocol): (_, Token::ProtocolInfo) = - coin_conf_with_protocol(&ctx, &req.ticker, req.protocol.clone())?; + coin_conf_with_protocol(&ctx, &req.ticker, req.protocol.clone()).map_mm_err::()?; let platform_coin = lp_coinfind_or_err(&ctx, token_protocol.platform_coin_ticker()) .await @@ -150,10 +150,14 @@ where token_protocol, req.protocol.is_some(), ) - .await?; + .await + .map_mm_err::()?; let coins_ctx = CoinsContext::from_ctx(&ctx).unwrap(); - coins_ctx.add_token(token.clone().into()).await?; + coins_ctx + .add_token(token.clone().into()) + .await + .map_mm_err::()?; platform_coin.register_token_info(&token); diff --git a/mm2src/coins_activation/src/utxo_activation/common_impl.rs b/mm2src/coins_activation/src/utxo_activation/common_impl.rs index eba196c370..5dbbd34501 100644 --- a/mm2src/coins_activation/src/utxo_activation/common_impl.rs +++ b/mm2src/coins_activation/src/utxo_activation/common_impl.rs @@ -55,7 +55,7 @@ where } else { None }; - task_handle.update_in_progress_status(UtxoStandardInProgressStatus::RequestingWalletBalance)?; + task_handle.update_in_progress_status(UtxoStandardInProgressStatus::RequestingWalletBalance).map_mm_err()?; let wallet_balance = coin .enable_coin_balance( xpub_extractor, @@ -64,7 +64,7 @@ where ) .await .mm_err(|enable_err| InitUtxoStandardError::from_enable_coin_balance_err(enable_err, ticker.clone()))?; - task_handle.update_in_progress_status(UtxoStandardInProgressStatus::ActivatingCoin)?; + task_handle.update_in_progress_status(UtxoStandardInProgressStatus::ActivatingCoin).map_mm_err()?; let result = UtxoStandardActivationResult { ticker, diff --git a/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs b/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs index 8c27226959..8f2d178556 100644 --- a/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs +++ b/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs @@ -77,7 +77,7 @@ impl InitStandaloneCoinActivationOps for BchCoin { error: format!("Couldn't parse cash address prefix: {e:?}"), } })?; - let priv_key_policy = priv_key_build_policy(&ctx, activation_request.utxo_params.priv_key_policy)?; + let priv_key_policy = priv_key_build_policy(&ctx, activation_request.utxo_params.priv_key_policy).map_mm_err()?; let bchd_urls = activation_request.bchd_urls.clone(); let constructor = { move |utxo_arc| BchCoin::new(utxo_arc, prefix.clone(), bchd_urls.clone()) }; diff --git a/mm2src/coins_activation/src/utxo_activation/init_qtum_activation.rs b/mm2src/coins_activation/src/utxo_activation/init_qtum_activation.rs index a6644f3275..3dd9010709 100644 --- a/mm2src/coins_activation/src/utxo_activation/init_qtum_activation.rs +++ b/mm2src/coins_activation/src/utxo_activation/init_qtum_activation.rs @@ -62,7 +62,7 @@ impl InitStandaloneCoinActivationOps for QtumCoin { _protocol_info: Self::StandaloneProtocol, _task_handle: QtumRpcTaskHandleShared, ) -> Result> { - let priv_key_policy = priv_key_build_policy(&ctx, activation_request.priv_key_policy)?; + let priv_key_policy = priv_key_build_policy(&ctx, activation_request.priv_key_policy).map_mm_err()?; let coin = QtumCoinBuilder::new(&ctx, &ticker, &coin_conf, activation_request, priv_key_policy) .build() diff --git a/mm2src/coins_activation/src/utxo_activation/init_utxo_standard_activation.rs b/mm2src/coins_activation/src/utxo_activation/init_utxo_standard_activation.rs index 10715e2f0e..f975d49fd7 100644 --- a/mm2src/coins_activation/src/utxo_activation/init_utxo_standard_activation.rs +++ b/mm2src/coins_activation/src/utxo_activation/init_utxo_standard_activation.rs @@ -63,7 +63,7 @@ impl InitStandaloneCoinActivationOps for UtxoStandardCoin { _protocol_info: Self::StandaloneProtocol, task_handle: UtxoStandardRpcTaskHandleShared, ) -> MmResult { - let priv_key_policy = priv_key_build_policy(&ctx, activation_request.priv_key_policy)?; + let priv_key_policy = priv_key_build_policy(&ctx, activation_request.priv_key_policy).map_mm_err()?; let coin = UtxoArcBuilder::new( &ctx, @@ -105,7 +105,7 @@ impl InitStandaloneCoinActivationOps for UtxoStandardCoin { }, UtxoSyncStatus::Finished { .. } => break, }; - task_handle.update_in_progress_status(in_progress_status)?; + task_handle.update_in_progress_status(in_progress_status).map_mm_err()?; } } diff --git a/mm2src/coins_activation/src/z_coin_activation.rs b/mm2src/coins_activation/src/z_coin_activation.rs index 2332710218..ef17bdfc67 100644 --- a/mm2src/coins_activation/src/z_coin_activation.rs +++ b/mm2src/coins_activation/src/z_coin_activation.rs @@ -234,7 +234,7 @@ impl InitStandaloneCoinActivationOps for ZCoin { ) -> MmResult { // When `ZCoin` supports Trezor, we'll need to check [`ZcoinActivationParams::priv_key_policy`] // instead of using [`PrivKeyBuildPolicy::detect_priv_key_policy`]. - let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx)?; + let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx).map_mm_err()?; let coin = z_coin_from_conf_and_params( &ctx, @@ -248,7 +248,7 @@ impl InitStandaloneCoinActivationOps for ZCoin { .mm_err(|e| ZcoinInitError::from_build_err(e, ticker))?; loop { - let in_progress_status = match coin.sync_status().await? { + let in_progress_status = match coin.sync_status().await.map_mm_err()? { SyncStatus::UpdatingBlocksCache { current_scanned_block, latest_block, @@ -266,7 +266,7 @@ impl InitStandaloneCoinActivationOps for ZCoin { SyncStatus::TemporaryError(e) => ZcoinInProgressStatus::TemporaryError(e), SyncStatus::Finished { .. } => break, }; - task_handle.update_in_progress_status(in_progress_status)?; + task_handle.update_in_progress_status(in_progress_status).map_mm_err()?; } Ok(coin) @@ -278,15 +278,15 @@ impl InitStandaloneCoinActivationOps for ZCoin { task_handle: ZcoinRpcTaskHandleShared, _activation_request: &Self::ActivationRequest, ) -> MmResult { - task_handle.update_in_progress_status(ZcoinInProgressStatus::RequestingWalletBalance)?; + task_handle.update_in_progress_status(ZcoinInProgressStatus::RequestingWalletBalance).map_mm_err()?; let current_block = self .current_block() .compat() .await .map_to_mm(ZcoinInitError::CouldNotGetBlockCount)?; - let balance = self.my_balance().compat().await?; - let first_sync_block = self.first_sync_block().await?; + let balance = self.my_balance().compat().await.map_mm_err()?; + let first_sync_block = self.first_sync_block().await.map_mm_err()?; Ok(ZcoinActivationResult { ticker: self.ticker().into(), From 30dfb530064341f068951a08bba795bdf5df080d Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 19:43:53 +0100 Subject: [PATCH 05/35] save dev state --- mm2src/coins/eth/eth_withdraw.rs | 10 ++-- mm2src/coins/my_tx_history_v2.rs | 2 +- mm2src/coins_activation/src/l2/init_l2.rs | 9 ++- .../standalone_coin/init_standalone_coin.rs | 1 - mm2src/coins_activation/src/token.rs | 1 - .../src/utxo_activation/mod.rs | 3 +- mm2src/crypto/src/crypto_ctx.rs | 3 - mm2src/crypto/src/hw_client.rs | 3 - mm2src/mm2_main/src/lp_init/init_hw.rs | 10 ++-- mm2src/mm2_main/src/lp_native_dex.rs | 14 ++--- mm2src/mm2_main/src/lp_ordermatch.rs | 2 +- .../src/lp_ordermatch/my_orders_storage.rs | 16 ++--- .../src/lp_ordermatch/orderbook_rpc.rs | 4 +- .../src/lp_ordermatch/simple_market_maker.rs | 6 +- mm2src/mm2_main/src/lp_stats.rs | 4 +- mm2src/mm2_main/src/lp_swap.rs | 2 +- mm2src/mm2_main/src/lp_swap/check_balance.rs | 16 +++-- mm2src/mm2_main/src/lp_swap/maker_swap.rs | 12 ++-- .../mm2_main/src/lp_swap/max_maker_vol_rpc.rs | 4 +- mm2src/mm2_main/src/lp_swap/saved_swap.rs | 18 +++--- mm2src/mm2_main/src/lp_swap/swap_lock.rs | 4 +- mm2src/mm2_main/src/lp_swap/swap_v2_common.rs | 2 +- mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs | 12 ++-- mm2src/mm2_main/src/lp_swap/taker_swap.rs | 7 ++- mm2src/mm2_main/src/lp_swap/trade_preimage.rs | 4 +- mm2src/mm2_main/src/lp_wallet.rs | 59 +++++++++++++------ .../src/rpc/lp_commands/one_inch/rpcs.rs | 4 +- .../src/rpc/lp_commands/one_inch/types.rs | 9 ++- mm2src/mm2_main/src/rpc/lp_commands/pubkey.rs | 5 +- mm2src/mm2_main/src/rpc/lp_commands/tokens.rs | 9 +-- mm2src/mm2_main/src/rpc/lp_commands/trezor.rs | 3 +- mm2src/trezor/src/response_processor.rs | 3 - 32 files changed, 141 insertions(+), 120 deletions(-) diff --git a/mm2src/coins/eth/eth_withdraw.rs b/mm2src/coins/eth/eth_withdraw.rs index 6a36b9d95e..1f5b1dc884 100644 --- a/mm2src/coins/eth/eth_withdraw.rs +++ b/mm2src/coins/eth/eth_withdraw.rs @@ -352,17 +352,15 @@ impl EthWithdraw for InitEthWithdraw { fn request(&self) -> &WithdrawRequest { &self.req } fn on_generating_transaction(&self) -> Result<(), MmError> { - Ok(self - .task_handle + self.task_handle .update_in_progress_status(WithdrawInProgressStatus::GeneratingTransaction) - .map_mm_err()?) + .map_mm_err() } fn on_finishing(&self) -> Result<(), MmError> { - Ok(self - .task_handle + self.task_handle .update_in_progress_status(WithdrawInProgressStatus::Finishing) - .map_mm_err()?) + .map_mm_err() } async fn sign_tx_with_trezor( diff --git a/mm2src/coins/my_tx_history_v2.rs b/mm2src/coins/my_tx_history_v2.rs index d1ecd6a411..8204e0bfc1 100644 --- a/mm2src/coins/my_tx_history_v2.rs +++ b/mm2src/coins/my_tx_history_v2.rs @@ -36,7 +36,7 @@ pub struct GetHistoryResult { pub total: usize, } -pub trait TxHistoryStorageError: std::fmt::Debug + NotMmError + NotEqual + Send {} +pub trait TxHistoryStorageError: std::fmt::Debug + NotMmError + Send {} #[async_trait] pub trait TxHistoryStorage: Send + Sync + 'static { diff --git a/mm2src/coins_activation/src/l2/init_l2.rs b/mm2src/coins_activation/src/l2/init_l2.rs index cbe31dbf5c..5271cd36f2 100644 --- a/mm2src/coins_activation/src/l2/init_l2.rs +++ b/mm2src/coins_activation/src/l2/init_l2.rs @@ -39,7 +39,7 @@ pub trait InitL2ActivationOps: Into + Send + Sync + 'static { type ValidatedParams: Clone + Send + Sync; type CoinConf: Clone + Send + Sync; type ActivationResult: serde::Serialize + Clone + Send + Sync; - type ActivationError: From + NotEqual + SerMmErrorType + Clone + Send + Sync; + type ActivationError: From + SerMmErrorType + Clone + Send + Sync; type InProgressStatus: InitL2InitialStatus + serde::Serialize + Clone + Send + Sync; type AwaitingStatus: serde::Serialize + Clone + Send + Sync; type UserAction: NotMmError + Send + Sync; @@ -73,7 +73,6 @@ pub async fn init_l2( where L2: InitL2ActivationOps, InitL2Error: From, - (L2::ActivationError, InitL2Error): NotEqual, { let (client_id, req) = (req.client_id, req.inner); let ticker = req.ticker.clone(); @@ -83,7 +82,7 @@ where let (coin_conf_json, protocol_conf): (Json, L2::ProtocolInfo) = coin_conf_with_protocol(&ctx, &ticker, None).map_mm_err::()?; - let coin_conf = L2::coin_conf_from_json(coin_conf_json)?; + let coin_conf = L2::coin_conf_from_json(coin_conf_json).map_mm_err::()?; let platform_coin = lp_coinfind_or_err(&ctx, protocol_conf.platform_coin_ticker()) .await @@ -95,9 +94,9 @@ where l2_ticker: ticker.clone(), })?; - L2::validate_platform_configuration(&platform_coin)?; + L2::validate_platform_configuration(&platform_coin).map_mm_err::()?; - let validated_params = L2::validate_activation_params(req.activation_params.clone())?; + let validated_params = L2::validate_activation_params(req.activation_params.clone()).map_mm_err::()?; let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitL2Error::Internal) diff --git a/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs b/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs index 4cb210d124..12a5af5d29 100644 --- a/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs +++ b/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs @@ -42,7 +42,6 @@ pub trait InitStandaloneCoinActivationOps: Into + Send + Sync + 'sta + From + Into + SerMmErrorType - + NotEqual + Clone + Send + Sync diff --git a/mm2src/coins_activation/src/token.rs b/mm2src/coins_activation/src/token.rs index 97fa6c5d86..46fb9b1a58 100644 --- a/mm2src/coins_activation/src/token.rs +++ b/mm2src/coins_activation/src/token.rs @@ -122,7 +122,6 @@ pub async fn enable_token( where Token: TokenActivationOps + Clone, EnableTokenError: From, - (Token::ActivationError, EnableTokenError): NotEqual, { if let Ok(Some(_)) = lp_coinfind(&ctx, &req.ticker).await { return MmError::err(EnableTokenError::TokenIsAlreadyActivated(req.ticker)); diff --git a/mm2src/coins_activation/src/utxo_activation/mod.rs b/mm2src/coins_activation/src/utxo_activation/mod.rs index 42764e5c93..1dc64c620c 100644 --- a/mm2src/coins_activation/src/utxo_activation/mod.rs +++ b/mm2src/coins_activation/src/utxo_activation/mod.rs @@ -15,7 +15,7 @@ pub use init_utxo_standard_activation::UtxoStandardTaskManagerShared; pub mod for_tests { use common::{executor::Timer, now_ms, wait_until_ms}; use mm2_core::mm_ctx::MmArc; - use mm2_err_handle::prelude::{MmResult, NotEqual}; + use mm2_err_handle::prelude::MmResult; use rpc_task::{RpcInitReq, RpcTaskStatus}; use crate::{init_standalone_coin, init_standalone_coin_status, @@ -32,7 +32,6 @@ pub mod for_tests { Standalone: InitStandaloneCoinActivationOps + Send + Sync + 'static, Standalone::InProgressStatus: InitStandaloneCoinInitialStatus, InitStandaloneCoinError: From, - (Standalone::ActivationError, InitStandaloneCoinError): NotEqual, { let request = RpcInitReq { client_id: 0, diff --git a/mm2src/crypto/src/crypto_ctx.rs b/mm2src/crypto/src/crypto_ctx.rs index 50c3bc5cf1..b8d1f6bab5 100644 --- a/mm2src/crypto/src/crypto_ctx.rs +++ b/mm2src/crypto/src/crypto_ctx.rs @@ -76,9 +76,6 @@ impl From> for HwCtxInitError< } } -/// This is required for converting `MmError>` into `MmError>`. -impl NotEqual for HwCtxInitError {} - #[cfg(target_arch = "wasm32")] #[derive(Debug)] pub enum MetamaskCtxInitError { diff --git a/mm2src/crypto/src/hw_client.rs b/mm2src/crypto/src/hw_client.rs index 3ff696a1d4..5cac84fda6 100644 --- a/mm2src/crypto/src/hw_client.rs +++ b/mm2src/crypto/src/hw_client.rs @@ -41,9 +41,6 @@ impl From> for HwProcessingError { } } -/// This is required for converting `MmError` into `MmError>`. -impl NotEqual for HwProcessingError {} - #[derive(Clone, Copy, Deserialize)] pub enum HwWalletType { Trezor, diff --git a/mm2src/mm2_main/src/lp_init/init_hw.rs b/mm2src/mm2_main/src/lp_init/init_hw.rs index 6148a44f53..dba0a8f0d1 100644 --- a/mm2src/mm2_main/src/lp_init/init_hw.rs +++ b/mm2src/mm2_main/src/lp_init/init_hw.rs @@ -136,7 +136,7 @@ impl RpcTask for InitHwTask { } async fn run(&mut self, task_handle: InitHwTaskHandleShared) -> Result> { - let crypto_ctx = CryptoCtx::from_ctx(&self.ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(&self.ctx).map_mm_err()?; match self.hw_wallet_type { HwWalletType::Trezor => { @@ -154,7 +154,7 @@ impl RpcTask for InitHwTask { let trezor_connect_processor = Arc::new(trezor_connect_processor); let (device_info, hw_ctx) = crypto_ctx .init_hw_ctx_with_trezor(trezor_connect_processor, self.req.device_pubkey) - .await?; + .await.map_mm_err()?; let device_pubkey = hw_ctx.hw_pubkey(); Ok(InitHwResponse { device_info, @@ -174,7 +174,7 @@ pub async fn init_trezor(ctx: MmArc, req: RpcInitReq) -> MmResult hw_wallet_type: HwWalletType::Trezor, req, }; - let task_id = RpcTaskManager::spawn_rpc_task(&init_ctx.init_hw_task_manager, &spawner, task, client_id)?; + let task_id = RpcTaskManager::spawn_rpc_task(&init_ctx.init_hw_task_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -198,7 +198,7 @@ pub async fn init_trezor_user_action( .init_hw_task_manager .lock() .map_to_mm(|e| RpcTaskUserActionError::Internal(e.to_string()))?; - task_manager.on_user_action(req.task_id, req.user_action)?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -211,6 +211,6 @@ pub async fn cancel_init_trezor( .init_hw_task_manager .lock() .map_to_mm(|e| CancelRpcTaskError::Internal(e.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } diff --git a/mm2src/mm2_main/src/lp_native_dex.rs b/mm2src/mm2_main/src/lp_native_dex.rs index fc37bc8624..cfc20de356 100644 --- a/mm2src/mm2_main/src/lp_native_dex.rs +++ b/mm2src/mm2_main/src/lp_native_dex.rs @@ -425,10 +425,10 @@ fn init_wasm_event_streaming(ctx: &MmArc) { } pub async fn lp_init_continue(ctx: MmArc) -> MmInitResult<()> { - init_ordermatch_context(&ctx)?; - init_p2p(ctx.clone()).await?; + init_ordermatch_context(&ctx).map_mm_err()?; + init_p2p(ctx.clone()).await.map_mm_err()?; - if !CryptoCtx::is_init(&ctx)? { + if !CryptoCtx::is_init(&ctx).map_mm_err()? { return Ok(()); } @@ -460,7 +460,7 @@ pub async fn lp_init_continue(ctx: MmArc) -> MmInitResult<()> { } } - init_message_service(&ctx).await?; + init_message_service(&ctx).await.map_mm_err()?; let balance_update_ordermatch_handler = BalanceUpdateOrdermatchHandler::new(ctx.clone()); register_balance_update_handler(ctx.clone(), Box::new(balance_update_ordermatch_handler)).await; @@ -500,7 +500,7 @@ pub async fn lp_init(ctx: MmArc, version: String, datetime: String) -> MmInitRes } // This either initializes the cryptographic context or sets up the context for "no login mode". - initialize_wallet_passphrase(&ctx).await?; + initialize_wallet_passphrase(&ctx).await.map_mm_err()?; lp_init_continue(ctx.clone()).await?; @@ -658,7 +658,7 @@ async fn relay_node_type(ctx: &MmArc) -> P2PResult { let ip = myipaddr(ctx.clone()) .await .map_to_mm(P2PInitError::ErrorGettingMyIpAddr)?; - let network_ports = lp_network_ports(netid)?; + let network_ports = lp_network_ports(netid).map_mm_err()?; let wss_certs = wss_certs(ctx)?; if wss_certs.is_none() { const WARN_MSG: &str = r#"Please note TLS private key and certificate are not specified. @@ -689,7 +689,7 @@ fn light_node_type(ctx: &MmArc) -> P2PResult { } let netid = ctx.netid(); - let network_ports = lp_network_ports(netid)?; + let network_ports = lp_network_ports(netid).map_mm_err()?; Ok(NodeType::Light { network_ports }) } diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 18475ce191..959a3bb4fb 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -318,7 +318,7 @@ async fn process_orders_keep_alive( P2PRequest::Ordermatch(req), propagated_from_peer.clone(), ) - .await? + .await.map_mm_err()? .ok_or_else(|| { MmError::new(OrderbookP2PHandlerError::P2PRequestError(format!( "No response was received from peer {} for SyncPubkeyOrderbookState request!", diff --git a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs index 1847720416..adce2b6deb 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs @@ -239,30 +239,31 @@ mod native_impl { impl MyActiveOrders for MyOrdersStorage { async fn load_active_maker_orders(&self) -> MyOrdersResult> { let dir_path = my_maker_orders_dir(&self.ctx); - Ok(read_dir_json(&dir_path).await?) + Ok(read_dir_json(&dir_path).await.map_mm_err()?) } async fn load_active_maker_order(&self, uuid: Uuid) -> MyOrdersResult { let path = my_maker_order_file_path(&self.ctx, &uuid); read_json(&path) - .await? + .await + .map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } async fn load_active_taker_orders(&self) -> MyOrdersResult> { let dir_path = my_taker_orders_dir(&self.ctx); - Ok(read_dir_json(&dir_path).await?) + Ok(read_dir_json(&dir_path).await.map_mm_err()?) } async fn save_new_active_maker_order(&self, order: &MakerOrder) -> MyOrdersResult<()> { let path = my_maker_order_file_path(&self.ctx, &order.uuid); - write_json(order, &path, USE_TMP_FILE).await?; + write_json(order, &path, USE_TMP_FILE).await.map_mm_err()?; Ok(()) } async fn save_new_active_taker_order(&self, order: &TakerOrder) -> MyOrdersResult<()> { let path = my_taker_order_file_path(&self.ctx, &order.request.uuid); - write_json(order, &path, USE_TMP_FILE).await?; + write_json(order, &path, USE_TMP_FILE).await.map_mm_err()?; Ok(()) } @@ -295,14 +296,15 @@ mod native_impl { impl MyOrdersHistory for MyOrdersStorage { async fn save_order_in_history(&self, order: &Order) -> MyOrdersResult<()> { let path = my_order_history_file_path(&self.ctx, &order.uuid()); - write_json(order, &path, USE_TMP_FILE).await?; + write_json(order, &path, USE_TMP_FILE).await.map_mm_err()?; Ok(()) } async fn load_order_from_history(&self, uuid: Uuid) -> MyOrdersResult { let path = my_order_history_file_path(&self.ctx, &uuid); read_json(&path) - .await? + .await + .map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } } diff --git a/mm2src/mm2_main/src/lp_ordermatch/orderbook_rpc.rs b/mm2src/mm2_main/src/lp_ordermatch/orderbook_rpc.rs index d76af5dfba..66d24d1daf 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/orderbook_rpc.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/orderbook_rpc.rs @@ -239,9 +239,9 @@ pub async fn orderbook_rpc_v2( if req.base == req.rel { return MmError::err(OrderbookRpcError::BaseRelSame); } - let base_coin_conf = get_tradeable_coin_conf(&ctx, &req.base)?; + let base_coin_conf = get_tradeable_coin_conf(&ctx, &req.base).map_mm_err()?; - let rel_coin_conf = get_tradeable_coin_conf(&ctx, &req.rel)?; + let rel_coin_conf = get_tradeable_coin_conf(&ctx, &req.rel).map_mm_err()?; let ordermatch_ctx = OrdermatchContext::from_ctx(&ctx).expect("ctx is available"); let base_ticker = ordermatch_ctx.orderbook_ticker_bypass(&req.base); diff --git a/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs b/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs index 14551167d6..7aaef65ef5 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs @@ -356,8 +356,8 @@ async fn vwap_calculator( ctx: &MmArc, cfg: &SimpleCoinMarketMakerCfg, ) -> VwapProcessingResult { - let base_swaps = latest_swaps_for_pair(ctx.clone(), cfg.base.clone(), cfg.rel.clone(), LATEST_SWAPS_LIMIT).await?; - let rel_swaps = latest_swaps_for_pair(ctx.clone(), cfg.rel.clone(), cfg.base.clone(), LATEST_SWAPS_LIMIT).await?; + let base_swaps = latest_swaps_for_pair(ctx.clone(), cfg.base.clone(), cfg.rel.clone(), LATEST_SWAPS_LIMIT).await.map_mm_err()?; + let rel_swaps = latest_swaps_for_pair(ctx.clone(), cfg.rel.clone(), cfg.base.clone(), LATEST_SWAPS_LIMIT).await.map_mm_err()?; Ok(vwap(base_swaps, rel_swaps, calculated_price, cfg).await) } @@ -466,7 +466,7 @@ async fn prepare_order( let base_coin = lp_coinfind(ctx, cfg.base.as_str()) .await? .ok_or_else(|| MmError::new(OrderProcessingError::AssetNotEnabled))?; - let base_balance = base_coin.get_non_zero_balance().compat().await?; + let base_balance = base_coin.get_non_zero_balance().compat().await.map_mm_err()?; lp_coinfind(ctx, cfg.rel.as_str()) .await? .ok_or_else(|| MmError::new(OrderProcessingError::AssetNotEnabled))?; diff --git a/mm2src/mm2_main/src/lp_stats.rs b/mm2src/mm2_main/src/lp_stats.rs index b4d908e65a..0cef1b38aa 100644 --- a/mm2src/mm2_main/src/lp_stats.rs +++ b/mm2src/mm2_main/src/lp_stats.rs @@ -135,7 +135,7 @@ pub async fn add_node_to_version_stat(ctx: MmArc, req: Json) -> NodeVersionResul .parse::() .map_to_mm(|e| NodeVersionError::PeerIdParseError(node_info.peer_id.clone(), e.to_string()))?; - let ipv4_addr = mm2_net::ip_addr::addr_to_ipv4_string(&node_info.address)?; + let ipv4_addr = mm2_net::ip_addr::addr_to_ipv4_string(&node_info.address).map_mm_err()?; let node_info_with_ipv4_addr = NodeInfo { name: node_info.name, address: ipv4_addr, @@ -241,7 +241,7 @@ pub async fn start_version_stat_collection(ctx: MmArc, req: Json) -> NodeVersion let network_info = if ctx.p2p_in_memory() { NetworkInfo::InMemory } else { - let network_ports = lp_network_ports(netid)?; + let network_ports = lp_network_ports(netid).map_mm_err()?; NetworkInfo::Distributed { network_ports } }; diff --git a/mm2src/mm2_main/src/lp_swap.rs b/mm2src/mm2_main/src/lp_swap.rs index b15806c059..7f6523114d 100644 --- a/mm2src/mm2_main/src/lp_swap.rs +++ b/mm2src/mm2_main/src/lp_swap.rs @@ -615,7 +615,7 @@ pub async fn get_locked_amount_rpc( ctx: MmArc, req: GetLockedAmountReq, ) -> Result> { - lp_coinfind_or_err(&ctx, &req.coin).await?; + lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let locked_amount = get_locked_amount(&ctx, &req.coin); Ok(GetLockedAmountResp { diff --git a/mm2src/mm2_main/src/lp_swap/check_balance.rs b/mm2src/mm2_main/src/lp_swap/check_balance.rs index 178a3433fe..bae4a4d14a 100644 --- a/mm2src/mm2_main/src/lp_swap/check_balance.rs +++ b/mm2src/mm2_main/src/lp_swap/check_balance.rs @@ -24,7 +24,7 @@ pub async fn check_my_coin_balance_for_swap( ) -> CheckBalanceResult { let ticker = coin.ticker(); debug!("Check my_coin '{}' balance for swap", ticker); - let balance: MmNumber = coin.my_spendable_balance().compat().await?.into(); + let balance: MmNumber = coin.my_spendable_balance().compat().await.map_mm_err()?.into(); let locked = match swap_uuid { Some(u) => get_locked_amount_by_other_swaps(ctx, u, ticker), @@ -53,8 +53,10 @@ pub async fn check_my_coin_balance_for_swap( let total_trade_fee = if ticker == trade_fee.coin { trade_fee.amount } else { - let base_coin_balance: MmNumber = coin.base_coin_balance().compat().await?.into(); - check_base_coin_balance_for_swap(ctx, &base_coin_balance, trade_fee, swap_uuid).await?; + let base_coin_balance: MmNumber = coin.base_coin_balance().compat().await.map_mm_err()?.into(); + check_base_coin_balance_for_swap(ctx, &base_coin_balance, trade_fee, swap_uuid) + .await + .map_mm_err()?; MmNumber::from(0) }; @@ -94,7 +96,7 @@ pub async fn check_other_coin_balance_for_swap( } let ticker = coin.ticker(); debug!("Check other_coin '{}' balance for swap", ticker); - let balance: MmNumber = coin.my_spendable_balance().compat().await?.into(); + let balance: MmNumber = coin.my_spendable_balance().compat().await.map_mm_err()?.into(); let locked = match swap_uuid { Some(u) => get_locked_amount_by_other_swaps(ctx, u, ticker), @@ -120,8 +122,10 @@ pub async fn check_other_coin_balance_for_swap( }); } } else { - let base_coin_balance: MmNumber = coin.base_coin_balance().compat().await?.into(); - check_base_coin_balance_for_swap(ctx, &base_coin_balance, trade_fee, swap_uuid).await?; + let base_coin_balance: MmNumber = coin.base_coin_balance().compat().await.map_mm_err()?.into(); + check_base_coin_balance_for_swap(ctx, &base_coin_balance, trade_fee, swap_uuid) + .await + .map_mm_err()?; } Ok(()) diff --git a/mm2src/mm2_main/src/lp_swap/maker_swap.rs b/mm2src/mm2_main/src/lp_swap/maker_swap.rs index c7e5a43329..6b7b4be845 100644 --- a/mm2src/mm2_main/src/lp_swap/maker_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/maker_swap.rs @@ -2293,9 +2293,9 @@ pub async fn maker_swap_trade_preimage( let base_coin_ticker = base_coin.ticker(); let rel_coin_ticker = rel_coin.ticker(); let volume = if req.max { - let balance = base_coin.my_spendable_balance().compat().await?; + let balance = base_coin.my_spendable_balance().compat().await.map_mm_err()?; calc_max_maker_vol(ctx, &base_coin, &balance, FeeApproxStage::TradePreimage) - .await? + .await.map_mm_err()? .volume } else { let threshold = base_coin.min_trading_vol().to_decimal(); @@ -2323,7 +2323,7 @@ pub async fn maker_swap_trade_preimage( if req.max { // Note the `calc_max_maker_vol` returns [`CheckBalanceError::NotSufficientBalance`] error if the balance of `base_coin` is not sufficient. // So we have to check the balance of the other coin only. - check_other_coin_balance_for_swap(ctx, rel_coin.deref(), None, rel_coin_fee.clone()).await? + check_other_coin_balance_for_swap(ctx, rel_coin.deref(), None, rel_coin_fee.clone()).await.map_mm_err()? } else { let prepared_params = MakerSwapPreparedParams { maker_payment_trade_fee: base_coin_fee.clone(), @@ -2338,7 +2338,7 @@ pub async fn maker_swap_trade_preimage( Some(prepared_params), FeeApproxStage::TradePreimage, ) - .await?; + .await.map_mm_err()?; } let conf_settings = OrderConfirmationsSettings { @@ -2373,7 +2373,7 @@ pub struct CoinVolumeInfo { /// Requests the `coin` balance and calculates max Maker volume. /// Returns [`CheckBalanceError::NotSufficientBalance`] if the balance is insufficient. pub async fn get_max_maker_vol(ctx: &MmArc, my_coin: &MmCoinEnum) -> CheckBalanceResult { - let my_balance = my_coin.my_spendable_balance().compat().await?; + let my_balance = my_coin.my_spendable_balance().compat().await.map_mm_err()?; calc_max_maker_vol(ctx, my_coin, &my_balance, FeeApproxStage::OrderIssue).await } @@ -2403,7 +2403,7 @@ pub async fn calc_max_maker_vol( volume = &volume - &trade_fee.amount; required_to_pay_fee = trade_fee.amount; } else { - let base_coin_balance = coin.base_coin_balance().compat().await?; + let base_coin_balance = coin.base_coin_balance().compat().await.map_mm_err()?; check_base_coin_balance_for_swap(ctx, &MmNumber::from(base_coin_balance), trade_fee.clone(), None).await?; } let min_tx_amount = MmNumber::from(coin.min_tx_amount()); diff --git a/mm2src/mm2_main/src/lp_swap/max_maker_vol_rpc.rs b/mm2src/mm2_main/src/lp_swap/max_maker_vol_rpc.rs index 625fad2947..18829252b5 100644 --- a/mm2src/mm2_main/src/lp_swap/max_maker_vol_rpc.rs +++ b/mm2src/mm2_main/src/lp_swap/max_maker_vol_rpc.rs @@ -134,12 +134,12 @@ pub struct MaxMakerVolResponse { } pub async fn max_maker_vol(ctx: MmArc, req: MaxMakerVolRequest) -> MmResult { - let coin = lp_coinfind_or_err(&ctx, &req.coin).await?; + let coin = lp_coinfind_or_err(&ctx, &req.coin).await.map_mm_err()?; let CoinVolumeInfo { volume, balance, locked_by_swaps, - } = get_max_maker_vol(&ctx, &coin).await?; + } = get_max_maker_vol(&ctx, &coin).await.map_mm_err()?; Ok(MaxMakerVolResponse { coin: req.coin, diff --git a/mm2src/mm2_main/src/lp_swap/saved_swap.rs b/mm2src/mm2_main/src/lp_swap/saved_swap.rs index 185edd1584..8b62896d2b 100644 --- a/mm2src/mm2_main/src/lp_swap/saved_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/saved_swap.rs @@ -210,37 +210,37 @@ mod native_impl { impl SavedSwapIo for SavedSwap { async fn load_my_swap_from_db(ctx: &MmArc, uuid: Uuid) -> SavedSwapResult> { let path = my_swap_file_path(ctx, &uuid); - Ok(read_json(&path).await?) + Ok(read_json(&path).await.map_mm_err()?) } async fn load_all_my_swaps_from_db(ctx: &MmArc) -> SavedSwapResult> { let path = my_swaps_dir(ctx); - Ok(read_dir_json(&path).await?) + Ok(read_dir_json(&path).await.map_mm_err()?) } async fn load_from_maker_stats_db(ctx: &MmArc, uuid: Uuid) -> SavedSwapResult> { let path = stats_maker_swap_file_path(ctx, &uuid); - Ok(read_json(&path).await?) + Ok(read_json(&path).await.map_mm_err()?) } async fn load_all_from_maker_stats_db(ctx: &MmArc) -> SavedSwapResult> { let path = stats_maker_swap_dir(ctx); - Ok(read_dir_json(&path).await?) + Ok(read_dir_json(&path).await.map_mm_err()?) } async fn load_from_taker_stats_db(ctx: &MmArc, uuid: Uuid) -> SavedSwapResult> { let path = stats_taker_swap_file_path(ctx, &uuid); - Ok(read_json(&path).await?) + Ok(read_json(&path).await.map_mm_err()?) } async fn load_all_from_taker_stats_db(ctx: &MmArc) -> SavedSwapResult> { let path = stats_taker_swap_dir(ctx); - Ok(read_dir_json(&path).await?) + Ok(read_dir_json(&path).await.map_mm_err()?) } async fn save_to_db(&self, ctx: &MmArc) -> SavedSwapResult<()> { let path = my_swap_file_path(ctx, self.uuid()); - write_json(self, &path, USE_TMP_FILE).await?; + write_json(self, &path, USE_TMP_FILE).await.map_mm_err()?; Ok(()) } @@ -249,11 +249,11 @@ mod native_impl { match self { SavedSwap::Maker(maker) => { let path = stats_maker_swap_file_path(ctx, &maker.uuid); - write_json(self, &path, USE_TMP_FILE).await?; + write_json(self, &path, USE_TMP_FILE).await.map_mm_err()?; }, SavedSwap::Taker(taker) => { let path = stats_taker_swap_file_path(ctx, &taker.uuid); - write_json(self, &path, USE_TMP_FILE).await?; + write_json(self, &path, USE_TMP_FILE).await.map_mm_err()?; }, } Ok(()) diff --git a/mm2src/mm2_main/src/lp_swap/swap_lock.rs b/mm2src/mm2_main/src/lp_swap/swap_lock.rs index f4347dde3b..6f1624881b 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_lock.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_lock.rs @@ -58,12 +58,12 @@ mod native_lock { impl SwapLockOps for SwapLock { async fn lock(ctx: &MmArc, swap_uuid: Uuid, ttl_sec: f64) -> SwapLockResult> { let lock_path = my_swaps_dir(ctx).join(format!("{}.lock", swap_uuid)); - let file_lock = some_or_return_ok_none!(FileLock::lock(lock_path, ttl_sec)?); + let file_lock = some_or_return_ok_none!(FileLock::lock(lock_path, ttl_sec).map_mm_err()?); Ok(Some(SwapLock { file_lock })) } - async fn touch(&self) -> SwapLockResult<()> { Ok(self.file_lock.touch()?) } + async fn touch(&self) -> SwapLockResult<()> { Ok(self.file_lock.touch().map_mm_err()?) } } } diff --git a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs index 3624d42b8d..e220336389 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs @@ -259,7 +259,7 @@ pub(super) fn clean_up_context_impl(ctx: &MmArc, uuid: &Uuid, maker_coin: &str, pub(super) async fn acquire_reentrancy_lock_impl(ctx: &MmArc, uuid: Uuid) -> MmResult { let mut attempts = 0; loop { - match SwapLock::lock(ctx, uuid, 40.).await? { + match SwapLock::lock(ctx, uuid, 40.).await.map_mm_err()? { Some(l) => break Ok(l), None => { if attempts >= 1 { diff --git a/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs b/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs index 669d17a492..f1197a3208 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs @@ -301,18 +301,18 @@ async fn get_swap_data_by_uuid_and_type( ) -> MmResult, GetSwapDataErr> { match swap_type { LEGACY_SWAP_TYPE => { - let saved_swap = SavedSwap::load_my_swap_from_db(ctx, uuid).await?; + let saved_swap = SavedSwap::load_my_swap_from_db(ctx, uuid).await.map_mm_err()?; Ok(saved_swap.map(|swap| match swap { SavedSwap::Maker(m) => SwapRpcData::MakerV1(m), SavedSwap::Taker(t) => SwapRpcData::TakerV1(t), })) }, MAKER_SWAP_V2_TYPE => { - let data = get_maker_swap_data_for_rpc(ctx, &uuid).await?; + let data = get_maker_swap_data_for_rpc(ctx, &uuid).await.map_mm_err()?; Ok(data.map(SwapRpcData::MakerV2)) }, TAKER_SWAP_V2_TYPE => { - let data = get_taker_swap_data_for_rpc(ctx, &uuid).await?; + let data = get_taker_swap_data_for_rpc(ctx, &uuid).await.map_mm_err()?; Ok(data.map(SwapRpcData::TakerV2)) }, unsupported => MmError::err(GetSwapDataErr::UnsupportedSwapType(unsupported)), @@ -367,10 +367,10 @@ pub(crate) async fn my_swap_status_rpc( req: MySwapStatusRequest, ) -> MmResult { let swap_type = get_swap_type(&ctx, &req.uuid) - .await? + .await.map_mm_err()? .or_mm_err(|| MySwapStatusError::NoSwapWithUuid(req.uuid))?; get_swap_data_by_uuid_and_type(&ctx, req.uuid, swap_type) - .await? + .await.map_mm_err()? .or_mm_err(|| MySwapStatusError::NoSwapWithUuid(req.uuid)) } @@ -429,7 +429,7 @@ pub(crate) async fn my_recent_swaps_rpc( ) -> MmResult { let db_result = MySwapsStorage::new(ctx.clone()) .my_recent_swaps_with_filters(&req.filter, Some(&req.paging_options)) - .await?; + .await.map_mm_err()?; let mut swaps = Vec::with_capacity(db_result.uuids_and_types.len()); for (uuid, swap_type) in db_result.uuids_and_types.iter() { match get_swap_data_by_uuid_and_type(&ctx, *uuid, *swap_type).await { diff --git a/mm2src/mm2_main/src/lp_swap/taker_swap.rs b/mm2src/mm2_main/src/lp_swap/taker_swap.rs index 54f5ab3bfe..91289aaa06 100644 --- a/mm2src/mm2_main/src/lp_swap/taker_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/taker_swap.rs @@ -2643,7 +2643,8 @@ pub async fn taker_swap_trade_preimage( Some(prepared_params), stage, ) - .await?; + .await + .map_mm_err()?; let conf_settings = OrderConfirmationsSettings { base_confs: base_coin.required_confirmations(), @@ -2651,7 +2652,7 @@ pub async fn taker_swap_trade_preimage( rel_confs: rel_coin.required_confirmations(), rel_nota: rel_coin.requires_notarization(), }; - let our_public_id = CryptoCtx::from_ctx(ctx)?.mm2_internal_public_id(); + let our_public_id = CryptoCtx::from_ctx(ctx).map_mm_err()?.mm2_internal_public_id(); let order_builder = TakerOrderBuilder::new(&base_coin, &rel_coin) .with_base_amount(base_amount) .with_rel_amount(rel_amount) @@ -2737,7 +2738,7 @@ pub async fn calc_max_taker_vol( stage: FeeApproxStage, ) -> CheckBalanceResult { let my_coin = coin.ticker(); - let balance: MmNumber = coin.my_spendable_balance().compat().await?.into(); + let balance: MmNumber = coin.my_spendable_balance().compat().await.map_mm_err()?.into(); let locked = get_locked_amount(ctx, my_coin); let min_tx_amount = MmNumber::from(coin.min_tx_amount()); diff --git a/mm2src/mm2_main/src/lp_swap/trade_preimage.rs b/mm2src/mm2_main/src/lp_swap/trade_preimage.rs index cb31ed63e9..ceccd64241 100644 --- a/mm2src/mm2_main/src/lp_swap/trade_preimage.rs +++ b/mm2src/mm2_main/src/lp_swap/trade_preimage.rs @@ -29,8 +29,8 @@ pub async fn trade_preimage_rpc( return MmError::err(TradePreimageRpcError::CoinIsWalletOnly { coin: req.rel }); } - let base_coin = lp_coinfind_or_err(&ctx, &req.base).await?; - let rel_coin = lp_coinfind_or_err(&ctx, &req.rel).await?; + let base_coin = lp_coinfind_or_err(&ctx, &req.base).await.map_mm_err()?; + let rel_coin = lp_coinfind_or_err(&ctx, &req.rel).await.map_mm_err()?; match req.swap_method { TradePreimageMethod::SetPrice => maker_swap_trade_preimage(&ctx, req, base_coin, rel_coin) diff --git a/mm2src/mm2_main/src/lp_wallet.rs b/mm2src/mm2_main/src/lp_wallet.rs index b06318e56f..03bb10718e 100644 --- a/mm2src/mm2_main/src/lp_wallet.rs +++ b/mm2src/mm2_main/src/lp_wallet.rs @@ -115,7 +115,7 @@ async fn encrypt_and_save_passphrase( passphrase: &str, wallet_password: &str, ) -> WalletInitResult<()> { - let encrypted_passphrase_data = encrypt_mnemonic(passphrase, wallet_password)?; + let encrypted_passphrase_data = encrypt_mnemonic(passphrase, wallet_password).map_mm_err()?; save_encrypted_passphrase(ctx, wallet_name, &encrypted_passphrase_data) .await .mm_err(|e| WalletInitError::WalletsStorageError(e.to_string())) @@ -171,7 +171,10 @@ async fn retrieve_or_create_passphrase( wallet_name: &str, wallet_password: &str, ) -> WalletInitResult> { - match read_and_decrypt_passphrase_if_available(ctx, wallet_password).await? { + match read_and_decrypt_passphrase_if_available(ctx, wallet_password) + .await + .map_mm_err()? + { Some(passphrase_from_file) => { // If an existing passphrase is found, return it Ok(Some(passphrase_from_file)) @@ -187,9 +190,11 @@ async fn retrieve_or_create_passphrase( password_policy(wallet_password)?; } // If no passphrase is found, generate a new one - let new_passphrase = generate_mnemonic(ctx)?.to_string(); + let new_passphrase = generate_mnemonic(ctx).map_mm_err()?.to_string(); // Encrypt and save the new passphrase - encrypt_and_save_passphrase(ctx, wallet_name, &new_passphrase, wallet_password).await?; + encrypt_and_save_passphrase(ctx, wallet_name, &new_passphrase, wallet_password) + .await + .map_mm_err()?; Ok(Some(new_passphrase)) }, } @@ -202,7 +207,10 @@ async fn confirm_or_encrypt_and_store_passphrase( passphrase: &str, wallet_password: &str, ) -> WalletInitResult> { - match read_and_decrypt_passphrase_if_available(ctx, wallet_password).await? { + match read_and_decrypt_passphrase_if_available(ctx, wallet_password) + .await + .map_mm_err()? + { Some(passphrase_from_file) if passphrase == passphrase_from_file => { // If an existing passphrase is found and it matches the provided passphrase, return it Ok(Some(passphrase_from_file)) @@ -218,7 +226,9 @@ async fn confirm_or_encrypt_and_store_passphrase( password_policy(wallet_password)?; } // If no passphrase is found in the file, encrypt and save the provided passphrase - encrypt_and_save_passphrase(ctx, wallet_name, passphrase, wallet_password).await?; + encrypt_and_save_passphrase(ctx, wallet_name, passphrase, wallet_password) + .await + .map_mm_err()?; Ok(Some(passphrase.to_string())) }, _ => { @@ -236,9 +246,12 @@ async fn decrypt_validate_or_save_passphrase( wallet_password: &str, ) -> WalletInitResult> { // Decrypt the provided encrypted passphrase - let decrypted_passphrase = decrypt_mnemonic(&encrypted_passphrase_data, wallet_password)?; + let decrypted_passphrase = decrypt_mnemonic(&encrypted_passphrase_data, wallet_password).map_mm_err()?; - match read_and_decrypt_passphrase_if_available(ctx, wallet_password).await? { + match read_and_decrypt_passphrase_if_available(ctx, wallet_password) + .await + .map_mm_err()? + { Some(passphrase_from_file) if decrypted_passphrase == passphrase_from_file => { // If an existing passphrase is found and it matches the decrypted passphrase, return it Ok(Some(decrypted_passphrase)) @@ -298,8 +311,8 @@ async fn process_passphrase_logic( fn initialize_crypto_context(ctx: &MmArc, passphrase: &str) -> WalletInitResult<()> { // This defaults to false to maintain backward compatibility. match ctx.conf["enable_hd"].as_bool().unwrap_or(false) { - true => CryptoCtx::init_with_global_hd_account(ctx.clone(), passphrase)?, - false => CryptoCtx::init_with_iguana_passphrase(ctx.clone(), passphrase)?, + true => CryptoCtx::init_with_global_hd_account(ctx.clone(), passphrase).map_mm_err()?, + false => CryptoCtx::init_with_iguana_passphrase(ctx.clone(), passphrase).map_mm_err()?, }; Ok(()) } @@ -328,11 +341,14 @@ pub(crate) async fn initialize_wallet_passphrase(ctx: &MmArc) -> WalletInitResul let (wallet_name, passphrase) = deserialize_wallet_config(ctx)?; ctx.wallet_name .set(wallet_name.clone()) - .map_to_mm(|_| WalletInitError::InternalError("Already Initialized".to_string()))?; + .map_to_mm(|_| WalletInitError::InternalError("Already Initialized".to_string())) + .map_mm_err()?; - let passphrase = process_passphrase_logic(ctx, wallet_name.as_deref(), passphrase).await?; + let passphrase = process_passphrase_logic(ctx, wallet_name.as_deref(), passphrase) + .await + .map_mm_err()?; if let Some(passphrase) = passphrase { - initialize_crypto_context(ctx, &passphrase)?; + initialize_crypto_context(ctx, &passphrase).map_mm_err()?; } Ok(()) @@ -514,7 +530,8 @@ pub async fn get_mnemonic_rpc(ctx: MmArc, req: GetMnemonicRequest) -> MmResult { let encrypted_mnemonic = read_encrypted_passphrase_if_available(&ctx) - .await? + .await + .map_mm_err()? .ok_or_else(|| MnemonicRpcError::InvalidRequest("Wallet mnemonic file not found".to_string()))?; Ok(GetMnemonicResponse { mnemonic: encrypted_mnemonic.into(), @@ -522,7 +539,8 @@ pub async fn get_mnemonic_rpc(ctx: MmArc, req: GetMnemonicRequest) -> MmResult { let plaintext_mnemonic = read_and_decrypt_passphrase_if_available(&ctx, &wallet_password) - .await? + .await + .map_mm_err()? .ok_or_else(|| MnemonicRpcError::InvalidRequest("Wallet mnemonic file not found".to_string()))?; Ok(GetMnemonicResponse { mnemonic: plaintext_mnemonic.into(), @@ -541,7 +559,7 @@ pub struct GetWalletNamesResponse { /// Retrieves all created wallets and the currently activated wallet. pub async fn get_wallet_names_rpc(ctx: MmArc, _req: Json) -> MmResult { // We want to return wallet names in the same order for both native and wasm32 targets. - let wallets = read_all_wallet_names(&ctx).await?.sorted().collect(); + let wallets = read_all_wallet_names(&ctx).await.map_mm_err()?.sorted().collect(); // Note: `ok_or` is used here on `Constructible>` to handle the case where the wallet name is not set. // `wallet_name` can be `None` in the case of no-login mode. let activated_wallet = ctx.wallet_name.get().ok_or(MnemonicRpcError::Internal( @@ -585,14 +603,17 @@ pub async fn change_mnemonic_password(ctx: MmArc, req: ChangeMnemonicPasswordReq .ok_or_else(|| MnemonicRpcError::Internal("`wallet_name` cannot be None!".to_string()))?; // read mnemonic for a wallet_name using current user's password. let mnemonic = read_and_decrypt_passphrase_if_available(&ctx, &req.current_password) - .await? + .await + .map_mm_err()? .ok_or(MmError::new(MnemonicRpcError::Internal(format!( "{wallet_name}: wallet mnemonic file not found" ))))?; // encrypt mnemonic with new passphrase. - let encrypted_data = encrypt_mnemonic(&mnemonic, &req.new_password)?; + let encrypted_data = encrypt_mnemonic(&mnemonic, &req.new_password).map_mm_err()?; // save new encrypted mnemonic data with new password - save_encrypted_passphrase(&ctx, wallet_name, &encrypted_data).await?; + save_encrypted_passphrase(&ctx, wallet_name, &encrypted_data) + .await + .map_mm_err()?; Ok(()) } diff --git a/mm2src/mm2_main/src/rpc/lp_commands/one_inch/rpcs.rs b/mm2src/mm2_main/src/rpc/lp_commands/one_inch/rpcs.rs index aab020e64e..c5ae2b9e49 100644 --- a/mm2src/mm2_main/src/rpc/lp_commands/one_inch/rpcs.rs +++ b/mm2src/mm2_main/src/rpc/lp_commands/one_inch/rpcs.rs @@ -69,7 +69,7 @@ pub async fn one_inch_v6_0_classic_swap_create_rpc( api_supports_pair(&base, &rel)?; let sell_amount = wei_from_big_decimal(&req.amount.to_decimal(), base.decimals()) .mm_err(|err| ApiIntegrationRpcError::InvalidParam(err.to_string()))?; - let single_address = base.derivation_method().single_addr_or_err().await?; + let single_address = base.derivation_method().single_addr_or_err().await.map_mm_err()?; let query_params = ClassicSwapCreateParams::new( base_contract, @@ -145,7 +145,7 @@ pub async fn one_inch_v6_0_classic_swap_tokens_rpc( } async fn get_coin_for_one_inch(ctx: &MmArc, ticker: &str) -> MmResult<(EthCoin, String), ApiIntegrationRpcError> { - let coin = match lp_coinfind_or_err(ctx, ticker).await? { + let coin = match lp_coinfind_or_err(ctx, ticker).await.map_mm_err()? { MmCoinEnum::EthCoin(coin) => coin, _ => return Err(MmError::new(ApiIntegrationRpcError::CoinTypeError)), }; diff --git a/mm2src/mm2_main/src/rpc/lp_commands/one_inch/types.rs b/mm2src/mm2_main/src/rpc/lp_commands/one_inch/types.rs index 202eb0dcf2..8324e801d4 100644 --- a/mm2src/mm2_main/src/rpc/lp_commands/one_inch/types.rs +++ b/mm2src/mm2_main/src/rpc/lp_commands/one_inch/types.rs @@ -152,7 +152,10 @@ impl ClassicSwapResponse { decimals: u8, ) -> MmResult { Ok(Self { - dst_amount: MmNumber::from(u256_to_big_decimal(U256::from_dec_str(&data.dst_amount)?, decimals)?).into(), + dst_amount: MmNumber::from( + u256_to_big_decimal(U256::from_dec_str(&data.dst_amount)?, decimals).map_mm_err()?, + ) + .into(), src_token: data.src_token, dst_token: data.dst_token, protocols: data.protocols, @@ -185,8 +188,8 @@ impl TxFields { from: tx_fields.from, to: tx_fields.to, data: BytesJson::from(hex::decode(str_strip_0x!(tx_fields.data.as_str()))?), - value: u256_to_big_decimal(U256::from_dec_str(&tx_fields.value)?, decimals)?, - gas_price: wei_to_gwei_decimal(U256::from_dec_str(&tx_fields.gas_price)?)?, + value: u256_to_big_decimal(U256::from_dec_str(&tx_fields.value)?, decimals).map_mm_err()?, + gas_price: wei_to_gwei_decimal(U256::from_dec_str(&tx_fields.gas_price)?).map_mm_err()?, gas: tx_fields.gas, }) } diff --git a/mm2src/mm2_main/src/rpc/lp_commands/pubkey.rs b/mm2src/mm2_main/src/rpc/lp_commands/pubkey.rs index f5a5a95063..6a84641f45 100644 --- a/mm2src/mm2_main/src/rpc/lp_commands/pubkey.rs +++ b/mm2src/mm2_main/src/rpc/lp_commands/pubkey.rs @@ -33,7 +33,10 @@ impl HttpStatusCode for GetPublicKeyError { } pub async fn get_public_key(ctx: MmArc, _req: Json) -> GetPublicKeyRpcResult { - let public_key = CryptoCtx::from_ctx(&ctx)?.mm2_internal_pubkey().to_string(); + let public_key = CryptoCtx::from_ctx(&ctx) + .map_mm_err()? + .mm2_internal_pubkey() + .to_string(); Ok(GetPublicKeyResponse { public_key }) } diff --git a/mm2src/mm2_main/src/rpc/lp_commands/tokens.rs b/mm2src/mm2_main/src/rpc/lp_commands/tokens.rs index 78697530c1..da54111581 100644 --- a/mm2src/mm2_main/src/rpc/lp_commands/tokens.rs +++ b/mm2src/mm2_main/src/rpc/lp_commands/tokens.rs @@ -11,6 +11,7 @@ use ethereum_types::Address as EthAddress; use futures::compat::Future01CompatExt; use http::StatusCode; use mm2_core::mm_ctx::MmArc; +use mm2_err_handle::map_mm_error::MmResultExt; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmError, prelude::MmResult}; use mm2_number::BigDecimal; @@ -73,7 +74,7 @@ pub async fn get_token_info(ctx: MmArc, req: TokenInfoRequest) -> MmResult { let contract_address_str = @@ -141,8 +142,8 @@ pub struct Erc20AllowanceRequest { /// Returns BigDecimal allowance value. pub async fn get_token_allowance_rpc(ctx: MmArc, req: Erc20AllowanceRequest) -> MmResult { let eth_coin = find_erc20_eth_coin(&ctx, &req.coin).await?; - let wei = eth_coin.allowance(req.spender).compat().await?; - let amount = u256_to_big_decimal(wei, eth_coin.decimals())?; + let wei = eth_coin.allowance(req.spender).compat().await.map_mm_err()?; + let amount = u256_to_big_decimal(wei, eth_coin.decimals()).map_mm_err()?; Ok(amount) } @@ -157,7 +158,7 @@ pub struct Erc20ApproveRequest { /// Returns approval transaction hash. pub async fn approve_token_rpc(ctx: MmArc, req: Erc20ApproveRequest) -> MmResult { let eth_coin = find_erc20_eth_coin(&ctx, &req.coin).await?; - let amount = wei_from_big_decimal(&req.amount, eth_coin.decimals())?; + let amount = wei_from_big_decimal(&req.amount, eth_coin.decimals()).map_mm_err()?; let tx = eth_coin.approve(req.spender, amount).compat().await?; Ok(format!("0x{:02x}", tx.tx_hash_as_bytes())) } diff --git a/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs b/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs index 16698eb3cc..212c810331 100644 --- a/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs +++ b/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs @@ -2,6 +2,7 @@ use common::HttpStatusCode; use crypto::{CryptoCtx, CryptoCtxError, HwConnectionStatus, HwPubkey}; use http::StatusCode; use mm2_core::mm_ctx::MmArc; +use mm2_err_handle::map_mm_error::MmResultExt; use mm2_err_handle::mm_error::{MmError, MmResult}; use mm2_err_handle::or_mm_error::OrMmError; @@ -45,7 +46,7 @@ pub async fn trezor_connection_status( ctx: MmArc, req: TrezorConnectionStatusReq, ) -> MmResult { - let crypto_ctx = CryptoCtx::from_ctx(&ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(&ctx).map_mm_err()?; let hw_ctx = crypto_ctx .hw_ctx() .or_mm_err(|| TrezorConnectionError::TrezorNotInitialized)?; diff --git a/mm2src/trezor/src/response_processor.rs b/mm2src/trezor/src/response_processor.rs index 33a3e0c46a..dba89a38c6 100644 --- a/mm2src/trezor/src/response_processor.rs +++ b/mm2src/trezor/src/response_processor.rs @@ -17,9 +17,6 @@ impl From for TrezorProcessingError { fn from(e: TrezorError) -> Self { TrezorProcessingError::TrezorError(e) } } -/// This is required for implementing `MmError>: From>`. -impl NotEqual for TrezorProcessingError {} - #[async_trait] pub trait TrezorRequestProcessor where From 6d117b2a53687d84aa0ad5359996549a3a96ee66 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 21:43:10 +0100 Subject: [PATCH 06/35] update wasm target errors --- mm2src/coins/eth.rs | 120 ++-- mm2src/coins/eth/eth_balance_events.rs | 2 +- mm2src/coins/eth/eth_hd_wallet.rs | 2 +- mm2src/coins/eth/eth_withdraw.rs | 2 +- mm2src/coins/eth/v2_activation.rs | 20 +- .../coins/hd_wallet/storage/wasm_storage.rs | 38 +- mm2src/coins/lp_coins.rs | 8 +- mm2src/coins/lp_price.rs | 6 +- mm2src/coins/nft/storage/wasm/wasm_storage.rs | 440 +++++++----- mm2src/coins/siacoin.rs | 2 +- .../wasm/tx_history_storage_v1.rs | 22 +- .../wasm/tx_history_storage_v2.rs | 158 +++-- mm2src/coins/utxo/rpc_clients.rs | 2 +- mm2src/coins/utxo/slp.rs | 2 +- mm2src/coins/z_coin.rs | 7 +- .../storage/blockdb/blockdb_idb_storage.rs | 56 +- .../z_coin/storage/walletdb/wasm/storage.rs | 635 ++++++++++++------ .../z_coin/storage/z_params/indexeddb.rs | 29 +- mm2src/coins/z_coin/z_rpc.rs | 4 +- mm2src/coins/z_coin/z_tx_history.rs | 81 ++- .../src/eth_with_token_activation.rs | 2 +- .../src/sia_coin_activation.rs | 13 +- mm2src/common/common.rs | 4 +- mm2src/crypto/src/crypto_ctx.rs | 2 +- mm2src/crypto/src/hw_client.rs | 6 +- mm2src/mm2_err_handle/src/mm_error.rs | 4 +- .../src/account/storage/wasm_storage.rs | 64 +- mm2src/mm2_main/src/lp_init/init_metamask.rs | 8 +- .../src/lp_ordermatch/my_orders_storage.rs | 142 ++-- mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs | 12 +- .../mm2_main/src/lp_swap/my_swaps_storage.rs | 38 +- mm2src/mm2_main/src/lp_swap/saved_swap.rs | 46 +- mm2src/mm2_main/src/lp_swap/swap_lock.rs | 28 +- mm2src/mm2_main/src/lp_swap/swap_v2_common.rs | 48 +- mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs | 32 +- mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs | 12 +- .../src/lp_wallet/mnemonics_wasm_db.rs | 24 +- mm2src/mm2_net/src/grpc_web.rs | 2 +- mm2src/mm2_net/src/wasm/tonic_client.rs | 5 +- mm2src/trezor/src/transport/webusb.rs | 26 +- 40 files changed, 1291 insertions(+), 863 deletions(-) diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index 98c29753b0..a7c155176c 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -1763,7 +1763,8 @@ impl WatcherOps for EthCoin { .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string()))?; let swap_id_input = get_function_input_data(&decoded, function, 0) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if swap_id_input != Token::FixedBytes(swap_id.clone()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction invalid swap_id arg {:?}, expected {:?}", @@ -1775,7 +1776,8 @@ impl WatcherOps for EthCoin { let hash_input = match input.spend_type { WatcherSpendType::MakerPaymentSpend => { let secret_input = get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()? .into_fixed_bytes() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for secret hash argument".to_string()) @@ -1783,7 +1785,8 @@ impl WatcherOps for EthCoin { dhash160(&secret_input).to_vec() }, WatcherSpendType::TakerPaymentRefund => get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()? .into_fixed_bytes() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for secret argument".to_string()) @@ -1799,7 +1802,8 @@ impl WatcherOps for EthCoin { let my_address = selfi.derivation_method.single_addr_or_err().await.map_mm_err()?; let sender_input = get_function_input_data(&decoded, function, 4) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; let expected_sender = match input.spend_type { WatcherSpendType::MakerPaymentSpend => maker_addr, WatcherSpendType::TakerPaymentRefund => my_address, @@ -1827,7 +1831,8 @@ impl WatcherOps for EthCoin { } let reward_target_input = get_function_input_data(&decoded, function, 6) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if reward_target_input != Token::Uint(U256::from(watcher_reward.reward_target as u8)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction reward target arg {:?} is invalid, expected {:?}", @@ -1837,7 +1842,8 @@ impl WatcherOps for EthCoin { } let contract_reward_input = get_function_input_data(&decoded, function, 7) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if contract_reward_input != Token::Bool(watcher_reward.send_contract_reward_on_spend) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction sends contract reward on spend arg {:?} is invalid, expected {:?}", @@ -1847,7 +1853,8 @@ impl WatcherOps for EthCoin { } let reward_amount_input = get_function_input_data(&decoded, function, 8) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if reward_amount_input != Token::Uint(expected_reward_amount) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction watcher reward amount arg {:?} is invalid, expected {:?}", @@ -1866,7 +1873,8 @@ impl WatcherOps for EthCoin { match &selfi.coin_type { EthCoinType::Eth => { let amount_input = get_function_input_data(&decoded, function, 1) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; let total_amount = match input.spend_type { WatcherSpendType::MakerPaymentSpend => { if !matches!(watcher_reward.reward_target, RewardTarget::None) @@ -1888,7 +1896,8 @@ impl WatcherOps for EthCoin { } let token_address_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if token_address_input != Token::Address(Address::default()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction token address arg {:?} is invalid, expected {:?}", @@ -1902,7 +1911,8 @@ impl WatcherOps for EthCoin { token_addr, } => { let amount_input = get_function_input_data(&decoded, function, 1) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if amount_input != Token::Uint(trade_amount) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction amount arg {:?} is invalid, expected {:?}", @@ -1912,7 +1922,8 @@ impl WatcherOps for EthCoin { } let token_address_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if token_address_input != Token::Address(*token_addr) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Transaction token address arg {:?} is invalid, expected {:?}", @@ -1935,15 +1946,20 @@ impl WatcherOps for EthCoin { fn watcher_validate_taker_payment(&self, input: WatcherValidatePaymentInput) -> ValidatePaymentFut<()> { let unsigned: UnverifiedTransactionWrapper = try_f!(rlp::decode(&input.payment_tx)); - let tx = - try_f!(SignedEthTx::new(unsigned) - .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())).map_mm_err()); - let sender = try_f!(addr_from_raw_pubkey(&input.taker_pub).map_to_mm(ValidatePaymentError::InvalidParameter).map_mm_err()); - let receiver = try_f!(addr_from_raw_pubkey(&input.maker_pub).map_to_mm(ValidatePaymentError::InvalidParameter).map_mm_err()); + let tx = try_f!(SignedEthTx::new(unsigned) + .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())) + .map_mm_err()); + let sender = try_f!(addr_from_raw_pubkey(&input.taker_pub) + .map_to_mm(ValidatePaymentError::InvalidParameter) + .map_mm_err()); + let receiver = try_f!(addr_from_raw_pubkey(&input.maker_pub) + .map_to_mm(ValidatePaymentError::InvalidParameter) + .map_mm_err()); let time_lock = try_f!(input .time_lock .try_into() - .map_to_mm(ValidatePaymentError::TimelockOverflow).map_mm_err()); + .map_to_mm(ValidatePaymentError::TimelockOverflow) + .map_mm_err()); let selfi = self.clone(); let swap_id = selfi.etomic_swap_id(time_lock, &input.secret_hash); @@ -1986,7 +2002,8 @@ impl WatcherOps for EthCoin { .payment_status(swap_contract_address, Token::FixedBytes(swap_id.clone())) .compat() .await - .map_to_mm(ValidatePaymentError::Transport).map_mm_err()?; + .map_to_mm(ValidatePaymentError::Transport) + .map_mm_err()?; if status != U256::from(PaymentState::Sent as u8) && status != U256::from(PaymentState::Spent as u8) { return MmError::err(ValidatePaymentError::UnexpectedPaymentState(format!( "{INVALID_PAYMENT_STATE_ERR_LOG}: Payment state is not PAYMENT_STATE_SENT or PAYMENT_STATE_SPENT, got {status}" @@ -2004,12 +2021,15 @@ impl WatcherOps for EthCoin { let function_name = get_function_name("ethPayment", true); let function = SWAP_CONTRACT .function(&function_name) - .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string())).map_mm_err()?; + .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string())) + .map_mm_err()?; let decoded = decode_contract_call(function, &tx_from_rpc.input.0) - .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())).map_mm_err()?; + .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())) + .map_mm_err()?; let swap_id_input = get_function_input_data(&decoded, function, 0) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if swap_id_input != Token::FixedBytes(swap_id.clone()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_SWAP_ID_ERR_LOG}: Invalid 'swap_id' {decoded:?}, expected {swap_id:?}" @@ -2017,7 +2037,8 @@ impl WatcherOps for EthCoin { } let receiver_input = get_function_input_data(&decoded, function, 1) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if receiver_input != Token::Address(receiver) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_RECEIVER_ERR_LOG}: Payment tx receiver arg {receiver_input:?} is invalid, expected {:?}", Token::Address(receiver) @@ -2025,7 +2046,8 @@ impl WatcherOps for EthCoin { } let secret_hash_input = get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if secret_hash_input != Token::FixedBytes(secret_hash.to_vec()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx secret_hash arg {:?} is invalid, expected {:?}", @@ -2035,7 +2057,8 @@ impl WatcherOps for EthCoin { } let time_lock_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if time_lock_input != Token::Uint(U256::from(input.time_lock)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx time_lock arg {:?} is invalid, expected {:?}", @@ -2045,7 +2068,8 @@ impl WatcherOps for EthCoin { } let reward_target_input = get_function_input_data(&decoded, function, 4) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; let expected_reward_target = watcher_reward.reward_target as u8; if reward_target_input != Token::Uint(U256::from(expected_reward_target)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( @@ -2055,7 +2079,8 @@ impl WatcherOps for EthCoin { } let sends_contract_reward_input = get_function_input_data(&decoded, function, 5) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if sends_contract_reward_input != Token::Bool(watcher_reward.send_contract_reward_on_spend) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx sends_contract_reward_on_spend arg {:?} is invalid, expected {:?}", @@ -2064,13 +2089,15 @@ impl WatcherOps for EthCoin { } let reward_amount_input = get_function_input_data(&decoded, function, 6) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()? .into_uint() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for reward amount argument".to_string()) })?; - validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false).map_mm_err()?; + validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false) + .map_mm_err()?; // TODO: Validate the value }, @@ -2081,12 +2108,15 @@ impl WatcherOps for EthCoin { let function_name = get_function_name("erc20Payment", true); let function = SWAP_CONTRACT .function(&function_name) - .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string())).map_mm_err()?; + .map_to_mm(|err| ValidatePaymentError::InternalError(err.to_string())) + .map_mm_err()?; let decoded = decode_contract_call(function, &tx_from_rpc.input.0) - .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())).map_mm_err()?; + .map_to_mm(|err| ValidatePaymentError::TxDeserializationError(err.to_string())) + .map_mm_err()?; let swap_id_input = get_function_input_data(&decoded, function, 0) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if swap_id_input != Token::FixedBytes(swap_id.clone()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_SWAP_ID_ERR_LOG}: Invalid 'swap_id' {decoded:?}, expected {swap_id:?}" @@ -2094,7 +2124,8 @@ impl WatcherOps for EthCoin { } let token_addr_input = get_function_input_data(&decoded, function, 2) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if token_addr_input != Token::Address(*token_addr) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx token_addr arg {:?} is invalid, expected {:?}", @@ -2104,7 +2135,8 @@ impl WatcherOps for EthCoin { } let receiver_addr_input = get_function_input_data(&decoded, function, 3) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if receiver_addr_input != Token::Address(receiver) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "{INVALID_RECEIVER_ERR_LOG}: Payment tx receiver arg {receiver_addr_input:?} is invalid, expected {:?}", Token::Address(receiver), @@ -2112,7 +2144,8 @@ impl WatcherOps for EthCoin { } let secret_hash_input = get_function_input_data(&decoded, function, 4) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if secret_hash_input != Token::FixedBytes(secret_hash.to_vec()) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx secret_hash arg {:?} is invalid, expected {:?}", @@ -2122,7 +2155,8 @@ impl WatcherOps for EthCoin { } let time_lock_input = get_function_input_data(&decoded, function, 5) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if time_lock_input != Token::Uint(U256::from(input.time_lock)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx time_lock arg {:?} is invalid, expected {:?}", @@ -2132,7 +2166,8 @@ impl WatcherOps for EthCoin { } let reward_target_input = get_function_input_data(&decoded, function, 6) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; let expected_reward_target = watcher_reward.reward_target as u8; if reward_target_input != Token::Uint(U256::from(expected_reward_target)) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( @@ -2142,7 +2177,8 @@ impl WatcherOps for EthCoin { } let sends_contract_reward_input = get_function_input_data(&decoded, function, 7) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()?; + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()?; if sends_contract_reward_input != Token::Bool(watcher_reward.send_contract_reward_on_spend) { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( "Payment tx sends_contract_reward_on_spend arg {:?} is invalid, expected {:?}", @@ -2151,13 +2187,15 @@ impl WatcherOps for EthCoin { } let reward_amount_input = get_function_input_data(&decoded, function, 8) - .map_to_mm(ValidatePaymentError::TxDeserializationError).map_mm_err()? + .map_to_mm(ValidatePaymentError::TxDeserializationError) + .map_mm_err()? .into_uint() .ok_or_else(|| { ValidatePaymentError::WrongPaymentTx("Invalid type for reward amount argument".to_string()) })?; - validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false).map_mm_err()?; + validate_watcher_reward(expected_reward_amount.as_u64(), reward_amount_input.as_u64(), false) + .map_mm_err()?; if tx_from_rpc.value != reward_amount_input { return MmError::err(ValidatePaymentError::WrongPaymentTx(format!( @@ -2364,7 +2402,7 @@ impl MarketCoinOps for EthCoin { let decimals = self.decimals; let fut = self .get_balance() - .and_then(move |result| Ok(u256_to_big_decimal(result, decimals).map_mm_err()?)) + .and_then(move |result| u256_to_big_decimal(result, decimals).map_mm_err()) .map(|spendable| CoinBalance { spendable, unspendable: BigDecimal::from(0), @@ -2375,7 +2413,7 @@ impl MarketCoinOps for EthCoin { fn base_coin_balance(&self) -> BalanceFut { Box::new( self.eth_balance() - .and_then(move |result| Ok(u256_to_big_decimal(result, ETH_DECIMALS).map_mm_err()?)), + .and_then(move |result| u256_to_big_decimal(result, ETH_DECIMALS).map_mm_err()), ) } diff --git a/mm2src/coins/eth/eth_balance_events.rs b/mm2src/coins/eth/eth_balance_events.rs index ab896e3f2b..663dd54e34 100644 --- a/mm2src/coins/eth/eth_balance_events.rs +++ b/mm2src/coins/eth/eth_balance_events.rs @@ -2,7 +2,7 @@ use super::EthCoin; use crate::{eth::{u256_to_big_decimal, Erc20TokenDetails}, BalanceError, CoinWithDerivationMethod}; use common::{executor::Timer, log, Future01CompatExt}; -use mm2_err_handle::prelude::{MmError, MmResultExt}; +use mm2_err_handle::prelude::*; use mm2_event_stream::{Broadcaster, Event, EventStreamer, NoDataIn, StreamHandlerInput}; use mm2_number::BigDecimal; diff --git a/mm2src/coins/eth/eth_hd_wallet.rs b/mm2src/coins/eth/eth_hd_wallet.rs index 7d903851c8..be5eb688b0 100644 --- a/mm2src/coins/eth/eth_hd_wallet.rs +++ b/mm2src/coins/eth/eth_hd_wallet.rs @@ -144,7 +144,7 @@ impl HDWalletBalanceOps for EthCoin { async fn known_address_balance(&self, address: &Address) -> BalanceResult { let balance = self .address_balance(*address) - .and_then(move |result| Ok(u256_to_big_decimal(result, self.decimals()).map_mm_err()?)) + .and_then(move |result| u256_to_big_decimal(result, self.decimals()).map_mm_err()) .compat() .await?; diff --git a/mm2src/coins/eth/eth_withdraw.rs b/mm2src/coins/eth/eth_withdraw.rs index 1f5b1dc884..5b3d2078f9 100644 --- a/mm2src/coins/eth/eth_withdraw.rs +++ b/mm2src/coins/eth/eth_withdraw.rs @@ -178,7 +178,7 @@ where let signed_tx = coin .wait_for_tx_appears_on_rpc(tx_hash, wait_rpc_timeout, check_every) - .await?; + .await.map_mm_err()?; let tx_hex = signed_tx .map(|signed_tx| BytesJson::from(rlp::encode(&signed_tx).to_vec())) // Return an empty `tx_hex` if the transaction is still not appeared on the RPC node. diff --git a/mm2src/coins/eth/v2_activation.rs b/mm2src/coins/eth/v2_activation.rs index 65daded657..7563262198 100644 --- a/mm2src/coins/eth/v2_activation.rs +++ b/mm2src/coins/eth/v2_activation.rs @@ -443,9 +443,11 @@ impl EthCoin { }; let max_eth_tx_type = get_max_eth_tx_type_conf(&ctx, &token_conf, &coin_type).await?; let gas_limit: EthGasLimit = extract_gas_limit_from_conf(&token_conf) - .map_to_mm(|e| EthTokenActivationError::InternalError(format!("invalid gas_limit config {}", e)))?; + .map_to_mm(|e| EthTokenActivationError::InternalError(format!("invalid gas_limit config {}", e))) + .map_mm_err()?; let gas_limit_v2: EthGasLimitV2 = extract_gas_limit_from_conf(&token_conf) - .map_to_mm(|e| EthTokenActivationError::InternalError(format!("invalid gas_limit config {}", e)))?; + .map_to_mm(|e| EthTokenActivationError::InternalError(format!("invalid gas_limit config {}", e))) + .map_mm_err()?; let token = EthCoinImpl { priv_key_policy: self.priv_key_policy.clone(), @@ -797,7 +799,7 @@ pub(crate) async fn build_address_and_priv_key_policy( }, #[cfg(target_arch = "wasm32")] EthPrivKeyBuildPolicy::Metamask(metamask_ctx) => { - let address = *metamask_ctx.check_active_eth_account().await?; + let address = *metamask_ctx.check_active_eth_account().await.map_mm_err()?; let public_key_uncompressed = metamask_ctx.eth_account_pubkey_uncompressed(); let public_key = compress_public_key(public_key_uncompressed)?; Ok(( @@ -931,14 +933,13 @@ async fn build_metamask_transport( let event_handlers = rpc_event_handlers_for_eth_transport(ctx, coin_ticker.clone()); let eth_config = web3_transport::metamask_transport::MetamaskEthConfig { chain_id }; - let web3 = Web3::new(Web3Transport::new_metamask_with_event_handlers( - eth_config, - event_handlers, - )?); + let web3 = Web3::new(Web3Transport::new_metamask_with_event_handlers(eth_config, event_handlers).map_mm_err()?); // Check if MetaMask supports the given `chain_id`. // Please note that this request may take a long time. - check_metamask_supports_chain_id(coin_ticker, &web3, chain_id).await?; + check_metamask_supports_chain_id(coin_ticker, &web3, chain_id) + .await + .map_mm_err()?; // MetaMask doesn't use Parity nodes. So `MetamaskTransport` doesn't support `parity_nextNonce` RPC. // An example of the `web3_clientVersion` RPC - `MetaMask/v10.22.1`. @@ -982,7 +983,8 @@ async fn check_metamask_supports_chain_id( #[cfg(target_arch = "wasm32")] fn compress_public_key(uncompressed: H520) -> MmResult { let public_key = PublicKey::from_slice(uncompressed.as_bytes()) - .map_to_mm(|e| EthActivationV2Error::InternalError(e.to_string()))?; + .map_to_mm(|e| EthActivationV2Error::InternalError(e.to_string())) + .map_mm_err()?; let compressed = public_key.serialize(); Ok(H264::from(compressed)) } diff --git a/mm2src/coins/hd_wallet/storage/wasm_storage.rs b/mm2src/coins/hd_wallet/storage/wasm_storage.rs index 4654474236..72454564eb 100644 --- a/mm2src/coins/hd_wallet/storage/wasm_storage.rs +++ b/mm2src/coins/hd_wallet/storage/wasm_storage.rs @@ -173,15 +173,15 @@ impl HDWalletStorageInternalOps for HDWalletIndexedDbStorage { let shared_db = self.get_shared_db()?; let locked_db = Self::lock_db_mutex(&shared_db).await?; - let transaction = locked_db.inner.transaction().await?; - let table = transaction.table::().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WALLET_ID_INDEX) - .with_value(wallet_id.coin)? - .with_value(wallet_id.hd_wallet_rmd160)?; + .with_value(wallet_id.coin).map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160).map_mm_err()?; Ok(table .get_items_by_multi_index(index_keys) - .await? + .await.map_mm_err()? .into_iter() .map(|(_item_id, item)| HDAccountStorageItem::from(item)) .collect()) @@ -195,8 +195,8 @@ impl HDWalletStorageInternalOps for HDWalletIndexedDbStorage { let shared_db = self.get_shared_db()?; let locked_db = Self::lock_db_mutex(&shared_db).await?; - let transaction = locked_db.inner.transaction().await?; - let table = transaction.table::().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let maybe_account = Self::find_account(&table, wallet_id, account_id).await?; match maybe_account { @@ -237,8 +237,8 @@ impl HDWalletStorageInternalOps for HDWalletIndexedDbStorage { let shared_db = self.get_shared_db()?; let locked_db = Self::lock_db_mutex(&shared_db).await?; - let transaction = locked_db.inner.transaction().await?; - let table = transaction.table::().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let new_account = HDAccountTable::new(wallet_id, account); table @@ -252,13 +252,13 @@ impl HDWalletStorageInternalOps for HDWalletIndexedDbStorage { let shared_db = self.get_shared_db()?; let locked_db = Self::lock_db_mutex(&shared_db).await?; - let transaction = locked_db.inner.transaction().await?; - let table = transaction.table::().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WALLET_ID_INDEX) - .with_value(wallet_id.coin)? - .with_value(wallet_id.hd_wallet_rmd160)?; - table.delete_items_by_multi_index(index_keys).await?; + .with_value(wallet_id.coin).map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160).map_mm_err()?; + table.delete_items_by_multi_index(index_keys).await.map_mm_err()?; Ok(()) } } @@ -280,9 +280,9 @@ impl HDWalletIndexedDbStorage { account_id: u32, ) -> HDWalletStorageResult> { let index_keys = MultiIndex::new(WALLET_ACCOUNT_ID_INDEX) - .with_value(wallet_id.coin)? - .with_value(wallet_id.hd_wallet_rmd160)? - .with_value(account_id)?; + .with_value(wallet_id.coin).map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160).map_mm_err()? + .with_value(account_id).map_mm_err()?; table .get_item_by_unique_multi_index(index_keys) .await @@ -296,8 +296,8 @@ impl HDWalletIndexedDbStorage { let shared_db = self.get_shared_db()?; let locked_db = Self::lock_db_mutex(&shared_db).await?; - let transaction = locked_db.inner.transaction().await?; - let table = transaction.table::().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let (account_item_id, mut account) = Self::find_account(&table, wallet_id.clone(), account_id) .await? diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 9d671c998b..459679067a 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -27,7 +27,7 @@ clippy::forget_non_drop )] #![allow(uncommon_codepoints)] -#![feature(integer_atomics)] +// #![feature(integer_atomics)] #![feature(async_closure)] #![feature(hash_raw_entry)] #![feature(stmt_expr_attributes)] @@ -4147,7 +4147,7 @@ impl CoinsContext { #[cfg(target_arch = "wasm32")] async fn tx_history_db(&self) -> TxHistoryResult> { - Ok(self.tx_history_db.get_or_initialize().await?) + self.tx_history_db.get_or_initialize().await.map_mm_err() } #[inline(always)] @@ -5621,7 +5621,7 @@ where { let ctx = ctx.clone(); let ticker = coin.ticker().to_owned(); - let my_address = try_f!(coin.my_address()); + let my_address = try_f!(coin.my_address().map_mm_err()); let fut = async move { let coins_ctx = CoinsContext::from_ctx(&ctx).unwrap(); @@ -5695,7 +5695,7 @@ where { let ctx = ctx.clone(); let ticker = coin.ticker().to_owned(); - let my_address = try_f!(coin.my_address()); + let my_address = try_f!(coin.my_address().map_mm_err()); history.sort_unstable_by(compare_transaction_details); diff --git a/mm2src/coins/lp_price.rs b/mm2src/coins/lp_price.rs index b47399811a..f7cd971415 100644 --- a/mm2src/coins/lp_price.rs +++ b/mm2src/coins/lp_price.rs @@ -1,6 +1,6 @@ use common::log::{debug, error, info}; use common::StatusCode; -use mm2_err_handle::prelude::{MmError, OrMmError}; +use mm2_err_handle::prelude::*; use mm2_net::transport::SlurpError; #[cfg(not(feature = "run-docker-tests"))] use mm2_number::bigdecimal_custom::CheckedDivision; @@ -187,8 +187,6 @@ impl TickerInfosRegistry { #[cfg(not(target_arch = "wasm32"))] async fn process_price_request(price_url: &str) -> Result> { - use mm2_err_handle::prelude::MmResultExt; - debug!("Fetching price from: {}", price_url); let (status, headers, body) = mm2_net::native_http::slurp_url(price_url).await.map_mm_err()?; let (status_code, body, _) = (status, std::str::from_utf8(&body)?.trim().into(), headers); @@ -202,7 +200,7 @@ async fn process_price_request(price_url: &str) -> Result Result> { debug!("Fetching price from: {}", price_url); - let (status, headers, body) = mm2_net::wasm::http::slurp_url(price_url).await?; + let (status, headers, body) = mm2_net::wasm::http::slurp_url(price_url).await.map_mm_err()?; let (status_code, body, _) = (status, std::str::from_utf8(&body)?.trim().into(), headers); if status_code != StatusCode::OK { return MmError::err(PriceServiceRequestError::HttpProcessError(body)); diff --git a/mm2src/coins/nft/storage/wasm/wasm_storage.rs b/mm2src/coins/nft/storage/wasm/wasm_storage.rs index 5ad0190179..47e16870e0 100644 --- a/mm2src/coins/nft/storage/wasm/wasm_storage.rs +++ b/mm2src/coins/nft/storage/wasm/wasm_storage.rs @@ -8,8 +8,7 @@ use crate::nft::storage::{get_offset_limit, NftListStorageOps, NftTokenAddrId, N use async_trait::async_trait; use ethereum_types::Address; use mm2_db::indexed_db::{BeBigUint, DbTable, DbUpgrader, MultiIndex, OnUpgradeError, OnUpgradeResult, TableSignature}; -use mm2_err_handle::map_to_mm::MapToMmResult; -use mm2_err_handle::prelude::{MmError, MmResult}; +use mm2_err_handle::prelude::*; use mm2_number::BigUint; use num_traits::ToPrimitive; use serde_json::{self as json, Value as Json}; @@ -144,13 +143,14 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { page_number: Option, filters: Option, ) -> MmResult { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let mut nfts = Vec::new(); for chain in chains { let nft_tables = table .get_items("chain", chain.to_string()) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, nft)| nft); let filtered = filter_nfts(nft_tables, filters)?; @@ -164,12 +164,12 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { I: IntoIterator + Send + 'static, I::IntoIter: Send, { - let db_transaction = self.get_inner().transaction().await?; - let nft_table = db_transaction.table::().await?; - let last_scanned_block_table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let nft_table = db_transaction.table::().await.map_mm_err()?; + let last_scanned_block_table = db_transaction.table::().await.map_mm_err()?; for nft in nfts { let nft_item = NftListTable::from_nft(&nft)?; - nft_table.add_item(&nft_item).await?; + nft_table.add_item(&nft_item).await.map_mm_err()?; } let last_scanned_block = LastScannedBlockTable { chain: chain.to_string(), @@ -177,7 +177,8 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { }; last_scanned_block_table .replace_item_by_unique_index("chain", chain.to_string(), &last_scanned_block) - .await?; + .await + .map_mm_err()?; Ok(()) } @@ -187,14 +188,17 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { token_address: String, token_id: BigUint, ) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(&token_address)? - .with_value(BeBigUint::from(token_id))?; - - if let Some((_item_id, item)) = table.get_item_by_unique_multi_index(index_keys).await? { + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()? + .with_value(BeBigUint::from(token_id)) + .map_mm_err()?; + + if let Some((_item_id, item)) = table.get_item_by_unique_multi_index(index_keys).await.map_mm_err()? { Ok(Some(nft_details_from_item(item)?)) } else { Ok(None) @@ -208,24 +212,32 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { token_id: BigUint, scanned_block: u64, ) -> MmResult { - let db_transaction = self.get_inner().transaction().await?; - let nft_table = db_transaction.table::().await?; - let last_scanned_block_table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let nft_table = db_transaction.table::().await.map_mm_err()?; + let last_scanned_block_table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(&token_address)? - .with_value(BeBigUint::from(token_id))?; + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()? + .with_value(BeBigUint::from(token_id)) + .map_mm_err()?; let last_scanned_block = LastScannedBlockTable { chain: chain.to_string(), last_scanned_block: BeBigUint::from(scanned_block), }; - let nft_removed = nft_table.delete_item_by_unique_multi_index(index_keys).await?.is_some(); + let nft_removed = nft_table + .delete_item_by_unique_multi_index(index_keys) + .await + .map_mm_err()? + .is_some(); last_scanned_block_table .replace_item_by_unique_index("chain", chain.to_string(), &last_scanned_block) - .await?; + .await + .map_mm_err()?; if nft_removed { Ok(RemoveNftResult::NftRemoved) } else { @@ -239,14 +251,17 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { token_address: String, token_id: BigUint, ) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(&token_address)? - .with_value(BeBigUint::from(token_id))?; - - if let Some((_item_id, item)) = table.get_item_by_unique_multi_index(index_keys).await? { + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()? + .with_value(BeBigUint::from(token_id)) + .map_mm_err()?; + + if let Some((_item_id, item)) = table.get_item_by_unique_multi_index(index_keys).await.map_mm_err()? { Ok(Some(nft_details_from_item(item)?.common.amount.to_string())) } else { Ok(None) @@ -254,28 +269,38 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { } async fn refresh_nft_metadata(&self, chain: &Chain, nft: Nft) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(nft.common.token_address.addr_to_string())? - .with_value(BeBigUint::from(nft.token_id.clone()))?; + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(nft.common.token_address.addr_to_string()) + .map_mm_err()? + .with_value(BeBigUint::from(nft.token_id.clone())) + .map_mm_err()?; let nft_item = NftListTable::from_nft(&nft)?; - table.replace_item_by_unique_multi_index(index_keys, &nft_item).await?; + table + .replace_item_by_unique_multi_index(index_keys, &nft_item) + .await + .map_mm_err()?; Ok(()) } async fn get_last_block_number(&self, chain: &Chain) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; get_last_block_from_table(chain, table, CHAIN_BLOCK_NUMBER_INDEX).await } async fn get_last_scanned_block(&self, chain: &Chain) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; - if let Some((_item_id, item)) = table.get_item_by_unique_index("chain", chain.to_string()).await? { + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; + if let Some((_item_id, item)) = table + .get_item_by_unique_index("chain", chain.to_string()) + .await + .map_mm_err()? + { let last_scanned_block = item .last_scanned_block .to_u64() @@ -287,64 +312,77 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { } async fn update_nft_amount(&self, chain: &Chain, nft: Nft, scanned_block: u64) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let nft_table = db_transaction.table::().await?; - let last_scanned_block_table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let nft_table = db_transaction.table::().await.map_mm_err()?; + let last_scanned_block_table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(nft.common.token_address.addr_to_string())? - .with_value(BeBigUint::from(nft.token_id.clone()))?; + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(nft.common.token_address.addr_to_string()) + .map_mm_err()? + .with_value(BeBigUint::from(nft.token_id.clone())) + .map_mm_err()?; let nft_item = NftListTable::from_nft(&nft)?; nft_table .replace_item_by_unique_multi_index(index_keys, &nft_item) - .await?; + .await + .map_mm_err()?; let last_scanned_block = LastScannedBlockTable { chain: chain.to_string(), last_scanned_block: BeBigUint::from(scanned_block), }; last_scanned_block_table .replace_item_by_unique_index("chain", chain.to_string(), &last_scanned_block) - .await?; + .await + .map_mm_err()?; Ok(()) } async fn update_nft_amount_and_block_number(&self, chain: &Chain, nft: Nft) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let nft_table = db_transaction.table::().await?; - let last_scanned_block_table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let nft_table = db_transaction.table::().await.map_mm_err()?; + let last_scanned_block_table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(nft.common.token_address.addr_to_string())? - .with_value(BeBigUint::from(nft.token_id.clone()))?; + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(nft.common.token_address.addr_to_string()) + .map_mm_err()? + .with_value(BeBigUint::from(nft.token_id.clone())) + .map_mm_err()?; let nft_item = NftListTable::from_nft(&nft)?; nft_table .replace_item_by_unique_multi_index(index_keys, &nft_item) - .await?; + .await + .map_mm_err()?; let last_scanned_block = LastScannedBlockTable { chain: chain.to_string(), last_scanned_block: BeBigUint::from(nft.block_number), }; last_scanned_block_table .replace_item_by_unique_index("chain", chain.to_string(), &last_scanned_block) - .await?; + .await + .map_mm_err()?; Ok(()) } async fn get_nfts_by_token_address(&self, chain: Chain, token_address: String) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_INDEX) - .with_value(chain.to_string())? - .with_value(&token_address)?; + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()?; table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| nft_details_from_item(item)) .collect() @@ -356,17 +394,20 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { token_address: String, possible_spam: bool, ) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let chain_str = chain.to_string(); let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_INDEX) - .with_value(&chain_str)? - .with_value(&token_address)?; + .with_value(&chain_str) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()?; let nfts: Result, _> = table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| nft_details_from_item(item)) .collect(); @@ -377,22 +418,28 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { drop_mutability!(nft); let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(&chain_str)? - .with_value(nft.common.token_address.addr_to_string())? - .with_value(BeBigUint::from(nft.token_id.clone()))?; + .with_value(&chain_str) + .map_mm_err()? + .with_value(nft.common.token_address.addr_to_string()) + .map_mm_err()? + .with_value(BeBigUint::from(nft.token_id.clone())) + .map_mm_err()?; let item = NftListTable::from_nft(&nft)?; - table.replace_item_by_unique_multi_index(index_keys, &item).await?; + table + .replace_item_by_unique_multi_index(index_keys, &item) + .await + .map_mm_err()?; } Ok(()) } async fn get_animation_external_domains(&self, chain: &Chain) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let mut domains = HashSet::new(); - let nft_tables = table.get_items("chain", chain.to_string()).await?; + let nft_tables = table.get_items("chain", chain.to_string()).await.map_mm_err()?; for (_item_id, nft) in nft_tables.into_iter() { if let Some(domain) = nft.animation_domain { domains.insert(domain); @@ -410,8 +457,8 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { domain: String, possible_phishing: bool, ) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let chain_str = chain.to_string(); update_nft_phishing_for_index(&table, &chain_str, CHAIN_TOKEN_DOMAIN_INDEX, &domain, possible_phishing).await?; @@ -424,23 +471,27 @@ impl NftListStorageOps for NftCacheIDBLocked<'_> { } async fn clear_nft_data(&self, chain: &Chain) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let nft_table = db_transaction.table::().await?; - let last_scanned_block_table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let nft_table = db_transaction.table::().await.map_mm_err()?; + let last_scanned_block_table = db_transaction.table::().await.map_mm_err()?; - nft_table.delete_items_by_index("chain", chain.to_string()).await?; + nft_table + .delete_items_by_index("chain", chain.to_string()) + .await + .map_mm_err()?; last_scanned_block_table .delete_item_by_unique_index("chain", chain.to_string()) - .await?; + .await + .map_mm_err()?; Ok(()) } async fn clear_all_nft_data(&self) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let nft_table = db_transaction.table::().await?; - let last_scanned_block_table = db_transaction.table::().await?; - nft_table.clear().await?; - last_scanned_block_table.clear().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let nft_table = db_transaction.table::().await.map_mm_err()?; + let last_scanned_block_table = db_transaction.table::().await.map_mm_err()?; + nft_table.clear().await.map_mm_err()?; + last_scanned_block_table.clear().await.map_mm_err()?; Ok(()) } } @@ -461,13 +512,14 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { page_number: Option, filters: Option, ) -> MmResult { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let mut transfers = Vec::new(); for chain in chains { let transfer_tables = table .get_items("chain", chain.to_string()) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, transfer)| transfer); let filtered = filter_transfers(transfer_tables, filters)?; @@ -481,18 +533,18 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { I: IntoIterator + Send + 'static, I::IntoIter: Send, { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; for transfer in transfers { let transfer_item = NftTransferHistoryTable::from_transfer_history(&transfer)?; - table.add_item(&transfer_item).await?; + table.add_item(&transfer_item).await.map_mm_err()?; } Ok(()) } async fn get_last_block_number(&self, chain: &Chain) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; get_last_block_from_table(chain, table, CHAIN_BLOCK_NUMBER_INDEX).await } @@ -501,8 +553,8 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { chain: Chain, from_block: u64, ) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let mut cursor_iter = table .cursor_builder() .only("chain", chain.to_string()) @@ -530,17 +582,21 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { token_address: String, token_id: BigUint, ) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(&token_address)? - .with_value(BeBigUint::from(token_id))?; + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()? + .with_value(BeBigUint::from(token_id)) + .map_mm_err()?; table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| transfer_details_from_item(item)) .collect() @@ -553,15 +609,19 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { log_index: u32, token_id: BigUint, ) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX) - .with_value(chain.to_string())? - .with_value(&transaction_hash)? - .with_value(log_index)? - .with_value(BeBigUint::from(token_id))?; - - if let Some((_item_id, item)) = table.get_item_by_unique_multi_index(index_keys).await? { + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(&transaction_hash) + .map_mm_err()? + .with_value(log_index) + .map_mm_err()? + .with_value(BeBigUint::from(token_id)) + .map_mm_err()?; + + if let Some((_item_id, item)) = table.get_item_by_unique_multi_index(index_keys).await.map_mm_err()? { Ok(Some(transfer_details_from_item(item)?)) } else { Ok(None) @@ -574,18 +634,22 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { transfer_meta: TransferMeta, set_spam: bool, ) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let chain_str = chain.to_string(); let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(&chain_str)? - .with_value(&transfer_meta.token_address)? - .with_value(BeBigUint::from(transfer_meta.token_id))?; + .with_value(&chain_str) + .map_mm_err()? + .with_value(&transfer_meta.token_address) + .map_mm_err()? + .with_value(BeBigUint::from(transfer_meta.token_id)) + .map_mm_err()?; let transfers: Result, _> = table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| transfer_details_from_item(item)) .collect(); @@ -604,20 +668,27 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { drop_mutability!(transfer); let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX) - .with_value(&chain_str)? - .with_value(&transfer.common.transaction_hash)? - .with_value(transfer.common.log_index)? - .with_value(BeBigUint::from(transfer.token_id.clone()))?; + .with_value(&chain_str) + .map_mm_err()? + .with_value(&transfer.common.transaction_hash) + .map_mm_err()? + .with_value(transfer.common.log_index) + .map_mm_err()? + .with_value(BeBigUint::from(transfer.token_id.clone())) + .map_mm_err()?; let item = NftTransferHistoryTable::from_transfer_history(&transfer)?; - table.replace_item_by_unique_multi_index(index_keys, &item).await?; + table + .replace_item_by_unique_multi_index(index_keys, &item) + .await + .map_mm_err()?; } Ok(()) } async fn get_transfers_with_empty_meta(&self, chain: Chain) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let mut cursor_iter = table .cursor_builder() .only("chain", chain.to_string()) @@ -652,16 +723,19 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { chain: Chain, token_address: String, ) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_INDEX) - .with_value(chain.to_string())? - .with_value(&token_address)?; + .with_value(chain.to_string()) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()?; table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| transfer_details_from_item(item)) .collect() @@ -673,17 +747,20 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { token_address: String, possible_spam: bool, ) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let chain_str = chain.to_string(); let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_INDEX) - .with_value(&chain_str)? - .with_value(&token_address)?; + .with_value(&chain_str) + .map_mm_err()? + .with_value(&token_address) + .map_mm_err()?; let transfers: Result, _> = table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| transfer_details_from_item(item)) .collect(); @@ -694,22 +771,29 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { drop_mutability!(transfer); let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX) - .with_value(&chain_str)? - .with_value(&transfer.common.transaction_hash)? - .with_value(transfer.common.log_index)? - .with_value(BeBigUint::from(transfer.token_id.clone()))?; + .with_value(&chain_str) + .map_mm_err()? + .with_value(&transfer.common.transaction_hash) + .map_mm_err()? + .with_value(transfer.common.log_index) + .map_mm_err()? + .with_value(BeBigUint::from(transfer.token_id.clone())) + .map_mm_err()?; let item = NftTransferHistoryTable::from_transfer_history(&transfer)?; - table.replace_item_by_unique_multi_index(index_keys, &item).await?; + table + .replace_item_by_unique_multi_index(index_keys, &item) + .await + .map_mm_err()?; } Ok(()) } async fn get_token_addresses(&self, chain: Chain) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; - let items = table.get_items("chain", chain.to_string()).await?; + let items = table.get_items("chain", chain.to_string()).await.map_mm_err()?; let mut token_addresses = HashSet::with_capacity(items.len()); for (_item_id, item) in items.into_iter() { let transfer = transfer_details_from_item(item)?; @@ -719,11 +803,11 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { } async fn get_domains(&self, chain: &Chain) -> MmResult, Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let mut domains = HashSet::new(); - let transfer_tables = table.get_items("chain", chain.to_string()).await?; + let transfer_tables = table.get_items("chain", chain.to_string()).await.map_mm_err()?; for (_item_id, transfer) in transfer_tables.into_iter() { if let Some(domain) = transfer.token_domain { domains.insert(domain); @@ -741,8 +825,8 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { domain: String, possible_phishing: bool, ) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let chain_str = chain.to_string(); update_transfer_phishing_for_index(&table, &chain_str, CHAIN_TOKEN_DOMAIN_INDEX, &domain, possible_phishing) .await?; @@ -752,16 +836,19 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> { } async fn clear_history_data(&self, chain: &Chain) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; - table.delete_items_by_index("chain", chain.to_string()).await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; + table + .delete_items_by_index("chain", chain.to_string()) + .await + .map_mm_err()?; Ok(()) } async fn clear_all_history_data(&self) -> MmResult<(), Self::Error> { - let db_transaction = self.get_inner().transaction().await?; - let table = db_transaction.table::().await?; - table.clear().await?; + let db_transaction = self.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; + table.clear().await.map_mm_err()?; Ok(()) } } @@ -773,21 +860,30 @@ async fn update_transfer_phishing_for_index( domain: &str, possible_phishing: bool, ) -> MmResult<(), WasmNftCacheError> { - let index_keys = MultiIndex::new(index).with_value(chain)?.with_value(domain)?; - let transfers_table = table.get_items_by_multi_index(index_keys).await?; + let index_keys = MultiIndex::new(index) + .with_value(chain) + .map_mm_err()? + .with_value(domain) + .map_mm_err()?; + let transfers_table = table.get_items_by_multi_index(index_keys).await.map_mm_err()?; for (_item_id, item) in transfers_table.into_iter() { let mut transfer = transfer_details_from_item(item)?; transfer.possible_phishing = possible_phishing; drop_mutability!(transfer); let transfer_item = NftTransferHistoryTable::from_transfer_history(&transfer)?; let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX) - .with_value(chain)? - .with_value(&transfer.common.transaction_hash)? - .with_value(transfer.common.log_index)? - .with_value(BeBigUint::from(transfer.token_id))?; + .with_value(chain) + .map_mm_err()? + .with_value(&transfer.common.transaction_hash) + .map_mm_err()? + .with_value(transfer.common.log_index) + .map_mm_err()? + .with_value(BeBigUint::from(transfer.token_id)) + .map_mm_err()?; table .replace_item_by_unique_multi_index(index_keys, &transfer_item) - .await?; + .await + .map_mm_err()?; } Ok(()) } @@ -799,18 +895,28 @@ async fn update_nft_phishing_for_index( domain: &str, possible_phishing: bool, ) -> MmResult<(), WasmNftCacheError> { - let index_keys = MultiIndex::new(index).with_value(chain)?.with_value(domain)?; - let nfts_table = table.get_items_by_multi_index(index_keys).await?; + let index_keys = MultiIndex::new(index) + .with_value(chain) + .map_mm_err()? + .with_value(domain) + .map_mm_err()?; + let nfts_table = table.get_items_by_multi_index(index_keys).await.map_mm_err()?; for (_item_id, item) in nfts_table.into_iter() { let mut nft = nft_details_from_item(item)?; nft.possible_phishing = possible_phishing; drop_mutability!(nft); let nft_item = NftListTable::from_nft(&nft)?; let index_keys = MultiIndex::new(CHAIN_TOKEN_ADD_TOKEN_ID_INDEX) - .with_value(chain)? - .with_value(nft.common.token_address.addr_to_string())? - .with_value(BeBigUint::from(nft.token_id))?; - table.replace_item_by_unique_multi_index(index_keys, &nft_item).await?; + .with_value(chain) + .map_mm_err()? + .with_value(nft.common.token_address.addr_to_string()) + .map_mm_err()? + .with_value(BeBigUint::from(nft.token_id)) + .map_mm_err()?; + table + .replace_item_by_unique_multi_index(index_keys, &nft_item) + .await + .map_mm_err()?; } Ok(()) } diff --git a/mm2src/coins/siacoin.rs b/mm2src/coins/siacoin.rs index bb5ec12353..37e82ba074 100644 --- a/mm2src/coins/siacoin.rs +++ b/mm2src/coins/siacoin.rs @@ -164,7 +164,7 @@ impl<'a> SiaCoinBuilder<'a> { fn ticker(&self) -> &str { self.ticker } async fn build(self) -> MmResult { - let conf = SiaConfBuilder::new(self.conf, self.ticker()).build()?; + let conf = SiaConfBuilder::new(self.conf, self.ticker()).build().map_mm_err()?; let sia_fields = SiaCoinFields { conf, http_client: SiaApiClient::new(self.params.http_conf.clone()) diff --git a/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v1.rs b/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v1.rs index c52fefd76d..77baedcb29 100644 --- a/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v1.rs +++ b/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v1.rs @@ -2,6 +2,7 @@ use crate::tx_history_storage::wasm::tx_history_db::TxHistoryDb; use crate::tx_history_storage::wasm::WasmTxHistoryResult; use crate::TransactionDetails; use mm2_db::indexed_db::{DbIdentifier, DbInstance, DbUpgrader, OnUpgradeResult, TableSignature}; +use mm2_err_handle::prelude::MmResultExt; pub async fn load_tx_history( db: &TxHistoryDb, @@ -10,12 +11,13 @@ pub async fn load_tx_history( ) -> WasmTxHistoryResult> { let history_id = HistoryId::new(ticker, wallet_address); - let transaction = db.get_inner().transaction().await?; - let table = transaction.table::().await?; + let transaction = db.get_inner().transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let item_opt = table .get_item_by_unique_index("history_id", history_id.as_str()) - .await?; + .await + .map_mm_err()?; match item_opt { Some((_item_id, TxHistoryTableV1 { txs, .. })) => Ok(txs), None => Ok(Vec::new()), @@ -32,24 +34,26 @@ pub async fn save_tx_history( let history_id_value = history_id.to_string(); let tx_history_item = TxHistoryTableV1 { history_id, txs }; - let transaction = db.get_inner().transaction().await?; - let table = transaction.table::().await?; + let transaction = db.get_inner().transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; table .replace_item_by_unique_index("history_id", &history_id_value, &tx_history_item) - .await?; + .await + .map_mm_err()?; Ok(()) } pub async fn clear_tx_history(db: &TxHistoryDb, ticker: &str, wallet_address: &str) -> WasmTxHistoryResult<()> { let history_id = HistoryId::new(ticker, wallet_address); - let transaction = db.get_inner().transaction().await?; - let table = transaction.table::().await?; + let transaction = db.get_inner().transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; table .delete_item_by_unique_index("history_id", history_id.as_str()) - .await?; + .await + .map_mm_err()?; Ok(()) } diff --git a/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v2.rs b/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v2.rs index acc6d338e2..6b3f33ee2b 100644 --- a/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v2.rs +++ b/mm2src/coins/tx_history_storage/wasm/tx_history_storage_v2.rs @@ -54,26 +54,29 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { I::IntoIter: Send, { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let history_table = db_transaction.table::().await?; - let cache_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let history_table = db_transaction.table::().await.map_mm_err()?; + let cache_table = db_transaction.table::().await.map_mm_err()?; for tx in transactions { let Some(tx_hash) = tx.tx.tx_hash() else { continue }; let history_item = TxHistoryTableV2::from_tx_details(wallet_id.clone(), &tx)?; - history_table.add_item(&history_item).await?; + history_table.add_item(&history_item).await.map_mm_err()?; let cache_item = TxCacheTableV2::from_tx_details(wallet_id.clone(), &tx)?; let index_keys = MultiIndex::new(TxCacheTableV2::COIN_TX_HASH_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(tx_hash)?; + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(tx_hash) + .map_mm_err()?; // `TxHistoryTableV2::tx_hash` is not a unique field, but `TxCacheTableV2::tx_hash` is unique. // So we use `DbTable::add_item_or_ignore_by_unique_multi_index` instead of `DbTable::add_item` // since `transactions` may contain txs with same `tx_hash` but different `internal_id`. cache_table .add_item_or_ignore_by_unique_multi_index(index_keys, &cache_item) - .await?; + .await + .map_mm_err()?; } Ok(()) } @@ -84,15 +87,23 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { internal_id: &BytesJson, ) -> MmResult { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxHistoryTableV2::WALLET_ID_INTERNAL_ID_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(wallet_id.hd_wallet_rmd160_or_exclude())? - .with_value(internal_id)?; - - if table.delete_item_by_unique_multi_index(index_keys).await?.is_some() { + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160_or_exclude()) + .map_mm_err()? + .with_value(internal_id) + .map_mm_err()?; + + if table + .delete_item_by_unique_multi_index(index_keys) + .await + .map_mm_err()? + .is_some() + { Ok(RemoveTxResult::TxRemoved) } else { Ok(RemoveTxResult::TxDidNotExist) @@ -105,15 +116,18 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { internal_id: &BytesJson, ) -> MmResult, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxHistoryTableV2::WALLET_ID_INTERNAL_ID_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(wallet_id.hd_wallet_rmd160_or_exclude())? - .with_value(internal_id)?; - - let details_json = match table.get_item_by_unique_multi_index(index_keys).await? { + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160_or_exclude()) + .map_mm_err()? + .with_value(internal_id) + .map_mm_err()?; + + let details_json = match table.get_item_by_unique_multi_index(index_keys).await.map_mm_err()? { Some((_item_id, item)) => item.details_json, None => return Ok(None), }; @@ -133,7 +147,10 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { wallet_id: &WalletId, for_addresses: FilteringAddresses, ) -> Result> { - let txs = self.get_unconfirmed_txes_from_history(wallet_id, for_addresses).await?; + let txs = self + .get_unconfirmed_txes_from_history(wallet_id, for_addresses) + .await + .map_mm_err()?; Ok(!txs.is_empty()) } @@ -144,17 +161,21 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { for_addresses: FilteringAddresses, ) -> MmResult, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxHistoryTableV2::WALLET_ID_CONFIRMATION_STATUS_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(wallet_id.hd_wallet_rmd160_or_exclude())? - .with_value(ConfirmationStatus::Unconfirmed)?; + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160_or_exclude()) + .map_mm_err()? + .with_value(ConfirmationStatus::Unconfirmed) + .map_mm_err()?; let transactions = table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| item); @@ -164,28 +185,37 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { /// Updates transaction in the selected coin's history async fn update_tx_in_history(&self, wallet_id: &WalletId, tx: &TransactionDetails) -> MmResult<(), Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxHistoryTableV2::WALLET_ID_INTERNAL_ID_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(wallet_id.hd_wallet_rmd160_or_exclude())? - .with_value(&tx.internal_id)?; + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160_or_exclude()) + .map_mm_err()? + .with_value(&tx.internal_id) + .map_mm_err()?; let item = TxHistoryTableV2::from_tx_details(wallet_id.clone(), tx)?; - table.replace_item_by_unique_multi_index(index_keys, &item).await?; + table + .replace_item_by_unique_multi_index(index_keys, &item) + .await + .map_mm_err()?; Ok(()) } async fn history_has_tx_hash(&self, wallet_id: &WalletId, tx_hash: &str) -> Result> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxHistoryTableV2::WALLET_ID_TX_HASH_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(wallet_id.hd_wallet_rmd160_or_exclude())? - .with_value(tx_hash)?; - let count_txs = table.count_by_multi_index(index_keys).await?; + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160_or_exclude()) + .map_mm_err()? + .with_value(tx_hash) + .map_mm_err()?; + let count_txs = table.count_by_multi_index(index_keys).await.map_mm_err()?; Ok(count_txs > 0) } @@ -196,18 +226,21 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { for_addresses: FilteringAddresses, ) -> Result> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxHistoryTableV2::WALLET_ID_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(wallet_id.hd_wallet_rmd160_or_exclude())?; + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160_or_exclude()) + .map_mm_err()?; // `IndexedDb` doesn't provide an elegant way to count records applying custom filters to index properties like `tx_hash`, // so currently fetch all records with `coin,hd_wallet_rmd160=wallet_id` and apply the `unique_by(|tx| tx.tx_hash)` to them. let transactions = table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, tx)| tx) .unique_by(|tx| tx.tx_hash.clone()); @@ -223,8 +256,8 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { tx_hex: &BytesJson, ) -> Result<(), MmError> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; table .add_item(&TxCacheTableV2 { @@ -232,7 +265,8 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { tx_hash: tx_hash.to_owned(), tx_hex: tx_hex.clone(), }) - .await?; + .await + .map_mm_err()?; Ok(()) } @@ -242,13 +276,15 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { tx_hash: &str, ) -> MmResult, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxCacheTableV2::COIN_TX_HASH_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(tx_hash)?; - match table.get_item_by_unique_multi_index(index_keys).await? { + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(tx_hash) + .map_mm_err()?; + match table.get_item_by_unique_multi_index(index_keys).await.map_mm_err()? { Some((_item_id, item)) => Ok(Some(item.tx_hex)), None => Ok(None), } @@ -283,17 +319,21 @@ impl TxHistoryStorage for IndexedDbTxHistoryStorage { } let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(TxHistoryTableV2::WALLET_ID_TOKEN_ID_INDEX) - .with_value(&wallet_id.ticker)? - .with_value(wallet_id.hd_wallet_rmd160_or_exclude())? - .with_value(filters.token_id_or_exclude())?; + .with_value(&wallet_id.ticker) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160_or_exclude()) + .map_mm_err()? + .with_value(filters.token_id_or_exclude()) + .map_mm_err()?; let transactions = table .get_items_by_multi_index(index_keys) - .await? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, tx)| tx); diff --git a/mm2src/coins/utxo/rpc_clients.rs b/mm2src/coins/utxo/rpc_clients.rs index 4996af9aac..f09d7ddf67 100644 --- a/mm2src/coins/utxo/rpc_clients.rs +++ b/mm2src/coins/utxo/rpc_clients.rs @@ -785,7 +785,7 @@ impl UtxoRpcClientOps for NativeClient { .and_then(move |unspents| { unspents .into_iter() - .map(|unspent| Ok(UnspentInfo::from_native(unspent, decimals, None).map_mm_err()?)) + .map(|unspent| UnspentInfo::from_native(unspent, decimals, None).map_mm_err()) .collect::>() }); Box::new(fut) diff --git a/mm2src/coins/utxo/slp.rs b/mm2src/coins/utxo/slp.rs index d5971e62b6..208a807a6a 100644 --- a/mm2src/coins/utxo/slp.rs +++ b/mm2src/coins/utxo/slp.rs @@ -1159,7 +1159,7 @@ impl MarketCoinOps for SlpToken { fn my_balance(&self) -> BalanceFut { let coin = self.clone(); - let fut = async move { Ok(coin.my_coin_balance().await.map_mm_err()?) }; + let fut = async move { coin.my_coin_balance().await.map_mm_err() }; Box::new(fut.boxed().compat()) } diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 3b8eab4659..b82c4740c9 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -341,7 +341,12 @@ impl ZCoin { #[cfg(target_arch = "wasm32")] async fn my_balance_sat(&self) -> Result> { let wallet_db = self.z_fields.light_wallet_db.clone(); - Ok(wallet_db.db.get_balance(AccountId::default()).await?.into()) + Ok(wallet_db + .db + .get_balance(AccountId::default()) + .await + .map_mm_err()? + .into()) } async fn get_spendable_notes(&self) -> Result, MmError> { diff --git a/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs b/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs index 826ed52bdd..2b82e46c05 100644 --- a/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs +++ b/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs @@ -86,18 +86,18 @@ impl BlockDbImpl { pub async fn get_latest_block(&self) -> ZcoinStorageRes { let ticker = self.ticker.clone(); let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_db = db_transaction.table::().await.map_mm_err()?; let maybe_height = block_db .cursor_builder() - .only("ticker", &ticker)? + .only("ticker", &ticker).map_mm_err()? .bound("height", 0u32, u32::MAX) .reverse() .where_first() .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await? + .await.map_mm_err()? .next() - .await?; + .await.map_mm_err()?; Ok(maybe_height.map(|(_, item)| item.height).unwrap_or_else(|| 0)) } @@ -106,12 +106,12 @@ impl BlockDbImpl { pub async fn insert_block(&self, height: u32, cb_bytes: Vec) -> ZcoinStorageRes { let ticker = self.ticker.clone(); let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_db = db_transaction.table::().await.map_mm_err()?; let indexes = MultiIndex::new(BlockDbTable::TICKER_HEIGHT_INDEX) - .with_value(&ticker)? - .with_value(BeBigUint::from(height))?; + .with_value(&ticker).map_mm_err()? + .with_value(BeBigUint::from(height)).map_mm_err()?; let block = BlockDbTable { height, data: cb_bytes, @@ -120,7 +120,7 @@ impl BlockDbImpl { Ok(block_db .add_item_or_ignore_by_unique_multi_index(indexes, &block) - .await? + .await.map_mm_err()? .get_id() as usize) } @@ -128,28 +128,28 @@ impl BlockDbImpl { /// removing data beyond the specified height from the storage. pub async fn rewind_to_height(&self, height: BlockHeight) -> ZcoinStorageRes { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_db = db_transaction.table::().await.map_mm_err()?; let blocks = block_db .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker).map_mm_err()? .bound("height", 0u32, u32::MAX) .reverse() .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await? + .await.map_mm_err()? .collect() - .await?; + .await.map_mm_err()?; for (_, block) in &blocks { if block.height > u32::from(height) { block_db .delete_item_by_unique_multi_index( MultiIndex::new(BlockDbTable::TICKER_HEIGHT_INDEX) - .with_value(&self.ticker)? - .with_value(block.height)?, + .with_value(&self.ticker).map_mm_err()? + .with_value(block.height).map_mm_err()?, ) - .await?; + .await.map_mm_err()?; } } @@ -159,17 +159,17 @@ impl BlockDbImpl { #[allow(unused)] pub(crate) async fn get_earliest_block(&self) -> ZcoinStorageRes { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_db = db_transaction.table::().await.map_mm_err()?; let maybe_min_block = block_db .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker).map_mm_err()? .bound("height", 0u32, u32::MAX) .where_first() .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await? + .await.map_mm_err()? .next() - .await?; + .await.map_mm_err()?; Ok(maybe_min_block.map(|(_, b)| b.height).unwrap_or(0)) } @@ -182,20 +182,20 @@ impl BlockDbImpl { limit: Option, ) -> ZcoinStorageRes> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_db = db_transaction.table::().await.map_mm_err()?; // Fetch CompactBlocks block_db are needed for scanning. let min = u32::from(from_height + 1); let mut maybe_blocks = block_db .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker).map_mm_err()? .bound("height", min, u32::MAX) .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await?; + .await.map_mm_err()?; let mut blocks_to_scan = vec![]; - while let Some((_, block)) = maybe_blocks.next().await? { + while let Some((_, block)) = maybe_blocks.next().await.map_mm_err()? { if let Some(limit) = limit { if blocks_to_scan.len() > limit as usize { break; diff --git a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs index d9ac5ec322..adeed9972e 100644 --- a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs +++ b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs @@ -155,13 +155,15 @@ impl<'a> WalletIndexedDb { pub async fn is_tx_imported(&self, tx_id: TxId) -> ZcoinStorageRes { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; - let tx_table = db_transaction.table::().await?; + let tx_table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WalletDbTransactionsTable::TICKER_TXID_INDEX) - .with_value(&self.ticker)? - .with_value(tx_id.0.to_vec())?; - let maybe_tx = tx_table.get_items_by_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(tx_id.0.to_vec()) + .map_mm_err()?; + let maybe_tx = tx_table.get_items_by_multi_index(index_keys).await.map_mm_err()?; if !maybe_tx.is_empty() { Ok(true) @@ -176,19 +178,22 @@ impl<'a> WalletIndexedDb { pub(crate) async fn init_accounts_table(&self, extfvks: &[ExtendedFullViewingKey]) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let walletdb_account_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let walletdb_account_table = db_transaction.table::().await.map_mm_err()?; // check if account exists let maybe_min_account = walletdb_account_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .where_first() .open_cursor(WalletDbAccountsTable::TICKER_ACCOUNT_INDEX) - .await? + .await + .map_mm_err()? .next() - .await?; + .await + .map_mm_err()?; if maybe_min_account.is_some() { return MmError::err(ZcoinStorageError::TableNotEmpty( "Account table is not empty".to_string(), @@ -210,12 +215,15 @@ impl<'a> WalletIndexedDb { }; let index_keys = MultiIndex::new(WalletDbAccountsTable::TICKER_ACCOUNT_INDEX) - .with_value(&self.ticker)? - .with_value(account_int)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(account_int) + .map_mm_err()?; walletdb_account_table .replace_item_by_unique_multi_index(index_keys, &account) - .await?; + .await + .map_mm_err()?; } Ok(()) @@ -229,19 +237,22 @@ impl<'a> WalletIndexedDb { sapling_tree: &[u8], ) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let walletdb_account_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let walletdb_account_table = db_transaction.table::().await.map_mm_err()?; // check if account exists let maybe_min_account = walletdb_account_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .where_first() .open_cursor(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .await? + .await + .map_mm_err()? .next() - .await?; + .await + .map_mm_err()?; if maybe_min_account.is_some() { return MmError::err(ZcoinStorageError::TableNotEmpty( "Account table is not empty".to_string(), @@ -255,14 +266,17 @@ impl<'a> WalletIndexedDb { sapling_tree: sapling_tree.to_vec(), ticker: self.ticker.clone(), }; - let walletdb_blocks_table = db_transaction.table::().await?; + let walletdb_blocks_table = db_transaction.table::().await.map_mm_err()?; let height = u32::from(height); let index_keys = MultiIndex::new(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .with_value(&self.ticker)? - .with_value(num_to_bigint!(height)?)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(num_to_bigint!(height)?) + .map_mm_err()?; walletdb_blocks_table .replace_item_by_unique_multi_index(index_keys, &block) - .await?; + .await + .map_mm_err()?; Ok(()) } @@ -277,8 +291,8 @@ impl WalletIndexedDb { commitment_tree: &CommitmentTree, ) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let walletdb_blocks_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let walletdb_blocks_table = db_transaction.table::().await.map_mm_err()?; let mut encoded_tree = Vec::new(); commitment_tree.write(&mut encoded_tree).unwrap(); @@ -293,27 +307,35 @@ impl WalletIndexedDb { }; let index_keys = MultiIndex::new(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .with_value(&self.ticker)? - .with_value(u32::from(block_height))?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(u32::from(block_height)) + .map_mm_err()?; Ok(walletdb_blocks_table .replace_item_by_unique_multi_index(index_keys, &block) .await - .map(|_| ())?) + .map(|_| ()) + .map_mm_err()?) } pub async fn get_balance(&self, account: AccountId) -> ZcoinStorageRes { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let rec_note_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let rec_note_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_ACCOUNT_INDEX) - .with_value(&self.ticker)? - .with_value(account.0.to_bigint().unwrap())?; - let maybe_notes = rec_note_table.get_items_by_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(account.0.to_bigint().unwrap()) + .map_mm_err()?; + let maybe_notes = rec_note_table.get_items_by_multi_index(index_keys).await.map_mm_err()?; - let tx_table = db_transaction.table::().await?; - let txs = tx_table.get_items("ticker", &self.ticker).await?; + let tx_table = db_transaction.table::().await.map_mm_err()?; + let txs = tx_table.get_items("ticker", &self.ticker).await.map_mm_err()?; let balance: i64 = maybe_notes .iter() @@ -340,17 +362,19 @@ impl WalletIndexedDb { pub async fn put_tx_data(&self, tx: &Transaction, created_at: Option) -> ZcoinStorageRes { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let tx_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let tx_table = db_transaction.table::().await.map_mm_err()?; let mut raw_tx = vec![]; tx.write(&mut raw_tx).unwrap(); let txid = tx.txid().0.to_vec(); let index_keys = MultiIndex::new(WalletDbTransactionsTable::TICKER_TXID_INDEX) - .with_value(&self.ticker)? - .with_value(&txid)?; - let single_tx = tx_table.get_item_by_unique_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(&txid) + .map_mm_err()?; + let single_tx = tx_table.get_item_by_unique_multi_index(index_keys).await.map_mm_err()?; if let Some((id_tx, some_tx)) = single_tx { let updated_tx = WalletDbTransactionsTable { txid: txid.clone(), @@ -361,7 +385,7 @@ impl WalletIndexedDb { raw: Some(raw_tx), ticker: self.ticker.clone(), }; - tx_table.replace_item(id_tx, &updated_tx).await?; + tx_table.replace_item(id_tx, &updated_tx).await.map_mm_err()?; return Ok(id_tx as i64); }; @@ -376,25 +400,30 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; let index_keys = MultiIndex::new(WalletDbTransactionsTable::TICKER_TXID_INDEX) - .with_value(&self.ticker)? - .with_value(txid)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(txid) + .map_mm_err()?; Ok(tx_table .replace_item_by_unique_multi_index(index_keys, &new_tx) - .await? + .await + .map_mm_err()? .into()) } pub async fn put_tx_meta(&self, tx: &WalletTx, height: BlockHeight) -> ZcoinStorageRes { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let tx_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let tx_table = db_transaction.table::().await.map_mm_err()?; let txid = tx.txid.0.to_vec(); let index_keys = MultiIndex::new(WalletDbTransactionsTable::TICKER_TXID_INDEX) - .with_value(&self.ticker)? - .with_value(&txid)?; - let single_tx = tx_table.get_item_by_unique_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(&txid) + .map_mm_err()?; + let single_tx = tx_table.get_item_by_unique_multi_index(index_keys).await.map_mm_err()?; if let Some((id_tx, some_tx)) = single_tx { let updated_tx = WalletDbTransactionsTable { @@ -406,7 +435,7 @@ impl WalletIndexedDb { raw: some_tx.raw, ticker: self.ticker.clone(), }; - tx_table.replace_item(id_tx, &updated_tx).await?; + tx_table.replace_item(id_tx, &updated_tx).await.map_mm_err()?; return Ok(id_tx as i64); }; @@ -421,25 +450,36 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; let index_keys = MultiIndex::new(WalletDbTransactionsTable::TICKER_TXID_INDEX) - .with_value(&self.ticker)? - .with_value(txid)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(txid) + .map_mm_err()?; Ok(tx_table .replace_item_by_unique_multi_index(index_keys, &new_tx) - .await? + .await + .map_mm_err()? .into()) } pub async fn mark_spent(&self, tx_ref: i64, nf: &Nullifier) -> ZcoinStorageRes<()> { let ticker = self.ticker.clone(); let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let received_notes_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let received_notes_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_NF_INDEX) - .with_value(&ticker)? - .with_value(nf.0.to_vec())?; - let maybe_note = received_notes_table.get_item_by_unique_multi_index(index_keys).await?; + .with_value(&ticker) + .map_mm_err()? + .with_value(nf.0.to_vec()) + .map_mm_err()?; + let maybe_note = received_notes_table + .get_item_by_unique_multi_index(index_keys) + .await + .map_mm_err()?; if let Some((id, note)) = maybe_note { let new_received_note = WalletDbReceivedNotesTable { @@ -455,7 +495,10 @@ impl WalletIndexedDb { spent: Some(num_to_bigint!(tx_ref)?), ticker, }; - received_notes_table.replace_item(id, &new_received_note).await?; + received_notes_table + .replace_item(id, &new_received_note) + .await + .map_mm_err()?; return Ok(()); } @@ -465,7 +508,7 @@ impl WalletIndexedDb { pub async fn put_received_note(&self, output: &T, tx_ref: i64) -> ZcoinStorageRes { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; let rcm = output.note().rcm().to_repr(); let account = BigInt::from(output.account().0); @@ -478,12 +521,21 @@ impl WalletIndexedDb { let output_index = output.index() as u32; let nf_bytes = output.nullifier().map(|nf| nf.0.to_vec()); - let received_note_table = db_transaction.table::().await?; + let received_note_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_TX_OUTPUT_INDEX) - .with_value(&self.ticker)? - .with_value(tx)? - .with_value(output_index)?; - let current_note = received_note_table.get_item_by_unique_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(tx) + .map_mm_err()? + .with_value(output_index) + .map_mm_err()?; + let current_note = received_note_table + .get_item_by_unique_multi_index(index_keys) + .await + .map_mm_err()?; let id = if let Some((id, note)) = current_note { let temp_note = WalletDbReceivedNotesTable { @@ -499,7 +551,7 @@ impl WalletIndexedDb { spent: note.spent, ticker: self.ticker.clone(), }; - received_note_table.replace_item(id, &temp_note).await? + received_note_table.replace_item(id, &temp_note).await.map_mm_err()? } else { let new_note = WalletDbReceivedNotesTable { tx, @@ -516,12 +568,16 @@ impl WalletIndexedDb { }; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_TX_OUTPUT_INDEX) - .with_value(&self.ticker)? - .with_value(tx)? - .with_value(num_to_bigint!(output_index)?)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(tx) + .map_mm_err()? + .with_value(num_to_bigint!(output_index)?) + .map_mm_err()?; received_note_table .replace_item_by_unique_multi_index(index_keys, &new_note) - .await? + .await + .map_mm_err()? }; Ok(NoteId::ReceivedNoteId(id.into())) @@ -534,8 +590,11 @@ impl WalletIndexedDb { height: BlockHeight, ) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let witness_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let witness_table = db_transaction + .table::() + .await + .map_mm_err()?; let mut encoded = Vec::new(); witness.write(&mut encoded).unwrap(); @@ -548,23 +607,28 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; - Ok(witness_table.add_item(&witness).await.map(|_| ())?) + Ok(witness_table.add_item(&witness).await.map(|_| ()).map_mm_err()?) } pub async fn prune_witnesses(&self, below_height: BlockHeight) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let witness_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let witness_table = db_transaction + .table::() + .await + .map_mm_err()?; let mut maybe_witness = witness_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("block", 0u32, (below_height - 1).into()) .open_cursor(WalletDbSaplingWitnessesTable::TICKER_BLOCK_INDEX) - .await?; + .await + .map_mm_err()?; - while let Some((id, _)) = maybe_witness.next().await? { - witness_table.delete_item(id).await?; + while let Some((id, _)) = maybe_witness.next().await.map_mm_err()? { + witness_table.delete_item(id).await.map_mm_err()?; } Ok(()) @@ -572,22 +636,30 @@ impl WalletIndexedDb { pub async fn update_expired_notes(&self, height: BlockHeight) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; // fetch received_notes. - let received_notes_table = db_transaction.table::().await?; - let maybe_notes = received_notes_table.get_items("ticker", &self.ticker).await?; + let received_notes_table = db_transaction + .table::() + .await + .map_mm_err()?; + let maybe_notes = received_notes_table + .get_items("ticker", &self.ticker) + .await + .map_mm_err()?; // fetch transactions with block < height . - let txs_table = db_transaction.table::().await?; + let txs_table = db_transaction.table::().await.map_mm_err()?; let mut maybe_txs = txs_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("expiry_height", 0u32, u32::from(height - 1)) .reverse() .open_cursor(WalletDbTransactionsTable::TICKER_EXP_HEIGHT_INDEX) - .await?; + .await + .map_mm_err()?; - while let Some((id, note)) = maybe_txs.next().await? { + while let Some((id, note)) = maybe_txs.next().await.map_mm_err()? { if note.block.is_none() { if let Some(curr) = maybe_notes.iter().find(|(_, n)| n.spent == id.to_bigint()) { let temp_note = WalletDbReceivedNotesTable { @@ -604,7 +676,10 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; - received_notes_table.replace_item(curr.0, &temp_note).await?; + received_notes_table + .replace_item(curr.0, &temp_note) + .await + .map_mm_err()?; } }; } @@ -614,7 +689,7 @@ impl WalletIndexedDb { pub async fn put_sent_note(&self, output: &DecryptedOutput, tx_ref: i64) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; let tx_ref = num_to_bigint!(tx_ref)?; let output_index = output.index; @@ -625,12 +700,18 @@ impl WalletIndexedDb { let value = num_to_bigint!(value)?; let address = encode_payment_address(self.params.hrp_sapling_payment_address(), &output.to); - let sent_note_table = db_transaction.table::().await?; + let sent_note_table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WalletDbSentNotesTable::TICKER_TX_OUTPUT_INDEX) - .with_value(&self.ticker)? - .with_value(&tx_ref)? - .with_value(&output_index)?; - let maybe_note = sent_note_table.get_item_by_unique_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(&tx_ref) + .map_mm_err()? + .with_value(&output_index) + .map_mm_err()?; + let maybe_note = sent_note_table + .get_item_by_unique_multi_index(index_keys) + .await + .map_mm_err()?; let update_note = WalletDbSentNotesTable { tx: tx_ref.clone(), @@ -642,15 +723,19 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; if let Some((id, _)) = maybe_note { - sent_note_table.replace_item(id, &update_note).await?; + sent_note_table.replace_item(id, &update_note).await.map_mm_err()?; } else { let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_TX_OUTPUT_INDEX) - .with_value(&self.ticker)? - .with_value(tx_ref)? - .with_value(output_index)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(tx_ref) + .map_mm_err()? + .with_value(output_index) + .map_mm_err()?; sent_note_table .replace_item_by_unique_multi_index(index_keys, &update_note) - .await?; + .await + .map_mm_err()?; } Ok(()) @@ -666,8 +751,8 @@ impl WalletIndexedDb { memo: Option<&MemoBytes>, ) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let sent_note_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let sent_note_table = db_transaction.table::().await.map_mm_err()?; let tx_ref = num_to_bigint!(tx_ref)?; let output_index = num_to_bigint!(output_index)?; @@ -686,36 +771,43 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_TX_OUTPUT_INDEX) - .with_value(&self.ticker)? - .with_value(tx_ref)? - .with_value(output_index)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(tx_ref) + .map_mm_err()? + .with_value(output_index) + .map_mm_err()?; Ok(sent_note_table .replace_item_by_unique_multi_index(index_keys, &new_note) .await - .map(|_| ())?) + .map(|_| ()) + .map_mm_err()?) } /// Asynchronously rewinds the storage to a specified block height, effectively /// removing data beyond the specified height from the storage. pub async fn rewind_to_height(&self, block_height: BlockHeight) -> ZcoinStorageRes<()> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; let block_height = u32::from(block_height); // Recall where we synced up to previously. - let blocks_table = db_transaction.table::().await?; + let blocks_table = db_transaction.table::().await.map_mm_err()?; let maybe_height = blocks_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .reverse() .where_first() .open_cursor(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .await? + .await + .map_mm_err()? .next() - .await? + .await + .map_mm_err()? .map(|(_, item)| { item.height .to_u32() @@ -733,31 +825,39 @@ impl WalletIndexedDb { }; // Decrement witnesses. - let db_transaction = locked_db.get_inner().transaction().await?; - let witnesses_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let witnesses_table = db_transaction + .table::() + .await + .map_mm_err()?; let maybe_witnesses_cursor = witnesses_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("block", block_height + 1, u32::MAX) .open_cursor(WalletDbSaplingWitnessesTable::TICKER_BLOCK_INDEX) - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; for (id, _witness) in maybe_witnesses_cursor { - witnesses_table.delete_item(id).await?; + witnesses_table.delete_item(id).await.map_mm_err()?; } // Un-mine transactions. - let db_transaction = locked_db.get_inner().transaction().await?; - let transactions_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let transactions_table = db_transaction.table::().await.map_mm_err()?; let mut maybe_txs_cursor = transactions_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("block", block_height + 1, u32::MAX) .open_cursor(WalletDbTransactionsTable::TICKER_BLOCK_INDEX) - .await?; - while let Some((_, tx)) = maybe_txs_cursor.next().await? { + .await + .map_mm_err()?; + while let Some((_, tx)) = maybe_txs_cursor.next().await.map_mm_err()? { let modified_tx = WalletDbTransactionsTable { txid: tx.txid.clone(), created: tx.created.clone(), @@ -768,30 +868,41 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; let index_keys = MultiIndex::new(WalletDbTransactionsTable::TICKER_TXID_INDEX) - .with_value(&self.ticker)? - .with_value(tx.txid)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(tx.txid) + .map_mm_err()?; transactions_table .replace_item_by_unique_multi_index(index_keys, &modified_tx) - .await?; + .await + .map_mm_err()?; } // Now that they aren't depended on, delete scanned blocks. - let db_transaction = locked_db.get_inner().transaction().await?; - let blocks_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let blocks_table = db_transaction.table::().await.map_mm_err()?; let maybe_blocks = blocks_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", block_height + 1, u32::MAX) .open_cursor(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; for (_, block) in maybe_blocks { let index_keys = MultiIndex::new(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .with_value(&self.ticker)? - .with_value(block.height)?; - blocks_table.delete_item_by_unique_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(block.height) + .map_mm_err()?; + blocks_table + .delete_item_by_unique_multi_index(index_keys) + .await + .map_mm_err()?; } Ok(()) @@ -806,29 +917,35 @@ impl WalletRead for WalletIndexedDb { async fn block_height_extrema(&self) -> Result, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_headers_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_headers_db = db_transaction.table::().await.map_mm_err()?; let earliest_block = block_headers_db .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .where_first() .open_cursor(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .await? + .await + .map_mm_err()? .next() - .await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_headers_db = db_transaction.table::().await?; + .await + .map_mm_err()?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_headers_db = db_transaction.table::().await.map_mm_err()?; let latest_block = block_headers_db .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .reverse() .where_first() .open_cursor(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .await? + .await + .map_mm_err()? .next() - .await?; + .await + .map_mm_err()?; if let (Some(min), Some(max)) = (earliest_block, latest_block) { Ok(Some((BlockHeight::from(min.1.height), BlockHeight::from(max.1.height)))) @@ -839,44 +956,53 @@ impl WalletRead for WalletIndexedDb { async fn get_block_hash(&self, block_height: BlockHeight) -> Result, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_headers_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_headers_db = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .with_value(&self.ticker)? - .with_value(u32::from(block_height))?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(u32::from(block_height)) + .map_mm_err()?; Ok(block_headers_db .get_item_by_unique_multi_index(index_keys) - .await? + .await + .map_mm_err()? .map(|(_, block)| BlockHash::from_slice(&block.hash[..]))) } async fn get_tx_height(&self, txid: TxId) -> Result, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_headers_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_headers_db = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WalletDbTransactionsTable::TICKER_TXID_INDEX) - .with_value(&self.ticker)? - .with_value(txid.0.to_vec())?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(txid.0.to_vec()) + .map_mm_err()?; Ok(block_headers_db .get_item_by_unique_multi_index(index_keys) - .await? + .await + .map_mm_err()? .and_then(|(_, tx)| tx.block.map(BlockHeight::from))) } async fn get_address(&self, account: AccountId) -> Result, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let block_headers_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let block_headers_db = db_transaction.table::().await.map_mm_err()?; let account_num = account.0; let index_keys = MultiIndex::new(WalletDbAccountsTable::TICKER_ACCOUNT_INDEX) - .with_value(&self.ticker)? - .with_value(num_to_bigint!(account_num)?)?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(num_to_bigint!(account_num)?) + .map_mm_err()?; let address = block_headers_db .get_item_by_unique_multi_index(index_keys) - .await? + .await + .map_mm_err()? .map(|(_, account)| account.address) .ok_or_else(|| ZcoinStorageError::GetFromStorageError("Invalid account/not found".to_string()))?; @@ -890,9 +1016,9 @@ impl WalletRead for WalletIndexedDb { async fn get_extended_full_viewing_keys(&self) -> Result, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let accounts_table = db_transaction.table::().await?; - let maybe_accounts = accounts_table.get_items("ticker", &self.ticker).await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let accounts_table = db_transaction.table::().await.map_mm_err()?; + let maybe_accounts = accounts_table.get_items("ticker", &self.ticker).await.map_mm_err()?; let mut res_accounts: HashMap = HashMap::with_capacity(maybe_accounts.len()); for (_, account) in maybe_accounts { @@ -917,13 +1043,18 @@ impl WalletRead for WalletIndexedDb { extfvk: &ExtendedFullViewingKey, ) -> Result { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let accounts_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let accounts_table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WalletDbAccountsTable::TICKER_ACCOUNT_INDEX) - .with_value(&self.ticker)? - .with_value(account.0.to_bigint())?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(account.0.to_bigint()) + .map_mm_err()?; - let account = accounts_table.get_item_by_unique_multi_index(index_keys).await?; + let account = accounts_table + .get_item_by_unique_multi_index(index_keys) + .await + .map_mm_err()?; if let Some((_, account)) = account { let expected = @@ -939,28 +1070,39 @@ impl WalletRead for WalletIndexedDb { async fn get_balance_at(&self, account: AccountId, anchor_height: BlockHeight) -> Result { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; - let tx_table = db_transaction.table::().await?; + let tx_table = db_transaction.table::().await.map_mm_err()?; // Retrieves a list of transaction IDs (txid) from the transactions table // that match the provided account ID. let txids = tx_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("block", 0u32, u32::from(anchor_height)) .open_cursor(WalletDbTransactionsTable::TICKER_BLOCK_INDEX) - .await? + .await + .map_mm_err()? .collect() - .await? + .await + .map_mm_err()? .into_iter() .map(|(id, _)| id) .collect::>(); - let received_notes_table = db_transaction.table::().await?; + let received_notes_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_ACCOUNT_INDEX) - .with_value(&self.ticker)? - .with_value(account.0.to_bigint().unwrap())?; - let maybe_notes = received_notes_table.get_items_by_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(account.0.to_bigint().unwrap()) + .map_mm_err()?; + let maybe_notes = received_notes_table + .get_items_by_multi_index(index_keys) + .await + .map_mm_err()?; let mut value: i64 = 0; for (_, note) in maybe_notes { @@ -981,20 +1123,23 @@ impl WalletRead for WalletIndexedDb { async fn get_memo(&self, id_note: Self::NoteRef) -> Result { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; let memo = match id_note { NoteId::SentNoteId(id_note) => { - let sent_notes_table = db_transaction.table::().await?; - let notes = sent_notes_table.get_items("ticker", &self.ticker).await?; + let sent_notes_table = db_transaction.table::().await.map_mm_err()?; + let notes = sent_notes_table.get_items("ticker", &self.ticker).await.map_mm_err()?; notes .into_iter() .find(|(id, _)| *id as i64 == id_note) .map(|(_, n)| n.memo) }, NoteId::ReceivedNoteId(id_note) => { - let received_notes_table = db_transaction.table::().await?; - let notes = received_notes_table.get_items("ticker", &self.ticker).await?; + let received_notes_table = db_transaction.table::().await.map_mm_err()?; + let notes = received_notes_table + .get_items("ticker", &self.ticker) + .await + .map_mm_err()?; notes .into_iter() .find(|(id, _)| *id as i64 == id_note) @@ -1016,15 +1161,18 @@ impl WalletRead for WalletIndexedDb { block_height: BlockHeight, ) -> Result>, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let blocks_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let blocks_table = db_transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WalletDbBlocksTable::TICKER_HEIGHT_INDEX) - .with_value(&self.ticker)? - .with_value(u32::from(block_height))?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(u32::from(block_height)) + .map_mm_err()?; let block = blocks_table .get_item_by_unique_multi_index(index_keys) - .await? + .await + .map_mm_err()? .map(|(_, account)| account); if let Some(block) = block { @@ -1042,14 +1190,22 @@ impl WalletRead for WalletIndexedDb { block_height: BlockHeight, ) -> Result)>, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; - let sapling_witness_table = db_transaction.table::().await?; + let sapling_witness_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbSaplingWitnessesTable::TICKER_BLOCK_INDEX) - .with_value(&self.ticker)? - .with_value(u32::from(block_height))?; - let maybe_witnesses = sapling_witness_table.get_items_by_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(u32::from(block_height)) + .map_mm_err()?; + let maybe_witnesses = sapling_witness_table + .get_items_by_multi_index(index_keys) + .await + .map_mm_err()?; // Retrieves a list of transaction IDs (id_tx) from the transactions table // that match the provided account ID and have not been spent (spent IS NULL). @@ -1068,15 +1224,21 @@ impl WalletRead for WalletIndexedDb { async fn get_nullifiers(&self) -> Result, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; // Received notes - let received_notes_table = db_transaction.table::().await?; - let maybe_notes = received_notes_table.get_items("ticker", &self.ticker).await?; + let received_notes_table = db_transaction + .table::() + .await + .map_mm_err()?; + let maybe_notes = received_notes_table + .get_items("ticker", &self.ticker) + .await + .map_mm_err()?; // Transactions - let txs_table = db_transaction.table::().await?; - let maybe_txs = txs_table.get_items("ticker", &self.ticker).await?; + let txs_table = db_transaction.table::().await.map_mm_err()?; + let maybe_txs = txs_table.get_items("ticker", &self.ticker).await.map_mm_err()?; let mut nullifiers = vec![]; for (_, note) in maybe_notes { @@ -1120,38 +1282,55 @@ impl WalletRead for WalletIndexedDb { anchor_height: BlockHeight, ) -> Result, Self::Error> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; // Received notes - let received_notes_table = db_transaction.table::().await?; + let received_notes_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_ACCOUNT_INDEX) - .with_value(&self.ticker)? - .with_value(account.0.to_bigint())?; - let maybe_notes = received_notes_table.get_items_by_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(account.0.to_bigint()) + .map_mm_err()?; + let maybe_notes = received_notes_table + .get_items_by_multi_index(index_keys) + .await + .map_mm_err()?; // Transactions - let txs_table = db_transaction.table::().await?; + let txs_table = db_transaction.table::().await.map_mm_err()?; let txs = txs_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("block", 0u32, u32::from(anchor_height + 1)) .open_cursor(WalletDbTransactionsTable::TICKER_BLOCK_INDEX) - .await? + .await + .map_mm_err()? .collect() - .await? + .await + .map_mm_err()? .into_iter() .map(|(i, item)| (i, item)) .collect::>(); // Witnesses - let witnesses_table = db_transaction.table::().await?; + let witnesses_table = db_transaction + .table::() + .await + .map_mm_err()?; let witnesses = witnesses_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("block", 0u32, u32::from(anchor_height + 1)) .open_cursor(WalletDbSaplingWitnessesTable::TICKER_BLOCK_INDEX) - .await? + .await + .map_mm_err()? .collect() - .await? + .await + .map_mm_err()? .into_iter() .map(|(_, item)| item) .collect::>(); @@ -1203,34 +1382,50 @@ impl WalletRead for WalletIndexedDb { // // 4) Match the selected notes against the witnesses at the desired height. let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; // Received notes - let received_notes_table = db_transaction.table::().await?; + let received_notes_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbReceivedNotesTable::TICKER_ACCOUNT_INDEX) - .with_value(&self.ticker)? - .with_value(account.0.to_bigint().unwrap())?; - let maybe_notes = received_notes_table.get_items_by_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(account.0.to_bigint().unwrap()) + .map_mm_err()?; + let maybe_notes = received_notes_table + .get_items_by_multi_index(index_keys) + .await + .map_mm_err()?; // Transactions - let db_transaction = locked_db.get_inner().transaction().await?; - let txs_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let txs_table = db_transaction.table::().await.map_mm_err()?; let txs = txs_table .cursor_builder() - .only("ticker", &self.ticker)? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("block", 0u32, u32::from(anchor_height)) .open_cursor(WalletDbTransactionsTable::TICKER_BLOCK_INDEX) - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; // Sapling Witness - let db_transaction = locked_db.get_inner().transaction().await?; - let witness_table = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let witness_table = db_transaction + .table::() + .await + .map_mm_err()?; let index_keys = MultiIndex::new(WalletDbSaplingWitnessesTable::TICKER_BLOCK_INDEX) - .with_value(&self.ticker)? - .with_value(u32::from(anchor_height))?; - let witnesses = witness_table.get_items_by_multi_index(index_keys).await?; + .with_value(&self.ticker) + .map_mm_err()? + .with_value(u32::from(anchor_height)) + .map_mm_err()?; + let witnesses = witness_table.get_items_by_multi_index(index_keys).await.map_mm_err()?; let mut running_sum = 0; let mut notes = vec![]; diff --git a/mm2src/coins/z_coin/storage/z_params/indexeddb.rs b/mm2src/coins/z_coin/storage/z_params/indexeddb.rs index 91a2ec51b4..6822c89c5b 100644 --- a/mm2src/coins/z_coin/storage/z_params/indexeddb.rs +++ b/mm2src/coins/z_coin/storage/z_params/indexeddb.rs @@ -88,8 +88,8 @@ impl ZcashParamsWasmImpl { sapling_output: &[u8], ) -> MmResult<(), ZcoinStorageError> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let params_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let params_db = db_transaction.table::().await.map_mm_err()?; let params = ZcashParamsWasmTable { sapling_spend_id, sapling_spend: sapling_spend.to_vec(), @@ -97,20 +97,21 @@ impl ZcashParamsWasmImpl { ticker: CHAIN.to_string(), }; - Ok(params_db + params_db .replace_item_by_unique_index("sapling_spend_id", sapling_spend_id as u32, ¶ms) .await - .map(|_| ())?) + .map(|_| ()) + .map_mm_err() } /// Check if z_params is previously stored. pub(crate) async fn check_params(&self) -> MmResult { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let params_db = db_transaction.table::().await?; - let count = params_db.count_all().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let params_db = db_transaction.table::().await.map_mm_err()?; + let count = params_db.count_all().await.map_mm_err()?; if count != TARGET_SPEND_CHUNKS { - params_db.delete_items_by_index("ticker", CHAIN).await?; + params_db.delete_items_by_index("ticker", CHAIN).await.map_mm_err()?; } Ok(count == TARGET_SPEND_CHUNKS) @@ -119,18 +120,20 @@ impl ZcashParamsWasmImpl { /// Get z_params from storage. pub(crate) async fn get_params(&self) -> MmResult<(Vec, Vec), ZcoinStorageError> { let locked_db = self.lock_db().await?; - let db_transaction = locked_db.get_inner().transaction().await?; - let params_db = db_transaction.table::().await?; + let db_transaction = locked_db.get_inner().transaction().await.map_mm_err()?; + let params_db = db_transaction.table::().await.map_mm_err()?; let mut maybe_params = params_db .cursor_builder() - .only("ticker", CHAIN)? + .only("ticker", CHAIN) + .map_mm_err()? .open_cursor("ticker") - .await?; + .await + .map_mm_err()?; let mut sapling_spend = vec![]; let mut sapling_output = vec![]; - while let Some((_, params)) = maybe_params.next().await? { + while let Some((_, params)) = maybe_params.next().await.map_mm_err()? { sapling_spend.extend_from_slice(¶ms.sapling_spend); if params.sapling_spend_id == 0 { sapling_output = params.sapling_output diff --git a/mm2src/coins/z_coin/z_rpc.rs b/mm2src/coins/z_coin/z_rpc.rs index 27baba3ab3..6453386691 100644 --- a/mm2src/coins/z_coin/z_rpc.rs +++ b/mm2src/coins/z_coin/z_rpc.rs @@ -786,7 +786,9 @@ impl SaplingSyncLoopHandle { } if current_block >= from_block { - rpc.scan_blocks(from_block, current_block, &block_db, self).await?; + rpc.scan_blocks(from_block, current_block, &block_db, self) + .await + .map_mm_err()?; } self.current_block = BlockHeight::from_u32(current_block as u32); diff --git a/mm2src/coins/z_coin/z_tx_history.rs b/mm2src/coins/z_coin/z_tx_history.rs index 7c442cc676..7061fbca6b 100644 --- a/mm2src/coins/z_coin/z_tx_history.rs +++ b/mm2src/coins/z_coin/z_tx_history.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use crate::z_coin::{ZCoin, ZTxHistoryError}; use common::PagingOptionsEnum; -use mm2_err_handle::prelude::MmError; +use mm2_err_handle::prelude::*; use primitives::hash::H256; use std::convert::TryInto; use zcash_primitives::transaction::TxId; @@ -12,7 +12,6 @@ cfg_wasm32!( use crate::MarketCoinOps; use mm2_number::BigInt; use mm2_db::indexed_db::cursor_prelude::CursorError; - use mm2_err_handle::prelude::MapToMmResult; use num_traits::ToPrimitive; ); @@ -53,9 +52,9 @@ pub(crate) async fn fetch_tx_history_from_db( ) -> Result> { let wallet_db = z.z_fields.light_wallet_db.clone(); let wallet_db = wallet_db.db.lock_db().await.unwrap(); - let db_transaction = wallet_db.get_inner().transaction().await?; - let tx_table = db_transaction.table::().await?; - let total_tx_count = tx_table.count_all().await? as u32; + let db_transaction = wallet_db.get_inner().transaction().await.map_mm_err()?; + let tx_table = db_transaction.table::().await.map_mm_err()?; + let total_tx_count = tx_table.count_all().await.map_mm_err()? as u32; let offset = match paging_options { PagingOptionsEnum::PageNumber(page_number) => ((page_number.get() - 1) * limit) as i64, PagingOptionsEnum::FromId(tx_id) => { @@ -69,34 +68,46 @@ pub(crate) async fn fetch_tx_history_from_db( // Fetch transactions let txs = tx_table .cursor_builder() - .only("ticker", z.ticker())? + .only("ticker", z.ticker()) + .map_mm_err()? .offset(offset as u32) .limit(limit) .reverse() .open_cursor("ticker") - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; // Fetch received notes - let rn_table = db_transaction.table::().await?; + let rn_table = db_transaction + .table::() + .await + .map_mm_err()?; let received_notes = rn_table .cursor_builder() - .only("ticker", z.ticker())? + .only("ticker", z.ticker()) + .map_mm_err()? .open_cursor("ticker") - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; // Fetch blocks - let blocks_table = db_transaction.table::().await?; + let blocks_table = db_transaction.table::().await.map_mm_err()?; let blocks = blocks_table .cursor_builder() - .only("ticker", z.ticker())? + .only("ticker", z.ticker()) + .map_mm_err()? .open_cursor("ticker") - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; // Process transactions and construct tx_details let mut tx_details = Vec::new(); @@ -250,8 +261,8 @@ pub(crate) async fn fetch_txs_from_db( ) -> Result, MmError> { let wallet_db = z.z_fields.light_wallet_db.clone(); let wallet_db = wallet_db.db.lock_db().await.unwrap(); - let db_transaction = wallet_db.get_inner().transaction().await?; - let tx_table = db_transaction.table::().await?; + let db_transaction = wallet_db.get_inner().transaction().await.map_mm_err()?; + let tx_table = db_transaction.table::().await.map_mm_err()?; let limit = tx_hashes.len(); let condition = { @@ -267,36 +278,48 @@ pub(crate) async fn fetch_txs_from_db( // Fetch transactions let txs = tx_table .cursor_builder() - .only("ticker", z.ticker())? + .only("ticker", z.ticker()) + .map_mm_err()? // We need to explicitly set a limit since `where_` implicitly sets a limit of 1 if no limit is set. // TODO: Remove when `where_` doesn't exhibit this behavior. .limit(limit) .where_(condition) .reverse() .open_cursor("ticker") - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; // Fetch received notes - let rn_table = db_transaction.table::().await?; + let rn_table = db_transaction + .table::() + .await + .map_mm_err()?; let received_notes = rn_table .cursor_builder() - .only("ticker", z.ticker())? + .only("ticker", z.ticker()) + .map_mm_err()? .open_cursor("ticker") - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; // Fetch blocks - let blocks_table = db_transaction.table::().await?; + let blocks_table = db_transaction.table::().await.map_mm_err()?; let blocks = blocks_table .cursor_builder() - .only("ticker", z.ticker())? + .only("ticker", z.ticker()) + .map_mm_err()? .open_cursor("ticker") - .await? + .await + .map_mm_err()? .collect() - .await?; + .await + .map_mm_err()?; // Process transactions and construct tx_details let mut transactions = Vec::new(); diff --git a/mm2src/coins_activation/src/eth_with_token_activation.rs b/mm2src/coins_activation/src/eth_with_token_activation.rs index 20f261488d..647e80b30d 100644 --- a/mm2src/coins_activation/src/eth_with_token_activation.rs +++ b/mm2src/coins_activation/src/eth_with_token_activation.rs @@ -466,7 +466,7 @@ fn eth_priv_key_build_policy( }, #[cfg(target_arch = "wasm32")] EthPrivKeyActivationPolicy::Metamask => { - let metamask_ctx = crypto::CryptoCtx::from_ctx(ctx)? + let metamask_ctx = crypto::CryptoCtx::from_ctx(ctx).map_mm_err()? .metamask_ctx() .or_mm_err(|| EthActivationV2Error::MetamaskError(MetamaskRpcError::MetamaskCtxNotInitialized))?; Ok(EthPrivKeyBuildPolicy::Metamask(metamask_ctx)) diff --git a/mm2src/coins_activation/src/sia_coin_activation.rs b/mm2src/coins_activation/src/sia_coin_activation.rs index 110f8bbb7b..e2cd92ddbc 100644 --- a/mm2src/coins_activation/src/sia_coin_activation.rs +++ b/mm2src/coins_activation/src/sia_coin_activation.rs @@ -202,7 +202,7 @@ impl InitStandaloneCoinActivationOps for SiaCoin { _protocol_info: SiaCoinProtocolInfo, _task_handle: SiaCoinRpcTaskHandleShared, ) -> MmResult { - let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx)?; + let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx).map_mm_err()?; let coin = sia_coin_from_conf_and_params(&ctx, &ticker, &coin_conf, activation_request, priv_key_policy) .await @@ -217,15 +217,18 @@ impl InitStandaloneCoinActivationOps for SiaCoin { task_handle: SiaCoinRpcTaskHandleShared, _activation_request: &Self::ActivationRequest, ) -> MmResult { - task_handle.update_in_progress_status(SiaCoinInProgressStatus::RequestingWalletBalance)?; + task_handle + .update_in_progress_status(SiaCoinInProgressStatus::RequestingWalletBalance) + .map_mm_err()?; let current_block = self .current_block() .compat() .await - .map_to_mm(SiaCoinInitError::CouldNotGetBlockCount)?; + .map_to_mm(SiaCoinInitError::CouldNotGetBlockCount) + .map_mm_err()?; - let balance = self.my_balance().compat().await?; - let address = self.my_address()?; + let balance = self.my_balance().compat().await.map_mm_err()?; + let address = self.my_address().map_mm_err()?; Ok(SiaCoinActivationResult { ticker: self.ticker().into(), diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index 4dfe2c0577..253916783b 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -11,10 +11,10 @@ //! binary #![allow(uncommon_codepoints)] -#![feature(integer_atomics, panic_info_message)] +#![feature(panic_info_message)] #![feature(async_closure)] #![feature(hash_raw_entry)] -// #![feature(drain_filter)] +#![feature(drain_filter)] #[macro_use] extern crate arrayref; #[macro_use] extern crate gstuff; diff --git a/mm2src/crypto/src/crypto_ctx.rs b/mm2src/crypto/src/crypto_ctx.rs index b8d1f6bab5..e591ac37b4 100644 --- a/mm2src/crypto/src/crypto_ctx.rs +++ b/mm2src/crypto/src/crypto_ctx.rs @@ -262,7 +262,7 @@ impl CryptoCtx { *state = InitializationState::Initializing; } - let metamask_ctx = MetamaskCtx::init(project_name).await?; + let metamask_ctx = MetamaskCtx::init(project_name).await.map_mm_err()?; let metamask_arc = MetamaskArc::new(metamask_ctx); *self.metamask_ctx.write() = InitializationState::Ready(metamask_arc.clone()); diff --git a/mm2src/crypto/src/hw_client.rs b/mm2src/crypto/src/hw_client.rs index 5cac84fda6..d9c6679e26 100644 --- a/mm2src/crypto/src/hw_client.rs +++ b/mm2src/crypto/src/hw_client.rs @@ -101,12 +101,14 @@ impl HwClient { .boxed() .timeout(timeout) .await - .map_to_mm(|_| HwError::ConnectionTimedOut { timeout })??; + .map_to_mm(|_| HwError::ConnectionTimedOut { timeout }) + .map_mm_err()? + .map_mm_err()?; if devices.available.is_empty() { return MmError::err(HwProcessingError::HwError(HwError::NoTrezorDeviceAvailable)); } let device = devices.available.remove(0); - Ok(device.connect().await.map_mm_err()?) + device.connect().await.map_mm_err() }; match fut.await { diff --git a/mm2src/mm2_err_handle/src/mm_error.rs b/mm2src/mm2_err_handle/src/mm_error.rs index 1ea7bf1555..463c0eed14 100644 --- a/mm2src/mm2_err_handle/src/mm_error.rs +++ b/mm2src/mm2_err_handle/src/mm_error.rs @@ -367,7 +367,7 @@ mod tests { const FORWARDED_LINE: u32 = line!() + 2; fn forward_error(actual: u64, required: u64) -> Result<(), MmError> { - generate_error(actual, required)?; + generate_error(actual, required).map_mm_err()?; unreachable!("'generate_error' must return an error") } @@ -462,7 +462,7 @@ mod tests { const FORWARDED_LINE: u32 = line!() + 2; fn forward_error_for_box(actual: u64, required: u64) -> Result<(), MmError> { - generate_error_for_box(actual, required)?; + generate_error_for_box(actual, required).map_mm_err()?; unreachable!("'generate_error' must return an error") } diff --git a/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs b/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs index 1f05370c29..14706dc6f3 100644 --- a/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs +++ b/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs @@ -79,10 +79,10 @@ impl WasmAccountStorage { async fn load_accounts( db_transaction: &DbTransaction<'_>, ) -> AccountStorageResult> { - let table = db_transaction.table::().await?; + let table = db_transaction.table::().await.map_mm_err()?; table .get_all_items() - .await? + .await.map_mm_err()? .into_iter() .map(|(_item_id, account)| { let account_info = AccountInfo::try_from(account)?; @@ -96,8 +96,8 @@ impl WasmAccountStorage { async fn load_enabled_account_id( db_transaction: &DbTransaction<'_>, ) -> AccountStorageResult> { - let enabled_table = db_transaction.table::().await?; - let enabled_accounts = enabled_table.get_all_items().await?; + let enabled_table = db_transaction.table::().await.map_mm_err()?; + let enabled_accounts = enabled_table.get_all_items().await.map_mm_err()?; if enabled_accounts.len() > 1 { let error = format!("Expected only one enabled account, found {}", enabled_accounts.len()); return MmError::err(AccountStorageError::Internal(error)); @@ -125,12 +125,12 @@ impl WasmAccountStorage { db_transaction: &DbTransaction<'_>, account_id: &AccountId, ) -> AccountStorageResult> { - let table = db_transaction.table::().await?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = AccountTable::account_id_to_index(account_id)?; table .get_item_by_unique_multi_index(index_keys) - .await? + .await.map_mm_err()? .map(|(_item_id, account)| AccountWithCoins::try_from(account)) .transpose() } @@ -138,10 +138,10 @@ impl WasmAccountStorage { /// Checks whether an account with the given `account_id` exists. /// This method takes `db_transaction` to ensure data coherence. async fn account_exists(db_transaction: &DbTransaction<'_>, account_id: &AccountId) -> AccountStorageResult { - let table = db_transaction.table::().await?; + let table = db_transaction.table::().await.map_mm_err()?; let index_keys = AccountTable::account_id_to_index(account_id)?; - let count = table.count_by_multi_index(index_keys).await?; + let count = table.count_by_multi_index(index_keys).await.map_mm_err()?; Ok(count > 0) } @@ -157,9 +157,9 @@ impl WasmAccountStorage { _ => return Ok(()), } - let table = db_transaction.table::().await?; + let table = db_transaction.table::().await.map_mm_err()?; // Remove the account by clearing the table. - table.clear().await?; + table.clear().await.map_mm_err()?; Ok(()) } @@ -170,16 +170,16 @@ impl WasmAccountStorage { F: FnOnce(&mut AccountTable), { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; - let table = transaction.table::().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let index_keys = AccountTable::account_id_to_index(&account_id)?; let (item_id, mut account) = table .get_item_by_unique_multi_index(index_keys) - .await? + .await.map_mm_err()? .or_mm_err(|| AccountStorageError::NoSuchAccount(account_id))?; f(&mut account); - table.replace_item(item_id, &account).await?; + table.replace_item(item_id, &account).await.map_mm_err()?; Ok(()) } } @@ -191,7 +191,7 @@ impl AccountStorage for WasmAccountStorage { async fn load_account_coins(&self, account_id: AccountId) -> AccountStorageResult> { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; let account = Self::load_account_with_coins(&transaction, &account_id) .await? @@ -201,7 +201,7 @@ impl AccountStorage for WasmAccountStorage { async fn load_accounts(&self) -> AccountStorageResult> { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; Self::load_accounts(&transaction).await } @@ -210,7 +210,7 @@ impl AccountStorage for WasmAccountStorage { &self, ) -> AccountStorageResult> { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; let enabled_account_id = AccountId::from(Self::load_enabled_account_id_or_err(&transaction).await?); @@ -237,13 +237,13 @@ impl AccountStorage for WasmAccountStorage { async fn load_enabled_account_id(&self) -> AccountStorageResult { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; Self::load_enabled_account_id_or_err(&transaction).await } async fn load_enabled_account_with_coins(&self) -> AccountStorageResult { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; let account_id = AccountId::from(Self::load_enabled_account_id_or_err(&transaction).await?); @@ -254,7 +254,7 @@ impl AccountStorage for WasmAccountStorage { async fn enable_account(&self, enabled_account_id: EnabledAccountId) -> AccountStorageResult<()> { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; let account_id = AccountId::from(enabled_account_id); @@ -263,31 +263,31 @@ impl AccountStorage for WasmAccountStorage { return MmError::err(AccountStorageError::NoSuchAccount(account_id)); } - let table = transaction.table::().await?; + let table = transaction.table::().await.map_mm_err()?; // Remove the previous enabled account by clearing the table. - table.clear().await?; + table.clear().await.map_mm_err()?; - table.add_item(&EnabledAccountTable::from(enabled_account_id)).await?; + table.add_item(&EnabledAccountTable::from(enabled_account_id)).await.map_mm_err()?; Ok(()) } async fn upload_account(&self, account_info: AccountInfo) -> AccountStorageResult<()> { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; // First, check if the account doesn't exist. if Self::account_exists(&transaction, &account_info.account_id).await? { return MmError::err(AccountStorageError::AccountExistsAlready(account_info.account_id)); } - let table = transaction.table::().await?; - table.add_item(&AccountTable::from(account_info)).await?; + let table = transaction.table::().await.map_mm_err()?; + table.add_item(&AccountTable::from(account_info)).await.map_mm_err()?; Ok(()) } async fn delete_account(&self, account_id: AccountId) -> AccountStorageResult<()> { let locked_db = self.lock_db_mutex().await?; - let transaction = locked_db.inner.transaction().await?; + let transaction = locked_db.inner.transaction().await.map_mm_err()?; // First, check if the account exists already. if !Self::account_exists(&transaction, &account_id).await? { @@ -300,9 +300,9 @@ impl AccountStorage for WasmAccountStorage { } // Remove the account info. - let table = transaction.table::().await?; + let table = transaction.table::().await.map_mm_err()?; let index_keys = AccountTable::account_id_to_index(&account_id)?; - table.delete_item_by_unique_multi_index(index_keys).await?; + table.delete_item_by_unique_multi_index(index_keys).await.map_mm_err()?; Ok(()) } @@ -378,9 +378,9 @@ impl AccountTable { let (account_type, account_idx, device_pubkey) = account_id.to_tuple(); let multi_index = MultiIndex::new(AccountTable::ACCOUNT_ID_INDEX) - .with_value(account_type)? - .with_value(account_idx)? - .with_value(device_pubkey)?; + .with_value(account_type).map_mm_err()? + .with_value(account_idx).map_mm_err()? + .with_value(device_pubkey).map_mm_err()?; Ok(multi_index) } } diff --git a/mm2src/mm2_main/src/lp_init/init_metamask.rs b/mm2src/mm2_main/src/lp_init/init_metamask.rs index 66b8524624..602c95bc58 100644 --- a/mm2src/mm2_main/src/lp_init/init_metamask.rs +++ b/mm2src/mm2_main/src/lp_init/init_metamask.rs @@ -122,9 +122,9 @@ impl RpcTask for InitMetamaskTask { } async fn run(&mut self, _task_handle: InitMetamaskTaskHandleShared) -> Result> { - let crypto_ctx = CryptoCtx::from_ctx(&self.ctx)?; + let crypto_ctx = CryptoCtx::from_ctx(&self.ctx).map_mm_err()?; - let metamask = crypto_ctx.init_metamask_ctx(self.req.project.clone()).await?; + let metamask = crypto_ctx.init_metamask_ctx(self.req.project.clone()).await.map_mm_err()?; Ok(InitMetamaskResponse { eth_address: metamask.eth_account_str().to_string(), }) @@ -139,7 +139,7 @@ pub async fn connect_metamask( let init_ctx = MmInitContext::from_ctx(&ctx).map_to_mm(InitMetamaskError::Internal)?; let spawner = ctx.spawner(); let task = InitMetamaskTask { ctx, req }; - let task_id = RpcTaskManager::spawn_rpc_task(&init_ctx.init_metamask_manager, &spawner, task, client_id)?; + let task_id = RpcTaskManager::spawn_rpc_task(&init_ctx.init_metamask_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -166,6 +166,6 @@ pub async fn cancel_connect_metamask( .init_metamask_manager .lock() .map_to_mm(|e| CancelRpcTaskError::Internal(e.to_string()))?; - task_manager.cancel_task(req.task_id)?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } diff --git a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs index adce2b6deb..4448d360f5 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs @@ -404,10 +404,10 @@ mod wasm_impl { #[async_trait] impl MyActiveOrders for MyOrdersStorage { async fn load_active_maker_orders(&self) -> MyOrdersResult> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - let maker_orders = table.get_all_items().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let maker_orders = table.get_all_items().await.map_mm_err()?; Ok(maker_orders .into_iter() .map(|(_item_id, MyActiveMakerOrdersTable { order_payload, .. })| order_payload) @@ -415,22 +415,22 @@ mod wasm_impl { } async fn load_active_maker_order(&self, uuid: Uuid) -> MyOrdersResult { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; table .get_item_by_unique_index("uuid", uuid) - .await? + .await.map_mm_err()? .map(|(_item_id, MyActiveMakerOrdersTable { order_payload, .. })| order_payload) .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } async fn load_active_taker_orders(&self) -> MyOrdersResult> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - let maker_orders = table.get_all_items().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let maker_orders = table.get_all_items().await.map_mm_err()?; Ok(maker_orders .into_iter() .map(|(_item_id, MyActiveTakerOrdersTable { order_payload, .. })| order_payload) @@ -438,64 +438,64 @@ mod wasm_impl { } async fn save_new_active_maker_order(&self, order: &MakerOrder) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let item = MyActiveMakerOrdersTable { uuid: order.uuid, order_payload: order.clone(), }; - table.add_item(&item).await?; + table.add_item(&item).await.map_mm_err()?; Ok(()) } async fn save_new_active_taker_order(&self, order: &TakerOrder) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let item = MyActiveTakerOrdersTable { uuid: order.request.uuid, order_payload: order.clone(), }; - table.add_item(&item).await?; + table.add_item(&item).await.map_mm_err()?; Ok(()) } async fn delete_active_maker_order(&self, uuid: Uuid) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - table.delete_item_by_unique_index("uuid", uuid).await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + table.delete_item_by_unique_index("uuid", uuid).await.map_mm_err()?; Ok(()) } async fn delete_active_taker_order(&self, uuid: Uuid) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - table.delete_item_by_unique_index("uuid", uuid).await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + table.delete_item_by_unique_index("uuid", uuid).await.map_mm_err()?; Ok(()) } async fn update_active_maker_order(&self, order: &MakerOrder) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let item = MyActiveMakerOrdersTable { uuid: order.uuid, order_payload: order.clone(), }; - table.replace_item_by_unique_index("uuid", order.uuid, &item).await?; + table.replace_item_by_unique_index("uuid", order.uuid, &item).await.map_mm_err()?; Ok(()) } async fn update_active_taker_order(&self, order: &TakerOrder) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let item = MyActiveTakerOrdersTable { uuid: order.request.uuid, @@ -503,7 +503,7 @@ mod wasm_impl { }; table .replace_item_by_unique_index("uuid", order.request.uuid, &item) - .await?; + .await.map_mm_err()?; Ok(()) } } @@ -511,26 +511,26 @@ mod wasm_impl { #[async_trait] impl MyOrdersHistory for MyOrdersStorage { async fn save_order_in_history(&self, order: &Order) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let item = MyHistoryOrdersTable { uuid: order.uuid(), order_payload: order.clone(), }; - table.add_item(&item).await?; + table.add_item(&item).await.map_mm_err()?; Ok(()) } async fn load_order_from_history(&self, uuid: Uuid) -> MyOrdersResult { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; table .get_item_by_unique_index("uuid", uuid) - .await? + .await.map_mm_err()? .map(|(_item_id, MyHistoryOrdersTable { order_payload, .. })| order_payload) .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } @@ -550,13 +550,13 @@ mod wasm_impl { } async fn select_order_status(&self, uuid: Uuid) -> MyOrdersResult { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; table .get_item_by_unique_index("uuid", uuid) - .await? + .await.map_mm_err()? .map(|(_item_id, MyFilteringHistoryOrdersTable { status, .. })| status) .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } @@ -564,65 +564,65 @@ mod wasm_impl { async fn save_maker_order_in_filtering_history(&self, order: &MakerOrder) -> MyOrdersResult<()> { let item = maker_order_to_filtering_history_item(order, "Created".to_owned(), false)?; - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - table.add_item(&item).await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + table.add_item(&item).await.map_mm_err()?; Ok(()) } async fn save_taker_order_in_filtering_history(&self, order: &TakerOrder) -> MyOrdersResult<()> { let item = taker_order_to_filtering_history_item(order, "Created".to_owned())?; - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - table.add_item(&item).await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + table.add_item(&item).await.map_mm_err()?; Ok(()) } async fn update_maker_order_in_filtering_history(&self, order: &MakerOrder) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; // get the previous item to see if the order was taker let (item_id, prev_item) = table .get_item_by_unique_index("uuid", order.uuid) - .await? + .await.map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid: order.uuid })?; let item = maker_order_to_filtering_history_item(order, "Updated".to_owned(), prev_item.was_taker)?; - table.replace_item(item_id, &item).await?; + table.replace_item(item_id, &item).await.map_mm_err()?; Ok(()) } async fn update_order_status_in_filtering_history(&self, uuid: Uuid, status: String) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let (item_id, mut item) = table .get_item_by_unique_index("uuid", uuid) - .await? + .await.map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid })?; item.status = status; - table.replace_item(item_id, &item).await?; + table.replace_item(item_id, &item).await.map_mm_err()?; Ok(()) } async fn update_was_taker_in_filtering_history(&self, uuid: Uuid) -> MyOrdersResult<()> { - let db = self.ctx.ordermatch_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = self.ctx.ordermatch_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let (item_id, mut item) = table .get_item_by_unique_index("uuid", uuid) - .await? + .await.map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid })?; item.was_taker = true; - table.replace_item(item_id, &item).await?; + table.replace_item(item_id, &item).await.map_mm_err()?; Ok(()) } } diff --git a/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs b/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs index c4592fd494..cdc1da7bef 100644 --- a/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs +++ b/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs @@ -194,10 +194,10 @@ impl StateMachineStorage for MakerSwapStorage { #[cfg(target_arch = "wasm32")] async fn store_repr(&mut self, uuid: Self::MachineId, repr: Self::DbRepr) -> Result<(), Self::Error> { let swaps_ctx = SwapsContext::from_ctx(&self.ctx).expect("SwapsContext::from_ctx should not fail"); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; - let filters_table = transaction.table::().await?; + let filters_table = transaction.table::().await.map_mm_err()?; let item = MySwapsFiltersTable { uuid, @@ -207,14 +207,14 @@ impl StateMachineStorage for MakerSwapStorage { is_finished: false.into(), swap_type: MAKER_SWAP_V2_TYPE, }; - filters_table.add_item(&item).await?; + filters_table.add_item(&item).await.map_mm_err()?; - let table = transaction.table::().await?; + let table = transaction.table::().await.map_mm_err()?; let item = SavedSwapTable { uuid, saved_swap: serde_json::to_value(repr)?, }; - table.add_item(&item).await?; + table.add_item(&item).await.map_mm_err()?; Ok(()) } diff --git a/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs b/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs index f725dce5dc..476fb8cb38 100644 --- a/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs +++ b/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs @@ -177,9 +177,9 @@ mod wasm_impl { swap_type: u8, ) -> MySwapsResult<()> { let swap_ctx = SwapsContext::from_ctx(&self.ctx).map_to_mm(MySwapsError::InternalError)?; - let db = swap_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let my_swaps_table = transaction.table::().await?; + let db = swap_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let my_swaps_table = transaction.table::().await.map_mm_err()?; let item = MySwapsFiltersTable { uuid, @@ -189,7 +189,7 @@ mod wasm_impl { is_finished: false.into(), swap_type, }; - my_swaps_table.add_item(&item).await?; + my_swaps_table.add_item(&item).await.map_mm_err()?; Ok(()) } @@ -199,9 +199,9 @@ mod wasm_impl { paging_options: Option<&PagingOptions>, ) -> MySwapsResult { let swap_ctx = SwapsContext::from_ctx(&self.ctx).map_to_mm(MySwapsError::InternalError)?; - let db = swap_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let my_swaps_table = transaction.table::().await?; + let db = swap_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let my_swaps_table = transaction.table::().await.map_mm_err()?; let from_timestamp = filter.from_timestamp.map(|t| t as u32).unwrap_or_default(); let to_timestamp = filter.to_timestamp.map(|t| t as u32).unwrap_or(u32::MAX); @@ -213,42 +213,42 @@ mod wasm_impl { (Some(my_coin), Some(other_coin)) => { my_swaps_table .cursor_builder() - .only("my_coin", my_coin)? - .only("other_coin", other_coin)? + .only("my_coin", my_coin).map_mm_err()? + .only("other_coin", other_coin).map_mm_err()? .bound("started_at", from_timestamp, to_timestamp) .open_cursor("with_my_other_coins") - .await? + .await.map_mm_err()? .collect() - .await? + .await.map_mm_err()? }, (Some(my_coin), None) => { my_swaps_table .cursor_builder() - .only("my_coin", my_coin)? + .only("my_coin", my_coin).map_mm_err()? .bound("started_at", from_timestamp, to_timestamp) .open_cursor("with_my_coin") - .await? + .await.map_mm_err()? .collect() - .await? + .await.map_mm_err()? }, (None, Some(other_coin)) => { my_swaps_table .cursor_builder() - .only("other_coin", other_coin)? + .only("other_coin", other_coin).map_mm_err()? .bound("started_at", from_timestamp, to_timestamp) .open_cursor("with_other_coin") - .await? + .await.map_mm_err()? .collect() - .await? + .await.map_mm_err()? }, (None, None) => { my_swaps_table .cursor_builder() .bound("started_at", from_timestamp, to_timestamp) .open_cursor("started_at") - .await? + .await.map_mm_err()? .collect() - .await? + .await.map_mm_err()? }, }; diff --git a/mm2src/mm2_main/src/lp_swap/saved_swap.rs b/mm2src/mm2_main/src/lp_swap/saved_swap.rs index 8b62896d2b..4db0b968f4 100644 --- a/mm2src/mm2_main/src/lp_swap/saved_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/saved_swap.rs @@ -282,27 +282,27 @@ mod wasm_impl { .reverse() .where_first() .open_cursor("migration") - .await? + .await.map_mm_err()? .next() - .await?; + .await.map_mm_err()?; Ok(migrations.map(|(_, m)| m.migration).unwrap_or_default()) } pub async fn migrate_swaps_data(ctx: &MmArc) -> MmResult<(), SavedSwapError> { let swaps_ctx = SwapsContext::from_ctx(ctx).map_to_mm(SavedSwapError::InternalError)?; - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let migration_table = transaction.table::().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let migration_table = transaction.table::().await.map_mm_err()?; let mut migration = get_current_migration(&migration_table).await?; info!("Current swaps data migration {}", migration); loop { match migration { 0 => { - let filters_table = transaction.table::().await?; - let swaps_table = transaction.table::().await?; - let swaps = swaps_table.get_all_items().await?; + let filters_table = transaction.table::().await.map_mm_err()?; + let swaps_table = transaction.table::().await.map_mm_err()?; + let swaps = swaps_table.get_all_items().await.map_mm_err()?; let swaps = swaps .into_iter() .map(|(_item_id, SavedSwapTable { saved_swap, .. })| saved_swap) @@ -313,7 +313,7 @@ mod wasm_impl { .collect::, _>>()?; for swap in swaps { let (filter_id, mut filter_record) = - match filters_table.get_item_by_unique_index("uuid", swap.uuid()).await? { + match filters_table.get_item_by_unique_index("uuid", swap.uuid()).await.map_mm_err()? { Some(f) => f, None => { warn!("No MySwapsFiltersTable for {}", swap.uuid()); @@ -322,7 +322,7 @@ mod wasm_impl { }; filter_record.swap_type = LEGACY_SWAP_TYPE; filter_record.is_finished = swap.is_finished().into(); - filters_table.replace_item(filter_id, &filter_record).await?; + filters_table.replace_item(filter_id, &filter_record).await.map_mm_err()?; } }, 1 => break, @@ -334,7 +334,7 @@ mod wasm_impl { }, } migration += 1; - migration_table.add_item(&SwapsMigrationTable { migration }).await?; + migration_table.add_item(&SwapsMigrationTable { migration }).await.map_mm_err()?; } info!("Swaps data migration is completed, new version {}", migration); @@ -378,11 +378,11 @@ mod wasm_impl { impl SavedSwapIo for SavedSwap { async fn load_my_swap_from_db(ctx: &MmArc, uuid: Uuid) -> SavedSwapResult> { let swaps_ctx = SwapsContext::from_ctx(ctx).map_to_mm(SavedSwapError::InternalError)?; - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; - let saved_swap_json = match table.get_item_by_unique_index("uuid", uuid).await? { + let saved_swap_json = match table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { Some((_item_id, SavedSwapTable { saved_swap, .. })) => saved_swap, None => return Ok(None), }; @@ -392,11 +392,11 @@ mod wasm_impl { async fn load_all_my_swaps_from_db(ctx: &MmArc) -> SavedSwapResult> { let swaps_ctx = SwapsContext::from_ctx(ctx).map_to_mm(SavedSwapError::InternalError)?; - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; - let swaps = table.get_all_items().await?; + let swaps = table.get_all_items().await.map_mm_err()?; swaps .into_iter() .map(|(_item_id, SavedSwapTable { saved_swap, .. })| saved_swap) @@ -413,13 +413,13 @@ mod wasm_impl { }; let swaps_ctx = SwapsContext::from_ctx(ctx).map_to_mm(SavedSwapError::InternalError)?; - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; table .replace_item_by_unique_index("uuid", *self.uuid(), &saved_swap_item) - .await?; + .await.map_mm_err()?; Ok(()) } } diff --git a/mm2src/mm2_main/src/lp_swap/swap_lock.rs b/mm2src/mm2_main/src/lp_swap/swap_lock.rs index 6f1624881b..43e98dceff 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_lock.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_lock.rs @@ -128,26 +128,26 @@ mod wasm_lock { impl SwapLockOps for SwapLock { async fn lock(ctx: &MmArc, uuid: Uuid, ttl_sec: f64) -> SwapLockResult> { let swaps_ctx = SwapsContext::from_ctx(ctx).map_to_mm(SwapLockError::InternalError)?; - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; if let Some((item_id, SwapLockTable { timestamp, .. })) = - table.get_item_by_unique_index("uuid", uuid).await? + table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { let time_passed = now_float() - timestamp as f64; if time_passed <= ttl_sec { return Ok(None); } // delete the timestamp from the table before the new timestamp is written - table.delete_item(item_id).await?; + table.delete_item(item_id).await.map_mm_err()?; } let item = SwapLockTable { uuid, timestamp: now_sec(), }; - let record_id = table.add_item(&item).await?; + let record_id = table.add_item(&item).await.map_mm_err()?; Ok(Some(SwapLock { ctx: ctx.clone(), @@ -158,17 +158,17 @@ mod wasm_lock { async fn touch(&self) -> SwapLockResult<()> { let swaps_ctx = SwapsContext::from_ctx(&self.ctx).map_to_mm(SwapLockError::InternalError)?; - let db = swaps_ctx.swap_db().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; let item = SwapLockTable { uuid: self.swap_uuid, timestamp: now_sec(), }; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; - let replaced_record_id = table.replace_item(self.record_id, &item).await?; + let replaced_record_id = table.replace_item(self.record_id, &item).await.map_mm_err()?; if self.record_id != replaced_record_id { let error = format!("Expected {} record id, found {}", self.record_id, replaced_record_id); @@ -181,10 +181,10 @@ mod wasm_lock { impl SwapLock { async fn release(ctx: MmArc, record_id: ItemId) -> SwapLockResult<()> { let swaps_ctx = SwapsContext::from_ctx(&ctx).map_to_mm(SwapLockError::InternalError)?; - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - table.delete_item(record_id).await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + table.delete_item(record_id).await.map_mm_err()?; Ok(()) } } diff --git a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs index e220336389..0a1150d395 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs @@ -107,10 +107,10 @@ pub(super) async fn has_db_record_for(ctx: MmArc, id: &Uuid) -> MmResult MmResult { let swaps_ctx = SwapsContext::from_ctx(&ctx).expect("SwapsContext::from_ctx should not fail"); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - let maybe_item = table.get_item_by_unique_index("uuid", id).await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let maybe_item = table.get_item_by_unique_index("uuid", id).await.map_mm_err()?; Ok(maybe_item.is_some()) } @@ -143,11 +143,11 @@ pub(super) async fn store_swap_event MmResult<(), SwapStateMachineError> { let swaps_ctx = SwapsContext::from_ctx(&ctx).expect("SwapsContext::from_ctx should not fail"); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; - let saved_swap_json = match table.get_item_by_unique_index("uuid", id).await? { + let saved_swap_json = match table.get_item_by_unique_index("uuid", id).await.map_mm_err()? { Some((_item_id, SavedSwapTable { saved_swap, .. })) => saved_swap, None => return MmError::err(SwapStateMachineError::NoSwapWithUuid(id)), }; @@ -159,18 +159,18 @@ pub(super) async fn store_swap_event(ctx: &MmArc, id: Uuid) -> MmResult { let swaps_ctx = SwapsContext::from_ctx(ctx).expect("SwapsContext::from_ctx should not fail"); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; - let table = transaction.table::().await?; - let saved_swap_json = match table.get_item_by_unique_index("uuid", id).await? { + let table = transaction.table::().await.map_mm_err()?; + let saved_swap_json = match table.get_item_by_unique_index("uuid", id).await.map_mm_err()? { Some((_item_id, SavedSwapTable { saved_swap, .. })) => saved_swap, None => return MmError::err(SwapStateMachineError::NoSwapWithUuid(id)), }; @@ -197,14 +197,14 @@ pub(super) async fn get_unfinished_swaps_uuids( swap_type: u8, ) -> MmResult, SwapStateMachineError> { let index = MultiIndex::new(IS_FINISHED_SWAP_TYPE_INDEX) - .with_value(BoolAsInt::new(false))? - .with_value(swap_type)?; + .with_value(BoolAsInt::new(false)).map_mm_err()? + .with_value(swap_type).map_mm_err()?; let swaps_ctx = SwapsContext::from_ctx(&ctx).expect("SwapsContext::from_ctx should not fail"); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - let table_items = table.get_items_by_multi_index(index).await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let table_items = table.get_items_by_multi_index(index).await.map_mm_err()?; Ok(table_items.into_iter().map(|(_item_id, item)| item.uuid).collect()) } @@ -217,15 +217,15 @@ pub(super) async fn mark_swap_as_finished(ctx: MmArc, id: Uuid) -> MmResult<(), #[cfg(target_arch = "wasm32")] pub(super) async fn mark_swap_as_finished(ctx: MmArc, id: Uuid) -> MmResult<(), SwapStateMachineError> { let swaps_ctx = SwapsContext::from_ctx(&ctx).expect("SwapsContext::from_ctx should not fail"); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - let mut item = match table.get_item_by_unique_index("uuid", id).await? { + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let mut item = match table.get_item_by_unique_index("uuid", id).await.map_mm_err()? { Some((_item_id, item)) => item, None => return MmError::err(SwapStateMachineError::NoSwapWithUuid(id)), }; item.is_finished = true.into(); - table.replace_item_by_unique_index("uuid", id, &item).await?; + table.replace_item_by_unique_index("uuid", id, &item).await.map_mm_err()?; Ok(()) } diff --git a/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs b/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs index f1197a3208..3c4e84a86c 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs @@ -80,10 +80,10 @@ pub(super) async fn get_swap_type(ctx: &MmArc, uuid: &Uuid) -> MmResult().await?; - let item = match table.get_item_by_unique_index("uuid", uuid).await? { + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let item = match table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { Some((_item_id, item)) => item, None => return Ok(None), }; @@ -189,16 +189,16 @@ pub(super) async fn get_maker_swap_data_for_rpc( uuid: &Uuid, ) -> MmResult>, SwapV2DbError> { let swaps_ctx = SwapsContext::from_ctx(ctx).unwrap(); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - let item = match table.get_item_by_unique_index("uuid", uuid).await? { + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let item = match table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { Some((_item_id, item)) => item, None => return Ok(None), }; - let filters_table = transaction.table::().await?; - let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await? { + let filters_table = transaction.table::().await.map_mm_err()?; + let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { Some((_item_id, item)) => item, None => return Ok(None), }; @@ -230,16 +230,16 @@ pub(super) async fn get_taker_swap_data_for_rpc( uuid: &Uuid, ) -> MmResult>, SwapV2DbError> { let swaps_ctx = SwapsContext::from_ctx(ctx).unwrap(); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; - let item = match table.get_item_by_unique_index("uuid", uuid).await? { + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; + let item = match table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { Some((_item_id, item)) => item, None => return Ok(None), }; - let filters_table = transaction.table::().await?; - let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await? { + let filters_table = transaction.table::().await.map_mm_err()?; + let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { Some((_item_id, item)) => item, None => return Ok(None), }; diff --git a/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs b/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs index eea040316d..9584a5fd7c 100644 --- a/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs +++ b/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs @@ -225,10 +225,10 @@ impl StateMachineStorage for TakerSwapStorage { #[cfg(target_arch = "wasm32")] async fn store_repr(&mut self, uuid: Self::MachineId, repr: Self::DbRepr) -> Result<(), Self::Error> { let swaps_ctx = SwapsContext::from_ctx(&self.ctx).expect("SwapsContext::from_ctx should not fail"); - let db = swaps_ctx.swap_db().await?; - let transaction = db.transaction().await?; + let db = swaps_ctx.swap_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; - let filters_table = transaction.table::().await?; + let filters_table = transaction.table::().await.map_mm_err()?; let item = MySwapsFiltersTable { uuid, @@ -238,14 +238,14 @@ impl StateMachineStorage for TakerSwapStorage { is_finished: false.into(), swap_type: TAKER_SWAP_V2_TYPE, }; - filters_table.add_item(&item).await?; + filters_table.add_item(&item).await.map_mm_err()?; - let table = transaction.table::().await?; + let table = transaction.table::().await.map_mm_err()?; let item = SavedSwapTable { uuid, saved_swap: serde_json::to_value(repr)?, }; - table.add_item(&item).await?; + table.add_item(&item).await.map_mm_err()?; Ok(()) } diff --git a/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs b/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs index e4733a132d..c75b163250 100644 --- a/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs +++ b/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs @@ -99,9 +99,9 @@ pub(super) async fn save_encrypted_passphrase( ) -> WalletsDBResult<()> { let wallets_ctx = WalletsContext::from_ctx(ctx).map_to_mm(WalletsDBError::Internal)?; - let db = wallets_ctx.wallets_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = wallets_ctx.wallets_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let mnemonics_table_item = MnemonicsTable { wallet_name: wallet_name.to_string(), @@ -114,7 +114,7 @@ pub(super) async fn save_encrypted_passphrase( }; table .replace_item_by_unique_index("wallet_name", wallet_name, &mnemonics_table_item) - .await?; + .await.map_mm_err()?; Ok(()) } @@ -122,9 +122,9 @@ pub(super) async fn save_encrypted_passphrase( pub(super) async fn read_encrypted_passphrase_if_available(ctx: &MmArc) -> WalletsDBResult> { let wallets_ctx = WalletsContext::from_ctx(ctx).map_to_mm(WalletsDBError::Internal)?; - let db = wallets_ctx.wallets_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = wallets_ctx.wallets_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; let wallet_name = ctx .wallet_name @@ -136,7 +136,7 @@ pub(super) async fn read_encrypted_passphrase_if_available(ctx: &MmArc) -> Walle .ok_or_else(|| WalletsDBError::Internal("`wallet_name` can't be None!".to_string()))?; table .get_item_by_unique_index("wallet_name", wallet_name) - .await? + .await.map_mm_err()? .map(|(_item_id, wallet_table_item)| { serde_json::from_str(&wallet_table_item.encrypted_mnemonic).map_to_mm(|e| { WalletsDBError::DeserializationError { @@ -151,11 +151,11 @@ pub(super) async fn read_encrypted_passphrase_if_available(ctx: &MmArc) -> Walle pub(super) async fn read_all_wallet_names(ctx: &MmArc) -> WalletsDBResult> { let wallets_ctx = WalletsContext::from_ctx(ctx).map_to_mm(WalletsDBError::Internal)?; - let db = wallets_ctx.wallets_db().await?; - let transaction = db.transaction().await?; - let table = transaction.table::().await?; + let db = wallets_ctx.wallets_db().await.map_mm_err()?; + let transaction = db.transaction().await.map_mm_err()?; + let table = transaction.table::().await.map_mm_err()?; - let all_items = table.get_all_items().await?; + let all_items = table.get_all_items().await.map_mm_err()?; let wallet_names = all_items.into_iter().map(|(_, item)| item.wallet_name); Ok(wallet_names) diff --git a/mm2src/mm2_net/src/grpc_web.rs b/mm2src/mm2_net/src/grpc_web.rs index 326343209a..2a62126c79 100644 --- a/mm2src/mm2_net/src/grpc_web.rs +++ b/mm2src/mm2_net/src/grpc_web.rs @@ -168,7 +168,7 @@ where Req: prost::Message + Send + 'static, Res: prost::Message + Default + Send + 'static, { - let body = encode_body(req)?; + let body = encode_body(req).map_mm_err()?; let request = FetchRequest::post(url) .body_bytes(body) .header(CONTENT_TYPE.as_str(), APPLICATION_GRPC_WEB_PROTO) diff --git a/mm2src/mm2_net/src/wasm/tonic_client.rs b/mm2src/mm2_net/src/wasm/tonic_client.rs index 84df389e73..ccdb3ae4a4 100644 --- a/mm2src/mm2_net/src/wasm/tonic_client.rs +++ b/mm2src/mm2_net/src/wasm/tonic_client.rs @@ -6,7 +6,7 @@ use common::{APPLICATION_GRPC_WEB_PROTO, X_GRPC_WEB}; use futures_util::Future; use http::header::{ACCEPT, CONTENT_TYPE}; use http::{Request, Response}; -use mm2_err_handle::prelude::{MmError, MmResult}; +use mm2_err_handle::prelude::*; use std::pin::Pin; use std::task::{Context, Poll}; use tonic::body::BoxBody; @@ -48,6 +48,7 @@ async fn call(base_url: String, request: Request) -> MmResult) -> TrezorResult<()> { - if !self.device.is_open().await? { + if !self.device.is_open().await.map_mm_err()? { return MmError::err(TrezorError::DeviceDisconnected); } - Ok(self.device.write_chunk(self.endpoint_number, chunk).await?) + + self.device.write_chunk(self.endpoint_number, chunk).await.map_mm_err() } async fn read_chunk(&mut self, chunk_len: u32) -> TrezorResult> { - if !self.device.is_open().await? { + if !self.device.is_open().await.map_mm_err()? { return MmError::err(TrezorError::DeviceDisconnected); } - Ok(self.device.read_chunk(self.endpoint_number, chunk_len).await?) + + self.device + .read_chunk(self.endpoint_number, chunk_len) + .await + .map_mm_err() } } @@ -66,15 +71,15 @@ impl WebUsbLink { /// Configure the WebUSB device. async fn establish_connection(&self, first: bool) -> TrezorResult<()> { - self.device.open().await?; + self.device.open().await.map_mm_err()?; if first { - self.device.select_configuration(CONFIGURATION_ID).await?; + self.device.select_configuration(CONFIGURATION_ID).await.map_mm_err()?; if let Err(e) = self.device.reset_device().await { // Reset fails on ChromeOS and Windows. warn!("{}", e); } } - self.device.claim_interface(self.interface_number).await?; + self.device.claim_interface(self.interface_number).await.map_mm_err()?; Ok(()) } } @@ -115,11 +120,12 @@ pub struct FoundDevices { /// /// This function **must** be called via a user gesture like a touch or mouse click. pub async fn find_devices() -> TrezorResult { - let wrapper = WebUsbWrapper::new()?; + let wrapper = WebUsbWrapper::new().map_mm_err()?; wrapper .request_device(TREZOR_DEVICES.iter().copied().map(DeviceFilter::from).collect()) - .await?; - let devices_iter = wrapper.get_devices().await?.into_iter().filter(is_trezor); + .await + .map_mm_err()?; + let devices_iter = wrapper.get_devices().await.map_mm_err()?.into_iter().filter(is_trezor); let mut available = Vec::new(); let mut not_supported = Vec::new(); for device in devices_iter { From 30ea801281ccdbb33211addfd2aed4416f4fa076 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 22:01:15 +0100 Subject: [PATCH 07/35] revert common.rs and nits --- mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs | 11 ++++++----- mm2src/common/common.rs | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs index adeed9972e..b34d9754d2 100644 --- a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs +++ b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs @@ -273,6 +273,7 @@ impl<'a> WalletIndexedDb { .map_mm_err()? .with_value(num_to_bigint!(height)?) .map_mm_err()?; + walletdb_blocks_table .replace_item_by_unique_multi_index(index_keys, &block) .await @@ -312,11 +313,11 @@ impl WalletIndexedDb { .with_value(u32::from(block_height)) .map_mm_err()?; - Ok(walletdb_blocks_table + walletdb_blocks_table .replace_item_by_unique_multi_index(index_keys, &block) .await .map(|_| ()) - .map_mm_err()?) + .map_mm_err() } pub async fn get_balance(&self, account: AccountId) -> ZcoinStorageRes { @@ -607,7 +608,7 @@ impl WalletIndexedDb { ticker: self.ticker.clone(), }; - Ok(witness_table.add_item(&witness).await.map(|_| ()).map_mm_err()?) + witness_table.add_item(&witness).await.map(|_| ()).map_mm_err() } pub async fn prune_witnesses(&self, below_height: BlockHeight) -> ZcoinStorageRes<()> { @@ -778,11 +779,11 @@ impl WalletIndexedDb { .with_value(output_index) .map_mm_err()?; - Ok(sent_note_table + sent_note_table .replace_item_by_unique_multi_index(index_keys, &new_note) .await .map(|_| ()) - .map_mm_err()?) + .map_mm_err() } /// Asynchronously rewinds the storage to a specified block height, effectively diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index 253916783b..078f601f66 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -11,7 +11,7 @@ //! binary #![allow(uncommon_codepoints)] -#![feature(panic_info_message)] +#![feature(integer_atomics, panic_info_message)] #![feature(async_closure)] #![feature(hash_raw_entry)] #![feature(drain_filter)] From 05d500b78bf1a94fb9c6b4a265b6b6a36b6042e8 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 22:11:53 +0100 Subject: [PATCH 08/35] use current rustc for linting --- mm2src/coins/coin_balance.rs | 3 +- mm2src/coins/eth/eth_withdraw.rs | 3 +- mm2src/coins/hd_wallet/confirm_address.rs | 20 +++-- mm2src/coins/hd_wallet/mod.rs | 16 +++- .../coins/hd_wallet/storage/wasm_storage.rs | 24 ++++-- mm2src/coins/lightning/ln_utils.rs | 3 +- mm2src/coins/qrc20.rs | 24 ++++-- .../coins/rpc_command/init_account_balance.rs | 6 +- .../coins/rpc_command/init_create_account.rs | 20 +++-- .../init_scan_for_new_addresses.rs | 6 +- mm2src/coins/rpc_command/init_withdraw.rs | 3 +- .../rpc_command/lightning/open_channel.rs | 7 +- .../rpc_command/lightning/send_payment.rs | 5 +- mm2src/coins/tendermint/tendermint_token.rs | 12 ++- mm2src/coins/utxo/bch.rs | 7 +- mm2src/coins/utxo/qtum.rs | 7 +- mm2src/coins/utxo/qtum_delegation.rs | 9 +- .../utxo/utxo_builder/utxo_coin_builder.rs | 28 +++++-- mm2src/coins/utxo/utxo_standard.rs | 3 +- .../storage/blockdb/blockdb_idb_storage.rs | 51 +++++++---- .../src/eth_with_token_activation.rs | 3 +- .../src/init_erc20_token_activation.rs | 17 ++-- .../src/lightning_activation.rs | 34 ++++++-- .../src/utxo_activation/common_impl.rs | 8 +- .../utxo_activation/init_bch_activation.rs | 3 +- .../coins_activation/src/z_coin_activation.rs | 4 +- .../src/account/storage/wasm_storage.rs | 23 +++-- mm2src/mm2_main/src/lp_init/init_hw.rs | 6 +- mm2src/mm2_main/src/lp_ordermatch.rs | 3 +- .../src/lp_ordermatch/my_orders_storage.rs | 56 +++++++++---- .../src/lp_ordermatch/simple_market_maker.rs | 8 +- mm2src/mm2_main/src/lp_swap/maker_swap.rs | 10 ++- .../mm2_main/src/lp_swap/my_swaps_storage.rs | 84 ++++++++++--------- mm2src/mm2_main/src/lp_swap/saved_swap.rs | 38 ++++++--- mm2src/mm2_main/src/lp_swap/swap_v2_common.rs | 16 +++- mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs | 21 +++-- .../src/lp_wallet/mnemonics_wasm_db.rs | 6 +- 37 files changed, 401 insertions(+), 196 deletions(-) diff --git a/mm2src/coins/coin_balance.rs b/mm2src/coins/coin_balance.rs index c6f89ecd44..d985b274ed 100644 --- a/mm2src/coins/coin_balance.rs +++ b/mm2src/coins/coin_balance.rs @@ -337,7 +337,8 @@ pub trait HDWalletBalanceOps: HDWalletCoinOps { // Derive HD addresses and split addresses and their derivation paths into two collections. let (addresses, der_paths): (Vec<_>, Vec<_>) = self .derive_addresses(hd_account, address_ids) - .await.map_mm_err()? + .await + .map_mm_err()? .into_iter() .map(|hd_address| (hd_address.address(), hd_address.derivation_path().clone())) .unzip(); diff --git a/mm2src/coins/eth/eth_withdraw.rs b/mm2src/coins/eth/eth_withdraw.rs index 5b3d2078f9..1c2bd41e52 100644 --- a/mm2src/coins/eth/eth_withdraw.rs +++ b/mm2src/coins/eth/eth_withdraw.rs @@ -178,7 +178,8 @@ where let signed_tx = coin .wait_for_tx_appears_on_rpc(tx_hash, wait_rpc_timeout, check_every) - .await.map_mm_err()?; + .await + .map_mm_err()?; let tx_hex = signed_tx .map(|signed_tx| BytesJson::from(rlp::encode(&signed_tx).to_vec())) // Return an empty `tx_hex` if the transaction is still not appeared on the RPC node. diff --git a/mm2src/coins/hd_wallet/confirm_address.rs b/mm2src/coins/hd_wallet/confirm_address.rs index f2e3274484..0bbfcd7cde 100644 --- a/mm2src/coins/hd_wallet/confirm_address.rs +++ b/mm2src/coins/hd_wallet/confirm_address.rs @@ -155,18 +155,20 @@ where let pubkey_processor = Arc::new(pubkey_processor); let mut trezor_session = hw_ctx.trezor(pubkey_processor.clone()).await.map_mm_err()?; let address = match trezor_message_type { - TrezorMessageType::Bitcoin => { - trezor_session - .get_utxo_address(derivation_path, trezor_coin, SHOW_ADDRESS_ON_DISPLAY) - .await.map_mm_err()? - .process(pubkey_processor.clone()) - .await.map_mm_err()? - }, + TrezorMessageType::Bitcoin => trezor_session + .get_utxo_address(derivation_path, trezor_coin, SHOW_ADDRESS_ON_DISPLAY) + .await + .map_mm_err()? + .process(pubkey_processor.clone()) + .await + .map_mm_err()?, TrezorMessageType::Ethereum => trezor_session .get_eth_address(derivation_path, SHOW_ADDRESS_ON_DISPLAY) - .await.map_mm_err()? + .await + .map_mm_err()? .process(pubkey_processor.clone()) - .await.map_mm_err()? + .await + .map_mm_err()? .or_mm_err(|| HDConfirmAddressError::NoAddressReceived)?, }; diff --git a/mm2src/coins/hd_wallet/mod.rs b/mm2src/coins/hd_wallet/mod.rs index 8ce05dcb0c..81f7afbe6f 100644 --- a/mm2src/coins/hd_wallet/mod.rs +++ b/mm2src/coins/hd_wallet/mod.rs @@ -216,7 +216,8 @@ where let account_child = ChildNumber::new(account_info.account_id, ACCOUNT_CHILD_HARDENED)?; let account_derivation_path = wallet_der_path .derive(account_child) - .map_to_mm(StandardHDPathError::from).map_mm_err()?; + .map_to_mm(StandardHDPathError::from) + .map_mm_err()?; let extended_pubkey = ExtendedPublicKey::from_str(&account_info.account_xpub) .map_err(|e| HDWalletStorageError::ErrorDeserializing(e.to_string()))?; let capacity = @@ -416,7 +417,8 @@ where let account_derivation_path: HDPathToAccount = hd_wallet.derivation_path().derive(account_child)?; let account_pubkey = coin .extract_extended_pubkey(xpub_extractor, account_derivation_path.to_derivation_path()) - .await.map_mm_err()?; + .await + .map_mm_err()?; let new_account = HDAccount::new(new_account_id, account_pubkey, account_derivation_path); @@ -429,7 +431,10 @@ where return MmError::err(NewAccountCreationError::Internal(error)); } - hd_wallet.upload_new_account(new_account.to_storage_item()).await.map_mm_err()?; + hd_wallet + .upload_new_account(new_account.to_storage_item()) + .await + .map_mm_err()?; Ok(AsyncMutexGuard::map(accounts, |accounts| { accounts @@ -514,7 +519,10 @@ pub(crate) mod inner_impl { if new_address_id >= max_addresses_number { return MmError::err(NewAddressDerivingError::AddressLimitReached { max_addresses_number }); } - let address = coin.derive_address(hd_account, chain, new_address_id).await.map_mm_err()?; + let address = coin + .derive_address(hd_account, chain, new_address_id) + .await + .map_mm_err()?; Ok(NewAddress { hd_address: address, new_known_addresses_number: known_addresses_number + 1, diff --git a/mm2src/coins/hd_wallet/storage/wasm_storage.rs b/mm2src/coins/hd_wallet/storage/wasm_storage.rs index 72454564eb..5c7b57b77d 100644 --- a/mm2src/coins/hd_wallet/storage/wasm_storage.rs +++ b/mm2src/coins/hd_wallet/storage/wasm_storage.rs @@ -177,11 +177,14 @@ impl HDWalletStorageInternalOps for HDWalletIndexedDbStorage { let table = transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WALLET_ID_INDEX) - .with_value(wallet_id.coin).map_mm_err()? - .with_value(wallet_id.hd_wallet_rmd160).map_mm_err()?; + .with_value(wallet_id.coin) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160) + .map_mm_err()?; Ok(table .get_items_by_multi_index(index_keys) - .await.map_mm_err()? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, item)| HDAccountStorageItem::from(item)) .collect()) @@ -256,8 +259,10 @@ impl HDWalletStorageInternalOps for HDWalletIndexedDbStorage { let table = transaction.table::().await.map_mm_err()?; let index_keys = MultiIndex::new(WALLET_ID_INDEX) - .with_value(wallet_id.coin).map_mm_err()? - .with_value(wallet_id.hd_wallet_rmd160).map_mm_err()?; + .with_value(wallet_id.coin) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160) + .map_mm_err()?; table.delete_items_by_multi_index(index_keys).await.map_mm_err()?; Ok(()) } @@ -280,9 +285,12 @@ impl HDWalletIndexedDbStorage { account_id: u32, ) -> HDWalletStorageResult> { let index_keys = MultiIndex::new(WALLET_ACCOUNT_ID_INDEX) - .with_value(wallet_id.coin).map_mm_err()? - .with_value(wallet_id.hd_wallet_rmd160).map_mm_err()? - .with_value(account_id).map_mm_err()?; + .with_value(wallet_id.coin) + .map_mm_err()? + .with_value(wallet_id.hd_wallet_rmd160) + .map_mm_err()? + .with_value(account_id) + .map_mm_err()?; table .get_item_by_unique_multi_index(index_keys) .await diff --git a/mm2src/coins/lightning/ln_utils.rs b/mm2src/coins/lightning/ln_utils.rs index 3e57017d6b..42048967d8 100644 --- a/mm2src/coins/lightning/ln_utils.rs +++ b/mm2src/coins/lightning/ln_utils.rs @@ -108,7 +108,8 @@ pub fn init_keys_manager(platform: &Platform) -> EnableLightningResult u256_to_big_decimal(*bal, decimals).map_mm_err()?, _ => { @@ -1225,15 +1227,17 @@ impl MmCoin for Qrc20Coin { receiver_addr, self.swap_contract_address, ) - .await.map_mm_err()?; + .await + .map_mm_err()?; self.preimage_trade_fee_required_to_send_outputs(erc20_payment_outputs, &stage) .await? }; // Optionally calculate refund fee. let sender_refund_fee = if include_refund_fee { - let sender_refund_output = - self.sender_refund_output(&self.swap_contract_address, swap_id, value, secret_hash, receiver_addr).map_mm_err()?; + let sender_refund_output = self + .sender_refund_output(&self.swap_contract_address, swap_id, value, secret_hash, receiver_addr) + .map_mm_err()?; self.preimage_trade_fee_required_to_send_outputs(vec![sender_refund_output], &stage) .await? } else { @@ -1260,8 +1264,9 @@ impl MmCoin for Qrc20Coin { // get the max available value that we can pass into the contract call params // see `generate_contract_call_script_pubkey` let value = u64::MAX.into(); - let output = - selfi.receiver_spend_output(&selfi.swap_contract_address, swap_id, value, secret, sender_addr).map_mm_err()?; + let output = selfi + .receiver_spend_output(&selfi.swap_contract_address, swap_id, value, secret, sender_addr) + .map_mm_err()?; let total_fee = selfi .preimage_trade_fee_required_to_send_outputs(vec![output], &stage) @@ -1284,8 +1289,9 @@ impl MmCoin for Qrc20Coin { // pass the dummy params let to_addr = H160::default(); - let transfer_output = - self.transfer_output(to_addr, amount, QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT).map_mm_err()?; + let transfer_output = self + .transfer_output(to_addr, amount, QRC20_GAS_LIMIT_DEFAULT, QRC20_GAS_PRICE_DEFAULT) + .map_mm_err()?; let total_fee = self .preimage_trade_fee_required_to_send_outputs(vec![transfer_output], &stage) diff --git a/mm2src/coins/rpc_command/init_account_balance.rs b/mm2src/coins/rpc_command/init_account_balance.rs index 01ed49193f..afec7e5761 100644 --- a/mm2src/coins/rpc_command/init_account_balance.rs +++ b/mm2src/coins/rpc_command/init_account_balance.rs @@ -98,7 +98,8 @@ pub async fn init_account_balance( let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(HDAccountBalanceRpcError::Internal)?; let task = InitAccountBalanceTask { coin, req }; let task_id = - AccountBalanceTaskManager::spawn_rpc_task(&coins_ctx.account_balance_task_manager, &spawner, task, client_id).map_mm_err()?; + AccountBalanceTaskManager::spawn_rpc_task(&coins_ctx.account_balance_task_manager, &spawner, task, client_id) + .map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -148,7 +149,8 @@ pub mod common_impl { let account_id = params.account_index; let hd_account = coin .derivation_method() - .hd_wallet_or_err().map_mm_err()? + .hd_wallet_or_err() + .map_mm_err()? .get_account(account_id) .await .or_mm_err(|| HDAccountBalanceRpcError::UnknownAccount { account_id })?; diff --git a/mm2src/coins/rpc_command/init_create_account.rs b/mm2src/coins/rpc_command/init_create_account.rs index 630b3e931c..d4e87e09fd 100644 --- a/mm2src/coins/rpc_command/init_create_account.rs +++ b/mm2src/coins/rpc_command/init_create_account.rs @@ -273,12 +273,10 @@ impl RpcTask for InitCreateAccountTask { on_passphrase_request: CreateAccountAwaitingStatus::EnterTrezorPassphrase, on_ready: CreateAccountInProgressStatus::RequestingAccountBalance, }; - Some(CreateAccountXPubExtractor::new_trezor_extractor( - ctx, - task_handle, - hw_statuses, - coin_protocol, - ).map_mm_err()?) + Some( + CreateAccountXPubExtractor::new_trezor_extractor(ctx, task_handle, hw_statuses, coin_protocol) + .map_mm_err()?, + ) } else { None }; @@ -342,7 +340,8 @@ pub async fn init_create_new_account( task_state: CreateAccountState::default(), }; let task_id = - CreateAccountTaskManager::spawn_rpc_task(&coins_ctx.create_account_manager, &spawner, task, client_id).map_mm_err()?; + CreateAccountTaskManager::spawn_rpc_task(&coins_ctx.create_account_manager, &spawner, task, client_id) + .map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -409,7 +408,9 @@ pub(crate) mod common_impl { { let hd_wallet = coin.derivation_method().hd_wallet_or_err().map_mm_err()?; - let mut new_account = create_new_account(coin, hd_wallet, xpub_extractor, params.account_id).await.map_mm_err()?; + let mut new_account = create_new_account(coin, hd_wallet, xpub_extractor, params.account_id) + .await + .map_mm_err()?; let account_index = new_account.account_id(); let account_derivation_path = new_account.account_derivation_path(); @@ -420,7 +421,8 @@ pub(crate) mod common_impl { let gap_limit = params.gap_limit.unwrap_or_else(|| hd_wallet.gap_limit()); let address_scanner = coin.produce_hd_address_scanner().await.map_mm_err()?; coin.scan_for_new_addresses(hd_wallet, &mut new_account, &address_scanner, gap_limit) - .await.map_mm_err()? + .await + .map_mm_err()? } else { Vec::new() }; diff --git a/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs b/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs index 7c34e557ae..7d1e7b1e09 100644 --- a/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs +++ b/mm2src/coins/rpc_command/init_scan_for_new_addresses.rs @@ -117,7 +117,8 @@ pub async fn init_scan_for_new_addresses( let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(HDAccountBalanceRpcError::Internal)?; let task = InitScanAddressesTask { req, coin }; let task_id = - ScanAddressesTaskManager::spawn_rpc_task(&coins_ctx.scan_addresses_manager, &spawner, task, client_id).map_mm_err()?; + ScanAddressesTaskManager::spawn_rpc_task(&coins_ctx.scan_addresses_manager, &spawner, task, client_id) + .map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } @@ -176,7 +177,8 @@ pub mod common_impl { let new_addresses = coin .scan_for_new_addresses(hd_wallet, hd_account.deref_mut(), &address_scanner, gap_limit) - .await.map_mm_err()?; + .await + .map_mm_err()?; let addresses: HashSet<_> = new_addresses .iter() diff --git a/mm2src/coins/rpc_command/init_withdraw.rs b/mm2src/coins/rpc_command/init_withdraw.rs index a26ec65025..1575f9b1ca 100644 --- a/mm2src/coins/rpc_command/init_withdraw.rs +++ b/mm2src/coins/rpc_command/init_withdraw.rs @@ -46,7 +46,8 @@ pub async fn init_withdraw( request, }; let coins_ctx = CoinsContext::from_ctx(&ctx).map_to_mm(WithdrawError::InternalError)?; - let task_id = WithdrawTaskManager::spawn_rpc_task(&coins_ctx.withdraw_task_manager, &spawner, task, client_id).map_mm_err()?; + let task_id = WithdrawTaskManager::spawn_rpc_task(&coins_ctx.withdraw_task_manager, &spawner, task, client_id) + .map_mm_err()?; Ok(InitWithdrawResponse { task_id }) } diff --git a/mm2src/coins/rpc_command/lightning/open_channel.rs b/mm2src/coins/rpc_command/lightning/open_channel.rs index 3e35825ae6..81622b5962 100644 --- a/mm2src/coins/rpc_command/lightning/open_channel.rs +++ b/mm2src/coins/rpc_command/lightning/open_channel.rs @@ -146,7 +146,12 @@ pub async fn open_channel(ctx: MmArc, req: OpenChannelRequest) -> OpenChannelRes let platform_coin = ln_coin.platform_coin().clone(); let decimals = platform_coin.as_ref().decimals; - let my_address = platform_coin.as_ref().derivation_method.single_addr_or_err().await.map_mm_err()?; + let my_address = platform_coin + .as_ref() + .derivation_method + .single_addr_or_err() + .await + .map_mm_err()?; let (unspents, _) = platform_coin.get_unspent_ordered_list(&my_address).await.map_mm_err()?; let (value, fee_policy) = match req.amount.clone() { ChannelOpenAmount::Max => ( diff --git a/mm2src/coins/rpc_command/lightning/send_payment.rs b/mm2src/coins/rpc_command/lightning/send_payment.rs index 0d3250c99c..43f1e30ae5 100644 --- a/mm2src/coins/rpc_command/lightning/send_payment.rs +++ b/mm2src/coins/rpc_command/lightning/send_payment.rs @@ -104,7 +104,10 @@ pub async fn send_payment(ctx: MmArc, req: SendPaymentReq) -> SendPaymentResult< destination, amount_in_msat, expiry, - } => ln_coin.keysend(destination.into(), amount_in_msat, expiry).await.map_mm_err()?, + } => ln_coin + .keysend(destination.into(), amount_in_msat, expiry) + .await + .map_mm_err()?, }; Ok(SendPaymentResponse { diff --git a/mm2src/coins/tendermint/tendermint_token.rs b/mm2src/coins/tendermint/tendermint_token.rs index 0400fe4350..428204eb03 100644 --- a/mm2src/coins/tendermint/tendermint_token.rs +++ b/mm2src/coins/tendermint/tendermint_token.rs @@ -287,7 +287,8 @@ impl MarketCoinOps for TendermintToken { let balance_denom = coin .platform_coin .account_balance_for_denom(&coin.platform_coin.account_id, coin.denom.to_string()) - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(CoinBalance { spendable: big_decimal_from_sat_unsigned(balance_denom, coin.decimals), unspendable: BigDecimal::default(), @@ -386,11 +387,13 @@ impl MmCoin for TendermintToken { let (base_denom_balance, base_denom_balance_dec) = platform .get_balance_as_unsigned_and_decimal(&account_id, &platform.denom, token.decimals()) - .await.map_mm_err()?; + .await + .map_mm_err()?; let (balance_denom, balance_dec) = platform .get_balance_as_unsigned_and_decimal(&account_id, &token.denom, token.decimals()) - .await.map_mm_err()?; + .await + .map_mm_err()?; let (amount_denom, amount_dec, total_amount) = if req.max { ( @@ -469,7 +472,8 @@ impl MmCoin for TendermintToken { &memo, req.fee, ) - .await.map_mm_err()?; + .await + .map_mm_err()?; let fee_amount_dec = big_decimal_from_sat_unsigned(fee_amount_u64, platform.decimals()); diff --git a/mm2src/coins/utxo/bch.rs b/mm2src/coins/utxo/bch.rs index 3e04ee0f50..6faec64ea6 100644 --- a/mm2src/coins/utxo/bch.rs +++ b/mm2src/coins/utxo/bch.rs @@ -1154,7 +1154,12 @@ impl MarketCoinOps for BchCoin { fn my_balance(&self) -> BalanceFut { let coin = self.clone(); let fut = async move { - let my_address = coin.as_ref().derivation_method.single_addr_or_err().await.map_mm_err()?; + let my_address = coin + .as_ref() + .derivation_method + .single_addr_or_err() + .await + .map_mm_err()?; let bch_unspents = coin.bch_unspents_for_display(&my_address).await.map_mm_err()?; Ok(bch_unspents.platform_balance(coin.as_ref().decimals)) }; diff --git a/mm2src/coins/utxo/qtum.rs b/mm2src/coins/utxo/qtum.rs index 82b364d109..3e189c5983 100644 --- a/mm2src/coins/utxo/qtum.rs +++ b/mm2src/coins/utxo/qtum.rs @@ -155,7 +155,12 @@ pub trait QtumBasedCoin: UtxoCommonOps + MarketCoinOps { } async fn my_addr_as_contract_addr(&self) -> MmResult { - let my_address = self.as_ref().derivation_method.single_addr_or_err().await.map_mm_err()?; + let my_address = self + .as_ref() + .derivation_method + .single_addr_or_err() + .await + .map_mm_err()?; contract_addr_from_utxo_addr(my_address).mm_err(Qrc20AddressError::from) } diff --git a/mm2src/coins/utxo/qtum_delegation.rs b/mm2src/coins/utxo/qtum_delegation.rs index 91c2ad7095..a37eba4cdf 100644 --- a/mm2src/coins/utxo/qtum_delegation.rs +++ b/mm2src/coins/utxo/qtum_delegation.rs @@ -109,7 +109,8 @@ impl QtumDelegationOps for QtumCoin { let signature = key_pair .private() .sign_compact(&hashed) - .map_to_mm(|e| QtumStakingAbiError::PodSigningError(e.to_string())).map_mm_err()?; + .map_to_mm(|e| QtumStakingAbiError::PodSigningError(e.to_string())) + .map_mm_err()?; Ok(signature) } } @@ -347,7 +348,8 @@ impl QtumCoin { gas_limit, gas_price, QTUM_DELEGATE_CONTRACT_ADDRESS.as_bytes(), - ).map_mm_err()? + ) + .map_mm_err()? .to_bytes(); Ok(ContractCallOutput { value: OUTPUT_QTUM_AMOUNT, @@ -379,7 +381,8 @@ impl QtumCoin { gas_limit, gas_price, QTUM_DELEGATE_CONTRACT_ADDRESS.as_bytes(), - ).map_mm_err()? + ) + .map_mm_err()? .to_bytes(); Ok(ContractCallOutput { value: OUTPUT_QTUM_AMOUNT, diff --git a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs index 584fab04a0..70898748e8 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs @@ -142,7 +142,9 @@ pub trait UtxoFieldsWithIguanaSecretBuilder: UtxoCoinBuilderCommonOps { &self, priv_key: IguanaPrivKey, ) -> UtxoCoinBuildResult { - let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()).build().map_mm_err()?; + let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()) + .build() + .map_mm_err()?; let private = Private { prefix: conf.wif_prefix, secret: priv_key, @@ -172,13 +174,16 @@ pub trait UtxoFieldsWithGlobalHDBuilder: UtxoCoinBuilderCommonOps { &self, global_hd_ctx: GlobalHDAccountArc, ) -> UtxoCoinBuildResult { - let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()).build().map_mm_err()?; + let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), self.ticker()) + .build() + .map_mm_err()?; let path_to_address = self.activation_params().path_to_address; let path_to_coin = conf .derivation_path .as_ref() - .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet).map_mm_err()?; + .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet) + .map_mm_err()?; let secret = global_hd_ctx .derive_secp256k1_secret( &path_to_address @@ -203,7 +208,9 @@ pub trait UtxoFieldsWithGlobalHDBuilder: UtxoCoinBuilderCommonOps { let address_format = self.address_format()?; let hd_wallet_rmd160 = *self.ctx().rmd160(); let hd_wallet_storage = - HDWalletCoinStorage::init_with_rmd160(self.ctx(), self.ticker().to_owned(), hd_wallet_rmd160).await.map_mm_err()?; + HDWalletCoinStorage::init_with_rmd160(self.ctx(), self.ticker().to_owned(), hd_wallet_rmd160) + .await + .map_mm_err()?; let accounts = load_hd_accounts_from_storage(&hd_wallet_storage, path_to_coin) .await .mm_err(UtxoCoinBuildError::from)?; @@ -291,7 +298,9 @@ where pub trait UtxoFieldsWithHardwareWalletBuilder: UtxoCoinBuilderCommonOps { async fn build_utxo_fields_with_trezor(&self) -> UtxoCoinBuildResult { let ticker = self.ticker().to_owned(); - let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), &ticker).build().map_mm_err()?; + let conf = UtxoConfBuilder::new(self.conf(), self.activation_params(), &ticker) + .build() + .map_mm_err()?; if !self.supports_trezor(&conf) { return MmError::err(UtxoCoinBuildError::CoinDoesntSupportTrezor); @@ -307,7 +316,8 @@ pub trait UtxoFieldsWithHardwareWalletBuilder: UtxoCoinBuilderCommonOps { let path_to_coin = conf .derivation_path .clone() - .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet).map_mm_err()?; + .or_mm_err(|| UtxoConfError::DerivationPathIsNotSet) + .map_mm_err()?; let hd_wallet_storage = HDWalletCoinStorage::init(self.ctx(), ticker).await.map_mm_err()?; @@ -402,7 +412,8 @@ pub trait UtxoCoinBuilderCommonOps { fn address_format(&self) -> UtxoCoinBuildResult { let format_from_req = self.activation_params().address_format.clone(); let format_from_conf = json::from_value::>(self.conf()["address_format"].clone()) - .map_to_mm(|e| UtxoConfError::InvalidAddressFormat(e.to_string())).map_mm_err()? + .map_to_mm(|e| UtxoConfError::InvalidAddressFormat(e.to_string())) + .map_mm_err()? .unwrap_or(UtxoAddressFormat::Standard); let mut address_format = match format_from_req { @@ -624,7 +635,8 @@ pub trait UtxoCoinBuilderCommonOps { None => { let name = conf["name"] .as_str() - .or_mm_err(|| UtxoConfError::CurrencyNameIsNotSet).map_mm_err()?; + .or_mm_err(|| UtxoConfError::CurrencyNameIsNotSet) + .map_mm_err()?; (name, false) }, } diff --git a/mm2src/coins/utxo/utxo_standard.rs b/mm2src/coins/utxo/utxo_standard.rs index 43cfc24bf0..0d96540b34 100644 --- a/mm2src/coins/utxo/utxo_standard.rs +++ b/mm2src/coins/utxo/utxo_standard.rs @@ -812,7 +812,8 @@ impl TakerCoinSwapOpsV2 for UtxoStandardCoin { wait_until, 10., ) - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(res) } diff --git a/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs b/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs index 2b82e46c05..2f3f7221f3 100644 --- a/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs +++ b/mm2src/coins/z_coin/storage/blockdb/blockdb_idb_storage.rs @@ -90,14 +90,17 @@ impl BlockDbImpl { let block_db = db_transaction.table::().await.map_mm_err()?; let maybe_height = block_db .cursor_builder() - .only("ticker", &ticker).map_mm_err()? + .only("ticker", &ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .reverse() .where_first() .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await.map_mm_err()? + .await + .map_mm_err()? .next() - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(maybe_height.map(|(_, item)| item.height).unwrap_or_else(|| 0)) } @@ -110,8 +113,10 @@ impl BlockDbImpl { let block_db = db_transaction.table::().await.map_mm_err()?; let indexes = MultiIndex::new(BlockDbTable::TICKER_HEIGHT_INDEX) - .with_value(&ticker).map_mm_err()? - .with_value(BeBigUint::from(height)).map_mm_err()?; + .with_value(&ticker) + .map_mm_err()? + .with_value(BeBigUint::from(height)) + .map_mm_err()?; let block = BlockDbTable { height, data: cb_bytes, @@ -120,7 +125,8 @@ impl BlockDbImpl { Ok(block_db .add_item_or_ignore_by_unique_multi_index(indexes, &block) - .await.map_mm_err()? + .await + .map_mm_err()? .get_id() as usize) } @@ -133,23 +139,29 @@ impl BlockDbImpl { let blocks = block_db .cursor_builder() - .only("ticker", &self.ticker).map_mm_err()? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .reverse() .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await.map_mm_err()? + .await + .map_mm_err()? .collect() - .await.map_mm_err()?; + .await + .map_mm_err()?; for (_, block) in &blocks { if block.height > u32::from(height) { block_db .delete_item_by_unique_multi_index( MultiIndex::new(BlockDbTable::TICKER_HEIGHT_INDEX) - .with_value(&self.ticker).map_mm_err()? - .with_value(block.height).map_mm_err()?, + .with_value(&self.ticker) + .map_mm_err()? + .with_value(block.height) + .map_mm_err()?, ) - .await.map_mm_err()?; + .await + .map_mm_err()?; } } @@ -163,13 +175,16 @@ impl BlockDbImpl { let block_db = db_transaction.table::().await.map_mm_err()?; let maybe_min_block = block_db .cursor_builder() - .only("ticker", &self.ticker).map_mm_err()? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", 0u32, u32::MAX) .where_first() .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await.map_mm_err()? + .await + .map_mm_err()? .next() - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(maybe_min_block.map(|(_, b)| b.height).unwrap_or(0)) } @@ -189,10 +204,12 @@ impl BlockDbImpl { let min = u32::from(from_height + 1); let mut maybe_blocks = block_db .cursor_builder() - .only("ticker", &self.ticker).map_mm_err()? + .only("ticker", &self.ticker) + .map_mm_err()? .bound("height", min, u32::MAX) .open_cursor(BlockDbTable::TICKER_HEIGHT_INDEX) - .await.map_mm_err()?; + .await + .map_mm_err()?; let mut blocks_to_scan = vec![]; while let Some((_, block)) = maybe_blocks.next().await.map_mm_err()? { diff --git a/mm2src/coins_activation/src/eth_with_token_activation.rs b/mm2src/coins_activation/src/eth_with_token_activation.rs index 647e80b30d..6b2a9963a5 100644 --- a/mm2src/coins_activation/src/eth_with_token_activation.rs +++ b/mm2src/coins_activation/src/eth_with_token_activation.rs @@ -466,7 +466,8 @@ fn eth_priv_key_build_policy( }, #[cfg(target_arch = "wasm32")] EthPrivKeyActivationPolicy::Metamask => { - let metamask_ctx = crypto::CryptoCtx::from_ctx(ctx).map_mm_err()? + let metamask_ctx = crypto::CryptoCtx::from_ctx(ctx) + .map_mm_err()? .metamask_ctx() .or_mm_err(|| EthActivationV2Error::MetamaskError(MetamaskRpcError::MetamaskCtxNotInitialized))?; Ok(EthPrivKeyBuildPolicy::Metamask(metamask_ctx)) diff --git a/mm2src/coins_activation/src/init_erc20_token_activation.rs b/mm2src/coins_activation/src/init_erc20_token_activation.rs index fc73786357..491947e8bf 100644 --- a/mm2src/coins_activation/src/init_erc20_token_activation.rs +++ b/mm2src/coins_activation/src/init_erc20_token_activation.rs @@ -138,7 +138,8 @@ impl InitTokenActivationOps for EthCoin { protocol_conf, is_custom, ) - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(token) } @@ -156,7 +157,8 @@ impl InitTokenActivationOps for EthCoin { .current_block() .compat() .await - .map_to_mm(EthTokenActivationError::Transport).map_mm_err()?; + .map_to_mm(EthTokenActivationError::Transport) + .map_mm_err()?; let xpub_extractor = if self.is_trezor() { Some( @@ -172,15 +174,20 @@ impl InitTokenActivationOps for EthCoin { None }; - task_handle.update_in_progress_status(InitTokenInProgressStatus::RequestingWalletBalance).map_mm_err()?; + task_handle + .update_in_progress_status(InitTokenInProgressStatus::RequestingWalletBalance) + .map_mm_err()?; let wallet_balance = self .enable_coin_balance( xpub_extractor, activation_request.enable_params.clone(), &activation_request.path_to_address, ) - .await.map_mm_err()?; - task_handle.update_in_progress_status(InitTokenInProgressStatus::ActivatingCoin).map_mm_err()?; + .await + .map_mm_err()?; + task_handle + .update_in_progress_status(InitTokenInProgressStatus::ActivatingCoin) + .map_mm_err()?; let token_contract_address = self .erc20_token_address() diff --git a/mm2src/coins_activation/src/lightning_activation.rs b/mm2src/coins_activation/src/lightning_activation.rs index ad8f6be537..b23759e09c 100644 --- a/mm2src/coins_activation/src/lightning_activation.rs +++ b/mm2src/coins_activation/src/lightning_activation.rs @@ -276,7 +276,8 @@ impl InitL2ActivationOps for LightningCoin { activation_params.color.unwrap_or_else(|| "000000".into()), &mut node_color as &mut [u8], ) - .map_to_mm(|_| LightningValidationErr::InvalidRequest("Invalid Hex Color".into())).map_mm_err()?; + .map_to_mm(|_| LightningValidationErr::InvalidRequest("Invalid Hex Color".into())) + .map_mm_err()?; let listening_port = activation_params.listening_port.unwrap_or(DEFAULT_LISTENING_PORT); @@ -305,7 +306,8 @@ impl InitL2ActivationOps for LightningCoin { validated_params, task_handle, ) - .await.map_mm_err()?; + .await + .map_mm_err()?; Timer::sleep(10.).await; let address = lightning_coin.my_address().map_mm_err()?; @@ -344,7 +346,9 @@ async fn start_lightning( protocol_conf.network.clone(), protocol_conf.confirmation_targets, )?); - task_handle.update_in_progress_status(LightningInProgressStatus::GettingFeesFromRPC).map_mm_err()?; + task_handle + .update_in_progress_status(LightningInProgressStatus::GettingFeesFromRPC) + .map_mm_err()?; platform.set_latest_fees().await.map_mm_err()?; // Initialize the Logger @@ -357,7 +361,9 @@ async fn start_lightning( let keys_manager = init_keys_manager(&platform)?; // Initialize the P2PGossipSync. This is used for providing routes to send payments over - task_handle.update_in_progress_status(LightningInProgressStatus::ReadingNetworkGraphFromFile).map_mm_err()?; + task_handle + .update_in_progress_status(LightningInProgressStatus::ReadingNetworkGraphFromFile) + .map_mm_err()?; let network_graph = Arc::new( persister .get_network_graph(protocol_conf.network.into(), logger.clone()) @@ -374,7 +380,9 @@ async fn start_lightning( let db = init_db(ctx, conf.ticker.clone()).await?; // Initialize the ChannelManager - task_handle.update_in_progress_status(LightningInProgressStatus::InitializingChannelManager).map_mm_err()?; + task_handle + .update_in_progress_status(LightningInProgressStatus::InitializingChannelManager) + .map_mm_err()?; let (chain_monitor, channel_manager) = init_channel_manager( platform.clone(), logger.clone(), @@ -386,7 +394,9 @@ async fn start_lightning( .await?; // Initialize the PeerManager - task_handle.update_in_progress_status(LightningInProgressStatus::InitializingPeerManager).map_mm_err()?; + task_handle + .update_in_progress_status(LightningInProgressStatus::InitializingPeerManager) + .map_mm_err()?; let peer_manager = init_peer_manager( ctx.clone(), &platform, @@ -412,7 +422,9 @@ async fn start_lightning( )); // Initialize routing Scorer - task_handle.update_in_progress_status(LightningInProgressStatus::ReadingScorerFromFile).map_mm_err()?; + task_handle + .update_in_progress_status(LightningInProgressStatus::ReadingScorerFromFile) + .map_mm_err()?; // status_notifier // .try_send(LightningInProgressStatus::ReadingScorerFromFile) // .debug_log_with_msg("No one seems interested in LightningInProgressStatus"); @@ -445,7 +457,9 @@ async fn start_lightning( // InvoicePayer will act as our event handler as it handles some of the payments related events before // delegating it to LightningEventHandler. // note: background_processor stops automatically when dropped since BackgroundProcessor implements the Drop trait. - task_handle.update_in_progress_status(LightningInProgressStatus::InitializingBackgroundProcessor).map_mm_err()?; + task_handle + .update_in_progress_status(LightningInProgressStatus::InitializingBackgroundProcessor) + .map_mm_err()?; let background_processor = Arc::new(BackgroundProcessor::start( persister.clone(), invoice_payer.clone(), @@ -458,7 +472,9 @@ async fn start_lightning( )); // If channel_nodes_data file exists, read channels nodes data from disk and reconnect to channel nodes/peers if possible. - task_handle.update_in_progress_status(LightningInProgressStatus::ReadingChannelsAddressesFromFile).map_mm_err()?; + task_handle + .update_in_progress_status(LightningInProgressStatus::ReadingChannelsAddressesFromFile) + .map_mm_err()?; let open_channels_nodes = Arc::new(PaMutex::new( get_open_channels_nodes_addresses(persister.clone(), channel_manager.clone()).await?, )); diff --git a/mm2src/coins_activation/src/utxo_activation/common_impl.rs b/mm2src/coins_activation/src/utxo_activation/common_impl.rs index 5dbbd34501..589efa5b08 100644 --- a/mm2src/coins_activation/src/utxo_activation/common_impl.rs +++ b/mm2src/coins_activation/src/utxo_activation/common_impl.rs @@ -55,7 +55,9 @@ where } else { None }; - task_handle.update_in_progress_status(UtxoStandardInProgressStatus::RequestingWalletBalance).map_mm_err()?; + task_handle + .update_in_progress_status(UtxoStandardInProgressStatus::RequestingWalletBalance) + .map_mm_err()?; let wallet_balance = coin .enable_coin_balance( xpub_extractor, @@ -64,7 +66,9 @@ where ) .await .mm_err(|enable_err| InitUtxoStandardError::from_enable_coin_balance_err(enable_err, ticker.clone()))?; - task_handle.update_in_progress_status(UtxoStandardInProgressStatus::ActivatingCoin).map_mm_err()?; + task_handle + .update_in_progress_status(UtxoStandardInProgressStatus::ActivatingCoin) + .map_mm_err()?; let result = UtxoStandardActivationResult { ticker, diff --git a/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs b/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs index 8f2d178556..35c1a32cc5 100644 --- a/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs +++ b/mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs @@ -77,7 +77,8 @@ impl InitStandaloneCoinActivationOps for BchCoin { error: format!("Couldn't parse cash address prefix: {e:?}"), } })?; - let priv_key_policy = priv_key_build_policy(&ctx, activation_request.utxo_params.priv_key_policy).map_mm_err()?; + let priv_key_policy = + priv_key_build_policy(&ctx, activation_request.utxo_params.priv_key_policy).map_mm_err()?; let bchd_urls = activation_request.bchd_urls.clone(); let constructor = { move |utxo_arc| BchCoin::new(utxo_arc, prefix.clone(), bchd_urls.clone()) }; diff --git a/mm2src/coins_activation/src/z_coin_activation.rs b/mm2src/coins_activation/src/z_coin_activation.rs index ef17bdfc67..ff9df16119 100644 --- a/mm2src/coins_activation/src/z_coin_activation.rs +++ b/mm2src/coins_activation/src/z_coin_activation.rs @@ -278,7 +278,9 @@ impl InitStandaloneCoinActivationOps for ZCoin { task_handle: ZcoinRpcTaskHandleShared, _activation_request: &Self::ActivationRequest, ) -> MmResult { - task_handle.update_in_progress_status(ZcoinInProgressStatus::RequestingWalletBalance).map_mm_err()?; + task_handle + .update_in_progress_status(ZcoinInProgressStatus::RequestingWalletBalance) + .map_mm_err()?; let current_block = self .current_block() .compat() diff --git a/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs b/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs index 14706dc6f3..bd051b3dc3 100644 --- a/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs +++ b/mm2src/mm2_gui_storage/src/account/storage/wasm_storage.rs @@ -82,7 +82,8 @@ impl WasmAccountStorage { let table = db_transaction.table::().await.map_mm_err()?; table .get_all_items() - .await.map_mm_err()? + .await + .map_mm_err()? .into_iter() .map(|(_item_id, account)| { let account_info = AccountInfo::try_from(account)?; @@ -130,7 +131,8 @@ impl WasmAccountStorage { let index_keys = AccountTable::account_id_to_index(account_id)?; table .get_item_by_unique_multi_index(index_keys) - .await.map_mm_err()? + .await + .map_mm_err()? .map(|(_item_id, account)| AccountWithCoins::try_from(account)) .transpose() } @@ -176,7 +178,8 @@ impl WasmAccountStorage { let index_keys = AccountTable::account_id_to_index(&account_id)?; let (item_id, mut account) = table .get_item_by_unique_multi_index(index_keys) - .await.map_mm_err()? + .await + .map_mm_err()? .or_mm_err(|| AccountStorageError::NoSuchAccount(account_id))?; f(&mut account); table.replace_item(item_id, &account).await.map_mm_err()?; @@ -267,7 +270,10 @@ impl AccountStorage for WasmAccountStorage { // Remove the previous enabled account by clearing the table. table.clear().await.map_mm_err()?; - table.add_item(&EnabledAccountTable::from(enabled_account_id)).await.map_mm_err()?; + table + .add_item(&EnabledAccountTable::from(enabled_account_id)) + .await + .map_mm_err()?; Ok(()) } @@ -378,9 +384,12 @@ impl AccountTable { let (account_type, account_idx, device_pubkey) = account_id.to_tuple(); let multi_index = MultiIndex::new(AccountTable::ACCOUNT_ID_INDEX) - .with_value(account_type).map_mm_err()? - .with_value(account_idx).map_mm_err()? - .with_value(device_pubkey).map_mm_err()?; + .with_value(account_type) + .map_mm_err()? + .with_value(account_idx) + .map_mm_err()? + .with_value(device_pubkey) + .map_mm_err()?; Ok(multi_index) } } diff --git a/mm2src/mm2_main/src/lp_init/init_hw.rs b/mm2src/mm2_main/src/lp_init/init_hw.rs index dba0a8f0d1..77375928d9 100644 --- a/mm2src/mm2_main/src/lp_init/init_hw.rs +++ b/mm2src/mm2_main/src/lp_init/init_hw.rs @@ -154,7 +154,8 @@ impl RpcTask for InitHwTask { let trezor_connect_processor = Arc::new(trezor_connect_processor); let (device_info, hw_ctx) = crypto_ctx .init_hw_ctx_with_trezor(trezor_connect_processor, self.req.device_pubkey) - .await.map_mm_err()?; + .await + .map_mm_err()?; let device_pubkey = hw_ctx.hw_pubkey(); Ok(InitHwResponse { device_info, @@ -174,7 +175,8 @@ pub async fn init_trezor(ctx: MmArc, req: RpcInitReq) -> MmResult hw_wallet_type: HwWalletType::Trezor, req, }; - let task_id = RpcTaskManager::spawn_rpc_task(&init_ctx.init_hw_task_manager, &spawner, task, client_id).map_mm_err()?; + let task_id = + RpcTaskManager::spawn_rpc_task(&init_ctx.init_hw_task_manager, &spawner, task, client_id).map_mm_err()?; Ok(InitRpcTaskResponse { task_id }) } diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 959a3bb4fb..c2eee6f650 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -318,7 +318,8 @@ async fn process_orders_keep_alive( P2PRequest::Ordermatch(req), propagated_from_peer.clone(), ) - .await.map_mm_err()? + .await + .map_mm_err()? .ok_or_else(|| { MmError::new(OrderbookP2PHandlerError::P2PRequestError(format!( "No response was received from peer {} for SyncPubkeyOrderbookState request!", diff --git a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs index 4448d360f5..5b865d1020 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs @@ -421,7 +421,8 @@ mod wasm_impl { table .get_item_by_unique_index("uuid", uuid) - .await.map_mm_err()? + .await + .map_mm_err()? .map(|(_item_id, MyActiveMakerOrdersTable { order_payload, .. })| order_payload) .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } @@ -488,7 +489,10 @@ mod wasm_impl { uuid: order.uuid, order_payload: order.clone(), }; - table.replace_item_by_unique_index("uuid", order.uuid, &item).await.map_mm_err()?; + table + .replace_item_by_unique_index("uuid", order.uuid, &item) + .await + .map_mm_err()?; Ok(()) } @@ -503,7 +507,8 @@ mod wasm_impl { }; table .replace_item_by_unique_index("uuid", order.request.uuid, &item) - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(()) } } @@ -530,7 +535,8 @@ mod wasm_impl { table .get_item_by_unique_index("uuid", uuid) - .await.map_mm_err()? + .await + .map_mm_err()? .map(|(_item_id, MyHistoryOrdersTable { order_payload, .. })| order_payload) .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } @@ -552,11 +558,15 @@ mod wasm_impl { async fn select_order_status(&self, uuid: Uuid) -> MyOrdersResult { let db = self.ctx.ordermatch_db().await.map_mm_err()?; let transaction = db.transaction().await.map_mm_err()?; - let table = transaction.table::().await.map_mm_err()?; + let table = transaction + .table::() + .await + .map_mm_err()?; table .get_item_by_unique_index("uuid", uuid) - .await.map_mm_err()? + .await + .map_mm_err()? .map(|(_item_id, MyFilteringHistoryOrdersTable { status, .. })| status) .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid }) } @@ -566,7 +576,10 @@ mod wasm_impl { let db = self.ctx.ordermatch_db().await.map_mm_err()?; let transaction = db.transaction().await.map_mm_err()?; - let table = transaction.table::().await.map_mm_err()?; + let table = transaction + .table::() + .await + .map_mm_err()?; table.add_item(&item).await.map_mm_err()?; Ok(()) } @@ -576,7 +589,10 @@ mod wasm_impl { let db = self.ctx.ordermatch_db().await.map_mm_err()?; let transaction = db.transaction().await.map_mm_err()?; - let table = transaction.table::().await.map_mm_err()?; + let table = transaction + .table::() + .await + .map_mm_err()?; table.add_item(&item).await.map_mm_err()?; Ok(()) } @@ -584,11 +600,15 @@ mod wasm_impl { async fn update_maker_order_in_filtering_history(&self, order: &MakerOrder) -> MyOrdersResult<()> { let db = self.ctx.ordermatch_db().await.map_mm_err()?; let transaction = db.transaction().await.map_mm_err()?; - let table = transaction.table::().await.map_mm_err()?; + let table = transaction + .table::() + .await + .map_mm_err()?; // get the previous item to see if the order was taker let (item_id, prev_item) = table .get_item_by_unique_index("uuid", order.uuid) - .await.map_mm_err()? + .await + .map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid: order.uuid })?; let item = maker_order_to_filtering_history_item(order, "Updated".to_owned(), prev_item.was_taker)?; @@ -599,11 +619,15 @@ mod wasm_impl { async fn update_order_status_in_filtering_history(&self, uuid: Uuid, status: String) -> MyOrdersResult<()> { let db = self.ctx.ordermatch_db().await.map_mm_err()?; let transaction = db.transaction().await.map_mm_err()?; - let table = transaction.table::().await.map_mm_err()?; + let table = transaction + .table::() + .await + .map_mm_err()?; let (item_id, mut item) = table .get_item_by_unique_index("uuid", uuid) - .await.map_mm_err()? + .await + .map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid })?; item.status = status; @@ -614,11 +638,15 @@ mod wasm_impl { async fn update_was_taker_in_filtering_history(&self, uuid: Uuid) -> MyOrdersResult<()> { let db = self.ctx.ordermatch_db().await.map_mm_err()?; let transaction = db.transaction().await.map_mm_err()?; - let table = transaction.table::().await.map_mm_err()?; + let table = transaction + .table::() + .await + .map_mm_err()?; let (item_id, mut item) = table .get_item_by_unique_index("uuid", uuid) - .await.map_mm_err()? + .await + .map_mm_err()? .or_mm_err(|| MyOrdersError::NoSuchOrder { uuid })?; item.was_taker = true; diff --git a/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs b/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs index 7aaef65ef5..78aca5278d 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs @@ -356,8 +356,12 @@ async fn vwap_calculator( ctx: &MmArc, cfg: &SimpleCoinMarketMakerCfg, ) -> VwapProcessingResult { - let base_swaps = latest_swaps_for_pair(ctx.clone(), cfg.base.clone(), cfg.rel.clone(), LATEST_SWAPS_LIMIT).await.map_mm_err()?; - let rel_swaps = latest_swaps_for_pair(ctx.clone(), cfg.rel.clone(), cfg.base.clone(), LATEST_SWAPS_LIMIT).await.map_mm_err()?; + let base_swaps = latest_swaps_for_pair(ctx.clone(), cfg.base.clone(), cfg.rel.clone(), LATEST_SWAPS_LIMIT) + .await + .map_mm_err()?; + let rel_swaps = latest_swaps_for_pair(ctx.clone(), cfg.rel.clone(), cfg.base.clone(), LATEST_SWAPS_LIMIT) + .await + .map_mm_err()?; Ok(vwap(base_swaps, rel_swaps, calculated_price, cfg).await) } diff --git a/mm2src/mm2_main/src/lp_swap/maker_swap.rs b/mm2src/mm2_main/src/lp_swap/maker_swap.rs index 6b7b4be845..76d933a857 100644 --- a/mm2src/mm2_main/src/lp_swap/maker_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/maker_swap.rs @@ -2295,7 +2295,8 @@ pub async fn maker_swap_trade_preimage( let volume = if req.max { let balance = base_coin.my_spendable_balance().compat().await.map_mm_err()?; calc_max_maker_vol(ctx, &base_coin, &balance, FeeApproxStage::TradePreimage) - .await.map_mm_err()? + .await + .map_mm_err()? .volume } else { let threshold = base_coin.min_trading_vol().to_decimal(); @@ -2323,7 +2324,9 @@ pub async fn maker_swap_trade_preimage( if req.max { // Note the `calc_max_maker_vol` returns [`CheckBalanceError::NotSufficientBalance`] error if the balance of `base_coin` is not sufficient. // So we have to check the balance of the other coin only. - check_other_coin_balance_for_swap(ctx, rel_coin.deref(), None, rel_coin_fee.clone()).await.map_mm_err()? + check_other_coin_balance_for_swap(ctx, rel_coin.deref(), None, rel_coin_fee.clone()) + .await + .map_mm_err()? } else { let prepared_params = MakerSwapPreparedParams { maker_payment_trade_fee: base_coin_fee.clone(), @@ -2338,7 +2341,8 @@ pub async fn maker_swap_trade_preimage( Some(prepared_params), FeeApproxStage::TradePreimage, ) - .await.map_mm_err()?; + .await + .map_mm_err()?; } let conf_settings = OrderConfirmationsSettings { diff --git a/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs b/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs index 476fb8cb38..150e8b9489 100644 --- a/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs +++ b/mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs @@ -210,46 +210,50 @@ mod wasm_impl { } let items = match (&filter.my_coin, &filter.other_coin) { - (Some(my_coin), Some(other_coin)) => { - my_swaps_table - .cursor_builder() - .only("my_coin", my_coin).map_mm_err()? - .only("other_coin", other_coin).map_mm_err()? - .bound("started_at", from_timestamp, to_timestamp) - .open_cursor("with_my_other_coins") - .await.map_mm_err()? - .collect() - .await.map_mm_err()? - }, - (Some(my_coin), None) => { - my_swaps_table - .cursor_builder() - .only("my_coin", my_coin).map_mm_err()? - .bound("started_at", from_timestamp, to_timestamp) - .open_cursor("with_my_coin") - .await.map_mm_err()? - .collect() - .await.map_mm_err()? - }, - (None, Some(other_coin)) => { - my_swaps_table - .cursor_builder() - .only("other_coin", other_coin).map_mm_err()? - .bound("started_at", from_timestamp, to_timestamp) - .open_cursor("with_other_coin") - .await.map_mm_err()? - .collect() - .await.map_mm_err()? - }, - (None, None) => { - my_swaps_table - .cursor_builder() - .bound("started_at", from_timestamp, to_timestamp) - .open_cursor("started_at") - .await.map_mm_err()? - .collect() - .await.map_mm_err()? - }, + (Some(my_coin), Some(other_coin)) => my_swaps_table + .cursor_builder() + .only("my_coin", my_coin) + .map_mm_err()? + .only("other_coin", other_coin) + .map_mm_err()? + .bound("started_at", from_timestamp, to_timestamp) + .open_cursor("with_my_other_coins") + .await + .map_mm_err()? + .collect() + .await + .map_mm_err()?, + (Some(my_coin), None) => my_swaps_table + .cursor_builder() + .only("my_coin", my_coin) + .map_mm_err()? + .bound("started_at", from_timestamp, to_timestamp) + .open_cursor("with_my_coin") + .await + .map_mm_err()? + .collect() + .await + .map_mm_err()?, + (None, Some(other_coin)) => my_swaps_table + .cursor_builder() + .only("other_coin", other_coin) + .map_mm_err()? + .bound("started_at", from_timestamp, to_timestamp) + .open_cursor("with_other_coin") + .await + .map_mm_err()? + .collect() + .await + .map_mm_err()?, + (None, None) => my_swaps_table + .cursor_builder() + .bound("started_at", from_timestamp, to_timestamp) + .open_cursor("started_at") + .await + .map_mm_err()? + .collect() + .await + .map_mm_err()?, }; let uuids: BTreeSet = items diff --git a/mm2src/mm2_main/src/lp_swap/saved_swap.rs b/mm2src/mm2_main/src/lp_swap/saved_swap.rs index 4db0b968f4..ac7d8c161c 100644 --- a/mm2src/mm2_main/src/lp_swap/saved_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/saved_swap.rs @@ -282,9 +282,11 @@ mod wasm_impl { .reverse() .where_first() .open_cursor("migration") - .await.map_mm_err()? + .await + .map_mm_err()? .next() - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(migrations.map(|(_, m)| m.migration).unwrap_or_default()) } @@ -312,17 +314,23 @@ mod wasm_impl { }) .collect::, _>>()?; for swap in swaps { - let (filter_id, mut filter_record) = - match filters_table.get_item_by_unique_index("uuid", swap.uuid()).await.map_mm_err()? { - Some(f) => f, - None => { - warn!("No MySwapsFiltersTable for {}", swap.uuid()); - continue; - }, - }; + let (filter_id, mut filter_record) = match filters_table + .get_item_by_unique_index("uuid", swap.uuid()) + .await + .map_mm_err()? + { + Some(f) => f, + None => { + warn!("No MySwapsFiltersTable for {}", swap.uuid()); + continue; + }, + }; filter_record.swap_type = LEGACY_SWAP_TYPE; filter_record.is_finished = swap.is_finished().into(); - filters_table.replace_item(filter_id, &filter_record).await.map_mm_err()?; + filters_table + .replace_item(filter_id, &filter_record) + .await + .map_mm_err()?; } }, 1 => break, @@ -334,7 +342,10 @@ mod wasm_impl { }, } migration += 1; - migration_table.add_item(&SwapsMigrationTable { migration }).await.map_mm_err()?; + migration_table + .add_item(&SwapsMigrationTable { migration }) + .await + .map_mm_err()?; } info!("Swaps data migration is completed, new version {}", migration); @@ -419,7 +430,8 @@ mod wasm_impl { table .replace_item_by_unique_index("uuid", *self.uuid(), &saved_swap_item) - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(()) } } diff --git a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs index 0a1150d395..9ddd5f6b4c 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs @@ -159,7 +159,10 @@ pub(super) async fn store_swap_event MmResult, SwapStateMachineError> { let index = MultiIndex::new(IS_FINISHED_SWAP_TYPE_INDEX) - .with_value(BoolAsInt::new(false)).map_mm_err()? - .with_value(swap_type).map_mm_err()?; + .with_value(BoolAsInt::new(false)) + .map_mm_err()? + .with_value(swap_type) + .map_mm_err()?; let swaps_ctx = SwapsContext::from_ctx(&ctx).expect("SwapsContext::from_ctx should not fail"); let db = swaps_ctx.swap_db().await.map_mm_err()?; @@ -225,7 +230,10 @@ pub(super) async fn mark_swap_as_finished(ctx: MmArc, id: Uuid) -> MmResult<(), None => return MmError::err(SwapStateMachineError::NoSwapWithUuid(id)), }; item.is_finished = true.into(); - table.replace_item_by_unique_index("uuid", id, &item).await.map_mm_err()?; + table + .replace_item_by_unique_index("uuid", id, &item) + .await + .map_mm_err()?; Ok(()) } diff --git a/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs b/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs index 3c4e84a86c..4bcabc9226 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs @@ -198,7 +198,11 @@ pub(super) async fn get_maker_swap_data_for_rpc( }; let filters_table = transaction.table::().await.map_mm_err()?; - let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { + let filter_item = match filters_table + .get_item_by_unique_index("uuid", uuid) + .await + .map_mm_err()? + { Some((_item_id, item)) => item, None => return Ok(None), }; @@ -239,7 +243,11 @@ pub(super) async fn get_taker_swap_data_for_rpc( }; let filters_table = transaction.table::().await.map_mm_err()?; - let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await.map_mm_err()? { + let filter_item = match filters_table + .get_item_by_unique_index("uuid", uuid) + .await + .map_mm_err()? + { Some((_item_id, item)) => item, None => return Ok(None), }; @@ -367,10 +375,12 @@ pub(crate) async fn my_swap_status_rpc( req: MySwapStatusRequest, ) -> MmResult { let swap_type = get_swap_type(&ctx, &req.uuid) - .await.map_mm_err()? + .await + .map_mm_err()? .or_mm_err(|| MySwapStatusError::NoSwapWithUuid(req.uuid))?; get_swap_data_by_uuid_and_type(&ctx, req.uuid, swap_type) - .await.map_mm_err()? + .await + .map_mm_err()? .or_mm_err(|| MySwapStatusError::NoSwapWithUuid(req.uuid)) } @@ -429,7 +439,8 @@ pub(crate) async fn my_recent_swaps_rpc( ) -> MmResult { let db_result = MySwapsStorage::new(ctx.clone()) .my_recent_swaps_with_filters(&req.filter, Some(&req.paging_options)) - .await.map_mm_err()?; + .await + .map_mm_err()?; let mut swaps = Vec::with_capacity(db_result.uuids_and_types.len()); for (uuid, swap_type) in db_result.uuids_and_types.iter() { match get_swap_data_by_uuid_and_type(&ctx, *uuid, *swap_type).await { diff --git a/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs b/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs index c75b163250..32774397ea 100644 --- a/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs +++ b/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs @@ -114,7 +114,8 @@ pub(super) async fn save_encrypted_passphrase( }; table .replace_item_by_unique_index("wallet_name", wallet_name, &mnemonics_table_item) - .await.map_mm_err()?; + .await + .map_mm_err()?; Ok(()) } @@ -136,7 +137,8 @@ pub(super) async fn read_encrypted_passphrase_if_available(ctx: &MmArc) -> Walle .ok_or_else(|| WalletsDBError::Internal("`wallet_name` can't be None!".to_string()))?; table .get_item_by_unique_index("wallet_name", wallet_name) - .await.map_mm_err()? + .await + .map_mm_err()? .map(|(_item_id, wallet_table_item)| { serde_json::from_str(&wallet_table_item.encrypted_mnemonic).map_to_mm(|e| { WalletsDBError::DeserializationError { From f2713aae8d623f0c18592e25c94da27d186552ec Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 22:13:26 +0100 Subject: [PATCH 09/35] uncommit personal scripts --- apply_mm_err.py | 66 - clippy_errors.log | 4190 ------------------------------------------- scan_for_mm_errs.py | 61 - suggestions.txt | 195 -- 4 files changed, 4512 deletions(-) delete mode 100644 apply_mm_err.py delete mode 100644 clippy_errors.log delete mode 100644 scan_for_mm_errs.py delete mode 100644 suggestions.txt diff --git a/apply_mm_err.py b/apply_mm_err.py deleted file mode 100644 index 44245b3590..0000000000 --- a/apply_mm_err.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -import re -import sys -from collections import defaultdict - - -def parse_suggestions(sugg_text): - """ - Parse lines like: - path/to/file.rs:484 // append `.map_mm_err(GenTxError::from)?` - Returns a dict[file] -> list of (line_idx0, target) - """ - out = defaultdict(list) - for ln in sugg_text.splitlines(): - m = re.match(r"([^:]+):(\d+)\s+//\s+append `(.+?)`", ln) - if not m: - continue - path, lnum, call = m.groups() - # extract the part inside .map_mm_err(...): - # we'll drop the trailing '?' in the suggestion because we insert it back - call = call.rstrip("?") - out[path].append((int(lnum) - 1, call)) - return out - - -def apply_patches(patches): - """ - patches: dict[file] -> list of (lineno0, insert_call) - """ - for path, edits in patches.items(): - print(f"Patching {path}…") - # read all lines - with open(path, "r") as f: - lines = f.readlines() - - # apply each edit - for ln, call in edits: - if ln < 0 or ln >= len(lines): - print(f" ⚠️ invalid line {ln + 1}") - continue - orig = lines[ln] - # replace first occurrence of `)?` with `).map_mm_err()?` - new = re.sub(r"\?(?=\s|;|,|$)", ".map_mm_err()?", orig, count=1) - if new == orig: - print(f" ⚠️ no ')?' found on line {ln + 1}") - else: - lines[ln] = new - print(f" ✓ line {ln + 1}: inserted `.map_mm_err()`") - - # write back - with open(path, "w") as f: - f.writelines(lines) - - -def main(): - if len(sys.argv) != 2: - print("Usage: apply_map_mmerrs.py ", file=sys.stderr) - sys.exit(1) - - sugg_text = open(sys.argv[1]).read() - patches = parse_suggestions(sugg_text) - apply_patches(patches) - - -if __name__ == "__main__": - main() diff --git a/clippy_errors.log b/clippy_errors.log deleted file mode 100644 index eb21774aa2..0000000000 --- a/clippy_errors.log +++ /dev/null @@ -1,4190 +0,0 @@ -warning: /Users/borngraced/Work/komodefi/mm2src/mm2_bin_lib/Cargo.toml: file `/Users/borngraced/Work/komodefi/mm2src/mm2_bin_lib/src/mm2_bin.rs` found to be present in multiple build targets: - * `bin` target `mm2` - * `bin` target `kdf` -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -151 | impl_hash!(H32, 4); - | ------------------ in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: `#[warn(clippy::non_canonical_clone_impl)]` on by default - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -151 | impl_hash!(H32, 4); - | ------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -151 | impl_hash!(H32, 4); - | ------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: `#[warn(clippy::unconditional_recursion)]` on by default - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -151 | impl_hash!(H32, 4); - | ------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -151 | impl_hash!(H32, 4); - | ------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -152 | impl_hash!(H48, 6); - | ------------------ in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -152 | impl_hash!(H48, 6); - | ------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -152 | impl_hash!(H48, 6); - | ------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -152 | impl_hash!(H48, 6); - | ------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -152 | impl_hash!(H48, 6); - | ------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -153 | impl_hash!(H64, 8); - | ------------------ in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -153 | impl_hash!(H64, 8); - | ------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -153 | impl_hash!(H64, 8); - | ------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -153 | impl_hash!(H64, 8); - | ------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -153 | impl_hash!(H64, 8); - | ------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -154 | impl_hash!(H96, 12); - | ------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -154 | impl_hash!(H96, 12); - | ------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -154 | impl_hash!(H96, 12); - | ------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -154 | impl_hash!(H96, 12); - | ------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -154 | impl_hash!(H96, 12); - | ------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -155 | impl_hash!(H128, 16); - | -------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -155 | impl_hash!(H128, 16); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -155 | impl_hash!(H128, 16); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -155 | impl_hash!(H128, 16); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -155 | impl_hash!(H128, 16); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -156 | impl_hash!(H160, 20); - | -------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -156 | impl_hash!(H160, 20); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -156 | impl_hash!(H160, 20); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -156 | impl_hash!(H160, 20); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -156 | impl_hash!(H160, 20); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -157 | impl_hash!(H256, 32); - | -------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -157 | impl_hash!(H256, 32); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -157 | impl_hash!(H256, 32); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -157 | impl_hash!(H256, 32); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -157 | impl_hash!(H256, 32); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -158 | impl_hash!(H264, 33); - | -------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -158 | impl_hash!(H264, 33); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -158 | impl_hash!(H264, 33); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -158 | impl_hash!(H264, 33); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -158 | impl_hash!(H264, 33); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -159 | impl_hash!(H512, 64); - | -------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -159 | impl_hash!(H512, 64); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -159 | impl_hash!(H512, 64); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -159 | impl_hash!(H512, 64); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -159 | impl_hash!(H512, 64); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -160 | impl_hash!(H520, 65); - | -------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -160 | impl_hash!(H520, 65); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -160 | impl_hash!(H520, 65); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -160 | impl_hash!(H520, 65); - | -------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -160 | impl_hash!(H520, 65); - | -------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -161 | impl_hash!(OutCipherText, 80); - | ----------------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -161 | impl_hash!(OutCipherText, 80); - | ----------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -161 | impl_hash!(OutCipherText, 80); - | ----------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -161 | impl_hash!(OutCipherText, 80); - | ----------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -161 | impl_hash!(OutCipherText, 80); - | ----------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -162 | impl_hash!(ZkProofSapling, 192); - | ------------------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -162 | impl_hash!(ZkProofSapling, 192); - | ------------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -162 | impl_hash!(ZkProofSapling, 192); - | ------------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -162 | impl_hash!(ZkProofSapling, 192); - | ------------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -162 | impl_hash!(ZkProofSapling, 192); - | ------------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -163 | impl_hash!(ZkProof, 296); - | ------------------------ in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -163 | impl_hash!(ZkProof, 296); - | ------------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -163 | impl_hash!(ZkProof, 296); - | ------------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -163 | impl_hash!(ZkProof, 296); - | ------------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -163 | impl_hash!(ZkProof, 296); - | ------------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -164 | impl_hash!(EncCipherText, 580); - | ------------------------------ in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -164 | impl_hash!(EncCipherText, 580); - | ------------------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -164 | impl_hash!(EncCipherText, 580); - | ------------------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -164 | impl_hash!(EncCipherText, 580); - | ------------------------------ in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -164 | impl_hash!(EncCipherText, 580); - | ------------------------------ in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -165 | impl_hash!(CipherText, 601); - | --------------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -165 | impl_hash!(CipherText, 601); - | --------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -165 | impl_hash!(CipherText, 601); - | --------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -165 | impl_hash!(CipherText, 601); - | --------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -165 | impl_hash!(CipherText, 601); - | --------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `clone` on a `Copy` type - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:28:37 - | -28 | fn clone(&self) -> Self { - | _____________________________________^ -29 | | let mut result = Self::default(); -30 | | result.copy_from_slice(&self.0); -31 | | result -32 | | } - | |_____________^ help: change this to: `{ *self }` -... -166 | impl_hash!(EquihashSolution, 1344); - | ---------------------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_clone_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:90:13 - | -90 | / fn eq(&self, other: &Self) -> bool { -91 | | let self_ref: &[u8] = &self.0; -92 | | let other_ref: &[u8] = &other.0; -93 | | self_ref == other_ref -94 | | } - | |_____________^ -... -166 | impl_hash!(EquihashSolution, 1344); - | ---------------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:93:17 - | -93 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -166 | impl_hash!(EquihashSolution, 1344); - | ---------------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:98:13 - | -98 | / fn eq(&self, other: &&Self) -> bool { -99 | | let self_ref: &[u8] = &self.0; -100 | | let other_ref: &[u8] = &other.0; -101 | | self_ref == other_ref -102 | | } - | |_____________^ -... -166 | impl_hash!(EquihashSolution, 1344); - | ---------------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/primitives/src/hash.rs:101:17 - | -101 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -166 | impl_hash!(EquihashSolution, 1344); - | ---------------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: `primitives` (lib) generated 48 warnings -warning: cross-crate traits with a default impl, like `mm_error::NotMmError`, should not be specialized - --> mm2src/mm2_err_handle/src/mm_error.rs:110:1 - | -110 | impl NotMmError for Arc {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = warning: this will change its meaning in a future release! - = note: for more information, see issue #93367 - = note: `std::alloc::Global` is not a generic parameter -note: try using the same sequence of generic parameters as the struct definition - --> /Users/borngraced/.rustup/toolchains/nightly-2024-01-05-aarch64-apple-darwin/lib/rustlib/src/rust/library/alloc/src/sync.rs:248:1 - | -248 | / pub struct Arc< -249 | | T: ?Sized, -250 | | #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global, -251 | | > { - | |_^ - = note: `#[warn(suspicious_auto_trait_impls)]` on by default - -warning: cross-crate traits with a default impl, like `mm_error::NotEqual`, should not be specialized - --> mm2src/mm2_err_handle/src/mm_error.rs:121:1 - | -121 | impl NotEqual for Arc {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = warning: this will change its meaning in a future release! - = note: for more information, see issue #93367 - = note: `std::alloc::Global` is not a generic parameter -note: try using the same sequence of generic parameters as the struct definition - --> /Users/borngraced/.rustup/toolchains/nightly-2024-01-05-aarch64-apple-darwin/lib/rustlib/src/rust/library/alloc/src/sync.rs:248:1 - | -248 | / pub struct Arc< -249 | | T: ?Sized, -250 | | #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global, -251 | | > { - | |_^ - -warning: `mm2_err_handle` (lib) generated 2 warnings -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/keys/src/public.rs:97:5 - | -97 | / fn eq(&self, other: &Self) -> bool { -98 | | let s_slice: &[u8] = self; -99 | | let o_slice: &[u8] = other; -100 | | s_slice == o_slice -101 | | } - | |_____^ - | -note: recursive call site - --> mm2src/mm2_bitcoin/keys/src/public.rs:100:9 - | -100 | s_slice == o_slice - | ^^^^^^^^^^^^^^^^^^ - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: `#[warn(clippy::unconditional_recursion)]` on by default - -warning: `keys` (lib) generated 1 warning -warning: this OR pattern can be rewritten using a range - --> mm2src/mm2_bitcoin/script/src/sign.rs:85:21 - | -85 | matches!(u, 1 | 2 | 3) - | ^^^^^^^^^ help: try: `1..=3` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_patterns - = note: `#[warn(clippy::manual_range_patterns)]` on by default - -warning: `script` (lib) generated 1 warning (run `cargo clippy --fix --lib -p script` to apply 1 suggestion) -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:126:13 - | -126 | / fn eq(&self, other: &Self) -> bool { -127 | | let self_ref: &[u8] = &self.0; -128 | | let other_ref: &[u8] = &other.0; -129 | | self_ref == other_ref -130 | | } - | |_____________^ -... -216 | impl_hash!(H264, GlobalH264, 33); - | -------------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:129:17 - | -129 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -216 | impl_hash!(H264, GlobalH264, 33); - | -------------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: `#[warn(clippy::unconditional_recursion)]` on by default - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `partial_cmp` on an `Ord` type - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:133:9 - | -133 | / impl PartialOrd for $name { -134 | | fn partial_cmp(&self, other: &Self) -> Option { - | | _____________________________________________________________________- -135 | || let self_ref: &[u8] = &self.0; -136 | || let other_ref: &[u8] = &other.0; -137 | || self_ref.partial_cmp(other_ref) -138 | || } - | ||_____________- help: change this to: `{ Some(self.cmp(other)) }` -139 | | } - | |__________^ -... -216 | impl_hash!(H264, GlobalH264, 33); - | -------------------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_partial_ord_impl - = note: `#[warn(clippy::non_canonical_partial_ord_impl)]` on by default - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:126:13 - | -126 | / fn eq(&self, other: &Self) -> bool { -127 | | let self_ref: &[u8] = &self.0; -128 | | let other_ref: &[u8] = &other.0; -129 | | self_ref == other_ref -130 | | } - | |_____________^ -... -217 | impl_hash!(H256, GlobalH256, 32); - | -------------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:129:17 - | -129 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -217 | impl_hash!(H256, GlobalH256, 32); - | -------------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `partial_cmp` on an `Ord` type - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:133:9 - | -133 | / impl PartialOrd for $name { -134 | | fn partial_cmp(&self, other: &Self) -> Option { - | | _____________________________________________________________________- -135 | || let self_ref: &[u8] = &self.0; -136 | || let other_ref: &[u8] = &other.0; -137 | || self_ref.partial_cmp(other_ref) -138 | || } - | ||_____________- help: change this to: `{ Some(self.cmp(other)) }` -139 | | } - | |__________^ -... -217 | impl_hash!(H256, GlobalH256, 32); - | -------------------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_partial_ord_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: function cannot return without recursing - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:126:13 - | -126 | / fn eq(&self, other: &Self) -> bool { -127 | | let self_ref: &[u8] = &self.0; -128 | | let other_ref: &[u8] = &other.0; -129 | | self_ref == other_ref -130 | | } - | |_____________^ -... -218 | impl_hash!(H160, GlobalH160, 20); - | -------------------------------- in this macro invocation - | -note: recursive call site - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:129:17 - | -129 | self_ref == other_ref - | ^^^^^^^^^^^^^^^^^^^^^ -... -218 | impl_hash!(H160, GlobalH160, 20); - | -------------------------------- in this macro invocation - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unconditional_recursion - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: non-canonical implementation of `partial_cmp` on an `Ord` type - --> mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs:133:9 - | -133 | / impl PartialOrd for $name { -134 | | fn partial_cmp(&self, other: &Self) -> Option { - | | _____________________________________________________________________- -135 | || let self_ref: &[u8] = &self.0; -136 | || let other_ref: &[u8] = &other.0; -137 | || self_ref.partial_cmp(other_ref) -138 | || } - | ||_____________- help: change this to: `{ Some(self.cmp(other)) }` -139 | | } - | |__________^ -... -218 | impl_hash!(H160, GlobalH160, 20); - | -------------------------------- in this macro invocation - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_partial_ord_impl - = note: this warning originates in the macro `impl_hash` (in Nightly builds, run with -Z macro-backtrace for more info) - -warning: `rpc` (lib) generated 6 warnings -warning: use of `or_insert_with` to construct default value - --> mm2src/mm2_metrics/src/mm_metrics.rs:195:10 - | -195 | .or_insert_with(MetricNameValueMap::new) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `or_default()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default - = note: `#[warn(clippy::unwrap_or_default)]` on by default - -warning: `mm2_metrics` (lib) generated 1 warning (run `cargo clippy --fix --lib -p mm2_metrics` to apply 1 suggestion) -warning: unit tests in doctest are not executed - --> mm2src/derives/enum_derives/src/lib.rs:108:5 - | -108 | /// #[test] - | _____^ -109 | | /// fn test_from_stringify() { - | |__________________________^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#test_attr_in_doctest - = note: `#[warn(clippy::test_attr_in_doctest)]` on by default - -warning: `enum_derives` (lib) generated 1 warning -warning: redundant guard - --> mm2src/mm2_net/src/wasm/wasm_ws.rs:751:69 - | -751 | Some((_conn_idx, WebSocketEvent::Closed { reason })) if reason == ClosureReason::NormalClosure => (), - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_guards - = note: `#[warn(clippy::redundant_guards)]` on by default -help: try - | -751 - Some((_conn_idx, WebSocketEvent::Closed { reason })) if reason == ClosureReason::NormalClosure => (), -751 + Some((_conn_idx, WebSocketEvent::Closed { reason: ClosureReason::NormalClosure })) => (), - | - -warning: `mm2_net` (lib) generated 1 warning -warning: unneeded `return` statement with `?` operator - --> mm2src/mm2_eth/src/eip712_encode.rs:147:9 - | -147 | return Err(decode_error("Expected 0x-prefixed address (20 bytes)", field_name))?; - | ^^^^^^^ help: remove it - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return_with_question_mark - = note: `#[warn(clippy::needless_return_with_question_mark)]` on by default - -warning: `mm2_eth` (lib) generated 1 warning (run `cargo clippy --fix --lib -p mm2_eth` to apply 1 suggestion) -warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do - --> mm2src/mm2_db/src/indexed_db/drivers/cursor/multi_key_bound_cursor.rs:31:22 - | -31 | only_values: &Vec<(String, Json)>, - | ^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[(String, Json)]` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg - = note: `#[warn(clippy::ptr_arg)]` on by default - -warning: unnecessarily eager cloning of iterator items - --> mm2src/mm2_db/src/indexed_db/indexed_cursor.rs:426:32 - | -426 | let expected = numbers - | _________________________________^ -427 | | .iter() - | | ____________________________- -428 | || .cloned() -429 | || .filter(|num| num_x <= num && num <= num_y) - | ||_______________________________________________________________^ - | |_______________________________________________________________| - | help: try: `.filter(|&num| num_x <= num && num <= num_y).cloned()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_overeager_cloned - = note: `#[warn(clippy::iter_overeager_cloned)]` on by default - -warning: `mm2_db` (lib) generated 2 warnings (run `cargo clippy --fix --lib -p mm2_db` to apply 1 suggestion) -warning: unused import: `tendermint_rpc::query::Query as TendermintQuery` - --> mm2src/coins/tendermint/rpc/tendermint_wasm_rpc.rs:17:9 - | -17 | pub use tendermint_rpc::query::Query as TendermintQuery; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default - -warning: `&` without an explicit lifetime name cannot be used here - --> mm2src/coins/utxo/utxo_block_header_storage/wasm/block_header_table.rs:13:36 - | -13 | pub const TICKER_HEIGHT_INDEX: &str = "block_height_ticker_index"; - | ^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #115010 - = note: `#[warn(elided_lifetimes_in_associated_constant)]` on by default -help: use the `'static` lifetime - | -13 | pub const TICKER_HEIGHT_INDEX: &'static str = "block_height_ticker_index"; - | +++++++ - -warning: `&` without an explicit lifetime name cannot be used here - --> mm2src/coins/utxo/utxo_block_header_storage/wasm/block_header_table.rs:14:34 - | -14 | pub const HASH_TICKER_INDEX: &str = "block_hash_ticker_index"; - | ^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #115010 -help: use the `'static` lifetime - | -14 | pub const HASH_TICKER_INDEX: &'static str = "block_hash_ticker_index"; - | +++++++ - -warning: unused imports: `AddressHashEnum`, `AddressScriptType`, `Public`, `Secret` - --> mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs:23:77 - | -23 | ...sBuilder, AddressFormat as UtxoAddressFormat, AddressHashEnum, AddressScriptTy... - | ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ -24 | ...e, Public, Secret}; - | ^^^^^^ ^^^^^^ - -warning: unused imports: `AddressHashEnum`, `AddressScriptType`, `Address`, `KeyPair`, `Private`, `Public`, `Secret` - --> mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs:9:16 - | -9 | ...::{Address, AddressFormat as UtxoAddressFormat, AddressHashEnum, AddressScriptType, KeyPair, Priva... - | ^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^ ^^^^^^^ -10 | ... Public, Secret}; - | ^^^^^^ ^^^^^^ - -warning: `&` without an explicit lifetime name cannot be used here - --> mm2src/coins/z_coin/storage/walletdb/wasm/tables.rs:16:37 - | -16 | pub const TICKER_ACCOUNT_INDEX: &str = "ticker_account_index"; - | ^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #115010 -help: use the `'static` lifetime - | -16 | pub const TICKER_ACCOUNT_INDEX: &'static str = "ticker_account_index"; - | +++++++ - -warning: `&` without an explicit lifetime name cannot be used here - --> mm2src/coins/z_coin/storage/walletdb/wasm/tables.rs:21:44 - | -21 | pub const TICKER_ACCOUNT_EXTFVK_INDEX: &str = "ticker_account_extfvk_index"; - | ^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #115010 -help: use the `'static` lifetime - | -21 | pub const TICKER_ACCOUNT_EXTFVK_INDEX: &'static str = "ticker_account_extfvk_index"; - | +++++++ - -warning: `&` without an explicit lifetime name cannot be used here - --> mm2src/coins/z_coin/storage/z_params/indexeddb.rs:27:31 - | -27 | const SPEND_OUTPUT_INDEX: &str = "sapling_spend_sapling_output_index"; - | ^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #115010 -help: use the `'static` lifetime - | -27 | const SPEND_OUTPUT_INDEX: &'static str = "sapling_spend_sapling_output_index"; - | +++++++ - -warning: `&` without an explicit lifetime name cannot be used here - --> mm2src/coins/lp_coins.rs:3798:26 - | -3798 | const DEX_FEE_SHARE: &str = "0.75"; - | ^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #115010 -help: use the `'static` lifetime - | -3798 | const DEX_FEE_SHARE: &'static str = "0.75"; - | +++++++ - -warning: the feature `local_key_cell_methods` has been stable since 1.73.0 and no longer requires an attribute to enable - --> mm2src/coins/lp_coins.rs:35:12 - | -35 | #![feature(local_key_cell_methods)] // for tests - | ^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(stable_features)]` on by default - -warning: use of `or_insert_with` to construct default value - --> mm2src/coins/eth/eth_balance_events.rs:202:34 - | -202 | ... .or_insert_with(HashMap::new) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `or_default()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default - = note: `#[warn(clippy::unwrap_or_default)]` on by default - -warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do - --> mm2src/coins/eth/eth_swap_v2/mod.rs:205:34 - | -205 | ...ength(decoded: &Vec, expected_len: usize) -> Result<(), PrepareTxDat... - | ^^^^^^^^^^^ help: change this to: `&[Token]` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg - = note: `#[warn(clippy::ptr_arg)]` on by default - -warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` - --> mm2src/coins/eth.rs:5570:26 - | -5570 | .zip(web3_instances.into_iter()) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `web3_instances` - | -note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` - --> /Users/borngraced/.rustup/toolchains/nightly-2024-01-05-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:643:12 - | -643 | U: IntoIterator, - | ^^^^^^^^^^^^ - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion - = note: `#[warn(clippy::useless_conversion)]` on by default - -warning: use of a fallible conversion when an infallible one could be used - --> mm2src/coins/eth.rs:6380:34 - | -6380 | ...= try_s!(EthPrivKeyBuildPolicy::try_from(priv_key_policy)); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `From::from` - | - = note: converting `PrivKeyBuildPolicy` to `EthPrivKeyBuildPolicy` cannot fail - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_fallible_conversions - = note: `#[warn(clippy::unnecessary_fallible_conversions)]` on by default - -warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` - --> mm2src/coins/eth.rs:7093:25 - | -7093 | balances.extend(token_balances.into_iter()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `token_balances` - | -note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` - --> /Users/borngraced/.rustup/toolchains/nightly-2024-01-05-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/collect.rs:372:18 - | -372 | fn extend>(&mut self, iter: T); - | ^^^^^^^^^^^^^^^^^^^^^^ - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion - -warning: use of `or_insert_with` to construct default value - --> mm2src/coins/qrc20/history.rs:561:65 - | -561 | ...x_hash).or_insert_with(HashMap::default); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `or_default()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default - -warning: use of `or_insert_with` to construct default value - --> mm2src/coins/utxo/bch.rs:115:34 - | -115 | self.slp.entry(token_id).or_insert_with(Vec::new).push(slp_unspent); - | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `or_default()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default - -warning: accessing first element with `tx - .outputs.get(0)` - --> mm2src/coins/utxo/bch.rs:386:39 - | -386 | let maybe_op_return: Script = tx - | _______________________________________^ -387 | | .outputs -388 | | .get(0) - | |___________________^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - = note: `#[warn(clippy::get_first)]` on by default -help: try - | -386 ~ let maybe_op_return: Script = tx -387 + .outputs.first() - | - -warning: accessing first element with `receipt - .log.get(0)` - --> mm2src/coins/utxo/qtum_delegation.rs:185:21 - | -185 | / receipt -186 | | .log -187 | | .get(0) - | |_______________________________^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first -help: try - | -185 ~ receipt -186 + .log.first() - | - -warning: called `unwrap` on `final_response` after checking its variant with `is_some` - --> mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs:431:39 - | -430 | if !send_to_all && final_response.is_some() { - | ------------------------ the check is happening here -431 | return Ok(final_response.unwrap()); - | ^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: try using `if let` or `match` - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap - = note: `#[warn(clippy::unnecessary_unwrap)]` on by default - -warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` - --> mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs:738:43 - | -738 | serialized.extend(headers.hex.0.into_iter()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `headers.hex.0` - | -note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` - --> /Users/borngraced/.rustup/toolchains/nightly-2024-01-05-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/collect.rs:372:18 - | -372 | fn extend>(&mut self, iter: T); - | ^^^^^^^^^^^^^^^^^^^^^^ - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion - -warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` - --> mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs:1069:39 - | -1069 | serialized.extend(res.hex.0.into_iter()); - | ^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `res.hex.0` - | -note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` - --> /Users/borngraced/.rustup/toolchains/nightly-2024-01-05-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/collect.rs:372:18 - | -372 | fn extend>(&mut self, iter: T); - | ^^^^^^^^^^^^^^^^^^^^^^ - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion - -warning: usage of `bool::then` in `filter_map` - --> mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs:377:14 - | -377 | .filter_map(|(_, conn_ctx)| { - | ______________^ -378 | | (!maintained_connections.contains_key(&conn_ctx.id)).then(||... -379 | | }) - | |______________^ help: use `filter` then `map` instead: `filter(|&(_, conn_ctx)| (!maintained_connections.contains_key(&conn_ctx.id))).map(|(_, conn_ctx)| (conn_ctx.connection.clone(), conn_ctx.id))` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#filter_map_bool_then - = note: `#[warn(clippy::filter_map_bool_then)]` on by default - -warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` - --> mm2src/coins/utxo/rpc_clients.rs:1031:41 - | -1031 | transaction_list.extend(transactions.into_iter()); - | ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `transactions` - | -note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` - --> /Users/borngraced/.rustup/toolchains/nightly-2024-01-05-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/collect.rs:372:18 - | -372 | fn extend>(&mut self, iter: T); - | ^^^^^^^^^^^^^^^^^^^^^^ - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion - -warning: accessing first element with `args.funding_tx.outputs.get(0)` - --> mm2src/coins/utxo/utxo_common.rs:5073:8 - | -5073 | if args.funding_tx.outputs.get(0) != Some(&expected_output) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `args.funding_tx.outputs.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: accessing first element with `args.funding_tx.outputs.get(0)` - --> mm2src/coins/utxo/utxo_common.rs:5077:13 - | -5077 | args.funding_tx.outputs.get(0) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `args.funding_tx.outputs.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: in a `match` scrutinee, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a `let` - --> mm2src/coins/utxo/utxo_tx_history_v2.rs:739:39 - | -739 | ... .inspect_err(move |e| { - | _____________________________^ -740 | | ... error!("Error {e:?} on balance fetching for the coin {}", ticker); -741 | | ... }) - | |_______^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#blocks_in_conditions - = note: `#[warn(clippy::blocks_in_conditions)]` on by default - -warning: accessing first element with `nft_list.nfts.get(0)` - --> mm2src/coins/nft/nft_tests.rs:219:15 - | -219 | let nft = nft_list.nfts.get(0).unwrap(); - | ^^^^^^^^^^^^^^^^^^^^ help: try: `nft_list.nfts.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: accessing first element with `storage - .get_transfers_by_token_addr_id(chain, TOKEN_ADD.to_string(), token_id) - .await - .unwrap().get(0)` - --> mm2src/coins/nft/nft_tests.rs:465:21 - | -465 | let transfer1 = storage - | _____________________^ -466 | | .get_transfers_by_token_addr_id(chain, TOKEN_ADD.to_string(), token_id) -467 | | .await -468 | | .unwrap() -469 | | .get(0) - | |_______________^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first -help: try - | -465 ~ let transfer1 = storage -466 + .get_transfers_by_token_addr_id(chain, TOKEN_ADD.to_string(), token_id) -467 + .await -468 + .unwrap().first() - | - -warning: accessing first element with `transfer_history.transfer_history.get(0)` - --> mm2src/coins/nft/nft_tests.rs:516:20 - | -516 | let transfer = transfer_history.transfer_history.get(0).unwrap(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `transfer_history.transfer_history.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: accessing first element with `transfer_history.transfer_history.get(0)` - --> mm2src/coins/nft/nft_tests.rs:562:20 - | -562 | let transfer = transfer_history.transfer_history.get(0).unwrap(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `transfer_history.transfer_history.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: accessing first element with `transfer_history1.transfer_history.get(0)` - --> mm2src/coins/nft/nft_tests.rs:570:21 - | -570 | let transfer1 = transfer_history1.transfer_history.get(0).unwrap(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `transfer_history1.transfer_history.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: accessing first element with `transfer_history2.transfer_history.get(0)` - --> mm2src/coins/nft/nft_tests.rs:578:22 - | -578 | let transfer_0 = transfer_history2.transfer_history.get(0).unwrap(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `transfer_history2.transfer_history.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: accessing first element with `transfer_upd.get(0)` - --> mm2src/coins/nft/nft_tests.rs:614:24 - | -614 | let transfer_upd = transfer_upd.get(0).unwrap(); - | ^^^^^^^^^^^^^^^^^^^ help: try: `transfer_upd.first()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first - -warning: question mark operator is useless here - --> mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs:315:9 - | -315 | / Ok(walletdb_blocks_table -316 | | .replace_item_by_unique_multi_index(index_keys, &block) -317 | | .await -318 | | .map(|_| ()) -319 | | .map_mm_err()?) - | |___________________________^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_question_mark - = note: `#[warn(clippy::needless_question_mark)]` on by default -help: try removing question mark and `Ok()` - | -315 ~ walletdb_blocks_table -316 + .replace_item_by_unique_multi_index(index_keys, &block) -317 + .await -318 + .map(|_| ()) -319 + .map_mm_err() - | - -warning: question mark operator is useless here - --> mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs:610:9 - | -610 | Ok(witness_table.add_item(&witness).await.map(|_| ()).map_mm_err()?) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `witness_table.add_item(&witness).await.map(|_| ()).map_mm_err()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_question_mark - -warning: question mark operator is useless here - --> mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs:781:9 - | -781 | / Ok(sent_note_table -782 | | .replace_item_by_unique_multi_index(index_keys, &new_note) -783 | | .await -784 | | .map(|_| ()) -785 | | .map_mm_err()?) - | |___________________________^ - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_question_mark -help: try removing question mark and `Ok()` - | -781 ~ sent_note_table -782 + .replace_item_by_unique_multi_index(index_keys, &new_note) -783 + .await -784 + .map(|_| ()) -785 + .map_mm_err() - | - -warning: unnecessary map of the identity function - --> mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs:1315:25 - | -1315 | .into_iter() - | _________________________^ -1316 | | .map(|(i, item)| (i, item)) - | |_______________________________________^ help: remove the call to `map` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_identity - = note: `#[warn(clippy::map_identity)]` on by default - -warning: use of `or_insert_with` to construct default value - --> mm2src/coins/lp_coins.rs:2567:52 - | -2567 | ...cker).or_insert_with(CoinBalance::default); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `or_default()` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default - - Compiling mm2_bin_lib v2.4.0-beta (/Users/borngraced/Work/komodefi/mm2src/mm2_bin_lib) -warning: `coins` (lib) generated 39 warnings (run `cargo clippy --fix --lib -p coins` to apply 34 suggestions) -warning: unused imports: `InitL2ActivationOps`, `InitL2InitialStatus`, `InitL2TaskHandleShared`, `InitL2TaskManagerShared`, `InitL2Task`, `L2ProtocolParams` - --> mm2src/coins_activation/src/l2/mod.rs:4:81 - | -4 | ...::{cancel_init_l2, init_l2, init_l2_status, init_l2_user_action, InitL2ActivationOps, - | ^^^^^^^^^^^^^^^^^^^ -5 | ... InitL2InitialStatus, InitL2Task, InitL2TaskHandleShared, InitL2TaskManagerShared, L2ProtocolParam... - | ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default - -warning: unused import: `InitStandaloneCoinTask` - --> mm2src/coins_activation/src/standalone_coin/mod.rs:7:65 - | -7 | ... InitStandaloneCoinStatusRequest, InitStandaloneCoinTask, - | ^^^^^^^^^^^^^^^^^^^^^^ - -warning: usage of `Iterator::fold` on a type that implements `Try` - --> mm2src/coins_activation/src/bch_with_tokens_activation.rs:166:14 - | -166 | .fold(Some(BigDecimal::from(0)), |total, (_, addr_info)| { - | ______________^ -167 | | total.and_then(|t| addr_info.balances.as_ref().map(|b| t + b... -168 | | }) - | |______________^ help: use `try_fold` instead: `try_fold(BigDecimal::from(0), |total, (_, addr_info)| ...)` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_try_fold - = note: `#[warn(clippy::manual_try_fold)]` on by default - -warning: usage of `Iterator::fold` on a type that implements `Try` - --> mm2src/coins_activation/src/eth_with_token_activation.rs:236:18 - | -236 | .fold(Some(BigDecimal::from(0)), |total, (_, addr_info)| { - | __________________^ -237 | | total.and_then(|t| addr_info.balances.as_ref().map(|b| t... -238 | | }), - | |__________________^ help: use `try_fold` instead: `try_fold(BigDecimal::from(0), |total, (_, addr_info)| ...)` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_try_fold - -warning: `coins_activation` (lib) generated 4 warnings (run `cargo clippy --fix --lib -p coins_activation` to apply 2 suggestions) - Checking mm2_main v0.1.0 (/Users/borngraced/Work/komodefi/mm2src/mm2_main) -warning: `enum_derives` (lib) generated 1 warning (1 duplicate) -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:125:44 - | -125 | let db = wallets_ctx.wallets_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-7075314664593906737.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:126:45 - | -126 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-7075314664593906737.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:127:60 - | -127 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-7075314664593906737.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:139:15 - | -139 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-7075314664593906737.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:102:44 - | -102 | let db = wallets_ctx.wallets_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:103:45 - | -103 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:104:60 - | -104 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:117:15 - | -117 | .await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:220:39 - | -220 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:221:45 - | -221 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:222:65 - | -222 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:223:74 - | -223 | let mut item = match table.get_item_by_unique_index("uuid", id).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:228:64 - | -228 | table.replace_item_by_unique_index("uuid", id, &item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_init/init_metamask.rs:142:109 - | -142 | let task_id = RpcTaskManager::spawn_rpc_task(&init_ctx.init_metamask_manager, &spawner, task, client_id)?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-12770668214775882348.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_init/init_metamask.rs:169:42 - | -169 | task_manager.cancel_task(req.task_id)?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:83:39 - | -83 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:84:45 - | -84 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:85:65 - | -85 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:86:72 - | -86 | let item = match table.get_item_by_unique_index("uuid", uuid).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:192:39 - | -192 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9468050619375602557.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:193:45 - | -193 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9468050619375602557.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:194:60 - | -194 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9468050619375602557.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:195:72 - | -195 | let item = match table.get_item_by_unique_index("uuid", uuid).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9468050619375602557.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:200:73 - | -200 | let filters_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9468050619375602557.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:201:87 - | -201 | let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9468050619375602557.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:233:39 - | -233 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-6748048221667501919.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:234:45 - | -234 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-6748048221667501919.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:235:60 - | -235 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-6748048221667501919.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:236:72 - | -236 | let item = match table.get_item_by_unique_index("uuid", uuid).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-6748048221667501919.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:241:73 - | -241 | let filters_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-6748048221667501919.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:242:87 - | -242 | let filter_item = match filters_table.get_item_by_unique_index("uuid", uuid).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-6748048221667501919.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:285:19 - | -285 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:287:19 - | -287 | .await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:294:43 - | -294 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:295:49 - | -295 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:296:79 - | -296 | let migration_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:303:89 - | -303 | let filters_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:304:82 - | -304 | let swaps_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:305:66 - | -305 | let swaps = swaps_table.get_all_items().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:316:100 - | -316 | ... match filters_table.get_item_by_unique_index("uuid", swap.uuid()).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:325:84 - | -325 | filters_table.replace_item(filter_id, &filter_record).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:337:79 - | -337 | migration_table.add_item(&SwapsMigrationTable { migration }).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:184:47 - | -184 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:185:53 - | -185 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:186:67 - | -186 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:187:47 - | -187 | table.delete_item(record_id).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:110:39 - | -110 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:111:45 - | -111 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:112:65 - | -112 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:113:70 - | -113 | let maybe_item = table.get_item_by_unique_index("uuid", id).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:146:39 - | -146 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:147:45 - | -147 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:148:60 - | -148 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:150:81 - | -150 | let saved_swap_json = match table.get_item_by_unique_index("uuid", id).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:162:68 - | -162 | table.replace_item_by_unique_index("uuid", id, &new_item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:169:39 - | -169 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:170:45 - | -170 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:172:60 - | -172 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:173:81 - | -173 | let saved_swap_json = match table.get_item_by_unique_index("uuid", id).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:200:43 - | -200 | .with_value(BoolAsInt::new(false))? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:201:31 - | -201 | .with_value(swap_type)?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:204:39 - | -204 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:205:45 - | -205 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:206:65 - | -206 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:207:66 - | -207 | let table_items = table.get_items_by_multi_index(index).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:154:44 - | -154 | let db = wallets_ctx.wallets_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<_, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:155:45 - | -155 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<_, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:156:60 - | -156 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<_, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:158:48 - | -158 | let all_items = table.get_all_items().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<_, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_init/init_metamask.rs:125:56 - | -125 | let crypto_ctx = CryptoCtx::from_ctx(&self.ctx)?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-7817180783745311537.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_init/init_metamask.rs:127:84 - | -127 | let metamask = crypto_ctx.init_metamask_ctx(self.req.project.clone()).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-7817180783745311537.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:407:52 - | -407 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-11714836439251202389.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:408:53 - | -408 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-11714836439251202389.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:409:78 - | -409 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-11714836439251202389.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:410:59 - | -410 | let maker_orders = table.get_all_items().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-11714836439251202389.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:418:52 - | -418 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:419:53 - | -419 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:420:78 - | -420 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:424:23 - | -424 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:430:52 - | -430 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9035075274246365160.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:431:53 - | -431 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9035075274246365160.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:432:78 - | -432 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9035075274246365160.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:433:59 - | -433 | let maker_orders = table.get_all_items().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-9035075274246365160.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:441:52 - | -441 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:442:53 - | -442 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:443:78 - | -443 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:449:40 - | -449 | table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:454:52 - | -454 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:455:53 - | -455 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:456:78 - | -456 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:462:40 - | -462 | table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:467:52 - | -467 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:468:53 - | -468 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:469:78 - | -469 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:470:66 - | -470 | table.delete_item_by_unique_index("uuid", uuid).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:475:52 - | -475 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:476:53 - | -476 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:477:78 - | -477 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:478:66 - | -478 | table.delete_item_by_unique_index("uuid", uuid).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:483:52 - | -483 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:484:53 - | -484 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:485:78 - | -485 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:491:80 - | -491 | table.replace_item_by_unique_index("uuid", order.uuid, &item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:496:52 - | -496 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:497:53 - | -497 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:498:78 - | -498 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:506:23 - | -506 | .await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:514:52 - | -514 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:515:53 - | -515 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:516:74 - | -516 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:522:40 - | -522 | table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:527:52 - | -527 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:528:53 - | -528 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:529:74 - | -529 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:533:23 - | -533 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:553:52 - | -553 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:554:53 - | -554 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:555:83 - | -555 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:559:23 - | -559 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:567:52 - | -567 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:568:53 - | -568 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:569:83 - | -569 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:570:40 - | -570 | table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:577:52 - | -577 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:578:53 - | -578 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:579:83 - | -579 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:580:40 - | -580 | table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:585:52 - | -585 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:586:53 - | -586 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:587:83 - | -587 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:591:23 - | -591 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:595:53 - | -595 | table.replace_item(item_id, &item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:600:52 - | -600 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:601:53 - | -601 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:602:83 - | -602 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:606:23 - | -606 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:610:53 - | -610 | table.replace_item(item_id, &item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:615:52 - | -615 | let db = self.ctx.ordermatch_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:616:53 - | -616 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:617:83 - | -617 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:621:23 - | -621 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:625:53 - | -625 | table.replace_item(item_id, &item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:197:43 - | -197 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:198:49 - | -198 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:200:77 - | -200 | let filters_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:210:44 - | -210 | filters_table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:212:64 - | -212 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:217:36 - | -217 | table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:180:46 - | -180 | let db = swap_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:181:53 - | -181 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:182:82 - | -182 | let my_swaps_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:192:49 - | -192 | my_swaps_table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:202:46 - | -202 | let db = swap_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:203:53 - | -203 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:204:82 - | -204 | let my_swaps_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:216:50 - | -216 | .only("my_coin", my_coin)? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:217:56 - | -217 | .only("other_coin", other_coin)? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:220:31 - | -220 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:222:31 - | -222 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:227:50 - | -227 | .only("my_coin", my_coin)? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:230:31 - | -230 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:232:31 - | -232 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:237:56 - | -237 | .only("other_coin", other_coin)? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:240:31 - | -240 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:242:31 - | -242 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:249:31 - | -249 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:251:31 - | -251 | .await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:381:47 - | -381 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-13642738272023903284.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:382:53 - | -382 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-13642738272023903284.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:383:68 - | -383 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-13642738272023903284.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:385:91 - | -385 | let saved_swap_json = match table.get_item_by_unique_index("uuid", uuid).await? { - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-13642738272023903284.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:395:47 - | -395 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:396:53 - | -396 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:397:68 - | -397 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:399:52 - | -399 | let swaps = table.get_all_items().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result, mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:416:47 - | -416 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:417:53 - | -417 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:418:68 - | -418 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/saved_swap.rs:422:23 - | -422 | .await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:131:47 - | -131 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-3214764614864890638.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:132:53 - | -132 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-3214764614864890638.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:133:67 - | -133 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-3214764614864890638.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:136:67 - | -136 | table.get_item_by_unique_index("uuid", uuid).await? - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-3214764614864890638.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:143:49 - | -143 | table.delete_item(item_id).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-3214764614864890638.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:150:56 - | -150 | let record_id = table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `Result, MmError>` to implement `std::ops::FromResidual>>` - = note: the full type name has been written to '/Users/borngraced/Work/komodefi/target/wasm32-unknown-unknown/debug/deps/mm2_main-755d4d43ce22a145.long-type-3214764614864890638.txt' - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:161:47 - | -161 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:168:53 - | -168 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:169:67 - | -169 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/swap_lock.rs:171:85 - | -171 | let replaced_record_id = table.replace_item(self.record_id, &item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:228:43 - | -228 | let db = swaps_ctx.swap_db().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:229:49 - | -229 | let transaction = db.transaction().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:231:77 - | -231 | let filters_table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:241:44 - | -241 | filters_table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:243:64 - | -243 | let table = transaction.table::().await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -error[E0277]: `?` couldn't convert the error to `mm2_err_handle::mm_error::MmError` - --> mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:248:36 - | -248 | table.add_item(&item).await?; - | ^ the trait `std::convert::From>` is not implemented for `mm2_err_handle::mm_error::MmError` - | - = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait - = help: the following other types implement trait `std::convert::From`: - as std::convert::From>> - as std::convert::From> - = note: required for `std::result::Result<(), mm2_err_handle::mm_error::MmError>` to implement `std::ops::FromResidual>>` - -For more information about this error, try `rustc --explain E0277`. -error: could not compile `mm2_main` (lib) due to 195 previous errors diff --git a/scan_for_mm_errs.py b/scan_for_mm_errs.py deleted file mode 100644 index 3fc221ce29..0000000000 --- a/scan_for_mm_errs.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -import re -import sys - - -def extract_map_mmerrs(log_text): - """ - Yields tuples (file, line, inner, target) for each E0277 `?` conversion error. - """ - lines = log_text.splitlines() - i = 0 - while i < len(lines): - if ( - "error[E0277]" in lines[i] - and "`?` couldn't convert the error to" in lines[i] - ): - # 1) capture the target from this line - m_to = re.search(r"couldn't convert the error to `([^`]+)`", lines[i]) - target = m_to.group(1) if m_to else None - - # 2) find the file:line arrow below - file_path, line_no = None, None - j = i + 1 - while j < len(lines): - m_loc = re.match(r"\s*-->\s+([^:]+):(\d+):\d+", lines[j]) - if m_loc: - file_path, line_no = m_loc.group(1), m_loc.group(2) - break - j += 1 - - # 3) find the From<…> trait bound line for inner type - inner = None - k = j + 1 - while k < len(lines) and inner is None: - m_from = re.search(r"From<[^<]*<([^>]+)>", lines[k]) - if m_from: - inner = m_from.group(1) - k += 1 - - if file_path and line_no and inner and target: - yield file_path, line_no, inner, target - - i = k - else: - i += 1 - - -def main(): - if len(sys.argv) != 2: - print("Usage: extract_map_mmerrs.py ", file=sys.stderr) - sys.exit(1) - - log = open(sys.argv[1]).read() - for path, line, inner, target in extract_map_mmerrs(log): - print( - f"{path}:{line} // append `.map_mm_err({target}.from)?` (inner was `{inner}`)" - ) - - -if __name__ == "__main__": - main() diff --git a/suggestions.txt b/suggestions.txt deleted file mode 100644 index bce79d235b..0000000000 --- a/suggestions.txt +++ /dev/null @@ -1,195 +0,0 @@ -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:125 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:126 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:127 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:139 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:102 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:103 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:104 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:117 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:220 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:221 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:222 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:223 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:228 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_init/init_metamask.rs:142 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `rpc_task::RpcTaskError`) -mm2src/mm2_main/src/lp_init/init_metamask.rs:169 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `rpc_task::RpcTaskError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:83 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:84 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:85 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:86 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:192 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:193 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:194 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:195 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:200 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:201 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:233 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:234 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:235 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:236 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:241 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_rpcs.rs:242 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:285 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:287 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:294 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:295 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:296 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:303 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:304 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:305 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:316 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:325 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:337 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:184 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:185 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:186 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:187 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:110 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:111 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:112 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:113 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:146 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:147 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:148 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:150 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:162 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:169 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:170 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:172 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:173 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:200 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:201 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:204 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:205 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:206 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_v2_common.rs:207 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:154 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:155 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:156 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs:158 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_init/init_metamask.rs:125 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `crypto::CryptoCtxError`) -mm2src/mm2_main/src/lp_init/init_metamask.rs:127 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `crypto::MetamaskCtxInitError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:407 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:408 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:409 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:410 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:418 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:419 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:420 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:424 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:430 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:431 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:432 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:433 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:441 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:442 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:443 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:449 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:454 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:455 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:456 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:462 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:467 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:468 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:469 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:470 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:475 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:476 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:477 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:478 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:483 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:484 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:485 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:491 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:496 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:497 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:498 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:506 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:514 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:515 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:516 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:522 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:527 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:528 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:529 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:533 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:553 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:554 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:555 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:559 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:567 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:568 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:569 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:570 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:577 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:578 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:579 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:580 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:585 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:586 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:587 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:591 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:595 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:600 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:601 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:602 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:606 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:610 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:615 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:616 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:617 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:621 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs:625 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:197 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:198 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:200 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:210 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:212 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs:217 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:180 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:181 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:182 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:192 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:202 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:203 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:204 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:216 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:217 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:220 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:222 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:227 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:230 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:232 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:237 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:240 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:242 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:249 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/my_swaps_storage.rs:251 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::cursor_prelude::CursorError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:381 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:382 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:383 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:385 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:395 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:396 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:397 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:399 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:416 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:417 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:418 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/saved_swap.rs:422 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:131 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:132 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:133 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:136 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:143 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:150 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:161 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:168 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:169 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/swap_lock.rs:171 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:228 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::InitDbError`) -mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:229 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:231 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:241 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:243 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) -mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs:248 // append `.map_mm_err(mm2_err_handle::mm_error::MmError.from)?` (inner was `mm2_db::indexed_db::DbTransactionError`) From ffad55c8a133bd908a996134fb7f8e0dc8b4b64e Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 6 May 2025 22:14:35 +0100 Subject: [PATCH 10/35] revert rust-toolchain.toml --- rust-toolchain.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 5380b2302d..f1739addd6 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,7 +1,3 @@ [toolchain] channel = "nightly-2023-06-01" components = ["rustfmt", "clippy", "rust-analyzer"] - - - -# channel = "nightly-2024-04-05" From 99f255288d4d4bf4a714e68a29c86604e6274ede Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 00:59:29 +0100 Subject: [PATCH 11/35] remove mmerror blanket impl and minor changes/fixes --- mm2src/coins/utxo/utxo_common.rs | 4 ++-- mm2src/coins/z_coin.rs | 10 ++++++---- mm2src/coins/z_coin/z_rpc.rs | 6 +++++- mm2src/mm2_err_handle/src/lib.rs | 2 +- mm2src/mm2_err_handle/src/mm_error.rs | 16 ---------------- 5 files changed, 14 insertions(+), 24 deletions(-) diff --git a/mm2src/coins/utxo/utxo_common.rs b/mm2src/coins/utxo/utxo_common.rs index 53b445e843..a70469e165 100644 --- a/mm2src/coins/utxo/utxo_common.rs +++ b/mm2src/coins/utxo/utxo_common.rs @@ -725,7 +725,7 @@ impl<'a, T: AsRef + UtxoTxGenerationOps> UtxoTxBuilder<'a, T> { let required_amount_0 = self.required_amount(); self.sum_inputs = self.add_tx_inputs(required_amount_0); self.sum_outputs = self.add_tx_outputs(); - self.interest = coin.calc_interest_if_required(&mut self.tx).await?; + self.interest = coin.calc_interest_if_required(&mut self.tx).await.map_mm_err()?; // try once tx_fee without the change output (if maybe txfee fits between total inputs and outputs) if !one_time_fee_update { @@ -847,7 +847,7 @@ pub fn is_kmd(coin: &T) -> bool { &coin.as_ref().conf.ticker = async fn get_min_relay_rate + UtxoTxGenerationOps>(coin: &T) -> UtxoRpcResult> { if coin.as_ref().conf.force_min_relay_fee { let fee_dec = coin.as_ref().rpc_client.get_relay_fee().compat().await?; - let min_relay_fee_rate = sat_from_big_decimal(&fee_dec, coin.as_ref().decimals)?; + let min_relay_fee_rate = sat_from_big_decimal(&fee_dec, coin.as_ref().decimals).map_mm_err()?; Ok(Some(min_relay_fee_rate)) } else { Ok(None) diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 8ef1441406..5a61310355 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -480,13 +480,15 @@ impl ZCoin { #[cfg(target_arch = "wasm32")] let (tx, _) = TxBuilderSpawner::request_tx_result(tx_builder, BranchId::Sapling, self.z_fields.z_tx_prover.clone()) - .await? - .tx_result?; + .await + .map_mm_err()? + .tx_result + .map_mm_err()?; let additional_data = AdditionalTxData { received_by_me, - spent_by_me: sat_from_big_decimal(&total_input_amount, self.decimals())?, - fee_amount: sat_from_big_decimal(&tx_fee, self.decimals())?, + spent_by_me: sat_from_big_decimal(&total_input_amount, self.decimals()).map_mm_err()?, + fee_amount: sat_from_big_decimal(&tx_fee, self.decimals()).map_mm_err()?, kmd_rewards: None, }; Ok((tx, additional_data, sync_guard)) diff --git a/mm2src/coins/z_coin/z_rpc.rs b/mm2src/coins/z_coin/z_rpc.rs index 6453386691..040347e6c6 100644 --- a/mm2src/coins/z_coin/z_rpc.rs +++ b/mm2src/coins/z_coin/z_rpc.rs @@ -775,7 +775,11 @@ impl SaplingSyncLoopHandle { let block_db = self.blocks_db.clone(); let current_block_in_db = &self.blocks_db.get_latest_block().await.map_mm_err()?; let wallet_db = self.wallet_db.clone(); - let extrema = wallet_db.db.block_height_extrema().await?; + let extrema = wallet_db + .db + .block_height_extrema() + .await + .map_err(|err| MmError::new(UpdateBlocksCacheErr::ZcashDBError(err.to_string())))?; let mut from_block = self .consensus_params .sapling_activation_height diff --git a/mm2src/mm2_err_handle/src/lib.rs b/mm2src/mm2_err_handle/src/lib.rs index 3df7ed9279..b128b93b31 100644 --- a/mm2src/mm2_err_handle/src/lib.rs +++ b/mm2src/mm2_err_handle/src/lib.rs @@ -18,7 +18,7 @@ pub mod prelude { pub use crate::map_mm_error::{MapMmError, MmResultExt}; pub use crate::map_to_mm::MapToMmResult; pub use crate::map_to_mm_fut::MapToMmFutureExt; - pub use crate::mm_error::{MmError, MmResult, NotEqual, NotMmError, SerMmErrorType}; + pub use crate::mm_error::{MmError, MmResult, NotMmError, SerMmErrorType}; pub use crate::mm_json_error::MmJsonError; pub use crate::or_mm_error::OrMmError; pub use crate::split_mm::SplitMmResult; diff --git a/mm2src/mm2_err_handle/src/mm_error.rs b/mm2src/mm2_err_handle/src/mm_error.rs index 463c0eed14..ab70c44deb 100644 --- a/mm2src/mm2_err_handle/src/mm_error.rs +++ b/mm2src/mm2_err_handle/src/mm_error.rs @@ -115,11 +115,6 @@ pub trait SerMmErrorType: SerializeErrorType + fmt::Display + NotMmError {} impl SerMmErrorType for E where E: SerializeErrorType + fmt::Display + NotMmError {} -pub auto trait NotEqual {} -impl !NotEqual for (X, X) {} -impl NotEqual for Box {} -impl NotEqual for Arc {} - /// The unified error representation tracing an error path. #[derive(Clone, Eq, PartialEq)] pub struct MmError { @@ -145,17 +140,6 @@ where impl StdError for MmError {} -/// Track the location whenever `MmError::from(MmError)` is called. -impl From> for MmError -where - E1: NotMmError, - E2: From + NotMmError, - (E1, E2): NotEqual, -{ - #[track_caller] - fn from(orig: MmError) -> Self { orig.map(E2::from) } -} - /// Track the location whenever `MmError::from(E1)` is called. impl From for MmError where From d2d5f0c564ed8e48bed243aec8e8a7c1959e6636 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 01:51:12 +0100 Subject: [PATCH 12/35] upgrade to rust 1.80 --- Cargo.lock | 259 +++++++++++------- mm2src/coins/Cargo.toml | 2 +- mm2src/coins/eth.rs | 4 +- mm2src/coins/eth/eth_balance_events.rs | 2 +- mm2src/coins/lightning/ln_sql.rs | 22 +- mm2src/coins/lp_coins.rs | 4 +- mm2src/coins/nft/nft_tests.rs | 15 +- mm2src/coins/qrc20/history.rs | 2 +- mm2src/coins/utxo/bch.rs | 5 +- mm2src/coins/utxo/qtum_delegation.rs | 3 +- mm2src/coins/utxo/rpc_clients.rs | 2 +- .../utxo/rpc_clients/electrum_rpc/client.rs | 4 +- .../connection_manager/manager.rs | 4 +- .../sql_block_header_storage.rs | 2 +- .../utxo/utxo_builder/utxo_coin_builder.rs | 4 +- .../utxo/utxo_builder/utxo_conf_builder.rs | 3 +- mm2src/coins/utxo/utxo_common.rs | 4 +- .../src/bch_with_tokens_activation.rs | 2 +- .../src/eth_with_token_activation.rs | 2 +- mm2src/coins_activation/src/l2/mod.rs | 2 +- .../src/standalone_coin/mod.rs | 2 +- mm2src/common/common.rs | 5 +- mm2src/common/log.rs | 2 +- mm2src/mm2_bitcoin/keys/src/address.rs | 12 +- mm2src/mm2_bitcoin/keys/src/cashaddress.rs | 18 +- mm2src/mm2_bitcoin/script/src/sign.rs | 4 +- .../mm2_bitcoin/serialization/src/reader.rs | 2 +- mm2src/mm2_eth/src/eip712_encode.rs | 2 +- mm2src/mm2_io/src/fs.rs | 2 +- mm2src/mm2_main/Cargo.toml | 2 +- mm2src/mm2_main/src/database/my_orders.rs | 16 +- mm2src/mm2_main/src/database/stats_nodes.rs | 14 +- mm2src/mm2_main/src/lp_ordermatch.rs | 8 +- mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs | 4 +- mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs | 4 +- mm2src/mm2_main/tests/docker_tests_main.rs | 1 - .../mm2_main/tests/docker_tests_sia_unique.rs | 1 - .../tests/mm2_tests/mm2_tests_inner.rs | 4 +- mm2src/mm2_main/tests/mm2_tests/mod.rs | 10 +- mm2src/mm2_metrics/src/mm_metrics.rs | 2 +- mm2src/mm2_rpc/Cargo.toml | 2 +- .../src/storable_state_machine.rs | 2 +- rust-toolchain.toml | 5 +- 43 files changed, 242 insertions(+), 229 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 51a278251f..531e3cca1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,9 +81,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom 0.2.9", "once_cell", @@ -92,13 +92,14 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -241,7 +242,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -258,8 +259,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531b97fb4cd3dfdce92c35dedbfdc1f0b9d8091c8ca943d6dae340ef5012d514" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -924,7 +925,7 @@ dependencies = [ "sia-rust", "spv_validation", "tendermint-rpc", - "time 0.3.20", + "time 0.3.41", "timed-map", "tokio", "tokio-rustls 0.24.1", @@ -1157,9 +1158,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if 1.0.0", ] @@ -1499,7 +1500,7 @@ dependencies = [ "codespan-reporting", "lazy_static", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "scratch", "syn 1.0.95", ] @@ -1517,7 +1518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b846f081361125bfc8dc9d3940c84e1fd83ba54bbca7b17cd29483c828be0704" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -1540,7 +1541,7 @@ dependencies = [ "fnv", "ident_case", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "strsim", "syn 1.0.95", ] @@ -1552,7 +1553,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -1607,6 +1608,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + [[package]] name = "derive_more" version = "0.99.11" @@ -1614,7 +1624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -1692,12 +1702,12 @@ dependencies = [ [[package]] name = "ed25519" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ "serde", - "signature 1.4.0", + "signature 1.6.4", ] [[package]] @@ -1730,7 +1740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ "curve25519-dalek 3.2.0", - "ed25519 1.5.2", + "ed25519 1.5.3", "rand 0.7.3", "serde", "serde_bytes", @@ -1792,7 +1802,7 @@ checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ "heck", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -1803,7 +1813,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c375b9c5eadb68d0a6efee2999fef292f45854c3444c86f09d8ab086ba942b0e" dependencies = [ "num-traits", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -1813,7 +1823,7 @@ version = "0.1.0" dependencies = [ "itertools", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -2199,8 +2209,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -2425,7 +2435,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.8", ] [[package]] @@ -2434,7 +2444,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.8", ] [[package]] @@ -2443,7 +2453,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.11", ] [[package]] @@ -2847,7 +2857,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5dacb10c5b3bb92d46ba347505a9041e676bb20ad220101326bffb0c93031ee" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -3417,8 +3427,8 @@ dependencies = [ "heck", "proc-macro-warning", "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -3760,7 +3770,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa8ebbd1a9e57bbab77b9facae7f5136aea44c356943bf9a198f647da64285d6" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.11", "metrics-macros", "portable-atomic", ] @@ -3790,8 +3800,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -4263,7 +4273,7 @@ dependencies = [ "serde_json", "sha2 0.10.7", "smallvec 1.6.1", - "syn 2.0.38", + "syn 2.0.101", "timed-map", "tokio", "void", @@ -4343,7 +4353,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3048ef3680533a27f9f8e7d6a0bce44dc61e4895ea0f42709337fa1c8616fefe" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -4522,6 +4532,12 @@ dependencies = [ "serde", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.4.2" @@ -4529,8 +4545,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -4653,7 +4669,7 @@ checksum = "c45ed1f39709f5a89338fab50e59816b2e8815f5bb58276e7ddf9afd495f73f8" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -4771,7 +4787,7 @@ checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" dependencies = [ "peg-runtime", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", ] [[package]] @@ -4821,8 +4837,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -4909,6 +4925,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc59d1bcc64fc5d021d67521f818db868368028108d37f0e98d74e33f68297b5" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.8" @@ -4922,7 +4944,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.38", + "syn 2.0.101", ] [[package]] @@ -4966,15 +4988,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70550716265d1ec349c41f70dd4f964b4fd88394efe4405f0c1da679c4799a07" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -4998,7 +5020,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -5029,7 +5051,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.38", + "syn 2.0.101", "tempfile", ] @@ -5042,8 +5064,8 @@ dependencies = [ "anyhow", "itertools", "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -5154,9 +5176,9 @@ checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -5404,7 +5426,7 @@ checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ "pem", "ring 0.16.20", - "time 0.3.20", + "time 0.3.41", "yasna", ] @@ -5469,7 +5491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c523ccaed8ac4b0288948849a350b37d3035827413c458b6a40ddb614bb4f72" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -5703,7 +5725,7 @@ dependencies = [ "hashlink", "libsqlite3-sys", "smallvec 1.6.1", - "time 0.3.20", + "time 0.3.41", ] [[package]] @@ -5912,7 +5934,7 @@ checksum = "50e334bb10a245e28e5fd755cabcafd96cfcd167c99ae63a46924ca8d8703a3c" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -6096,16 +6118,16 @@ name = "ser_error_derive" version = "0.1.0" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "ser_error", "syn 1.0.95", ] [[package]] name = "serde" -version = "1.0.189" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -6132,23 +6154,24 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "indexmap 1.9.3", + "indexmap 2.2.3", "itoa 1.0.10", + "memchr", "ryu", "serde", ] @@ -6160,7 +6183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dc6b7951b17b051f3210b063f12cc17320e2fe30ae05b0fe2a3abb068551c76" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -6203,7 +6226,7 @@ checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ "darling", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -6334,9 +6357,9 @@ dependencies = [ [[package]] name = "signature" -version = "1.4.0" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" [[package]] name = "signature" @@ -6500,7 +6523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d676664972e22a0796176e81e7bec41df461d1edf52090955cdab55f2c956ff2" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -6530,7 +6553,7 @@ dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", ] @@ -6651,7 +6674,7 @@ checksum = "2f9799e6d412271cb2414597581128b03f3285f260ea49f5363d07df6a332b3e" dependencies = [ "Inflector", "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "serde", "serde_json", "unicode-xid 0.2.0", @@ -6708,18 +6731,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.38" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "unicode-ident", ] @@ -6745,7 +6768,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", "unicode-xid 0.2.0", ] @@ -6817,7 +6840,7 @@ dependencies = [ "subtle", "subtle-encoding", "tendermint-proto", - "time 0.3.20", + "time 0.3.41", "zeroize", ] @@ -6850,7 +6873,7 @@ dependencies = [ "serde", "serde_bytes", "subtle-encoding", - "time 0.3.20", + "time 0.3.41", ] [[package]] @@ -6876,7 +6899,7 @@ dependencies = [ "tendermint-config", "tendermint-proto", "thiserror", - "time 0.3.20", + "time 0.3.41", "url", "uuid", "walkdir", @@ -6931,8 +6954,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -6947,12 +6970,15 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ + "deranged", "itoa 1.0.10", "js-sys", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -6960,16 +6986,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ + "num-conv", "time-core", ] @@ -7061,8 +7088,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -7228,8 +7255,8 @@ dependencies = [ "prettyplease", "proc-macro2", "prost-build", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -7283,8 +7310,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", ] [[package]] @@ -7722,8 +7749,8 @@ dependencies = [ "log", "once_cell", "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -7745,7 +7772,7 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ - "quote 1.0.33", + "quote 1.0.40", "wasm-bindgen-macro-support", ] @@ -7756,8 +7783,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", - "quote 1.0.33", - "syn 2.0.38", + "quote 1.0.40", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7789,7 +7816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c2e18093f11c19ca4e188c177fecc7c372304c311189f12c2f9bea5b7324ac7" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", ] [[package]] @@ -8299,7 +8326,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" dependencies = [ - "time 0.3.20", + "time 0.3.41", ] [[package]] @@ -8328,7 +8355,7 @@ dependencies = [ "protobuf-codegen-pure", "rand_core 0.5.1", "subtle", - "time 0.3.20", + "time 0.3.41", "zcash_note_encryption", "zcash_primitives", ] @@ -8348,7 +8375,7 @@ dependencies = [ "protobuf", "rand_core 0.5.1", "rusqlite", - "time 0.3.20", + "time 0.3.41", "tokio", "zcash_client_backend", "zcash_extras", @@ -8366,7 +8393,7 @@ dependencies = [ "jubjub", "protobuf", "rand_core 0.5.1", - "time 0.3.20", + "time 0.3.41", "zcash_client_backend", "zcash_primitives", ] @@ -8433,6 +8460,26 @@ dependencies = [ "zcash_primitives", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote 1.0.40", + "syn 2.0.101", +] + [[package]] name = "zeroize" version = "1.7.0" @@ -8449,7 +8496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" dependencies = [ "proc-macro2", - "quote 1.0.33", + "quote 1.0.40", "syn 1.0.95", "synstructure", ] diff --git a/mm2src/coins/Cargo.toml b/mm2src/coins/Cargo.toml index 33c8457dce..c203d658ba 100644 --- a/mm2src/coins/Cargo.toml +++ b/mm2src/coins/Cargo.toml @@ -124,7 +124,7 @@ js-sys = { version = "0.3.27" } mm2_db = { path = "../mm2_db" } mm2_metamask = { path = "../mm2_metamask" } mm2_test_helpers = { path = "../mm2_test_helpers" } -time = { version = "0.3.20", features = ["wasm-bindgen"] } +time = { version = "0.3.36", features = ["wasm-bindgen"] } timed-map = { version = "1.3", features = ["rustc-hash", "wasm"] } tonic = { version = "0.10", default-features = false, features = ["prost", "codegen", "gzip"] } tower-service = "0.3" diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index a7c155176c..a229c9e061 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -5567,7 +5567,7 @@ impl EthCoin { let nonces: Vec<_> = join_all(futures) .await .into_iter() - .zip(web3_instances.into_iter()) + .zip(web3_instances) .filter_map(|(nonce_res, instance)| match nonce_res { Ok(n) => Some((n, instance)), Err(e) => { @@ -7090,7 +7090,7 @@ impl IguanaBalanceOps for EthCoin { let token_balances = self.get_tokens_balance_list().await?; let mut balances = CoinBalanceMap::new(); balances.insert(self.ticker().to_string(), platform_balance); - balances.extend(token_balances.into_iter()); + balances.extend(token_balances); Ok(balances) } } diff --git a/mm2src/coins/eth/eth_balance_events.rs b/mm2src/coins/eth/eth_balance_events.rs index 663dd54e34..3021255569 100644 --- a/mm2src/coins/eth/eth_balance_events.rs +++ b/mm2src/coins/eth/eth_balance_events.rs @@ -199,7 +199,7 @@ impl EventStreamer for EthBalanceEventStreamer { })); cache .entry(res.ticker.clone()) - .or_insert_with(HashMap::new) + .or_default() .insert(res.address, res.balance); }, Err(err) => { diff --git a/mm2src/coins/lightning/ln_sql.rs b/mm2src/coins/lightning/ln_sql.rs index 0062479ebf..8de936c0da 100644 --- a/mm2src/coins/lightning/ln_sql.rs +++ b/mm2src/coins/lightning/ln_sql.rs @@ -1441,9 +1441,7 @@ mod tests { let result = block_on(db.get_payments_by_filter(Some(filter.clone()), paging.clone(), limit)).unwrap(); let expected_payments_vec: Vec = payments - .iter() - .cloned() - .filter(|p| p.payment_type == PaymentType::InboundPayment) + .iter().filter(|&p| p.payment_type == PaymentType::InboundPayment).cloned() .collect(); let expected_payments = if expected_payments_vec.len() > 10 { expected_payments_vec[..10].to_vec() @@ -1458,9 +1456,7 @@ mod tests { filter.status = Some(HTLCStatus::Succeeded.to_string()); let result = block_on(db.get_payments_by_filter(Some(filter.clone()), paging.clone(), limit)).unwrap(); let expected_payments_vec: Vec = expected_payments_vec - .iter() - .cloned() - .filter(|p| p.status == HTLCStatus::Succeeded) + .iter().filter(|&p| p.status == HTLCStatus::Succeeded).cloned() .collect(); let expected_payments = if expected_payments_vec.len() > 10 { expected_payments_vec[..10].to_vec() @@ -1479,9 +1475,7 @@ mod tests { filter.description = Some(substr.to_string()); let result = block_on(db.get_payments_by_filter(Some(filter), paging, limit)).unwrap(); let expected_payments_vec: Vec = payments - .iter() - .cloned() - .filter(|p| p.description.contains(substr)) + .iter().filter(|&p| p.description.contains(substr)).cloned() .collect(); let expected_payments = if expected_payments_vec.len() > 10 { expected_payments_vec[..10].to_vec() @@ -1608,7 +1602,7 @@ mod tests { let result = block_on(db.get_closed_channels_by_filter(Some(filter.clone()), paging.clone(), limit)).unwrap(); let expected_channels_vec: Vec = - channels.iter().cloned().filter(|chan| chan.is_outbound).collect(); + channels.iter().filter(|&chan| chan.is_outbound).cloned().collect(); let expected_channels = if expected_channels_vec.len() > 10 { expected_channels_vec[..10].to_vec() } else { @@ -1622,9 +1616,7 @@ mod tests { filter.channel_visibility = Some(ChannelVisibility::Public); let result = block_on(db.get_closed_channels_by_filter(Some(filter.clone()), paging.clone(), limit)).unwrap(); let expected_channels_vec: Vec = expected_channels_vec - .iter() - .cloned() - .filter(|chan| chan.is_public) + .iter().filter(|&chan| chan.is_public).cloned() .collect(); let expected_channels = if expected_channels_vec.len() > 10 { expected_channels_vec[..10].to_vec() @@ -1641,9 +1633,7 @@ mod tests { filter.channel_id = Some(channel_id.clone()); let result = block_on(db.get_closed_channels_by_filter(Some(filter), paging, limit)).unwrap(); let expected_channels_vec: Vec = channels - .iter() - .cloned() - .filter(|chan| chan.channel_id == channel_id) + .iter().filter(|&chan| chan.channel_id == channel_id).cloned() .collect(); let expected_channels = if expected_channels_vec.len() > 10 { expected_channels_vec[..10].to_vec() diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 4e37648d9e..3fb04f09e2 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -2564,7 +2564,7 @@ impl BalanceObjectOps for CoinBalanceMap { fn add(&mut self, other: Self) { for (ticker, balance) in other { - let total_balance = self.entry(ticker).or_insert_with(CoinBalance::default); + let total_balance = self.entry(ticker).or_default(); *total_balance += balance; } } @@ -3795,7 +3795,7 @@ pub enum DexFee { } impl DexFee { - const DEX_FEE_SHARE: &str = "0.75"; + const DEX_FEE_SHARE: &'static str = "0.75"; /// Recreates a `DexFee` from separate fields (usually stored in db). #[cfg(any(test, feature = "for-tests"))] diff --git a/mm2src/coins/nft/nft_tests.rs b/mm2src/coins/nft/nft_tests.rs index b5659ae52e..cd3c1a12b0 100644 --- a/mm2src/coins/nft/nft_tests.rs +++ b/mm2src/coins/nft/nft_tests.rs @@ -216,7 +216,7 @@ cross_test!(test_nft_list, { .await .unwrap(); assert_eq!(nft_list.nfts.len(), 1); - let nft = nft_list.nfts.get(0).unwrap(); + let nft = nft_list.nfts.first().unwrap(); assert_eq!(nft.block_number, 28056721); assert_eq!(nft_list.skipped, 2); assert_eq!(nft_list.total, 4); @@ -465,8 +465,7 @@ cross_test!(test_add_get_transfers, { let transfer1 = storage .get_transfers_by_token_addr_id(chain, TOKEN_ADD.to_string(), token_id) .await - .unwrap() - .get(0) + .unwrap().first() .unwrap() .clone(); assert_eq!(transfer1.block_number, 28056721); @@ -513,7 +512,7 @@ cross_test!(test_transfer_history, { .await .unwrap(); assert_eq!(transfer_history.transfer_history.len(), 1); - let transfer = transfer_history.transfer_history.get(0).unwrap(); + let transfer = transfer_history.transfer_history.first().unwrap(); assert_eq!(transfer.block_number, 28056721); assert_eq!(transfer_history.skipped, 2); assert_eq!(transfer_history.total, 4); @@ -559,7 +558,7 @@ cross_test!(test_transfer_history_filters, { .await .unwrap(); assert_eq!(transfer_history.transfer_history.len(), 4); - let transfer = transfer_history.transfer_history.get(0).unwrap(); + let transfer = transfer_history.transfer_history.first().unwrap(); assert_eq!(transfer.block_number, 28056726); let transfer_history1 = storage @@ -567,7 +566,7 @@ cross_test!(test_transfer_history_filters, { .await .unwrap(); assert_eq!(transfer_history1.transfer_history.len(), 1); - let transfer1 = transfer_history1.transfer_history.get(0).unwrap(); + let transfer1 = transfer_history1.transfer_history.first().unwrap(); assert_eq!(transfer1.block_number, 25919780); let transfer_history2 = storage @@ -575,7 +574,7 @@ cross_test!(test_transfer_history_filters, { .await .unwrap(); assert_eq!(transfer_history2.transfer_history.len(), 2); - let transfer_0 = transfer_history2.transfer_history.get(0).unwrap(); + let transfer_0 = transfer_history2.transfer_history.first().unwrap(); assert_eq!(transfer_0.block_number, 28056721); let transfer_1 = transfer_history2.transfer_history.get(1).unwrap(); assert_eq!(transfer_1.block_number, 25919780); @@ -611,7 +610,7 @@ cross_test!(test_get_update_transfer_meta, { .get_transfers_by_token_addr_id(chain, token_add, Default::default()) .await .unwrap(); - let transfer_upd = transfer_upd.get(0).unwrap(); + let transfer_upd = transfer_upd.first().unwrap(); assert_eq!(transfer_upd.token_name, Some("Tiki box".to_string())); assert!(transfer_upd.common.possible_spam); }); diff --git a/mm2src/coins/qrc20/history.rs b/mm2src/coins/qrc20/history.rs index e6c6eb7085..306876e687 100644 --- a/mm2src/coins/qrc20/history.rs +++ b/mm2src/coins/qrc20/history.rs @@ -558,7 +558,7 @@ impl Qrc20Coin { return Ok(HistoryMapByHash::default()); }, }; - let tx_hash_history = history_map.entry(id.tx_hash).or_insert_with(HashMap::default); + let tx_hash_history = history_map.entry(id.tx_hash).or_default(); if tx_hash_history.insert(id, tx).is_some() { ctx.log.log( "😟", diff --git a/mm2src/coins/utxo/bch.rs b/mm2src/coins/utxo/bch.rs index 6faec64ea6..511501b598 100644 --- a/mm2src/coins/utxo/bch.rs +++ b/mm2src/coins/utxo/bch.rs @@ -112,7 +112,7 @@ impl BchUnspents { bch_unspent, slp_amount, }; - self.slp.entry(token_id).or_insert_with(Vec::new).push(slp_unspent); + self.slp.entry(token_id).or_default().push(slp_unspent); } fn add_slp_baton(&mut self, utxo: UnspentInfo) { self.slp_batons.push(utxo) } @@ -384,8 +384,7 @@ impl BchCoin { ) .await?; let maybe_op_return: Script = tx - .outputs - .get(0) + .outputs.first() .ok_or(UtxoTxDetailsError::Internal(format!( "Transaction {} has no outputs", params.hash diff --git a/mm2src/coins/utxo/qtum_delegation.rs b/mm2src/coins/utxo/qtum_delegation.rs index a37eba4cdf..5a80d4eefc 100644 --- a/mm2src/coins/utxo/qtum_delegation.rs +++ b/mm2src/coins/utxo/qtum_delegation.rs @@ -184,8 +184,7 @@ impl QtumCoin { }) .and_then(|receipt| { receipt - .log - .get(0) + .log.first() .and_then(|log_entry| log_entry.topics.get(1)) .map(|padded_staker_address_hex| padded_staker_address_hex.trim_start_matches('0')) }) { diff --git a/mm2src/coins/utxo/rpc_clients.rs b/mm2src/coins/utxo/rpc_clients.rs index f09d7ddf67..8d0a611327 100644 --- a/mm2src/coins/utxo/rpc_clients.rs +++ b/mm2src/coins/utxo/rpc_clients.rs @@ -1028,7 +1028,7 @@ impl NativeClient { return Ok(transaction_list); } - transaction_list.extend(transactions.into_iter()); + transaction_list.extend(transactions); from += step; } }; diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs index a0528adf56..3452c19b3c 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs @@ -735,7 +735,7 @@ impl ElectrumClient { } let len = CompactInteger::from(headers.count); let mut serialized = serialize(&len).take(); - serialized.extend(headers.hex.0.into_iter()); + serialized.extend(headers.hex.0); drop_mutability!(serialized); let mut reader = Reader::new_with_coin_variant(serialized.as_slice(), coin_name.as_str().into()); @@ -1066,7 +1066,7 @@ impl UtxoRpcClientOps for ElectrumClient { } let len = CompactInteger::from(res.count); let mut serialized = serialize(&len).take(); - serialized.extend(res.hex.0.into_iter()); + serialized.extend(res.hex.0); let mut reader = Reader::new_with_coin_variant(serialized.as_slice(), coin_variant); let headers = reader.read_list::()?; let mut timestamps: Vec<_> = headers.into_iter().map(|block| block.time).collect(); diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs index a3b792e9f6..db7d503965 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs @@ -374,9 +374,7 @@ impl ConnectionManager { // The connections that we can consider (all connections - candidate connections). let all_candidate_connections: Vec<_> = all_connections .iter() - .filter_map(|(_, conn_ctx)| { - (!maintained_connections.contains_key(&conn_ctx.id)).then(|| (conn_ctx.connection.clone(), conn_ctx.id)) - }) + .filter(|&(_, conn_ctx)| (!maintained_connections.contains_key(&conn_ctx.id))).map(|(_, conn_ctx)| (conn_ctx.connection.clone(), conn_ctx.id)) .collect(); // The candidate connections from above, but further filtered by whether they are suspended or not. let non_suspended_candidate_connections: Vec<_> = all_candidate_connections diff --git a/mm2src/coins/utxo/utxo_block_header_storage/sql_block_header_storage.rs b/mm2src/coins/utxo/utxo_block_header_storage/sql_block_header_storage.rs index 183c3abea1..bc32e41d05 100644 --- a/mm2src/coins/utxo/utxo_block_header_storage/sql_block_header_storage.rs +++ b/mm2src/coins/utxo/utxo_block_header_storage/sql_block_header_storage.rs @@ -314,7 +314,7 @@ impl BlockHeaderStorageOps for SqliteBlockHeadersStorage { ) -> Result<(), BlockHeaderStorageError> { let coin = self.ticker.clone(); let sql = remove_headers_from_to_height_sql(&coin)?; - let params = vec![from_height.to_string(), to_height.to_string()]; + let params = [from_height.to_string(), to_height.to_string()]; let selfi = self.clone(); async_blocking(move || { diff --git a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs index 70898748e8..9db391b91b 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs @@ -20,8 +20,8 @@ use futures::channel::mpsc::{channel, Receiver as AsyncReceiver}; use futures::compat::Future01CompatExt; use futures::lock::Mutex as AsyncMutex; use keys::bytes::Bytes; -pub use keys::{Address, AddressBuilder, AddressFormat as UtxoAddressFormat, AddressHashEnum, AddressScriptType, - KeyPair, Private, Public, Secret}; +pub use keys::{Address, AddressBuilder, AddressFormat as UtxoAddressFormat, + KeyPair, Private}; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; use primitives::hash::H160; diff --git a/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs index 5ae7fcb405..bbbc64dbf4 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs @@ -6,8 +6,7 @@ use bitcrypto::ChecksumType; use crypto::{Bip32Error, HDPathToCoin}; use derive_more::Display; use keys::NetworkAddressPrefixes; -pub use keys::{Address, AddressFormat as UtxoAddressFormat, AddressHashEnum, AddressScriptType, KeyPair, Private, - Public, Secret}; +pub use keys::AddressFormat as UtxoAddressFormat; use mm2_err_handle::prelude::*; use script::SignatureVersion; use serde_json::{self as json, Value as Json}; diff --git a/mm2src/coins/utxo/utxo_common.rs b/mm2src/coins/utxo/utxo_common.rs index a70469e165..7c6ff77987 100644 --- a/mm2src/coins/utxo/utxo_common.rs +++ b/mm2src/coins/utxo/utxo_common.rs @@ -5067,11 +5067,11 @@ where script_pubkey: Builder::build_p2sh(&AddressHashEnum::AddressHash(dhash160(&redeem_script))).into(), }; - if args.funding_tx.outputs.get(0) != Some(&expected_output) { + if args.funding_tx.outputs.first() != Some(&expected_output) { return MmError::err(ValidateSwapV2TxError::InvalidDestinationOrAmount(format!( "Expected {:?}, got {:?}", expected_output, - args.funding_tx.outputs.get(0) + args.funding_tx.outputs.first() ))); } diff --git a/mm2src/coins_activation/src/bch_with_tokens_activation.rs b/mm2src/coins_activation/src/bch_with_tokens_activation.rs index 289c0785a6..76bf29c0b1 100644 --- a/mm2src/coins_activation/src/bch_with_tokens_activation.rs +++ b/mm2src/coins_activation/src/bch_with_tokens_activation.rs @@ -375,7 +375,7 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { fn start_history_background_fetching( &self, ctx: MmArc, - storage: impl TxHistoryStorage + Send + 'static, + storage: impl TxHistoryStorage + 'static, initial_balance: Option, ) { let fut = bch_and_slp_history_loop( diff --git a/mm2src/coins_activation/src/eth_with_token_activation.rs b/mm2src/coins_activation/src/eth_with_token_activation.rs index 6b2a9963a5..30c1f83393 100644 --- a/mm2src/coins_activation/src/eth_with_token_activation.rs +++ b/mm2src/coins_activation/src/eth_with_token_activation.rs @@ -444,7 +444,7 @@ impl PlatformCoinWithTokensActivationOps for EthCoin { fn start_history_background_fetching( &self, _ctx: MmArc, - _storage: impl TxHistoryStorage + Send + 'static, + _storage: impl TxHistoryStorage + 'static, _initial_balance: Option, ) { } diff --git a/mm2src/coins_activation/src/l2/mod.rs b/mm2src/coins_activation/src/l2/mod.rs index f1b0f93614..92f40109ea 100644 --- a/mm2src/coins_activation/src/l2/mod.rs +++ b/mm2src/coins_activation/src/l2/mod.rs @@ -2,5 +2,5 @@ mod init_l2; mod init_l2_error; pub use init_l2::{cancel_init_l2, init_l2, init_l2_status, init_l2_user_action, InitL2ActivationOps, - InitL2InitialStatus, InitL2Task, InitL2TaskHandleShared, InitL2TaskManagerShared, L2ProtocolParams}; + InitL2InitialStatus, InitL2TaskHandleShared, InitL2TaskManagerShared, L2ProtocolParams}; pub use init_l2_error::InitL2Error; diff --git a/mm2src/coins_activation/src/standalone_coin/mod.rs b/mm2src/coins_activation/src/standalone_coin/mod.rs index 0ab208abc2..69f49d79bb 100644 --- a/mm2src/coins_activation/src/standalone_coin/mod.rs +++ b/mm2src/coins_activation/src/standalone_coin/mod.rs @@ -4,6 +4,6 @@ mod init_standalone_coin_error; pub use init_standalone_coin::{cancel_init_standalone_coin, init_standalone_coin, init_standalone_coin_status, init_standalone_coin_user_action, InitStandaloneCoinActivationOps, InitStandaloneCoinInitialStatus, InitStandaloneCoinReq, - InitStandaloneCoinStatusRequest, InitStandaloneCoinTask, + InitStandaloneCoinStatusRequest, InitStandaloneCoinTaskHandleShared, InitStandaloneCoinTaskManagerShared}; pub use init_standalone_coin_error::InitStandaloneCoinError; diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index 078f601f66..a438a6b03b 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -11,10 +11,9 @@ //! binary #![allow(uncommon_codepoints)] -#![feature(integer_atomics, panic_info_message)] +#![feature(panic_info_message)] #![feature(async_closure)] #![feature(hash_raw_entry)] -#![feature(drain_filter)] #[macro_use] extern crate arrayref; #[macro_use] extern crate gstuff; @@ -509,7 +508,7 @@ pub fn set_panic_hook() { pub fn set_panic_hook() { use std::sync::atomic::AtomicBool; - thread_local! {static ENTERED: AtomicBool = AtomicBool::new(false);} + thread_local! {static ENTERED: AtomicBool = const { AtomicBool::new(false) };} set_hook(Box::new(|info: &PanicInfo| { // Stack tracing and logging might panic (in `println!` for example). diff --git a/mm2src/common/log.rs b/mm2src/common/log.rs index 41116073ca..edcfa62e6a 100644 --- a/mm2src/common/log.rs +++ b/mm2src/common/log.rs @@ -114,7 +114,7 @@ impl Gravity { thread_local! { /// If set, pulls the `chunk2log` (aka `log!`) invocations into the gravity of another thread. - static GRAVITY: RefCell>> = RefCell::new (None) + static GRAVITY: RefCell>> = const { RefCell::new (None) } } #[doc(hidden)] diff --git a/mm2src/mm2_bitcoin/keys/src/address.rs b/mm2src/mm2_bitcoin/keys/src/address.rs index 224b886bb4..8714714597 100644 --- a/mm2src/mm2_bitcoin/keys/src/address.rs +++ b/mm2src/mm2_bitcoin/keys/src/address.rs @@ -518,16 +518,12 @@ mod tests { #[test] fn test_from_to_cashaddress() { - let cashaddresses = vec![ - "bitcoincash:qzxqqt9lh4feptf0mplnk58gnajfepzwcq9f2rxk55", + let cashaddresses = ["bitcoincash:qzxqqt9lh4feptf0mplnk58gnajfepzwcq9f2rxk55", "bitcoincash:qr6m7j9njldwwzlg9v7v53unlr4jkmx6eylep8ekg2", - "bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f", - ]; - let expected = vec![ - "1DmFp16U73RrVZtYUbo2Ectt8mAnYScpqM", + "bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f"]; + let expected = ["1DmFp16U73RrVZtYUbo2Ectt8mAnYScpqM", "1PQPheJQSauxRPTxzNMUco1XmoCyPoEJCp", - "35XRC5HRZjih1sML23UXv1Ry1SzTDKSmfQ", - ]; + "35XRC5HRZjih1sML23UXv1Ry1SzTDKSmfQ"]; for i in 0..3 { let actual_address = diff --git a/mm2src/mm2_bitcoin/keys/src/cashaddress.rs b/mm2src/mm2_bitcoin/keys/src/cashaddress.rs index ea7f43c2d6..91ce3131ec 100644 --- a/mm2src/mm2_bitcoin/keys/src/cashaddress.rs +++ b/mm2src/mm2_bitcoin/keys/src/cashaddress.rs @@ -415,8 +415,7 @@ mod tests { #[test] fn test_base32() { // the raw arrays are 5-bit packed - the condition is required by base32 encode and decode functions - let raw = vec![ - vec![ + let raw = [vec![ 24, 14, 9, 25, 19, 30, 22, 1, 28, 0, 30, 28, 22, 7, 1, 11, 18, 7, 1, 7, 19, 23, 21, 30, 24, 25, 20, 27, 3, 27, 29, 10, ], @@ -427,13 +426,10 @@ mod tests { vec![ 12, 2, 21, 24, 0, 0, 5, 14, 7, 6, 22, 25, 22, 31, 20, 9, 18, 12, 10, 6, 11, 28, 7, 14, 19, 9, 15, 29, 15, 22, 11, 27, - ], - ]; - let encoded = vec![ - "cwfen7kpuq7uk8ptj8p8nh47ce5mrma2", + ]]; + let encoded = ["cwfen7kpuq7uk8ptj8p8nh47ce5mrma2", "gg0guaszp3e93yzg3405tcasx5tzkjk9", - "vz4cqq9w8xkekl5fjv2xtu8wnf0a0ktm", - ]; + "vz4cqq9w8xkekl5fjv2xtu8wnf0a0ktm"]; for i in 0..3 { let actual_encoded = base32::encode(&raw[i]).unwrap(); @@ -447,13 +443,11 @@ mod tests { #[test] fn test_encode_decode() { - let encoded = vec![ - "bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f", + let encoded = ["bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f", "qrplwyx7kueqkrh6dmd3fclta6u32hafp5tnpkchx2", "BitCoinCash:QRPLWYX7KUEQKRH6DMD3FCLTA6U32HAFP5TNPKCHX2", "bchtest:qqjr7yu573z4faxw8ltgvjwpntwys08fysk07zmvce", - "bchtest:pnq8zwpj8cq05n7pytfmskuk9r4gzzel8qtsvwz79zdskftrzxtar994cgutavfklvmgm6ynej", - ]; + "bchtest:pnq8zwpj8cq05n7pytfmskuk9r4gzzel8qtsvwz79zdskftrzxtar994cgutavfklvmgm6ynej"]; let expected_addresses = vec![ CashAddress { prefix: "bitcoincash".into(), diff --git a/mm2src/mm2_bitcoin/script/src/sign.rs b/mm2src/mm2_bitcoin/script/src/sign.rs index 089c25a614..993e40c00f 100644 --- a/mm2src/mm2_bitcoin/script/src/sign.rs +++ b/mm2src/mm2_bitcoin/script/src/sign.rs @@ -42,7 +42,7 @@ impl From for u32 { fn from(s: SighashBase) -> Self { s as u32 } } -#[cfg_attr(feature = "cargo-clippy", allow(clippy::doc_markdown))] +#[allow(clippy::doc_markdown)] /// Signature hash type. [Documentation](https://en.bitcoin.it/wiki/OP_CHECKSIG#Procedure_for_Hashtype_SIGHASH_SINGLE) #[derive(Debug, PartialEq, Clone, Copy)] pub struct Sighash { @@ -82,7 +82,7 @@ impl Sighash { }; // Only exact All | None | Single values are passing this check - matches!(u, 1 | 2 | 3) + matches!(u, 1..=3) } /// Creates Sighash from any u, even if is_defined() == false diff --git a/mm2src/mm2_bitcoin/serialization/src/reader.rs b/mm2src/mm2_bitcoin/serialization/src/reader.rs index 1b9677ac32..9f4e3778c3 100644 --- a/mm2src/mm2_bitcoin/serialization/src/reader.rs +++ b/mm2src/mm2_bitcoin/serialization/src/reader.rs @@ -212,7 +212,7 @@ where Ok(result) } - #[cfg_attr(feature = "cargo-clippy", allow(clippy::wrong_self_convention))] + #[allow(clippy::wrong_self_convention)] pub fn is_finished(&mut self) -> bool { if self.peeked.is_some() { return false; diff --git a/mm2src/mm2_eth/src/eip712_encode.rs b/mm2src/mm2_eth/src/eip712_encode.rs index dbda992b83..bd7fc742f9 100644 --- a/mm2src/mm2_eth/src/eip712_encode.rs +++ b/mm2src/mm2_eth/src/eip712_encode.rs @@ -144,7 +144,7 @@ fn encode_address(value: &Json, field_name: Option<&str>) -> Result> { .ok_or_else(|| expected_type_error("address", value, field_name))?; // "0x" - 2 chars, 40 chars are 20 hexed bytes. if string.len() != 42 { - return Err(decode_error("Expected 0x-prefixed address (20 bytes)", field_name))?; + Err(decode_error("Expected 0x-prefixed address (20 bytes)", field_name))?; } let address = Address::from_str(&string[2..]).map_err(|e| decode_error(e, field_name))?; Ok(encode(&[Token::Address(address)])) diff --git a/mm2src/mm2_io/src/fs.rs b/mm2src/mm2_io/src/fs.rs index 960886a2b2..66e977cd92 100644 --- a/mm2src/mm2_io/src/fs.rs +++ b/mm2src/mm2_io/src/fs.rs @@ -78,7 +78,7 @@ pub fn ensure_file_is_writable(file_path: &Path) -> Result<(), String> { } } else { // try to open file in write append mode - if let Err(e) = fs::OpenOptions::new().write(true).append(true).open(file_path) { + if let Err(e) = fs::OpenOptions::new().append(true).open(file_path) { return ERR!( "{} when trying to open the file {} in write mode", e, diff --git a/mm2src/mm2_main/Cargo.toml b/mm2src/mm2_main/Cargo.toml index 28291cb210..d3f2f7f490 100644 --- a/mm2src/mm2_main/Cargo.toml +++ b/mm2src/mm2_main/Cargo.toml @@ -40,7 +40,7 @@ coins = { path = "../coins" } coins_activation = { path = "../coins_activation" } common = { path = "../common" } compatible-time = { version = "1.1.0", package = "web-time" } -crc32fast = { version = "1.3.2", features = ["std", "nightly"] } +crc32fast = { version = "1.4.2", features = ["std", "nightly"] } crossbeam = "0.8" crypto = { path = "../crypto" } db_common = { path = "../db_common" } diff --git a/mm2src/mm2_main/src/database/my_orders.rs b/mm2src/mm2_main/src/database/my_orders.rs index 7e38c4bfa9..6b43f12d1e 100644 --- a/mm2src/mm2_main/src/database/my_orders.rs +++ b/mm2src/mm2_main/src/database/my_orders.rs @@ -88,13 +88,11 @@ pub fn insert_taker_order(ctx: &MmArc, uuid: Uuid, order: &TakerOrder) -> SqlRes pub fn update_maker_order(ctx: &MmArc, uuid: Uuid, order: &MakerOrder) -> SqlResult<()> { debug!("Updating order {} in the SQLite database", uuid); - let params = vec![ - uuid.to_string(), + let params = [uuid.to_string(), order.price.to_decimal().to_string(), order.max_base_vol.to_decimal().to_string(), order.updated_at.unwrap_or(0).to_string(), - "Updated".to_string(), - ]; + "Updated".to_string()]; let conn = ctx.sqlite_connection(); conn.execute(UPDATE_MY_ORDER, params_from_iter(params.iter())) .map(|_| ()) @@ -102,12 +100,10 @@ pub fn update_maker_order(ctx: &MmArc, uuid: Uuid, order: &MakerOrder) -> SqlRes pub fn update_was_taker(ctx: &MmArc, uuid: Uuid) -> SqlResult<()> { debug!("Updating order {} in the SQLite database", uuid); - let params = vec![ - uuid.to_string(), + let params = [uuid.to_string(), "Maker".to_string(), now_ms().to_string(), - 1.to_string(), - ]; + 1.to_string()]; let conn = ctx.sqlite_connection(); conn.execute(UPDATE_WAS_TAKER, params_from_iter(params.iter())) .map(|_| ()) @@ -115,7 +111,7 @@ pub fn update_was_taker(ctx: &MmArc, uuid: Uuid) -> SqlResult<()> { pub fn update_order_status(ctx: &MmArc, uuid: Uuid, status: String) -> SqlResult<()> { debug!("Updating order {} in the SQLite database", uuid); - let params = vec![uuid.to_string(), now_ms().to_string(), status]; + let params = [uuid.to_string(), now_ms().to_string(), status]; let conn = ctx.sqlite_connection(); conn.execute(UPDATE_ORDER_STATUS, params_from_iter(params.iter())) .map(|_| ()) @@ -283,7 +279,7 @@ pub fn select_orders_by_filter( } pub fn select_status_by_uuid(conn: &Connection, uuid: &Uuid) -> Result { - let params = vec![uuid.to_string()]; + let params = [uuid.to_string()]; conn.query_row(SELECT_STATUS_BY_UUID, params_from_iter(params.iter()), |row| { row.get::<_, String>(0) }) diff --git a/mm2src/mm2_main/src/database/stats_nodes.rs b/mm2src/mm2_main/src/database/stats_nodes.rs index c62c84aa3e..1a87bdc51a 100644 --- a/mm2src/mm2_main/src/database/stats_nodes.rs +++ b/mm2src/mm2_main/src/database/stats_nodes.rs @@ -32,11 +32,9 @@ const INSERT_STAT: &str = "INSERT INTO stats_nodes (name, version, timestamp, er pub fn insert_node_info(ctx: &MmArc, node_info: &NodeInfo) -> SqlResult<()> { debug!("Inserting info about node {} to the SQLite database", node_info.name); - let params = vec![ - node_info.name.clone(), + let params = [node_info.name.clone(), node_info.address.clone(), - node_info.peer_id.clone(), - ]; + node_info.peer_id.clone()]; #[cfg(not(feature = "new-db-arch"))] let conn = ctx.sqlite_connection(); #[cfg(feature = "new-db-arch")] @@ -46,7 +44,7 @@ pub fn insert_node_info(ctx: &MmArc, node_info: &NodeInfo) -> SqlResult<()> { pub fn delete_node_info(ctx: &MmArc, name: String) -> SqlResult<()> { debug!("Deleting info about node {} from the SQLite database", name); - let params = vec![name]; + let params = [name]; #[cfg(not(feature = "new-db-arch"))] let conn = ctx.sqlite_connection(); #[cfg(feature = "new-db-arch")] @@ -86,12 +84,10 @@ pub fn insert_node_version_stat(ctx: &MmArc, node_version_stat: NodeVersionStat) "Inserting new version stat for node {} to the SQLite database", node_version_stat.name ); - let params = vec![ - node_version_stat.name, + let params = [node_version_stat.name, node_version_stat.version.unwrap_or_default(), node_version_stat.timestamp.to_string(), - node_version_stat.error.unwrap_or_default(), - ]; + node_version_stat.error.unwrap_or_default()]; #[cfg(not(feature = "new-db-arch"))] let conn = ctx.sqlite_connection(); #[cfg(feature = "new-db-arch")] diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index c2eee6f650..23c1949de9 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -2657,7 +2657,7 @@ impl Orderbook { let base_rel = (order.base.clone(), order.rel.clone()); - let ordered = self.ordered.entry(base_rel.clone()).or_insert_with(BTreeSet::new); + let ordered = self.ordered.entry(base_rel.clone()).or_default(); // have to clone to drop immutable ordered borrow let existing = ordered @@ -2675,17 +2675,17 @@ impl Orderbook { self.pairs_existing_for_base .entry(order.base.clone()) - .or_insert_with(HashSet::new) + .or_default() .insert(order.rel.clone()); self.pairs_existing_for_rel .entry(order.rel.clone()) - .or_insert_with(HashSet::new) + .or_default() .insert(order.base.clone()); self.unordered .entry(base_rel) - .or_insert_with(HashSet::new) + .or_default() .insert(order.uuid); self.streaming_manager diff --git a/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs b/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs index cdc1da7bef..85ed170ef0 100644 --- a/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs +++ b/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs @@ -769,7 +769,7 @@ impl { @@ -828,7 +828,7 @@ impl { @@ -935,7 +935,7 @@ impl hd, _ => panic!("Expected EnableCoinBalance::HD"), }; - let account = balance.accounts.get(0).expect("Expected account at index 0"); + let account = balance.accounts.first().expect("Expected account at index 0"); assert_eq!(account.addresses[0].address, "RXNtAyDSsY3DS3VxTpJegzoHU9bUX54j56"); assert_eq!(account.addresses[1].address, "RVyndZp3ZrhGKSwHryyM3Kcz9aq2EJrW1z"); let new_account = block_on(create_new_account(&mm_hd_0, "RICK", Some(77), 60)); @@ -5696,7 +5696,7 @@ fn test_enable_utxo_with_enable_hd() { EnableCoinBalanceMap::HD(hd) => hd, _ => panic!("Expected EnableCoinBalance::HD"), }; - let account = balance.accounts.get(0).expect("Expected account at index 0"); + let account = balance.accounts.first().expect("Expected account at index 0"); // This is the enabled address, so it should be derived and added to the account assert_eq!( account.addresses[0].address, diff --git a/mm2src/mm2_main/tests/mm2_tests/mod.rs b/mm2src/mm2_main/tests/mm2_tests/mod.rs index 6bd10e28a2..5658aea57e 100644 --- a/mm2src/mm2_main/tests/mm2_tests/mod.rs +++ b/mm2src/mm2_main/tests/mm2_tests/mod.rs @@ -8,11 +8,11 @@ mod orderbook_sync_tests; mod z_coin_tests; mod zhtlc_native_reexport { - pub use common::executor::Timer; - pub use common::{now_ms, wait_until_ms}; - pub use mm2_test_helpers::for_tests::MarketMakerIt; - pub use mm2_test_helpers::for_tests::{init_z_coin_native, init_z_coin_status}; - pub use mm2_test_helpers::structs::{CoinActivationResult, InitTaskResult, InitZcoinStatus, RpcV2Response}; + + + + + } #[cfg(all(feature = "zhtlc-native-tests", not(target_arch = "wasm32")))] diff --git a/mm2src/mm2_metrics/src/mm_metrics.rs b/mm2src/mm2_metrics/src/mm_metrics.rs index 9c77bc73c8..53abb19f9f 100644 --- a/mm2src/mm2_metrics/src/mm_metrics.rs +++ b/mm2src/mm2_metrics/src/mm_metrics.rs @@ -192,7 +192,7 @@ fn map_metrics_to_prepare_tag_metric_output( let (metric_name, labels) = key.into_parts(); output .entry(labels) - .or_insert_with(MetricNameValueMap::new) + .or_default() .insert(metric_name.as_str().to_string(), value); } diff --git a/mm2src/mm2_rpc/Cargo.toml b/mm2src/mm2_rpc/Cargo.toml index 6f84bb201a..89b6b2fa56 100644 --- a/mm2src/mm2_rpc/Cargo.toml +++ b/mm2src/mm2_rpc/Cargo.toml @@ -16,7 +16,7 @@ mm2_err_handle = { path = "../mm2_err_handle", optional = true } mm2_number = { path = "../mm2_number" } rpc = { path = "../mm2_bitcoin/rpc" } serde = "1" -serde_json = { version = "1", features = ["preserve_order", "raw_value"] } +serde_json = { version = "1.0.140", features = ["preserve_order", "raw_value"] } ser_error = { path = "../derives/ser_error", optional = true} ser_error_derive = { path = "../derives/ser_error_derive", optional=true } uuid = { version = "1.2.2", features = ["fast-rng", "serde", "v4"] } diff --git a/mm2src/mm2_state_machine/src/storable_state_machine.rs b/mm2src/mm2_state_machine/src/storable_state_machine.rs index 49b57af532..0847d7b7d7 100644 --- a/mm2src/mm2_state_machine/src/storable_state_machine.rs +++ b/mm2src/mm2_state_machine/src/storable_state_machine.rs @@ -432,7 +432,7 @@ mod tests { async fn store_event(&mut self, machine_id: usize, event: TestEvent) -> Result<(), Self::Error> { self.events_unfinished .entry(machine_id) - .or_insert_with(Vec::new) + .or_default() .push(event); Ok(()) } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f1739addd6..944b828581 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,6 @@ [toolchain] -channel = "nightly-2023-06-01" +# channel = "nightly-2023-06-01" +channel = "nightly-2024-06-05" components = ["rustfmt", "clippy", "rust-analyzer"] + + From 8c4f509e596a3b18c5559e616a860b87463460e0 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 03:40:29 +0100 Subject: [PATCH 13/35] fix naative clippy and update deps --- Cargo.lock | 18 +++-- clippy.toml | 4 +- mm2src/adex_cli/Cargo.toml | 2 +- mm2src/coins/Cargo.toml | 2 +- mm2src/coins/coin_balance.rs | 1 + mm2src/coins/coin_errors.rs | 1 + mm2src/coins/eth.rs | 2 +- .../eth/eth_swap_v2/eth_taker_swap_v2.rs | 1 + mm2src/coins/eth/eth_swap_v2/mod.rs | 3 +- .../coins/eth/fee_estimation/eip1559/mod.rs | 12 ++-- mm2src/coins/eth/fee_estimation/rpc.rs | 1 + mm2src/coins/eth/nft_swap_v2/errors.rs | 1 + mm2src/coins/hd_wallet/errors.rs | 1 + mm2src/coins/lightning.rs | 2 + mm2src/coins/lightning/ln_events.rs | 1 + mm2src/coins/lightning/ln_utils.rs | 1 + mm2src/coins/lp_coins.rs | 14 ++-- mm2src/coins/nft/nft_structs.rs | 1 + mm2src/coins/qrc20/rpc_clients.rs | 2 +- mm2src/coins/rpc_command/get_enabled_coins.rs | 1 + .../rpc_command/lightning/close_channel.rs | 1 + .../rpc_command/lightning/connect_to_node.rs | 1 + .../rpc_command/lightning/generate_invoice.rs | 1 + .../lightning/get_channel_details.rs | 1 + .../lightning/get_claimable_balances.rs | 1 + .../lightning/get_payment_details.rs | 1 + .../rpc_command/lightning/list_channels.rs | 1 + .../lightning/list_payments_by_filter.rs | 1 + .../rpc_command/lightning/open_channel.rs | 1 + .../rpc_command/lightning/send_payment.rs | 1 + .../rpc_command/lightning/trusted_nodes.rs | 1 + .../rpc_command/lightning/update_channel.rs | 1 + .../coins/rpc_command/tendermint/staking.rs | 10 +-- mm2src/coins/siacoin.rs | 1 + mm2src/coins/utxo/rpc_clients.rs | 14 ++-- .../rpc_clients/electrum_rpc/connection.rs | 2 +- .../connection_manager/manager.rs | 4 +- .../utxo/utxo_builder/utxo_arc_builder.rs | 1 + mm2src/coins/utxo/utxo_tests.rs | 3 +- mm2src/coins/utxo/utxo_tx_history_v2.rs | 7 +- mm2src/coins/utxo_signer/Cargo.toml | 2 +- mm2src/coins/z_coin.rs | 2 - .../storage/blockdb/blockdb_sql_storage.rs | 15 ++--- mm2src/coins_activation/Cargo.toml | 2 +- mm2src/common/Cargo.toml | 2 +- mm2src/common/build.rs | 4 +- mm2src/common/log.rs | 7 +- mm2src/common/number_type_casting.rs | 2 +- mm2src/crypto/Cargo.toml | 4 +- mm2src/derives/enum_derives/src/lib.rs | 1 - mm2src/hw_common/Cargo.toml | 2 +- mm2src/ledger/Cargo.toml | 2 +- mm2src/mm2_bin_lib/src/mm2_native_lib.rs | 5 +- mm2src/mm2_bitcoin/keys/Cargo.toml | 2 +- .../mm2_bitcoin/keys/src/address_prefixes.rs | 2 +- mm2src/mm2_bitcoin/primitives/src/hash.rs | 6 +- mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs | 6 +- mm2src/mm2_bitcoin/serialization/Cargo.toml | 2 +- .../serialization_derive/src/de.rs | 2 +- .../serialization_derive/src/ser.rs | 2 +- mm2src/mm2_bitcoin/spv_validation/Cargo.toml | 2 +- mm2src/mm2_core/Cargo.toml | 3 +- mm2src/mm2_core/src/mm_ctx.rs | 1 + mm2src/mm2_db/Cargo.toml | 2 +- mm2src/mm2_err_handle/Cargo.toml | 2 +- mm2src/mm2_event_stream/src/manager.rs | 2 +- mm2src/mm2_gui_storage/Cargo.toml | 2 +- mm2src/mm2_io/Cargo.toml | 2 +- mm2src/mm2_main/Cargo.toml | 2 +- mm2src/mm2_main/src/lp_native_dex.rs | 2 +- mm2src/mm2_main/src/lp_ordermatch.rs | 7 +- .../src/lp_ordermatch/simple_market_maker.rs | 2 +- mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs | 1 + mm2src/mm2_main/src/lp_swap/swap_v2_common.rs | 1 + mm2src/mm2_main/src/lp_swap/taker_swap.rs | 66 ++++++++++++++----- mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs | 1 + mm2src/mm2_main/src/lp_wallet.rs | 1 + .../src/lp_wallet/mnemonics_storage.rs | 1 + .../src/rpc/dispatcher/dispatcher_legacy.rs | 8 +-- .../src/rpc/lp_commands/one_inch/errors.rs | 1 + mm2src/mm2_main/src/rpc/lp_commands/trezor.rs | 1 + .../src/rpc/streaming_activations/balance.rs | 1 + .../src/rpc/streaming_activations/disable.rs | 1 + .../streaming_activations/fee_estimation.rs | 1 + .../rpc/streaming_activations/heartbeat.rs | 1 + .../src/rpc/streaming_activations/network.rs | 1 + .../rpc/streaming_activations/orderbook.rs | 1 + .../src/rpc/streaming_activations/swaps.rs | 7 +- .../rpc/streaming_activations/tx_history.rs | 1 + .../tests/docker_tests/docker_tests_common.rs | 4 +- .../tests/docker_tests/docker_tests_inner.rs | 2 +- .../tests/docker_tests/eth_docker_tests.rs | 6 +- .../tests/docker_tests/swap_watcher_tests.rs | 6 +- mm2src/mm2_main/tests/docker_tests_main.rs | 1 - .../mm2_main/tests/docker_tests_sia_unique.rs | 1 - mm2src/mm2_main/tests/mm2_tests/mod.rs | 16 ++--- mm2src/mm2_metamask/Cargo.toml | 2 +- mm2src/mm2_metrics/Cargo.toml | 2 +- mm2src/mm2_net/Cargo.toml | 2 +- mm2src/mm2_number/src/mm_number.rs | 8 ++- mm2src/mm2_p2p/Cargo.toml | 2 +- mm2src/mm2_rpc/Cargo.toml | 2 +- mm2src/rpc_task/Cargo.toml | 2 +- mm2src/trading_api/Cargo.toml | 4 +- mm2src/trezor/Cargo.toml | 2 +- mm2src/trezor/src/error.rs | 2 +- 106 files changed, 225 insertions(+), 160 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 531e3cca1f..a29f748f46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1083,6 +1083,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.3" @@ -1619,13 +1625,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.11" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ + "convert_case", "proc-macro2", "quote 1.0.40", - "syn 1.0.95", + "rustc_version 0.4.0", + "syn 2.0.101", ] [[package]] @@ -8482,9 +8490,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] diff --git a/clippy.toml b/clippy.toml index 068d7e886b..ab51a95e14 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1,4 +1,6 @@ [[disallowed-methods]] path = "futures::future::Future::wait" replacement = "common::block_on_f01" -reason = "Use the default KDF async executor." \ No newline at end of file +reason = "Use the default KDF async executor." + +allow = ["doc_lazy_continuation"] diff --git a/mm2src/adex_cli/Cargo.toml b/mm2src/adex_cli/Cargo.toml index cb477cacb0..975c6c8d21 100644 --- a/mm2src/adex_cli/Cargo.toml +++ b/mm2src/adex_cli/Cargo.toml @@ -11,7 +11,7 @@ anyhow = { version = "1.0", features = ["std"] } async-trait = "0.1" clap = { version = "4.2", features = ["derive"] } common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" directories = "5.0" env_logger = "0.9.3" http = "0.2" diff --git a/mm2src/coins/Cargo.toml b/mm2src/coins/Cargo.toml index c203d658ba..e2412033a6 100644 --- a/mm2src/coins/Cargo.toml +++ b/mm2src/coins/Cargo.toml @@ -39,7 +39,7 @@ cosmrs = { version = "0.16", default-features = false } crossbeam = "0.8" crypto = { path = "../crypto" } db_common = { path = "../db_common" } -derive_more = "0.99" +derive_more = "0.99.20" ed25519-dalek = { version = "1.0.1", features = ["serde"] } enum_derives = { path = "../derives/enum_derives" } ethabi = { version = "17.0.0" } diff --git a/mm2src/coins/coin_balance.rs b/mm2src/coins/coin_balance.rs index d985b274ed..d737d07e14 100644 --- a/mm2src/coins/coin_balance.rs +++ b/mm2src/coins/coin_balance.rs @@ -6,6 +6,7 @@ use crate::{BalanceError, BalanceResult, CoinBalance, CoinBalanceMap, CoinWithDe use async_trait::async_trait; use common::log::{debug, info}; use crypto::{Bip44Chain, RpcDerivationPath}; +use derive_more::Display; use mm2_err_handle::prelude::*; use mm2_number::BigDecimal; #[cfg(test)] use mocktopus::macros::*; diff --git a/mm2src/coins/coin_errors.rs b/mm2src/coins/coin_errors.rs index 3e9bbc7349..c0d20810ea 100644 --- a/mm2src/coins/coin_errors.rs +++ b/mm2src/coins/coin_errors.rs @@ -2,6 +2,7 @@ use crate::eth::eth_swap_v2::{PrepareTxDataError, ValidatePaymentV2Err}; use crate::eth::nft_swap_v2::errors::{Erc721FunctionError, HtlcParamsError}; use crate::eth::{EthAssocTypesError, EthNftAssocTypesError, Web3RpcError}; use crate::{utxo::rpc_clients::UtxoRpcError, NumConversError, UnexpectedDerivationMethod}; +use derive_more::Display; use enum_derives::EnumFromStringify; use futures01::Future; use mm2_err_handle::prelude::MmError; diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index a229c9e061..051721c471 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -6377,7 +6377,7 @@ pub async fn eth_coin_from_conf_and_request( priv_key_policy: PrivKeyBuildPolicy, ) -> Result { // Convert `PrivKeyBuildPolicy` to `EthPrivKeyBuildPolicy` if it's possible. - let priv_key_policy = try_s!(EthPrivKeyBuildPolicy::try_from(priv_key_policy)); + let priv_key_policy = From::from(priv_key_policy); let mut urls: Vec = try_s!(json::from_value(req["urls"].clone())); if urls.is_empty() { diff --git a/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs b/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs index 3792e12526..a89ba16f57 100644 --- a/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs +++ b/mm2src/coins/eth/eth_swap_v2/eth_taker_swap_v2.rs @@ -6,6 +6,7 @@ use crate::eth::{decode_contract_call, get_function_input_data, wei_from_big_dec ValidateSwapV2TxResult, ValidateTakerFundingArgs, TAKER_SWAP_V2}; use crate::{FindPaymentSpendError, FundingTxSpend, GenTakerFundingSpendArgs, GenTakerPaymentSpendArgs, SearchForFundingSpendErr}; +use derive_more::Display; use enum_derives::EnumFromStringify; use ethabi::{Contract, Function, Token}; use ethcore_transaction::Action; diff --git a/mm2src/coins/eth/eth_swap_v2/mod.rs b/mm2src/coins/eth/eth_swap_v2/mod.rs index eb23fd667d..4a132b091b 100644 --- a/mm2src/coins/eth/eth_swap_v2/mod.rs +++ b/mm2src/coins/eth/eth_swap_v2/mod.rs @@ -3,6 +3,7 @@ use crate::{FindPaymentSpendError, MarketCoinOps}; use common::executor::Timer; use common::log::{error, info}; use common::now_sec; +use derive_more::Display; use enum_derives::EnumFromStringify; use ethabi::{Contract, Token}; use ethcore_transaction::SignedTransaction as SignedEthTx; @@ -202,7 +203,7 @@ fn validate_amount(trading_amount: &BigDecimal) -> Result<(), String> { Ok(()) } -fn check_decoded_length(decoded: &Vec, expected_len: usize) -> Result<(), PrepareTxDataError> { +fn check_decoded_length(decoded: &[Token], expected_len: usize) -> Result<(), PrepareTxDataError> { if decoded.len() != expected_len { return Err(PrepareTxDataError::Internal(format!( "Invalid number of tokens in decoded. Expected {}, found {}", diff --git a/mm2src/coins/eth/fee_estimation/eip1559/mod.rs b/mm2src/coins/eth/fee_estimation/eip1559/mod.rs index b4c3ffbfbc..e9a63faf5b 100644 --- a/mm2src/coins/eth/fee_estimation/eip1559/mod.rs +++ b/mm2src/coins/eth/fee_estimation/eip1559/mod.rs @@ -19,13 +19,13 @@ pub enum EstimationSource { Blocknative, } -impl ToString for EstimationSource { - fn to_string(&self) -> String { +impl std::fmt::Display for EstimationSource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - EstimationSource::Empty => "empty".into(), - EstimationSource::Simple => "simple".into(), - EstimationSource::Infura => "infura".into(), - EstimationSource::Blocknative => "blocknative".into(), + EstimationSource::Empty => write!(f, "empty"), + EstimationSource::Simple => write!(f, "simple"), + EstimationSource::Infura => write!(f, "infura"), + EstimationSource::Blocknative => write!(f, "blocknative"), } } } diff --git a/mm2src/coins/eth/fee_estimation/rpc.rs b/mm2src/coins/eth/fee_estimation/rpc.rs index 6fb3b84498..0d8deab749 100644 --- a/mm2src/coins/eth/fee_estimation/rpc.rs +++ b/mm2src/coins/eth/fee_estimation/rpc.rs @@ -2,6 +2,7 @@ use super::eth_fee_events::EstimatorType; use super::ser::FeePerGasEstimated; use crate::{lp_coinfind, MmCoinEnum}; use common::HttpStatusCode; +use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::mm_error::{MmError, MmResult}; diff --git a/mm2src/coins/eth/nft_swap_v2/errors.rs b/mm2src/coins/eth/nft_swap_v2/errors.rs index 02cb3c7626..7649906252 100644 --- a/mm2src/coins/eth/nft_swap_v2/errors.rs +++ b/mm2src/coins/eth/nft_swap_v2/errors.rs @@ -1,4 +1,5 @@ pub(crate) use crate::eth::eth_swap_v2::PrepareTxDataError; +use derive_more::Display; use enum_derives::EnumFromStringify; #[derive(Debug, Display)] diff --git a/mm2src/coins/hd_wallet/errors.rs b/mm2src/coins/hd_wallet/errors.rs index 8b517bc609..f8482d8afe 100644 --- a/mm2src/coins/hd_wallet/errors.rs +++ b/mm2src/coins/hd_wallet/errors.rs @@ -2,6 +2,7 @@ use super::{HDConfirmAddressError, HDWalletStorageError}; use bip32::Error as Bip32Error; use crypto::trezor::{TrezorError, TrezorProcessingError}; use crypto::{Bip32DerPathError, Bip44Chain, CryptoCtxError, HwError, HwProcessingError, StandardHDPathError, XpubError}; +use derive_more::Display; use rpc_task::RpcTaskError; #[derive(Debug, Display, Serialize, SerializeErrorType)] diff --git a/mm2src/coins/lightning.rs b/mm2src/coins/lightning.rs index a9f3af67a2..6d1ad1d6b2 100644 --- a/mm2src/coins/lightning.rs +++ b/mm2src/coins/lightning.rs @@ -1,3 +1,4 @@ + pub mod ln_conf; pub(crate) mod ln_db; pub mod ln_errors; @@ -37,6 +38,7 @@ use common::executor::{AbortableSystem, AbortedError, Timer}; use common::log::{error, info, LogOnError, LogState}; use common::{async_blocking, get_local_duration_since_epoch, log, now_sec, Future01CompatExt, PagingOptionsEnum}; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use futures::{FutureExt, TryFutureExt}; use futures01::Future; use keys::{hash::H256, CompactSignature, KeyPair, Private, Public}; diff --git a/mm2src/coins/lightning/ln_events.rs b/mm2src/coins/lightning/ln_events.rs index d6c78f9ad9..9c309049fb 100644 --- a/mm2src/coins/lightning/ln_events.rs +++ b/mm2src/coins/lightning/ln_events.rs @@ -9,6 +9,7 @@ use common::executor::{AbortSettings, SpawnAbortable, SpawnFuture, Timer}; use common::log::{error, info}; use common::{new_uuid, now_sec_i64}; use core::time::Duration; +use derive_more::Display; use futures::compat::Future01CompatExt; use lightning::chain::chaininterface::{ConfirmationTarget, FeeEstimator}; use lightning::chain::keysinterface::SpendableOutputDescriptor; diff --git a/mm2src/coins/lightning/ln_utils.rs b/mm2src/coins/lightning/ln_utils.rs index 42048967d8..65d9bf442f 100644 --- a/mm2src/coins/lightning/ln_utils.rs +++ b/mm2src/coins/lightning/ln_utils.rs @@ -8,6 +8,7 @@ use bitcoin::hash_types::BlockHash; use bitcoin_hashes::{sha256d, Hash}; use common::executor::SpawnFuture; use common::log::LogState; +use derive_more::Display; use lightning::chain::keysinterface::{InMemorySigner, KeysManager}; use lightning::chain::{chainmonitor, BestBlock, ChannelMonitorUpdateStatus, Watch}; use lightning::ln::channelmanager::{ChainParameters, ChannelManagerReadArgs, PaymentId, PaymentSendFailure, diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 3fb04f09e2..2fde2ffd2d 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -27,12 +27,10 @@ clippy::forget_non_drop )] #![allow(uncommon_codepoints)] -// #![feature(integer_atomics)] #![feature(async_closure)] #![feature(hash_raw_entry)] #![feature(stmt_expr_attributes)] #![feature(result_flattening)] -#![feature(local_key_cell_methods)] // for tests #[macro_use] extern crate common; #[macro_use] extern crate gstuff; @@ -2520,7 +2518,7 @@ impl TransactionDetails { pub fn should_update_block_height(&self) -> bool { // checking for std::u64::MAX because there was integer overflow // in case of electrum returned -1 so there could be records with MAX confirmations - self.block_height == 0 || self.block_height == std::u64::MAX + self.block_height == 0 || self.block_height == u64::MAX } /// Whether the transaction timestamp should be updated (when tx is confirmed) @@ -4747,12 +4745,12 @@ pub enum RpcClientType { Ethereum, } -impl ToString for RpcClientType { - fn to_string(&self) -> String { +impl std::fmt::Display for RpcClientType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - RpcClientType::Native => "native".into(), - RpcClientType::Electrum => "electrum".into(), - RpcClientType::Ethereum => "ethereum".into(), + RpcClientType::Native => write!(f, "native"), + RpcClientType::Electrum => write!(f, "electrum"), + RpcClientType::Ethereum => write!(f, "ethereum"), } } } diff --git a/mm2src/coins/nft/nft_structs.rs b/mm2src/coins/nft/nft_structs.rs index 34be85f2b5..cc2223da2b 100644 --- a/mm2src/coins/nft/nft_structs.rs +++ b/mm2src/coins/nft/nft_structs.rs @@ -1,4 +1,5 @@ use common::ten; +use derive_more::Display; use enum_derives::EnumVariantList; use ethereum_types::Address; use mm2_core::mm_ctx::{from_ctx, MmArc}; diff --git a/mm2src/coins/qrc20/rpc_clients.rs b/mm2src/coins/qrc20/rpc_clients.rs index 4feb1848a1..4541a8cd71 100644 --- a/mm2src/coins/qrc20/rpc_clients.rs +++ b/mm2src/coins/qrc20/rpc_clients.rs @@ -421,7 +421,7 @@ impl Qrc20RpcOps for UtxoRpcClientEnum { Some(_) => return ERR!(r#"Expected Uint as "decimals" result but got {:?}"#, tokens), None => return ERR!(r#"Expected Uint as "decimals" result but got nothing"#), }; - if decimals <= (std::u8::MAX as u64) { + if decimals <= (u8::MAX as u64) { Ok(decimals as u8) } else { ERR!("decimals {} is not u8", decimals) diff --git a/mm2src/coins/rpc_command/get_enabled_coins.rs b/mm2src/coins/rpc_command/get_enabled_coins.rs index 543f6160eb..4e81aeaf70 100644 --- a/mm2src/coins/rpc_command/get_enabled_coins.rs +++ b/mm2src/coins/rpc_command/get_enabled_coins.rs @@ -1,5 +1,6 @@ use crate::CoinsContext; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::MmResult; diff --git a/mm2src/coins/rpc_command/lightning/close_channel.rs b/mm2src/coins/rpc_command/lightning/close_channel.rs index cbcb237582..aabf15f9f3 100644 --- a/mm2src/coins/rpc_command/lightning/close_channel.rs +++ b/mm2src/coins/rpc_command/lightning/close_channel.rs @@ -1,5 +1,6 @@ use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::{async_blocking, HttpStatusCode}; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/rpc_command/lightning/connect_to_node.rs b/mm2src/coins/rpc_command/lightning/connect_to_node.rs index ab776cb49e..e365fd746a 100644 --- a/mm2src/coins/rpc_command/lightning/connect_to_node.rs +++ b/mm2src/coins/rpc_command/lightning/connect_to_node.rs @@ -4,6 +4,7 @@ use crate::lightning::ln_serialization::NodeAddress; use crate::lightning::ln_storage::LightningStorage; use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/rpc_command/lightning/generate_invoice.rs b/mm2src/coins/rpc_command/lightning/generate_invoice.rs index 051402b44c..37ccbd4706 100644 --- a/mm2src/coins/rpc_command/lightning/generate_invoice.rs +++ b/mm2src/coins/rpc_command/lightning/generate_invoice.rs @@ -6,6 +6,7 @@ use bitcoin_hashes::Hash; use common::log::LogOnError; use common::{async_blocking, HttpStatusCode}; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use http::StatusCode; use lightning::ln::PaymentHash; use lightning_invoice::utils::create_invoice_from_channelmanager; diff --git a/mm2src/coins/rpc_command/lightning/get_channel_details.rs b/mm2src/coins/rpc_command/lightning/get_channel_details.rs index f806c0e916..51965ae7c5 100644 --- a/mm2src/coins/rpc_command/lightning/get_channel_details.rs +++ b/mm2src/coins/rpc_command/lightning/get_channel_details.rs @@ -3,6 +3,7 @@ use crate::lightning::ln_serialization::ChannelDetailsForRPC; use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::HttpStatusCode; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs b/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs index 511892a1cd..eb2f019578 100644 --- a/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs +++ b/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs @@ -3,6 +3,7 @@ use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::{async_blocking, HttpStatusCode}; use http::StatusCode; use mm2_core::mm_ctx::MmArc; +use derive_more::Display; use mm2_err_handle::prelude::*; type ClaimableBalancesResult = Result>; diff --git a/mm2src/coins/rpc_command/lightning/get_payment_details.rs b/mm2src/coins/rpc_command/lightning/get_payment_details.rs index 7823e04b5f..63e6af3967 100644 --- a/mm2src/coins/rpc_command/lightning/get_payment_details.rs +++ b/mm2src/coins/rpc_command/lightning/get_payment_details.rs @@ -5,6 +5,7 @@ use common::HttpStatusCode; use db_common::sqlite::rusqlite::Error as SqlError; use http::StatusCode; use lightning::ln::PaymentHash; +use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/rpc_command/lightning/list_channels.rs b/mm2src/coins/rpc_command/lightning/list_channels.rs index 3c857f2e0f..3e36c2526d 100644 --- a/mm2src/coins/rpc_command/lightning/list_channels.rs +++ b/mm2src/coins/rpc_command/lightning/list_channels.rs @@ -4,6 +4,7 @@ use crate::lightning::OpenChannelsFilter; use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::{calc_total_pages, ten, HttpStatusCode, PagingOptionsEnum}; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs b/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs index 05f3a6a4f0..c025e0a30d 100644 --- a/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs +++ b/mm2src/coins/rpc_command/lightning/list_payments_by_filter.rs @@ -3,6 +3,7 @@ use crate::lightning::ln_serialization::{PaymentInfoForRPC, PaymentsFilterForRPC use crate::{lp_coinfind_or_err, CoinFindError, H256Json, MmCoinEnum}; use common::{calc_total_pages, ten, HttpStatusCode, PagingOptionsEnum}; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use http::StatusCode; use lightning::ln::PaymentHash; use mm2_core::mm_ctx::MmArc; diff --git a/mm2src/coins/rpc_command/lightning/open_channel.rs b/mm2src/coins/rpc_command/lightning/open_channel.rs index 81622b5962..485fb93941 100644 --- a/mm2src/coins/rpc_command/lightning/open_channel.rs +++ b/mm2src/coins/rpc_command/lightning/open_channel.rs @@ -11,6 +11,7 @@ use chain::TransactionOutput; use common::log::error; use common::{async_blocking, new_uuid, HttpStatusCode}; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use http::StatusCode; use keys::AddressHashEnum; use lightning::util::config::UserConfig; diff --git a/mm2src/coins/rpc_command/lightning/send_payment.rs b/mm2src/coins/rpc_command/lightning/send_payment.rs index 43f1e30ae5..e7318b6fdd 100644 --- a/mm2src/coins/rpc_command/lightning/send_payment.rs +++ b/mm2src/coins/rpc_command/lightning/send_payment.rs @@ -5,6 +5,7 @@ use crate::{lp_coinfind_or_err, CoinFindError, H256Json, MmCoinEnum}; use common::log::LogOnError; use common::HttpStatusCode; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use http::StatusCode; use lightning_invoice::Invoice; use mm2_core::mm_ctx::MmArc; diff --git a/mm2src/coins/rpc_command/lightning/trusted_nodes.rs b/mm2src/coins/rpc_command/lightning/trusted_nodes.rs index 5527215def..d899169503 100644 --- a/mm2src/coins/rpc_command/lightning/trusted_nodes.rs +++ b/mm2src/coins/rpc_command/lightning/trusted_nodes.rs @@ -2,6 +2,7 @@ use crate::lightning::ln_serialization::PublicKeyForRPC; use crate::lightning::ln_storage::LightningStorage; use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/rpc_command/lightning/update_channel.rs b/mm2src/coins/rpc_command/lightning/update_channel.rs index 57b772764c..24bbd7266e 100644 --- a/mm2src/coins/rpc_command/lightning/update_channel.rs +++ b/mm2src/coins/rpc_command/lightning/update_channel.rs @@ -1,6 +1,7 @@ use crate::lightning::ln_conf::ChannelOptions; use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::{async_blocking, HttpStatusCode}; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/rpc_command/tendermint/staking.rs b/mm2src/coins/rpc_command/tendermint/staking.rs index 371cc02075..758536b2eb 100644 --- a/mm2src/coins/rpc_command/tendermint/staking.rs +++ b/mm2src/coins/rpc_command/tendermint/staking.rs @@ -18,13 +18,13 @@ pub(crate) enum ValidatorStatus { Unbonded, } -impl ToString for ValidatorStatus { - fn to_string(&self) -> String { +impl std::fmt::Display for ValidatorStatus { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { // An empty string doesn't filter any validators and we get an unfiltered result. - ValidatorStatus::All => String::default(), - ValidatorStatus::Bonded => "BOND_STATUS_BONDED".into(), - ValidatorStatus::Unbonded => "BOND_STATUS_UNBONDED".into(), + ValidatorStatus::All => write!(f, ""), + ValidatorStatus::Bonded => write!(f, "BOND_STATUS_BONDED"), + ValidatorStatus::Unbonded => write!(f, "BOND_STATUS_UNBONDED"), } } } diff --git a/mm2src/coins/siacoin.rs b/mm2src/coins/siacoin.rs index 37e82ba074..6baca0f3e1 100644 --- a/mm2src/coins/siacoin.rs +++ b/mm2src/coins/siacoin.rs @@ -9,6 +9,7 @@ use crate::{coin_errors::MyAddressError, BalanceFut, CanRefundHtlc, CheckIfMyPay WaitForHTLCTxSpendArgs, WatcherOps, WeakSpawner, WithdrawFut, WithdrawRequest}; use async_trait::async_trait; use common::executor::AbortedError; +use derive_more::Display; pub use ed25519_dalek::{Keypair, PublicKey, SecretKey, Signature}; use futures::{FutureExt, TryFutureExt}; use futures01::Future; diff --git a/mm2src/coins/utxo/rpc_clients.rs b/mm2src/coins/utxo/rpc_clients.rs index 8d0a611327..faa484c29e 100644 --- a/mm2src/coins/utxo/rpc_clients.rs +++ b/mm2src/coins/utxo/rpc_clients.rs @@ -67,11 +67,11 @@ pub enum UtxoRpcClientEnum { Electrum(ElectrumClient), } -impl ToString for UtxoRpcClientEnum { - fn to_string(&self) -> String { +impl std::fmt::Display for UtxoRpcClientEnum { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - UtxoRpcClientEnum::Native(_) => "native".to_owned(), - UtxoRpcClientEnum::Electrum(_) => "electrum".to_owned(), + UtxoRpcClientEnum::Native(_) => write!(f, "native"), + UtxoRpcClientEnum::Electrum(_) => write!(f, "electrum"), } } } @@ -780,7 +780,7 @@ impl JsonRpcBatchClient for NativeClientImpl {} impl UtxoRpcClientOps for NativeClient { fn list_unspent(&self, address: &Address, decimals: u8) -> UtxoRpcFut> { let fut = self - .list_unspent_impl(0, std::i32::MAX, vec![address.to_string()]) + .list_unspent_impl(0, i32::MAX, vec![address.to_string()]) .map_to_mm_fut(UtxoRpcError::from) .and_then(move |unspents| { unspents @@ -801,7 +801,7 @@ impl UtxoRpcClientOps for NativeClient { } let fut = self - .list_unspent_impl(0, std::i32::MAX, addresses_str) + .list_unspent_impl(0, i32::MAX, addresses_str) .map_to_mm_fut(UtxoRpcError::from) .and_then(move |unspents| { unspents @@ -865,7 +865,7 @@ impl UtxoRpcClientOps for NativeClient { fn display_balance(&self, address: Address, _decimals: u8) -> RpcRes { Box::new( - self.list_unspent_impl(0, std::i32::MAX, vec![address.to_string()]) + self.list_unspent_impl(0, i32::MAX, vec![address.to_string()]) .map(|unspents| { unspents .iter() diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs index 3b234dc51f..0c91a11188 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs @@ -239,7 +239,7 @@ impl ElectrumConnection { rpc_id: JsonRpcId, timeout: f64, ) -> Result { - #[cfg(not(target_arch = "wasm"))] + #[cfg(not(target_arch = "wasm32"))] { // Electrum request and responses must end with \n // https://electrumx.readthedocs.io/en/latest/protocol-basics.html#message-stream diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs index db7d503965..6f0e2be2af 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs @@ -12,6 +12,7 @@ use common::executor::{AbortableSystem, SpawnFuture, Timer}; use common::log::{debug, error, LogOnError}; use common::notifier::{Notifiee, Notifier}; use common::now_ms; +use derive_more::Display; use keys::Address; use futures::compat::Future01CompatExt; @@ -374,7 +375,8 @@ impl ConnectionManager { // The connections that we can consider (all connections - candidate connections). let all_candidate_connections: Vec<_> = all_connections .iter() - .filter(|&(_, conn_ctx)| (!maintained_connections.contains_key(&conn_ctx.id))).map(|(_, conn_ctx)| (conn_ctx.connection.clone(), conn_ctx.id)) + .filter(|&(_, conn_ctx)| (!maintained_connections.contains_key(&conn_ctx.id))) + .map(|(_, conn_ctx)| (conn_ctx.connection.clone(), conn_ctx.id)) .collect(); // The candidate connections from above, but further filtered by whether they are suspended or not. let non_suspended_candidate_connections: Vec<_> = all_candidate_connections diff --git a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs index 65bd34103f..c666bd8e92 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs @@ -11,6 +11,7 @@ use async_trait::async_trait; use chain::{BlockHeader, TransactionOutput}; use common::executor::{AbortSettings, SpawnAbortable, Timer}; use common::log::{debug, error, info, warn}; +use derive_more::Display; use futures::compat::Future01CompatExt; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/utxo/utxo_tests.rs b/mm2src/coins/utxo/utxo_tests.rs index 16831a0579..d6a9f2e6b9 100644 --- a/mm2src/coins/utxo/utxo_tests.rs +++ b/mm2src/coins/utxo/utxo_tests.rs @@ -59,6 +59,7 @@ use spv_validation::work::DifficultyAlgorithm; #[cfg(not(target_arch = "wasm32"))] use std::convert::TryFrom; use std::iter; use std::num::NonZeroUsize; +use std::ptr::addr_of; use std::str::FromStr; #[cfg(not(target_arch = "wasm32"))] @@ -4704,7 +4705,7 @@ fn test_scan_for_new_addresses() { assert_eq!(accounts[&0].internal_addresses_number, 4); assert_eq!(accounts[&1].external_addresses_number, 5); assert_eq!(accounts[&1].internal_addresses_number, 2); - assert_eq!(unsafe { &CHECKED_ADDRESSES }, &expected_checked_addresses); + assert_eq!(unsafe { addr_of!(CHECKED_ADDRESSES) }, &expected_checked_addresses); } #[test] diff --git a/mm2src/coins/utxo/utxo_tx_history_v2.rs b/mm2src/coins/utxo/utxo_tx_history_v2.rs index 0231bdc4c7..337e940a17 100644 --- a/mm2src/coins/utxo/utxo_tx_history_v2.rs +++ b/mm2src/coins/utxo/utxo_tx_history_v2.rs @@ -733,14 +733,15 @@ pub async fn bch_and_slp_history_loop( }, None => { let ticker = coin.ticker().to_string(); - match retry_on_err!(async { coin.my_addresses_balances().await }) + let addr_bal = retry_on_err!(async { coin.my_addresses_balances().await }) .until_ready() .repeat_every_secs(30.) .inspect_err(move |e| { error!("Error {e:?} on balance fetching for the coin {}", ticker); }) - .await - { + .await; + + match addr_bal { Ok(addresses_balances) => addresses_balances, Err(e) => { error!("{}", e); diff --git a/mm2src/coins/utxo_signer/Cargo.toml b/mm2src/coins/utxo_signer/Cargo.toml index 7e44ad011e..c1c91dc51d 100644 --- a/mm2src/coins/utxo_signer/Cargo.toml +++ b/mm2src/coins/utxo_signer/Cargo.toml @@ -12,7 +12,7 @@ chain = { path = "../../mm2_bitcoin/chain" } common = { path = "../../common" } mm2_err_handle = { path = "../../mm2_err_handle" } crypto = { path = "../../crypto" } -derive_more = "0.99" +derive_more = "0.99.20" hex = "0.4.2" keys = { path = "../../mm2_bitcoin/keys" } primitives = { path = "../../mm2_bitcoin/primitives" } diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 5a61310355..164985569f 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -177,8 +177,6 @@ impl Parameters for ZcoinConsensusParams { NetworkUpgrade::Blossom => self.blossom_activation_height.map(BlockHeight::from), NetworkUpgrade::Heartwood => self.heartwood_activation_height.map(BlockHeight::from), NetworkUpgrade::Canopy => self.canopy_activation_height.map(BlockHeight::from), - #[cfg(feature = "zfuture")] - NetworkUpgrade::ZFuture => unimplemented!(), } } diff --git a/mm2src/coins/z_coin/storage/blockdb/blockdb_sql_storage.rs b/mm2src/coins/z_coin/storage/blockdb/blockdb_sql_storage.rs index 44721b4364..7289a7c465 100644 --- a/mm2src/coins/z_coin/storage/blockdb/blockdb_sql_storage.rs +++ b/mm2src/coins/z_coin/storage/blockdb/blockdb_sql_storage.rs @@ -169,15 +169,12 @@ impl BlockDbImpl { .map_to_mm(|err| ZcoinStorageError::AddToStorageErr(err.to_string()))?; let rows = stmt_blocks - .query_map( - params![u32::from(from_height), limit.unwrap_or(u32::max_value()),], - |row| { - Ok(CompactBlockRow { - height: BlockHeight::from_u32(row.get(0)?), - data: row.get(1)?, - }) - }, - ) + .query_map(params![u32::from(from_height), limit.unwrap_or(u32::MAX),], |row| { + Ok(CompactBlockRow { + height: BlockHeight::from_u32(row.get(0)?), + data: row.get(1)?, + }) + }) .map_to_mm(|err| ZcoinStorageError::AddToStorageErr(err.to_string()))?; Ok(rows.collect_vec()) diff --git a/mm2src/coins_activation/Cargo.toml b/mm2src/coins_activation/Cargo.toml index be951c67d4..88736acc48 100644 --- a/mm2src/coins_activation/Cargo.toml +++ b/mm2src/coins_activation/Cargo.toml @@ -16,7 +16,7 @@ async-trait = "0.1" coins = { path = "../coins" } common = { path = "../common" } crypto = { path = "../crypto" } -derive_more = "0.99" +derive_more = "0.99.20" ethereum-types = { version = "0.13", default-features = false, features = ["std", "serialize"] } futures = { version = "0.3", package = "futures", features = ["compat", "async-await"] } hex = "0.4.2" diff --git a/mm2src/common/Cargo.toml b/mm2src/common/Cargo.toml index d515ee5f18..c2e29f44d3 100644 --- a/mm2src/common/Cargo.toml +++ b/mm2src/common/Cargo.toml @@ -22,7 +22,7 @@ cfg-if = "1.0" compatible-time = { version = "1.1.0", package = "web-time" } crossbeam = "0.8" env_logger = "0.9.3" -derive_more = "0.99" +derive_more = "0.99.20" fnv = "1.0.6" futures01 = { version = "0.1", package = "futures" } futures = { version = "0.3", package = "futures", features = ["compat", "async-await", "thread-pool"] } diff --git a/mm2src/common/build.rs b/mm2src/common/build.rs index 0230591b5b..c69d12de3a 100644 --- a/mm2src/common/build.rs +++ b/mm2src/common/build.rs @@ -48,7 +48,7 @@ fn _in_place(path: &dyn AsRef, update: &mut dyn FnMut(Vec) -> Vec) /// Please expand this enum if it is necessary. enum TargetArch { Wasm32, - Other(String), + Other, } impl TargetArch { @@ -67,7 +67,7 @@ impl From for TargetArch { fn from(arch: String) -> Self { match arch.as_str() { "wasm32" => TargetArch::Wasm32, - _ => TargetArch::Other(arch), + _ => TargetArch::Other, } } } diff --git a/mm2src/common/log.rs b/mm2src/common/log.rs index edcfa62e6a..22c44b5362 100644 --- a/mm2src/common/log.rs +++ b/mm2src/common/log.rs @@ -1046,11 +1046,8 @@ impl Drop for LogState { } } -#[derive(Debug)] -pub struct UnknownLogLevel(String); - impl FromStr for LogLevel { - type Err = UnknownLogLevel; + type Err = String; fn from_str(s: &str) -> Result { match s.to_lowercase().as_str() { @@ -1060,7 +1057,7 @@ impl FromStr for LogLevel { "info" => Ok(LogLevel::Info), "debug" => Ok(LogLevel::Debug), "trace" => Ok(LogLevel::Trace), - _ => Err(UnknownLogLevel(s.to_owned())), + _ => Err(s.to_owned()), } } } diff --git a/mm2src/common/number_type_casting.rs b/mm2src/common/number_type_casting.rs index 7d68029869..63dcd41521 100644 --- a/mm2src/common/number_type_casting.rs +++ b/mm2src/common/number_type_casting.rs @@ -21,7 +21,7 @@ macro_rules! impl_safe_number_type_cast { ($from: ident, $to: ident) => { impl SafeTypeCastingNumbers<$to> for $from { fn into_or(self, or: $to) -> $to { std::convert::TryFrom::try_from(self).unwrap_or(or) } - fn into_or_max(self) -> $to { std::convert::TryFrom::try_from(self).unwrap_or(std::$to::MAX) } + fn into_or_max(self) -> $to { std::convert::TryFrom::try_from(self).unwrap_or($to::MAX) } } }; } diff --git a/mm2src/crypto/Cargo.toml b/mm2src/crypto/Cargo.toml index dd3bbec752..b196fb1973 100644 --- a/mm2src/crypto/Cargo.toml +++ b/mm2src/crypto/Cargo.toml @@ -19,7 +19,7 @@ bs58 = "0.4.0" cbc = "0.1.2" cipher = "0.4.4" common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" enum_derives = { path = "../derives/enum_derives" } enum-primitive-derive = "0.2" futures = "0.3" @@ -45,7 +45,7 @@ serde_derive = "1.0" serde_json = { version = "1", features = ["preserve_order", "raw_value"] } sha2 = "0.10" trezor = { path = "../trezor" } -zeroize = { version = "1.5", features = ["zeroize_derive"] } +zeroize = { version = "1.8", features = ["zeroize_derive"] } [target.'cfg(target_arch = "wasm32")'.dependencies] cfg-if = "1.0" diff --git a/mm2src/derives/enum_derives/src/lib.rs b/mm2src/derives/enum_derives/src/lib.rs index 666e95a0e3..c135ea4f81 100644 --- a/mm2src/derives/enum_derives/src/lib.rs +++ b/mm2src/derives/enum_derives/src/lib.rs @@ -105,7 +105,6 @@ pub fn enum_from_trait(input: TokenStream) -> TokenStream { /// Bar(String), /// } /// -/// #[test] /// fn test_from_stringify() { /// let num = 6500u64; /// let expected: FooBar = num.into(); diff --git a/mm2src/hw_common/Cargo.toml b/mm2src/hw_common/Cargo.toml index 7d2b43ac12..85650ae142 100644 --- a/mm2src/hw_common/Cargo.toml +++ b/mm2src/hw_common/Cargo.toml @@ -11,7 +11,7 @@ async-trait = "0.1" bip32 = { version = "0.2.2", default-features = false, features = ["alloc", "secp256k1-ffi"] } common = { path = "../common" } mm2_err_handle = { path = "../mm2_err_handle" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3", package = "futures", features = ["compat", "async-await"] } secp256k1 = { version = "0.20", features = ["rand"] } serde = "1.0" diff --git a/mm2src/ledger/Cargo.toml b/mm2src/ledger/Cargo.toml index c6883fc75c..486987ee8d 100644 --- a/mm2src/ledger/Cargo.toml +++ b/mm2src/ledger/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" async-trait = "0.1" byteorder = "1.3.2" common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3", package = "futures", features = ["compat", "async-await"] } hw_common = { path = "../hw_common" } serde = "1.0" diff --git a/mm2src/mm2_bin_lib/src/mm2_native_lib.rs b/mm2src/mm2_bin_lib/src/mm2_native_lib.rs index 8ca51fd4f2..374fd9d630 100644 --- a/mm2src/mm2_bin_lib/src/mm2_native_lib.rs +++ b/mm2src/mm2_bin_lib/src/mm2_native_lib.rs @@ -108,7 +108,7 @@ pub unsafe extern "C" fn mm2_main(conf: *const c_char, log_cb: extern "C" fn(lin }; let rc = thread::Builder::new().name("lp_run".into()).spawn(move || { - match catch_unwind(move || { + let c = catch_unwind(move || { let ctx = match MmArc::from_ffi_handle(ctx_id) { Ok(ctx) => ctx, Err(err) => { @@ -116,7 +116,8 @@ pub unsafe extern "C" fn mm2_main(conf: *const c_char, log_cb: extern "C" fn(lin }, }; block_on(mm2_main::lp_run(ctx)); - }) { + }); + match c { Ok(_) => log!("MM2 thread completed normally"), Err(err) => { log!("MM2 thread panicked: {:?}", any_to_str(&*err)); diff --git a/mm2src/mm2_bitcoin/keys/Cargo.toml b/mm2src/mm2_bitcoin/keys/Cargo.toml index 990bd3dff1..ea864260cd 100644 --- a/mm2src/mm2_bitcoin/keys/Cargo.toml +++ b/mm2src/mm2_bitcoin/keys/Cargo.toml @@ -11,7 +11,7 @@ rustc-hex = "2" base58 = "0.2" bech32 = "0.9.1" bitcrypto = { path = "../crypto" } -derive_more = "0.99" +derive_more = "0.99.20" lazy_static = "1.4" rand = {version = "0.6", features = ["wasm-bindgen"] } primitives = { path = "../primitives" } diff --git a/mm2src/mm2_bitcoin/keys/src/address_prefixes.rs b/mm2src/mm2_bitcoin/keys/src/address_prefixes.rs index 1a20e4aa20..442cb05b3f 100644 --- a/mm2src/mm2_bitcoin/keys/src/address_prefixes.rs +++ b/mm2src/mm2_bitcoin/keys/src/address_prefixes.rs @@ -1,4 +1,4 @@ -use std::{convert::TryFrom, fmt, u8}; +use std::{convert::TryFrom, fmt}; /// Prefix for a legacy address (p2pkh or p2sh) #[derive(Debug, Clone, Eq, Hash, PartialEq, Default)] diff --git a/mm2src/mm2_bitcoin/primitives/src/hash.rs b/mm2src/mm2_bitcoin/primitives/src/hash.rs index 7bf56f5700..bbb544e0a7 100644 --- a/mm2src/mm2_bitcoin/primitives/src/hash.rs +++ b/mm2src/mm2_bitcoin/primitives/src/hash.rs @@ -25,11 +25,7 @@ macro_rules! impl_hash { } impl Clone for $name { - fn clone(&self) -> Self { - let mut result = Self::default(); - result.copy_from_slice(&self.0); - result - } + fn clone(&self) -> Self { *self } } impl From<[u8; $size]> for $name { diff --git a/mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs b/mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs index 08ae1d7afe..919a7049ab 100644 --- a/mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs +++ b/mm2src/mm2_bitcoin/rpc/src/v1/types/hash.rs @@ -131,11 +131,7 @@ macro_rules! impl_hash { } impl PartialOrd for $name { - fn partial_cmp(&self, other: &Self) -> Option { - let self_ref: &[u8] = &self.0; - let other_ref: &[u8] = &other.0; - self_ref.partial_cmp(other_ref) - } + fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } impl Hash for $name { diff --git a/mm2src/mm2_bitcoin/serialization/Cargo.toml b/mm2src/mm2_bitcoin/serialization/Cargo.toml index 590b18296b..55ca72a897 100644 --- a/mm2src/mm2_bitcoin/serialization/Cargo.toml +++ b/mm2src/mm2_bitcoin/serialization/Cargo.toml @@ -9,5 +9,5 @@ doctest = false [dependencies] byteorder = "1.0" primitives = { path = "../primitives" } -derive_more = "0.99" +derive_more = "0.99.20" test_helpers = { path = "../test_helpers" } diff --git a/mm2src/mm2_bitcoin/serialization_derive/src/de.rs b/mm2src/mm2_bitcoin/serialization_derive/src/de.rs index f916bb1caa..295afaf286 100644 --- a/mm2src/mm2_bitcoin/serialization_derive/src/de.rs +++ b/mm2src/mm2_bitcoin/serialization_derive/src/de.rs @@ -28,7 +28,7 @@ pub fn impl_deserializable(ast: &syn::DeriveInput) -> quote::Tokens { }; quote! { - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] + #[allow(non_upper_case_globals, unused_attributes, unused_qualifications, non_local_definitions)] const #dummy_const: () = { extern crate serialization; use std::io; diff --git a/mm2src/mm2_bitcoin/serialization_derive/src/ser.rs b/mm2src/mm2_bitcoin/serialization_derive/src/ser.rs index a2ea294264..1144718ae9 100644 --- a/mm2src/mm2_bitcoin/serialization_derive/src/ser.rs +++ b/mm2src/mm2_bitcoin/serialization_derive/src/ser.rs @@ -34,7 +34,7 @@ pub fn impl_serializable(ast: &syn::DeriveInput) -> quote::Tokens { }; quote! { - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] + #[allow(non_upper_case_globals, unused_attributes, unused_qualifications, non_local_definitions)] const #dummy_const: () = { extern crate serialization; #impl_block diff --git a/mm2src/mm2_bitcoin/spv_validation/Cargo.toml b/mm2src/mm2_bitcoin/spv_validation/Cargo.toml index 53e840955b..ee85095c52 100644 --- a/mm2src/mm2_bitcoin/spv_validation/Cargo.toml +++ b/mm2src/mm2_bitcoin/spv_validation/Cargo.toml @@ -10,7 +10,7 @@ doctest = false [dependencies] async-trait = "0.1" chain = {path = "../chain"} -derive_more = "0.99" +derive_more = "0.99.20" keys = {path = "../keys"} primitives = { path = "../primitives" } ripemd160 = "0.9.0" diff --git a/mm2src/mm2_core/Cargo.toml b/mm2src/mm2_core/Cargo.toml index b3756f9b94..51116fbb93 100644 --- a/mm2src/mm2_core/Cargo.toml +++ b/mm2src/mm2_core/Cargo.toml @@ -8,6 +8,7 @@ doctest = false [features] new-db-arch = [] +track-ctx-pointer = [] [dependencies] arrayref = "0.3" @@ -17,7 +18,7 @@ cfg-if = "1.0" common = { path = "../common" } compatible-time = { version = "1.1.0", package = "web-time" } db_common = { path = "../db_common" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3", package = "futures", features = ["compat", "async-await", "thread-pool"] } gstuff = { version = "0.7", features = ["nightly"] } hex = "0.4.2" diff --git a/mm2src/mm2_core/src/mm_ctx.rs b/mm2src/mm2_core/src/mm_ctx.rs index 292dc69ca6..809f6fa4c7 100644 --- a/mm2src/mm2_core/src/mm_ctx.rs +++ b/mm2src/mm2_core/src/mm_ctx.rs @@ -1,3 +1,4 @@ +use common::executor::SpawnFuture; #[cfg(feature = "track-ctx-pointer")] use common::executor::Timer; use common::executor::{abortable_queue::{AbortableQueue, WeakSpawner}, diff --git a/mm2src/mm2_db/Cargo.toml b/mm2src/mm2_db/Cargo.toml index 5f5374acad..c817e8f363 100644 --- a/mm2src/mm2_db/Cargo.toml +++ b/mm2src/mm2_db/Cargo.toml @@ -9,7 +9,7 @@ doctest = false [target.'cfg(target_arch = "wasm32")'.dependencies] async-trait = "0.1" common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" enum_derives = { path = "../derives/enum_derives" } futures = { version = "0.3", package = "futures", features = ["compat", "async-await", "thread-pool"] } itertools = "0.10" diff --git a/mm2src/mm2_err_handle/Cargo.toml b/mm2src/mm2_err_handle/Cargo.toml index 0e2faaa8d2..23668a5f24 100644 --- a/mm2src/mm2_err_handle/Cargo.toml +++ b/mm2src/mm2_err_handle/Cargo.toml @@ -9,7 +9,7 @@ doctest = false [dependencies] futures01 = { version = "0.1", package = "futures" } serde_json = { version = "1", features = ["preserve_order", "raw_value"] } -derive_more = "0.99" +derive_more = "0.99.20" itertools = "0.10" serde = { version = "1.0", features = ["derive"] } ser_error = { path = "../derives/ser_error" } diff --git a/mm2src/mm2_event_stream/src/manager.rs b/mm2src/mm2_event_stream/src/manager.rs index b480ddd070..e3f6bdbdbe 100644 --- a/mm2src/mm2_event_stream/src/manager.rs +++ b/mm2src/mm2_event_stream/src/manager.rs @@ -540,7 +540,7 @@ mod tests { manager.remove_streamer_if_down(&streamer_id); // The streamer should be removed. - assert!(manager.read().streamers.get(&streamer_id).is_none()); + assert!(!manager.read().streamers.contains_key(&streamer_id)); // And the client is no more listening to it. assert!(!manager .0 diff --git a/mm2src/mm2_gui_storage/Cargo.toml b/mm2src/mm2_gui_storage/Cargo.toml index 8beb78b863..847d75edf7 100644 --- a/mm2src/mm2_gui_storage/Cargo.toml +++ b/mm2src/mm2_gui_storage/Cargo.toml @@ -10,7 +10,7 @@ doctest = false async-trait = "0.1" common = { path = "../common" } db_common = { path = "../db_common" } -derive_more = "0.99" +derive_more = "0.99.20" mm2_core = { path = "../mm2_core" } mm2_err_handle = { path = "../mm2_err_handle" } mm2_number = { path = "../mm2_number" } diff --git a/mm2src/mm2_io/Cargo.toml b/mm2src/mm2_io/Cargo.toml index 925e0944b0..da26e42ff7 100644 --- a/mm2src/mm2_io/Cargo.toml +++ b/mm2src/mm2_io/Cargo.toml @@ -13,7 +13,7 @@ serde = "1" serde_json = { version = "1", features = ["preserve_order", "raw_value"] } rand = { version = "0.7", features = ["std", "small_rng", "wasm-bindgen"] } futures = { version = "0.3", package = "futures", features = ["compat", "async-await", "thread-pool"] } -derive_more = "0.99" +derive_more = "0.99.20" async-std = { version = "1.5", features = ["unstable"] } [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/mm2src/mm2_main/Cargo.toml b/mm2src/mm2_main/Cargo.toml index d3f2f7f490..06e62682db 100644 --- a/mm2src/mm2_main/Cargo.toml +++ b/mm2src/mm2_main/Cargo.toml @@ -44,7 +44,7 @@ crc32fast = { version = "1.4.2", features = ["std", "nightly"] } crossbeam = "0.8" crypto = { path = "../crypto" } db_common = { path = "../db_common" } -derive_more = "0.99" +derive_more = "0.99.20" either = "1.6" ethereum-types = { version = "0.13", default-features = false, features = ["std", "serialize"] } enum_derives = { path = "../derives/enum_derives" } diff --git a/mm2src/mm2_main/src/lp_native_dex.rs b/mm2src/mm2_main/src/lp_native_dex.rs index cfc20de356..f301463151 100644 --- a/mm2src/mm2_main/src/lp_native_dex.rs +++ b/mm2src/mm2_main/src/lp_native_dex.rs @@ -46,11 +46,11 @@ use mm2_metrics::mm_gauge; use rpc_task::RpcTaskError; use serde_json as json; use std::convert::TryInto; +use std::fs; use std::io; use std::path::PathBuf; use std::str; use std::time::Duration; -use std::{fs, usize}; cfg_native! { use db_common::sqlite::rusqlite::Error as SqlError; diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 23c1949de9..333187b1f8 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -536,7 +536,7 @@ fn remove_pubkey_pair_orders(orderbook: &mut Orderbook, pubkey: &str, alb_pair: None => return, }; - if pubkey_state.trie_roots.get(alb_pair).is_none() { + if pubkey_state.trie_roots.contains_key(alb_pair) { return; } @@ -2683,10 +2683,7 @@ impl Orderbook { .or_default() .insert(order.base.clone()); - self.unordered - .entry(base_rel) - .or_default() - .insert(order.uuid); + self.unordered.entry(base_rel).or_default().insert(order.uuid); self.streaming_manager .send_fn(&OrderbookStreamer::derive_streamer_id(&order.base, &order.rel), || { diff --git a/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs b/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs index 78aca5278d..9b80abc94b 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/simple_market_maker.rs @@ -693,7 +693,7 @@ async fn process_bot_logic(ctx: &MmArc) { let mut futures_order_creation = Vec::with_capacity(cfg.len()); // Now iterate over the registry and for every pairs that are not hit let's create an order for (trading_pair, cur_cfg) in cfg { - if memoization_pair_registry.get(&trading_pair).is_some() || !cur_cfg.enable { + if memoization_pair_registry.contains(&trading_pair) || !cur_cfg.enable { continue; } let rates_infos = rates_registry diff --git a/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs b/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs index 85ed170ef0..4377192fc7 100644 --- a/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs +++ b/mm2src/mm2_main/src/lp_swap/maker_swap_v2.rs @@ -20,6 +20,7 @@ use common::log::{debug, error, info, warn}; use common::{now_sec, Future01CompatExt}; use crypto::privkey::SerializableSecp256k1Keypair; use crypto::secret_hash_algo::SecretHashAlgo; +use derive_more::Display; use keys::KeyPair; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs index 9ddd5f6b4c..1356a6f644 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_v2_common.rs @@ -7,6 +7,7 @@ use coins::{lp_coinfind, MakerCoinSwapOpsV2, MmCoin, MmCoinEnum, TakerCoinSwapOp use common::executor::abortable_queue::AbortableQueue; use common::executor::{SpawnFuture, Timer}; use common::log::{error, info, warn}; +use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; use mm2_state_machine::storable_state_machine::{StateMachineDbRepr, StateMachineStorage, StorableStateMachine}; diff --git a/mm2src/mm2_main/src/lp_swap/taker_swap.rs b/mm2src/mm2_main/src/lp_swap/taker_swap.rs index 91289aaa06..8846b46176 100644 --- a/mm2src/mm2_main/src/lp_swap/taker_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/taker_swap.rs @@ -2710,27 +2710,59 @@ pub async fn max_taker_vol(ctx: MmArc, req: Json) -> Result>, S } /// If we want to calculate the maximum taker volume, we should solve the following equation: -/// `max_vol = balance - locked_amount - trade_fee(max_vol) - fee_to_send_taker_fee(dex_fee(max_vol)) - dex_fee(max_vol)` /// -/// 1) If the `trade_fee` and `fee_to_send_taker_fee` should be paid in base coin, the equation can be simplified: -/// `max_vol = balance - locked_amount - dex_fee(max_vol)`, -/// where we can calculate the exact `max_vol` since the function inverse to `dex_fee(x)` can be obtained. +/// ```rust +/// max_vol = balance - locked_amount +/// - trade_fee(max_vol) +/// - fee_to_send_taker_fee(dex_fee(max_vol)) +/// - dex_fee(max_vol) +/// ``` /// -/// 2) Otherwise we cannot express the `max_vol` from the equation above, but we can find smallest of the largest `max_vol`. -/// It means if we find the largest `trade_fee` and `fee_to_send_taker_fee` values and pass them into the equation, we will get: -/// `min_max_vol = balance - locked_amount - max_trade_fee - max_fee_to_send_taker_fee - dex_fee(max_vol)` -/// and then `min_max_vol` can be calculated as in the first case. +/// 1. If the `trade_fee` and `fee_to_send_taker_fee` should be paid in base coin, the equation can be simplified: /// -/// Please note the following condition is satisfied for any `x` and `y`: -/// `if x < y then trade_fee(x) <= trade_fee(y) and fee_to_send_taker_fee(x) <= fee_to_send_taker_fee(y) and dex_fee(x) <= dex_fee(y)` -/// Let `real_max_vol` is a real desired volume. -/// Performing the following steps one by one, we will get an approximate maximum volume: -/// - `max_possible = balance - locked_amount` is a largest possible max volume. Hint, we've replaced unknown subtracted `trade_fee`, `fee_to_send_taker_fee`, `dex_fee` variables with zeros. -/// - `max_trade_fee = trade_fee(max_possible)` is a largest possible `trade_fee` value. -/// - `max_possible_2 = balance - locked_amount - max_trade_fee` is more accurate max volume than `max_possible`. Please note `real_max_vol <= max_possible_2 <= max_possible`. -/// - `max_dex_fee = dex_fee(max_possible_2)` is an intermediate value that will be passed into the `fee_to_send_taker_fee`. +/// ```rust +/// max_vol = balance - locked_amount - dex_fee(max_vol) +/// ``` +/// +/// where we can calculate the exact `max_vol` since the inverse of `dex_fee(x)` is obtainable. +/// +/// 2. Otherwise we cannot express `max_vol` from the equation above, but we can find the smallest of the largest `max_vol`. That means if we find the largest `trade_fee` and `fee_to_send_taker_fee` values and plug them in: +/// +/// ```rust +/// min_max_vol = balance - locked_amount +/// - max_trade_fee +/// - max_fee_to_send_taker_fee +/// - dex_fee(max_vol) +/// ``` +/// +/// then `min_max_vol` can be calculated as in the first case. +/// +/// Please note that for any `x` and `y`, if `x < y` then +/// `trade_fee(x) <= trade_fee(y)`, `fee_to_send_taker_fee(x) <= fee_to_send_taker_fee(y)`, +/// and `dex_fee(x) <= dex_fee(y)`. +/// +/// Let `real_max_vol` be the actual desired volume. Performing the following steps yields +/// an approximate maximum volume: +/// +/// - `max_possible = balance - locked_amount` +/// The largest possible max volume, replacing unknown fees with zero. +/// - `max_trade_fee = trade_fee(max_possible)` +/// The largest possible `trade_fee`. +/// - `max_possible_2 = balance - locked_amount - max_trade_fee` +/// A more accurate upper bound (`real_max_vol <= max_possible_2 <= max_possible`). +/// - `max_dex_fee = dex_fee(max_possible_2)` +/// Passed into `fee_to_send_taker_fee`. /// - `max_fee_to_send_taker_fee = fee_to_send_taker_fee(max_dex_fee)` -/// After that `min_max_vol = balance - locked_amount - max_trade_fee - max_fee_to_send_taker_fee - dex_fee(max_vol)` can be solved as in the first case. +/// +/// After that, +/// ```rust +/// min_max_vol = balance - locked_amount +/// - max_trade_fee +/// - max_fee_to_send_taker_fee +/// - dex_fee(max_vol) +/// ``` +/// can be solved as in the first case. +/// pub async fn calc_max_taker_vol( ctx: &MmArc, coin: &MmCoinEnum, diff --git a/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs b/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs index 33472c3307..056ae9aead 100644 --- a/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs +++ b/mm2src/mm2_main/src/lp_swap/taker_swap_v2.rs @@ -20,6 +20,7 @@ use common::log::{debug, error, info, warn}; use common::Future01CompatExt; use crypto::privkey::SerializableSecp256k1Keypair; use crypto::secret_hash_algo::SecretHashAlgo; +use derive_more::Display; use keys::KeyPair; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/mm2_main/src/lp_wallet.rs b/mm2src/mm2_main/src/lp_wallet.rs index 03bb10718e..dc13e447ca 100644 --- a/mm2src/mm2_main/src/lp_wallet.rs +++ b/mm2src/mm2_main/src/lp_wallet.rs @@ -2,6 +2,7 @@ use common::password_policy::{password_policy, PasswordPolicyError}; use common::HttpStatusCode; use crypto::{decrypt_mnemonic, encrypt_mnemonic, generate_mnemonic, CryptoCtx, CryptoInitError, EncryptedData, MnemonicError}; +use derive_more::Display; use enum_derives::EnumFromStringify; use http::StatusCode; use itertools::Itertools; diff --git a/mm2src/mm2_main/src/lp_wallet/mnemonics_storage.rs b/mm2src/mm2_main/src/lp_wallet/mnemonics_storage.rs index 25e77c27d1..68de6a758b 100644 --- a/mm2src/mm2_main/src/lp_wallet/mnemonics_storage.rs +++ b/mm2src/mm2_main/src/lp_wallet/mnemonics_storage.rs @@ -1,4 +1,5 @@ use crypto::EncryptedData; +use derive_more::Display; use mm2_core::mm_ctx::{MmArc, WALLET_FILE_EXTENSION}; use mm2_err_handle::prelude::*; use mm2_io::fs::{ensure_file_is_writable, list_files_by_extension}; diff --git a/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs b/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs index 5f4b14f8b4..58b74509fe 100644 --- a/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs +++ b/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs @@ -24,7 +24,7 @@ pub enum DispatcherRes { /// `fn dispatcher` has found a Rust handler for the RPC "method". Match(HyRes), /// No handler found by `fn dispatcher`. Returning the `Json` request in order for it to be handled elsewhere. - NoMatch(Json), + NoMatch, } async fn auth(json: &Json, ctx: &MmArc, client: &SocketAddr) -> Result<(), String> { @@ -54,7 +54,7 @@ fn hyres(handler: impl Future03>, String>> + Se pub fn dispatcher(req: Json, ctx: MmArc) -> DispatcherRes { let method = match req["method"].clone() { Json::String(method) => method, - _ => return DispatcherRes::NoMatch(req), + _ => return DispatcherRes::NoMatch, }; DispatcherRes::Match(match &method[..] { // Sorted alphanumerically (on the first latter) for readability. @@ -113,7 +113,7 @@ pub fn dispatcher(req: Json, ctx: MmArc) -> DispatcherRes { "validateaddress" => hyres(validate_address(ctx, req)), "version" => version(ctx), "withdraw" => hyres(into_legacy::withdraw(ctx, req)), - _ => return DispatcherRes::NoMatch(req), + _ => return DispatcherRes::NoMatch, }) } @@ -135,7 +135,7 @@ pub async fn process_single_request( let handler = match dispatcher(req, ctx.clone()) { DispatcherRes::Match(handler) => handler, - DispatcherRes::NoMatch(_) => return ERR!("No such method."), + DispatcherRes::NoMatch => return ERR!("No such method."), }; Ok(try_s!(handler.compat().await)) } diff --git a/mm2src/mm2_main/src/rpc/lp_commands/one_inch/errors.rs b/mm2src/mm2_main/src/rpc/lp_commands/one_inch/errors.rs index 8ee65af984..2ab050fd9e 100644 --- a/mm2src/mm2_main/src/rpc/lp_commands/one_inch/errors.rs +++ b/mm2src/mm2_main/src/rpc/lp_commands/one_inch/errors.rs @@ -1,5 +1,6 @@ use coins::{eth::u256_to_big_decimal, NumConversError}; use common::{HttpStatusCode, StatusCode}; +use derive_more::Display; use enum_derives::EnumFromStringify; use mm2_number::BigDecimal; use ser_error_derive::SerializeErrorType; diff --git a/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs b/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs index 212c810331..5d6a9044f1 100644 --- a/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs +++ b/mm2src/mm2_main/src/rpc/lp_commands/trezor.rs @@ -1,5 +1,6 @@ use common::HttpStatusCode; use crypto::{CryptoCtx, CryptoCtxError, HwConnectionStatus, HwPubkey}; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::map_mm_error::MmResultExt; diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/balance.rs b/mm2src/mm2_main/src/rpc/streaming_activations/balance.rs index 76f9d594e1..0a4a23f370 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/balance.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/balance.rs @@ -7,6 +7,7 @@ use coins::utxo::utxo_balance_events::UtxoBalanceEventStreamer; use coins::z_coin::z_balance_streaming::ZCoinBalanceEventStreamer; use coins::{lp_coinfind, MmCoin, MmCoinEnum}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/disable.rs b/mm2src/mm2_main/src/rpc/streaming_activations/disable.rs index 9643e9e652..60bbbf5e07 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/disable.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/disable.rs @@ -3,6 +3,7 @@ //! All event streamers are deactivated using the streamer ID only. use common::HttpStatusCode; +use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/fee_estimation.rs b/mm2src/mm2_main/src/rpc/streaming_activations/fee_estimation.rs index ef36542716..9ff19d8020 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/fee_estimation.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/fee_estimation.rs @@ -4,6 +4,7 @@ use super::{EnableStreamingRequest, EnableStreamingResponse}; use coins::eth::fee_estimation::eth_fee_events::{EthFeeEventStreamer, EthFeeStreamingConfig}; use coins::{lp_coinfind, MmCoin, MmCoinEnum}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/heartbeat.rs b/mm2src/mm2_main/src/rpc/streaming_activations/heartbeat.rs index e3f4d06c5e..929b6059fd 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/heartbeat.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/heartbeat.rs @@ -3,6 +3,7 @@ use super::{EnableStreamingRequest, EnableStreamingResponse}; use crate::heartbeat_event::{HeartbeatEvent, HeartbeatEventConfig}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/network.rs b/mm2src/mm2_main/src/rpc/streaming_activations/network.rs index 11f9d0ed3b..ca413588b6 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/network.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/network.rs @@ -2,6 +2,7 @@ use super::{EnableStreamingRequest, EnableStreamingResponse}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/orderbook.rs b/mm2src/mm2_main/src/rpc/streaming_activations/orderbook.rs index 60805c4a54..f28794f575 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/orderbook.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/orderbook.rs @@ -1,6 +1,7 @@ //! RPC activation and deactivation of the orderbook streamer. use super::EnableStreamingResponse; use crate::lp_ordermatch::orderbook_events::OrderbookStreamer; +use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/swaps.rs b/mm2src/mm2_main/src/rpc/streaming_activations/swaps.rs index 3d4aa2b93e..f632b1758a 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/swaps.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/swaps.rs @@ -1,11 +1,12 @@ //! RPC activation and deactivation of the swap status streamer. -use super::{EnableStreamingRequest, EnableStreamingResponse}; use crate::lp_swap::swap_events::SwapStatusStreamer; -use mm2_core::mm_ctx::MmArc; -use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; +use super::{EnableStreamingRequest, EnableStreamingResponse}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; +use mm2_core::mm_ctx::MmArc; +use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; #[derive(Display, Serialize, SerializeErrorType)] #[serde(tag = "error_type", content = "error_data")] diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/tx_history.rs b/mm2src/mm2_main/src/rpc/streaming_activations/tx_history.rs index ac37ca21b5..e79893ee8e 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/tx_history.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/tx_history.rs @@ -5,6 +5,7 @@ use coins::utxo::tx_history_events::TxHistoryEventStreamer; use coins::z_coin::tx_history_events::ZCoinTxHistoryEventStreamer; use coins::{lp_coinfind, MmCoin, MmCoinEnum}; use common::HttpStatusCode; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs index 253c8adb74..cb7c99ab93 100644 --- a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs +++ b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs @@ -122,7 +122,7 @@ pub static SEPOLIA_RPC_URL: &str = "https://ethereum-sepolia-rpc.publicnode.com" // use thread local to affect only the current running test thread_local! { /// Set test dex pubkey as Taker (to check DexFee::NoFee) - pub static SET_BURN_PUBKEY_TO_ALICE: Cell = Cell::new(false); + pub static SET_BURN_PUBKEY_TO_ALICE: Cell = const { Cell::new(false) }; } pub const UTXO_ASSET_DOCKER_IMAGE: &str = "docker.io/artempikulin/testblockchain"; @@ -830,7 +830,7 @@ where block_on_f01(coin.wait_for_confirmations(confirm_payment_input)).unwrap(); log!("{:02x}", tx_bytes); loop { - let unspents = block_on_f01(client.list_unspent_impl(0, std::i32::MAX, vec![address.to_string()])).unwrap(); + let unspents = block_on_f01(client.list_unspent_impl(0, i32::MAX, vec![address.to_string()])).unwrap(); if !unspents.is_empty() { break; } diff --git a/mm2src/mm2_main/tests/docker_tests/docker_tests_inner.rs b/mm2src/mm2_main/tests/docker_tests/docker_tests_inner.rs index ff7e6415fb..6d0aa28d90 100644 --- a/mm2src/mm2_main/tests/docker_tests/docker_tests_inner.rs +++ b/mm2src/mm2_main/tests/docker_tests/docker_tests_inner.rs @@ -4092,7 +4092,7 @@ fn test_withdraw_and_send_hd_eth_erc20() { EnableCoinBalanceMap::HD(hd) => hd, _ => panic!("Expected EnableCoinBalance::HD"), }; - let account = balance.accounts.get(0).expect("Expected account at index 0"); + let account = balance.accounts.first().expect("Expected account at index 0"); assert_eq!( account.addresses[1].address, "0xDe841899aB4A22E23dB21634e54920aDec402397" diff --git a/mm2src/mm2_main/tests/docker_tests/eth_docker_tests.rs b/mm2src/mm2_main/tests/docker_tests/eth_docker_tests.rs index 840e30279a..a012faec0d 100644 --- a/mm2src/mm2_main/tests/docker_tests/eth_docker_tests.rs +++ b/mm2src/mm2_main/tests/docker_tests/eth_docker_tests.rs @@ -2499,7 +2499,7 @@ fn test_eth_erc20_hd() { EnableCoinBalanceMap::HD(hd) => hd, _ => panic!("Expected EnableCoinBalance::HD"), }; - let account = balance.accounts.get(0).expect("Expected account at index 0"); + let account = balance.accounts.first().expect("Expected account at index 0"); assert_eq!( account.addresses[0].address, "0x1737F1FaB40c6Fd3dc729B51C0F97DB3297CCA93" @@ -2538,7 +2538,7 @@ fn test_eth_erc20_hd() { EnableCoinBalanceMap::HD(hd) => hd, _ => panic!("Expected EnableCoinBalance::HD"), }; - let account = balance.accounts.get(0).expect("Expected account at index 0"); + let account = balance.accounts.first().expect("Expected account at index 0"); assert_eq!( account.addresses[1].address, "0xDe841899aB4A22E23dB21634e54920aDec402397" @@ -2592,7 +2592,7 @@ fn test_eth_erc20_hd() { EnableCoinBalanceMap::HD(hd) => hd, _ => panic!("Expected EnableCoinBalance::HD"), }; - let account = balance.accounts.get(0).expect("Expected account at index 0"); + let account = balance.accounts.first().expect("Expected account at index 0"); assert_eq!( account.addresses[7].address, "0xa420a4DBd8C50e6240014Db4587d2ec8D0cE0e6B" diff --git a/mm2src/mm2_main/tests/docker_tests/swap_watcher_tests.rs b/mm2src/mm2_main/tests/docker_tests/swap_watcher_tests.rs index fcb111dca3..cfd29cbecc 100644 --- a/mm2src/mm2_main/tests/docker_tests/swap_watcher_tests.rs +++ b/mm2src/mm2_main/tests/docker_tests/swap_watcher_tests.rs @@ -1267,7 +1267,7 @@ fn test_watcher_validate_taker_fee_utxo() { let error = block_on_f01(taker_coin.watcher_validate_taker_fee(WatcherValidateTakerFeeInput { taker_fee_hash: taker_fee.tx_hash_as_bytes().into_vec(), sender_pubkey: taker_pubkey.to_vec(), - min_block_number: std::u64::MAX, + min_block_number: u64::MAX, lock_duration, })) .unwrap_err() @@ -1374,7 +1374,7 @@ fn test_watcher_validate_taker_fee_eth() { let error = block_on_f01(taker_coin.watcher_validate_taker_fee(WatcherValidateTakerFeeInput { taker_fee_hash: taker_fee.tx_hash_as_bytes().into_vec(), sender_pubkey: taker_pubkey.to_vec(), - min_block_number: std::u64::MAX, + min_block_number: u64::MAX, lock_duration, })) .unwrap_err() @@ -1465,7 +1465,7 @@ fn test_watcher_validate_taker_fee_erc20() { let error = block_on_f01(taker_coin.watcher_validate_taker_fee(WatcherValidateTakerFeeInput { taker_fee_hash: taker_fee.tx_hash_as_bytes().into_vec(), sender_pubkey: taker_pubkey.to_vec(), - min_block_number: std::u64::MAX, + min_block_number: u64::MAX, lock_duration, })) .unwrap_err() diff --git a/mm2src/mm2_main/tests/docker_tests_main.rs b/mm2src/mm2_main/tests/docker_tests_main.rs index 3739b44b5f..0ece4fabc8 100644 --- a/mm2src/mm2_main/tests/docker_tests_main.rs +++ b/mm2src/mm2_main/tests/docker_tests_main.rs @@ -5,7 +5,6 @@ #![test_runner(docker_tests_runner)] #![feature(hash_raw_entry)] #![cfg(not(target_arch = "wasm32"))] -#![feature(local_key_cell_methods)] // for setting global vars in tests #[cfg(test)] #[macro_use] diff --git a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs index 44940352d9..e98a179612 100644 --- a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs +++ b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs @@ -6,7 +6,6 @@ #![test_runner(docker_tests_runner)] #![feature(hash_raw_entry)] #![cfg(not(target_arch = "wasm32"))] -#![feature(local_key_cell_methods)] #[cfg(test)] #[macro_use] diff --git a/mm2src/mm2_main/tests/mm2_tests/mod.rs b/mm2src/mm2_main/tests/mm2_tests/mod.rs index 5658aea57e..be27eabf9a 100644 --- a/mm2src/mm2_main/tests/mm2_tests/mod.rs +++ b/mm2src/mm2_main/tests/mm2_tests/mod.rs @@ -7,21 +7,17 @@ mod mm2_tests_inner; mod orderbook_sync_tests; mod z_coin_tests; -mod zhtlc_native_reexport { - - - - - -} - #[cfg(all(feature = "zhtlc-native-tests", not(target_arch = "wasm32")))] -use mm2_test_helpers::structs::ZCoinActivationResult; +use mm2_test_helpers::for_tests::MarketMakerIt; #[cfg(all(feature = "zhtlc-native-tests", not(target_arch = "wasm32")))] -use zhtlc_native_reexport::*; +use mm2_test_helpers::structs::ZCoinActivationResult; #[cfg(all(feature = "zhtlc-native-tests", not(target_arch = "wasm32")))] async fn enable_z_coin(mm: &MarketMakerIt, coin: &str) -> ZCoinActivationResult { + use common::{executor::Timer, wait_until_ms}; + use mm2_test_helpers::{for_tests::{init_z_coin_native, init_z_coin_status, MarketMakerIt}, + structs::{InitTaskResult, InitZcoinStatus, RpcV2Response}}; + let init = init_z_coin_native(mm, coin).await; let init: RpcV2Response = serde_json::from_value(init).unwrap(); let timeout = wait_until_ms(120000); diff --git a/mm2src/mm2_metamask/Cargo.toml b/mm2src/mm2_metamask/Cargo.toml index e26be8c434..0cd6deaff9 100644 --- a/mm2src/mm2_metamask/Cargo.toml +++ b/mm2src/mm2_metamask/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [target.'cfg(target_arch = "wasm32")'.dependencies] async-trait = "0.1" common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3", package = "futures" } itertools = "0.10" js-sys = { version = "0.3.27" } diff --git a/mm2src/mm2_metrics/Cargo.toml b/mm2src/mm2_metrics/Cargo.toml index f7a5fabc52..9e5ac6c157 100644 --- a/mm2src/mm2_metrics/Cargo.toml +++ b/mm2src/mm2_metrics/Cargo.toml @@ -9,7 +9,7 @@ doctest = false [dependencies] base64 = "0.21.2" common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3", package = "futures", features = ["compat", "async-await", "thread-pool"] } itertools = "0.10" metrics = { version = "0.21" } diff --git a/mm2src/mm2_net/Cargo.toml b/mm2src/mm2_net/Cargo.toml index a720327d96..fc6b4da837 100644 --- a/mm2src/mm2_net/Cargo.toml +++ b/mm2src/mm2_net/Cargo.toml @@ -14,7 +14,7 @@ async-trait = "0.1" bytes = "1.1" cfg-if = "1.0" common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" ethkey = { git = "https://github.com/KomodoPlatform/mm2-parity-ethereum.git", rev = "mm2-v2.1.1" } futures = { version = "0.3", package = "futures", features = ["compat", "async-await", "thread-pool"] } gstuff = "0.7" diff --git a/mm2src/mm2_number/src/mm_number.rs b/mm2src/mm2_number/src/mm_number.rs index 3f731e6436..ff512b7699 100644 --- a/mm2src/mm2_number/src/mm_number.rs +++ b/mm2src/mm2_number/src/mm_number.rs @@ -64,11 +64,13 @@ macro_rules! construct_detailed { pub struct MmNumber(pub(crate) BigRational); /// Handwritten deserialization method allows the MmNumber to be deserialized from: -/// 1. big rational representation, -/// 2. decimal string e.g. "0.1" -/// 3. fraction object e.g. { "numer":"2", "denom":"3" } +/// 1. big rational representation, +/// 2. decimal string e.g. "0.1" +/// 3. fraction object e.g. { "numer":"2", "denom":"3" } +/// /// IMPORTANT: the deserialization implementation works properly from JSON only! /// Consider using BigRational type directly for other serde implementations +/// impl<'de> Deserialize<'de> for MmNumber { fn deserialize(deserializer: D) -> Result>::Error> where diff --git a/mm2src/mm2_p2p/Cargo.toml b/mm2src/mm2_p2p/Cargo.toml index 6cc38db4d6..f867550d21 100644 --- a/mm2src/mm2_p2p/Cargo.toml +++ b/mm2src/mm2_p2p/Cargo.toml @@ -14,7 +14,7 @@ doctest = false async-trait = "0.1" common = { path = "../common" } compatible-time = { version = "1.1.0", package = "web-time" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3.1", default-features = false } futures-ticker = "0.0.3" hex = "0.4.2" diff --git a/mm2src/mm2_rpc/Cargo.toml b/mm2src/mm2_rpc/Cargo.toml index 89b6b2fa56..da2fdc7afd 100644 --- a/mm2src/mm2_rpc/Cargo.toml +++ b/mm2src/mm2_rpc/Cargo.toml @@ -8,7 +8,7 @@ doctest = false [dependencies] common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3", package = "futures", features = ["compat", "async-await", "thread-pool"], optional = true } gstuff = { version = "0.7", features = ["nightly"], optional = true} http = {version = "0.2", optional = true} diff --git a/mm2src/rpc_task/Cargo.toml b/mm2src/rpc_task/Cargo.toml index c542159f25..65d97a817c 100644 --- a/mm2src/rpc_task/Cargo.toml +++ b/mm2src/rpc_task/Cargo.toml @@ -11,7 +11,7 @@ async-trait = "0.1" common = { path = "../common" } mm2_err_handle = { path = "../mm2_err_handle" } mm2_event_stream = { path = "../mm2_event_stream" } -derive_more = "0.99" +derive_more = "0.99.20" futures = "0.3" ser_error = { path = "../derives/ser_error" } ser_error_derive = { path = "../derives/ser_error_derive" } diff --git a/mm2src/trading_api/Cargo.toml b/mm2src/trading_api/Cargo.toml index 4f714ed34d..20c36581aa 100644 --- a/mm2src/trading_api/Cargo.toml +++ b/mm2src/trading_api/Cargo.toml @@ -13,7 +13,7 @@ mm2_net = { path = "../mm2_net" } mm2_number = { path = "../mm2_number" } mocktopus = { version = "0.8.0", optional = true } -derive_more = "0.99" +derive_more = "0.99.20" ethereum-types = { version = "0.13", default-features = false, features = ["std", "serialize"] } lazy_static = "1.4" serde = "1.0" @@ -26,4 +26,4 @@ test-ext-api = [] # use test config to connect to an external api for-tests = ["dep:mocktopus"] [dev-dependencies] -mocktopus = { version = "0.8.0" } \ No newline at end of file +mocktopus = { version = "0.8.0" } diff --git a/mm2src/trezor/Cargo.toml b/mm2src/trezor/Cargo.toml index 36e5abb0ec..b70cb44e94 100644 --- a/mm2src/trezor/Cargo.toml +++ b/mm2src/trezor/Cargo.toml @@ -10,7 +10,7 @@ doctest = false async-trait = "0.1" byteorder = "1.3.2" common = { path = "../common" } -derive_more = "0.99" +derive_more = "0.99.20" futures = { version = "0.3", package = "futures", features = ["compat", "async-await"] } hw_common = { path = "../hw_common" } mm2_err_handle = { path = "../mm2_err_handle" } diff --git a/mm2src/trezor/src/error.rs b/mm2src/trezor/src/error.rs index 6a67c592f2..aa8954c1fd 100644 --- a/mm2src/trezor/src/error.rs +++ b/mm2src/trezor/src/error.rs @@ -35,7 +35,7 @@ pub enum TrezorError { UnexpectedInteractionRequest(TrezorUserInteraction), Internal(String), PongMessageMismatch, - #[display("no processor for trezor response")] + #[display(fmt = "no processor for trezor response")] InternalNoProcessor, } From 97dc2fabc216f321fe980b4134becd7837772c83 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 04:13:28 +0100 Subject: [PATCH 14/35] fix wasm clippy for rustc 1.80 --- mm2src/coins/eth/eth_tests.rs | 1 - mm2src/coins/nft/storage/wasm/mod.rs | 1 + mm2src/coins/qrc20/qrc20_tests.rs | 3 ++- mm2src/coins/tendermint/rpc/tendermint_wasm_rpc.rs | 1 - mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs | 2 +- .../utxo_block_header_storage/wasm/block_header_table.rs | 4 ++-- mm2src/coins/utxo/utxo_tests.rs | 5 +---- mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs | 1 - mm2src/coins/z_coin/storage/walletdb/wasm/tables.rs | 4 ++-- mm2src/coins/z_coin/storage/z_params/indexeddb.rs | 2 +- mm2src/coins_activation/src/l2/mod.rs | 3 +-- mm2src/crypto/Cargo.toml | 2 +- mm2src/crypto/src/global_hd_ctx.rs | 2 ++ mm2src/mm2_bitcoin/chain/src/block_header.rs | 3 ++- mm2src/mm2_bitcoin/chain/src/transaction.rs | 4 +++- mm2src/mm2_bitcoin/keys/src/cashaddress.rs | 6 ++---- mm2src/mm2_bitcoin/script/src/script.rs | 2 +- mm2src/mm2_bitcoin/spv_validation/src/lib.rs | 1 + mm2src/mm2_core/src/mm_ctx.rs | 1 - .../indexed_db/drivers/cursor/multi_key_bound_cursor.rs | 4 ++-- mm2src/mm2_db/src/indexed_db/indexed_cursor.rs | 4 +--- mm2src/mm2_db/src/lib.rs | 1 + mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs | 1 + mm2src/mm2_main/src/mm2.rs | 3 ++- mm2src/mm2_main/src/rpc/streaming_activations/orders.rs | 4 +++- mm2src/mm2_metamask/src/lib.rs | 1 + mm2src/mm2_metrics/src/mm_metrics.rs | 1 + mm2src/mm2_net/src/wasm/wasm_ws.rs | 7 ++++++- mm2src/mm2_p2p/src/behaviours/mod.rs | 2 +- mm2src/trading_api/src/one_inch_api/client.rs | 6 +++--- mm2src/trezor/src/lib.rs | 1 + 31 files changed, 46 insertions(+), 37 deletions(-) diff --git a/mm2src/coins/eth/eth_tests.rs b/mm2src/coins/eth/eth_tests.rs index 2d2c43d08f..efeadcff22 100644 --- a/mm2src/coins/eth/eth_tests.rs +++ b/mm2src/coins/eth/eth_tests.rs @@ -1,7 +1,6 @@ use super::*; use crate::IguanaPrivKey; use common::block_on; -use futures_util::future; use mm2_core::mm_ctx::MmCtxBuilder; cfg_native!( diff --git a/mm2src/coins/nft/storage/wasm/mod.rs b/mm2src/coins/nft/storage/wasm/mod.rs index 05c7bac5d9..e10f04a8c6 100644 --- a/mm2src/coins/nft/storage/wasm/mod.rs +++ b/mm2src/coins/nft/storage/wasm/mod.rs @@ -1,4 +1,5 @@ use crate::nft::storage::NftStorageError; +use derive_more::Display; use mm2_db::indexed_db::{DbTransactionError, InitDbError}; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/qrc20/qrc20_tests.rs b/mm2src/coins/qrc20/qrc20_tests.rs index 01cf4adcad..9ad0a5cdf0 100644 --- a/mm2src/coins/qrc20/qrc20_tests.rs +++ b/mm2src/coins/qrc20/qrc20_tests.rs @@ -1,6 +1,6 @@ use super::*; use crate::{DexFee, TxFeeDetails, WaitForHTLCTxSpendArgs}; -use common::{block_on, block_on_f01, wait_until_sec, DEX_FEE_ADDR_RAW_PUBKEY}; +use common::{block_on, block_on_f01, wait_until_sec}; use crypto::Secp256k1Secret; use itertools::Itertools; use keys::Address; @@ -315,6 +315,7 @@ fn test_wait_for_confirmations_excepted() { assert!(error.contains("Contract call failed with an error: Revert")); } +#[cfg(not(target_arch = "wasm32"))] #[test] fn test_validate_fee() { // priv_key of qXxsj5RtciAby9T7m98AgAATL4zTi4UwDG diff --git a/mm2src/coins/tendermint/rpc/tendermint_wasm_rpc.rs b/mm2src/coins/tendermint/rpc/tendermint_wasm_rpc.rs index 4a5d13c05f..559b097b7f 100644 --- a/mm2src/coins/tendermint/rpc/tendermint_wasm_rpc.rs +++ b/mm2src/coins/tendermint/rpc/tendermint_wasm_rpc.rs @@ -14,7 +14,6 @@ pub use tendermint_rpc::endpoint::{abci_query::{AbciQuery, Request as AbciReques health::Request as HealthRequest, tx_search::Request as TxSearchRequest}; use tendermint_rpc::error::Error as TendermintRpcError; -pub use tendermint_rpc::query::Query as TendermintQuery; use tendermint_rpc::request::SimpleRequest; pub use tendermint_rpc::Order; use tendermint_rpc::Response; diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs index 0c91a11188..e9481c150a 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs @@ -235,7 +235,7 @@ impl ElectrumConnection { /// ## Important: This should always return [`JsonRpcErrorType::Transport`] error. pub async fn electrum_request( &self, - mut req_json: String, + req_json: String, rpc_id: JsonRpcId, timeout: f64, ) -> Result { diff --git a/mm2src/coins/utxo/utxo_block_header_storage/wasm/block_header_table.rs b/mm2src/coins/utxo/utxo_block_header_storage/wasm/block_header_table.rs index 756e50614f..a7c35eab37 100644 --- a/mm2src/coins/utxo/utxo_block_header_storage/wasm/block_header_table.rs +++ b/mm2src/coins/utxo/utxo_block_header_storage/wasm/block_header_table.rs @@ -10,8 +10,8 @@ pub struct BlockHeaderStorageTable { } impl BlockHeaderStorageTable { - pub const TICKER_HEIGHT_INDEX: &str = "block_height_ticker_index"; - pub const HASH_TICKER_INDEX: &str = "block_hash_ticker_index"; + pub const TICKER_HEIGHT_INDEX: &'static str = "block_height_ticker_index"; + pub const HASH_TICKER_INDEX: &'static str = "block_hash_ticker_index"; } impl TableSignature for BlockHeaderStorageTable { diff --git a/mm2src/coins/utxo/utxo_tests.rs b/mm2src/coins/utxo/utxo_tests.rs index d6a9f2e6b9..05925ec21d 100644 --- a/mm2src/coins/utxo/utxo_tests.rs +++ b/mm2src/coins/utxo/utxo_tests.rs @@ -13,8 +13,7 @@ use crate::rpc_command::init_scan_for_new_addresses::{InitScanAddressesRpcOps, S use crate::utxo::qtum::{qtum_coin_with_priv_key, QtumCoin, QtumDelegationOps, QtumDelegationRequest}; #[cfg(not(target_arch = "wasm32"))] use crate::utxo::rpc_clients::{BlockHashOrHeight, NativeUnspent}; -use crate::utxo::rpc_clients::{ElectrumBalance, ElectrumBlockHeader, ElectrumClient, ElectrumClientImpl, - ElectrumClientSettings, GetAddressInfoRes, ListSinceBlockRes, NativeClient, +use crate::utxo::rpc_clients::{ElectrumBalance, ElectrumBlockHeader, ElectrumClient, ElectrumClientImpl, GetAddressInfoRes, ListSinceBlockRes, NativeClient, NativeClientImpl, NetworkInfo, UtxoRpcClientOps, ValidateAddressRes, VerboseBlock}; use crate::utxo::spv::SimplePaymentVerification; #[cfg(not(target_arch = "wasm32"))] @@ -43,14 +42,12 @@ use futures::future::{join_all, Either, FutureExt, TryFutureExt}; use hex::FromHex; use keys::prefixes::*; use mm2_core::mm_ctx::MmCtxBuilder; -use mm2_event_stream::StreamingManager; use mm2_number::bigdecimal::{BigDecimal, Signed}; use mm2_number::MmNumber; use mm2_test_helpers::electrums::doc_electrums; use mm2_test_helpers::for_tests::{electrum_servers_rpc, mm_ctx_with_custom_db, DOC_ELECTRUM_ADDRS, MARTY_ELECTRUM_ADDRS, T_BCH_ELECTRUMS}; use mocktopus::mocking::*; -use rand::{rngs::ThreadRng, Rng}; use rpc::v1::types::H256 as H256Json; use serialization::{deserialize, CoinVariant, CompactInteger, Reader}; use spv_validation::conf::{BlockHeaderValidationParams, SPVBlockHeader}; diff --git a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs index b34d9754d2..d991cc521c 100644 --- a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs +++ b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs @@ -1314,7 +1314,6 @@ impl WalletRead for WalletIndexedDb { .await .map_mm_err()? .into_iter() - .map(|(i, item)| (i, item)) .collect::>(); // Witnesses let witnesses_table = db_transaction diff --git a/mm2src/coins/z_coin/storage/walletdb/wasm/tables.rs b/mm2src/coins/z_coin/storage/walletdb/wasm/tables.rs index 53471571d4..97038f2a6f 100644 --- a/mm2src/coins/z_coin/storage/walletdb/wasm/tables.rs +++ b/mm2src/coins/z_coin/storage/walletdb/wasm/tables.rs @@ -13,12 +13,12 @@ impl WalletDbAccountsTable { /// A **unique** index that consists of the following properties: /// * ticker /// * account - pub const TICKER_ACCOUNT_INDEX: &str = "ticker_account_index"; + pub const TICKER_ACCOUNT_INDEX: &'static str = "ticker_account_index"; /// A **unique** index that consists of the following properties: /// * ticker /// * account /// * extfvk - pub const TICKER_ACCOUNT_EXTFVK_INDEX: &str = "ticker_account_extfvk_index"; + pub const TICKER_ACCOUNT_EXTFVK_INDEX: &'static str = "ticker_account_extfvk_index"; } impl TableSignature for WalletDbAccountsTable { diff --git a/mm2src/coins/z_coin/storage/z_params/indexeddb.rs b/mm2src/coins/z_coin/storage/z_params/indexeddb.rs index 6822c89c5b..97a115cca7 100644 --- a/mm2src/coins/z_coin/storage/z_params/indexeddb.rs +++ b/mm2src/coins/z_coin/storage/z_params/indexeddb.rs @@ -24,7 +24,7 @@ struct ZcashParamsWasmTable { } impl ZcashParamsWasmTable { - const SPEND_OUTPUT_INDEX: &str = "sapling_spend_sapling_output_index"; + const SPEND_OUTPUT_INDEX: &'static str = "sapling_spend_sapling_output_index"; } impl TableSignature for ZcashParamsWasmTable { diff --git a/mm2src/coins_activation/src/l2/mod.rs b/mm2src/coins_activation/src/l2/mod.rs index 92f40109ea..f2d26967d3 100644 --- a/mm2src/coins_activation/src/l2/mod.rs +++ b/mm2src/coins_activation/src/l2/mod.rs @@ -1,6 +1,5 @@ mod init_l2; mod init_l2_error; -pub use init_l2::{cancel_init_l2, init_l2, init_l2_status, init_l2_user_action, InitL2ActivationOps, - InitL2InitialStatus, InitL2TaskHandleShared, InitL2TaskManagerShared, L2ProtocolParams}; +pub use init_l2::{cancel_init_l2, init_l2, init_l2_status, init_l2_user_action}; pub use init_l2_error::InitL2Error; diff --git a/mm2src/crypto/Cargo.toml b/mm2src/crypto/Cargo.toml index b196fb1973..9c9eb7b0dd 100644 --- a/mm2src/crypto/Cargo.toml +++ b/mm2src/crypto/Cargo.toml @@ -45,7 +45,7 @@ serde_derive = "1.0" serde_json = { version = "1", features = ["preserve_order", "raw_value"] } sha2 = "0.10" trezor = { path = "../trezor" } -zeroize = { version = "1.8", features = ["zeroize_derive"] } +zeroize = { version = "1.8.1", features = ["zeroize_derive"] } [target.'cfg(target_arch = "wasm32")'.dependencies] cfg-if = "1.0" diff --git a/mm2src/crypto/src/global_hd_ctx.rs b/mm2src/crypto/src/global_hd_ctx.rs index a2a3bb159a..6496065ab4 100644 --- a/mm2src/crypto/src/global_hd_ctx.rs +++ b/mm2src/crypto/src/global_hd_ctx.rs @@ -1,3 +1,5 @@ +#![allow(non_local_definitions)] + use crate::privkey::{bip39_seed_from_passphrase, key_pair_from_secret, PrivKeyError}; use crate::{mm2_internal_der_path, Bip32Error, CryptoInitError, CryptoInitResult}; use bip32::{DerivationPath, ExtendedPrivateKey}; diff --git a/mm2src/mm2_bitcoin/chain/src/block_header.rs b/mm2src/mm2_bitcoin/chain/src/block_header.rs index fcb5200dae..dab58e13b3 100644 --- a/mm2src/mm2_bitcoin/chain/src/block_header.rs +++ b/mm2src/mm2_bitcoin/chain/src/block_header.rs @@ -379,7 +379,7 @@ impl From for ExtBlockHeader { #[cfg(test)] mod tests { - use super::ExtBlockHeader; + #[cfg(not(target_arch = "wasm32"))] use super::ExtBlockHeader; use block_header::{BlockHeader, BlockHeaderBits, BlockHeaderNonce, AUX_POW_VERSION_DOGE, AUX_POW_VERSION_NMC, AUX_POW_VERSION_SYS, BIP9_NO_SOFT_FORK_BLOCK_HEADER_VERSION, KAWPOW_VERSION, MTP_POW_VERSION, PROG_POW_SWITCH_TIME}; @@ -2510,6 +2510,7 @@ mod tests { assert_eq!(serialized.take(), header_bytes); } + #[cfg(not(target_arch = "wasm32"))] #[test] fn test_from_blockheader_to_ext_blockheader() { // https://live.blockcypher.com/btc/block/00000000000000000020cf2bdc6563fb25c424af588d5fb7223461e72715e4a9/ diff --git a/mm2src/mm2_bitcoin/chain/src/transaction.rs b/mm2src/mm2_bitcoin/chain/src/transaction.rs index 16ccc1a680..acc3218ba6 100644 --- a/mm2src/mm2_bitcoin/chain/src/transaction.rs +++ b/mm2src/mm2_bitcoin/chain/src/transaction.rs @@ -620,7 +620,8 @@ impl Deserializable for Transaction { #[cfg(test)] mod tests { - use super::{Bytes, ExtTransaction, OutPoint, Transaction, TransactionInput, TransactionOutput}; + #[cfg(not(target_arch = "wasm32"))] use super::ExtTransaction; + use super::{Bytes, OutPoint, Transaction, TransactionInput, TransactionOutput}; use hash::{H256, H512}; use hex::ToHex; use ser::{deserialize, serialize, serialize_with_flags, Serializable, SERIALIZE_TRANSACTION_WITNESS}; @@ -1103,6 +1104,7 @@ mod tests { assert_eq!(actual, expected); } + #[cfg(not(target_arch = "wasm32"))] #[test] fn test_from_tx_to_ext_tx() { // https://live.blockcypher.com/btc-testnet/tx/2be90e03abb4d5328bf7e9467ca9c571aef575837b55f1253119b87e85ccb94f/ diff --git a/mm2src/mm2_bitcoin/keys/src/cashaddress.rs b/mm2src/mm2_bitcoin/keys/src/cashaddress.rs index 91ce3131ec..497a51d516 100644 --- a/mm2src/mm2_bitcoin/keys/src/cashaddress.rs +++ b/mm2src/mm2_bitcoin/keys/src/cashaddress.rs @@ -448,8 +448,7 @@ mod tests { "BitCoinCash:QRPLWYX7KUEQKRH6DMD3FCLTA6U32HAFP5TNPKCHX2", "bchtest:qqjr7yu573z4faxw8ltgvjwpntwys08fysk07zmvce", "bchtest:pnq8zwpj8cq05n7pytfmskuk9r4gzzel8qtsvwz79zdskftrzxtar994cgutavfklvmgm6ynej"]; - let expected_addresses = vec![ - CashAddress { + let expected_addresses = [CashAddress { prefix: "bitcoincash".into(), hash: vec![ 42, 15, 196, 55, 215, 162, 115, 113, 138, 193, 48, 222, 50, 193, 229, 70, 215, 1, 25, 160, @@ -484,8 +483,7 @@ mod tests { 94, 40, 155, 11, 37, 99, 17, 151, 209, 148, 181, 194, 56, 190, 177, 54, 251, ], address_type: CashAddrType::P2SH, - }, - ]; + }]; for i in 0..4 { let actual_address = CashAddress::decode(encoded[i]).unwrap(); diff --git a/mm2src/mm2_bitcoin/script/src/script.rs b/mm2src/mm2_bitcoin/script/src/script.rs index c5e4b57d0f..2a8bf8eadb 100644 --- a/mm2src/mm2_bitcoin/script/src/script.rs +++ b/mm2src/mm2_bitcoin/script/src/script.rs @@ -944,7 +944,7 @@ OP_ADD assert!(script.get_instruction(5).is_none()); assert!(script.get_instruction(10).is_none()); assert!(script.get_instruction(1245).is_none()); - assert!(script.get_instruction(99187829973).is_none()); + assert!(script.get_instruction(99187829).is_none()); } #[test] diff --git a/mm2src/mm2_bitcoin/spv_validation/src/lib.rs b/mm2src/mm2_bitcoin/spv_validation/src/lib.rs index 319cde9e4c..6e3656465c 100644 --- a/mm2src/mm2_bitcoin/spv_validation/src/lib.rs +++ b/mm2src/mm2_bitcoin/spv_validation/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(clippy::doc_lazy_continuation)] extern crate chain; extern crate derive_more; extern crate keys; diff --git a/mm2src/mm2_core/src/mm_ctx.rs b/mm2src/mm2_core/src/mm_ctx.rs index 809f6fa4c7..292dc69ca6 100644 --- a/mm2src/mm2_core/src/mm_ctx.rs +++ b/mm2src/mm2_core/src/mm_ctx.rs @@ -1,4 +1,3 @@ -use common::executor::SpawnFuture; #[cfg(feature = "track-ctx-pointer")] use common::executor::Timer; use common::executor::{abortable_queue::{AbortableQueue, WeakSpawner}, diff --git a/mm2src/mm2_db/src/indexed_db/drivers/cursor/multi_key_bound_cursor.rs b/mm2src/mm2_db/src/indexed_db/drivers/cursor/multi_key_bound_cursor.rs index 18a5962498..6913442eec 100644 --- a/mm2src/mm2_db/src/indexed_db/drivers/cursor/multi_key_bound_cursor.rs +++ b/mm2src/mm2_db/src/indexed_db/drivers/cursor/multi_key_bound_cursor.rs @@ -28,8 +28,8 @@ impl IdbMultiKeyBoundCursor { } fn check_bounds( - only_values: &Vec<(String, Json)>, - bound_values: &Vec<(String, CursorBoundValue, CursorBoundValue)>, + only_values: &[(String, Json)], + bound_values: &[(String, CursorBoundValue, CursorBoundValue)], ) -> CursorResult<()> { if bound_values.is_empty() || (only_values.len() + bound_values.len() < 2) { let description = format!( diff --git a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs index 3f0c1c7b8c..48789a62e3 100644 --- a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs +++ b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs @@ -424,9 +424,7 @@ mod tests { .collect::>(); // Get `BeBigUint` numbers that should have been returned by the cursor above. let expected = numbers - .iter() - .cloned() - .filter(|num| num_x <= num && num <= num_y) + .iter().filter(|&num| num_x <= num && num <= num_y).cloned() .sorted() .collect::>(); assert_eq!(actual_items, expected); diff --git a/mm2src/mm2_db/src/lib.rs b/mm2src/mm2_db/src/lib.rs index 3a07456131..06f2b057ab 100644 --- a/mm2src/mm2_db/src/lib.rs +++ b/mm2src/mm2_db/src/lib.rs @@ -1,4 +1,5 @@ #![feature(negative_impls)] +#![allow(clippy::doc_lazy_continuation)] #[cfg(target_arch = "wasm32")] #[path = "indexed_db/indexed_db.rs"] diff --git a/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs b/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs index 32774397ea..ffb28c9f6c 100644 --- a/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs +++ b/mm2src/mm2_main/src/lp_wallet/mnemonics_wasm_db.rs @@ -1,6 +1,7 @@ use crate::lp_wallet::WalletsContext; use async_trait::async_trait; use crypto::EncryptedData; +use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_core::DbNamespaceId; use mm2_db::indexed_db::{DbIdentifier, DbInstance, DbTransactionError, DbUpgrader, IndexedDb, IndexedDbBuilder, diff --git a/mm2src/mm2_main/src/mm2.rs b/mm2src/mm2_main/src/mm2.rs index 9e7e465a78..cabe7d4617 100644 --- a/mm2src/mm2_main/src/mm2.rs +++ b/mm2src/mm2_main/src/mm2.rs @@ -28,7 +28,8 @@ forgetting_copy_types, clippy::swap_ptr_to_ref, clippy::forget_non_drop, - clippy::let_unit_value + clippy::let_unit_value, + clippy::doc_lazy_continuation )] #![cfg_attr(target_arch = "wasm32", allow(dead_code))] #![cfg_attr(target_arch = "wasm32", allow(unused_imports))] diff --git a/mm2src/mm2_main/src/rpc/streaming_activations/orders.rs b/mm2src/mm2_main/src/rpc/streaming_activations/orders.rs index 08fd0a959a..7c7aa0c082 100644 --- a/mm2src/mm2_main/src/rpc/streaming_activations/orders.rs +++ b/mm2src/mm2_main/src/rpc/streaming_activations/orders.rs @@ -1,6 +1,8 @@ //! RPC activation and deactivation of the order status streamer. -use super::{EnableStreamingRequest, EnableStreamingResponse}; use crate::lp_ordermatch::order_events::OrderStatusStreamer; + +use super::{EnableStreamingRequest, EnableStreamingResponse}; +use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::{map_to_mm::MapToMmResult, mm_error::MmResult}; diff --git a/mm2src/mm2_metamask/src/lib.rs b/mm2src/mm2_metamask/src/lib.rs index db083fd60c..3ad3064f2a 100644 --- a/mm2src/mm2_metamask/src/lib.rs +++ b/mm2src/mm2_metamask/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(clippy::doc_lazy_continuation)] #[cfg(target_arch = "wasm32")] mod eip_1193_provider; #[cfg(target_arch = "wasm32")] mod metamask; #[cfg(target_arch = "wasm32")] mod metamask_error; diff --git a/mm2src/mm2_metrics/src/mm_metrics.rs b/mm2src/mm2_metrics/src/mm_metrics.rs index 53abb19f9f..cac7d8de4a 100644 --- a/mm2src/mm2_metrics/src/mm_metrics.rs +++ b/mm2src/mm2_metrics/src/mm_metrics.rs @@ -537,6 +537,7 @@ mod test { block_on(async { Timer::sleep(6.).await }); } + #[cfg(not(target_arch = "wasm32"))] #[test] fn test_prometheus_format() { let mm_metrics = MetricsArc::new(); diff --git a/mm2src/mm2_net/src/wasm/wasm_ws.rs b/mm2src/mm2_net/src/wasm/wasm_ws.rs index 1d19d43a60..92634ea1a3 100644 --- a/mm2src/mm2_net/src/wasm/wasm_ws.rs +++ b/mm2src/mm2_net/src/wasm/wasm_ws.rs @@ -748,7 +748,12 @@ mod tests { let mut incoming_rx = incoming_rx.inner; match incoming_rx.next().timeout_secs(0.5).await.unwrap_w() { - Some((_conn_idx, WebSocketEvent::Closed { reason })) if reason == ClosureReason::NormalClosure => (), + Some(( + _conn_idx, + WebSocketEvent::Closed { + reason: ClosureReason::NormalClosure, + }, + )) => (), other => panic!("Expected 'Closed' event with 'ClientClosed' reason, found: {:?}", other), } } diff --git a/mm2src/mm2_p2p/src/behaviours/mod.rs b/mm2src/mm2_p2p/src/behaviours/mod.rs index 8d8b4442b1..a778673a20 100644 --- a/mm2src/mm2_p2p/src/behaviours/mod.rs +++ b/mm2src/mm2_p2p/src/behaviours/mod.rs @@ -5,7 +5,7 @@ mod ping; pub(crate) mod peers_exchange; pub(crate) mod request_response; -#[cfg(test)] +#[cfg(all(test, not(target_arch = "wasm32")))] mod tests { use async_std::task::spawn; use common::executor::abortable_queue::AbortableQueue; diff --git a/mm2src/trading_api/src/one_inch_api/client.rs b/mm2src/trading_api/src/one_inch_api/client.rs index 2825d930b5..c4cc03d1d2 100644 --- a/mm2src/trading_api/src/one_inch_api/client.rs +++ b/mm2src/trading_api/src/one_inch_api/client.rs @@ -140,7 +140,7 @@ impl ApiClient { pub const fn get_tokens_method() -> &'static str { TOKENS_METHOD } - pub(crate) async fn call_api(api_url: &Url) -> MmResult { + pub(crate) async fn call_api(api_url: &Url) -> MmResult where T: DeserializeOwned{ let (status_code, _, body) = slurp_url_with_headers(api_url.as_str(), ApiClient::get_headers()) .await .mm_err(ApiClientError::TransportError)?; @@ -159,12 +159,12 @@ impl ApiClient { }) } - pub async fn call_swap_api<'l, T: DeserializeOwned>( + pub async fn call_swap_api<'l, T>( &self, chain_id: u64, method: String, params: Option>, - ) -> MmResult { + ) -> MmResult where T: DeserializeOwned { let mut builder = UrlBuilder::new(self, chain_id, method); if let Some(params) = params { builder.with_query_params(params); diff --git a/mm2src/trezor/src/lib.rs b/mm2src/trezor/src/lib.rs index 37c4bd9b4c..adc054a296 100644 --- a/mm2src/trezor/src/lib.rs +++ b/mm2src/trezor/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(clippy::doc_lazy_continuation)] #[macro_use] extern crate serde_derive; pub mod client; From 684019a250c9a8e411db1d40e91ae39d1d15ff61 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 04:21:08 +0100 Subject: [PATCH 15/35] fix test clippy and minor changes to incomplete imports, wasm --- mm2src/coins/eth/eth_tests.rs | 2 ++ mm2src/coins/lightning.rs | 1 - mm2src/coins/qrc20/qrc20_tests.rs | 2 ++ .../coins/utxo/rpc_clients/electrum_rpc/connection.rs | 2 +- mm2src/coins/utxo/utxo_tests.rs | 10 ++++++++-- mm2src/coins_activation/src/l2/mod.rs | 2 +- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/mm2src/coins/eth/eth_tests.rs b/mm2src/coins/eth/eth_tests.rs index efeadcff22..230341aade 100644 --- a/mm2src/coins/eth/eth_tests.rs +++ b/mm2src/coins/eth/eth_tests.rs @@ -161,6 +161,8 @@ fn test_wei_from_big_decimal() { #[cfg(not(target_arch = "wasm32"))] #[test] fn test_wait_for_payment_spend_timeout() { + use futures::future; + const TAKER_PAYMENT_SPEND_SEARCH_INTERVAL: f64 = 1.; EthCoin::events_from_block.mock_safe(|_, _, _, _, _, _| MockResult::Return(Box::pin(future::ok(vec![])))); diff --git a/mm2src/coins/lightning.rs b/mm2src/coins/lightning.rs index 6d1ad1d6b2..3cf101e839 100644 --- a/mm2src/coins/lightning.rs +++ b/mm2src/coins/lightning.rs @@ -1,4 +1,3 @@ - pub mod ln_conf; pub(crate) mod ln_db; pub mod ln_errors; diff --git a/mm2src/coins/qrc20/qrc20_tests.rs b/mm2src/coins/qrc20/qrc20_tests.rs index 9ad0a5cdf0..4309664a11 100644 --- a/mm2src/coins/qrc20/qrc20_tests.rs +++ b/mm2src/coins/qrc20/qrc20_tests.rs @@ -319,6 +319,8 @@ fn test_wait_for_confirmations_excepted() { #[test] fn test_validate_fee() { // priv_key of qXxsj5RtciAby9T7m98AgAATL4zTi4UwDG + + use common::DEX_FEE_ADDR_RAW_PUBKEY; let priv_key = [ 3, 98, 177, 3, 108, 39, 234, 144, 131, 178, 103, 103, 127, 80, 230, 166, 53, 68, 147, 215, 42, 216, 144, 72, 172, 110, 180, 13, 123, 179, 10, 49, diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs index e9481c150a..0c91a11188 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs @@ -235,7 +235,7 @@ impl ElectrumConnection { /// ## Important: This should always return [`JsonRpcErrorType::Transport`] error. pub async fn electrum_request( &self, - req_json: String, + mut req_json: String, rpc_id: JsonRpcId, timeout: f64, ) -> Result { diff --git a/mm2src/coins/utxo/utxo_tests.rs b/mm2src/coins/utxo/utxo_tests.rs index 05925ec21d..06b13b8a35 100644 --- a/mm2src/coins/utxo/utxo_tests.rs +++ b/mm2src/coins/utxo/utxo_tests.rs @@ -13,8 +13,9 @@ use crate::rpc_command::init_scan_for_new_addresses::{InitScanAddressesRpcOps, S use crate::utxo::qtum::{qtum_coin_with_priv_key, QtumCoin, QtumDelegationOps, QtumDelegationRequest}; #[cfg(not(target_arch = "wasm32"))] use crate::utxo::rpc_clients::{BlockHashOrHeight, NativeUnspent}; -use crate::utxo::rpc_clients::{ElectrumBalance, ElectrumBlockHeader, ElectrumClient, ElectrumClientImpl, GetAddressInfoRes, ListSinceBlockRes, NativeClient, - NativeClientImpl, NetworkInfo, UtxoRpcClientOps, ValidateAddressRes, VerboseBlock}; +use crate::utxo::rpc_clients::{ElectrumBalance, ElectrumBlockHeader, ElectrumClient, ElectrumClientImpl, + GetAddressInfoRes, ListSinceBlockRes, NativeClient, NativeClientImpl, NetworkInfo, + UtxoRpcClientOps, ValidateAddressRes, VerboseBlock}; use crate::utxo::spv::SimplePaymentVerification; #[cfg(not(target_arch = "wasm32"))] use crate::utxo::utxo_block_header_storage::{BlockHeaderStorage, SqliteBlockHeadersStorage}; @@ -454,6 +455,9 @@ fn test_wait_for_payment_spend_timeout_native() { #[cfg(not(target_arch = "wasm32"))] #[test] fn test_wait_for_payment_spend_timeout_electrum() { + use mm2_event_stream::StreamingManager; + use rpc_clients::ElectrumClientSettings; + static mut OUTPUT_SPEND_CALLED: bool = false; ElectrumClient::find_output_spend.mock_safe(|_, _, _, _, _, _| { @@ -1210,6 +1214,8 @@ fn test_generate_transaction_relay_fee_is_used_when_dynamic_fee_is_lower() { #[test] #[cfg(not(target_arch = "wasm32"))] fn test_generate_transaction_random_values() { + use rand::{rngs::ThreadRng, Rng}; + let client = NativeClientImpl::default(); let mut rng = rand::thread_rng(); diff --git a/mm2src/coins_activation/src/l2/mod.rs b/mm2src/coins_activation/src/l2/mod.rs index f2d26967d3..51539dbdb2 100644 --- a/mm2src/coins_activation/src/l2/mod.rs +++ b/mm2src/coins_activation/src/l2/mod.rs @@ -1,5 +1,5 @@ mod init_l2; mod init_l2_error; -pub use init_l2::{cancel_init_l2, init_l2, init_l2_status, init_l2_user_action}; +pub use init_l2::*; pub use init_l2_error::InitL2Error; From 8da7f668b42e11595b34fe45938b1d1fb0879c13 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 04:43:24 +0100 Subject: [PATCH 16/35] rustc 1.82 --- mm2src/coins/eth.rs | 2 +- mm2src/coins/lp_coins.rs | 3 ++- mm2src/common/common.rs | 9 ++++----- mm2src/mm2_bitcoin/primitives/src/hash.rs | 2 +- mm2src/mm2_main/src/lp_ordermatch.rs | 4 ++-- rust-toolchain.toml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index 051721c471..fdf964a5d6 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -6132,7 +6132,7 @@ pub fn u256_to_big_decimal(number: U256, decimals: u8) -> NumConversResult NumConversResult { let mut amount = amount.to_string(); - let dot = amount.find(|c| c == '.'); + let dot = amount.find('.'); let decimals = decimals as usize; if let Some(index) = dot { let mut fractional = amount.split_off(index); diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 2fde2ffd2d..2177006874 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -24,7 +24,8 @@ forgetting_references, forgetting_copy_types, clippy::swap_ptr_to_ref, - clippy::forget_non_drop + clippy::forget_non_drop, + clippy::doc_lazy_continuation )] #![allow(uncommon_codepoints)] #![feature(async_closure)] diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index a438a6b03b..213b1faf1b 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -11,7 +11,6 @@ //! binary #![allow(uncommon_codepoints)] -#![feature(panic_info_message)] #![feature(async_closure)] #![feature(hash_raw_entry)] @@ -172,7 +171,7 @@ use std::mem::{forget, zeroed}; use std::num::{NonZeroUsize, TryFromIntError}; use std::ops::{Add, Deref, Div, RangeInclusive}; use std::os::raw::c_void; -use std::panic::{set_hook, PanicInfo}; +use std::panic::{set_hook, PanicHookInfo}; use std::path::{Path, PathBuf}; use std::ptr::read_volatile; use std::sync::atomic::Ordering; @@ -354,7 +353,7 @@ pub fn filename(path: &str) -> &str { // whereas the error trace might be coming from another operating system. // In particular, I see `file_name` failing with WASM. - let name = match path.rfind(|ch| ch == '/' || ch == '\\') { + let name = match path.rfind(['/', '\\']) { Some(ofs) => &path[ofs + 1..], None => path, }; @@ -492,7 +491,7 @@ fn output_pc_mem_addr(output: &mut dyn FnMut(&str)) { /// (The default Rust handler doesn't have the means to print the message). #[cfg(target_arch = "wasm32")] pub fn set_panic_hook() { - set_hook(Box::new(|info: &PanicInfo| { + set_hook(Box::new(|info: &PanicHookInfo| { let mut trace = String::new(); stack_trace(&mut stack_trace_frame, &mut |l| trace.push_str(l)); console_err!("{}", info); @@ -510,7 +509,7 @@ pub fn set_panic_hook() { thread_local! {static ENTERED: AtomicBool = const { AtomicBool::new(false) };} - set_hook(Box::new(|info: &PanicInfo| { + set_hook(Box::new(|info: &PanicHookInfo| { // Stack tracing and logging might panic (in `println!` for example). // Let us detect this and do nothing on second panic. // We'll likely still get a crash after the hook is finished diff --git a/mm2src/mm2_bitcoin/primitives/src/hash.rs b/mm2src/mm2_bitcoin/primitives/src/hash.rs index bbb544e0a7..80df5f8531 100644 --- a/mm2src/mm2_bitcoin/primitives/src/hash.rs +++ b/mm2src/mm2_bitcoin/primitives/src/hash.rs @@ -112,7 +112,7 @@ macro_rules! impl_hash { H: Hasher, { state.write(&self.0); - state.finish(); + let _ = state.finish(); } } diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 333187b1f8..622e5acd54 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -1001,11 +1001,11 @@ fn test_alb_ordered_pair() { #[allow(dead_code)] pub fn parse_orderbook_pair_from_topic(topic: &str) -> Option<(&str, &str)> { - let mut split = topic.split(|maybe_sep| maybe_sep == TOPIC_SEPARATOR); + let mut split = topic.split(TOPIC_SEPARATOR); match split.next() { Some(ORDERBOOK_PREFIX) => match split.next() { Some(maybe_pair) => { - let colon = maybe_pair.find(|maybe_colon| maybe_colon == ':'); + let colon = maybe_pair.find(':'); match colon { Some(index) => { if index + 1 < maybe_pair.len() { diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 944b828581..9f6bf9ded2 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,6 +1,6 @@ [toolchain] # channel = "nightly-2023-06-01" -channel = "nightly-2024-06-05" +channel = "nightly-2024-08-05" components = ["rustfmt", "clippy", "rust-analyzer"] From 46d94bacf65d4a64399221b0a8b391ef660d8dde Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 05:08:38 +0100 Subject: [PATCH 17/35] rustc 1.86 --- mm2src/coins/utxo_signer/src/with_trezor.rs | 2 +- mm2src/common/common.rs | 1 - mm2src/common/log.rs | 4 +-- mm2src/common/seri.rs | 2 +- mm2src/db_common/src/sql_constraint.rs | 2 +- mm2src/db_common/src/sql_delete.rs | 2 +- mm2src/db_common/src/sql_query.rs | 2 +- mm2src/db_common/src/sql_update.rs | 2 +- mm2src/mm2_bitcoin/chain/src/block_header.rs | 7 ++--- mm2src/mm2_bitcoin/primitives/src/bytes.rs | 2 +- .../mm2_bitcoin/rpc/src/v1/types/address.rs | 2 +- mm2src/mm2_bitcoin/rpc/src/v1/types/bytes.rs | 2 +- mm2src/mm2_bitcoin/rpc/src/v1/types/script.rs | 2 +- mm2src/mm2_bitcoin/script/src/script.rs | 2 +- mm2src/mm2_bitcoin/serialization/src/impls.rs | 2 +- mm2src/mm2_err_handle/src/map_to_mm_fut.rs | 2 +- mm2src/mm2_main/src/database/my_swaps.rs | 6 +--- mm2src/mm2_main/src/lp_ordermatch.rs | 5 +--- mm2src/mm2_number/src/big_int_str.rs | 2 +- mm2src/mm2_p2p/src/lib.rs | 2 +- mm2src/trading_api/src/one_inch_api/client.rs | 14 +++++++--- mm2src/trezor/src/response.rs | 8 +++--- mm2src/trezor/src/utxo/sign_utxo.rs | 28 +++++++++---------- rust-toolchain.toml | 2 +- 24 files changed, 50 insertions(+), 55 deletions(-) diff --git a/mm2src/coins/utxo_signer/src/with_trezor.rs b/mm2src/coins/utxo_signer/src/with_trezor.rs index 75d882fa49..3909175a1b 100644 --- a/mm2src/coins/utxo_signer/src/with_trezor.rs +++ b/mm2src/coins/utxo_signer/src/with_trezor.rs @@ -21,7 +21,7 @@ pub struct TrezorTxSigner<'a, TxP> { pub branch_id: u32, } -impl<'a, TxP: TxProvider + Send + Sync> TrezorTxSigner<'a, TxP> { +impl TrezorTxSigner<'_, TxP> { pub async fn sign_tx(mut self) -> UtxoSignTxResult { let trezor_unsigned_tx = self.get_trezor_unsigned_tx().await.map_mm_err()?; diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index 213b1faf1b..211eaffa17 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -11,7 +11,6 @@ //! binary #![allow(uncommon_codepoints)] -#![feature(async_closure)] #![feature(hash_raw_entry)] #[macro_use] extern crate arrayref; diff --git a/mm2src/common/log.rs b/mm2src/common/log.rs index 22c44b5362..14b0403b79 100644 --- a/mm2src/common/log.rs +++ b/mm2src/common/log.rs @@ -333,7 +333,7 @@ impl<'a> TagParam<'a> for &'a str { fn val(&self) -> Option { None } } -impl<'a> TagParam<'a> for String { +impl TagParam<'_> for String { fn key(&self) -> String { self.clone() } fn val(&self) -> Option { None } } @@ -353,7 +353,7 @@ impl<'a> TagParam<'a> for (&'a str, i32) { fn val(&self) -> Option { Some(self.1.to_string()) } } -impl<'a> TagParam<'a> for (String, String) { +impl TagParam<'_> for (String, String) { fn key(&self) -> String { self.0.clone() } fn val(&self) -> Option { Some(self.1.clone()) } } diff --git a/mm2src/common/seri.rs b/mm2src/common/seri.rs index a3a8ab3cc5..080dfa4dc0 100644 --- a/mm2src/common/seri.rs +++ b/mm2src/common/seri.rs @@ -6,7 +6,7 @@ use std::fmt; /// Use with `#[serde(default, deserialize_with = "de_none_if_empty")]`. pub fn de_none_if_empty<'de, D: Deserializer<'de>>(des: D) -> Result, D::Error> { struct Visitor; - impl<'de> de::Visitor<'de> for Visitor { + impl de::Visitor<'_> for Visitor { type Value = Option; fn expecting(&self, fm: &mut fmt::Formatter) -> fmt::Result { fm.write_str("Optional string") } diff --git a/mm2src/db_common/src/sql_constraint.rs b/mm2src/db_common/src/sql_constraint.rs index fa1592eba6..fe031c4fbb 100644 --- a/mm2src/db_common/src/sql_constraint.rs +++ b/mm2src/db_common/src/sql_constraint.rs @@ -237,7 +237,7 @@ pub mod foreign_key { action: &'a Action, } - impl<'a> fmt::Display for ActionOnEvent<'a> { + impl fmt::Display for ActionOnEvent<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{} {}", self.event, self.action) } } } diff --git a/mm2src/db_common/src/sql_delete.rs b/mm2src/db_common/src/sql_delete.rs index eac48b9e77..42e03ef359 100644 --- a/mm2src/db_common/src/sql_delete.rs +++ b/mm2src/db_common/src/sql_delete.rs @@ -60,7 +60,7 @@ impl<'a> SqlDelete<'a> { /// - [`SqlQuery::or_where_in`] /// - [`SqlQuery::or_where_in_quoted`] /// - [`SqlQuery::or_where_in_params`] -impl<'a> SqlCondition for SqlDelete<'a> { +impl SqlCondition for SqlDelete<'_> { fn sql_builder(&mut self) -> &mut SqlBuilder { &mut self.sql_builder } fn sql_params(&mut self) -> &mut SqlParamsBuilder { &mut self.params } diff --git a/mm2src/db_common/src/sql_query.rs b/mm2src/db_common/src/sql_query.rs index 170939c18a..a284faae60 100644 --- a/mm2src/db_common/src/sql_query.rs +++ b/mm2src/db_common/src/sql_query.rs @@ -348,7 +348,7 @@ impl<'a> SqlQuery<'a> { /// - [`SqlQuery::or_where_in`] /// - [`SqlQuery::or_where_in_quoted`] /// - [`SqlQuery::or_where_in_params`] -impl<'a> SqlCondition for SqlQuery<'a> { +impl SqlCondition for SqlQuery<'_> { fn sql_builder(&mut self) -> &mut SqlBuilder { &mut self.sql_builder } fn sql_params(&mut self) -> &mut SqlParamsBuilder { &mut self.params } diff --git a/mm2src/db_common/src/sql_update.rs b/mm2src/db_common/src/sql_update.rs index 2d4dbca6f6..5b955d979d 100644 --- a/mm2src/db_common/src/sql_update.rs +++ b/mm2src/db_common/src/sql_update.rs @@ -106,7 +106,7 @@ impl<'a> SqlUpdate<'a> { /// - [`SqlUpdate::or_where_in`] /// - [`SqlUpdate::or_where_in_quoted`] /// - [`SqlUpdate::or_where_in_params`] -impl<'a> SqlCondition for SqlUpdate<'a> { +impl SqlCondition for SqlUpdate<'_> { fn sql_builder(&mut self) -> &mut SqlBuilder { &mut self.sql_builder } fn sql_params(&mut self) -> &mut SqlParamsBuilder { &mut self.params } diff --git a/mm2src/mm2_bitcoin/chain/src/block_header.rs b/mm2src/mm2_bitcoin/chain/src/block_header.rs index dab58e13b3..2d819fc280 100644 --- a/mm2src/mm2_bitcoin/chain/src/block_header.rs +++ b/mm2src/mm2_bitcoin/chain/src/block_header.rs @@ -157,11 +157,8 @@ impl Serializable for BlockHeader { if let Some(claim) = &self.claim_trie_root { s.append(claim); } - match &self.hash_final_sapling_root { - Some(h) => { - s.append(h); - }, - None => (), + if let Some(h) = &self.hash_final_sapling_root { + s.append(h); }; s.append(&self.time); s.append(&self.bits); diff --git a/mm2src/mm2_bitcoin/primitives/src/bytes.rs b/mm2src/mm2_bitcoin/primitives/src/bytes.rs index 95f249e431..8b022bf46b 100644 --- a/mm2src/mm2_bitcoin/primitives/src/bytes.rs +++ b/mm2src/mm2_bitcoin/primitives/src/bytes.rs @@ -25,7 +25,7 @@ impl Bytes { pub fn split_off(&mut self, at: usize) -> Bytes { Bytes(self.0.split_off(at)) } } -impl<'a> From<&'a [u8]> for Bytes { +impl From<&[u8]> for Bytes { fn from(v: &[u8]) -> Self { Bytes(v.into()) } } diff --git a/mm2src/mm2_bitcoin/rpc/src/v1/types/address.rs b/mm2src/mm2_bitcoin/rpc/src/v1/types/address.rs index bd8af944ac..5c9f06fd38 100644 --- a/mm2src/mm2_bitcoin/rpc/src/v1/types/address.rs +++ b/mm2src/mm2_bitcoin/rpc/src/v1/types/address.rs @@ -23,7 +23,7 @@ where #[derive(Default)] pub struct AddressVisitor; -impl<'b> Visitor<'b> for AddressVisitor { +impl Visitor<'_> for AddressVisitor { type Value = LegacyAddress; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("an address") } diff --git a/mm2src/mm2_bitcoin/rpc/src/v1/types/bytes.rs b/mm2src/mm2_bitcoin/rpc/src/v1/types/bytes.rs index 5368985a08..94d5b247ca 100644 --- a/mm2src/mm2_bitcoin/rpc/src/v1/types/bytes.rs +++ b/mm2src/mm2_bitcoin/rpc/src/v1/types/bytes.rs @@ -51,7 +51,7 @@ impl<'a> Deserialize<'a> for Bytes { struct BytesVisitor; -impl<'a> Visitor<'a> for BytesVisitor { +impl Visitor<'_> for BytesVisitor { type Value = Bytes; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a bytes") } diff --git a/mm2src/mm2_bitcoin/rpc/src/v1/types/script.rs b/mm2src/mm2_bitcoin/rpc/src/v1/types/script.rs index c2a44d2211..4e0eaf4d10 100644 --- a/mm2src/mm2_bitcoin/rpc/src/v1/types/script.rs +++ b/mm2src/mm2_bitcoin/rpc/src/v1/types/script.rs @@ -84,7 +84,7 @@ impl<'a> Deserialize<'a> for ScriptType { struct ScriptTypeVisitor; - impl<'b> Visitor<'b> for ScriptTypeVisitor { + impl Visitor<'_> for ScriptTypeVisitor { type Value = ScriptType; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("script type") } diff --git a/mm2src/mm2_bitcoin/script/src/script.rs b/mm2src/mm2_bitcoin/script/src/script.rs index 2a8bf8eadb..fd467803fd 100644 --- a/mm2src/mm2_bitcoin/script/src/script.rs +++ b/mm2src/mm2_bitcoin/script/src/script.rs @@ -547,7 +547,7 @@ impl<'a> Iterator for Instructions<'a> { } } -impl<'a> Iterator for Opcodes<'a> { +impl Iterator for Opcodes<'_> { type Item = Result; fn next(&mut self) -> Option> { diff --git a/mm2src/mm2_bitcoin/serialization/src/impls.rs b/mm2src/mm2_bitcoin/serialization/src/impls.rs index 80c037ce93..4b281c1e59 100644 --- a/mm2src/mm2_bitcoin/serialization/src/impls.rs +++ b/mm2src/mm2_bitcoin/serialization/src/impls.rs @@ -151,7 +151,7 @@ impl Serializable for String { } } -impl<'a> Serializable for &'a str { +impl Serializable for &str { fn serialize(&self, stream: &mut Stream) { let bytes: &[u8] = self.as_bytes(); stream.append(&CompactInteger::from(bytes.len())).append_slice(bytes); diff --git a/mm2src/mm2_err_handle/src/map_to_mm_fut.rs b/mm2src/mm2_err_handle/src/map_to_mm_fut.rs index 0cfeb9cf13..d617eb39e9 100644 --- a/mm2src/mm2_err_handle/src/map_to_mm_fut.rs +++ b/mm2src/mm2_err_handle/src/map_to_mm_fut.rs @@ -43,7 +43,7 @@ pub struct MapToMmFuture<'a, T, E1: NotMmError, E2: NotMmError> { closure: Option E2 + Send + 'a>>, } -impl<'a, T, E1: NotMmError, E2: NotMmError> Future for MapToMmFuture<'a, T, E1, E2> { +impl Future for MapToMmFuture<'_, T, E1, E2> { type Item = T; type Error = MmError; diff --git a/mm2src/mm2_main/src/database/my_swaps.rs b/mm2src/mm2_main/src/database/my_swaps.rs index 91c2200bba..3f68b3b689 100644 --- a/mm2src/mm2_main/src/database/my_swaps.rs +++ b/mm2src/mm2_main/src/database/my_swaps.rs @@ -144,11 +144,7 @@ pub async fn fill_my_swaps_from_json_statements(ctx: &MmArc) -> Vec<(&'static st /// Use this only in migration code! fn insert_saved_swap_sql_migration_1(swap: SavedSwap) -> Option<(&'static str, Vec)> { - let swap_info = match swap.get_my_info() { - Some(s) => s, - // get_my_info returning None means that swap did not even start - so we can keep it away from indexing. - None => return None, - }; + let swap_info = swap.get_my_info()?; let params = vec![ swap_info.my_coin, swap_info.other_coin, diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 622e5acd54..8aa4116fd4 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -2694,10 +2694,7 @@ impl Orderbook { } fn remove_order_trie_update(&mut self, uuid: Uuid) -> Option { - let order = match self.order_set.remove(&uuid) { - Some(order) => order, - None => return None, - }; + let order = self.order_set.remove(&uuid)?; let base_rel = (order.base.clone(), order.rel.clone()); // create an `order_to_delete` that allows to find and remove an element from `self.ordered` by hash diff --git a/mm2src/mm2_number/src/big_int_str.rs b/mm2src/mm2_number/src/big_int_str.rs index d0855cfbbf..9f2d0b52a8 100644 --- a/mm2src/mm2_number/src/big_int_str.rs +++ b/mm2src/mm2_number/src/big_int_str.rs @@ -32,7 +32,7 @@ impl<'de> Deserialize<'de> for BigIntStr { fn deserialize>(deserializer: D) -> Result { struct BigIntStrVisitor; - impl<'de> de::Visitor<'de> for BigIntStrVisitor { + impl de::Visitor<'_> for BigIntStrVisitor { type Value = BigIntStr; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { diff --git a/mm2src/mm2_p2p/src/lib.rs b/mm2src/mm2_p2p/src/lib.rs index b1d0283be0..576e4ed430 100644 --- a/mm2src/mm2_p2p/src/lib.rs +++ b/mm2src/mm2_p2p/src/lib.rs @@ -78,7 +78,7 @@ impl<'de> Deserialize<'de> for PeerAddress { { struct PeerAddressVisitor; - impl<'de> serde::de::Visitor<'de> for PeerAddressVisitor { + impl serde::de::Visitor<'_> for PeerAddressVisitor { type Value = PeerAddress; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { diff --git a/mm2src/trading_api/src/one_inch_api/client.rs b/mm2src/trading_api/src/one_inch_api/client.rs index c4cc03d1d2..b25db3168e 100644 --- a/mm2src/trading_api/src/one_inch_api/client.rs +++ b/mm2src/trading_api/src/one_inch_api/client.rs @@ -140,7 +140,10 @@ impl ApiClient { pub const fn get_tokens_method() -> &'static str { TOKENS_METHOD } - pub(crate) async fn call_api(api_url: &Url) -> MmResult where T: DeserializeOwned{ + pub(crate) async fn call_api(api_url: &Url) -> MmResult + where + T: DeserializeOwned, + { let (status_code, _, body) = slurp_url_with_headers(api_url.as_str(), ApiClient::get_headers()) .await .mm_err(ApiClientError::TransportError)?; @@ -159,12 +162,15 @@ impl ApiClient { }) } - pub async fn call_swap_api<'l, T>( + pub async fn call_swap_api( &self, chain_id: u64, method: String, - params: Option>, - ) -> MmResult where T: DeserializeOwned { + params: Option>, + ) -> MmResult + where + T: DeserializeOwned, + { let mut builder = UrlBuilder::new(self, chain_id, method); if let Some(params) = params { builder.with_query_params(params); diff --git a/mm2src/trezor/src/response.rs b/mm2src/trezor/src/response.rs index c0bebc2415..bec11e5f92 100644 --- a/mm2src/trezor/src/response.rs +++ b/mm2src/trezor/src/response.rs @@ -103,7 +103,7 @@ impl<'a, 'b, T: 'static> TrezorResponse<'a, 'b, T> { } #[async_trait] -impl<'a, 'b, T> ProcessTrezorResponse for TrezorResponse<'a, 'b, T> +impl ProcessTrezorResponse for TrezorResponse<'_, '_, T> where T: Send + Sync + 'static, { @@ -148,7 +148,7 @@ pub struct ButtonRequest<'a, 'b, T> { result_handler: ResultHandler, } -impl<'a, 'b, T> fmt::Debug for ButtonRequest<'a, 'b, T> { +impl fmt::Debug for ButtonRequest<'_, '_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self.message) } } @@ -175,7 +175,7 @@ pub struct PinMatrixRequest<'a, 'b, T> { result_handler: ResultHandler, } -impl<'a, 'b, T> fmt::Debug for PinMatrixRequest<'a, 'b, T> { +impl fmt::Debug for PinMatrixRequest<'_, '_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self.message) } } @@ -202,7 +202,7 @@ pub struct PassphraseRequest<'a, 'b, T> { result_handler: ResultHandler, } -impl<'a, 'b, T> fmt::Debug for PassphraseRequest<'a, 'b, T> { +impl fmt::Debug for PassphraseRequest<'_, '_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self.message) } } diff --git a/mm2src/trezor/src/utxo/sign_utxo.rs b/mm2src/trezor/src/utxo/sign_utxo.rs index 7f53182639..13b6c6b125 100644 --- a/mm2src/trezor/src/utxo/sign_utxo.rs +++ b/mm2src/trezor/src/utxo/sign_utxo.rs @@ -35,7 +35,7 @@ impl<'a> TrezorSession<'a> { /// # Fail /// /// Currently, this method fails if a device requests a PIN. - pub async fn sign_utxo_tx<'b>(&'b mut self, unsigned: UnsignedUtxoTx) -> TrezorResult { + pub async fn sign_utxo_tx(&mut self, unsigned: UnsignedUtxoTx) -> TrezorResult { use proto_bitcoin::tx_request::RequestType as ProtoTxRequestType; let mut result = TxSignResult::new_with_inputs_count(unsigned.inputs.len()); @@ -107,8 +107,8 @@ impl<'a> TrezorSession<'a> { } } - async fn send_prev_tx_meta<'b>( - &'b mut self, + async fn send_prev_tx_meta( + &mut self, unsigned: &UnsignedUtxoTx, prev_tx_hash: &[u8], ) -> TrezorResult { @@ -128,8 +128,8 @@ impl<'a> TrezorSession<'a> { .mm_err(|e| TrezorError::Internal(e.to_string())) } - async fn send_prev_input<'b>( - &'b mut self, + async fn send_prev_input( + &mut self, unsigned: &UnsignedUtxoTx, request_details: &proto_bitcoin::tx_request::TxRequestDetailsType, prev_tx_hash: &[u8], @@ -155,8 +155,8 @@ impl<'a> TrezorSession<'a> { .mm_err(|e| TrezorError::Internal(e.to_string())) } - async fn send_prev_output<'b>( - &'b mut self, + async fn send_prev_output( + &mut self, unsigned: &UnsignedUtxoTx, request_details: &proto_bitcoin::tx_request::TxRequestDetailsType, prev_tx_hash: &[u8], @@ -182,8 +182,8 @@ impl<'a> TrezorSession<'a> { .mm_err(|e| TrezorError::Internal(e.to_string())) } - async fn send_input<'b>( - &'b mut self, + async fn send_input( + &mut self, unsigned: &UnsignedUtxoTx, request_details: &proto_bitcoin::tx_request::TxRequestDetailsType, ) -> TrezorResult { @@ -206,8 +206,8 @@ impl<'a> TrezorSession<'a> { .mm_err(|e| TrezorError::Internal(e.to_string())) } - async fn send_output<'b>( - &'b mut self, + async fn send_output( + &mut self, unsigned: &UnsignedUtxoTx, request_details: &proto_bitcoin::tx_request::TxRequestDetailsType, ) -> TrezorResult { @@ -260,10 +260,10 @@ impl<'a> TrezorSession<'a> { .mm_err(|e| TrezorError::Internal(e.to_string())) } - async fn sign_tx<'b>( - &'b mut self, + async fn sign_tx( + &mut self, req: proto_bitcoin::SignTx, - ) -> TrezorResult> { + ) -> TrezorResult> { let result_handler = ResultHandler::::new(Ok); self.call(req, result_handler).await } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 9f6bf9ded2..5d99aefe1a 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,6 +1,6 @@ [toolchain] # channel = "nightly-2023-06-01" -channel = "nightly-2024-08-05" +channel = "nightly-2025-01-04" components = ["rustfmt", "clippy", "rust-analyzer"] From 096242c1e1769ea2b96883b672f217beb9016945 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 05:21:24 +0100 Subject: [PATCH 18/35] try update ci --- .github/workflows/dev-build.yml | 36 ++++++++++++++--------------- .github/workflows/fmt-and-lint.yml | 8 +++---- .github/workflows/release-build.yml | 36 ++++++++++++++--------------- .github/workflows/test.yml | 32 ++++++++++++------------- 4 files changed, 56 insertions(+), 56 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 585f9d4856..d44454c21f 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -29,8 +29,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -102,8 +102,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add x86_64-apple-darwin - name: Install build deps @@ -163,8 +163,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add aarch64-apple-darwin - name: Install build deps @@ -225,8 +225,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -286,8 +286,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add x86_64-apple-darwin - name: Install build deps @@ -364,8 +364,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add wasm32-unknown-unknown - name: Install wasm-pack @@ -415,8 +415,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add aarch64-apple-ios - name: Install build deps @@ -488,8 +488,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add aarch64-linux-android - name: Install build deps @@ -566,8 +566,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add armv7-linux-androideabi - name: Install build deps diff --git a/.github/workflows/fmt-and-lint.yml b/.github/workflows/fmt-and-lint.yml index 27e7f0cb85..3de762c648 100644 --- a/.github/workflows/fmt-and-lint.yml +++ b/.github/workflows/fmt-and-lint.yml @@ -18,8 +18,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal --component rustfmt,clippy - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal --component rustfmt,clippy + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -45,8 +45,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal --component clippy - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal --component clippy + rustup default nightly-2025-01-04 rustup target add wasm32-unknown-unknown - name: Install build deps diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 7fec248c88..6a515abbb9 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -29,8 +29,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -94,8 +94,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -149,8 +149,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add aarch64-apple-darwin - name: Install build deps @@ -205,8 +205,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -260,8 +260,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add x86_64-apple-darwin - name: Install build deps @@ -332,8 +332,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add wasm32-unknown-unknown - name: Install wasm-pack @@ -380,8 +380,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add aarch64-apple-ios - name: Install build deps @@ -447,8 +447,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add aarch64-linux-android - name: Install build deps @@ -519,8 +519,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add armv7-linux-androideabi - name: Install build deps diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c0da60616b..cc9409d329 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,8 +25,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -53,8 +53,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -81,8 +81,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -109,8 +109,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -138,8 +138,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -170,8 +170,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -206,8 +206,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 - name: Install build deps uses: ./.github/actions/deps-install @@ -235,8 +235,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2023-06-01 --no-self-update --profile=minimal - rustup default nightly-2023-06-01 + rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal + rustup default nightly-2025-01-04 rustup target add wasm32-unknown-unknown - name: Install build deps From e0149316734eefcbc3b9e3eca01741e3f4daeb3a Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 07:19:25 +0100 Subject: [PATCH 19/35] fix remaining suppress and suppress ...rest clippy warnings --- Cargo.lock | 6 ++-- mm2src/coins/Cargo.toml | 2 +- mm2src/coins/eth.rs | 6 ++-- mm2src/coins/eth/web3_transport/mod.rs | 1 + mm2src/coins/lightning/ln_events.rs | 1 + mm2src/coins/lightning/ln_serialization.rs | 4 +-- mm2src/coins/lightning/ln_sql.rs | 31 ++++++++++--------- mm2src/coins/lp_coins.rs | 15 +++++---- mm2src/coins/nft/storage/mod.rs | 3 ++ mm2src/coins/nft/storage/wasm/wasm_storage.rs | 4 +-- mm2src/coins/qrc20.rs | 10 +++--- mm2src/coins/qrc20/swap.rs | 1 + mm2src/coins/rpc_command/get_new_address.rs | 2 +- .../coins/rpc_command/init_create_account.rs | 2 +- mm2src/coins/siacoin.rs | 2 +- .../tendermint/rpc/tendermint_native_rpc.rs | 1 + mm2src/coins/tendermint/tendermint_coin.rs | 4 +-- .../tendermint/tendermint_tx_history_v2.rs | 2 ++ mm2src/coins/tx_history_storage/mod.rs | 2 +- mm2src/coins/utxo/qtum.rs | 12 +++---- .../utxo/rpc_clients/electrum_rpc/client.rs | 6 ++-- .../rpc_clients/electrum_rpc/connection.rs | 8 +++-- .../connection_manager/manager.rs | 2 +- .../utxo/utxo_builder/utxo_arc_builder.rs | 16 +++++----- mm2src/coins/utxo/utxo_common.rs | 11 ++++--- mm2src/coins/utxo/utxo_tests.rs | 3 +- mm2src/coins/utxo/utxo_tx_history_v2.rs | 2 +- mm2src/coins/z_coin.rs | 10 +++--- .../storage/walletdb/wallet_sql_storage.rs | 4 +-- .../z_coin/storage/walletdb/wasm/storage.rs | 6 ++-- mm2src/coins/z_coin/z_coin_errors.rs | 4 +-- mm2src/coins/z_coin/z_rpc.rs | 8 ++--- .../src/bch_with_tokens_activation.rs | 4 +-- .../src/eth_with_token_activation.rs | 4 +-- mm2src/common/common.rs | 1 + mm2src/common/jsonrpc_client.rs | 1 + .../common/shared_ref_counter/src/enable.rs | 6 +--- mm2src/mm2_core/src/mm_ctx.rs | 2 ++ .../mm2_db/src/indexed_db/drivers/builder.rs | 1 + .../mm2_db/src/indexed_db/indexed_cursor.rs | 2 +- .../src/account/storage/mod.rs | 1 + mm2src/mm2_main/src/lp_ordermatch.rs | 18 ++++++----- .../src/lp_ordermatch/my_orders_storage.rs | 2 ++ mm2src/mm2_main/src/lp_swap/swap_watcher.rs | 5 +++ .../tests/docker_tests/docker_tests_common.rs | 3 +- mm2src/mm2_main/tests/docker_tests/mod.rs | 1 + .../tests/docker_tests/qrc20_tests.rs | 1 + .../tests/docker_tests/z_coin_docker_tests.rs | 6 +--- mm2src/mm2_main/tests/docker_tests_main.rs | 1 - .../mm2_main/tests/docker_tests_sia_unique.rs | 1 - .../tests/mm2_tests/mm2_tests_inner.rs | 1 + mm2src/mm2_main/tests/mm2_tests/mod.rs | 2 +- mm2src/trading_api/src/one_inch_api/client.rs | 5 +-- mm2src/trezor/src/utxo/sign_utxo.rs | 4 +-- 54 files changed, 145 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a29f748f46..9cbc4c1a9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -254,9 +254,9 @@ checksum = "c17772156ef2829aadc587461c7753af20b7e8db1529bc66855add962a3b35d3" [[package]] name = "async-trait" -version = "0.1.76" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531b97fb4cd3dfdce92c35dedbfdc1f0b9d8091c8ca943d6dae340ef5012d514" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote 1.0.40", diff --git a/mm2src/coins/Cargo.toml b/mm2src/coins/Cargo.toml index e2412033a6..b9bae5b1cb 100644 --- a/mm2src/coins/Cargo.toml +++ b/mm2src/coins/Cargo.toml @@ -21,7 +21,7 @@ doctest = false [dependencies] async-std = { version = "1.5", features = ["unstable"] } -async-trait = "0.1.52" +async-trait = "0.1" base64 = "0.21.2" base58 = "0.2.0" bip32 = { version = "0.2.2", default-features = false, features = ["alloc", "secp256k1-ffi"] } diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index fdf964a5d6..ac7beb7cbb 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -2670,8 +2670,8 @@ type EthTxFut = Box + Sen /// A `nonce_lock` is returned so that the caller doesn't release it until the transaction is sent and the /// address nonce is updated on RPC nodes. #[allow(clippy::too_many_arguments)] -async fn sign_transaction_with_keypair<'a>( - coin: &'a EthCoin, +async fn sign_transaction_with_keypair( + coin: &EthCoin, key_pair: &KeyPair, value: U256, action: Action, @@ -5956,7 +5956,7 @@ impl TryToAddress for [u8] { fn try_to_address(&self) -> Result { (&self).try_to_address() } } -impl<'a> TryToAddress for &'a [u8] { +impl TryToAddress for &[u8] { fn try_to_address(&self) -> Result { if self.len() != Address::len_bytes() { return ERR!( diff --git a/mm2src/coins/eth/web3_transport/mod.rs b/mm2src/coins/eth/web3_transport/mod.rs index e064e6025a..9415271885 100644 --- a/mm2src/coins/eth/web3_transport/mod.rs +++ b/mm2src/coins/eth/web3_transport/mod.rs @@ -109,6 +109,7 @@ impl From for Web3Transport { fn from(metamask: metamask_transport::MetamaskTransport) -> Self { Web3Transport::Metamask(metamask) } } +#[allow(dead_code)] #[derive(Debug, Deserialize)] pub struct FeeHistoryResult { #[serde(rename = "oldestBlock")] diff --git a/mm2src/coins/lightning/ln_events.rs b/mm2src/coins/lightning/ln_events.rs index 9c309049fb..eb133795a4 100644 --- a/mm2src/coins/lightning/ln_events.rs +++ b/mm2src/coins/lightning/ln_events.rs @@ -189,6 +189,7 @@ pub enum SignFundingTransactionError { } // Generates the raw funding transaction with one output equal to the channel value. +#[allow(clippy::unnecessary_fallible_conversions)] async fn sign_funding_transaction( uuid: Uuid, output_script_pubkey: &Script, diff --git a/mm2src/coins/lightning/ln_serialization.rs b/mm2src/coins/lightning/ln_serialization.rs index 37ece14bee..5e04f5cb41 100644 --- a/mm2src/coins/lightning/ln_serialization.rs +++ b/mm2src/coins/lightning/ln_serialization.rs @@ -27,7 +27,7 @@ impl<'de> de::Deserialize<'de> for NodeAddress { fn deserialize>(deserializer: D) -> Result { struct NodeAddressVisitor; - impl<'de> de::Visitor<'de> for NodeAddressVisitor { + impl de::Visitor<'_> for NodeAddressVisitor { type Value = NodeAddress; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "pubkey@host:port") } @@ -82,7 +82,7 @@ impl<'de> de::Deserialize<'de> for PublicKeyForRPC { fn deserialize>(deserializer: D) -> Result { struct PublicKeyForRPCVisitor; - impl<'de> de::Visitor<'de> for PublicKeyForRPCVisitor { + impl de::Visitor<'_> for PublicKeyForRPCVisitor { type Value = PublicKeyForRPC; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "a public key") } diff --git a/mm2src/coins/lightning/ln_sql.rs b/mm2src/coins/lightning/ln_sql.rs index 8de936c0da..59af04a698 100644 --- a/mm2src/coins/lightning/ln_sql.rs +++ b/mm2src/coins/lightning/ln_sql.rs @@ -1084,14 +1084,7 @@ mod tests { rng.fill_bytes(&mut bytes); Some(hex::encode(bytes)) }, - closure_reason: { - Some( - rng.sample_iter(&Alphanumeric) - .take(30) - .map(char::from) - .collect::(), - ) - }, + closure_reason: { Some(rng.sample_iter(&Alphanumeric).take(30).collect::()) }, claiming_tx: { rng.fill_bytes(&mut bytes); Some(hex::encode(bytes)) @@ -1132,7 +1125,7 @@ mod tests { } else { HTLCStatus::Failed }; - let description: String = rng.sample_iter(&Alphanumeric).take(30).map(char::from).collect(); + let description: String = rng.sample_iter(&Alphanumeric).take(30).collect(); let info = PaymentInfo { payment_hash: { rng.fill_bytes(&mut bytes); @@ -1441,7 +1434,9 @@ mod tests { let result = block_on(db.get_payments_by_filter(Some(filter.clone()), paging.clone(), limit)).unwrap(); let expected_payments_vec: Vec = payments - .iter().filter(|&p| p.payment_type == PaymentType::InboundPayment).cloned() + .iter() + .filter(|&p| p.payment_type == PaymentType::InboundPayment) + .cloned() .collect(); let expected_payments = if expected_payments_vec.len() > 10 { expected_payments_vec[..10].to_vec() @@ -1456,7 +1451,9 @@ mod tests { filter.status = Some(HTLCStatus::Succeeded.to_string()); let result = block_on(db.get_payments_by_filter(Some(filter.clone()), paging.clone(), limit)).unwrap(); let expected_payments_vec: Vec = expected_payments_vec - .iter().filter(|&p| p.status == HTLCStatus::Succeeded).cloned() + .iter() + .filter(|&p| p.status == HTLCStatus::Succeeded) + .cloned() .collect(); let expected_payments = if expected_payments_vec.len() > 10 { expected_payments_vec[..10].to_vec() @@ -1475,7 +1472,9 @@ mod tests { filter.description = Some(substr.to_string()); let result = block_on(db.get_payments_by_filter(Some(filter), paging, limit)).unwrap(); let expected_payments_vec: Vec = payments - .iter().filter(|&p| p.description.contains(substr)).cloned() + .iter() + .filter(|&p| p.description.contains(substr)) + .cloned() .collect(); let expected_payments = if expected_payments_vec.len() > 10 { expected_payments_vec[..10].to_vec() @@ -1616,7 +1615,9 @@ mod tests { filter.channel_visibility = Some(ChannelVisibility::Public); let result = block_on(db.get_closed_channels_by_filter(Some(filter.clone()), paging.clone(), limit)).unwrap(); let expected_channels_vec: Vec = expected_channels_vec - .iter().filter(|&chan| chan.is_public).cloned() + .iter() + .filter(|&chan| chan.is_public) + .cloned() .collect(); let expected_channels = if expected_channels_vec.len() > 10 { expected_channels_vec[..10].to_vec() @@ -1633,7 +1634,9 @@ mod tests { filter.channel_id = Some(channel_id.clone()); let result = block_on(db.get_closed_channels_by_filter(Some(filter), paging, limit)).unwrap(); let expected_channels_vec: Vec = channels - .iter().filter(|&chan| chan.channel_id == channel_id).cloned() + .iter() + .filter(|&chan| chan.channel_id == channel_id) + .cloned() .collect(); let expected_channels = if expected_channels_vec.len() > 10 { expected_channels_vec[..10].to_vec() diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 2177006874..331bacc453 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -25,10 +25,11 @@ forgetting_copy_types, clippy::swap_ptr_to_ref, clippy::forget_non_drop, - clippy::doc_lazy_continuation + clippy::doc_lazy_continuation, + clippy::result_large_err, + clippy::needless_lifetimes // review lifetime usages )] #![allow(uncommon_codepoints)] -#![feature(async_closure)] #![feature(hash_raw_entry)] #![feature(stmt_expr_attributes)] #![feature(result_flattening)] @@ -849,7 +850,7 @@ pub enum SwapTxTypeWithSecretHash<'a> { }, } -impl<'a> SwapTxTypeWithSecretHash<'a> { +impl SwapTxTypeWithSecretHash<'_> { pub fn redeem_script(&self, time_lock: u32, my_public: &Public, other_public: &Public) -> Script { match self { SwapTxTypeWithSecretHash::TakerOrMakerPayment { maker_secret_hash } => { @@ -5175,11 +5176,9 @@ pub async fn remove_delegation(ctx: MmArc, req: RemoveDelegateRequest) -> Delega None => match coin { MmCoinEnum::QtumCoin(qtum) => qtum.remove_delegation().compat().await, - _ => { - return MmError::err(DelegationError::CoinDoesntSupportDelegation { - coin: coin.ticker().to_string(), - }) - }, + _ => MmError::err(DelegationError::CoinDoesntSupportDelegation { + coin: coin.ticker().to_string(), + }), }, } } diff --git a/mm2src/coins/nft/storage/mod.rs b/mm2src/coins/nft/storage/mod.rs index de61d04a40..08625bb15c 100644 --- a/mm2src/coins/nft/storage/mod.rs +++ b/mm2src/coins/nft/storage/mod.rs @@ -28,6 +28,7 @@ pub enum RemoveNftResult { pub trait NftStorageError: std::fmt::Debug + NotMmError + Send {} /// Provides asynchronous operations for handling and querying NFT listings. +#[allow(dead_code)] #[async_trait] pub trait NftListStorageOps { type Error: NftStorageError; @@ -115,6 +116,7 @@ pub trait NftListStorageOps { } /// Provides asynchronous operations related to the history of NFT transfers. +#[allow(dead_code)] #[async_trait] pub trait NftTransferHistoryStorageOps { type Error: NftStorageError; @@ -245,6 +247,7 @@ pub(crate) struct TransferDetailsJson { pub(crate) fee_details: Option, } +#[allow(dead_code)] #[async_trait] pub trait NftMigrationOps { type Error: NftStorageError; diff --git a/mm2src/coins/nft/storage/wasm/wasm_storage.rs b/mm2src/coins/nft/storage/wasm/wasm_storage.rs index 47e16870e0..7d5c595795 100644 --- a/mm2src/coins/nft/storage/wasm/wasm_storage.rs +++ b/mm2src/coins/nft/storage/wasm/wasm_storage.rs @@ -114,8 +114,8 @@ impl NftTransferHistoryFilters { } fn is_date_match(&self, transfer: &NftTransferHistory) -> bool { - self.from_date.map_or(true, |from| transfer.block_timestamp >= from) - && self.to_date.map_or(true, |to| transfer.block_timestamp <= to) + self.from_date.is_none_or(|from| transfer.block_timestamp >= from) + && self.to_date.is_none_or(|to| transfer.block_timestamp <= to) } fn passes_spam_filter(&self, transfer: &NftTransferHistory) -> bool { diff --git a/mm2src/coins/qrc20.rs b/mm2src/coins/qrc20.rs index 3bb27bcf8d..b27477d9ce 100644 --- a/mm2src/coins/qrc20.rs +++ b/mm2src/coins/qrc20.rs @@ -189,7 +189,7 @@ impl<'a> Qrc20CoinBuilder<'a> { } #[async_trait] -impl<'a> UtxoCoinBuilderCommonOps for Qrc20CoinBuilder<'a> { +impl UtxoCoinBuilderCommonOps for Qrc20CoinBuilder<'_> { fn ctx(&self) -> &MmArc { self.ctx } fn conf(&self) -> &Json { self.conf } @@ -263,16 +263,16 @@ impl<'a> UtxoCoinBuilderCommonOps for Qrc20CoinBuilder<'a> { } } -impl<'a> UtxoFieldsWithIguanaSecretBuilder for Qrc20CoinBuilder<'a> {} +impl UtxoFieldsWithIguanaSecretBuilder for Qrc20CoinBuilder<'_> {} -impl<'a> UtxoFieldsWithGlobalHDBuilder for Qrc20CoinBuilder<'a> {} +impl UtxoFieldsWithGlobalHDBuilder for Qrc20CoinBuilder<'_> {} /// Although, `Qrc20Coin` doesn't support [`PrivKeyBuildPolicy::Trezor`] yet, /// `UtxoCoinBuilder` trait requires `UtxoFieldsWithHardwareWalletBuilder` to be implemented. -impl<'a> UtxoFieldsWithHardwareWalletBuilder for Qrc20CoinBuilder<'a> {} +impl UtxoFieldsWithHardwareWalletBuilder for Qrc20CoinBuilder<'_> {} #[async_trait] -impl<'a> UtxoCoinBuilder for Qrc20CoinBuilder<'a> { +impl UtxoCoinBuilder for Qrc20CoinBuilder<'_> { type ResultCoin = Qrc20Coin; type Error = UtxoCoinBuildError; diff --git a/mm2src/coins/qrc20/swap.rs b/mm2src/coins/qrc20/swap.rs index 18e371bbdf..7a1795c5b5 100644 --- a/mm2src/coins/qrc20/swap.rs +++ b/mm2src/coins/qrc20/swap.rs @@ -22,6 +22,7 @@ pub struct Erc20PaymentDetails { } /// `receiverSpend` call details consist of values obtained from [`TransactionOutput::script_pubkey`]. +#[allow(dead_code)] #[derive(Debug)] pub struct ReceiverSpendDetails { pub swap_id: Vec, diff --git a/mm2src/coins/rpc_command/get_new_address.rs b/mm2src/coins/rpc_command/get_new_address.rs index a43225d864..71eb82304f 100644 --- a/mm2src/coins/rpc_command/get_new_address.rs +++ b/mm2src/coins/rpc_command/get_new_address.rs @@ -484,7 +484,7 @@ pub(crate) mod common_impl { }) } - pub async fn get_new_address_rpc<'a, Coin, ConfirmAddress>( + pub async fn get_new_address_rpc( coin: &Coin, params: GetNewAddressParams, confirm_address: &ConfirmAddress, diff --git a/mm2src/coins/rpc_command/init_create_account.rs b/mm2src/coins/rpc_command/init_create_account.rs index d4e87e09fd..f073000894 100644 --- a/mm2src/coins/rpc_command/init_create_account.rs +++ b/mm2src/coins/rpc_command/init_create_account.rs @@ -391,7 +391,7 @@ pub(crate) mod common_impl { use crate::hd_wallet::{create_new_account, ExtractExtendedPubkey, HDAccountOps, HDAccountStorageOps, HDCoinExtendedPubkey, HDCoinHDAccount, HDWalletOps}; - pub async fn init_create_new_account_rpc<'a, Coin, XPubExtractor>( + pub async fn init_create_new_account_rpc( coin: &Coin, params: CreateNewAccountParams, state: CreateAccountState, diff --git a/mm2src/coins/siacoin.rs b/mm2src/coins/siacoin.rs index 6baca0f3e1..4157037b08 100644 --- a/mm2src/coins/siacoin.rs +++ b/mm2src/coins/siacoin.rs @@ -155,7 +155,7 @@ pub enum SiaCoinBuildError { EllipticCurveError(ed25519_dalek::ed25519::Error), } -impl<'a> SiaCoinBuilder<'a> { +impl SiaCoinBuilder<'_> { #[allow(dead_code)] fn ctx(&self) -> &MmArc { self.ctx } diff --git a/mm2src/coins/tendermint/rpc/tendermint_native_rpc.rs b/mm2src/coins/tendermint/rpc/tendermint_native_rpc.rs index 5da40d622d..b0de493025 100644 --- a/mm2src/coins/tendermint/rpc/tendermint_native_rpc.rs +++ b/mm2src/coins/tendermint/rpc/tendermint_native_rpc.rs @@ -26,6 +26,7 @@ use tokio::time; /// /// [`SubscriptionClient`]: trait.SubscriptionClient.html #[async_trait] +#[allow(dead_code)] pub trait Client { /// `/abci_info`: get information about the ABCI application. async fn abci_info(&self) -> Result { self.perform(abci_info::Request).await } diff --git a/mm2src/coins/tendermint/tendermint_coin.rs b/mm2src/coins/tendermint/tendermint_coin.rs index 4c6ef2fd7e..8de4af2d89 100644 --- a/mm2src/coins/tendermint/tendermint_coin.rs +++ b/mm2src/coins/tendermint/tendermint_coin.rs @@ -2210,9 +2210,9 @@ impl TendermintCoin { amount >= &min_tx_amount } - async fn search_for_swap_tx_spend<'l>( + async fn search_for_swap_tx_spend<'a>( &self, - input: SearchForSwapTxSpendInput<'l>, + input: SearchForSwapTxSpendInput<'a>, ) -> MmResult, SearchForSwapTxSpendErr> { let tx = cosmrs::Tx::from_bytes(input.tx)?; let first_message = tx diff --git a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs index 252b9ad4cd..bd0a86d7b4 100644 --- a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs +++ b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs @@ -185,8 +185,10 @@ impl TendermintInit { } } +#[allow(dead_code)] #[derive(Debug)] enum StopReason { + #[allow(dead_code)] StorageError(String), RpcClient(String), } diff --git a/mm2src/coins/tx_history_storage/mod.rs b/mm2src/coins/tx_history_storage/mod.rs index d440c98098..6036554611 100644 --- a/mm2src/coins/tx_history_storage/mod.rs +++ b/mm2src/coins/tx_history_storage/mod.rs @@ -47,7 +47,7 @@ pub struct TxHistoryStorageBuilder<'a> { ctx: &'a MmArc, } -impl<'a> TxHistoryStorageBuilder<'a> { +impl TxHistoryStorageBuilder<'_> { #[inline] pub fn new(ctx: &MmArc) -> TxHistoryStorageBuilder<'_> { TxHistoryStorageBuilder { ctx } } diff --git a/mm2src/coins/utxo/qtum.rs b/mm2src/coins/utxo/qtum.rs index 3e189c5983..9d792b9461 100644 --- a/mm2src/coins/utxo/qtum.rs +++ b/mm2src/coins/utxo/qtum.rs @@ -193,7 +193,7 @@ pub struct QtumCoinBuilder<'a> { } #[async_trait] -impl<'a> UtxoCoinBuilderCommonOps for QtumCoinBuilder<'a> { +impl UtxoCoinBuilderCommonOps for QtumCoinBuilder<'_> { fn ctx(&self) -> &MmArc { self.ctx } fn conf(&self) -> &Json { self.conf } @@ -205,14 +205,14 @@ impl<'a> UtxoCoinBuilderCommonOps for QtumCoinBuilder<'a> { fn check_utxo_maturity(&self) -> bool { self.activation_params().check_utxo_maturity.unwrap_or(true) } } -impl<'a> UtxoFieldsWithIguanaSecretBuilder for QtumCoinBuilder<'a> {} +impl UtxoFieldsWithIguanaSecretBuilder for QtumCoinBuilder<'_> {} -impl<'a> UtxoFieldsWithGlobalHDBuilder for QtumCoinBuilder<'a> {} +impl UtxoFieldsWithGlobalHDBuilder for QtumCoinBuilder<'_> {} -impl<'a> UtxoFieldsWithHardwareWalletBuilder for QtumCoinBuilder<'a> {} +impl UtxoFieldsWithHardwareWalletBuilder for QtumCoinBuilder<'_> {} #[async_trait] -impl<'a> UtxoCoinBuilder for QtumCoinBuilder<'a> { +impl UtxoCoinBuilder for QtumCoinBuilder<'_> { type ResultCoin = QtumCoin; type Error = UtxoCoinBuildError; @@ -227,7 +227,7 @@ impl<'a> UtxoCoinBuilder for QtumCoinBuilder<'a> { } } -impl<'a> MergeUtxoArcOps for QtumCoinBuilder<'a> {} +impl MergeUtxoArcOps for QtumCoinBuilder<'_> {} impl<'a> QtumCoinBuilder<'a> { pub fn new( diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs index 3452c19b3c..0af76b1b3d 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/client.rs @@ -427,8 +427,10 @@ impl ElectrumClient { final_response = Some((address, response)); } client.connection_manager.not_needed(connection.address()); - if !send_to_all && final_response.is_some() { - return Ok(final_response.unwrap()); + if !send_to_all { + if let Some(response) = final_response { + return Ok(response); + } } }, Err(e) => { diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs index 0c91a11188..be58dfb0fe 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection.rs @@ -235,16 +235,18 @@ impl ElectrumConnection { /// ## Important: This should always return [`JsonRpcErrorType::Transport`] error. pub async fn electrum_request( &self, - mut req_json: String, + req_json: String, rpc_id: JsonRpcId, timeout: f64, ) -> Result { #[cfg(not(target_arch = "wasm32"))] - { + let req_json = { // Electrum request and responses must end with \n // https://electrumx.readthedocs.io/en/latest/protocol-basics.html#message-stream + let mut req_json = req_json; req_json.push('\n'); - } + req_json + }; // Create a oneshot channel to receive the response in. let (req_tx, res_rx) = async_oneshot::channel(); diff --git a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs index 6f0e2be2af..3410cc4275 100644 --- a/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs +++ b/mm2src/coins/utxo/rpc_clients/electrum_rpc/connection_manager/manager.rs @@ -384,7 +384,7 @@ impl ConnectionManager { .filter(|(connection, _)| { all_connections .get(connection.address()) - .map_or(false, |conn_ctx| now_ms() > conn_ctx.suspended_till()) + .is_some_and(|conn_ctx| now_ms() > conn_ctx.suspended_till()) }) .cloned() .collect(); diff --git a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs index c666bd8e92..4199e3e39e 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs @@ -66,7 +66,7 @@ where } #[async_trait] -impl<'a, F, T> UtxoCoinBuilderCommonOps for UtxoArcBuilder<'a, F, T> +impl UtxoCoinBuilderCommonOps for UtxoArcBuilder<'_, F, T> where F: Fn(UtxoArc) -> T + Send + Sync + 'static, { @@ -79,23 +79,20 @@ where fn ticker(&self) -> &str { self.ticker } } -impl<'a, F, T> UtxoFieldsWithIguanaSecretBuilder for UtxoArcBuilder<'a, F, T> where +impl UtxoFieldsWithIguanaSecretBuilder for UtxoArcBuilder<'_, F, T> where F: Fn(UtxoArc) -> T + Send + Sync + 'static { } -impl<'a, F, T> UtxoFieldsWithGlobalHDBuilder for UtxoArcBuilder<'a, F, T> where - F: Fn(UtxoArc) -> T + Send + Sync + 'static -{ -} +impl UtxoFieldsWithGlobalHDBuilder for UtxoArcBuilder<'_, F, T> where F: Fn(UtxoArc) -> T + Send + Sync + 'static {} -impl<'a, F, T> UtxoFieldsWithHardwareWalletBuilder for UtxoArcBuilder<'a, F, T> where +impl UtxoFieldsWithHardwareWalletBuilder for UtxoArcBuilder<'_, F, T> where F: Fn(UtxoArc) -> T + Send + Sync + 'static { } #[async_trait] -impl<'a, F, T> UtxoCoinBuilder for UtxoArcBuilder<'a, F, T> +impl UtxoCoinBuilder for UtxoArcBuilder<'_, F, T> where F: Fn(UtxoArc) -> T + Clone + Send + Sync + 'static, T: UtxoCommonOps + GetUtxoListOps, @@ -124,7 +121,7 @@ where } } -impl<'a, F, T> MergeUtxoArcOps for UtxoArcBuilder<'a, F, T> +impl MergeUtxoArcOps for UtxoArcBuilder<'_, F, T> where F: Fn(UtxoArc) -> T + Send + Sync + 'static, T: UtxoCommonOps + GetUtxoListOps, @@ -529,6 +526,7 @@ impl PossibleChainReorgError { } /// Retrieves block headers from the specified client within the given height range and revalidate against [`SPVError::ParentHashMismatch`] . +#[allow(clippy::unit_arg)] async fn resolve_possible_chain_reorg( client: &ElectrumClient, server_address: &str, diff --git a/mm2src/coins/utxo/utxo_common.rs b/mm2src/coins/utxo/utxo_common.rs index 7c6ff77987..41f70073cd 100644 --- a/mm2src/coins/utxo/utxo_common.rs +++ b/mm2src/coins/utxo/utxo_common.rs @@ -3837,8 +3837,8 @@ pub async fn tx_details_by_hash( }) } -pub async fn get_mut_verbose_transaction_from_map_or_rpc<'a, 'b, T>( - coin: &'a T, +pub async fn get_mut_verbose_transaction_from_map_or_rpc<'b, T>( + coin: &T, tx_hash: H256Json, utxo_tx_map: &'b mut HistoryUtxoTxMap, ) -> UtxoRpcResult<&'b mut HistoryUtxoTx> @@ -4423,7 +4423,7 @@ pub fn address_from_pubkey( #[allow(clippy::too_many_arguments)] #[cfg_attr(test, mockable)] -pub async fn validate_payment<'a, T: UtxoCommonOps>( +pub async fn validate_payment<'a, T>( coin: T, tx: &'a UtxoTx, output_index: usize, @@ -4435,7 +4435,10 @@ pub async fn validate_payment<'a, T: UtxoCommonOps>( time_lock: u32, try_spv_proof_until: u64, confirmations: u64, -) -> ValidatePaymentResult<()> { +) -> ValidatePaymentResult<()> +where + T: UtxoCommonOps, +{ let amount = sat_from_big_decimal(&amount, coin.as_ref().decimals).map_mm_err()?; let expected_redeem = tx_type_with_secret_hash.redeem_script(time_lock, first_pub0, second_pub0); diff --git a/mm2src/coins/utxo/utxo_tests.rs b/mm2src/coins/utxo/utxo_tests.rs index 06b13b8a35..f70f0e63e9 100644 --- a/mm2src/coins/utxo/utxo_tests.rs +++ b/mm2src/coins/utxo/utxo_tests.rs @@ -1,3 +1,4 @@ +#![allow(static_mut_refs)] // refactor mutable static to use lazystatic use super::*; use crate::coin_balance::HDAddressBalance; use crate::coin_errors::ValidatePaymentError; @@ -4708,7 +4709,7 @@ fn test_scan_for_new_addresses() { assert_eq!(accounts[&0].internal_addresses_number, 4); assert_eq!(accounts[&1].external_addresses_number, 5); assert_eq!(accounts[&1].internal_addresses_number, 2); - assert_eq!(unsafe { addr_of!(CHECKED_ADDRESSES) }, &expected_checked_addresses); + assert_eq!(addr_of!(CHECKED_ADDRESSES), &expected_checked_addresses); } #[test] diff --git a/mm2src/coins/utxo/utxo_tx_history_v2.rs b/mm2src/coins/utxo/utxo_tx_history_v2.rs index 337e940a17..2db9d61713 100644 --- a/mm2src/coins/utxo/utxo_tx_history_v2.rs +++ b/mm2src/coins/utxo/utxo_tx_history_v2.rs @@ -131,7 +131,6 @@ pub trait UtxoTxHistoryOps: -> RequestTxHistoryResult; /// Requests timestamp of the given block. - async fn get_block_timestamp(&self, height: u64) -> MmResult; /// Requests balances of all activated coin's addresses. @@ -643,6 +642,7 @@ where } } +#[allow(dead_code)] #[derive(Debug)] enum StopReason { HistoryTooLarge, diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 164985569f..bea910601f 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -894,7 +894,7 @@ pub struct ZCoinBuilder<'a> { protocol_info: ZcoinProtocolInfo, } -impl<'a> UtxoCoinBuilderCommonOps for ZCoinBuilder<'a> { +impl UtxoCoinBuilderCommonOps for ZCoinBuilder<'_> { fn ctx(&self) -> &MmArc { self.ctx } fn conf(&self) -> &Json { self.conf } @@ -904,16 +904,16 @@ impl<'a> UtxoCoinBuilderCommonOps for ZCoinBuilder<'a> { fn ticker(&self) -> &str { self.ticker } } -impl<'a> UtxoFieldsWithIguanaSecretBuilder for ZCoinBuilder<'a> {} +impl UtxoFieldsWithIguanaSecretBuilder for ZCoinBuilder<'_> {} -impl<'a> UtxoFieldsWithGlobalHDBuilder for ZCoinBuilder<'a> {} +impl UtxoFieldsWithGlobalHDBuilder for ZCoinBuilder<'_> {} /// Although, `ZCoin` doesn't support [`PrivKeyBuildPolicy::Trezor`] yet, /// `UtxoCoinBuilder` trait requires `UtxoFieldsWithHardwareWalletBuilder` to be implemented. -impl<'a> UtxoFieldsWithHardwareWalletBuilder for ZCoinBuilder<'a> {} +impl UtxoFieldsWithHardwareWalletBuilder for ZCoinBuilder<'_> {} #[async_trait] -impl<'a> UtxoCoinBuilder for ZCoinBuilder<'a> { +impl UtxoCoinBuilder for ZCoinBuilder<'_> { type ResultCoin = ZCoin; type Error = ZCoinBuildError; diff --git a/mm2src/coins/z_coin/storage/walletdb/wallet_sql_storage.rs b/mm2src/coins/z_coin/storage/walletdb/wallet_sql_storage.rs index 3a957d375f..5e6fa618e2 100644 --- a/mm2src/coins/z_coin/storage/walletdb/wallet_sql_storage.rs +++ b/mm2src/coins/z_coin/storage/walletdb/wallet_sql_storage.rs @@ -77,9 +77,9 @@ pub async fn create_wallet_db( Ok(db) } -impl<'a> WalletDbShared { +impl WalletDbShared { pub async fn new( - builder: &ZCoinBuilder<'a>, + builder: &ZCoinBuilder<'_>, checkpoint_block: Option, z_spending_key: &ExtendedSpendingKey, continue_from_prev_sync: bool, diff --git a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs index d991cc521c..fa7bd81511 100644 --- a/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs +++ b/mm2src/coins/z_coin/storage/walletdb/wasm/storage.rs @@ -50,9 +50,9 @@ macro_rules! num_to_bigint { }; } -impl<'a> WalletDbShared { +impl WalletDbShared { pub async fn new( - builder: &ZCoinBuilder<'a>, + builder: &ZCoinBuilder<'_>, checkpoint_block: Option, z_spending_key: &ExtendedSpendingKey, continue_from_prev_sync: bool, @@ -131,7 +131,7 @@ pub struct WalletIndexedDb { pub params: ZcoinConsensusParams, } -impl<'a> WalletIndexedDb { +impl WalletIndexedDb { pub async fn new( ctx: &MmArc, ticker: &str, diff --git a/mm2src/coins/z_coin/z_coin_errors.rs b/mm2src/coins/z_coin/z_coin_errors.rs index 3c6e44a32a..84aa139dfc 100644 --- a/mm2src/coins/z_coin/z_coin_errors.rs +++ b/mm2src/coins/z_coin/z_coin_errors.rs @@ -236,7 +236,7 @@ pub enum ZCoinBuildError { UtxoBuilderError(UtxoCoinBuildError), GetAddressError, ZcashDBError(String), - Rpc(UtxoRpcError), + Rpc(String), #[display(fmt = "Sapling cache DB does not exist at {}. Please download it.", path)] SaplingCacheDbDoesNotExist { path: String, @@ -256,7 +256,7 @@ impl From for ZCoinBuildError { } impl From for ZCoinBuildError { - fn from(err: UtxoRpcError) -> ZCoinBuildError { ZCoinBuildError::Rpc(err) } + fn from(err: UtxoRpcError) -> ZCoinBuildError { ZCoinBuildError::Rpc(err.to_string()) } } impl From for ZCoinBuildError { diff --git a/mm2src/coins/z_coin/z_rpc.rs b/mm2src/coins/z_coin/z_rpc.rs index 040347e6c6..18d1531931 100644 --- a/mm2src/coins/z_coin/z_rpc.rs +++ b/mm2src/coins/z_coin/z_rpc.rs @@ -502,8 +502,8 @@ impl ZRpcOps for NativeClient { } } -pub(super) async fn init_light_client<'a>( - builder: &ZCoinBuilder<'a>, +pub(super) async fn init_light_client( + builder: &ZCoinBuilder<'_>, lightwalletd_urls: Vec, blocks_db: BlockDbImpl, sync_params: &Option, @@ -584,8 +584,8 @@ pub(super) async fn init_light_client<'a>( } #[cfg(not(target_arch = "wasm32"))] -pub(super) async fn init_native_client<'a>( - builder: &ZCoinBuilder<'a>, +pub(super) async fn init_native_client( + builder: &ZCoinBuilder<'_>, native_client: NativeClient, blocks_db: BlockDbImpl, z_spending_key: &ExtendedSpendingKey, diff --git a/mm2src/coins_activation/src/bch_with_tokens_activation.rs b/mm2src/coins_activation/src/bch_with_tokens_activation.rs index 76bf29c0b1..6f4da7fadb 100644 --- a/mm2src/coins_activation/src/bch_with_tokens_activation.rs +++ b/mm2src/coins_activation/src/bch_with_tokens_activation.rs @@ -163,8 +163,8 @@ impl GetPlatformBalance for BchWithTokensActivationResult { fn get_platform_balance(&self) -> Option { self.bch_addresses_infos .iter() - .fold(Some(BigDecimal::from(0)), |total, (_, addr_info)| { - total.and_then(|t| addr_info.balances.as_ref().map(|b| t + b.get_total())) + .try_fold(BigDecimal::from(0), |total, (_, addr_info)| { + addr_info.balances.as_ref().map(|b| total + b.get_total()) }) } } diff --git a/mm2src/coins_activation/src/eth_with_token_activation.rs b/mm2src/coins_activation/src/eth_with_token_activation.rs index 30c1f83393..76f34791d2 100644 --- a/mm2src/coins_activation/src/eth_with_token_activation.rs +++ b/mm2src/coins_activation/src/eth_with_token_activation.rs @@ -233,8 +233,8 @@ impl GetPlatformBalance for EthWithTokensActivationResult { EthWithTokensActivationResult::Iguana(result) => result .eth_addresses_infos .iter() - .fold(Some(BigDecimal::from(0)), |total, (_, addr_info)| { - total.and_then(|t| addr_info.balances.as_ref().map(|b| t + b.get_total())) + .try_fold(BigDecimal::from(0), |total, (_, addr_info)| { + addr_info.balances.as_ref().map(|b| total + b.get_total()) }), EthWithTokensActivationResult::HD(result) => result .wallet_balance diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index 211eaffa17..75196b29d3 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -770,6 +770,7 @@ static mut PROCESS_LOG_TAIL: [u8; 0x10000] = [0; 0x10000]; static TAIL_CUR: AtomicUsize = AtomicUsize::new(0); /// Keep a tail of the log in RAM for the integration tests. +#[allow(static_mut_refs)] // refactor PROCESS_LOG_TAIL to use lazystatic #[cfg(target_arch = "wasm32")] pub fn append_log_tail(line: &str) { unsafe { diff --git a/mm2src/common/jsonrpc_client.rs b/mm2src/common/jsonrpc_client.rs index 3f9e4cf6f6..96669d160a 100644 --- a/mm2src/common/jsonrpc_client.rs +++ b/mm2src/common/jsonrpc_client.rs @@ -331,6 +331,7 @@ pub trait JsonRpcBatchClient: JsonRpcClient { } /// Validates the given batch requests if they all have unique IDs. + #[allow(clippy::result_large_err)] fn validate_batch_request(&self, request: &JsonRpcBatchRequest) -> Result<(), JsonRpcError> { if request.orig_sequence_ids().all_unique() { return Ok(()); diff --git a/mm2src/common/shared_ref_counter/src/enable.rs b/mm2src/common/shared_ref_counter/src/enable.rs index 581a5c1cc6..9654d894ce 100644 --- a/mm2src/common/shared_ref_counter/src/enable.rs +++ b/mm2src/common/shared_ref_counter/src/enable.rs @@ -136,11 +136,7 @@ impl WeakRc { /// This behavior is considered acceptable since the `enable` feature is expected to be used for **debug** purposes only. #[track_caller] pub fn upgrade(&self) -> Option> { - let inner = match self.inner.upgrade() { - Some(ctx) => ctx, - None => return None, - }; - + let inner = self.inner.upgrade()?; let next_index = self.next_index.upgrade().expect(UPGRADING_ERROR); let index = next_index.fetch_add(1, Ordering::Relaxed); diff --git a/mm2src/mm2_core/src/mm_ctx.rs b/mm2src/mm2_core/src/mm_ctx.rs index 292dc69ca6..c8038a6e8b 100644 --- a/mm2src/mm2_core/src/mm_ctx.rs +++ b/mm2src/mm2_core/src/mm_ctx.rs @@ -660,6 +660,8 @@ impl MmArc { #[cfg(feature = "track-ctx-pointer")] fn track_ctx_pointer(&self) { + use common::executor::SpawnFuture; + let ctx_weak = self.weak(); let fut = async move { let level = log::log_crate::Level::Info; diff --git a/mm2src/mm2_db/src/indexed_db/drivers/builder.rs b/mm2src/mm2_db/src/indexed_db/drivers/builder.rs index 8fc411c8cb..ef3f117334 100644 --- a/mm2src/mm2_db/src/indexed_db/drivers/builder.rs +++ b/mm2src/mm2_db/src/indexed_db/drivers/builder.rs @@ -222,5 +222,6 @@ impl IdbDatabaseBuilder { enum DbOpenEvent { Failed(JsValue), UpgradeNeeded(JsValue), + #[allow(dead_code)] Success(JsValue), } diff --git a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs index 48789a62e3..cc890b552b 100644 --- a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs +++ b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs @@ -184,7 +184,7 @@ pub struct CursorIter<'transaction, Table> { phantom: PhantomData<&'transaction Table>, } -impl<'transaction, Table: TableSignature> CursorIter<'transaction, Table> { +impl CursorIter<'_, Table> { /// Advances the iterator and returns the next value. /// Please note that the items are sorted by the index keys. pub async fn next(&mut self) -> CursorResult> { diff --git a/mm2src/mm2_gui_storage/src/account/storage/mod.rs b/mm2src/mm2_gui_storage/src/account/storage/mod.rs index a2a186d490..718ccc50f4 100644 --- a/mm2src/mm2_gui_storage/src/account/storage/mod.rs +++ b/mm2src/mm2_gui_storage/src/account/storage/mod.rs @@ -140,6 +140,7 @@ impl<'a> AccountStorageBuilder<'a> { } /// An account storage interface. +#[allow(dead_code)] #[async_trait] pub(crate) trait AccountStorage: Send + Sync { /// Initialize the storage. diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 8aa4116fd4..b594456770 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -630,6 +630,7 @@ pub async fn process_msg(ctx: MmArc, from_peer: String, msg: &[u8], i_am_relay: } } +#[allow(dead_code)] #[derive(Debug)] struct TryFromBytesError(String); @@ -827,6 +828,7 @@ impl DeltaOrFullTrie { } } +#[allow(dead_code)] #[derive(Debug)] enum TrieDiffHistoryError { TrieDbError(Box>), @@ -4755,7 +4757,7 @@ pub struct TakerConnectForRpc<'a> { } impl<'a> From<&'a TakerConnect> for TakerConnectForRpc<'a> { - fn from(connect: &'a TakerConnect) -> TakerConnectForRpc { + fn from(connect: &'a TakerConnect) -> TakerConnectForRpc<'a> { TakerConnectForRpc { taker_order_uuid: &connect.taker_order_uuid, maker_order_uuid: &connect.maker_order_uuid, @@ -4776,7 +4778,7 @@ pub struct MakerConnectedForRpc<'a> { } impl<'a> From<&'a MakerConnected> for MakerConnectedForRpc<'a> { - fn from(connected: &'a MakerConnected) -> MakerConnectedForRpc { + fn from(connected: &'a MakerConnected) -> MakerConnectedForRpc<'a> { MakerConnectedForRpc { taker_order_uuid: &connected.taker_order_uuid, maker_order_uuid: &connected.maker_order_uuid, @@ -4788,7 +4790,7 @@ impl<'a> From<&'a MakerConnected> for MakerConnectedForRpc<'a> { } impl<'a> From<&'a MakerReserved> for MakerReservedForRpc<'a> { - fn from(reserved: &MakerReserved) -> MakerReservedForRpc { + fn from(reserved: &'a MakerReserved) -> MakerReservedForRpc<'a> { MakerReservedForRpc { base: &reserved.base, rel: &reserved.rel, @@ -4817,7 +4819,7 @@ struct MakerMatchForRpc<'a> { #[allow(clippy::needless_borrow)] impl<'a> From<&'a MakerMatch> for MakerMatchForRpc<'a> { - fn from(maker_match: &'a MakerMatch) -> MakerMatchForRpc { + fn from(maker_match: &'a MakerMatch) -> MakerMatchForRpc<'a> { MakerMatchForRpc { request: (&maker_match.request).into(), reserved: (&maker_match.reserved).into(), @@ -5298,7 +5300,7 @@ pub enum Order { } impl<'a> From<&'a Order> for OrderForRpc<'a> { - fn from(order: &'a Order) -> OrderForRpc { + fn from(order: &'a Order) -> OrderForRpc<'a> { match order { Order::Maker(o) => OrderForRpc::Maker(MakerOrderForRpc::from(o)), Order::Taker(o) => OrderForRpc::Taker(TakerOrderForRpc::from(o)), @@ -5548,7 +5550,7 @@ struct MakerOrderForMyOrdersRpc<'a> { } impl<'a> From<&'a MakerOrder> for MakerOrderForMyOrdersRpc<'a> { - fn from(order: &'a MakerOrder) -> MakerOrderForMyOrdersRpc { + fn from(order: &'a MakerOrder) -> MakerOrderForMyOrdersRpc<'a> { MakerOrderForMyOrdersRpc { order: order.into(), cancellable: order.is_cancellable(), @@ -5567,7 +5569,7 @@ struct TakerMatchForRpc<'a> { #[allow(clippy::needless_borrow)] impl<'a> From<&'a TakerMatch> for TakerMatchForRpc<'a> { - fn from(taker_match: &'a TakerMatch) -> TakerMatchForRpc { + fn from(taker_match: &'a TakerMatch) -> TakerMatchForRpc<'a> { TakerMatchForRpc { reserved: (&taker_match.reserved).into(), connect: (&taker_match.connect).into(), @@ -5590,7 +5592,7 @@ struct TakerOrderForRpc<'a> { #[allow(clippy::needless_borrow)] impl<'a> From<&'a TakerOrder> for TakerOrderForRpc<'a> { - fn from(order: &'a TakerOrder) -> TakerOrderForRpc { + fn from(order: &'a TakerOrder) -> TakerOrderForRpc<'a> { TakerOrderForRpc { created_at: order.created_at, request: (&order.request).into(), diff --git a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs index 5b865d1020..5cdfd81ce2 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs @@ -147,6 +147,7 @@ pub trait MyActiveOrders { async fn load_active_taker_orders(&self) -> MyOrdersResult>; + #[allow(dead_code)] async fn save_new_active_order(&self, order: &Order) -> MyOrdersResult<()> { match order { Order::Maker(maker) => self.save_new_active_maker_order(maker).await, @@ -184,6 +185,7 @@ pub trait MyOrdersFilteringHistory { async fn select_order_status(&self, uuid: Uuid) -> MyOrdersResult; + #[allow(dead_code)] async fn save_order_in_filtering_history(&self, order: &Order) -> MyOrdersResult<()> { match order { Order::Maker(maker) => self.save_maker_order_in_filtering_history(maker).await, diff --git a/mm2src/mm2_main/src/lp_swap/swap_watcher.rs b/mm2src/mm2_main/src/lp_swap/swap_watcher.rs index 73fb31c67d..95779332f9 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_watcher.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_watcher.rs @@ -116,8 +116,11 @@ pub struct TakerSwapWatcherData { pub maker_coin_start_block: u64, } +#[allow(dead_code)] struct ValidatePublicKeys {} +#[allow(dead_code)] struct ValidateTakerFee {} +#[allow(dead_code)] struct ValidateTakerPayment {} struct WaitForTakerPaymentSpend { taker_payment_hex: Vec, @@ -137,6 +140,7 @@ struct Stopped { stop_reason: StopReason, } +#[allow(dead_code)] #[derive(Debug)] enum StopReason { Finished(WatcherSuccess), @@ -151,6 +155,7 @@ enum WatcherSuccess { TakerPaymentRefundedByTaker, } +#[allow(dead_code)] #[derive(Debug)] enum WatcherError { InvalidTakerFee(String), diff --git a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs index cb7c99ab93..5fd3da6962 100644 --- a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs +++ b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs @@ -1,7 +1,8 @@ use coins::z_coin::ZCoin; -pub use common::{block_on, block_on_f01, now_ms, now_sec, wait_until_ms, wait_until_sec, DEX_FEE_ADDR_RAW_PUBKEY}; +pub use common::{block_on, block_on_f01, now_ms, now_sec, wait_until_ms, wait_until_sec}; pub use mm2_number::MmNumber; use mm2_rpc::data::legacy::BalanceResponse; +#[allow(unused_imports)] pub use mm2_test_helpers::for_tests::{check_my_swap_status, check_recent_swaps, enable_eth_coin, enable_native, enable_native_bch, erc20_dev_conf, eth_dev_conf, eth_sepolia_conf, jst_sepolia_conf, mm_dump, wait_check_stats_swap_status, MarketMakerIt, diff --git a/mm2src/mm2_main/tests/docker_tests/mod.rs b/mm2src/mm2_main/tests/docker_tests/mod.rs index 8dce2cdfb8..7ea93458eb 100644 --- a/mm2src/mm2_main/tests/docker_tests/mod.rs +++ b/mm2src/mm2_main/tests/docker_tests/mod.rs @@ -1,3 +1,4 @@ +#![allow(static_mut_refs)] pub mod docker_tests_common; mod docker_ordermatch_tests; diff --git a/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs b/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs index 7f759443a5..109d6bc774 100644 --- a/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs +++ b/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs @@ -1,3 +1,4 @@ +#![allow(static_mut_refs)] use crate::docker_tests::docker_tests_common::*; use crate::integration_tests_common::enable_native; use bitcrypto::dhash160; diff --git a/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs b/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs index 9abcfbe506..a9c30246d0 100644 --- a/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs +++ b/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs @@ -26,11 +26,7 @@ pub async fn z_coin_from_spending_key(spending_key: &str) -> (MmArc, ZCoin) { ..Default::default() }; let pk_data = [1; 32]; - let salt: String = thread_rng() - .sample_iter(&Alphanumeric) - .take(4) - .map(char::from) - .collect(); + let salt: String = thread_rng().sample_iter(&Alphanumeric).take(4).collect(); let db_folder = new_mm2_temp_folder_path(None).join(format!("ZOMBIE_DB_{}", salt)); std::fs::create_dir_all(&db_folder).unwrap(); let protocol_info = match serde_json::from_value::(conf["protocol"].take()).unwrap() { diff --git a/mm2src/mm2_main/tests/docker_tests_main.rs b/mm2src/mm2_main/tests/docker_tests_main.rs index 0ece4fabc8..4611a6ae9a 100644 --- a/mm2src/mm2_main/tests/docker_tests_main.rs +++ b/mm2src/mm2_main/tests/docker_tests_main.rs @@ -1,5 +1,4 @@ #![cfg(feature = "run-docker-tests")] -#![feature(async_closure)] #![feature(custom_test_frameworks)] #![feature(test)] #![test_runner(docker_tests_runner)] diff --git a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs index e98a179612..aee8fa6f7b 100644 --- a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs +++ b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs @@ -1,6 +1,5 @@ #![allow(unused_imports, dead_code)] #![cfg(feature = "enable-sia")] -#![feature(async_closure)] #![feature(custom_test_frameworks)] #![feature(test)] #![test_runner(docker_tests_runner)] diff --git a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs index 1a0c8ee02d..7384ba46b1 100644 --- a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs +++ b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs @@ -6114,6 +6114,7 @@ mod trezor_tests { pub enum InitTrezorStatus { Ok(InitHwResponse), Error(Json), + #[allow(dead_code)] InProgress(Json), UserActionRequired(Json), } diff --git a/mm2src/mm2_main/tests/mm2_tests/mod.rs b/mm2src/mm2_main/tests/mm2_tests/mod.rs index be27eabf9a..62cd207cb3 100644 --- a/mm2src/mm2_main/tests/mm2_tests/mod.rs +++ b/mm2src/mm2_main/tests/mm2_tests/mod.rs @@ -15,7 +15,7 @@ use mm2_test_helpers::structs::ZCoinActivationResult; #[cfg(all(feature = "zhtlc-native-tests", not(target_arch = "wasm32")))] async fn enable_z_coin(mm: &MarketMakerIt, coin: &str) -> ZCoinActivationResult { use common::{executor::Timer, wait_until_ms}; - use mm2_test_helpers::{for_tests::{init_z_coin_native, init_z_coin_status, MarketMakerIt}, + use mm2_test_helpers::{for_tests::{init_z_coin_native, init_z_coin_status}, structs::{InitTaskResult, InitZcoinStatus, RpcV2Response}}; let init = init_z_coin_native(mm, coin).await; diff --git a/mm2src/trading_api/src/one_inch_api/client.rs b/mm2src/trading_api/src/one_inch_api/client.rs index b25db3168e..66991458c2 100644 --- a/mm2src/trading_api/src/one_inch_api/client.rs +++ b/mm2src/trading_api/src/one_inch_api/client.rs @@ -162,11 +162,12 @@ impl ApiClient { }) } - pub async fn call_swap_api( + #[allow(clippy::needless_lifetimes)] // different warning when compiling for diff targets(code structure problem) + pub async fn call_swap_api<'a, T>( &self, chain_id: u64, method: String, - params: Option>, + params: Option>, ) -> MmResult where T: DeserializeOwned, diff --git a/mm2src/trezor/src/utxo/sign_utxo.rs b/mm2src/trezor/src/utxo/sign_utxo.rs index 13b6c6b125..fca504bc44 100644 --- a/mm2src/trezor/src/utxo/sign_utxo.rs +++ b/mm2src/trezor/src/utxo/sign_utxo.rs @@ -230,8 +230,8 @@ impl<'a> TrezorSession<'a> { .mm_err(|e| TrezorError::Internal(e.to_string())) } - async fn send_extra_data<'b>( - &'b mut self, + async fn send_extra_data( + &mut self, unsigned: &UnsignedUtxoTx, request_details: &proto_bitcoin::tx_request::TxRequestDetailsType, prev_tx_hash: &[u8], From 7ddb415bfb5e8bbb30d94279fdda0e6501eb83e6 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 07:20:48 +0100 Subject: [PATCH 20/35] cargo fmt --- mm2src/coins/nft/nft_tests.rs | 3 ++- .../lightning/get_claimable_balances.rs | 2 +- .../lightning/get_payment_details.rs | 2 +- mm2src/coins/utxo/bch.rs | 3 ++- mm2src/coins/utxo/qtum_delegation.rs | 3 ++- .../utxo/utxo_builder/utxo_coin_builder.rs | 3 +-- .../utxo/utxo_builder/utxo_conf_builder.rs | 2 +- .../src/standalone_coin/mod.rs | 4 ++-- mm2src/mm2_bitcoin/keys/src/address.rs | 12 ++++++---- mm2src/mm2_bitcoin/keys/src/cashaddress.rs | 24 ++++++++++++------- .../mm2_db/src/indexed_db/indexed_cursor.rs | 4 +++- mm2src/mm2_main/src/database/my_orders.rs | 12 ++++++---- mm2src/mm2_main/src/database/stats_nodes.rs | 12 ++++++---- .../src/storable_state_machine.rs | 5 +--- 14 files changed, 56 insertions(+), 35 deletions(-) diff --git a/mm2src/coins/nft/nft_tests.rs b/mm2src/coins/nft/nft_tests.rs index cd3c1a12b0..c3574de55b 100644 --- a/mm2src/coins/nft/nft_tests.rs +++ b/mm2src/coins/nft/nft_tests.rs @@ -465,7 +465,8 @@ cross_test!(test_add_get_transfers, { let transfer1 = storage .get_transfers_by_token_addr_id(chain, TOKEN_ADD.to_string(), token_id) .await - .unwrap().first() + .unwrap() + .first() .unwrap() .clone(); assert_eq!(transfer1.block_number, 28056721); diff --git a/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs b/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs index eb2f019578..a190ec4d56 100644 --- a/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs +++ b/mm2src/coins/rpc_command/lightning/get_claimable_balances.rs @@ -1,9 +1,9 @@ use crate::lightning::ln_serialization::ClaimableBalance; use crate::{lp_coinfind_or_err, CoinFindError, MmCoinEnum}; use common::{async_blocking, HttpStatusCode}; +use derive_more::Display; use http::StatusCode; use mm2_core::mm_ctx::MmArc; -use derive_more::Display; use mm2_err_handle::prelude::*; type ClaimableBalancesResult = Result>; diff --git a/mm2src/coins/rpc_command/lightning/get_payment_details.rs b/mm2src/coins/rpc_command/lightning/get_payment_details.rs index 63e6af3967..be759874e3 100644 --- a/mm2src/coins/rpc_command/lightning/get_payment_details.rs +++ b/mm2src/coins/rpc_command/lightning/get_payment_details.rs @@ -3,9 +3,9 @@ use crate::lightning::ln_serialization::PaymentInfoForRPC; use crate::{lp_coinfind_or_err, CoinFindError, H256Json, MmCoinEnum}; use common::HttpStatusCode; use db_common::sqlite::rusqlite::Error as SqlError; +use derive_more::Display; use http::StatusCode; use lightning::ln::PaymentHash; -use derive_more::Display; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; diff --git a/mm2src/coins/utxo/bch.rs b/mm2src/coins/utxo/bch.rs index 511501b598..813e43484a 100644 --- a/mm2src/coins/utxo/bch.rs +++ b/mm2src/coins/utxo/bch.rs @@ -384,7 +384,8 @@ impl BchCoin { ) .await?; let maybe_op_return: Script = tx - .outputs.first() + .outputs + .first() .ok_or(UtxoTxDetailsError::Internal(format!( "Transaction {} has no outputs", params.hash diff --git a/mm2src/coins/utxo/qtum_delegation.rs b/mm2src/coins/utxo/qtum_delegation.rs index 5a80d4eefc..6e51ab0586 100644 --- a/mm2src/coins/utxo/qtum_delegation.rs +++ b/mm2src/coins/utxo/qtum_delegation.rs @@ -184,7 +184,8 @@ impl QtumCoin { }) .and_then(|receipt| { receipt - .log.first() + .log + .first() .and_then(|log_entry| log_entry.topics.get(1)) .map(|padded_staker_address_hex| padded_staker_address_hex.trim_start_matches('0')) }) { diff --git a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs index 9db391b91b..8254c31bd4 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_coin_builder.rs @@ -20,8 +20,7 @@ use futures::channel::mpsc::{channel, Receiver as AsyncReceiver}; use futures::compat::Future01CompatExt; use futures::lock::Mutex as AsyncMutex; use keys::bytes::Bytes; -pub use keys::{Address, AddressBuilder, AddressFormat as UtxoAddressFormat, - KeyPair, Private}; +pub use keys::{Address, AddressBuilder, AddressFormat as UtxoAddressFormat, KeyPair, Private}; use mm2_core::mm_ctx::MmArc; use mm2_err_handle::prelude::*; use primitives::hash::H160; diff --git a/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs index bbbc64dbf4..90077f1edd 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_conf_builder.rs @@ -5,8 +5,8 @@ use crate::UtxoActivationParams; use bitcrypto::ChecksumType; use crypto::{Bip32Error, HDPathToCoin}; use derive_more::Display; -use keys::NetworkAddressPrefixes; pub use keys::AddressFormat as UtxoAddressFormat; +use keys::NetworkAddressPrefixes; use mm2_err_handle::prelude::*; use script::SignatureVersion; use serde_json::{self as json, Value as Json}; diff --git a/mm2src/coins_activation/src/standalone_coin/mod.rs b/mm2src/coins_activation/src/standalone_coin/mod.rs index 69f49d79bb..26afd8bc51 100644 --- a/mm2src/coins_activation/src/standalone_coin/mod.rs +++ b/mm2src/coins_activation/src/standalone_coin/mod.rs @@ -4,6 +4,6 @@ mod init_standalone_coin_error; pub use init_standalone_coin::{cancel_init_standalone_coin, init_standalone_coin, init_standalone_coin_status, init_standalone_coin_user_action, InitStandaloneCoinActivationOps, InitStandaloneCoinInitialStatus, InitStandaloneCoinReq, - InitStandaloneCoinStatusRequest, - InitStandaloneCoinTaskHandleShared, InitStandaloneCoinTaskManagerShared}; + InitStandaloneCoinStatusRequest, InitStandaloneCoinTaskHandleShared, + InitStandaloneCoinTaskManagerShared}; pub use init_standalone_coin_error::InitStandaloneCoinError; diff --git a/mm2src/mm2_bitcoin/keys/src/address.rs b/mm2src/mm2_bitcoin/keys/src/address.rs index 8714714597..adf72131ff 100644 --- a/mm2src/mm2_bitcoin/keys/src/address.rs +++ b/mm2src/mm2_bitcoin/keys/src/address.rs @@ -518,12 +518,16 @@ mod tests { #[test] fn test_from_to_cashaddress() { - let cashaddresses = ["bitcoincash:qzxqqt9lh4feptf0mplnk58gnajfepzwcq9f2rxk55", + let cashaddresses = [ + "bitcoincash:qzxqqt9lh4feptf0mplnk58gnajfepzwcq9f2rxk55", "bitcoincash:qr6m7j9njldwwzlg9v7v53unlr4jkmx6eylep8ekg2", - "bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f"]; - let expected = ["1DmFp16U73RrVZtYUbo2Ectt8mAnYScpqM", + "bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f", + ]; + let expected = [ + "1DmFp16U73RrVZtYUbo2Ectt8mAnYScpqM", "1PQPheJQSauxRPTxzNMUco1XmoCyPoEJCp", - "35XRC5HRZjih1sML23UXv1Ry1SzTDKSmfQ"]; + "35XRC5HRZjih1sML23UXv1Ry1SzTDKSmfQ", + ]; for i in 0..3 { let actual_address = diff --git a/mm2src/mm2_bitcoin/keys/src/cashaddress.rs b/mm2src/mm2_bitcoin/keys/src/cashaddress.rs index 497a51d516..d798d1501c 100644 --- a/mm2src/mm2_bitcoin/keys/src/cashaddress.rs +++ b/mm2src/mm2_bitcoin/keys/src/cashaddress.rs @@ -415,7 +415,8 @@ mod tests { #[test] fn test_base32() { // the raw arrays are 5-bit packed - the condition is required by base32 encode and decode functions - let raw = [vec![ + let raw = [ + vec![ 24, 14, 9, 25, 19, 30, 22, 1, 28, 0, 30, 28, 22, 7, 1, 11, 18, 7, 1, 7, 19, 23, 21, 30, 24, 25, 20, 27, 3, 27, 29, 10, ], @@ -426,10 +427,13 @@ mod tests { vec![ 12, 2, 21, 24, 0, 0, 5, 14, 7, 6, 22, 25, 22, 31, 20, 9, 18, 12, 10, 6, 11, 28, 7, 14, 19, 9, 15, 29, 15, 22, 11, 27, - ]]; - let encoded = ["cwfen7kpuq7uk8ptj8p8nh47ce5mrma2", + ], + ]; + let encoded = [ + "cwfen7kpuq7uk8ptj8p8nh47ce5mrma2", "gg0guaszp3e93yzg3405tcasx5tzkjk9", - "vz4cqq9w8xkekl5fjv2xtu8wnf0a0ktm"]; + "vz4cqq9w8xkekl5fjv2xtu8wnf0a0ktm", + ]; for i in 0..3 { let actual_encoded = base32::encode(&raw[i]).unwrap(); @@ -443,12 +447,15 @@ mod tests { #[test] fn test_encode_decode() { - let encoded = ["bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f", + let encoded = [ + "bitcoincash:pq4ql3ph6738xuv2cycduvkpu4rdwqge5q2uxdfg6f", "qrplwyx7kueqkrh6dmd3fclta6u32hafp5tnpkchx2", "BitCoinCash:QRPLWYX7KUEQKRH6DMD3FCLTA6U32HAFP5TNPKCHX2", "bchtest:qqjr7yu573z4faxw8ltgvjwpntwys08fysk07zmvce", - "bchtest:pnq8zwpj8cq05n7pytfmskuk9r4gzzel8qtsvwz79zdskftrzxtar994cgutavfklvmgm6ynej"]; - let expected_addresses = [CashAddress { + "bchtest:pnq8zwpj8cq05n7pytfmskuk9r4gzzel8qtsvwz79zdskftrzxtar994cgutavfklvmgm6ynej", + ]; + let expected_addresses = [ + CashAddress { prefix: "bitcoincash".into(), hash: vec![ 42, 15, 196, 55, 215, 162, 115, 113, 138, 193, 48, 222, 50, 193, 229, 70, 215, 1, 25, 160, @@ -483,7 +490,8 @@ mod tests { 94, 40, 155, 11, 37, 99, 17, 151, 209, 148, 181, 194, 56, 190, 177, 54, 251, ], address_type: CashAddrType::P2SH, - }]; + }, + ]; for i in 0..4 { let actual_address = CashAddress::decode(encoded[i]).unwrap(); diff --git a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs index cc890b552b..212fc72499 100644 --- a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs +++ b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs @@ -424,7 +424,9 @@ mod tests { .collect::>(); // Get `BeBigUint` numbers that should have been returned by the cursor above. let expected = numbers - .iter().filter(|&num| num_x <= num && num <= num_y).cloned() + .iter() + .filter(|&num| num_x <= num && num <= num_y) + .cloned() .sorted() .collect::>(); assert_eq!(actual_items, expected); diff --git a/mm2src/mm2_main/src/database/my_orders.rs b/mm2src/mm2_main/src/database/my_orders.rs index 6b43f12d1e..1495ccbd84 100644 --- a/mm2src/mm2_main/src/database/my_orders.rs +++ b/mm2src/mm2_main/src/database/my_orders.rs @@ -88,11 +88,13 @@ pub fn insert_taker_order(ctx: &MmArc, uuid: Uuid, order: &TakerOrder) -> SqlRes pub fn update_maker_order(ctx: &MmArc, uuid: Uuid, order: &MakerOrder) -> SqlResult<()> { debug!("Updating order {} in the SQLite database", uuid); - let params = [uuid.to_string(), + let params = [ + uuid.to_string(), order.price.to_decimal().to_string(), order.max_base_vol.to_decimal().to_string(), order.updated_at.unwrap_or(0).to_string(), - "Updated".to_string()]; + "Updated".to_string(), + ]; let conn = ctx.sqlite_connection(); conn.execute(UPDATE_MY_ORDER, params_from_iter(params.iter())) .map(|_| ()) @@ -100,10 +102,12 @@ pub fn update_maker_order(ctx: &MmArc, uuid: Uuid, order: &MakerOrder) -> SqlRes pub fn update_was_taker(ctx: &MmArc, uuid: Uuid) -> SqlResult<()> { debug!("Updating order {} in the SQLite database", uuid); - let params = [uuid.to_string(), + let params = [ + uuid.to_string(), "Maker".to_string(), now_ms().to_string(), - 1.to_string()]; + 1.to_string(), + ]; let conn = ctx.sqlite_connection(); conn.execute(UPDATE_WAS_TAKER, params_from_iter(params.iter())) .map(|_| ()) diff --git a/mm2src/mm2_main/src/database/stats_nodes.rs b/mm2src/mm2_main/src/database/stats_nodes.rs index 1a87bdc51a..b38199c187 100644 --- a/mm2src/mm2_main/src/database/stats_nodes.rs +++ b/mm2src/mm2_main/src/database/stats_nodes.rs @@ -32,9 +32,11 @@ const INSERT_STAT: &str = "INSERT INTO stats_nodes (name, version, timestamp, er pub fn insert_node_info(ctx: &MmArc, node_info: &NodeInfo) -> SqlResult<()> { debug!("Inserting info about node {} to the SQLite database", node_info.name); - let params = [node_info.name.clone(), + let params = [ + node_info.name.clone(), node_info.address.clone(), - node_info.peer_id.clone()]; + node_info.peer_id.clone(), + ]; #[cfg(not(feature = "new-db-arch"))] let conn = ctx.sqlite_connection(); #[cfg(feature = "new-db-arch")] @@ -84,10 +86,12 @@ pub fn insert_node_version_stat(ctx: &MmArc, node_version_stat: NodeVersionStat) "Inserting new version stat for node {} to the SQLite database", node_version_stat.name ); - let params = [node_version_stat.name, + let params = [ + node_version_stat.name, node_version_stat.version.unwrap_or_default(), node_version_stat.timestamp.to_string(), - node_version_stat.error.unwrap_or_default()]; + node_version_stat.error.unwrap_or_default(), + ]; #[cfg(not(feature = "new-db-arch"))] let conn = ctx.sqlite_connection(); #[cfg(feature = "new-db-arch")] diff --git a/mm2src/mm2_state_machine/src/storable_state_machine.rs b/mm2src/mm2_state_machine/src/storable_state_machine.rs index 0847d7b7d7..87445fe033 100644 --- a/mm2src/mm2_state_machine/src/storable_state_machine.rs +++ b/mm2src/mm2_state_machine/src/storable_state_machine.rs @@ -430,10 +430,7 @@ mod tests { async fn has_record_for(&mut self, _id: &Self::MachineId) -> Result { Ok(false) } async fn store_event(&mut self, machine_id: usize, event: TestEvent) -> Result<(), Self::Error> { - self.events_unfinished - .entry(machine_id) - .or_default() - .push(event); + self.events_unfinished.entry(machine_id).or_default().push(event); Ok(()) } From 7f9514c8f6b7071a430a77145ac4f60882a78cd7 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Wed, 7 May 2025 07:30:49 +0100 Subject: [PATCH 21/35] format args fix --- mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs index 5fd3da6962..e93fbf8be0 100644 --- a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs +++ b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs @@ -1260,7 +1260,7 @@ pub fn wait_until_relayer_container_is_ready(container_id: &str) { log!("Expected output {Q_RESULT}, received {output}."); if attempts > 10 { - panic!("{}", "Reached max attempts for <<{docker:?}>>."); + panic!("Reached max attempts for <<{:?}>>.", docker); } else { log!("Asking for relayer node status again.."); } From 005bb6ba57b6d97f1db936ee07388e5b2d48a0b8 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Thu, 8 May 2025 03:45:01 +0100 Subject: [PATCH 22/35] fix failing tests and minor changes --- clippy.toml | 2 -- mm2src/coins/utxo/utxo_tests.rs | 9 ++++++--- mm2src/mm2_main/src/lp_ordermatch.rs | 2 +- rust-toolchain.toml | 3 --- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/clippy.toml b/clippy.toml index ab51a95e14..7494d2e44a 100644 --- a/clippy.toml +++ b/clippy.toml @@ -2,5 +2,3 @@ path = "futures::future::Future::wait" replacement = "common::block_on_f01" reason = "Use the default KDF async executor." - -allow = ["doc_lazy_continuation"] diff --git a/mm2src/coins/utxo/utxo_tests.rs b/mm2src/coins/utxo/utxo_tests.rs index f70f0e63e9..2ba9f45a0b 100644 --- a/mm2src/coins/utxo/utxo_tests.rs +++ b/mm2src/coins/utxo/utxo_tests.rs @@ -1,4 +1,4 @@ -#![allow(static_mut_refs)] // refactor mutable static to use lazystatic +#![allow(static_mut_refs)] use super::*; use crate::coin_balance::HDAddressBalance; use crate::coin_errors::ValidatePaymentError; @@ -1079,7 +1079,7 @@ fn test_electrum_rpc_client_error() { // use the static string instead because the actual error message cannot be obtain // by serde_json serialization - let expected = r#"method: "blockchain.transaction.get", params: [String("0000000000000000000000000000000000000000000000000000000000000000"), Bool(true)] }, error: Response(electrum1.cipig.net:10060, Object({"code": Number(2), "message": String("daemon error: DaemonError({'code': -5, 'message': 'No such mempool or blockchain transaction. Use gettransaction for wallet transactions.'})")})) }"#; + let expected = r#"method: "blockchain.transaction.get", params: [String("0000000000000000000000000000000000000000000000000000000000000000"), Bool(true)] }, error: Response(electrum1.cipig.net:10060, Object {"code": Number(2), "message": String("daemon error: DaemonError({'code': -5, 'message': 'No such mempool or blockchain transaction. Use gettransaction for wallet transactions.'})")}) }"#; let actual = format!("{}", err); assert!(actual.contains(expected)); @@ -4709,7 +4709,10 @@ fn test_scan_for_new_addresses() { assert_eq!(accounts[&0].internal_addresses_number, 4); assert_eq!(accounts[&1].external_addresses_number, 5); assert_eq!(accounts[&1].internal_addresses_number, 2); - assert_eq!(addr_of!(CHECKED_ADDRESSES), &expected_checked_addresses); + assert_eq!( + unsafe { &addr_of!(CHECKED_ADDRESSES).read_unaligned() }, + &expected_checked_addresses + ); } #[test] diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index b594456770..06670dc2e0 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -536,7 +536,7 @@ fn remove_pubkey_pair_orders(orderbook: &mut Orderbook, pubkey: &str, alb_pair: None => return, }; - if pubkey_state.trie_roots.contains_key(alb_pair) { + if !pubkey_state.trie_roots.contains_key(alb_pair) { return; } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 5d99aefe1a..68b33e55f5 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,6 +1,3 @@ [toolchain] -# channel = "nightly-2023-06-01" channel = "nightly-2025-01-04" components = ["rustfmt", "clippy", "rust-analyzer"] - - From 2c8fda4cd138612e2c5f1f64becde3fee3a042f4 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Mon, 12 May 2025 01:37:56 +0100 Subject: [PATCH 23/35] use 2025-01-03 --- .github/workflows/dev-build.yml | 36 ++++++++++++++--------------- .github/workflows/fmt-and-lint.yml | 8 +++---- .github/workflows/release-build.yml | 36 ++++++++++++++--------------- .github/workflows/test.yml | 32 ++++++++++++------------- Cargo.lock | 4 ++-- rust-toolchain.toml | 2 +- 6 files changed, 59 insertions(+), 59 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index d44454c21f..4d90a1f3a8 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -29,8 +29,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -102,8 +102,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add x86_64-apple-darwin - name: Install build deps @@ -163,8 +163,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add aarch64-apple-darwin - name: Install build deps @@ -225,8 +225,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -286,8 +286,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add x86_64-apple-darwin - name: Install build deps @@ -364,8 +364,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add wasm32-unknown-unknown - name: Install wasm-pack @@ -415,8 +415,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add aarch64-apple-ios - name: Install build deps @@ -488,8 +488,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add aarch64-linux-android - name: Install build deps @@ -566,8 +566,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add armv7-linux-androideabi - name: Install build deps diff --git a/.github/workflows/fmt-and-lint.yml b/.github/workflows/fmt-and-lint.yml index 3de762c648..8308def3fc 100644 --- a/.github/workflows/fmt-and-lint.yml +++ b/.github/workflows/fmt-and-lint.yml @@ -18,8 +18,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal --component rustfmt,clippy - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal --component rustfmt,clippy + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -45,8 +45,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal --component clippy - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal --component clippy + rustup default nightly-2025-01-03 rustup target add wasm32-unknown-unknown - name: Install build deps diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 6a515abbb9..a50c231f65 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -29,8 +29,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -94,8 +94,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -149,8 +149,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add aarch64-apple-darwin - name: Install build deps @@ -205,8 +205,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -260,8 +260,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add x86_64-apple-darwin - name: Install build deps @@ -332,8 +332,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add wasm32-unknown-unknown - name: Install wasm-pack @@ -380,8 +380,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add aarch64-apple-ios - name: Install build deps @@ -447,8 +447,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add aarch64-linux-android - name: Install build deps @@ -519,8 +519,8 @@ jobs: - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add armv7-linux-androideabi - name: Install build deps diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cc9409d329..f12e8c0d42 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,8 +25,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -53,8 +53,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -81,8 +81,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -109,8 +109,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -138,8 +138,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -170,8 +170,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -206,8 +206,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 - name: Install build deps uses: ./.github/actions/deps-install @@ -235,8 +235,8 @@ jobs: - uses: actions/checkout@v3 - name: Install toolchain run: | - rustup toolchain install nightly-2025-01-04 --no-self-update --profile=minimal - rustup default nightly-2025-01-04 + rustup toolchain install nightly-2025-01-03 --no-self-update --profile=minimal + rustup default nightly-2025-01-03 rustup target add wasm32-unknown-unknown - name: Install build deps diff --git a/Cargo.lock b/Cargo.lock index 9cbc4c1a9c..94210577de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2395,9 +2395,9 @@ dependencies = [ [[package]] name = "gstuff" -version = "0.7.4" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e38a0ee5e8e3debd1336135939e6615d283b8375fab2f99d8b89dba718502212" +checksum = "2c495d42791143a3be6d33e5f442c35118ffc0819bd867bfe355b4cb6bfc20ee" dependencies = [ "lazy_static", "libc", diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 68b33e55f5..7334df45c5 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "nightly-2025-01-04" +channel = "nightly-2025-01-03" components = ["rustfmt", "clippy", "rust-analyzer"] From ca3f9e03f11075592194a4dfc5a771c58a778aeb Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 13 May 2025 23:03:02 +0100 Subject: [PATCH 24/35] update mm_error doctest --- mm2src/mm2_err_handle/src/mm_error.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm2src/mm2_err_handle/src/mm_error.rs b/mm2src/mm2_err_handle/src/mm_error.rs index ab70c44deb..2264ca9ff8 100644 --- a/mm2src/mm2_err_handle/src/mm_error.rs +++ b/mm2src/mm2_err_handle/src/mm_error.rs @@ -17,7 +17,7 @@ //! //! fn is_static_library(path: &str) -> Result<(), MmError> { //! let filename = filename(path)?; -//! let extension = get_file_extension(filename)?; +//! let extension = get_file_extension(filename).map_mm_err()?; //! if extension == "a" || extension == "lib" { //! Ok(()) //! } else { @@ -42,7 +42,7 @@ //! fn get_file_extension(filename: &str) -> Result<&str, MmError> { MmError::err(E1::new()) } //! //! fn is_static_library(path: &str) -> Result<(), MmError> { -//! let filename = filename(path).map_to_mm(|e1| E2::from_e1(e1))?; +//! let filename = filename(path).map_to_mm(|e1| E2::from_e1(e1)).map_mm_err()??; //! let extension = get_file_extension(filename).mm_err(|e1| E2::from_e1(e1))?; //! if extension == "a" || extension == "lib" { //! Ok(()) From f1a3a6c632960d71565da2c2aaa4acb5200daec7 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Thu, 22 May 2025 12:54:12 +0100 Subject: [PATCH 25/35] fix fmt --- mm2src/mm2_io/src/fs.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/mm2src/mm2_io/src/fs.rs b/mm2src/mm2_io/src/fs.rs index d986e8c589..ad69a69625 100644 --- a/mm2src/mm2_io/src/fs.rs +++ b/mm2src/mm2_io/src/fs.rs @@ -275,11 +275,10 @@ where pub fn create_parents(path: &impl AsRef) -> IoResult<()> { let parent_dir = path.as_ref().parent(); let Some(parent_dir) = parent_dir else { - return MmError::err( - io::Error::new( - io::ErrorKind::InvalidInput, - format!("{} has no parent directory", path.as_ref().display()), - )) + return MmError::err(io::Error::new( + io::ErrorKind::InvalidInput, + format!("{} has no parent directory", path.as_ref().display()), + )); }; match fs::metadata(parent_dir) { // Path exists, make sure it's a directory (and not a file for example). @@ -303,11 +302,10 @@ pub fn create_parents(path: &impl AsRef) -> IoResult<()> { pub async fn create_parents_async(path: &Path) -> IoResult<()> { let parent_dir = path.parent(); let Some(parent_dir) = parent_dir else { - return MmError::err( - io::Error::new( - io::ErrorKind::InvalidInput, - format!("{} has no parent directory", path.display()), - )) + return MmError::err(io::Error::new( + io::ErrorKind::InvalidInput, + format!("{} has no parent directory", path.display()), + )); }; match async_fs::metadata(parent_dir).await { // Path exists, make sure it's a directory (and not a file, for instance). From 28c92d00a7c91ededea7605c9e01e6198965ea35 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Thu, 29 May 2025 16:19:03 +0100 Subject: [PATCH 26/35] post merge fix --- mm2src/mm2_core/src/mm_ctx.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm2src/mm2_core/src/mm_ctx.rs b/mm2src/mm2_core/src/mm_ctx.rs index e96290c738..48ea5ac14b 100644 --- a/mm2src/mm2_core/src/mm_ctx.rs +++ b/mm2src/mm2_core/src/mm_ctx.rs @@ -443,7 +443,7 @@ impl MmCtx { } let default = !self.conf["disable_p2p"].as_bool().unwrap_or(false) - && self.conf["seednodes"].as_array().map_or(true, |t| t.is_empty()); + && self.conf["seednodes"].as_array().is_none_or(|t| t.is_empty()); default } From ab7e0446971b1ea42e142e7f838f83b89e34c94d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Wed, 25 Jun 2025 08:30:04 +0300 Subject: [PATCH 27/35] use `#[expect(dead_code)]` instead of `#[allow(dead_code)] ` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mm2src/coins/eth/web3_transport/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm2src/coins/eth/web3_transport/mod.rs b/mm2src/coins/eth/web3_transport/mod.rs index 9415271885..2d685b1bb5 100644 --- a/mm2src/coins/eth/web3_transport/mod.rs +++ b/mm2src/coins/eth/web3_transport/mod.rs @@ -109,13 +109,14 @@ impl From for Web3Transport { fn from(metamask: metamask_transport::MetamaskTransport) -> Self { Web3Transport::Metamask(metamask) } } -#[allow(dead_code)] #[derive(Debug, Deserialize)] pub struct FeeHistoryResult { + #[expect(dead_code)] #[serde(rename = "oldestBlock")] pub oldest_block: U256, #[serde(rename = "baseFeePerGas")] pub base_fee_per_gas: Vec, + #[expect(dead_code)] #[serde(rename = "gasUsedRatio")] pub gas_used_ratio: Vec, #[serde(rename = "reward")] From a0861ab17dbd709c95b8d743ba9bd0f4d8067f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Wed, 25 Jun 2025 08:34:41 +0300 Subject: [PATCH 28/35] update `clippy::needless_lifetimes` note MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mm2src/coins/lp_coins.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 90a0dbbfed..ed572ac607 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -27,7 +27,7 @@ clippy::forget_non_drop, clippy::doc_lazy_continuation, clippy::result_large_err, - clippy::needless_lifetimes // review lifetime usages + clippy::needless_lifetimes // mocktopus requires explicit lifetimes )] #![allow(uncommon_codepoints)] #![feature(hash_raw_entry)] From 78c171fec9a07a86f6f993ae2aeff62ef6536f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Wed, 25 Jun 2025 09:35:27 +0300 Subject: [PATCH 29/35] improve dead_code handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mm2src/coins/nft/storage/mod.rs | 9 ++++++--- mm2src/coins/qrc20/swap.rs | 2 +- mm2src/coins/tendermint/tendermint_tx_history_v2.rs | 3 +-- mm2src/coins/utxo/utxo_tx_history_v2.rs | 2 +- mm2src/mm2_db/src/indexed_db/drivers/builder.rs | 2 +- mm2src/mm2_gui_storage/src/account/storage/mod.rs | 3 ++- mm2src/mm2_main/src/lp_ordermatch.rs | 2 +- mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs | 4 ++-- mm2src/mm2_main/src/lp_swap/swap_watcher.rs | 7 +++++-- mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs | 2 +- 10 files changed, 21 insertions(+), 15 deletions(-) diff --git a/mm2src/coins/nft/storage/mod.rs b/mm2src/coins/nft/storage/mod.rs index 08625bb15c..b888cbdda9 100644 --- a/mm2src/coins/nft/storage/mod.rs +++ b/mm2src/coins/nft/storage/mod.rs @@ -28,7 +28,6 @@ pub enum RemoveNftResult { pub trait NftStorageError: std::fmt::Debug + NotMmError + Send {} /// Provides asynchronous operations for handling and querying NFT listings. -#[allow(dead_code)] #[async_trait] pub trait NftListStorageOps { type Error: NftStorageError; @@ -68,6 +67,7 @@ pub trait NftListStorageOps { scanned_block: u64, ) -> MmResult; + #[allow(dead_code)] async fn get_nft_amount( &self, chain: &Chain, @@ -89,6 +89,7 @@ pub trait NftListStorageOps { async fn update_nft_amount_and_block_number(&self, chain: &Chain, nft: Nft) -> MmResult<(), Self::Error>; + #[allow(dead_code)] /// `get_nfts_by_token_address` function returns list of NFTs which have specified token address. async fn get_nfts_by_token_address(&self, chain: Chain, token_address: String) -> MmResult, Self::Error>; @@ -116,7 +117,6 @@ pub trait NftListStorageOps { } /// Provides asynchronous operations related to the history of NFT transfers. -#[allow(dead_code)] #[async_trait] pub trait NftTransferHistoryStorageOps { type Error: NftStorageError; @@ -151,6 +151,7 @@ pub trait NftTransferHistoryStorageOps { from_block: u64, ) -> MmResult, Self::Error>; + #[allow(dead_code)] async fn get_transfers_by_token_addr_id( &self, chain: Chain, @@ -158,6 +159,7 @@ pub trait NftTransferHistoryStorageOps { token_id: BigUint, ) -> MmResult, Self::Error>; + #[allow(dead_code)] async fn get_transfer_by_tx_hash_log_index_token_id( &self, chain: &Chain, @@ -178,6 +180,7 @@ pub trait NftTransferHistoryStorageOps { async fn get_transfers_with_empty_meta(&self, chain: Chain) -> MmResult, Self::Error>; /// `get_transfers_by_token_address` function returns list of NFT transfers which have specified token address. + #[allow(dead_code)] async fn get_transfers_by_token_address( &self, chain: Chain, @@ -247,7 +250,7 @@ pub(crate) struct TransferDetailsJson { pub(crate) fee_details: Option, } -#[allow(dead_code)] +#[cfg_attr(target_arch = "wasm32", expect(dead_code))] #[async_trait] pub trait NftMigrationOps { type Error: NftStorageError; diff --git a/mm2src/coins/qrc20/swap.rs b/mm2src/coins/qrc20/swap.rs index 7a1795c5b5..58efe5b16b 100644 --- a/mm2src/coins/qrc20/swap.rs +++ b/mm2src/coins/qrc20/swap.rs @@ -22,7 +22,7 @@ pub struct Erc20PaymentDetails { } /// `receiverSpend` call details consist of values obtained from [`TransactionOutput::script_pubkey`]. -#[allow(dead_code)] +#[expect(dead_code)] #[derive(Debug)] pub struct ReceiverSpendDetails { pub swap_id: Vec, diff --git a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs index bd0a86d7b4..1ab304a1a6 100644 --- a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs +++ b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs @@ -185,10 +185,9 @@ impl TendermintInit { } } -#[allow(dead_code)] #[derive(Debug)] enum StopReason { - #[allow(dead_code)] + #[expect(dead_code)] StorageError(String), RpcClient(String), } diff --git a/mm2src/coins/utxo/utxo_tx_history_v2.rs b/mm2src/coins/utxo/utxo_tx_history_v2.rs index 2db9d61713..56b024efce 100644 --- a/mm2src/coins/utxo/utxo_tx_history_v2.rs +++ b/mm2src/coins/utxo/utxo_tx_history_v2.rs @@ -642,7 +642,7 @@ where } } -#[allow(dead_code)] +#[expect(dead_code)] #[derive(Debug)] enum StopReason { HistoryTooLarge, diff --git a/mm2src/mm2_db/src/indexed_db/drivers/builder.rs b/mm2src/mm2_db/src/indexed_db/drivers/builder.rs index ef3f117334..80d237f96a 100644 --- a/mm2src/mm2_db/src/indexed_db/drivers/builder.rs +++ b/mm2src/mm2_db/src/indexed_db/drivers/builder.rs @@ -222,6 +222,6 @@ impl IdbDatabaseBuilder { enum DbOpenEvent { Failed(JsValue), UpgradeNeeded(JsValue), - #[allow(dead_code)] + #[expect(dead_code)] Success(JsValue), } diff --git a/mm2src/mm2_gui_storage/src/account/storage/mod.rs b/mm2src/mm2_gui_storage/src/account/storage/mod.rs index 718ccc50f4..e7134121ca 100644 --- a/mm2src/mm2_gui_storage/src/account/storage/mod.rs +++ b/mm2src/mm2_gui_storage/src/account/storage/mod.rs @@ -140,7 +140,6 @@ impl<'a> AccountStorageBuilder<'a> { } /// An account storage interface. -#[allow(dead_code)] #[async_trait] pub(crate) trait AccountStorage: Send + Sync { /// Initialize the storage. @@ -150,6 +149,7 @@ pub(crate) trait AccountStorage: Send + Sync { async fn load_account_coins(&self, account_id: AccountId) -> AccountStorageResult>; /// Loads accounts from the storage. + #[allow(dead_code)] async fn load_accounts(&self) -> AccountStorageResult>; /// Loads accounts from the storage and marks **only** one account as enabled. @@ -158,6 +158,7 @@ pub(crate) trait AccountStorage: Send + Sync { ) -> AccountStorageResult>; /// Loads an enabled account ID, or returns an error if there is no enabled account yet. + #[allow(dead_code)] async fn load_enabled_account_id(&self) -> AccountStorageResult; /// Loads an enabled account with activated coins, or returns an error if there is no enabled account yet. diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index f2b2ec3759..15233e6392 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -828,7 +828,7 @@ impl DeltaOrFullTrie { } } -#[allow(dead_code)] +#[expect(dead_code)] #[derive(Debug)] enum TrieDiffHistoryError { TrieDbError(Box>), diff --git a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs index 5cdfd81ce2..f2ab413e91 100644 --- a/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs +++ b/mm2src/mm2_main/src/lp_ordermatch/my_orders_storage.rs @@ -147,7 +147,7 @@ pub trait MyActiveOrders { async fn load_active_taker_orders(&self) -> MyOrdersResult>; - #[allow(dead_code)] + #[expect(dead_code)] async fn save_new_active_order(&self, order: &Order) -> MyOrdersResult<()> { match order { Order::Maker(maker) => self.save_new_active_maker_order(maker).await, @@ -185,7 +185,7 @@ pub trait MyOrdersFilteringHistory { async fn select_order_status(&self, uuid: Uuid) -> MyOrdersResult; - #[allow(dead_code)] + #[expect(dead_code)] async fn save_order_in_filtering_history(&self, order: &Order) -> MyOrdersResult<()> { match order { Order::Maker(maker) => self.save_maker_order_in_filtering_history(maker).await, diff --git a/mm2src/mm2_main/src/lp_swap/swap_watcher.rs b/mm2src/mm2_main/src/lp_swap/swap_watcher.rs index 95779332f9..23339f5bd4 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_watcher.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_watcher.rs @@ -118,10 +118,13 @@ pub struct TakerSwapWatcherData { #[allow(dead_code)] struct ValidatePublicKeys {} + #[allow(dead_code)] struct ValidateTakerFee {} + #[allow(dead_code)] struct ValidateTakerPayment {} + struct WaitForTakerPaymentSpend { taker_payment_hex: Vec, } @@ -140,7 +143,7 @@ struct Stopped { stop_reason: StopReason, } -#[allow(dead_code)] +#[expect(dead_code)] #[derive(Debug)] enum StopReason { Finished(WatcherSuccess), @@ -155,7 +158,7 @@ enum WatcherSuccess { TakerPaymentRefundedByTaker, } -#[allow(dead_code)] +#[expect(dead_code)] #[derive(Debug)] enum WatcherError { InvalidTakerFee(String), diff --git a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs index 82730c234a..f3769d43f7 100644 --- a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs +++ b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs @@ -6168,7 +6168,7 @@ mod trezor_tests { pub enum InitTrezorStatus { Ok(InitHwResponse), Error(Json), - #[allow(dead_code)] + #[expect(dead_code)] InProgress(Json), UserActionRequired(Json), } From 402c8667cfb8baba5f1f4c561d25baa327973920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Wed, 25 Jun 2025 09:36:57 +0300 Subject: [PATCH 30/35] doc fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mm2src/derives/enum_derives/src/lib.rs | 2 ++ mm2src/mm2_bitcoin/script/src/sign.rs | 1 - .../spv_validation/src/helpers_validation.rs | 4 ++-- mm2src/mm2_bitcoin/spv_validation/src/lib.rs | 1 - .../mm2_db/src/indexed_db/indexed_cursor.rs | 3 +-- mm2src/mm2_db/src/lib.rs | 1 - mm2src/mm2_main/src/lp_swap.rs | 21 +++++++++---------- mm2src/mm2_main/src/mm2.rs | 3 +-- mm2src/mm2_metamask/src/lib.rs | 1 - mm2src/mm2_metamask/src/metamask.rs | 3 ++- mm2src/trezor/src/lib.rs | 1 - mm2src/trezor/src/proto/messages_bitcoin.rs | 6 +++--- 12 files changed, 21 insertions(+), 26 deletions(-) diff --git a/mm2src/derives/enum_derives/src/lib.rs b/mm2src/derives/enum_derives/src/lib.rs index c135ea4f81..0f51689806 100644 --- a/mm2src/derives/enum_derives/src/lib.rs +++ b/mm2src/derives/enum_derives/src/lib.rs @@ -105,6 +105,7 @@ pub fn enum_from_trait(input: TokenStream) -> TokenStream { /// Bar(String), /// } /// +/// #[test] /// fn test_from_stringify() { /// let num = 6500u64; /// let expected: FooBar = num.into(); @@ -116,6 +117,7 @@ pub fn enum_from_trait(input: TokenStream) -> TokenStream { /// assert_eq!(actual, expected); /// } /// ``` +#[allow(clippy::test_attr_in_doctest)] #[proc_macro_derive(EnumFromStringify, attributes(from_stringify))] pub fn derive(input: TokenStream) -> TokenStream { let ast = parse_macro_input!(input as DeriveInput); diff --git a/mm2src/mm2_bitcoin/script/src/sign.rs b/mm2src/mm2_bitcoin/script/src/sign.rs index 993e40c00f..a0115172d1 100644 --- a/mm2src/mm2_bitcoin/script/src/sign.rs +++ b/mm2src/mm2_bitcoin/script/src/sign.rs @@ -42,7 +42,6 @@ impl From for u32 { fn from(s: SighashBase) -> Self { s as u32 } } -#[allow(clippy::doc_markdown)] /// Signature hash type. [Documentation](https://en.bitcoin.it/wiki/OP_CHECKSIG#Procedure_for_Hashtype_SIGHASH_SINGLE) #[derive(Debug, PartialEq, Clone, Copy)] pub struct Sighash { diff --git a/mm2src/mm2_bitcoin/spv_validation/src/helpers_validation.rs b/mm2src/mm2_bitcoin/spv_validation/src/helpers_validation.rs index fcdd5ce5ab..4ab1a7e9ca 100644 --- a/mm2src/mm2_bitcoin/spv_validation/src/helpers_validation.rs +++ b/mm2src/mm2_bitcoin/spv_validation/src/helpers_validation.rs @@ -324,9 +324,9 @@ fn validate_header_prev_hash(actual: &H256, to_compare_with: &H256) -> bool { ac /// /// * `headers` - Raw byte array of header chain /// * `difficulty_check`: Rather the difficulty need to check or not, usefull for chain like Qtum (Pos) -/// or KMD/SmartChain (Difficulty change NN) +/// or KMD/SmartChain (Difficulty change NN) /// * `constant_difficulty`: If we do not expect difficulty change (BTC difficulty change every 2016 blocks) -/// use this variable to false when you do not have a chance to use a checkpoint +/// use this variable to false when you do not have a chance to use a checkpoint /// /// # Errors /// diff --git a/mm2src/mm2_bitcoin/spv_validation/src/lib.rs b/mm2src/mm2_bitcoin/spv_validation/src/lib.rs index 6e3656465c..319cde9e4c 100644 --- a/mm2src/mm2_bitcoin/spv_validation/src/lib.rs +++ b/mm2src/mm2_bitcoin/spv_validation/src/lib.rs @@ -1,4 +1,3 @@ -#![allow(clippy::doc_lazy_continuation)] extern crate chain; extern crate derive_more; extern crate keys; diff --git a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs index 212fc72499..bd10cb1479 100644 --- a/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs +++ b/mm2src/mm2_db/src/indexed_db/indexed_cursor.rs @@ -14,8 +14,7 @@ //! //! If you want to find all `RICK/MORTY` swaps where //! 1) `10 <= base_coin_value <= 13` -//! 2) `started_at <= 1000000030`, -//! you can use [`WithBound::bound`] along with [`WithOnly::only`]: +//! 2) `started_at <= 1000000030`, you can use [`WithBound::bound`] along with [`WithOnly::only`]: //! ```rust //! let table = open_table_somehow(); //! let all_rick_morty_swaps = table diff --git a/mm2src/mm2_db/src/lib.rs b/mm2src/mm2_db/src/lib.rs index 06f2b057ab..3a07456131 100644 --- a/mm2src/mm2_db/src/lib.rs +++ b/mm2src/mm2_db/src/lib.rs @@ -1,5 +1,4 @@ #![feature(negative_impls)] -#![allow(clippy::doc_lazy_continuation)] #[cfg(target_arch = "wasm32")] #[path = "indexed_db/indexed_db.rs"] diff --git a/mm2src/mm2_main/src/lp_swap.rs b/mm2src/mm2_main/src/lp_swap.rs index 28dacbffe2..29b8b6fdf2 100644 --- a/mm2src/mm2_main/src/lp_swap.rs +++ b/mm2src/mm2_main/src/lp_swap.rs @@ -22,19 +22,18 @@ //! 1. AFee: OP_DUP OP_HASH160 FEE_RMD160 OP_EQUALVERIFY OP_CHECKSIG //! //! 2. BPayment: -//! OP_IF -//! OP_CLTV OP_DROP OP_CHECKSIG -//! OP_ELSE -//! OP_SIZE 32 OP_EQUALVERIFY OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG -//! OP_ENDIF +//! OP_IF +//! OP_CLTV OP_DROP OP_CHECKSIG +//! OP_ELSE +//! OP_SIZE 32 OP_EQUALVERIFY OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG +//! OP_ENDIF //! //! 3. APayment: -//! OP_IF -//! OP_CLTV OP_DROP OP_CHECKSIG -//! OP_ELSE -//! OP_SIZE 32 OP_EQUALVERIFY OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG -//! OP_ENDIF -//! +//! OP_IF +//! OP_CLTV OP_DROP OP_CHECKSIG +//! OP_ELSE +//! OP_SIZE 32 OP_EQUALVERIFY OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG +//! OP_ENDIF /****************************************************************************** * Copyright © 2023 Pampex LTD and TillyHK LTD * diff --git a/mm2src/mm2_main/src/mm2.rs b/mm2src/mm2_main/src/mm2.rs index 3b72d1b5f5..37ad202ed8 100644 --- a/mm2src/mm2_main/src/mm2.rs +++ b/mm2src/mm2_main/src/mm2.rs @@ -28,8 +28,7 @@ forgetting_copy_types, clippy::swap_ptr_to_ref, clippy::forget_non_drop, - clippy::let_unit_value, - clippy::doc_lazy_continuation + clippy::let_unit_value )] #![cfg_attr(target_arch = "wasm32", allow(dead_code))] #![cfg_attr(target_arch = "wasm32", allow(unused_imports))] diff --git a/mm2src/mm2_metamask/src/lib.rs b/mm2src/mm2_metamask/src/lib.rs index 3ad3064f2a..db083fd60c 100644 --- a/mm2src/mm2_metamask/src/lib.rs +++ b/mm2src/mm2_metamask/src/lib.rs @@ -1,4 +1,3 @@ -#![allow(clippy::doc_lazy_continuation)] #[cfg(target_arch = "wasm32")] mod eip_1193_provider; #[cfg(target_arch = "wasm32")] mod metamask; #[cfg(target_arch = "wasm32")] mod metamask_error; diff --git a/mm2src/mm2_metamask/src/metamask.rs b/mm2src/mm2_metamask/src/metamask.rs index 9fd135eee5..b6036d93c2 100644 --- a/mm2src/mm2_metamask/src/metamask.rs +++ b/mm2src/mm2_metamask/src/metamask.rs @@ -56,8 +56,9 @@ impl<'a> MetamaskSession<'a> { CallFuture::new(self.transport.execute("wallet_switchEthereumChain", vec![req])).await } - /// * user_address - Must match user's active address. /// Returns a hash of the `Eip712` request and the signature. + /// + /// Note: `user_address` must match user's active address. pub async fn sign_typed_data_v4( &self, user_address: String, diff --git a/mm2src/trezor/src/lib.rs b/mm2src/trezor/src/lib.rs index adc054a296..37c4bd9b4c 100644 --- a/mm2src/trezor/src/lib.rs +++ b/mm2src/trezor/src/lib.rs @@ -1,4 +1,3 @@ -#![allow(clippy::doc_lazy_continuation)] #[macro_use] extern crate serde_derive; pub mod client; diff --git a/mm2src/trezor/src/proto/messages_bitcoin.rs b/mm2src/trezor/src/proto/messages_bitcoin.rs index 8826c9a997..ad0be5f85b 100644 --- a/mm2src/trezor/src/proto/messages_bitcoin.rs +++ b/mm2src/trezor/src/proto/messages_bitcoin.rs @@ -531,7 +531,7 @@ pub struct TxInput { pub decred_staking_spend: ::core::option::Option, } ///* Data type for transaction output to be signed. -/// @embed +/// @embed #[derive(Clone, PartialEq, ::prost::Message)] pub struct TxOutput { /// destination address in Base58 encoding; script_type must be PAYTOADDRESS @@ -560,7 +560,7 @@ pub struct TxOutput { pub orig_index: ::core::option::Option, } ///* Data type for metadata about previous transaction which contains the UTXO being spent. -/// @embed +/// @embed #[derive(Clone, PartialEq, ::prost::Message)] pub struct PrevTx { #[prost(uint32, required, tag = "1")] @@ -610,7 +610,7 @@ pub struct PrevInput { pub decred_tree: ::core::option::Option, } ///* Data type for outputs of previous transactions. -/// @embed +/// @embed #[derive(Clone, PartialEq, ::prost::Message)] pub struct PrevOutput { /// amount sent to this output From c4b742890f8571798d18d1d9249293307943175a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Wed, 25 Jun 2025 09:37:32 +0300 Subject: [PATCH 31/35] reduce `allow` scopes and drop unnecessary ones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs | 1 + mm2src/common/common.rs | 2 +- mm2src/mm2_bitcoin/serialization/src/reader.rs | 1 - mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs | 7 ++----- mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs | 4 ++-- mm2src/trading_api/src/one_inch_api/client.rs | 2 +- 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs index 4199e3e39e..5a6c3cd461 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs @@ -556,6 +556,7 @@ async fn resolve_possible_chain_reorg( ))) }, }; + #[allow(clippy::unit_arg)] // It's more readable this way. // If the headers are successfully retrieved and validated, remove the headers from storage and continue the outer loop. match validate_headers(ticker, retrieve_from - 1, &headers_to_validate, storage, spv_conf).await { Ok(_) => { diff --git a/mm2src/common/common.rs b/mm2src/common/common.rs index 75196b29d3..91b046c56b 100644 --- a/mm2src/common/common.rs +++ b/mm2src/common/common.rs @@ -770,7 +770,7 @@ static mut PROCESS_LOG_TAIL: [u8; 0x10000] = [0; 0x10000]; static TAIL_CUR: AtomicUsize = AtomicUsize::new(0); /// Keep a tail of the log in RAM for the integration tests. -#[allow(static_mut_refs)] // refactor PROCESS_LOG_TAIL to use lazystatic +#[allow(static_mut_refs)] // TODO: Refactor PROCESS_LOG_TAIL to use lazystatic #[cfg(target_arch = "wasm32")] pub fn append_log_tail(line: &str) { unsafe { diff --git a/mm2src/mm2_bitcoin/serialization/src/reader.rs b/mm2src/mm2_bitcoin/serialization/src/reader.rs index 9f4e3778c3..5274d94c75 100644 --- a/mm2src/mm2_bitcoin/serialization/src/reader.rs +++ b/mm2src/mm2_bitcoin/serialization/src/reader.rs @@ -212,7 +212,6 @@ where Ok(result) } - #[allow(clippy::wrong_self_convention)] pub fn is_finished(&mut self) -> bool { if self.peeked.is_some() { return false; diff --git a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs index f7c73d7c7a..d193a42305 100644 --- a/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs +++ b/mm2src/mm2_main/tests/docker_tests/docker_tests_common.rs @@ -2,12 +2,9 @@ use coins::z_coin::ZCoin; pub use common::{block_on, block_on_f01, now_ms, now_sec, wait_until_ms, wait_until_sec}; pub use mm2_number::MmNumber; use mm2_rpc::data::legacy::BalanceResponse; -#[allow(unused_imports)] pub use mm2_test_helpers::for_tests::{check_my_swap_status, check_recent_swaps, enable_eth_coin, enable_native, - enable_native_bch, erc20_dev_conf, eth_dev_conf, eth_sepolia_conf, - jst_sepolia_conf, mm_dump, wait_check_stats_swap_status, MarketMakerIt, - MAKER_ERROR_EVENTS, MAKER_SUCCESS_EVENTS, TAKER_ERROR_EVENTS, - TAKER_SUCCESS_EVENTS}; + enable_native_bch, erc20_dev_conf, eth_dev_conf, mm_dump, + wait_check_stats_swap_status, MarketMakerIt}; use super::eth_docker_tests::{erc20_contract_checksum, fill_eth, fill_eth_erc20_with_private_key, swap_contract}; use super::z_coin_docker_tests::z_coin_from_spending_key; diff --git a/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs b/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs index 5ffbaa50ec..5b076942bf 100644 --- a/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs +++ b/mm2src/mm2_main/tests/docker_tests/qrc20_tests.rs @@ -1,4 +1,3 @@ -#![allow(static_mut_refs)] use crate::docker_tests::docker_tests_common::*; use crate::integration_tests_common::enable_native; use bitcrypto::dhash160; @@ -809,7 +808,8 @@ fn test_wait_for_tx_spend() { log!("error: {:?}", err); assert!(err.contains("Waited too long")); - // also spends the maker payment and try to check if the wait_for_htlc_tx_spend() returns the correct tx + /// Also spends the maker payment and try to check if the wait_for_htlc_tx_spend() returns the correct tx + #[allow(static_mut_refs)] static mut SPEND_TX: Option = None; let maker_pub_c = maker_pub.to_vec(); diff --git a/mm2src/trading_api/src/one_inch_api/client.rs b/mm2src/trading_api/src/one_inch_api/client.rs index 66991458c2..bcfc0fc324 100644 --- a/mm2src/trading_api/src/one_inch_api/client.rs +++ b/mm2src/trading_api/src/one_inch_api/client.rs @@ -162,7 +162,7 @@ impl ApiClient { }) } - #[allow(clippy::needless_lifetimes)] // different warning when compiling for diff targets(code structure problem) + #[cfg_attr(target_arch = "wasm32", allow(clippy::needless_lifetimes))] pub async fn call_swap_api<'a, T>( &self, chain_id: u64, From fb9d46e2e83e0088fe33f5c2fe63340fb2cdfaa1 Mon Sep 17 00:00:00 2001 From: onur-ozkan Date: Thu, 26 Jun 2025 07:37:23 +0000 Subject: [PATCH 32/35] post-conflict fixes Signed-off-by: onur-ozkan --- Cargo.lock | 13 +++++++------ mm2src/coins/eth/eth_tests.rs | 1 - mm2src/coins/eth/wallet_connect.rs | 4 +--- mm2src/coins/tendermint/tendermint_coin.rs | 2 +- mm2src/coins/utxo/utxo_tests.rs | 4 +--- mm2src/coins/z_coin.rs | 7 +++---- mm2src/coins/z_coin/storage/z_locked_notes/mod.rs | 1 + .../src/platform_coin_with_tokens.rs | 3 ++- mm2src/kdf_walletconnect/src/lib.rs | 6 +++--- mm2src/kdf_walletconnect/src/session/rpc/event.rs | 2 +- mm2src/kdf_walletconnect/src/session/rpc/update.rs | 2 +- mm2src/kdf_walletconnect/src/storage/mod.rs | 2 ++ mm2src/mm2_event_stream/src/streamer_ids.rs | 2 +- mm2src/mm2_main/Cargo.toml | 3 +++ mm2src/mm2_main/src/lp_ordermatch.rs | 8 ++++++-- .../src/rpc/dispatcher/dispatcher_legacy.rs | 3 ++- mm2src/mm2_main/src/rpc/wc_commands/sessions.rs | 6 +----- .../tests/docker_tests/z_coin_docker_tests.rs | 2 +- mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs | 6 +++--- 19 files changed, 40 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 651c3ec9af..b7ce576b68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1604,7 +1604,8 @@ dependencies = [ "convert_case", "proc-macro2", "quote 1.0.37", - "syn 1.0.95", + "rustc_version 0.4.0", + "syn 2.0.77", ] [[package]] @@ -6258,9 +6259,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "indexmap 2.2.3", "itoa", @@ -6484,7 +6485,7 @@ dependencies = [ "num-bigint", "num-traits", "thiserror", - "time 0.3.20", + "time 0.3.41", ] [[package]] @@ -8627,8 +8628,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.101", + "quote 1.0.37", + "syn 2.0.77", ] [[package]] diff --git a/mm2src/coins/eth/eth_tests.rs b/mm2src/coins/eth/eth_tests.rs index a939edc8e1..b844b85863 100644 --- a/mm2src/coins/eth/eth_tests.rs +++ b/mm2src/coins/eth/eth_tests.rs @@ -9,7 +9,6 @@ cfg_native!( use common::{now_sec, block_on_f01}; use ethkey::{Generator, Random}; - use futures_util::future; use mm2_test_helpers::for_tests::{ETH_MAINNET_CHAIN_ID, ETH_MAINNET_NODES, ETH_SEPOLIA_CHAIN_ID, ETH_SEPOLIA_NODES, ETH_SEPOLIA_TOKEN_CONTRACT}; use mocktopus::mocking::*; diff --git a/mm2src/coins/eth/wallet_connect.rs b/mm2src/coins/eth/wallet_connect.rs index 1ab2590644..30c5747269 100644 --- a/mm2src/coins/eth/wallet_connect.rs +++ b/mm2src/coins/eth/wallet_connect.rs @@ -252,9 +252,7 @@ fn extract_pubkey_from_signature( pub(crate) fn recover(signature: &Signature, message: &Message) -> Result { let recovery_id = { - let recovery_id = signature[64] - .checked_sub(27) - .ok_or_else(|| ethkey::Error::InvalidSignature)?; + let recovery_id = signature[64].checked_sub(27).ok_or(ethkey::Error::InvalidSignature)?; RecoveryId::from_i32(recovery_id as i32)? }; let sig = RecoverableSignature::from_compact(&signature[0..64], recovery_id)?; diff --git a/mm2src/coins/tendermint/tendermint_coin.rs b/mm2src/coins/tendermint/tendermint_coin.rs index b7eb3a18a1..c249b02c75 100644 --- a/mm2src/coins/tendermint/tendermint_coin.rs +++ b/mm2src/coins/tendermint/tendermint_coin.rs @@ -842,7 +842,7 @@ impl TendermintCoin { } })?; - let channel = self.query_ibc_channel(channel_id, "transfer").await.map_mm_err()?; + let channel = self.query_ibc_channel(channel_id, "transfer").await?; // TODO: Extend the validation logic to also include: // diff --git a/mm2src/coins/utxo/utxo_tests.rs b/mm2src/coins/utxo/utxo_tests.rs index da215430e8..1c850f25de 100644 --- a/mm2src/coins/utxo/utxo_tests.rs +++ b/mm2src/coins/utxo/utxo_tests.rs @@ -13,7 +13,7 @@ use crate::rpc_command::init_scan_for_new_addresses::{InitScanAddressesRpcOps, S ScanAddressesResponse}; use crate::utxo::qtum::{qtum_coin_with_priv_key, QtumCoin, QtumDelegationOps, QtumDelegationRequest}; #[cfg(not(target_arch = "wasm32"))] -use crate::utxo::rpc_clients::{BlockHashOrHeight, ElectrumClientSettings, NativeUnspent}; +use crate::utxo::rpc_clients::{BlockHashOrHeight, NativeUnspent}; use crate::utxo::rpc_clients::{ElectrumBalance, ElectrumBlockHeader, ElectrumClient, ElectrumClientImpl, GetAddressInfoRes, ListSinceBlockRes, NativeClient, NativeClientImpl, NetworkInfo, UtxoRpcClientOps, ValidateAddressRes, VerboseBlock}; @@ -44,8 +44,6 @@ use futures::future::{join_all, Either, FutureExt, TryFutureExt}; use hex::FromHex; use keys::prefixes::*; use mm2_core::mm_ctx::MmCtxBuilder; -#[cfg(not(target_arch = "wasm32"))] -use mm2_event_stream::StreamingManager; use mm2_number::bigdecimal::{BigDecimal, Signed}; use mm2_number::MmNumber; use mm2_test_helpers::electrums::doc_electrums; diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 2c95089939..ec2c0c6eb2 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -65,7 +65,7 @@ use script::{Builder as ScriptBuilder, Opcode, Script, TransactionInputSigner}; use serde_json::Value as Json; use serialization::CoinVariant; use std::collections::{HashMap, HashSet}; -use std::convert::{TryFrom, TryInto}; +use std::convert::TryInto; use std::iter; use std::num::NonZeroU32; use std::num::TryFromIntError; @@ -1257,8 +1257,7 @@ impl MarketCoinOps for ZCoin { .filter(|n| !spent_rseeds.contains(&rseed_to_string(&n.rseed))) .fold(Amount::zero(), |acc, n| acc + n.note_value); - let spendable_sat = - u64::try_from(spendable_amount).map_to_mm(|err| BalanceError::Internal(err.to_string()))?; + let spendable_sat = u64::from(spendable_amount); let unspendable = big_decimal_from_sat_unsigned(unspendable_change_sat, coin.decimals()); let spendable = big_decimal_from_sat_unsigned(spendable_sat, coin.decimals()); Ok(CoinBalance { spendable, unspendable }) @@ -2109,7 +2108,7 @@ async fn wait_for_spendable_balance_impl( let unlocked_notes_len = unlocked_notes.len(); let sum_available = unlocked_notes.iter().map(|n| n.note_value).sum::(); - let sum_available = u64::try_from(sum_available).map_to_mm(|err| GenTxError::Internal(err.to_string()))?; + let sum_available = u64::from(sum_available); let sum_available = big_decimal_from_sat_unsigned(sum_available, selfi.decimals()); // Reteurn InsufficientBalance error when all notes are unlocked but amount is insufficient. diff --git a/mm2src/coins/z_coin/storage/z_locked_notes/mod.rs b/mm2src/coins/z_coin/storage/z_locked_notes/mod.rs index fdbd9b8b76..bca87550c0 100644 --- a/mm2src/coins/z_coin/storage/z_locked_notes/mod.rs +++ b/mm2src/coins/z_coin/storage/z_locked_notes/mod.rs @@ -1,3 +1,4 @@ +use derive_more::Display; use enum_derives::EnumFromStringify; cfg_native!( diff --git a/mm2src/coins_activation/src/platform_coin_with_tokens.rs b/mm2src/coins_activation/src/platform_coin_with_tokens.rs index 7739afed3b..ff2b2da524 100644 --- a/mm2src/coins_activation/src/platform_coin_with_tokens.rs +++ b/mm2src/coins_activation/src/platform_coin_with_tokens.rs @@ -140,7 +140,8 @@ where let token_params = tokens_requests .into_iter() .map(|req| -> Result<_, MmError> { - let (token_conf, protocol) = coin_conf_with_protocol(ctx, &req.ticker, req.protocol.clone()).map_mm_err::()?; + let (token_conf, protocol) = coin_conf_with_protocol(ctx, &req.ticker, req.protocol.clone()) + .map_mm_err::()?; Ok(TokenActivationParams { ticker: req.ticker, conf: token_conf, diff --git a/mm2src/kdf_walletconnect/src/lib.rs b/mm2src/kdf_walletconnect/src/lib.rs index 8f8740e081..2ddad6ea43 100644 --- a/mm2src/kdf_walletconnect/src/lib.rs +++ b/mm2src/kdf_walletconnect/src/lib.rs @@ -459,9 +459,9 @@ impl WalletConnectCtxImpl { } } - MmError::err(WalletConnectError::InternalError( - "[{topic}] client connection timeout".to_string(), - )) + MmError::err(WalletConnectError::InternalError(format!( + "[{topic}] client connection timeout" + ))) } /// Persistent reconnection and retry strategy keeps the WebSocket connection active, diff --git a/mm2src/kdf_walletconnect/src/session/rpc/event.rs b/mm2src/kdf_walletconnect/src/session/rpc/event.rs index 62159e6b91..2c93dd22d3 100644 --- a/mm2src/kdf_walletconnect/src/session/rpc/event.rs +++ b/mm2src/kdf_walletconnect/src/session/rpc/event.rs @@ -32,7 +32,7 @@ pub async fn handle_session_event( ctx.validate_chain_id(&session, &chain_id)?; - if session.get_active_chain_id().as_ref().map_or(false, |c| c == &chain_id) { + if session.get_active_chain_id().as_ref() == Some(&chain_id) { return Ok(()); }; diff --git a/mm2src/kdf_walletconnect/src/session/rpc/update.rs b/mm2src/kdf_walletconnect/src/session/rpc/update.rs index e15793fe76..e93c1a459f 100644 --- a/mm2src/kdf_walletconnect/src/session/rpc/update.rs +++ b/mm2src/kdf_walletconnect/src/session/rpc/update.rs @@ -24,7 +24,7 @@ pub(crate) async fn reply_session_update_request( .caip2_validate() .map_to_mm(|err| WalletConnectError::InternalError(err.to_string()))?; session.namespaces = update.namespaces.0; - let session = session; + info!("Updated extended, info: {:?}", session.topic); } diff --git a/mm2src/kdf_walletconnect/src/storage/mod.rs b/mm2src/kdf_walletconnect/src/storage/mod.rs index 7fee54c535..4f4077fb6f 100644 --- a/mm2src/kdf_walletconnect/src/storage/mod.rs +++ b/mm2src/kdf_walletconnect/src/storage/mod.rs @@ -16,8 +16,10 @@ pub(crate) trait WalletConnectStorageOps { type Error: std::fmt::Debug + NotMmError + Send; async fn init(&self) -> MmResult<(), Self::Error>; + #[expect(dead_code)] async fn is_initialized(&self) -> MmResult; async fn save_session(&self, session: &Session) -> MmResult<(), Self::Error>; + #[allow(dead_code)] async fn get_session(&self, topic: &Topic) -> MmResult, Self::Error>; async fn get_all_sessions(&self) -> MmResult, Self::Error>; async fn delete_session(&self, topic: &Topic) -> MmResult<(), Self::Error>; diff --git a/mm2src/mm2_event_stream/src/streamer_ids.rs b/mm2src/mm2_event_stream/src/streamer_ids.rs index d019b9a9e0..064eb8f505 100644 --- a/mm2src/mm2_event_stream/src/streamer_ids.rs +++ b/mm2src/mm2_event_stream/src/streamer_ids.rs @@ -81,7 +81,7 @@ impl<'de> Deserialize<'de> for StreamerId { { struct StreamerIdVisitor; - impl<'de> Visitor<'de> for StreamerIdVisitor { + impl Visitor<'_> for StreamerIdVisitor { type Value = StreamerId; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { diff --git a/mm2src/mm2_main/Cargo.toml b/mm2src/mm2_main/Cargo.toml index b2fe520cfb..0b6f9aed48 100644 --- a/mm2src/mm2_main/Cargo.toml +++ b/mm2src/mm2_main/Cargo.toml @@ -26,6 +26,9 @@ sepolia-maker-swap-v2-tests = [] sepolia-taker-swap-v2-tests = [] test-ext-api = ["trading_api/test-ext-api"] new-db-arch = ["mm2_core/new-db-arch"] # A temporary feature to integrate the new db architecture incrementally +# Temporary feature for implementing IBC wrap/unwrap mechanism and will be removed +# once we consider it as stable. +ibc-routing-for-swaps = [] [dependencies] async-std = { workspace = true, features = ["unstable"] } diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 3381813109..109ff4eddc 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -1224,7 +1224,7 @@ impl TakerRequest { base_protocol_info: message.base_protocol_info, rel_protocol_info: message.rel_protocol_info, swap_version: message.swap_version, - /// TODO: Support the new protocol types. + // TODO: Support the new protocol types. #[cfg(feature = "ibc-routing-for-swaps")] order_metadata: OrderMetadata::default(), } @@ -2302,7 +2302,7 @@ impl MakerReserved { base_protocol_info: message.base_protocol_info, rel_protocol_info: message.rel_protocol_info, swap_version: message.swap_version, - /// TODO: Support the new protocol types. + // TODO: Support the new protocol types. #[cfg(feature = "ibc-routing-for-swaps")] order_metadata: OrderMetadata::default(), } @@ -2536,6 +2536,7 @@ fn pubkey_state_mut<'a>( } fn order_pair_root_mut<'a>(state: &'a mut HashMap, pair: &str) -> &'a mut H64 { + #[allow(clippy::unwrap_or_default)] state.entry(pair.to_owned()).or_insert_with(Default::default) } @@ -3047,6 +3048,7 @@ struct StateMachineParams<'a> { taker_amount: &'a MmNumber, } +#[allow(unreachable_code, unused_variables)] // TODO: remove with `ibc-routing-for-swaps` feature removal. #[cfg_attr(test, mockable)] fn lp_connect_start_bob(ctx: MmArc, maker_match: MakerMatch, maker_order: MakerOrder, taker_p2p_pubkey: PublicKey) { let spawner = ctx.spawner(); @@ -3289,6 +3291,7 @@ async fn start_maker_swap_state_machine< .error_log(); } +#[allow(unreachable_code, unused_variables)] // TODO: remove with `ibc-routing-for-swaps` feature removal. fn lp_connected_alice(ctx: MmArc, taker_order: TakerOrder, taker_match: TakerMatch, maker_p2p_pubkey: PublicKey) { let spawner = ctx.spawner(); let uuid = taker_match.reserved.taker_order_uuid; @@ -3339,6 +3342,7 @@ fn lp_connected_alice(ctx: MmArc, taker_order: TakerOrder, taker_match: TakerMat unreachable!(); } + #[allow(unreachable_code)] let maker_amount = taker_match.reserved.get_base_amount().clone(); let taker_amount = taker_match.reserved.get_rel_amount().clone(); diff --git a/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs b/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs index c874f9473f..a57bd2cc2d 100644 --- a/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs +++ b/mm2src/mm2_main/src/rpc/dispatcher/dispatcher_legacy.rs @@ -1,5 +1,6 @@ use super::PUBLIC_METHODS; use common::HyRes; +use derive_more::Display; use futures::compat::Future01CompatExt; use futures::{Future as Future03, FutureExt, TryFutureExt}; use http::Response; @@ -151,7 +152,7 @@ pub async fn process_single_request( let handler = match dispatcher(req, ctx.clone()) { DispatcherRes::Match(handler) => handler, - DispatcherRes::NoMatch(_) => { + DispatcherRes::NoMatch => { return Err(LegacyRequestProcessError::NoMatch); }, }; diff --git a/mm2src/mm2_main/src/rpc/wc_commands/sessions.rs b/mm2src/mm2_main/src/rpc/wc_commands/sessions.rs index 3f8c457d63..86bf529d19 100644 --- a/mm2src/mm2_main/src/rpc/wc_commands/sessions.rs +++ b/mm2src/mm2_main/src/rpc/wc_commands/sessions.rs @@ -24,11 +24,7 @@ pub async fn get_all_sessions( ) -> MmResult { let wc_ctx = WalletConnectCtx::from_ctx(&ctx).mm_err(|err| WalletConnectRpcError::InitializationError(err.to_string()))?; - let sessions = wc_ctx - .session_manager - .get_sessions() - .map(SessionRpcInfo::from) - .collect::>(); + let sessions = wc_ctx.session_manager.get_sessions().collect::>(); Ok(GetSessionsResponse { sessions }) } diff --git a/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs b/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs index 1fa139ab31..b0776da0ba 100644 --- a/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs +++ b/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs @@ -23,7 +23,7 @@ lazy_static! { } /// Build asset `ZCoin` from ticker and spending_key. -pub async fn z_coin_from_spending_key<'a>(spending_key: &str, path: &'a str) -> (MmArc, ZCoin) { +pub async fn z_coin_from_spending_key(spending_key: &str, path: &'_ str) -> (MmArc, ZCoin) { let tmp = TEMP_DIR.lock().await; let db_path = tmp.path().join(format!("ZOMBIE_DB_{path}")); std::fs::create_dir_all(&db_path).unwrap(); diff --git a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs index 5a98e99833..439467c334 100644 --- a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs +++ b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs @@ -5067,8 +5067,8 @@ fn test_sign_verify_message_utxo_with_derivation_path() { EnableCoinBalanceMap::HD(hd) => hd, _ => panic!("Expected EnableCoinBalance::HD"), }; - let address0 = &balance.accounts.get(0).expect("Expected account at index 0").addresses[0].address; - let address1 = &balance.accounts.get(0).expect("Expected account at index 1").addresses[1].address; + let address0 = &balance.accounts.first().expect("Expected account at index 0").addresses[0].address; + let address1 = &balance.accounts.first().expect("Expected account at index 1").addresses[1].address; // Test address0 let expected_signature = "ICnkSvQkAurwLvK6RYtCItrWMOS4ESjCf4GKp1DvBM8Xc2+dxM4si6NcSb0JJaJajYhPkwg5yWHmgR/9AmGB0KE="; @@ -5239,7 +5239,7 @@ fn test_sign_verify_message_segwit_with_bip84_derivation_path() { _ => panic!("Expected EnableCoinBalance::HD"), }; - let account0 = balance.accounts.get(0).expect("Expected account at index 0"); + let account0 = balance.accounts.first().expect("Expected account at index 0"); let address0 = &account0.addresses[0].address; let address1 = &account0.addresses[1].address; From 5eed28c62c8ba31fd980799651edb1299f737506 Mon Sep 17 00:00:00 2001 From: onur-ozkan Date: Thu, 26 Jun 2025 07:53:50 +0000 Subject: [PATCH 33/35] fix wasm tests Signed-off-by: onur-ozkan --- mm2src/mm2_main/tests/docker_tests_main.rs | 1 + mm2src/mm2_main/tests/docker_tests_sia_unique.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/mm2src/mm2_main/tests/docker_tests_main.rs b/mm2src/mm2_main/tests/docker_tests_main.rs index 8ff71ad430..fc5766cf79 100644 --- a/mm2src/mm2_main/tests/docker_tests_main.rs +++ b/mm2src/mm2_main/tests/docker_tests_main.rs @@ -1,4 +1,5 @@ #![cfg(feature = "run-docker-tests")] +#![cfg(not(target_arch = "wasm32"))] #![feature(custom_test_frameworks)] #![feature(test)] #![test_runner(docker_tests_runner)] diff --git a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs index b4fc59f649..9d23a73136 100644 --- a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs +++ b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs @@ -1,4 +1,5 @@ #![allow(unused_imports, dead_code)] +#![cfg(not(target_arch = "wasm32"))] #![feature(custom_test_frameworks)] #![feature(test)] #![test_runner(docker_tests_runner)] From 2f61dd939c68cf7ab1927124e62e0ed7a18e3296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Thu, 3 Jul 2025 07:13:21 +0300 Subject: [PATCH 34/35] fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mm2src/coins/lightning/ln_events.rs | 7 +-- mm2src/coins/lp_coins.rs | 1 - mm2src/coins/utxo/slp.rs | 1 + .../utxo/utxo_builder/utxo_arc_builder.rs | 1 - mm2src/coins/utxo/utxo_common.rs | 1 + mm2src/coins/utxo/utxo_tests.rs | 6 +-- .../src/bch_with_tokens_activation.rs | 42 ++++----------- .../src/erc20_token_activation.rs | 6 +-- .../src/eth_with_token_activation.rs | 7 +-- mm2src/coins_activation/src/init_token.rs | 17 ++---- mm2src/coins_activation/src/l2/init_l2.rs | 22 ++++---- .../src/platform_coin_with_tokens.rs | 54 +++++++------------ .../standalone_coin/init_standalone_coin.rs | 29 ++++------ mm2src/coins_activation/src/token.rs | 9 ++-- mm2src/derives/enum_derives/src/lib.rs | 3 +- mm2src/mm2_bitcoin/chain/Cargo.toml | 1 + mm2src/mm2_bitcoin/crypto/Cargo.toml | 1 + mm2src/mm2_bitcoin/keys/Cargo.toml | 1 + mm2src/mm2_bitcoin/primitives/Cargo.toml | 1 + mm2src/mm2_bitcoin/rpc/Cargo.toml | 1 + mm2src/mm2_bitcoin/script/Cargo.toml | 1 + mm2src/mm2_bitcoin/serialization/Cargo.toml | 1 + .../serialization_derive/Cargo.toml | 1 + mm2src/mm2_eth/src/eip712_encode.rs | 2 +- .../tests/docker_tests/z_coin_docker_tests.rs | 2 +- mm2src/trading_api/src/one_inch_api/client.rs | 4 +- 26 files changed, 81 insertions(+), 141 deletions(-) diff --git a/mm2src/coins/lightning/ln_events.rs b/mm2src/coins/lightning/ln_events.rs index eb133795a4..33365a70dd 100644 --- a/mm2src/coins/lightning/ln_events.rs +++ b/mm2src/coins/lightning/ln_events.rs @@ -17,7 +17,7 @@ use lightning::util::events::{Event, EventHandler, PaymentPurpose}; use rand::Rng; use script::{Builder, SignatureVersion}; use secp256k1v24::Secp256k1; -use std::convert::{TryFrom, TryInto}; +use std::convert::TryInto; use std::sync::Arc; use utxo_signer::with_key_pair::sign_tx; @@ -182,14 +182,11 @@ pub async fn init_abortable_events(platform: Arc, db: SqliteLightningD pub enum SignFundingTransactionError { #[display(fmt = "Internal error: {}", _0)] Internal(String), - #[display(fmt = "Error converting transaction: {}", _0)] - ConvertTxErr(String), #[display(fmt = "Error signing transaction: {}", _0)] TxSignFailed(String), } // Generates the raw funding transaction with one output equal to the channel value. -#[allow(clippy::unnecessary_fallible_conversions)] async fn sign_funding_transaction( uuid: Uuid, output_script_pubkey: &Script, @@ -224,7 +221,7 @@ async fn sign_funding_transaction( ) .map_err(|e| SignFundingTransactionError::TxSignFailed(e.to_string()))?; - Transaction::try_from(signed).map_err(|e| SignFundingTransactionError::ConvertTxErr(e.to_string())) + Ok(Transaction::from(signed)) } async fn save_channel_closing_details( diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 854b37db3a..884a1274a8 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -26,7 +26,6 @@ clippy::swap_ptr_to_ref, clippy::forget_non_drop, clippy::doc_lazy_continuation, - clippy::result_large_err, clippy::needless_lifetimes // mocktopus requires explicit lifetimes )] #![allow(uncommon_codepoints)] diff --git a/mm2src/coins/utxo/slp.rs b/mm2src/coins/utxo/slp.rs index 13ac99cbe0..563dbb1cf8 100644 --- a/mm2src/coins/utxo/slp.rs +++ b/mm2src/coins/utxo/slp.rs @@ -298,6 +298,7 @@ pub struct SlpProtocolConf { } impl SlpToken { + #[allow(clippy::result_large_err)] pub fn new( decimals: u8, ticker: String, diff --git a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs index 5a6c3cd461..4199e3e39e 100644 --- a/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs +++ b/mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs @@ -556,7 +556,6 @@ async fn resolve_possible_chain_reorg( ))) }, }; - #[allow(clippy::unit_arg)] // It's more readable this way. // If the headers are successfully retrieved and validated, remove the headers from storage and continue the outer loop. match validate_headers(ticker, retrieve_from - 1, &headers_to_validate, storage, spv_conf).await { Ok(_) => { diff --git a/mm2src/coins/utxo/utxo_common.rs b/mm2src/coins/utxo/utxo_common.rs index c25073fd84..8d654f9581 100644 --- a/mm2src/coins/utxo/utxo_common.rs +++ b/mm2src/coins/utxo/utxo_common.rs @@ -4388,6 +4388,7 @@ where fn can_tx_be_cached(tx: &RpcTransaction) -> bool { tx.height > Some(0) } /// Calculates actual confirmations number of the given `tx` transaction loaded from cache. + #[allow(clippy::result_large_err)] fn calc_actual_cached_tx_confirmations(tx: &RpcTransaction, block_count: u64) -> UtxoRpcResult { let tx_height = tx.height.or_mm_err(|| { UtxoRpcError::Internal(format!(r#"Warning, height of cached "{:?}" tx is unknown"#, tx.txid)) diff --git a/mm2src/coins/utxo/utxo_tests.rs b/mm2src/coins/utxo/utxo_tests.rs index 1c850f25de..8a30c42c58 100644 --- a/mm2src/coins/utxo/utxo_tests.rs +++ b/mm2src/coins/utxo/utxo_tests.rs @@ -58,7 +58,6 @@ use spv_validation::work::DifficultyAlgorithm; #[cfg(not(target_arch = "wasm32"))] use std::convert::TryFrom; use std::iter; use std::num::NonZeroUsize; -use std::ptr::addr_of; use std::str::FromStr; #[cfg(not(target_arch = "wasm32"))] @@ -4709,10 +4708,7 @@ fn test_scan_for_new_addresses() { assert_eq!(accounts[&0].internal_addresses_number, 4); assert_eq!(accounts[&1].external_addresses_number, 5); assert_eq!(accounts[&1].internal_addresses_number, 2); - assert_eq!( - unsafe { &addr_of!(CHECKED_ADDRESSES).read_unaligned() }, - &expected_checked_addresses - ); + assert_eq!(unsafe { &CHECKED_ADDRESSES }, &expected_checked_addresses); } #[test] diff --git a/mm2src/coins_activation/src/bch_with_tokens_activation.rs b/mm2src/coins_activation/src/bch_with_tokens_activation.rs index 6f4da7fadb..0513f5779e 100644 --- a/mm2src/coins_activation/src/bch_with_tokens_activation.rs +++ b/mm2src/coins_activation/src/bch_with_tokens_activation.rs @@ -226,7 +226,7 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { activation_request: Self::ActivationRequest, protocol_conf: Self::PlatformProtocolInfo, ) -> Result> { - let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx).map_mm_err::()?; + let priv_key_policy = PrivKeyBuildPolicy::detect_priv_key_policy(&ctx).map_mm_err()?; let slp_prefix = CashAddrPrefix::from_str(&protocol_conf.slp_prefix).map_to_mm(|error| { BchWithTokensActivationError::InvalidSlpPrefix { @@ -246,7 +246,7 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { ) .await .map_to_mm(|error| BchWithTokensActivationError::PlatformCoinCreationError { ticker, error }) - .map_mm_err::()?; + .map_mm_err()?; Ok(platform_coin) } @@ -282,53 +282,34 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { activation_request: &Self::ActivationRequest, _nft_global: &Option, ) -> Result> { - let current_block = self - .as_ref() - .rpc_client - .get_block_count() - .compat() - .await - .map_mm_err::()?; + let current_block = self.as_ref().rpc_client.get_block_count().compat().await.map_mm_err()?; let my_address = self .as_ref() .derivation_method .single_addr_or_err() .await - .map_mm_err::()?; + .map_mm_err()?; let my_slp_address = self .get_my_slp_address() .await .map_to_mm(BchWithTokensActivationError::Internal) - .map_mm_err::()? + .map_mm_err()? .encode() .map_to_mm(BchWithTokensActivationError::Internal) - .map_mm_err::()?; + .map_mm_err()?; - let pubkey = self - .my_public_key() - .map_mm_err::()? - .to_string(); + let pubkey = self.my_public_key().map_mm_err()?.to_string(); let mut bch_address_info = CoinAddressInfo { - derivation_method: self - .as_ref() - .derivation_method - .to_response() - .await - .map_mm_err::()?, + derivation_method: self.as_ref().derivation_method.to_response().await.map_mm_err()?, pubkey: pubkey.clone(), balances: None, tickers: None, }; let mut slp_address_info = CoinAddressInfo { - derivation_method: self - .as_ref() - .derivation_method - .to_response() - .await - .map_mm_err::()?, + derivation_method: self.as_ref().derivation_method.to_response().await.map_mm_err()?, pubkey: pubkey.clone(), balances: None, tickers: None, @@ -347,10 +328,7 @@ impl PlatformCoinWithTokensActivationOps for BchCoin { }); } - let bch_unspents = self - .bch_unspents_for_display(&my_address) - .await - .map_mm_err::()?; + let bch_unspents = self.bch_unspents_for_display(&my_address).await.map_mm_err()?; bch_address_info.balances = Some(bch_unspents.platform_balance(self.decimals())); drop_mutability!(bch_address_info); diff --git a/mm2src/coins_activation/src/erc20_token_activation.rs b/mm2src/coins_activation/src/erc20_token_activation.rs index aa9d66ddeb..4ec3e15db0 100644 --- a/mm2src/coins_activation/src/erc20_token_activation.rs +++ b/mm2src/coins_activation/src/erc20_token_activation.rs @@ -151,13 +151,13 @@ impl TokenActivationOps for EthCoin { is_custom, ) .await - .map_mm_err::()?; + .map_mm_err()?; let address = token .derivation_method() .single_addr_or_err() .await - .map_mm_err::()? + .map_mm_err()? .display_address(); let token_contract_address = token.erc20_token_address().ok_or_else(|| { EthTokenActivationError::InternalError("Token contract address is missing".to_string()) @@ -195,7 +195,7 @@ impl TokenActivationOps for EthCoin { NftProviderEnum::Moralis { url, komodo_proxy } => platform_coin .initialize_global_nft(url, *komodo_proxy) .await - .map_mm_err::()?, + .map_mm_err()?, }; let nfts = nft_global.nfts_infos.lock().await.clone(); let init_result = EthTokenInitResult::Nft(NftInitResult { diff --git a/mm2src/coins_activation/src/eth_with_token_activation.rs b/mm2src/coins_activation/src/eth_with_token_activation.rs index 00cae62a00..d3ac19b0cb 100644 --- a/mm2src/coins_activation/src/eth_with_token_activation.rs +++ b/mm2src/coins_activation/src/eth_with_token_activation.rs @@ -311,10 +311,7 @@ impl PlatformCoinWithTokensActivationOps for EthCoin { }, None => return Ok(None), }; - let nft_global = self - .initialize_global_nft(url, proxy_auth) - .await - .map_mm_err::()?; + let nft_global = self.initialize_global_nft(url, proxy_auth).await.map_mm_err()?; Ok(Some(MmCoinEnum::EthCoin(nft_global))) } @@ -479,7 +476,7 @@ async fn eth_priv_key_build_policy( ) -> MmResult { match activation_policy { EthPrivKeyActivationPolicy::ContextPrivKey => { - Ok(EthPrivKeyBuildPolicy::detect_priv_key_policy(ctx).map_mm_err::()?) + Ok(EthPrivKeyBuildPolicy::detect_priv_key_policy(ctx).map_mm_err()?) }, #[cfg(target_arch = "wasm32")] EthPrivKeyActivationPolicy::Metamask => { diff --git a/mm2src/coins_activation/src/init_token.rs b/mm2src/coins_activation/src/init_token.rs index 2ed7b7b80d..5a72ce3d4a 100644 --- a/mm2src/coins_activation/src/init_token.rs +++ b/mm2src/coins_activation/src/init_token.rs @@ -94,7 +94,7 @@ where } let (token_conf, token_protocol): (_, Token::ProtocolInfo) = - coin_conf_with_protocol(&ctx, &request.ticker, request.protocol.clone()).map_mm_err::()?; + coin_conf_with_protocol(&ctx, &request.ticker, request.protocol.clone()).map_mm_err()?; let platform_coin = lp_coinfind_or_err(&ctx, token_protocol.platform_coin_ticker()) .await @@ -108,7 +108,7 @@ where let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitTokenError::Internal) - .map_mm_err::()?; + .map_mm_err()?; let spawner = ctx.spawner(); let task = InitTokenTask:: { ctx, @@ -155,9 +155,7 @@ pub async fn init_token_user_action( let mut task_manager = Token::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitTokenUserActionError::Internal(poison.to_string()))?; - task_manager - .on_user_action(req.task_id, req.user_action) - .map_mm_err::()?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -170,9 +168,7 @@ pub async fn cancel_init_token( let mut task_manager = Standalone::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| CancelInitTokenError::Internal(poison.to_string()))?; - task_manager - .cancel_task(req.task_id) - .map_mm_err::()?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -236,10 +232,7 @@ where log::info!("{} current block {}", ticker, activation_result.current_block()); let coins_ctx = CoinsContext::from_ctx(&self.ctx).unwrap(); - coins_ctx - .add_token(token.clone().into()) - .await - .map_mm_err::()?; + coins_ctx.add_token(token.clone().into()).await.map_mm_err()?; self.platform_coin.register_token_info(&token); diff --git a/mm2src/coins_activation/src/l2/init_l2.rs b/mm2src/coins_activation/src/l2/init_l2.rs index 5271cd36f2..d08537fd1a 100644 --- a/mm2src/coins_activation/src/l2/init_l2.rs +++ b/mm2src/coins_activation/src/l2/init_l2.rs @@ -81,8 +81,8 @@ where } let (coin_conf_json, protocol_conf): (Json, L2::ProtocolInfo) = - coin_conf_with_protocol(&ctx, &ticker, None).map_mm_err::()?; - let coin_conf = L2::coin_conf_from_json(coin_conf_json).map_mm_err::()?; + coin_conf_with_protocol(&ctx, &ticker, None).map_mm_err()?; + let coin_conf = L2::coin_conf_from_json(coin_conf_json).map_mm_err()?; let platform_coin = lp_coinfind_or_err(&ctx, protocol_conf.platform_coin_ticker()) .await @@ -94,13 +94,13 @@ where l2_ticker: ticker.clone(), })?; - L2::validate_platform_configuration(&platform_coin).map_mm_err::()?; + L2::validate_platform_configuration(&platform_coin).map_mm_err()?; - let validated_params = L2::validate_activation_params(req.activation_params.clone()).map_mm_err::()?; + let validated_params = L2::validate_activation_params(req.activation_params.clone()).map_mm_err()?; let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitL2Error::Internal) - .map_mm_err::()?; + .map_mm_err()?; let spawner = ctx.spawner(); let task = InitL2Task:: { ctx, @@ -130,7 +130,7 @@ where { let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitL2StatusError::Internal) - .map_mm_err::()?; + .map_mm_err()?; let mut task_manager = L2::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitL2StatusError::Internal(poison.to_string()))?; @@ -146,13 +146,11 @@ pub async fn init_l2_user_action( ) -> MmResult { let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitL2UserActionError::Internal) - .map_mm_err::()?; + .map_mm_err()?; let mut task_manager = L2::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitL2UserActionError::Internal(poison.to_string()))?; - task_manager - .on_user_action(req.task_id, req.user_action) - .map_mm_err::()?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -162,11 +160,11 @@ pub async fn cancel_init_l2( ) -> MmResult { let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(CancelInitL2Error::Internal) - .map_mm_err::()?; + .map_mm_err()?; let mut task_manager = L2::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| CancelInitL2Error::Internal(poison.to_string())) - .map_mm_err::()?; + .map_mm_err()?; task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } diff --git a/mm2src/coins_activation/src/platform_coin_with_tokens.rs b/mm2src/coins_activation/src/platform_coin_with_tokens.rs index ff2b2da524..4179f9c85f 100644 --- a/mm2src/coins_activation/src/platform_coin_with_tokens.rs +++ b/mm2src/coins_activation/src/platform_coin_with_tokens.rs @@ -140,8 +140,8 @@ where let token_params = tokens_requests .into_iter() .map(|req| -> Result<_, MmError> { - let (token_conf, protocol) = coin_conf_with_protocol(ctx, &req.ticker, req.protocol.clone()) - .map_mm_err::()?; + let (token_conf, protocol) = + coin_conf_with_protocol(ctx, &req.ticker, req.protocol.clone()).map_mm_err()?; Ok(TokenActivationParams { ticker: req.ticker, conf: token_conf, @@ -151,12 +151,9 @@ where }) }) .collect::, _>>() - .map_mm_err::()?; + .map_mm_err()?; - let tokens = self - .enable_tokens(token_params) - .await - .map_mm_err::()?; + let tokens = self.enable_tokens(token_params).await.map_mm_err()?; for token in tokens.iter() { self.platform_coin().register_token_info(token); } @@ -395,20 +392,17 @@ where let tokens = initializer .enable_tokens_as_mm_coins(&ctx, &req.request) .await - .map_mm_err::()?; + .map_mm_err()?; mm_tokens.extend(tokens); } - let nft_global = platform_coin - .enable_global_nft(&req.request) - .await - .map_mm_err::()?; + let nft_global = platform_coin.enable_global_nft(&req.request).await.map_mm_err()?; let activation_result = platform_coin .get_activation_result(task_handle, &req.request, &nft_global) .await - .map_mm_err::()?; + .map_mm_err()?; log::info!("{} current block {}", req.ticker, activation_result.current_block()); let coins_ctx = CoinsContext::from_ctx(&ctx).unwrap(); @@ -455,8 +449,7 @@ where )); } - let (platform_conf, platform_protocol) = - coin_conf_with_protocol(&ctx, &req.ticker, None).map_mm_err::()?; + let (platform_conf, platform_protocol) = coin_conf_with_protocol(&ctx, &req.ticker, None).map_mm_err()?; let platform_coin = Platform::enable_platform_coin( ctx.clone(), @@ -466,34 +459,29 @@ where platform_protocol, ) .await - .map_mm_err::()?; + .map_mm_err()?; let mut mm_tokens = Vec::new(); for initializer in platform_coin.token_initializers() { let tokens = initializer .enable_tokens_as_mm_coins(&ctx, &req.request) .await - .map_mm_err::()?; + .map_mm_err()?; mm_tokens.extend(tokens); } - let nft_global = platform_coin - .enable_global_nft(&req.request) - .await - .map_mm_err::()?; + let nft_global = platform_coin.enable_global_nft(&req.request).await.map_mm_err()?; let activation_result = platform_coin .get_activation_result(task_handle, &req.request, &nft_global) .await - .map_mm_err::()?; + .map_mm_err()?; log::info!("{} current block {}", req.ticker, activation_result.current_block()); if req.request.tx_history() { platform_coin.start_history_background_fetching( ctx.clone(), - TxHistoryStorageBuilder::new(&ctx) - .build() - .map_mm_err::()?, + TxHistoryStorageBuilder::new(&ctx).build().map_mm_err()?, activation_result.get_platform_balance(), ); } @@ -633,14 +621,12 @@ where { let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitPlatformCoinWithTokensUserActionError::Internal) - .map_mm_err::()?; + .map_mm_err()?; let mut task_manager = Platform::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitPlatformCoinWithTokensUserActionError::Internal(poison.to_string())) - .map_mm_err::()?; - task_manager - .on_user_action(req.task_id, req.user_action) - .map_mm_err::()?; + .map_mm_err()?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -654,14 +640,12 @@ where { let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(CancelInitPlatformCoinWithTokensError::Internal) - .map_mm_err::()?; + .map_mm_err()?; let mut task_manager = Platform::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| CancelInitPlatformCoinWithTokensError::Internal(poison.to_string())) - .map_mm_err::()?; - task_manager - .cancel_task(req.task_id) - .map_mm_err::()?; + .map_mm_err()?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } diff --git a/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs b/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs index 12a5af5d29..f97c46924a 100644 --- a/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs +++ b/mm2src/coins_activation/src/standalone_coin/init_standalone_coin.rs @@ -92,12 +92,11 @@ where return MmError::err(InitStandaloneCoinError::CoinIsAlreadyActivated { ticker: request.ticker }); } - let (coin_conf, protocol_info) = - coin_conf_with_protocol(&ctx, &request.ticker, None).map_mm_err::()?; + let (coin_conf, protocol_info) = coin_conf_with_protocol(&ctx, &request.ticker, None).map_mm_err()?; let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitStandaloneCoinError::Internal) - .map_mm_err::()?; + .map_mm_err()?; let spawner = ctx.spawner(); let task = InitStandaloneCoinTask:: { @@ -145,14 +144,12 @@ pub async fn init_standalone_coin_user_action MmResult { let coins_act_ctx = CoinsActivationContext::from_ctx(&ctx) .map_to_mm(InitStandaloneCoinUserActionError::Internal) - .map_mm_err::()?; + .map_mm_err()?; let mut task_manager = Standalone::rpc_task_manager(&coins_act_ctx) .lock() .map_to_mm(|poison| InitStandaloneCoinUserActionError::Internal(poison.to_string())) - .map_mm_err::()?; - task_manager - .on_user_action(req.task_id, req.user_action) - .map_mm_err::()?; + .map_mm_err()?; + task_manager.on_user_action(req.task_id, req.user_action).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -164,10 +161,8 @@ pub async fn cancel_init_standalone_coin()?; - task_manager - .cancel_task(req.task_id) - .map_mm_err::()?; + .map_mm_err()?; + task_manager.cancel_task(req.task_id).map_mm_err()?; Ok(SuccessResponse::new()) } @@ -216,12 +211,12 @@ where task_handle.clone(), ) .await - .map_mm_err::()?; + .map_mm_err()?; let result = coin .get_activation_result(self.ctx.clone(), task_handle, &self.request.activation_params) .await - .map_mm_err::()?; + .map_mm_err()?; log::info!("{} current block {}", ticker, result.current_block()); let tx_history = self.request.activation_params.tx_history(); @@ -229,9 +224,7 @@ where let current_balances = result.get_addresses_balances(); coin.start_history_background_fetching( self.ctx.metrics.clone(), - TxHistoryStorageBuilder::new(&self.ctx) - .build() - .map_mm_err::()?, + TxHistoryStorageBuilder::new(&self.ctx).build().map_mm_err()?, self.ctx.event_stream_manager.clone(), current_balances, ); @@ -239,7 +232,7 @@ where lp_register_coin(&self.ctx, coin.into(), RegisterCoinParams { ticker }) .await - .map_mm_err::()?; + .map_mm_err()?; Ok(result) } diff --git a/mm2src/coins_activation/src/token.rs b/mm2src/coins_activation/src/token.rs index 46fb9b1a58..9b78102483 100644 --- a/mm2src/coins_activation/src/token.rs +++ b/mm2src/coins_activation/src/token.rs @@ -128,7 +128,7 @@ where } let (token_conf, token_protocol): (_, Token::ProtocolInfo) = - coin_conf_with_protocol(&ctx, &req.ticker, req.protocol.clone()).map_mm_err::()?; + coin_conf_with_protocol(&ctx, &req.ticker, req.protocol.clone()).map_mm_err()?; let platform_coin = lp_coinfind_or_err(&ctx, token_protocol.platform_coin_ticker()) .await @@ -150,13 +150,10 @@ where req.protocol.is_some(), ) .await - .map_mm_err::()?; + .map_mm_err()?; let coins_ctx = CoinsContext::from_ctx(&ctx).unwrap(); - coins_ctx - .add_token(token.clone().into()) - .await - .map_mm_err::()?; + coins_ctx.add_token(token.clone().into()).await.map_mm_err()?; platform_coin.register_token_info(&token); diff --git a/mm2src/derives/enum_derives/src/lib.rs b/mm2src/derives/enum_derives/src/lib.rs index 0f51689806..4f3cf5c67e 100644 --- a/mm2src/derives/enum_derives/src/lib.rs +++ b/mm2src/derives/enum_derives/src/lib.rs @@ -93,7 +93,7 @@ pub fn enum_from_trait(input: TokenStream) -> TokenStream { /// /// ### USAGE: /// -/// ```rust +/// ```ignore /// use enum_derives::EnumFromStringify; /// use std::fmt::{Display, Formatter}; /// use std::io::{Error, ErrorKind}; @@ -117,7 +117,6 @@ pub fn enum_from_trait(input: TokenStream) -> TokenStream { /// assert_eq!(actual, expected); /// } /// ``` -#[allow(clippy::test_attr_in_doctest)] #[proc_macro_derive(EnumFromStringify, attributes(from_stringify))] pub fn derive(input: TokenStream) -> TokenStream { let ast = parse_macro_input!(input as DeriveInput); diff --git a/mm2src/mm2_bitcoin/chain/Cargo.toml b/mm2src/mm2_bitcoin/chain/Cargo.toml index 3f85ae7db7..c13290a413 100644 --- a/mm2src/mm2_bitcoin/chain/Cargo.toml +++ b/mm2src/mm2_bitcoin/chain/Cargo.toml @@ -2,6 +2,7 @@ name = "chain" version = "0.1.0" authors = ["debris "] +edition = "2015" [lib] doctest = false diff --git a/mm2src/mm2_bitcoin/crypto/Cargo.toml b/mm2src/mm2_bitcoin/crypto/Cargo.toml index 1ca5ee8257..b418950be0 100644 --- a/mm2src/mm2_bitcoin/crypto/Cargo.toml +++ b/mm2src/mm2_bitcoin/crypto/Cargo.toml @@ -2,6 +2,7 @@ name = "bitcrypto" version = "0.1.0" authors = ["debris "] +edition = "2015" [lib] doctest = false diff --git a/mm2src/mm2_bitcoin/keys/Cargo.toml b/mm2src/mm2_bitcoin/keys/Cargo.toml index e840322fd1..9acf887d18 100644 --- a/mm2src/mm2_bitcoin/keys/Cargo.toml +++ b/mm2src/mm2_bitcoin/keys/Cargo.toml @@ -2,6 +2,7 @@ name = "keys" version = "0.1.0" authors = ["debris "] +edition = "2015" [lib] doctest = false diff --git a/mm2src/mm2_bitcoin/primitives/Cargo.toml b/mm2src/mm2_bitcoin/primitives/Cargo.toml index ac1000a9fb..4580cbb7d3 100644 --- a/mm2src/mm2_bitcoin/primitives/Cargo.toml +++ b/mm2src/mm2_bitcoin/primitives/Cargo.toml @@ -2,6 +2,7 @@ name = "primitives" version = "0.1.0" authors = ["debris "] +edition = "2015" [lib] doctest = false diff --git a/mm2src/mm2_bitcoin/rpc/Cargo.toml b/mm2src/mm2_bitcoin/rpc/Cargo.toml index a9e0841695..ae2fec9dc2 100644 --- a/mm2src/mm2_bitcoin/rpc/Cargo.toml +++ b/mm2src/mm2_bitcoin/rpc/Cargo.toml @@ -2,6 +2,7 @@ name = "rpc" version = "0.1.0" authors = ["Ethcore "] +edition = "2015" [lib] doctest = false diff --git a/mm2src/mm2_bitcoin/script/Cargo.toml b/mm2src/mm2_bitcoin/script/Cargo.toml index 6a97b950b2..61cfd06e2b 100644 --- a/mm2src/mm2_bitcoin/script/Cargo.toml +++ b/mm2src/mm2_bitcoin/script/Cargo.toml @@ -2,6 +2,7 @@ name = "script" version = "0.1.0" authors = ["debris "] +edition = "2015" [lib] doctest = false diff --git a/mm2src/mm2_bitcoin/serialization/Cargo.toml b/mm2src/mm2_bitcoin/serialization/Cargo.toml index 6a843442a2..3a0298bb5d 100644 --- a/mm2src/mm2_bitcoin/serialization/Cargo.toml +++ b/mm2src/mm2_bitcoin/serialization/Cargo.toml @@ -2,6 +2,7 @@ name = "serialization" version = "0.1.0" authors = ["debris "] +edition = "2015" [lib] doctest = false diff --git a/mm2src/mm2_bitcoin/serialization_derive/Cargo.toml b/mm2src/mm2_bitcoin/serialization_derive/Cargo.toml index a220338026..d731455211 100644 --- a/mm2src/mm2_bitcoin/serialization_derive/Cargo.toml +++ b/mm2src/mm2_bitcoin/serialization_derive/Cargo.toml @@ -2,6 +2,7 @@ name = "serialization_derive" version = "0.1.0" authors = ["debris "] +edition = "2015" [lib] name = "serialization_derive" diff --git a/mm2src/mm2_eth/src/eip712_encode.rs b/mm2src/mm2_eth/src/eip712_encode.rs index bd7fc742f9..cc5605281f 100644 --- a/mm2src/mm2_eth/src/eip712_encode.rs +++ b/mm2src/mm2_eth/src/eip712_encode.rs @@ -144,7 +144,7 @@ fn encode_address(value: &Json, field_name: Option<&str>) -> Result> { .ok_or_else(|| expected_type_error("address", value, field_name))?; // "0x" - 2 chars, 40 chars are 20 hexed bytes. if string.len() != 42 { - Err(decode_error("Expected 0x-prefixed address (20 bytes)", field_name))?; + return Err(decode_error("Expected 0x-prefixed address (20 bytes)", field_name)); } let address = Address::from_str(&string[2..]).map_err(|e| decode_error(e, field_name))?; Ok(encode(&[Token::Address(address)])) diff --git a/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs b/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs index b0776da0ba..fe0f009dcd 100644 --- a/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs +++ b/mm2src/mm2_main/tests/docker_tests/z_coin_docker_tests.rs @@ -23,7 +23,7 @@ lazy_static! { } /// Build asset `ZCoin` from ticker and spending_key. -pub async fn z_coin_from_spending_key(spending_key: &str, path: &'_ str) -> (MmArc, ZCoin) { +pub async fn z_coin_from_spending_key(spending_key: &str, path: &str) -> (MmArc, ZCoin) { let tmp = TEMP_DIR.lock().await; let db_path = tmp.path().join(format!("ZOMBIE_DB_{path}")); std::fs::create_dir_all(&db_path).unwrap(); diff --git a/mm2src/trading_api/src/one_inch_api/client.rs b/mm2src/trading_api/src/one_inch_api/client.rs index bcfc0fc324..9532715246 100644 --- a/mm2src/trading_api/src/one_inch_api/client.rs +++ b/mm2src/trading_api/src/one_inch_api/client.rs @@ -163,11 +163,11 @@ impl ApiClient { } #[cfg_attr(target_arch = "wasm32", allow(clippy::needless_lifetimes))] - pub async fn call_swap_api<'a, T>( + pub async fn call_swap_api( &self, chain_id: u64, method: String, - params: Option>, + params: Option>, ) -> MmResult where T: DeserializeOwned, From afbc31ca44b18d651bba914cf670fcd213ecce24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Thu, 3 Jul 2025 08:32:48 +0300 Subject: [PATCH 35/35] re-add sia-feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mm2src/mm2_main/tests/docker_tests_sia_unique.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs index 9d23a73136..67ba07aec6 100644 --- a/mm2src/mm2_main/tests/docker_tests_sia_unique.rs +++ b/mm2src/mm2_main/tests/docker_tests_sia_unique.rs @@ -1,9 +1,10 @@ -#![allow(unused_imports, dead_code)] -#![cfg(not(target_arch = "wasm32"))] #![feature(custom_test_frameworks)] #![feature(test)] -#![test_runner(docker_tests_runner)] #![feature(hash_raw_entry)] +#![cfg(feature = "enable-sia")] +#![cfg(not(target_arch = "wasm32"))] +#![allow(unused_imports, dead_code)] +#![test_runner(docker_tests_runner)] #[cfg(test)] #[macro_use]