Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e39ff92
fix comment
mariocynicys Jun 14, 2025
facae9d
add a todo regarind session proposal response
mariocynicys Jun 14, 2025
638fe3f
add a todo related to ledger connection detection in wallet connect
mariocynicys Jun 14, 2025
a5b5909
rename send_proposal_request for clarity and add a todo
mariocynicys Jun 14, 2025
ab0edba
add a todo regarding a possible mis-use of session properties
mariocynicys Jun 15, 2025
42ddeb1
rename PersonalSign to EthPersonalSign to signify it's eth specific m…
mariocynicys Jun 15, 2025
fd0c6ab
add btc/utxo wallet connect method names
mariocynicys Jun 15, 2025
803d8f5
recognize that the conversion from PrivKeyBuildPolicy to the eth coun…
mariocynicys Jun 16, 2025
9799ec9
add a PrivKeyBuildPolicy::WalletConnect to be used for UTXO
mariocynicys Jun 17, 2025
72e845b
dont store address not pubkey in EthPrivKeyBuildPolicy::WalletConnect
mariocynicys Jun 18, 2025
9a03495
dont store address not pubkey in PrivKeyBuildPolicy::WalletConnect
mariocynicys Jun 18, 2025
3769d41
free UtxoCoinBuilder of the trait hell
mariocynicys Jun 18, 2025
bc796a2
impl wallet connection activation for btc
mariocynicys Jun 21, 2025
f15163f
add bip122 to WcChainId struct
mariocynicys Jun 21, 2025
735403d
merge with origin/dev
mariocynicys Jun 23, 2025
6dd49c1
fix ci clippy error
mariocynicys Jun 24, 2025
31d9edc
merge with origin dev
mariocynicys Jun 24, 2025
a665b55
strongtype wallet connect error
mariocynicys Jun 25, 2025
028ff49
move a note to a todo to not forget about it later
mariocynicys Jun 25, 2025
b892571
review(onur): rename the generic UtxoAddress struct
mariocynicys Jun 30, 2025
ca8e1a0
merge with origin/dev
mariocynicys Jul 2, 2025
2c72ad6
turn the TryFrom back to From
mariocynicys Jul 3, 2025
98f9d5f
manually convert PrivKeyBuildPoilcy to the ETH counterpart in legacy …
mariocynicys Jul 3, 2025
17bf308
refactor sign_message_hash for better usability
mariocynicys Jul 9, 2025
eee71ca
impl msg signing and pubkey recovery with walletconnect
mariocynicys Jul 9, 2025
16aa656
use signMessage for pubkey recovery as a fallback
mariocynicys Jul 9, 2025
f3451fe
fix error in activated_key_or_err() call when walletconnect is used
mariocynicys Jul 9, 2025
4587a1d
fix linting issues
mariocynicys Jul 9, 2025
af1cc4b
merge with origin/dev
mariocynicys Jul 10, 2025
c86a2bf
review(onur): add more spaces here and there for readability
mariocynicys Jul 10, 2025
87bb907
refine the todo regarding ledger connectino detection
mariocynicys Jul 14, 2025
480ad38
review(onur): rename build_..._iguana_secret to build_..._iguana_priv…
mariocynicys Jul 14, 2025
9bf308a
review(onur): reduce the size of `build_utxo_fields_with_walletconnec…
mariocynicys Jul 14, 2025
4149627
review(onur): use a specilizied struct for session_topic parameters (…
mariocynicys Jul 14, 2025
a22b14b
review(onur): let kdf_walletconnect-rust use &Topic instead of &str f…
mariocynicys Jul 14, 2025
35d7353
merge with origin/dev
mariocynicys Jul 25, 2025
f17f300
try to decode the signature response as hex first
mariocynicys Jul 28, 2025
6521246
move sign_message_hash to mm2_bitcoin
mariocynicys Jul 29, 2025
84f3f0b
review(shamardy): report the correct error when tron is used with wal…
mariocynicys Jul 30, 2025
e893297
review(shamardy): move chain_id inside protocol data for utxo
mariocynicys Jul 30, 2025
33868a6
Merge remote-tracking branch 'origin/dev' into btc-walletconnect
mariocynicys Jul 30, 2025
f0719d6
merge with origin/dev
mariocynicys Jul 30, 2025
821a5dd
fix failing tests
mariocynicys Jul 30, 2025
188424a
actually fix tests
mariocynicys Jul 30, 2025
0947655
merge with origin/dev
shamardy Jul 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 29 additions & 15 deletions mm2src/coins/eth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ use web3::{self, Web3};

cfg_wasm32! {
use crypto::MetamaskArc;
use ethereum_types::H520;
use mm2_metamask::MetamaskError;
use web3::types::TransactionRequest;
}
Expand Down Expand Up @@ -814,8 +813,6 @@ pub enum EthPrivKeyBuildPolicy {
Metamask(MetamaskArc),
Trezor,
WalletConnect {
address: Address,
public_key_uncompressed: H520,
session_topic: String,
},
}
Expand All @@ -836,12 +833,17 @@ impl EthPrivKeyBuildPolicy {
}
}

impl From<PrivKeyBuildPolicy> for EthPrivKeyBuildPolicy {
fn from(policy: PrivKeyBuildPolicy) -> Self {
impl TryFrom<PrivKeyBuildPolicy> for EthPrivKeyBuildPolicy {
type Error = String;

fn try_from(policy: PrivKeyBuildPolicy) -> Result<Self, Self::Error> {
match policy {
PrivKeyBuildPolicy::IguanaPrivKey(iguana) => EthPrivKeyBuildPolicy::IguanaPrivKey(iguana),
PrivKeyBuildPolicy::GlobalHDAccount(global_hd) => EthPrivKeyBuildPolicy::GlobalHDAccount(global_hd),
PrivKeyBuildPolicy::Trezor => EthPrivKeyBuildPolicy::Trezor,
PrivKeyBuildPolicy::IguanaPrivKey(iguana) => Ok(EthPrivKeyBuildPolicy::IguanaPrivKey(iguana)),
PrivKeyBuildPolicy::GlobalHDAccount(global_hd) => Ok(EthPrivKeyBuildPolicy::GlobalHDAccount(global_hd)),
PrivKeyBuildPolicy::Trezor => Ok(EthPrivKeyBuildPolicy::Trezor),
PrivKeyBuildPolicy::WalletConnect { session_topic } => {
Ok(EthPrivKeyBuildPolicy::WalletConnect { session_topic })
},
}
}
}
Expand Down Expand Up @@ -2872,8 +2874,7 @@ async fn sign_raw_eth_tx(coin: &EthCoin, args: &SignEthTransactionParams) -> Raw
.map_to_mm(|err| RawTransactionError::TransactionError(err.get_plain_text_format()))
},
EthPrivKeyPolicy::WalletConnect { .. } => {
// NOTE: doesn't work with wallets that doesn't support `eth_signTransaction`.
// e.g Metamask
// NOTE: doesn't work with wallets that doesn't support `eth_signTransaction`. e.g TrustWallet
let wc = {
let ctx = MmArc::from_weak(&coin.ctx).expect("No context");
WalletConnectCtx::from_ctx(&ctx)
Expand Down Expand Up @@ -6493,8 +6494,19 @@ pub async fn eth_coin_from_conf_and_request(
}
}

// Convert `PrivKeyBuildPolicy` to `EthPrivKeyBuildPolicy` if it's possible.
// Convert `PrivKeyBuildPolicy` to `EthPrivKeyBuildPolicy`.
let priv_key_policy = try_s!(EthPrivKeyBuildPolicy::try_from(priv_key_policy));
// Make sure not to allow new activation methods that are not supported for legacy ETH coin activation.
match priv_key_policy {
EthPrivKeyBuildPolicy::WalletConnect { .. } => {
return ERR!("WalletConnect private key policy is not supported for legacy ETH coin activation");
},
#[cfg(target_arch = "wasm32")]
EthPrivKeyBuildPolicy::Metamask { .. } => {
return ERR!("Metamask private key policy is not supported for legacy ETH coin activation");
},
_ => {},
}

let mut urls: Vec<String> = try_s!(json::from_value(req["urls"].clone()));
if urls.is_empty() {
Expand All @@ -6519,8 +6531,9 @@ pub async fn eth_coin_from_conf_and_request(
req["path_to_address"].clone()
))
.unwrap_or_default();
let (key_pair, derivation_method) =
try_s!(build_address_and_priv_key_policy(ctx, ticker, conf, priv_key_policy, &path_to_address, None).await);
let (key_pair, derivation_method) = try_s!(
build_address_and_priv_key_policy(ctx, ticker, conf, priv_key_policy, &path_to_address, None, None).await
);

let mut web3_instances = vec![];
let event_handlers = rpc_event_handlers_for_eth_transport(ctx, ticker.to_string());
Expand Down Expand Up @@ -6796,10 +6809,11 @@ pub async fn get_eth_address(
} else {
PrivKeyBuildPolicy::detect_priv_key_policy(ctx)?
}
.into();
.try_into()
.map_err(GetEthAddressError::Internal)?;

let (_, derivation_method) =
build_address_and_priv_key_policy(ctx, ticker, conf, priv_key_policy, path_to_address, None).await?;
build_address_and_priv_key_policy(ctx, ticker, conf, priv_key_policy, path_to_address, None, None).await?;
let my_address = derivation_method.single_addr_or_err().await?;

Ok(MyWalletAddress {
Expand Down
19 changes: 14 additions & 5 deletions mm2src/coins/eth/v2_activation.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::*;
use crate::eth::erc20::{get_enabled_erc20_by_platform_and_contract, get_token_decimals};
use crate::eth::wallet_connect::eth_request_wc_personal_sign;
use crate::eth::web3_transport::http_transport::HttpTransport;
use crate::hd_wallet::{load_hd_accounts_from_storage, HDAccountsMutex, HDPathAccountToAddressId, HDWalletCoinStorage,
HDWalletStorageError, DEFAULT_GAP_LIMIT};
Expand Down Expand Up @@ -635,6 +636,7 @@ pub async fn eth_coin_from_conf_and_request_v2(
priv_key_build_policy,
&req.path_to_address,
req.gap_limit,
Some(&chain_spec),
)
.await?;

Expand Down Expand Up @@ -735,6 +737,7 @@ pub(crate) async fn build_address_and_priv_key_policy(
priv_key_build_policy: EthPrivKeyBuildPolicy,
path_to_address: &HDPathAccountToAddressId,
gap_limit: Option<u32>,
chain_spec: Option<&ChainSpec>,
) -> MmResult<(EthPrivKeyPolicy, EthDerivationMethod), EthActivationV2Error> {
match priv_key_build_policy {
EthPrivKeyBuildPolicy::IguanaPrivKey(iguana) => {
Expand Down Expand Up @@ -825,11 +828,17 @@ pub(crate) async fn build_address_and_priv_key_policy(
DerivationMethod::SingleAddress(address),
))
},
EthPrivKeyBuildPolicy::WalletConnect {
address,
public_key_uncompressed,
session_topic,
} => {
EthPrivKeyBuildPolicy::WalletConnect { session_topic } => {
let wc = WalletConnectCtx::from_ctx(ctx).map_err(|e| {
EthActivationV2Error::WalletConnectError(format!("Failed to get WalletConnect context: {}", e))
})?;
let chain_id = chain_spec
.ok_or(EthActivationV2Error::ChainIdNotSet)?
.chain_id()
.ok_or(EthActivationV2Error::ChainIdNotSet)?;
Copy link
Collaborator

@shamardy shamardy Jul 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, we only use it for wallet connect activation, got it, it's a bit confusing though. Will resolve the 2 comments above it for now

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let (public_key_uncompressed, address) = eth_request_wc_personal_sign(&wc, &session_topic, chain_id)
.await
.mm_err(|err| EthActivationV2Error::WalletConnectError(err.to_string()))?;
let public_key = compress_public_key(public_key_uncompressed)?;
Ok((
EthPrivKeyPolicy::WalletConnect {
Expand Down
2 changes: 1 addition & 1 deletion mm2src/coins/eth/wallet_connect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ pub async fn eth_request_wc_personal_sign(
json!(&[&message_hex, &account_str])
};
let data = wc
.send_session_request_and_wait::<String>(session_topic, &chain_id, WcRequestMethods::PersonalSign, params)
.send_session_request_and_wait::<String>(session_topic, &chain_id, WcRequestMethods::EthPersonalSign, params)
.await?;

Ok(extract_pubkey_from_signature(&data, message, &account_str)
Expand Down
12 changes: 11 additions & 1 deletion mm2src/coins/lp_coins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4157,11 +4157,14 @@ impl CoinsContext {
}

/// This enum is used in coin activation requests.
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Default)]
#[derive(Clone, Debug, Deserialize, Serialize, Default)]
pub enum PrivKeyActivationPolicy {
#[default]
ContextPrivKey,
Trezor,
WalletConnect {
session_topic: String,
},
}

impl PrivKeyActivationPolicy {
Expand Down Expand Up @@ -4217,6 +4220,12 @@ pub enum PrivKeyPolicy<T> {
/// - `public_key`: Compressed public key, represented as [H264].
/// - `public_key_uncompressed`: Uncompressed public key, represented as [H520].
/// - `session_topic`: WalletConnect session that was used to activate this coin.
// TODO: We want to have different variants of WalletConnect policy for different coin types:
// - ETH uses the structure found here.
// - Tendermint doesn't use this variant all together. Tendermint generalizes one level on top of PrivKeyPolicy by having a different activation policy
// structure that is either Priv(PrivKeyPolicy) or Pubkey(PublicKey) and when activated via wallet connect it uses the Pubkey(PublicKey) variant.
// - UTXO coins on the otherhand need to keep a list of all the addresses activated in the wallet and not just a single account.
// - Note: We need to have a way to select which account and address are the active ones (WalletConnect just spams us with all the addresses in every account).
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed, we might not go the active address route for UTXO walletconnect, specially for ledger support to make sense. This is of course for next PRs.

WalletConnect {
public_key: H264,
public_key_uncompressed: H520,
Expand Down Expand Up @@ -4359,6 +4368,7 @@ pub enum PrivKeyBuildPolicy {
IguanaPrivKey(IguanaPrivKey),
GlobalHDAccount(GlobalHDAccountArc),
Trezor,
WalletConnect { session_topic: String },
}

impl PrivKeyBuildPolicy {
Expand Down
35 changes: 18 additions & 17 deletions mm2src/coins/qrc20.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@ use crate::utxo::rpc_clients::{ElectrumClient, NativeClient, UnspentInfo, UtxoRp
UtxoRpcError, UtxoRpcFut, UtxoRpcResult};
#[cfg(not(target_arch = "wasm32"))]
use crate::utxo::tx_cache::{UtxoVerboseCacheOps, UtxoVerboseCacheShared};
use crate::utxo::utxo_builder::{UtxoCoinBuildError, UtxoCoinBuildResult, UtxoCoinBuilder, UtxoCoinBuilderCommonOps,
UtxoFieldsWithGlobalHDBuilder, UtxoFieldsWithHardwareWalletBuilder,
UtxoFieldsWithIguanaSecretBuilder};
use crate::utxo::utxo_builder::{build_utxo_fields_with_global_hd, build_utxo_fields_with_iguana_secret,
UtxoCoinBuildError, UtxoCoinBuildResult, UtxoCoinBuilder, UtxoCoinBuilderCommonOps};
use crate::utxo::utxo_common::{self, big_decimal_from_sat, check_all_utxo_inputs_signed_by_pub, UtxoTxBuilder};
use crate::utxo::{qtum, ActualFeeRate, AddrFromStrError, BroadcastTxErr, FeePolicy, GenerateTxError, GetUtxoListOps,
HistoryUtxoTx, HistoryUtxoTxMap, MatureUnspentList, RecentlySpentOutPointsGuard, UnsupportedAddr,
Expand Down Expand Up @@ -265,32 +264,34 @@ impl<'a> UtxoCoinBuilderCommonOps for Qrc20CoinBuilder<'a> {
}
}

impl<'a> UtxoFieldsWithIguanaSecretBuilder for Qrc20CoinBuilder<'a> {}

impl<'a> UtxoFieldsWithGlobalHDBuilder for Qrc20CoinBuilder<'a> {}

/// Although, `Qrc20Coin` doesn't support [`PrivKeyBuildPolicy::Trezor`] yet,
/// `UtxoCoinBuilder` trait requires `UtxoFieldsWithHardwareWalletBuilder` to be implemented.
impl<'a> UtxoFieldsWithHardwareWalletBuilder for Qrc20CoinBuilder<'a> {}

#[async_trait]
impl<'a> UtxoCoinBuilder for Qrc20CoinBuilder<'a> {
type ResultCoin = Qrc20Coin;
type Error = UtxoCoinBuildError;

fn priv_key_policy(&self) -> PrivKeyBuildPolicy { self.priv_key_policy.clone() }

async fn build(self) -> MmResult<Self::ResultCoin, Self::Error> {
let utxo = match self.priv_key_policy() {
PrivKeyBuildPolicy::IguanaPrivKey(priv_key) => self.build_utxo_fields_with_iguana_secret(priv_key).await?,
async fn build_utxo_fields(&self) -> UtxoCoinBuildResult<UtxoCoinFields> {
match self.priv_key_policy() {
PrivKeyBuildPolicy::IguanaPrivKey(priv_key) => build_utxo_fields_with_iguana_secret(self, priv_key).await,
PrivKeyBuildPolicy::GlobalHDAccount(global_hd_ctx) => {
self.build_utxo_fields_with_global_hd(global_hd_ctx).await?
build_utxo_fields_with_global_hd(self, global_hd_ctx).await
},
PrivKeyBuildPolicy::Trezor => {
let priv_key_err = PrivKeyPolicyNotAllowed::HardwareWalletNotSupported;
return MmError::err(UtxoCoinBuildError::PrivKeyPolicyNotAllowed(priv_key_err));
MmError::err(UtxoCoinBuildError::PrivKeyPolicyNotAllowed(priv_key_err))
},
};
PrivKeyBuildPolicy::WalletConnect { .. } => {
let priv_key_err = PrivKeyPolicyNotAllowed::UnsupportedMethod(
"WalletConnect is not available for QRC20 coin".to_string(),
);
MmError::err(UtxoCoinBuildError::PrivKeyPolicyNotAllowed(priv_key_err))
},
}
}

async fn build(self) -> MmResult<Self::ResultCoin, Self::Error> {
let utxo = self.build_utxo_fields().await?;

let inner = Qrc20CoinFields {
utxo,
Expand Down
9 changes: 9 additions & 0 deletions mm2src/coins/tendermint/tendermint_coin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4209,6 +4209,15 @@ pub fn tendermint_priv_key_policy(
kind,
})
},
PrivKeyBuildPolicy::WalletConnect { .. } => {
let kind = TendermintInitErrorKind::PrivKeyPolicyNotAllowed(PrivKeyPolicyNotAllowed::UnsupportedMethod(
"Cannot use WalletConnect to get TendermintPrivKeyPolicy".to_string(),
));
MmError::err(TendermintInitError {
ticker: ticker.to_string(),
kind,
})
},
}
}

Expand Down
1 change: 1 addition & 0 deletions mm2src/coins/utxo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ pub mod utxo_hd_wallet;
pub mod utxo_standard;
pub mod utxo_tx_history_v2;
pub mod utxo_withdraw;
pub mod wallet_connect;

use async_trait::async_trait;
#[cfg(not(target_arch = "wasm32"))]
Expand Down
10 changes: 1 addition & 9 deletions mm2src/coins/utxo/qtum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ use crate::rpc_command::init_scan_for_new_addresses::{self, InitScanAddressesRpc
ScanAddressesResponse};
use crate::rpc_command::init_withdraw::{InitWithdrawCoin, WithdrawTaskHandleShared};
use crate::tx_history_storage::{GetTxHistoryFilters, WalletId};
use crate::utxo::utxo_builder::{MergeUtxoArcOps, UtxoCoinBuildError, UtxoCoinBuilder, UtxoCoinBuilderCommonOps,
UtxoFieldsWithGlobalHDBuilder, UtxoFieldsWithHardwareWalletBuilder,
UtxoFieldsWithIguanaSecretBuilder};
use crate::utxo::utxo_builder::{MergeUtxoArcOps, UtxoCoinBuildError, UtxoCoinBuilder, UtxoCoinBuilderCommonOps};
use crate::utxo::utxo_hd_wallet::{UtxoHDAccount, UtxoHDAddress};
use crate::utxo::utxo_tx_history_v2::{UtxoMyAddressesHistoryError, UtxoTxDetailsError, UtxoTxDetailsParams,
UtxoTxHistoryOps};
Expand Down Expand Up @@ -201,12 +199,6 @@ 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<'a> UtxoFieldsWithGlobalHDBuilder for QtumCoinBuilder<'a> {}

impl<'a> UtxoFieldsWithHardwareWalletBuilder for QtumCoinBuilder<'a> {}

#[async_trait]
impl<'a> UtxoCoinBuilder for QtumCoinBuilder<'a> {
type ResultCoin = QtumCoin;
Expand Down
6 changes: 3 additions & 3 deletions mm2src/coins/utxo/utxo_builder/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ mod utxo_coin_builder;
mod utxo_conf_builder;

pub use utxo_arc_builder::{MergeUtxoArcOps, UtxoArcBuilder};
pub use utxo_coin_builder::{UtxoCoinBuildError, UtxoCoinBuildResult, UtxoCoinBuilder, UtxoCoinBuilderCommonOps,
UtxoFieldsWithGlobalHDBuilder, UtxoFieldsWithHardwareWalletBuilder,
UtxoFieldsWithIguanaSecretBuilder, DAY_IN_SECONDS};
pub use utxo_coin_builder::{build_utxo_fields_with_global_hd, build_utxo_fields_with_iguana_secret,
UtxoCoinBuildError, UtxoCoinBuildResult, UtxoCoinBuilder, UtxoCoinBuilderCommonOps,
DAY_IN_SECONDS};
pub use utxo_conf_builder::{UtxoConfBuilder, UtxoConfError, UtxoConfResult};

#[cfg(test)]
Expand Down
19 changes: 1 addition & 18 deletions mm2src/coins/utxo/utxo_builder/utxo_arc_builder.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
use crate::utxo::rpc_clients::{ElectrumClient, ElectrumClientImpl, UtxoJsonRpcClientInfo, UtxoRpcClientEnum};

use crate::utxo::utxo_block_header_storage::BlockHeaderStorage;
use crate::utxo::utxo_builder::{UtxoCoinBuildError, UtxoCoinBuilder, UtxoCoinBuilderCommonOps,
UtxoFieldsWithGlobalHDBuilder, UtxoFieldsWithHardwareWalletBuilder,
UtxoFieldsWithIguanaSecretBuilder};
use crate::utxo::utxo_builder::{UtxoCoinBuildError, UtxoCoinBuilder, UtxoCoinBuilderCommonOps};
use crate::utxo::{generate_and_send_tx, FeePolicy, GetUtxoListOps, UtxoArc, UtxoCommonOps, UtxoSyncStatusLoopHandle,
UtxoWeak};
use crate::{DerivationMethod, PrivKeyBuildPolicy, UtxoActivationParams};
Expand Down Expand Up @@ -78,21 +76,6 @@ where
fn ticker(&self) -> &str { self.ticker }
}

impl<'a, F, T> UtxoFieldsWithIguanaSecretBuilder for UtxoArcBuilder<'a, 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<'a, F, T> UtxoFieldsWithHardwareWalletBuilder for UtxoArcBuilder<'a, F, T> where
F: Fn(UtxoArc) -> T + Send + Sync + 'static
{
}

#[async_trait]
impl<'a, F, T> UtxoCoinBuilder for UtxoArcBuilder<'a, F, T>
where
Expand Down
Loading
Loading