@@ -11,6 +11,7 @@ use crate::io::sqlite_store::SqliteStore;
1111use crate :: liquidity:: LiquiditySource ;
1212use crate :: logger:: { log_error, log_info, FilesystemLogger , Logger } ;
1313use crate :: message_handler:: NodeCustomMessageHandler ;
14+ use crate :: payjoin_sender:: PayjoinSender ;
1415use crate :: payment:: store:: PaymentStore ;
1516use crate :: peer_store:: PeerStore ;
1617use crate :: tx_broadcaster:: TransactionBroadcaster ;
@@ -94,6 +95,11 @@ struct LiquiditySourceConfig {
9495 lsps2_service : Option < ( SocketAddress , PublicKey , Option < String > ) > ,
9596}
9697
98+ #[ derive( Debug , Clone ) ]
99+ struct PayjoinSenderConfig {
100+ payjoin_relay : payjoin:: Url ,
101+ }
102+
97103impl Default for LiquiditySourceConfig {
98104 fn default ( ) -> Self {
99105 Self { lsps2_service : None }
@@ -173,6 +179,7 @@ pub struct NodeBuilder {
173179 chain_data_source_config : Option < ChainDataSourceConfig > ,
174180 gossip_source_config : Option < GossipSourceConfig > ,
175181 liquidity_source_config : Option < LiquiditySourceConfig > ,
182+ payjoin_sender_config : Option < PayjoinSenderConfig > ,
176183}
177184
178185impl NodeBuilder {
@@ -188,12 +195,14 @@ impl NodeBuilder {
188195 let chain_data_source_config = None ;
189196 let gossip_source_config = None ;
190197 let liquidity_source_config = None ;
198+ let payjoin_sender_config = None ;
191199 Self {
192200 config,
193201 entropy_source_config,
194202 chain_data_source_config,
195203 gossip_source_config,
196204 liquidity_source_config,
205+ payjoin_sender_config,
197206 }
198207 }
199208
@@ -248,6 +257,12 @@ impl NodeBuilder {
248257 self
249258 }
250259
260+ /// Configures the [`Node`] instance to enable sending payjoin transactions.
261+ pub fn set_payjoin_sender_config ( & mut self , payjoin_relay : payjoin:: Url ) -> & mut Self {
262+ self . payjoin_sender_config = Some ( PayjoinSenderConfig { payjoin_relay } ) ;
263+ self
264+ }
265+
251266 /// Configures the [`Node`] instance to source its inbound liquidity from the given
252267 /// [LSPS2](https://github.com/BitcoinAndLightningLayerSpecs/lsp/blob/main/LSPS2/README.md)
253268 /// service.
@@ -369,6 +384,7 @@ impl NodeBuilder {
369384 seed_bytes,
370385 logger,
371386 vss_store,
387+ self . payjoin_sender_config . as_ref ( ) ,
372388 )
373389 }
374390
@@ -390,6 +406,7 @@ impl NodeBuilder {
390406 seed_bytes,
391407 logger,
392408 kv_store,
409+ self . payjoin_sender_config . as_ref ( ) ,
393410 )
394411 }
395412}
@@ -454,6 +471,11 @@ impl ArcedNodeBuilder {
454471 self . inner . write ( ) . unwrap ( ) . set_gossip_source_p2p ( ) ;
455472 }
456473
474+ /// Configures the [`Node`] instance to enable sending payjoin transactions.
475+ pub fn set_payjoin_sender_config ( & self , payjoin_relay : payjoin:: Url ) {
476+ self . inner . write ( ) . unwrap ( ) . set_payjoin_sender_config ( payjoin_relay) ;
477+ }
478+
457479 /// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
458480 /// server.
459481 pub fn set_gossip_source_rgs ( & self , rgs_server_url : String ) {
@@ -524,6 +546,7 @@ fn build_with_store_internal(
524546 gossip_source_config : Option < & GossipSourceConfig > ,
525547 liquidity_source_config : Option < & LiquiditySourceConfig > , seed_bytes : [ u8 ; 64 ] ,
526548 logger : Arc < FilesystemLogger > , kv_store : Arc < DynStore > ,
549+ payjoin_sender_config : Option < & PayjoinSenderConfig > ,
527550) -> Result < Node , BuildError > {
528551 // Initialize the on-chain wallet and chain access
529552 let xprv = bitcoin:: bip32:: ExtendedPrivKey :: new_master ( config. network . into ( ) , & seed_bytes)
@@ -973,6 +996,16 @@ fn build_with_store_internal(
973996 } ;
974997
975998 let ( stop_sender, _) = tokio:: sync:: watch:: channel ( ( ) ) ;
999+ let payjoin_sender = if let Some ( payjoin_sender_config) = payjoin_sender_config {
1000+ let payjoin_sender = PayjoinSender :: new (
1001+ Arc :: clone ( & logger) ,
1002+ Arc :: clone ( & wallet) ,
1003+ & payjoin_sender_config. payjoin_relay ,
1004+ ) ;
1005+ Some ( Arc :: new ( payjoin_sender) )
1006+ } else {
1007+ None
1008+ } ;
9761009
9771010 let is_listening = Arc :: new ( AtomicBool :: new ( false ) ) ;
9781011 let latest_wallet_sync_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
@@ -993,6 +1026,7 @@ fn build_with_store_internal(
9931026 channel_manager,
9941027 chain_monitor,
9951028 output_sweeper,
1029+ payjoin_sender,
9961030 peer_manager,
9971031 connection_manager,
9981032 keys_manager,
0 commit comments