@@ -45,7 +45,7 @@ use vss_client::headers::VssHeaderProvider;
4545use crate :: chain:: ChainSource ;
4646use crate :: config:: {
4747 default_user_config, may_announce_channel, AnnounceError , AsyncPaymentsRole ,
48- BitcoindRestClientConfig , Config , ElectrumSyncConfig , EsploraSyncConfig , TorConfig ,
48+ BitcoindRestClientConfig , Config , ElectrumSyncConfig , EsploraSyncConfig , TorConfig , PayjoinConfig ,
4949 DEFAULT_ESPLORA_SERVER_URL , DEFAULT_LOG_FILENAME , DEFAULT_LOG_LEVEL ,
5050} ;
5151use crate :: connection:: ConnectionManager ;
@@ -56,12 +56,13 @@ use crate::gossip::GossipSource;
5656use crate :: io:: sqlite_store:: SqliteStore ;
5757use crate :: io:: utils:: {
5858 read_event_queue, read_external_pathfinding_scores_from_cache, read_network_graph,
59- read_node_metrics, read_output_sweeper, read_payments , read_peer_info , read_pending_payments ,
60- read_scorer, write_node_metrics,
59+ read_node_metrics, read_output_sweeper, read_payjoin_sessions , read_payments , read_peer_info ,
60+ read_pending_payments , read_scorer, write_node_metrics,
6161} ;
6262use crate :: io:: vss_store:: VssStoreBuilder ;
6363use crate :: io:: {
64- self , PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE , PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
64+ self , PAYJOIN_SESSION_STORE_PRIMARY_NAMESPACE , PAYJOIN_SESSION_STORE_SECONDARY_NAMESPACE ,
65+ PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE , PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
6566 PENDING_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
6667 PENDING_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
6768} ;
@@ -72,13 +73,14 @@ use crate::lnurl_auth::LnurlAuth;
7273use crate :: logger:: { log_error, LdkLogger , LogLevel , LogWriter , Logger } ;
7374use crate :: message_handler:: NodeCustomMessageHandler ;
7475use crate :: payment:: asynchronous:: om_mailbox:: OnionMessageMailbox ;
76+ use crate :: payment:: payjoin:: manager:: PayjoinManager ;
7577use crate :: peer_store:: PeerStore ;
7678use crate :: runtime:: { Runtime , RuntimeSpawner } ;
7779use crate :: tx_broadcaster:: TransactionBroadcaster ;
7880use crate :: types:: {
7981 AsyncPersister , ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph ,
80- KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , PendingPaymentStore ,
81- Persister , SyncAndAsyncKVStore ,
82+ KeysManager , MessageRouter , OnionMessenger , PayjoinSessionStore , PaymentStore , PeerManager ,
83+ PendingPaymentStore , Persister , SyncAndAsyncKVStore ,
8284} ;
8385use crate :: wallet:: persist:: KVStoreWalletPersister ;
8486use crate :: wallet:: Wallet ;
@@ -604,6 +606,15 @@ impl NodeBuilder {
604606 Ok ( self )
605607 }
606608
609+ /// Configures the [`Node`] instance to enable payjoin payments.
610+ ///
611+ /// The `payjoin_config` specifies the PayJoin directory and OHTTP relay URLs required
612+ /// for payjoin V2 protocol.
613+ pub fn set_payjoin_config ( & mut self , payjoin_config : PayjoinConfig ) -> & mut Self {
614+ self . config . payjoin_config = Some ( payjoin_config) ;
615+ self
616+ }
617+
607618 /// Configures the [`Node`] to resync chain data from genesis on first startup, recovering any
608619 /// historical wallet funds.
609620 ///
@@ -1072,6 +1083,14 @@ impl ArcedNodeBuilder {
10721083 self . inner . write ( ) . unwrap ( ) . set_async_payments_role ( role) . map ( |_| ( ) )
10731084 }
10741085
1086+ /// Configures the [`Node`] instance to enable payjoin payments.
1087+ ///
1088+ /// The `payjoin_config` specifies the PayJoin directory and OHTTP relay URLs required
1089+ /// for payjoin V2 protocol.
1090+ pub fn set_payjoin_config ( & self , payjoin_config : PayjoinConfig ) {
1091+ self . inner . write ( ) . unwrap ( ) . set_payjoin_config ( payjoin_config) ;
1092+ }
1093+
10751094 /// Configures the [`Node`] to resync chain data from genesis on first startup, recovering any
10761095 /// historical wallet funds.
10771096 ///
@@ -1260,12 +1279,13 @@ fn build_with_store_internal(
12601279
12611280 let kv_store_ref = Arc :: clone ( & kv_store) ;
12621281 let logger_ref = Arc :: clone ( & logger) ;
1263- let ( payment_store_res, node_metris_res, pending_payment_store_res) =
1282+ let ( payment_store_res, node_metris_res, pending_payment_store_res, payjoin_session_store_res ) =
12641283 runtime. block_on ( async move {
12651284 tokio:: join!(
12661285 read_payments( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
12671286 read_node_metrics( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1268- read_pending_payments( & * kv_store_ref, Arc :: clone( & logger_ref) )
1287+ read_pending_payments( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1288+ read_payjoin_sessions( & * kv_store_ref, Arc :: clone( & logger_ref) )
12691289 )
12701290 } ) ;
12711291
@@ -1954,6 +1974,34 @@ fn build_with_store_internal(
19541974
19551975 let pathfinding_scores_sync_url = pathfinding_scores_sync_config. map ( |c| c. url . clone ( ) ) ;
19561976
1977+ let payjoin_session_store = match payjoin_session_store_res {
1978+ Ok ( payjoin_sessions) => Arc :: new ( PayjoinSessionStore :: new (
1979+ payjoin_sessions,
1980+ PAYJOIN_SESSION_STORE_PRIMARY_NAMESPACE . to_string ( ) ,
1981+ PAYJOIN_SESSION_STORE_SECONDARY_NAMESPACE . to_string ( ) ,
1982+ Arc :: clone ( & kv_store) ,
1983+ Arc :: clone ( & logger) ,
1984+ ) ) ,
1985+ Err ( e) => {
1986+ log_error ! ( logger, "Failed to read payjoin session data from store: {}" , e) ;
1987+ return Err ( BuildError :: ReadFailed ) ;
1988+ } ,
1989+ } ;
1990+
1991+ let payjoin_manager = Arc :: new ( PayjoinManager :: new (
1992+ Arc :: clone ( & payjoin_session_store) ,
1993+ Arc :: clone ( & logger) ,
1994+ Arc :: clone ( & config) ,
1995+ Arc :: clone ( & wallet) ,
1996+ Arc :: clone ( & fee_estimator) ,
1997+ Arc :: clone ( & chain_source) ,
1998+ Arc :: clone ( & channel_manager) ,
1999+ stop_sender. subscribe ( ) ,
2000+ Arc :: clone ( & payment_store) ,
2001+ Arc :: clone ( & pending_payment_store) ,
2002+ Arc :: clone ( & tx_broadcaster) ,
2003+ ) ) ;
2004+
19572005 #[ cfg( cycle_tests) ]
19582006 let mut _leak_checker = crate :: LeakChecker ( Vec :: new ( ) ) ;
19592007 #[ cfg( cycle_tests) ]
@@ -2001,6 +2049,7 @@ fn build_with_store_internal(
20012049 hrn_resolver,
20022050 #[ cfg( cycle_tests) ]
20032051 _leak_checker,
2052+ payjoin_manager,
20042053 } )
20052054}
20062055
0 commit comments