From 5718571deb6ae8b4d7755210bddc539e4e2f039e Mon Sep 17 00:00:00 2001 From: pokkst Date: Fri, 4 Aug 2023 18:24:44 -0500 Subject: [PATCH 1/8] Allow registering to Rendezvous over Tor; works with onion addresses. --- swap/src/asb/command.rs | 28 +++++++++++++++++++++++----- swap/src/asb/network.rs | 14 ++++++++++++-- swap/src/bin/asb.rs | 9 +++++++-- swap/src/network/swarm.rs | 10 ++++++++-- 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index 6831e595..4087f536 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -10,6 +10,8 @@ use std::path::PathBuf; use structopt::StructOpt; use uuid::Uuid; +const DEFAULT_TOR_SOCKS5_PORT: &str = "9050"; + pub fn parse_args(raw_args: I) -> Result where I: IntoIterator, @@ -25,13 +27,16 @@ where let command: RawCommand = args.cmd; let arguments = match command { - RawCommand::Start { resume_only } => Arguments { + RawCommand::Start { + resume_only, + tor: Tor { tor_socks5_port }, + } => Arguments { testnet, json, disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), - cmd: Command::Start { resume_only }, + cmd: Command::Start { resume_only, tor_socks5_port }, }, RawCommand::History => Arguments { testnet, @@ -194,6 +199,7 @@ pub struct Arguments { pub enum Command { Start { resume_only: bool, + tor_socks5_port: u16, }, History, Config, @@ -267,6 +273,8 @@ pub enum RawCommand { help = "For maintenance only. When set, no new swap requests will be accepted, but existing unfinished swaps will be resumed." )] resume_only: bool, + #[structopt(flatten)] + tor: Tor, }, #[structopt(about = "Prints swap-id and the state of each swap ever made.")] History, @@ -347,6 +355,16 @@ pub struct RecoverCommandParams { pub swap_id: Uuid, } +#[derive(structopt::StructOpt, Debug)] +pub struct Tor { + #[structopt( + long = "tor-socks5-port", + help = "Your local Tor socks5 proxy port", + default_value = DEFAULT_TOR_SOCKS5_PORT + )] + tor_socks5_port: u16, +} + #[cfg(test)] mod tests { use super::*; @@ -369,7 +387,7 @@ mod tests { disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, - cmd: Command::Start { resume_only: false }, + cmd: Command::Start { resume_only: false, tor_socks5_port: 0u16 }, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); @@ -552,7 +570,7 @@ mod tests { disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, - cmd: Command::Start { resume_only: false }, + cmd: Command::Start { resume_only: false, tor_socks5_port: 0u16 }, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); @@ -740,7 +758,7 @@ mod tests { disable_timestamp: true, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, - cmd: Command::Start { resume_only: false }, + cmd: Command::Start { resume_only: false, tor_socks5_port: 0u16 }, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); diff --git a/swap/src/asb/network.rs b/swap/src/asb/network.rs index 181ec9bc..633418b1 100644 --- a/swap/src/asb/network.rs +++ b/swap/src/asb/network.rs @@ -29,15 +29,25 @@ use std::time::Duration; use uuid::Uuid; pub mod transport { + use libp2p::core::transport::OptionalTransport; + use crate::network::tor_transport::TorDialOnlyTransport; use super::*; /// Creates the libp2p transport for the ASB. - pub fn new(identity: &identity::Keypair) -> Result> { + pub fn new( + identity: &identity::Keypair, + maybe_tor_socks5_port: Option, + ) -> Result> { let tcp = TokioTcpConfig::new().nodelay(true); let tcp_with_dns = TokioDnsConfig::system(tcp)?; let websocket_with_dns = WsConfig::new(tcp_with_dns.clone()); - let transport = tcp_with_dns.or_transport(websocket_with_dns).boxed(); + let maybe_tor_transport = match maybe_tor_socks5_port { + Some(port) => OptionalTransport::some(TorDialOnlyTransport::new(port)), + None => OptionalTransport::none(), + }; + + let transport = maybe_tor_transport.or_transport(tcp_with_dns).or_transport(websocket_with_dns).boxed(); authenticate_and_multiplex(transport, identity) } diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index ff3b0e4c..b7b2b83e 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -101,7 +101,11 @@ async fn main() -> Result<()> { Seed::from_file_or_generate(&config.data.dir).expect("Could not retrieve/initialize seed"); match cmd { - Command::Start { resume_only } => { + Command::Start { + resume_only, + tor_socks5_port + } => { + tracing::info!(%tor_socks5_port, "Tor info"); // check and warn for duplicate rendezvous points let mut rendezvous_addrs = config.network.rendezvous_point.clone(); let prev_len = rendezvous_addrs.len(); @@ -175,7 +179,8 @@ async fn main() -> Result<()> { env_config, namespace, &rendezvous_addrs, - )?; + tor_socks5_port + ).await?; for listen in config.network.listen.clone() { Swarm::listen_on(&mut swarm, listen.clone()) diff --git a/swap/src/network/swarm.rs b/swap/src/network/swarm.rs index 37bb0a5e..6229f15d 100644 --- a/swap/src/network/swarm.rs +++ b/swap/src/network/swarm.rs @@ -9,7 +9,7 @@ use libp2p::{identity, Multiaddr, Swarm}; use std::fmt::Debug; #[allow(clippy::too_many_arguments)] -pub fn asb( +pub async fn asb( seed: &Seed, min_buy: bitcoin::Amount, max_buy: bitcoin::Amount, @@ -18,10 +18,16 @@ pub fn asb( env_config: env::Config, namespace: XmrBtcNamespace, rendezvous_addrs: &[Multiaddr], + tor_socks5_port: u16 ) -> Result>> where LR: LatestRate + Send + 'static + Debug + Clone, { + let maybe_tor_socks5_port = match tor::Client::new(tor_socks5_port).assert_tor_running().await { + Ok(()) => Some(tor_socks5_port), + Err(_) => None, + }; + let identity = seed.derive_libp2p_identity(); let rendezvous_nodes = rendezvous_addrs @@ -45,7 +51,7 @@ where rendezvous_nodes, ); - let transport = asb::transport::new(&identity)?; + let transport = asb::transport::new(&identity, maybe_tor_socks5_port)?; let peer_id = identity.public().into(); let swarm = SwarmBuilder::new(transport, behaviour, peer_id) From 9b81d308710986a2d3d46467be7448c5ee6e64c5 Mon Sep 17 00:00:00 2001 From: pokkst Date: Sat, 5 Aug 2023 02:44:51 -0500 Subject: [PATCH 2/8] Remove tor_socks5_port option and use config port --- swap/src/asb/command.rs | 30 +++++++----------------------- swap/src/bin/asb.rs | 9 +++++---- 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index 4087f536..0ecb3384 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -10,8 +10,6 @@ use std::path::PathBuf; use structopt::StructOpt; use uuid::Uuid; -const DEFAULT_TOR_SOCKS5_PORT: &str = "9050"; - pub fn parse_args(raw_args: I) -> Result where I: IntoIterator, @@ -28,15 +26,14 @@ where let arguments = match command { RawCommand::Start { - resume_only, - tor: Tor { tor_socks5_port }, + resume_only } => Arguments { testnet, json, disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), - cmd: Command::Start { resume_only, tor_socks5_port }, + cmd: Command::Start { resume_only }, }, RawCommand::History => Arguments { testnet, @@ -198,8 +195,7 @@ pub struct Arguments { #[derive(Debug, PartialEq, Eq)] pub enum Command { Start { - resume_only: bool, - tor_socks5_port: u16, + resume_only: bool }, History, Config, @@ -272,9 +268,7 @@ pub enum RawCommand { long = "resume-only", help = "For maintenance only. When set, no new swap requests will be accepted, but existing unfinished swaps will be resumed." )] - resume_only: bool, - #[structopt(flatten)] - tor: Tor, + resume_only: bool }, #[structopt(about = "Prints swap-id and the state of each swap ever made.")] History, @@ -355,16 +349,6 @@ pub struct RecoverCommandParams { pub swap_id: Uuid, } -#[derive(structopt::StructOpt, Debug)] -pub struct Tor { - #[structopt( - long = "tor-socks5-port", - help = "Your local Tor socks5 proxy port", - default_value = DEFAULT_TOR_SOCKS5_PORT - )] - tor_socks5_port: u16, -} - #[cfg(test)] mod tests { use super::*; @@ -387,7 +371,7 @@ mod tests { disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, - cmd: Command::Start { resume_only: false, tor_socks5_port: 0u16 }, + cmd: Command::Start { resume_only: false }, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); @@ -570,7 +554,7 @@ mod tests { disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, - cmd: Command::Start { resume_only: false, tor_socks5_port: 0u16 }, + cmd: Command::Start { resume_only: false }, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); @@ -758,7 +742,7 @@ mod tests { disable_timestamp: true, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, - cmd: Command::Start { resume_only: false, tor_socks5_port: 0u16 }, + cmd: Command::Start { resume_only: false }, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index b7b2b83e..e3841006 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -102,10 +102,8 @@ async fn main() -> Result<()> { match cmd { Command::Start { - resume_only, - tor_socks5_port + resume_only } => { - tracing::info!(%tor_socks5_port, "Tor info"); // check and warn for duplicate rendezvous points let mut rendezvous_addrs = config.network.rendezvous_point.clone(); let prev_len = rendezvous_addrs.len(); @@ -167,6 +165,9 @@ async fn main() -> Result<()> { } }; + let proxy_port = if _ac.is_some() { config.tor.socks5_port } else { 0u16 }; + tracing::info!(%proxy_port, "SOCKS5"); + let kraken_rate = KrakenRate::new(config.maker.ask_spread, kraken_price_updates); let namespace = XmrBtcNamespace::from_is_testnet(testnet); @@ -179,7 +180,7 @@ async fn main() -> Result<()> { env_config, namespace, &rendezvous_addrs, - tor_socks5_port + proxy_port ).await?; for listen in config.network.listen.clone() { From 4fa0f3525da64a1bf9fd3e21c9f07d13b6077b7d Mon Sep 17 00:00:00 2001 From: pokkst Date: Sat, 5 Aug 2023 02:49:40 -0500 Subject: [PATCH 3/8] Remove now-unnecessary changes --- swap/src/asb/command.rs | 4 +--- swap/src/bin/asb.rs | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index 0ecb3384..2414eba2 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -25,9 +25,7 @@ where let command: RawCommand = args.cmd; let arguments = match command { - RawCommand::Start { - resume_only - } => Arguments { + RawCommand::Start { resume_only } => Arguments { testnet, json, disable_timestamp, diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index e3841006..78a2824f 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -101,9 +101,7 @@ async fn main() -> Result<()> { Seed::from_file_or_generate(&config.data.dir).expect("Could not retrieve/initialize seed"); match cmd { - Command::Start { - resume_only - } => { + Command::Start { resume_only } => { // check and warn for duplicate rendezvous points let mut rendezvous_addrs = config.network.rendezvous_point.clone(); let prev_len = rendezvous_addrs.len(); From f02c7712fb14afb89a1c5639b7c08b543178b29c Mon Sep 17 00:00:00 2001 From: pokkst Date: Sat, 5 Aug 2023 10:32:16 -0500 Subject: [PATCH 4/8] Use Tor for Electrum client when Tor is running --- swap/src/bin/asb.rs | 59 +++++++++++++++++++------------------- swap/src/bin/swap.rs | 1 + swap/src/bitcoin/wallet.rs | 18 ++++++++---- 3 files changed, 43 insertions(+), 35 deletions(-) diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index 78a2824f..d76d7a8b 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -100,6 +100,25 @@ async fn main() -> Result<()> { let seed = Seed::from_file_or_generate(&config.data.dir).expect("Could not retrieve/initialize seed"); + let tor_client = + tor::Client::new(config.tor.socks5_port).with_control_port(config.tor.control_port); + let _ac = match tor_client.assert_tor_running().await { + Ok(_) => { + tracing::info!("Setting up Tor hidden service"); + let ac = + register_tor_services(config.network.clone().listen, tor_client, &seed) + .await?; + Some(ac) + } + Err(_) => { + tracing::warn!("Tor not found. Running on clear net"); + None + } + }; + let tor_port = if _ac.is_some() { config.tor.socks5_port } else { 0u16 }; + let proxy_string = if tor_port != 0u16 { format!("127.0.0.1:{}", tor_port) } else { "".to_string() }; + tracing::info!(%proxy_string, "SOCKS5"); + match cmd { Command::Start { resume_only } => { // check and warn for duplicate rendezvous points @@ -140,32 +159,12 @@ async fn main() -> Result<()> { } } - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let bitcoin_balance = bitcoin_wallet.balance().await?; tracing::info!(%bitcoin_balance, "Bitcoin wallet balance"); let kraken_price_updates = kraken::connect(config.maker.price_ticker_ws_url.clone())?; - // setup Tor hidden services - let tor_client = - tor::Client::new(config.tor.socks5_port).with_control_port(config.tor.control_port); - let _ac = match tor_client.assert_tor_running().await { - Ok(_) => { - tracing::info!("Setting up Tor hidden service"); - let ac = - register_tor_services(config.network.clone().listen, tor_client, &seed) - .await?; - Some(ac) - } - Err(_) => { - tracing::warn!("Tor not found. Running on clear net"); - None - } - }; - - let proxy_port = if _ac.is_some() { config.tor.socks5_port } else { 0u16 }; - tracing::info!(%proxy_port, "SOCKS5"); - let kraken_rate = KrakenRate::new(config.maker.ask_spread, kraken_price_updates); let namespace = XmrBtcNamespace::from_is_testnet(testnet); @@ -178,7 +177,7 @@ async fn main() -> Result<()> { env_config, namespace, &rendezvous_addrs, - proxy_port + tor_port ).await?; for listen in config.network.listen.clone() { @@ -245,7 +244,7 @@ async fn main() -> Result<()> { println!("{}", config_json); } Command::WithdrawBtc { amount, address } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let amount = match amount { Some(amount) => amount, @@ -268,20 +267,20 @@ async fn main() -> Result<()> { let monero_balance = monero_wallet.get_balance().await?; tracing::info!(%monero_balance); - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let bitcoin_balance = bitcoin_wallet.balance().await?; tracing::info!(%bitcoin_balance); tracing::info!(%bitcoin_balance, %monero_balance, "Current balance"); } Command::Cancel { swap_id } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let (txid, _) = cancel(swap_id, Arc::new(bitcoin_wallet), db).await?; tracing::info!("Cancel transaction successfully published with id {}", txid); } Command::Refund { swap_id } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let monero_wallet = init_monero_wallet(&config, env_config).await?; refund( @@ -295,7 +294,7 @@ async fn main() -> Result<()> { tracing::info!("Monero successfully refunded"); } Command::Punish { swap_id } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let (txid, _) = punish(swap_id, Arc::new(bitcoin_wallet), db).await?; @@ -310,7 +309,7 @@ async fn main() -> Result<()> { swap_id, do_not_await_finality, } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let (txid, _) = redeem( swap_id, @@ -323,7 +322,7 @@ async fn main() -> Result<()> { tracing::info!("Redeem transaction successfully published with id {}", txid); } Command::ExportBitcoinWallet => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; + let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let wallet_export = bitcoin_wallet.wallet_export("asb").await?; println!("{}", wallet_export.to_string()) } @@ -336,11 +335,13 @@ async fn init_bitcoin_wallet( config: &Config, seed: &Seed, env_config: swap::env::Config, + proxy_string: String, ) -> Result { tracing::debug!("Opening Bitcoin wallet"); let data_dir = &config.data.dir; let wallet = bitcoin::Wallet::new( config.bitcoin.electrum_rpc_url.clone(), + proxy_string.as_str(), data_dir, seed.derive_extended_private_key(env_config.bitcoin_network)?, env_config, diff --git a/swap/src/bin/swap.rs b/swap/src/bin/swap.rs index 33c718c3..41a498f7 100644 --- a/swap/src/bin/swap.rs +++ b/swap/src/bin/swap.rs @@ -505,6 +505,7 @@ async fn init_bitcoin_wallet( let wallet = bitcoin::Wallet::new( electrum_rpc_url.clone(), + "", data_dir, xprivkey, env_config, diff --git a/swap/src/bitcoin/wallet.rs b/swap/src/bitcoin/wallet.rs index 9a8500b6..a13984c9 100644 --- a/swap/src/bitcoin/wallet.rs +++ b/swap/src/bitcoin/wallet.rs @@ -6,7 +6,7 @@ use ::bitcoin::Txid; use anyhow::{bail, Context, Result}; use bdk::blockchain::{Blockchain, ElectrumBlockchain, GetTx}; use bdk::database::BatchDatabase; -use bdk::electrum_client::{ElectrumApi, GetHistoryRes}; +use bdk::electrum_client::{ElectrumApi, GetHistoryRes, Socks5Config}; use bdk::sled::Tree; use bdk::wallet::export::FullyNodedExport; use bdk::wallet::AddressIndex; @@ -20,6 +20,7 @@ use rust_decimal_macros::dec; use std::collections::{BTreeMap, HashMap}; use std::convert::TryFrom; use std::fmt; +use std::ops::Not; use std::path::Path; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -47,6 +48,7 @@ pub struct Wallet { impl Wallet { pub async fn new( electrum_rpc_url: Url, + electrum_socks5_proxy_string: &str, data_dir: impl AsRef, xprivkey: ExtendedPrivKey, env_config: env::Config, @@ -70,7 +72,7 @@ impl Wallet { err => err?, }; - let client = Client::new(electrum_rpc_url, env_config.bitcoin_sync_interval())?; + let client = Client::new(electrum_rpc_url, electrum_socks5_proxy_string, env_config.bitcoin_sync_interval())?; let network = wallet.network(); @@ -723,10 +725,14 @@ pub struct Client { } impl Client { - fn new(electrum_rpc_url: Url, interval: Duration) -> Result { - let config = bdk::electrum_client::ConfigBuilder::default() - .retry(5) - .build(); + fn new(electrum_rpc_url: Url, electrum_socks5_proxy_string: &str, interval: Duration) -> Result { + let mut config_builder = bdk::electrum_client::ConfigBuilder::default() + .retry(5); + if electrum_socks5_proxy_string.is_empty().not() { + config_builder = config_builder + .socks5(Option::from(Socks5Config::new(electrum_socks5_proxy_string.to_string()))).unwrap() // use Tor with the Electrum client + } + let config = config_builder.build(); let electrum = bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config) .context("Failed to initialize Electrum RPC client")?; // Initially fetch the latest block for storing the height. From cfaf9ee257a964118c544d1d7dbc575481d04691 Mon Sep 17 00:00:00 2001 From: pokkst Date: Sat, 5 Aug 2023 10:38:02 -0500 Subject: [PATCH 5/8] Ensure ElectrumBlockchain client also uses config --- swap/src/bitcoin/wallet.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swap/src/bitcoin/wallet.rs b/swap/src/bitcoin/wallet.rs index a13984c9..79e53355 100644 --- a/swap/src/bitcoin/wallet.rs +++ b/swap/src/bitcoin/wallet.rs @@ -733,7 +733,7 @@ impl Client { .socks5(Option::from(Socks5Config::new(electrum_socks5_proxy_string.to_string()))).unwrap() // use Tor with the Electrum client } let config = config_builder.build(); - let electrum = bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config) + let electrum = bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config.clone()) .context("Failed to initialize Electrum RPC client")?; // Initially fetch the latest block for storing the height. // We do not act on this subscription after this call. @@ -741,7 +741,7 @@ impl Client { .block_headers_subscribe() .context("Failed to subscribe to header notifications")?; - let client = bdk::electrum_client::Client::new(electrum_rpc_url.as_str()) + let client = bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config.clone()) .context("Failed to initialize Electrum RPC client")?; let blockchain = ElectrumBlockchain::from(client); let last_sync = Instant::now() From 7e5e34f239b7997be719159e6ccbba37ea41e17e Mon Sep 17 00:00:00 2001 From: pokkst Date: Sat, 5 Aug 2023 13:01:41 -0500 Subject: [PATCH 6/8] More descriptive log message --- swap/src/bin/asb.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index d76d7a8b..d10a2a76 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -117,7 +117,8 @@ async fn main() -> Result<()> { }; let tor_port = if _ac.is_some() { config.tor.socks5_port } else { 0u16 }; let proxy_string = if tor_port != 0u16 { format!("127.0.0.1:{}", tor_port) } else { "".to_string() }; - tracing::info!(%proxy_string, "SOCKS5"); + let info_message = if proxy_string.is_empty() { "Not using SOCKS5 proxy" } else { "Using SOCKS5 proxy at" }; + tracing::info!(%proxy_string, info_message); match cmd { Command::Start { resume_only } => { From f0c5883b50e8a0df3effcb8004f6695393343d66 Mon Sep 17 00:00:00 2001 From: pokkst Date: Sat, 5 Aug 2023 13:04:28 -0500 Subject: [PATCH 7/8] Fix more descriptive log message --- swap/src/bin/asb.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index d10a2a76..5a4a4333 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -117,8 +117,11 @@ async fn main() -> Result<()> { }; let tor_port = if _ac.is_some() { config.tor.socks5_port } else { 0u16 }; let proxy_string = if tor_port != 0u16 { format!("127.0.0.1:{}", tor_port) } else { "".to_string() }; - let info_message = if proxy_string.is_empty() { "Not using SOCKS5 proxy" } else { "Using SOCKS5 proxy at" }; - tracing::info!(%proxy_string, info_message); + if proxy_string.is_empty() { + tracing::info!(%proxy_string, "Not using SOCKS5 proxy"); + } else { + tracing::info!(%proxy_string, "Using SOCKS5 proxy at"); + } match cmd { Command::Start { resume_only } => { From 82cbea49186b3c39463ca0aa14879498a67b5171 Mon Sep 17 00:00:00 2001 From: Byron Hambly Date: Mon, 18 Dec 2023 15:14:46 +0200 Subject: [PATCH 8/8] chore: cargo fmt --- swap/src/asb/command.rs | 4 ++-- swap/src/asb/network.rs | 9 +++++--- swap/src/bin/asb.rs | 44 ++++++++++++++++++++++++++------------ swap/src/bitcoin/wallet.rs | 30 ++++++++++++++++++-------- swap/src/network/swarm.rs | 2 +- 5 files changed, 60 insertions(+), 29 deletions(-) diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index 2414eba2..6831e595 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -193,7 +193,7 @@ pub struct Arguments { #[derive(Debug, PartialEq, Eq)] pub enum Command { Start { - resume_only: bool + resume_only: bool, }, History, Config, @@ -266,7 +266,7 @@ pub enum RawCommand { long = "resume-only", help = "For maintenance only. When set, no new swap requests will be accepted, but existing unfinished swaps will be resumed." )] - resume_only: bool + resume_only: bool, }, #[structopt(about = "Prints swap-id and the state of each swap ever made.")] History, diff --git a/swap/src/asb/network.rs b/swap/src/asb/network.rs index 633418b1..b2a680a4 100644 --- a/swap/src/asb/network.rs +++ b/swap/src/asb/network.rs @@ -29,9 +29,9 @@ use std::time::Duration; use uuid::Uuid; pub mod transport { - use libp2p::core::transport::OptionalTransport; - use crate::network::tor_transport::TorDialOnlyTransport; use super::*; + use crate::network::tor_transport::TorDialOnlyTransport; + use libp2p::core::transport::OptionalTransport; /// Creates the libp2p transport for the ASB. pub fn new( @@ -47,7 +47,10 @@ pub mod transport { None => OptionalTransport::none(), }; - let transport = maybe_tor_transport.or_transport(tcp_with_dns).or_transport(websocket_with_dns).boxed(); + let transport = maybe_tor_transport + .or_transport(tcp_with_dns) + .or_transport(websocket_with_dns) + .boxed(); authenticate_and_multiplex(transport, identity) } diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index 5a4a4333..0510191f 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -106,8 +106,7 @@ async fn main() -> Result<()> { Ok(_) => { tracing::info!("Setting up Tor hidden service"); let ac = - register_tor_services(config.network.clone().listen, tor_client, &seed) - .await?; + register_tor_services(config.network.clone().listen, tor_client, &seed).await?; Some(ac) } Err(_) => { @@ -115,8 +114,16 @@ async fn main() -> Result<()> { None } }; - let tor_port = if _ac.is_some() { config.tor.socks5_port } else { 0u16 }; - let proxy_string = if tor_port != 0u16 { format!("127.0.0.1:{}", tor_port) } else { "".to_string() }; + let tor_port = if _ac.is_some() { + config.tor.socks5_port + } else { + 0u16 + }; + let proxy_string = if tor_port != 0u16 { + format!("127.0.0.1:{}", tor_port) + } else { + "".to_string() + }; if proxy_string.is_empty() { tracing::info!(%proxy_string, "Not using SOCKS5 proxy"); } else { @@ -163,7 +170,8 @@ async fn main() -> Result<()> { } } - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let bitcoin_balance = bitcoin_wallet.balance().await?; tracing::info!(%bitcoin_balance, "Bitcoin wallet balance"); @@ -181,8 +189,9 @@ async fn main() -> Result<()> { env_config, namespace, &rendezvous_addrs, - tor_port - ).await?; + tor_port, + ) + .await?; for listen in config.network.listen.clone() { Swarm::listen_on(&mut swarm, listen.clone()) @@ -248,7 +257,8 @@ async fn main() -> Result<()> { println!("{}", config_json); } Command::WithdrawBtc { amount, address } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let amount = match amount { Some(amount) => amount, @@ -271,20 +281,23 @@ async fn main() -> Result<()> { let monero_balance = monero_wallet.get_balance().await?; tracing::info!(%monero_balance); - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let bitcoin_balance = bitcoin_wallet.balance().await?; tracing::info!(%bitcoin_balance); tracing::info!(%bitcoin_balance, %monero_balance, "Current balance"); } Command::Cancel { swap_id } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let (txid, _) = cancel(swap_id, Arc::new(bitcoin_wallet), db).await?; tracing::info!("Cancel transaction successfully published with id {}", txid); } Command::Refund { swap_id } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let monero_wallet = init_monero_wallet(&config, env_config).await?; refund( @@ -298,7 +311,8 @@ async fn main() -> Result<()> { tracing::info!("Monero successfully refunded"); } Command::Punish { swap_id } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let (txid, _) = punish(swap_id, Arc::new(bitcoin_wallet), db).await?; @@ -313,7 +327,8 @@ async fn main() -> Result<()> { swap_id, do_not_await_finality, } => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let (txid, _) = redeem( swap_id, @@ -326,7 +341,8 @@ async fn main() -> Result<()> { tracing::info!("Redeem transaction successfully published with id {}", txid); } Command::ExportBitcoinWallet => { - let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; + let bitcoin_wallet = + init_bitcoin_wallet(&config, &seed, env_config, proxy_string).await?; let wallet_export = bitcoin_wallet.wallet_export("asb").await?; println!("{}", wallet_export.to_string()) } diff --git a/swap/src/bitcoin/wallet.rs b/swap/src/bitcoin/wallet.rs index c8032508..14f9f33d 100644 --- a/swap/src/bitcoin/wallet.rs +++ b/swap/src/bitcoin/wallet.rs @@ -72,7 +72,11 @@ impl Wallet { err => err?, }; - let client = Client::new(electrum_rpc_url, electrum_socks5_proxy_string, env_config.bitcoin_sync_interval())?; + let client = Client::new( + electrum_rpc_url, + electrum_socks5_proxy_string, + env_config.bitcoin_sync_interval(), + )?; let network = wallet.network(); @@ -725,24 +729,32 @@ pub struct Client { } impl Client { - fn new(electrum_rpc_url: Url, electrum_socks5_proxy_string: &str, interval: Duration) -> Result { - let mut config_builder = bdk::electrum_client::ConfigBuilder::default() - .retry(5); + fn new( + electrum_rpc_url: Url, + electrum_socks5_proxy_string: &str, + interval: Duration, + ) -> Result { + let mut config_builder = bdk::electrum_client::ConfigBuilder::default().retry(5); if electrum_socks5_proxy_string.is_empty().not() { config_builder = config_builder - .socks5(Option::from(Socks5Config::new(electrum_socks5_proxy_string.to_string()))).unwrap() // use Tor with the Electrum client + .socks5(Option::from(Socks5Config::new( + electrum_socks5_proxy_string.to_string(), + ))) + .unwrap() // use Tor with the Electrum client } let config = config_builder.build(); - let electrum = bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config.clone()) - .context("Failed to initialize Electrum RPC client")?; + let electrum = + bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config.clone()) + .context("Failed to initialize Electrum RPC client")?; // Initially fetch the latest block for storing the height. // We do not act on this subscription after this call. let latest_block = electrum .block_headers_subscribe() .context("Failed to subscribe to header notifications")?; - let client = bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config.clone()) - .context("Failed to initialize Electrum RPC client")?; + let client = + bdk::electrum_client::Client::from_config(electrum_rpc_url.as_str(), config.clone()) + .context("Failed to initialize Electrum RPC client")?; let blockchain = ElectrumBlockchain::from(client); let last_sync = Instant::now() .checked_sub(interval) diff --git a/swap/src/network/swarm.rs b/swap/src/network/swarm.rs index 6229f15d..48d0595c 100644 --- a/swap/src/network/swarm.rs +++ b/swap/src/network/swarm.rs @@ -18,7 +18,7 @@ pub async fn asb( env_config: env::Config, namespace: XmrBtcNamespace, rendezvous_addrs: &[Multiaddr], - tor_socks5_port: u16 + tor_socks5_port: u16, ) -> Result>> where LR: LatestRate + Send + 'static + Debug + Clone,