Skip to content

Commit b8e82dd

Browse files
committed
f
1 parent 773d497 commit b8e82dd

12 files changed

+385
-1141
lines changed

src/builder.rs

+87-38
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use crate::channel_scheduler::ChannelScheduler;
21
use 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;
1211
use crate::liquidity::LiquiditySource;
1312
use crate::logger::{log_error, log_info, FilesystemLogger, Logger};
1413
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;
1619
use crate::payment::store::PaymentStore;
1720
use crate::peer_store::PeerStore;
1821
use 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+
106114
impl 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

188197
impl 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

Comments
 (0)