@@ -11,6 +11,7 @@ use crate::io::sqlite_store::SqliteStore;
11
11
use crate :: liquidity:: LiquiditySource ;
12
12
use crate :: logger:: { log_error, log_info, FilesystemLogger , Logger } ;
13
13
use crate :: message_handler:: NodeCustomMessageHandler ;
14
+ use crate :: payjoin_sender:: PayjoinSender ;
14
15
use crate :: payment:: store:: PaymentStore ;
15
16
use crate :: peer_store:: PeerStore ;
16
17
use crate :: tx_broadcaster:: TransactionBroadcaster ;
@@ -94,6 +95,11 @@ struct LiquiditySourceConfig {
94
95
lsps2_service : Option < ( SocketAddress , PublicKey , Option < String > ) > ,
95
96
}
96
97
98
+ #[ derive( Debug , Clone ) ]
99
+ struct PayjoinSenderConfig {
100
+ payjoin_relay : payjoin:: Url ,
101
+ }
102
+
97
103
impl Default for LiquiditySourceConfig {
98
104
fn default ( ) -> Self {
99
105
Self { lsps2_service : None }
@@ -173,6 +179,7 @@ pub struct NodeBuilder {
173
179
chain_data_source_config : Option < ChainDataSourceConfig > ,
174
180
gossip_source_config : Option < GossipSourceConfig > ,
175
181
liquidity_source_config : Option < LiquiditySourceConfig > ,
182
+ payjoin_sender_config : Option < PayjoinSenderConfig > ,
176
183
}
177
184
178
185
impl NodeBuilder {
@@ -188,12 +195,14 @@ impl NodeBuilder {
188
195
let chain_data_source_config = None ;
189
196
let gossip_source_config = None ;
190
197
let liquidity_source_config = None ;
198
+ let payjoin_sender_config = None ;
191
199
Self {
192
200
config,
193
201
entropy_source_config,
194
202
chain_data_source_config,
195
203
gossip_source_config,
196
204
liquidity_source_config,
205
+ payjoin_sender_config,
197
206
}
198
207
}
199
208
@@ -248,6 +257,12 @@ impl NodeBuilder {
248
257
self
249
258
}
250
259
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
+
251
266
/// Configures the [`Node`] instance to source its inbound liquidity from the given
252
267
/// [LSPS2](https://github.com/BitcoinAndLightningLayerSpecs/lsp/blob/main/LSPS2/README.md)
253
268
/// service.
@@ -369,6 +384,7 @@ impl NodeBuilder {
369
384
seed_bytes,
370
385
logger,
371
386
vss_store,
387
+ self . payjoin_sender_config . as_ref ( ) ,
372
388
)
373
389
}
374
390
@@ -390,6 +406,7 @@ impl NodeBuilder {
390
406
seed_bytes,
391
407
logger,
392
408
kv_store,
409
+ self . payjoin_sender_config . as_ref ( ) ,
393
410
)
394
411
}
395
412
}
@@ -454,6 +471,11 @@ impl ArcedNodeBuilder {
454
471
self . inner . write ( ) . unwrap ( ) . set_gossip_source_p2p ( ) ;
455
472
}
456
473
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
+
457
479
/// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
458
480
/// server.
459
481
pub fn set_gossip_source_rgs ( & self , rgs_server_url : String ) {
@@ -524,6 +546,7 @@ fn build_with_store_internal(
524
546
gossip_source_config : Option < & GossipSourceConfig > ,
525
547
liquidity_source_config : Option < & LiquiditySourceConfig > , seed_bytes : [ u8 ; 64 ] ,
526
548
logger : Arc < FilesystemLogger > , kv_store : Arc < DynStore > ,
549
+ payjoin_sender_config : Option < & PayjoinSenderConfig > ,
527
550
) -> Result < Node , BuildError > {
528
551
// Initialize the on-chain wallet and chain access
529
552
let xprv = bitcoin:: bip32:: ExtendedPrivKey :: new_master ( config. network . into ( ) , & seed_bytes)
@@ -973,6 +996,16 @@ fn build_with_store_internal(
973
996
} ;
974
997
975
998
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
+ } ;
976
1009
977
1010
let is_listening = Arc :: new ( AtomicBool :: new ( false ) ) ;
978
1011
let latest_wallet_sync_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
@@ -993,6 +1026,7 @@ fn build_with_store_internal(
993
1026
channel_manager,
994
1027
chain_monitor,
995
1028
output_sweeper,
1029
+ payjoin_sender,
996
1030
peer_manager,
997
1031
connection_manager,
998
1032
keys_manager,
0 commit comments