diff --git a/swap/src/asb/event_loop.rs b/swap/src/asb/event_loop.rs index 81a3d009..d3f81f45 100644 --- a/swap/src/asb/event_loop.rs +++ b/swap/src/asb/event_loop.rs @@ -14,7 +14,7 @@ use futures::stream::{FuturesUnordered, StreamExt}; use libp2p::rendezvous::Namespace; use libp2p::request_response::{RequestId, ResponseChannel}; use libp2p::swarm::SwarmEvent; -use libp2p::{PeerId, Swarm}; +use libp2p::{Multiaddr, PeerId, Swarm}; use rust_decimal::Decimal; use std::collections::HashMap; use std::convert::Infallible; @@ -68,6 +68,7 @@ where // separate swarm? There is no dependency between swap and registration, so we could just // build this completely separate. rendezvous_node_peer_id: PeerId, + rendezvous_node_addr: Multiaddr, rendezvous_namespace: XmrBtcNamespace, rendezvous_reregister_timestamp: Option, } @@ -87,6 +88,7 @@ where min_buy: bitcoin::Amount, max_buy: bitcoin::Amount, rendezvous_node_peer_id: PeerId, + rendezvous_node_addr: Multiaddr, rendezvous_namespace: XmrBtcNamespace, ) -> Result<(Self, mpsc::Receiver)> { let swap_channel = MpscChannels::default(); @@ -107,6 +109,7 @@ where buffered_transfer_proofs: Default::default(), inflight_transfer_proofs: Default::default(), rendezvous_node_peer_id, + rendezvous_node_addr, rendezvous_namespace, rendezvous_reregister_timestamp: None, }; @@ -162,6 +165,38 @@ where } loop { + // rendezvous node re-registration + if let Some(rendezvous_reregister_timestamp) = self.rendezvous_reregister_timestamp { + if Instant::now() > rendezvous_reregister_timestamp { + if self.swarm.is_connected(&self.rendezvous_node_peer_id) { + match self.swarm.behaviour_mut().rendezvous.register( + Namespace::new(self.rendezvous_namespace.to_string()) + .expect("our namespace to be a correct string"), + self.rendezvous_node_peer_id, + None, + ) { + Ok(()) => {} + Err(err) => { + tracing::error!( + "Sending registration to rendezvous failed: {:#}", + err + ); + } + } + } else { + match Swarm::dial_addr(&mut self.swarm, self.rendezvous_node_addr.clone()) { + Ok(()) => {} + Err(error) => { + tracing::error!( + "Failed to redial rendezvous node for re-registration: {:#}", + error + ); + } + } + } + } + } + tokio::select! { swarm_event = self.swarm.next() => { match swarm_event { diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index 771a0cb7..bcc461a0 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -188,6 +188,7 @@ async fn main() -> Result<()> { config.maker.min_buy_btc, config.maker.max_buy_btc, config.rendezvous_node.peer_id, + config.rendezvous_node.addr, namespace, ) .unwrap(); diff --git a/swap/tests/harness/mod.rs b/swap/tests/harness/mod.rs index 6c9d0867..d08e9c88 100644 --- a/swap/tests/harness/mod.rs +++ b/swap/tests/harness/mod.rs @@ -251,6 +251,7 @@ async fn start_alice( min_buy, max_buy, PeerId::random(), + Multiaddr::empty(), XmrBtcNamespace::Testnet, ) .unwrap();