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}
@@ -484,18 +505,6 @@ impl ArcedNodeBuilder {
484505 self . inner . write ( ) . unwrap ( ) . set_gossip_source_rgs ( rgs_server_url) ;
485506 }
486507
487- /// Configures the [`Node`] instance to use payjoin.
488- pub fn set_payjoin_config (
489- & self , payjoin_directory : payjoin:: Url , payjoin_relay : payjoin:: Url ,
490- ohttp_keys : Option < payjoin:: OhttpKeys > ,
491- ) {
492- self . inner . write ( ) . unwrap ( ) . set_payjoin_config (
493- payjoin_directory,
494- payjoin_relay,
495- ohttp_keys,
496- ) ;
497- }
498-
499508 /// Configures the [`Node`] instance to source its inbound liquidity from the given
500509 /// [LSPS2](https://github.com/BitcoinAndLightningLayerSpecs/lsp/blob/main/LSPS2/README.md)
501510 /// service.
@@ -559,7 +568,9 @@ fn build_with_store_internal(
559568 config : Arc < Config > , chain_data_source_config : Option < & ChainDataSourceConfig > ,
560569 gossip_source_config : Option < & GossipSourceConfig > ,
561570 liquidity_source_config : Option < & LiquiditySourceConfig > , seed_bytes : [ u8 ; 64 ] ,
562- logger : Arc < FilesystemLogger > , kv_store : Arc < DynStore > , payjoin_config : Option < & PayjoinConfig > ,
571+ logger : Arc < FilesystemLogger > , kv_store : Arc < DynStore > ,
572+ payjoin_receiver_config : Option < & PayjoinReceiverConfig > ,
573+ payjoin_sender_config : Option < & PayjoinSenderConfig > ,
563574) -> Result < Node , BuildError > {
564575 // Initialize the on-chain wallet and chain access
565576 let xprv = bitcoin:: bip32:: ExtendedPrivKey :: new_master ( config. network . into ( ) , & seed_bytes)
@@ -592,7 +603,7 @@ fn build_with_store_internal(
592603 log_error ! ( logger, "Failed to set up wallet: {}" , e) ;
593604 BuildError :: WalletSetupFailed
594605 } ) ?;
595- let channel_scheduler = Arc :: new ( tokio:: sync:: Mutex :: new ( ChannelScheduler :: new ( ) ) ) ;
606+ let payjoin_scheduler = Arc :: new ( tokio:: sync:: Mutex :: new ( PayjoinScheduler :: new ( ) ) ) ;
596607
597608 let ( blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
598609 Some ( ChainDataSourceConfig :: Esplora ( server_url) ) => {
@@ -603,7 +614,7 @@ fn build_with_store_internal(
603614 let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
604615 tx_sync. client ( ) . clone ( ) ,
605616 Arc :: clone ( & logger) ,
606- Arc :: clone ( & channel_scheduler ) ,
617+ Arc :: clone ( & payjoin_scheduler ) ,
607618 ) ) ;
608619 let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
609620 tx_sync. client ( ) . clone ( ) ,
@@ -622,7 +633,7 @@ fn build_with_store_internal(
622633 let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
623634 tx_sync. client ( ) . clone ( ) ,
624635 Arc :: clone ( & logger) ,
625- Arc :: clone ( & channel_scheduler ) ,
636+ Arc :: clone ( & payjoin_scheduler ) ,
626637 ) ) ;
627638 let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
628639 tx_sync. client ( ) . clone ( ) ,
@@ -1012,29 +1023,49 @@ fn build_with_store_internal(
10121023 } ;
10131024
10141025 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- } ;
1026+ let payjoin_sender = if let Some ( payjoin_sender_config) = payjoin_sender_config {
10281027 let payjoin_sender = PayjoinSender :: new (
10291028 Arc :: clone ( & logger) ,
10301029 Arc :: clone ( & wallet) ,
1031- & payjoin_config. payjoin_relay ,
1032- & payjoin_config. payjoin_directory ,
1030+ & payjoin_sender_config. payjoin_relay ,
10331031 ) ;
1034- ( payjoin_receiver , Some ( Arc :: new ( payjoin_sender) ) )
1032+ Some ( Arc :: new ( payjoin_sender) )
10351033 } else {
1036- ( None , None )
1034+ None
10371035 } ;
1036+ let ( payjoin_receiver, payjoin_lightning_receiver) =
1037+ if let Some ( payjoin_receiver_config) = payjoin_receiver_config {
1038+ let enrollement = enroll_payjoin_receivers (
1039+ & payjoin_receiver_config. ohttp_keys ,
1040+ & payjoin_receiver_config. payjoin_directory ,
1041+ & payjoin_receiver_config. payjoin_relay ,
1042+ )
1043+ . ok ( ) ;
1044+ if let Some ( enrollement) = enrollement {
1045+ let ( payjoin_enrollement, lightning_enrollement, ohttp_keys) = enrollement;
1046+ dbg ! ( "Enrolled payjoin receiver" ) ;
1047+ let payjoin_receiver = PayjoinReceiver :: new (
1048+ Arc :: clone ( & logger) ,
1049+ Arc :: clone ( & wallet) ,
1050+ payjoin_enrollement,
1051+ ohttp_keys. clone ( ) ,
1052+ ) ;
1053+
1054+ let payjoin_lightning_receiver = PayjoinLightningReceiver :: new (
1055+ Arc :: clone ( & logger) ,
1056+ Arc :: clone ( & wallet) ,
1057+ Arc :: clone ( & channel_manager) ,
1058+ Arc :: clone ( & payjoin_scheduler) ,
1059+ lightning_enrollement,
1060+ ohttp_keys,
1061+ ) ;
1062+ ( Some ( Arc :: new ( payjoin_receiver) ) , Some ( Arc :: new ( payjoin_lightning_receiver) ) )
1063+ } else {
1064+ ( None , None )
1065+ }
1066+ } else {
1067+ ( None , None )
1068+ } ;
10381069
10391070 let is_listening = Arc :: new ( AtomicBool :: new ( false ) ) ;
10401071 let latest_wallet_sync_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
@@ -1057,6 +1088,7 @@ fn build_with_store_internal(
10571088 output_sweeper,
10581089 payjoin_receiver,
10591090 payjoin_sender,
1091+ payjoin_lightning_receiver,
10601092 peer_manager,
10611093 connection_manager,
10621094 keys_manager,
0 commit comments