1- use crate :: channel_scheduler:: ChannelScheduler ;
21use crate :: config:: {
32 Config , BDK_CLIENT_CONCURRENCY , BDK_CLIENT_STOP_GAP , DEFAULT_ESPLORA_SERVER_URL ,
43 WALLET_KEYS_SEED_LEN ,
@@ -12,7 +11,11 @@ use crate::io::sqlite_store::SqliteStore;
1211use crate :: liquidity:: LiquiditySource ;
1312use crate :: logger:: { log_error, log_info, FilesystemLogger , Logger } ;
1413use crate :: message_handler:: NodeCustomMessageHandler ;
15- use crate :: payjoin_handler:: { PayjoinReceiver , PayjoinSender } ;
14+ use crate :: payjoin_receiver:: {
15+ enroll_payjoin_receivers, PayjoinLightningReceiver , PayjoinReceiver ,
16+ } ;
17+ use crate :: payjoin_scheduler:: PayjoinScheduler ;
18+ use crate :: payjoin_sender:: PayjoinSender ;
1619use crate :: payment:: store:: PaymentStore ;
1720use crate :: peer_store:: PeerStore ;
1821use crate :: tx_broadcaster:: TransactionBroadcaster ;
@@ -97,12 +100,17 @@ struct LiquiditySourceConfig {
97100}
98101
99102#[ derive( Debug , Clone ) ]
100- struct PayjoinConfig {
103+ struct PayjoinReceiverConfig {
101104 payjoin_directory : payjoin:: Url ,
102105 payjoin_relay : payjoin:: Url ,
103106 ohttp_keys : Option < payjoin:: OhttpKeys > ,
104107}
105108
109+ #[ derive( Debug , Clone ) ]
110+ struct PayjoinSenderConfig {
111+ payjoin_relay : payjoin:: Url ,
112+ }
113+
106114impl Default for LiquiditySourceConfig {
107115 fn default ( ) -> Self {
108116 Self { lsps2_service : None }
@@ -182,7 +190,8 @@ pub struct NodeBuilder {
182190 chain_data_source_config : Option < ChainDataSourceConfig > ,
183191 gossip_source_config : Option < GossipSourceConfig > ,
184192 liquidity_source_config : Option < LiquiditySourceConfig > ,
185- payjoin_config : Option < PayjoinConfig > ,
193+ payjoin_receiver_config : Option < PayjoinReceiverConfig > ,
194+ payjoin_sender_config : Option < PayjoinSenderConfig > ,
186195}
187196
188197impl NodeBuilder {
@@ -198,14 +207,16 @@ impl NodeBuilder {
198207 let chain_data_source_config = None ;
199208 let gossip_source_config = None ;
200209 let liquidity_source_config = None ;
201- let payjoin_config = None ;
210+ let payjoin_receiver_config = None ;
211+ let payjoin_sender_config = None ;
202212 Self {
203213 config,
204214 entropy_source_config,
205215 chain_data_source_config,
206216 gossip_source_config,
207217 liquidity_source_config,
208- payjoin_config,
218+ payjoin_receiver_config,
219+ payjoin_sender_config,
209220 }
210221 }
211222
@@ -262,11 +273,19 @@ impl NodeBuilder {
262273
263274 /// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
264275 /// server.
265- pub fn set_payjoin_config (
276+ pub fn set_payjoin_sender_config ( & mut self , payjoin_relay : payjoin:: Url ) -> & mut Self {
277+ self . payjoin_sender_config = Some ( PayjoinSenderConfig { payjoin_relay } ) ;
278+ self
279+ }
280+
281+ /// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
282+ /// server.
283+ pub fn set_payjoin_receiver_config (
266284 & mut self , payjoin_directory : payjoin:: Url , payjoin_relay : payjoin:: Url ,
267285 ohttp_keys : Option < payjoin:: OhttpKeys > ,
268286 ) -> & mut Self {
269- self . payjoin_config = Some ( PayjoinConfig { payjoin_directory, payjoin_relay, ohttp_keys } ) ;
287+ self . payjoin_receiver_config =
288+ Some ( PayjoinReceiverConfig { payjoin_directory, payjoin_relay, ohttp_keys } ) ;
270289 self
271290 }
272291
@@ -391,7 +410,8 @@ impl NodeBuilder {
391410 seed_bytes,
392411 logger,
393412 vss_store,
394- self . payjoin_config . as_ref ( ) ,
413+ self . payjoin_receiver_config . as_ref ( ) ,
414+ self . payjoin_sender_config . as_ref ( ) ,
395415 )
396416 }
397417
@@ -413,7 +433,8 @@ impl NodeBuilder {
413433 seed_bytes,
414434 logger,
415435 kv_store,
416- self . payjoin_config . as_ref ( ) ,
436+ self . payjoin_receiver_config . as_ref ( ) ,
437+ self . payjoin_sender_config . as_ref ( ) ,
417438 )
418439 }
419440}
@@ -478,24 +499,29 @@ impl ArcedNodeBuilder {
478499 self . inner . write ( ) . unwrap ( ) . set_gossip_source_p2p ( ) ;
479500 }
480501
481- /// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
482- /// server.
483- pub fn set_gossip_source_rgs ( & self , rgs_server_url : String ) {
484- self . inner . write ( ) . unwrap ( ) . set_gossip_source_rgs ( rgs_server_url) ;
502+ /// payjoin sender config
503+ pub fn set_payjoin_sender_config ( & self , payjoin_relay : payjoin:: Url ) {
504+ self . inner . write ( ) . unwrap ( ) . set_payjoin_sender_config ( payjoin_relay) ;
485505 }
486506
487- /// Configures the [`Node`] instance to use payjoin.
488- pub fn set_payjoin_config (
507+ /// payjoin receiver config
508+ pub fn set_payjoin_receiver_config (
489509 & self , payjoin_directory : payjoin:: Url , payjoin_relay : payjoin:: Url ,
490510 ohttp_keys : Option < payjoin:: OhttpKeys > ,
491511 ) {
492- self . inner . write ( ) . unwrap ( ) . set_payjoin_config (
512+ self . inner . write ( ) . unwrap ( ) . set_payjoin_receiver_config (
493513 payjoin_directory,
494514 payjoin_relay,
495515 ohttp_keys,
496516 ) ;
497517 }
498518
519+ /// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
520+ /// server.
521+ pub fn set_gossip_source_rgs ( & self , rgs_server_url : String ) {
522+ self . inner . write ( ) . unwrap ( ) . set_gossip_source_rgs ( rgs_server_url) ;
523+ }
524+
499525 /// Configures the [`Node`] instance to source its inbound liquidity from the given
500526 /// [LSPS2](https://github.com/BitcoinAndLightningLayerSpecs/lsp/blob/main/LSPS2/README.md)
501527 /// service.
@@ -559,7 +585,9 @@ fn build_with_store_internal(
559585 config : Arc < Config > , chain_data_source_config : Option < & ChainDataSourceConfig > ,
560586 gossip_source_config : Option < & GossipSourceConfig > ,
561587 liquidity_source_config : Option < & LiquiditySourceConfig > , seed_bytes : [ u8 ; 64 ] ,
562- logger : Arc < FilesystemLogger > , kv_store : Arc < DynStore > , payjoin_config : Option < & PayjoinConfig > ,
588+ logger : Arc < FilesystemLogger > , kv_store : Arc < DynStore > ,
589+ payjoin_receiver_config : Option < & PayjoinReceiverConfig > ,
590+ payjoin_sender_config : Option < & PayjoinSenderConfig > ,
563591) -> Result < Node , BuildError > {
564592 // Initialize the on-chain wallet and chain access
565593 let xprv = bitcoin:: bip32:: ExtendedPrivKey :: new_master ( config. network . into ( ) , & seed_bytes)
@@ -592,7 +620,7 @@ fn build_with_store_internal(
592620 log_error ! ( logger, "Failed to set up wallet: {}" , e) ;
593621 BuildError :: WalletSetupFailed
594622 } ) ?;
595- let channel_scheduler = Arc :: new ( tokio:: sync:: Mutex :: new ( ChannelScheduler :: new ( ) ) ) ;
623+ let payjoin_scheduler = Arc :: new ( tokio:: sync:: Mutex :: new ( PayjoinScheduler :: new ( ) ) ) ;
596624
597625 let ( blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
598626 Some ( ChainDataSourceConfig :: Esplora ( server_url) ) => {
@@ -603,7 +631,7 @@ fn build_with_store_internal(
603631 let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
604632 tx_sync. client ( ) . clone ( ) ,
605633 Arc :: clone ( & logger) ,
606- Arc :: clone ( & channel_scheduler ) ,
634+ Arc :: clone ( & payjoin_scheduler ) ,
607635 ) ) ;
608636 let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
609637 tx_sync. client ( ) . clone ( ) ,
@@ -622,7 +650,7 @@ fn build_with_store_internal(
622650 let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
623651 tx_sync. client ( ) . clone ( ) ,
624652 Arc :: clone ( & logger) ,
625- Arc :: clone ( & channel_scheduler ) ,
653+ Arc :: clone ( & payjoin_scheduler ) ,
626654 ) ) ;
627655 let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
628656 tx_sync. client ( ) . clone ( ) ,
@@ -1012,29 +1040,49 @@ fn build_with_store_internal(
10121040 } ;
10131041
10141042 let ( stop_sender, _) = tokio:: sync:: watch:: channel ( ( ) ) ;
1015- let ( payjoin_receiver, payjoin_sender) = if let Some ( payjoin_config) = payjoin_config {
1016- let payjoin_receiver = match PayjoinReceiver :: enroll (
1017- & payjoin_config. ohttp_keys ,
1018- & payjoin_config. payjoin_directory ,
1019- & payjoin_config. payjoin_relay ,
1020- Arc :: clone ( & channel_scheduler) ,
1021- Arc :: clone ( & wallet) ,
1022- Arc :: clone ( & channel_manager) ,
1023- Arc :: clone ( & logger) ,
1024- ) {
1025- Ok ( r) => Some ( Arc :: new ( r) ) ,
1026- Err ( _e) => None ,
1027- } ;
1043+ let payjoin_sender = if let Some ( payjoin_sender_config) = payjoin_sender_config {
10281044 let payjoin_sender = PayjoinSender :: new (
10291045 Arc :: clone ( & logger) ,
10301046 Arc :: clone ( & wallet) ,
1031- & payjoin_config. payjoin_relay ,
1032- & payjoin_config. payjoin_directory ,
1047+ & payjoin_sender_config. payjoin_relay ,
10331048 ) ;
1034- ( payjoin_receiver , Some ( Arc :: new ( payjoin_sender) ) )
1049+ Some ( Arc :: new ( payjoin_sender) )
10351050 } else {
1036- ( None , None )
1051+ None
10371052 } ;
1053+ let ( payjoin_receiver, payjoin_lightning_receiver) =
1054+ if let Some ( payjoin_receiver_config) = payjoin_receiver_config {
1055+ let enrollement = enroll_payjoin_receivers (
1056+ & payjoin_receiver_config. ohttp_keys ,
1057+ & payjoin_receiver_config. payjoin_directory ,
1058+ & payjoin_receiver_config. payjoin_relay ,
1059+ )
1060+ . ok ( ) ;
1061+ if let Some ( enrollement) = enrollement {
1062+ let ( payjoin_enrollement, lightning_enrollement, ohttp_keys) = enrollement;
1063+ dbg ! ( "Enrolled payjoin receiver" ) ;
1064+ let payjoin_receiver = PayjoinReceiver :: new (
1065+ Arc :: clone ( & logger) ,
1066+ Arc :: clone ( & wallet) ,
1067+ payjoin_enrollement,
1068+ ohttp_keys. clone ( ) ,
1069+ ) ;
1070+
1071+ let payjoin_lightning_receiver = PayjoinLightningReceiver :: new (
1072+ Arc :: clone ( & logger) ,
1073+ Arc :: clone ( & wallet) ,
1074+ Arc :: clone ( & channel_manager) ,
1075+ Arc :: clone ( & payjoin_scheduler) ,
1076+ lightning_enrollement,
1077+ ohttp_keys,
1078+ ) ;
1079+ ( Some ( Arc :: new ( payjoin_receiver) ) , Some ( Arc :: new ( payjoin_lightning_receiver) ) )
1080+ } else {
1081+ ( None , None )
1082+ }
1083+ } else {
1084+ ( None , None )
1085+ } ;
10381086
10391087 let is_listening = Arc :: new ( AtomicBool :: new ( false ) ) ;
10401088 let latest_wallet_sync_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
@@ -1057,6 +1105,7 @@ fn build_with_store_internal(
10571105 output_sweeper,
10581106 payjoin_receiver,
10591107 payjoin_sender,
1108+ payjoin_lightning_receiver,
10601109 peer_manager,
10611110 connection_manager,
10621111 keys_manager,
0 commit comments