@@ -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} ;
@@ -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 ;
@@ -549,6 +551,15 @@ impl NodeBuilder {
549551 Ok ( self )
550552 }
551553
554+ /// Configures the [`Node`] instance to enable payjoin payments.
555+ ///
556+ /// The `payjoin_config` specifies the PayJoin directory and OHTTP relay URLs required
557+ /// for payjoin V2 protocol.
558+ pub fn set_payjoin_config ( & mut self , payjoin_config : PayjoinConfig ) -> & mut Self {
559+ self . config . payjoin_config = Some ( payjoin_config) ;
560+ self
561+ }
562+
552563 /// Configures the [`Node`] to resync chain data from genesis on first startup, recovering any
553564 /// historical wallet funds.
554565 ///
@@ -972,6 +983,14 @@ impl ArcedNodeBuilder {
972983 self . inner . write ( ) . unwrap ( ) . set_async_payments_role ( role) . map ( |_| ( ) )
973984 }
974985
986+ /// Configures the [`Node`] instance to enable payjoin payments.
987+ ///
988+ /// The `payjoin_config` specifies the PayJoin directory and OHTTP relay URLs required
989+ /// for payjoin V2 protocol.
990+ pub fn set_payjoin_config ( & self , payjoin_config : PayjoinConfig ) {
991+ self . inner . write ( ) . unwrap ( ) . set_payjoin_config ( payjoin_config) ;
992+ }
993+
975994 /// Configures the [`Node`] to resync chain data from genesis on first startup, recovering any
976995 /// historical wallet funds.
977996 ///
@@ -1151,12 +1170,13 @@ fn build_with_store_internal(
11511170
11521171 let kv_store_ref = Arc :: clone ( & kv_store) ;
11531172 let logger_ref = Arc :: clone ( & logger) ;
1154- let ( payment_store_res, node_metris_res, pending_payment_store_res) =
1173+ let ( payment_store_res, node_metris_res, pending_payment_store_res, payjoin_session_store_res ) =
11551174 runtime. block_on ( async move {
11561175 tokio:: join!(
11571176 read_payments( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
11581177 read_node_metrics( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1159- read_pending_payments( & * kv_store_ref, Arc :: clone( & logger_ref) )
1178+ read_pending_payments( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1179+ read_payjoin_sessions( & * kv_store_ref, Arc :: clone( & logger_ref) )
11601180 )
11611181 } ) ;
11621182
@@ -1841,6 +1861,34 @@ fn build_with_store_internal(
18411861
18421862 let pathfinding_scores_sync_url = pathfinding_scores_sync_config. map ( |c| c. url . clone ( ) ) ;
18431863
1864+ let payjoin_session_store = match payjoin_session_store_res {
1865+ Ok ( payjoin_sessions) => Arc :: new ( PayjoinSessionStore :: new (
1866+ payjoin_sessions,
1867+ PAYJOIN_SESSION_STORE_PRIMARY_NAMESPACE . to_string ( ) ,
1868+ PAYJOIN_SESSION_STORE_SECONDARY_NAMESPACE . to_string ( ) ,
1869+ Arc :: clone ( & kv_store) ,
1870+ Arc :: clone ( & logger) ,
1871+ ) ) ,
1872+ Err ( e) => {
1873+ log_error ! ( logger, "Failed to read payjoin session data from store: {}" , e) ;
1874+ return Err ( BuildError :: ReadFailed ) ;
1875+ } ,
1876+ } ;
1877+
1878+ let payjoin_manager = Arc :: new ( PayjoinManager :: new (
1879+ Arc :: clone ( & payjoin_session_store) ,
1880+ Arc :: clone ( & logger) ,
1881+ Arc :: clone ( & config) ,
1882+ Arc :: clone ( & wallet) ,
1883+ Arc :: clone ( & fee_estimator) ,
1884+ Arc :: clone ( & chain_source) ,
1885+ Arc :: clone ( & channel_manager) ,
1886+ stop_sender. subscribe ( ) ,
1887+ Arc :: clone ( & payment_store) ,
1888+ Arc :: clone ( & pending_payment_store) ,
1889+ Arc :: clone ( & tx_broadcaster) ,
1890+ ) ) ;
1891+
18441892 #[ cfg( cycle_tests) ]
18451893 let mut _leak_checker = crate :: LeakChecker ( Vec :: new ( ) ) ;
18461894 #[ cfg( cycle_tests) ]
@@ -1888,6 +1936,7 @@ fn build_with_store_internal(
18881936 hrn_resolver,
18891937 #[ cfg( cycle_tests) ]
18901938 _leak_checker,
1939+ payjoin_manager,
18911940 } )
18921941}
18931942
0 commit comments