@@ -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 ,
48+ BitcoindRestClientConfig , Config , ElectrumSyncConfig , EsploraSyncConfig , 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} ;
@@ -71,13 +72,14 @@ use crate::liquidity::{
7172use crate :: logger:: { log_error, LdkLogger , LogLevel , LogWriter , Logger } ;
7273use crate :: message_handler:: NodeCustomMessageHandler ;
7374use crate :: payment:: asynchronous:: om_mailbox:: OnionMessageMailbox ;
75+ use crate :: payment:: payjoin:: manager:: PayjoinManager ;
7476use crate :: peer_store:: PeerStore ;
7577use crate :: runtime:: { Runtime , RuntimeSpawner } ;
7678use crate :: tx_broadcaster:: TransactionBroadcaster ;
7779use crate :: types:: {
7880 AsyncPersister , ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph ,
79- KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , PendingPaymentStore ,
80- Persister , SyncAndAsyncKVStore ,
81+ KeysManager , MessageRouter , OnionMessenger , PayjoinSessionStore , PaymentStore , PeerManager ,
82+ PendingPaymentStore , Persister , SyncAndAsyncKVStore ,
8183} ;
8284use crate :: wallet:: persist:: KVStoreWalletPersister ;
8385use crate :: wallet:: Wallet ;
@@ -547,6 +549,15 @@ impl NodeBuilder {
547549 Ok ( self )
548550 }
549551
552+ /// Configures the [`Node`] instance to enable payjoin payments.
553+ ///
554+ /// The `payjoin_config` specifies the PayJoin directory and OHTTP relay URLs required
555+ /// for payjoin V2 protocol.
556+ pub fn set_payjoin_config ( & mut self , payjoin_config : PayjoinConfig ) -> & mut Self {
557+ self . config . payjoin_config = Some ( payjoin_config) ;
558+ self
559+ }
560+
550561 /// Configures the [`Node`] to resync chain data from genesis on first startup, recovering any
551562 /// historical wallet funds.
552563 ///
@@ -933,6 +944,14 @@ impl ArcedNodeBuilder {
933944 self . inner . write ( ) . unwrap ( ) . set_async_payments_role ( role) . map ( |_| ( ) )
934945 }
935946
947+ /// Configures the [`Node`] instance to enable payjoin payments.
948+ ///
949+ /// The `payjoin_config` specifies the PayJoin directory and OHTTP relay URLs required
950+ /// for payjoin V2 protocol.
951+ pub fn set_payjoin_config ( & self , payjoin_config : PayjoinConfig ) {
952+ self . inner . write ( ) . unwrap ( ) . set_payjoin_config ( payjoin_config) ;
953+ }
954+
936955 /// Configures the [`Node`] to resync chain data from genesis on first startup, recovering any
937956 /// historical wallet funds.
938957 ///
@@ -1083,12 +1102,13 @@ fn build_with_store_internal(
10831102
10841103 let kv_store_ref = Arc :: clone ( & kv_store) ;
10851104 let logger_ref = Arc :: clone ( & logger) ;
1086- let ( payment_store_res, node_metris_res, pending_payment_store_res) =
1105+ let ( payment_store_res, node_metris_res, pending_payment_store_res, payjoin_session_store_res ) =
10871106 runtime. block_on ( async move {
10881107 tokio:: join!(
10891108 read_payments( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
10901109 read_node_metrics( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1091- read_pending_payments( & * kv_store_ref, Arc :: clone( & logger_ref) )
1110+ read_pending_payments( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1111+ read_payjoin_sessions( & * kv_store_ref, Arc :: clone( & logger_ref) )
10921112 )
10931113 } ) ;
10941114
@@ -1771,6 +1791,33 @@ fn build_with_store_internal(
17711791
17721792 let pathfinding_scores_sync_url = pathfinding_scores_sync_config. map ( |c| c. url . clone ( ) ) ;
17731793
1794+ let payjoin_session_store = match payjoin_session_store_res {
1795+ Ok ( payjoin_sessions) => Arc :: new ( PayjoinSessionStore :: new (
1796+ payjoin_sessions,
1797+ PAYJOIN_SESSION_STORE_PRIMARY_NAMESPACE . to_string ( ) ,
1798+ PAYJOIN_SESSION_STORE_SECONDARY_NAMESPACE . to_string ( ) ,
1799+ Arc :: clone ( & kv_store) ,
1800+ Arc :: clone ( & logger) ,
1801+ ) ) ,
1802+ Err ( e) => {
1803+ log_error ! ( logger, "Failed to read payjoin session data from store: {}" , e) ;
1804+ return Err ( BuildError :: ReadFailed ) ;
1805+ } ,
1806+ } ;
1807+
1808+ let payjoin_manager = Arc :: new ( PayjoinManager :: new (
1809+ Arc :: clone ( & payjoin_session_store) ,
1810+ Arc :: clone ( & kv_store) ,
1811+ Arc :: clone ( & logger) ,
1812+ Arc :: clone ( & config) ,
1813+ Arc :: clone ( & wallet) ,
1814+ Arc :: clone ( & fee_estimator) ,
1815+ Arc :: clone ( & chain_source) ,
1816+ stop_sender. subscribe ( ) ,
1817+ Arc :: clone ( & payment_store) ,
1818+ Arc :: clone ( & pending_payment_store) ,
1819+ ) ) ;
1820+
17741821 #[ cfg( cycle_tests) ]
17751822 let mut _leak_checker = crate :: LeakChecker ( Vec :: new ( ) ) ;
17761823 #[ cfg( cycle_tests) ]
@@ -1817,6 +1864,7 @@ fn build_with_store_internal(
18171864 hrn_resolver,
18181865 #[ cfg( cycle_tests) ]
18191866 _leak_checker,
1867+ payjoin_manager,
18201868 } )
18211869}
18221870
0 commit comments