diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index 3fb82a91..ecf2c414 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -4,6 +4,7 @@ use crate::env; use crate::env::GetConfig; use anyhow::{bail, Result}; use bitcoin::Address; +use libp2p::Multiaddr; use serde::Serialize; use std::ffi::OsString; use std::path::PathBuf; @@ -24,12 +25,18 @@ where let command: RawCommand = args.cmd; let arguments = match command { - RawCommand::Start { resume_only } => Arguments { + RawCommand::Start { + resume_only, + external_addr, + } => Arguments { testnet: is_testnet, json: is_json, config_path: config_path(config, is_testnet)?, env_config: env_config(is_testnet), - cmd: Command::Start { resume_only }, + cmd: Command::Start { + resume_only, + external_addr, + }, }, RawCommand::History => Arguments { testnet: is_testnet, @@ -167,6 +174,7 @@ pub struct Arguments { pub enum Command { Start { resume_only: bool, + external_addr: Option, }, History, WithdrawBtc { @@ -234,6 +242,11 @@ 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( + long = "external-addr", + help = "Our external address to be used when registering our service with a rendezvous node" + )] + external_addr: Option, }, #[structopt(about = "Prints swap-id and the state of each swap ever made.")] History, @@ -338,7 +351,10 @@ mod tests { json: false, config_path: default_mainnet_conf_path.clone(), env_config: mainnet_env_config, - cmd: Command::Start { resume_only: false }, + cmd: Command::Start { + resume_only: false, + external_addr: None, + }, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); @@ -475,7 +491,10 @@ mod tests { json: false, config_path: default_testnet_conf_path.clone(), env_config: testnet_env_config, - cmd: Command::Start { resume_only: false }, + cmd: Command::Start { + resume_only: false, + external_addr: None, + }, }; 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 bcc461a0..1ab88873 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -107,7 +107,10 @@ 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, + external_addr, + } => { let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; let monero_wallet = init_monero_wallet(&config, env_config).await?; @@ -163,14 +166,19 @@ async fn main() -> Result<()> { tracing::info!(peer_id = %swarm.local_peer_id(), "Network layer initialized"); - Swarm::dial_addr(&mut swarm, config.rendezvous_node.addr.clone()).with_context( - || { - format!( - "Failed to dial rendezvous node addr {}", - config.rendezvous_node.addr - ) - }, - )?; + // todo: Option is being used as a rendezvous feature toggle. + // The fact that rendezvous is an optional feature could be expressed better. + if let Some(addr) = external_addr { + let _ = Swarm::add_external_address(&mut swarm, addr, AddressScore::Infinite); + Swarm::dial_addr(&mut swarm, config.rendezvous_node.addr.clone()).with_context( + || { + format!( + "Failed to dial rendezvous node addr {}", + config.rendezvous_node.addr + ) + }, + )?; + } let namespace = if testnet { XmrBtcNamespace::Testnet