Skip to content

Commit

Permalink
f
Browse files Browse the repository at this point in the history
  • Loading branch information
jbesraa committed May 21, 2024
1 parent 773d497 commit 3d5b58d
Show file tree
Hide file tree
Showing 12 changed files with 257 additions and 974 deletions.
125 changes: 87 additions & 38 deletions src/builder.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use crate::channel_scheduler::ChannelScheduler;
use crate::config::{
Config, BDK_CLIENT_CONCURRENCY, BDK_CLIENT_STOP_GAP, DEFAULT_ESPLORA_SERVER_URL,
WALLET_KEYS_SEED_LEN,
Expand All @@ -12,7 +11,11 @@ use crate::io::sqlite_store::SqliteStore;
use crate::liquidity::LiquiditySource;
use crate::logger::{log_error, log_info, FilesystemLogger, Logger};
use crate::message_handler::NodeCustomMessageHandler;
use crate::payjoin_handler::{PayjoinReceiver, PayjoinSender};
use crate::payjoin_receiver::{
enroll_payjoin_receivers, PayjoinLightningReceiver, PayjoinReceiver,
};
use crate::payjoin_scheduler::PayjoinScheduler;
use crate::payjoin_sender::PayjoinSender;
use crate::payment::store::PaymentStore;
use crate::peer_store::PeerStore;
use crate::tx_broadcaster::TransactionBroadcaster;
Expand Down Expand Up @@ -97,12 +100,17 @@ struct LiquiditySourceConfig {
}

#[derive(Debug, Clone)]
struct PayjoinConfig {
struct PayjoinReceiverConfig {
payjoin_directory: payjoin::Url,
payjoin_relay: payjoin::Url,
ohttp_keys: Option<payjoin::OhttpKeys>,
}

#[derive(Debug, Clone)]
struct PayjoinSenderConfig {
payjoin_relay: payjoin::Url,
}

impl Default for LiquiditySourceConfig {
fn default() -> Self {
Self { lsps2_service: None }
Expand Down Expand Up @@ -182,7 +190,8 @@ pub struct NodeBuilder {
chain_data_source_config: Option<ChainDataSourceConfig>,
gossip_source_config: Option<GossipSourceConfig>,
liquidity_source_config: Option<LiquiditySourceConfig>,
payjoin_config: Option<PayjoinConfig>,
payjoin_receiver_config: Option<PayjoinReceiverConfig>,
payjoin_sender_config: Option<PayjoinSenderConfig>,
}

impl NodeBuilder {
Expand All @@ -198,14 +207,16 @@ impl NodeBuilder {
let chain_data_source_config = None;
let gossip_source_config = None;
let liquidity_source_config = None;
let payjoin_config = None;
let payjoin_receiver_config = None;
let payjoin_sender_config = None;
Self {
config,
entropy_source_config,
chain_data_source_config,
gossip_source_config,
liquidity_source_config,
payjoin_config,
payjoin_receiver_config,
payjoin_sender_config,
}
}

Expand Down Expand Up @@ -262,11 +273,19 @@ impl NodeBuilder {

/// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
/// server.
pub fn set_payjoin_config(
pub fn set_payjoin_sender_config(&mut self, payjoin_relay: payjoin::Url) -> &mut Self {
self.payjoin_sender_config = Some(PayjoinSenderConfig { payjoin_relay });
self
}

/// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
/// server.
pub fn set_payjoin_receiver_config(
&mut self, payjoin_directory: payjoin::Url, payjoin_relay: payjoin::Url,
ohttp_keys: Option<payjoin::OhttpKeys>,
) -> &mut Self {
self.payjoin_config = Some(PayjoinConfig { payjoin_directory, payjoin_relay, ohttp_keys });
self.payjoin_receiver_config =
Some(PayjoinReceiverConfig { payjoin_directory, payjoin_relay, ohttp_keys });
self
}

Expand Down Expand Up @@ -391,7 +410,8 @@ impl NodeBuilder {
seed_bytes,
logger,
vss_store,
self.payjoin_config.as_ref(),
self.payjoin_receiver_config.as_ref(),
self.payjoin_sender_config.as_ref(),
)
}

Expand All @@ -413,7 +433,8 @@ impl NodeBuilder {
seed_bytes,
logger,
kv_store,
self.payjoin_config.as_ref(),
self.payjoin_receiver_config.as_ref(),
self.payjoin_sender_config.as_ref(),
)
}
}
Expand Down Expand Up @@ -478,24 +499,29 @@ impl ArcedNodeBuilder {
self.inner.write().unwrap().set_gossip_source_p2p();
}

/// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
/// server.
pub fn set_gossip_source_rgs(&self, rgs_server_url: String) {
self.inner.write().unwrap().set_gossip_source_rgs(rgs_server_url);
/// payjoin sender config
pub fn set_payjoin_sender_config(&self, payjoin_relay: payjoin::Url) {
self.inner.write().unwrap().set_payjoin_sender_config(payjoin_relay);
}

/// Configures the [`Node`] instance to use payjoin.
pub fn set_payjoin_config(
/// payjoin receiver config
pub fn set_payjoin_receiver_config(
&self, payjoin_directory: payjoin::Url, payjoin_relay: payjoin::Url,
ohttp_keys: Option<payjoin::OhttpKeys>,
) {
self.inner.write().unwrap().set_payjoin_config(
self.inner.write().unwrap().set_payjoin_receiver_config(
payjoin_directory,
payjoin_relay,
ohttp_keys,
);
}

/// Configures the [`Node`] instance to source its gossip data from the given RapidGossipSync
/// server.
pub fn set_gossip_source_rgs(&self, rgs_server_url: String) {
self.inner.write().unwrap().set_gossip_source_rgs(rgs_server_url);
}

/// Configures the [`Node`] instance to source its inbound liquidity from the given
/// [LSPS2](https://github.com/BitcoinAndLightningLayerSpecs/lsp/blob/main/LSPS2/README.md)
/// service.
Expand Down Expand Up @@ -559,7 +585,9 @@ fn build_with_store_internal(
config: Arc<Config>, chain_data_source_config: Option<&ChainDataSourceConfig>,
gossip_source_config: Option<&GossipSourceConfig>,
liquidity_source_config: Option<&LiquiditySourceConfig>, seed_bytes: [u8; 64],
logger: Arc<FilesystemLogger>, kv_store: Arc<DynStore>, payjoin_config: Option<&PayjoinConfig>,
logger: Arc<FilesystemLogger>, kv_store: Arc<DynStore>,
payjoin_receiver_config: Option<&PayjoinReceiverConfig>,
payjoin_sender_config: Option<&PayjoinSenderConfig>,
) -> Result<Node, BuildError> {
// Initialize the on-chain wallet and chain access
let xprv = bitcoin::bip32::ExtendedPrivKey::new_master(config.network.into(), &seed_bytes)
Expand Down Expand Up @@ -592,7 +620,7 @@ fn build_with_store_internal(
log_error!(logger, "Failed to set up wallet: {}", e);
BuildError::WalletSetupFailed
})?;
let channel_scheduler = Arc::new(tokio::sync::Mutex::new(ChannelScheduler::new()));
let payjoin_scheduler = Arc::new(tokio::sync::Mutex::new(PayjoinScheduler::new()));

let (blockchain, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
Some(ChainDataSourceConfig::Esplora(server_url)) => {
Expand All @@ -603,7 +631,7 @@ fn build_with_store_internal(
let tx_broadcaster = Arc::new(TransactionBroadcaster::new(
tx_sync.client().clone(),
Arc::clone(&logger),
Arc::clone(&channel_scheduler),
Arc::clone(&payjoin_scheduler),
));
let fee_estimator = Arc::new(OnchainFeeEstimator::new(
tx_sync.client().clone(),
Expand All @@ -622,7 +650,7 @@ fn build_with_store_internal(
let tx_broadcaster = Arc::new(TransactionBroadcaster::new(
tx_sync.client().clone(),
Arc::clone(&logger),
Arc::clone(&channel_scheduler),
Arc::clone(&payjoin_scheduler),
));
let fee_estimator = Arc::new(OnchainFeeEstimator::new(
tx_sync.client().clone(),
Expand Down Expand Up @@ -1012,29 +1040,49 @@ fn build_with_store_internal(
};

let (stop_sender, _) = tokio::sync::watch::channel(());
let (payjoin_receiver, payjoin_sender) = if let Some(payjoin_config) = payjoin_config {
let payjoin_receiver = match PayjoinReceiver::enroll(
&payjoin_config.ohttp_keys,
&payjoin_config.payjoin_directory,
&payjoin_config.payjoin_relay,
Arc::clone(&channel_scheduler),
Arc::clone(&wallet),
Arc::clone(&channel_manager),
Arc::clone(&logger),
) {
Ok(r) => Some(Arc::new(r)),
Err(_e) => None,
};
let payjoin_sender = if let Some(payjoin_sender_config) = payjoin_sender_config {
let payjoin_sender = PayjoinSender::new(
Arc::clone(&logger),
Arc::clone(&wallet),
&payjoin_config.payjoin_relay,
&payjoin_config.payjoin_directory,
&payjoin_sender_config.payjoin_relay,
);
(payjoin_receiver, Some(Arc::new(payjoin_sender)))
Some(Arc::new(payjoin_sender))
} else {
(None, None)
None
};
let (payjoin_receiver, payjoin_lightning_receiver) =
if let Some(payjoin_receiver_config) = payjoin_receiver_config {
let enrollement = enroll_payjoin_receivers(
&payjoin_receiver_config.ohttp_keys,
&payjoin_receiver_config.payjoin_directory,
&payjoin_receiver_config.payjoin_relay,
)
.ok();
if let Some(enrollement) = enrollement {
let (payjoin_enrollement, lightning_enrollement, ohttp_keys) = enrollement;
dbg!("Enrolled payjoin receiver");
let payjoin_receiver = PayjoinReceiver::new(
Arc::clone(&logger),
Arc::clone(&wallet),
payjoin_enrollement,
ohttp_keys.clone(),
);

let payjoin_lightning_receiver = PayjoinLightningReceiver::new(
Arc::clone(&logger),
Arc::clone(&wallet),
Arc::clone(&channel_manager),
Arc::clone(&payjoin_scheduler),
lightning_enrollement,
ohttp_keys,
);
(Some(Arc::new(payjoin_receiver)), Some(Arc::new(payjoin_lightning_receiver)))
} else {
(None, None)
}
} else {
(None, None)
};

let is_listening = Arc::new(AtomicBool::new(false));
let latest_wallet_sync_timestamp = Arc::new(RwLock::new(None));
Expand All @@ -1057,6 +1105,7 @@ fn build_with_store_internal(
output_sweeper,
payjoin_receiver,
payjoin_sender,
payjoin_lightning_receiver,
peer_manager,
connection_manager,
keys_manager,
Expand Down

0 comments on commit 3d5b58d

Please sign in to comment.