1
- use crate :: channel_scheduler:: ChannelScheduler ;
2
1
use crate :: config:: {
3
2
Config , BDK_CLIENT_CONCURRENCY , BDK_CLIENT_STOP_GAP , DEFAULT_ESPLORA_SERVER_URL ,
4
3
WALLET_KEYS_SEED_LEN ,
@@ -12,7 +11,11 @@ use crate::io::sqlite_store::SqliteStore;
12
11
use crate :: liquidity:: LiquiditySource ;
13
12
use crate :: logger:: { log_error, log_info, FilesystemLogger , Logger } ;
14
13
use 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 ;
16
19
use crate :: payment:: store:: PaymentStore ;
17
20
use crate :: peer_store:: PeerStore ;
18
21
use crate :: tx_broadcaster:: TransactionBroadcaster ;
@@ -97,12 +100,17 @@ struct LiquiditySourceConfig {
97
100
}
98
101
99
102
#[ derive( Debug , Clone ) ]
100
- struct PayjoinConfig {
103
+ struct PayjoinReceiverConfig {
101
104
payjoin_directory : payjoin:: Url ,
102
105
payjoin_relay : payjoin:: Url ,
103
106
ohttp_keys : Option < payjoin:: OhttpKeys > ,
104
107
}
105
108
109
+ #[ derive( Debug , Clone ) ]
110
+ struct PayjoinSenderConfig {
111
+ payjoin_relay : payjoin:: Url ,
112
+ }
113
+
106
114
impl Default for LiquiditySourceConfig {
107
115
fn default ( ) -> Self {
108
116
Self { lsps2_service : None }
@@ -182,7 +190,8 @@ pub struct NodeBuilder {
182
190
chain_data_source_config : Option < ChainDataSourceConfig > ,
183
191
gossip_source_config : Option < GossipSourceConfig > ,
184
192
liquidity_source_config : Option < LiquiditySourceConfig > ,
185
- payjoin_config : Option < PayjoinConfig > ,
193
+ payjoin_receiver_config : Option < PayjoinReceiverConfig > ,
194
+ payjoin_sender_config : Option < PayjoinSenderConfig > ,
186
195
}
187
196
188
197
impl NodeBuilder {
@@ -198,14 +207,16 @@ impl NodeBuilder {
198
207
let chain_data_source_config = None ;
199
208
let gossip_source_config = None ;
200
209
let liquidity_source_config = None ;
201
- let payjoin_config = None ;
210
+ let payjoin_receiver_config = None ;
211
+ let payjoin_sender_config = None ;
202
212
Self {
203
213
config,
204
214
entropy_source_config,
205
215
chain_data_source_config,
206
216
gossip_source_config,
207
217
liquidity_source_config,
208
- payjoin_config,
218
+ payjoin_receiver_config,
219
+ payjoin_sender_config,
209
220
}
210
221
}
211
222
@@ -262,11 +273,19 @@ impl NodeBuilder {
262
273
263
274
/// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
264
275
/// 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 (
266
284
& mut self , payjoin_directory : payjoin:: Url , payjoin_relay : payjoin:: Url ,
267
285
ohttp_keys : Option < payjoin:: OhttpKeys > ,
268
286
) -> & 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 } ) ;
270
289
self
271
290
}
272
291
@@ -391,7 +410,8 @@ impl NodeBuilder {
391
410
seed_bytes,
392
411
logger,
393
412
vss_store,
394
- self . payjoin_config . as_ref ( ) ,
413
+ self . payjoin_receiver_config . as_ref ( ) ,
414
+ self . payjoin_sender_config . as_ref ( ) ,
395
415
)
396
416
}
397
417
@@ -413,7 +433,8 @@ impl NodeBuilder {
413
433
seed_bytes,
414
434
logger,
415
435
kv_store,
416
- self . payjoin_config . as_ref ( ) ,
436
+ self . payjoin_receiver_config . as_ref ( ) ,
437
+ self . payjoin_sender_config . as_ref ( ) ,
417
438
)
418
439
}
419
440
}
@@ -478,24 +499,29 @@ impl ArcedNodeBuilder {
478
499
self . inner . write ( ) . unwrap ( ) . set_gossip_source_p2p ( ) ;
479
500
}
480
501
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) ;
485
505
}
486
506
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 (
489
509
& self , payjoin_directory : payjoin:: Url , payjoin_relay : payjoin:: Url ,
490
510
ohttp_keys : Option < payjoin:: OhttpKeys > ,
491
511
) {
492
- self . inner . write ( ) . unwrap ( ) . set_payjoin_config (
512
+ self . inner . write ( ) . unwrap ( ) . set_payjoin_receiver_config (
493
513
payjoin_directory,
494
514
payjoin_relay,
495
515
ohttp_keys,
496
516
) ;
497
517
}
498
518
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
+
499
525
/// Configures the [`Node`] instance to source its inbound liquidity from the given
500
526
/// [LSPS2](https://github.com/BitcoinAndLightningLayerSpecs/lsp/blob/main/LSPS2/README.md)
501
527
/// service.
@@ -559,7 +585,9 @@ fn build_with_store_internal(
559
585
config : Arc < Config > , chain_data_source_config : Option < & ChainDataSourceConfig > ,
560
586
gossip_source_config : Option < & GossipSourceConfig > ,
561
587
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 > ,
563
591
) -> Result < Node , BuildError > {
564
592
// Initialize the on-chain wallet and chain access
565
593
let xprv = bitcoin:: bip32:: ExtendedPrivKey :: new_master ( config. network . into ( ) , & seed_bytes)
@@ -592,7 +620,7 @@ fn build_with_store_internal(
592
620
log_error ! ( logger, "Failed to set up wallet: {}" , e) ;
593
621
BuildError :: WalletSetupFailed
594
622
} ) ?;
595
- let channel_scheduler = Arc :: new ( tokio:: sync:: Mutex :: new ( ChannelScheduler :: new ( ) ) ) ;
623
+ let payjoin_scheduler = Arc :: new ( tokio:: sync:: Mutex :: new ( PayjoinScheduler :: new ( ) ) ) ;
596
624
597
625
let ( blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
598
626
Some ( ChainDataSourceConfig :: Esplora ( server_url) ) => {
@@ -603,7 +631,7 @@ fn build_with_store_internal(
603
631
let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
604
632
tx_sync. client ( ) . clone ( ) ,
605
633
Arc :: clone ( & logger) ,
606
- Arc :: clone ( & channel_scheduler ) ,
634
+ Arc :: clone ( & payjoin_scheduler ) ,
607
635
) ) ;
608
636
let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
609
637
tx_sync. client ( ) . clone ( ) ,
@@ -622,7 +650,7 @@ fn build_with_store_internal(
622
650
let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
623
651
tx_sync. client ( ) . clone ( ) ,
624
652
Arc :: clone ( & logger) ,
625
- Arc :: clone ( & channel_scheduler ) ,
653
+ Arc :: clone ( & payjoin_scheduler ) ,
626
654
) ) ;
627
655
let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
628
656
tx_sync. client ( ) . clone ( ) ,
@@ -1012,29 +1040,49 @@ fn build_with_store_internal(
1012
1040
} ;
1013
1041
1014
1042
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 {
1028
1044
let payjoin_sender = PayjoinSender :: new (
1029
1045
Arc :: clone ( & logger) ,
1030
1046
Arc :: clone ( & wallet) ,
1031
- & payjoin_config. payjoin_relay ,
1032
- & payjoin_config. payjoin_directory ,
1047
+ & payjoin_sender_config. payjoin_relay ,
1033
1048
) ;
1034
- ( payjoin_receiver , Some ( Arc :: new ( payjoin_sender) ) )
1049
+ Some ( Arc :: new ( payjoin_sender) )
1035
1050
} else {
1036
- ( None , None )
1051
+ None
1037
1052
} ;
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
+ } ;
1038
1086
1039
1087
let is_listening = Arc :: new ( AtomicBool :: new ( false ) ) ;
1040
1088
let latest_wallet_sync_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
@@ -1057,6 +1105,7 @@ fn build_with_store_internal(
1057
1105
output_sweeper,
1058
1106
payjoin_receiver,
1059
1107
payjoin_sender,
1108
+ payjoin_lightning_receiver,
1060
1109
peer_manager,
1061
1110
connection_manager,
1062
1111
keys_manager,
0 commit comments