@@ -3,7 +3,7 @@ use crate::event::HTLCStatus;
33use crate :: labels:: LabelStorage ;
44use crate :: ldkstorage:: CHANNEL_CLOSURE_PREFIX ;
55use crate :: logging:: LOGGING_KEY ;
6- use crate :: payjoin:: PayjoinStorage ;
6+ use crate :: payjoin:: { Error as PayjoinError , PayjoinStorage } ;
77use crate :: utils:: { sleep, spawn} ;
88use crate :: ActivityItem ;
99use crate :: MutinyInvoice ;
@@ -55,7 +55,9 @@ use lightning::util::logger::*;
5555use lightning:: { log_debug, log_error, log_info, log_trace, log_warn} ;
5656use lightning_invoice:: Bolt11Invoice ;
5757use lightning_transaction_sync:: EsploraSyncClient ;
58+ use payjoin:: receive:: v2:: Enrolled ;
5859use payjoin:: Uri ;
60+ use pj:: OhttpKeys ;
5961use reqwest:: Client ;
6062use serde:: { Deserialize , Serialize } ;
6163use serde_json:: Value ;
@@ -633,15 +635,7 @@ impl<S: MutinyStorage> NodeManager<S> {
633635 pub ( crate ) fn resume_payjoins ( nm : Arc < NodeManager < S > > ) {
634636 let all = nm. storage . get_payjoins ( ) . unwrap_or_default ( ) ;
635637 for payjoin in all {
636- let wallet = nm. wallet . clone ( ) ;
637- let stop = nm. stop . clone ( ) ;
638- let storage = Arc :: new ( nm. storage . clone ( ) ) ;
639- utils:: spawn ( async move {
640- let pj_txid = Self :: receive_payjoin ( wallet, stop, storage, payjoin)
641- . await
642- . unwrap ( ) ;
643- log:: info!( "Received payjoin txid: {}" , pj_txid) ;
644- } ) ;
638+ nm. clone ( ) . spawn_payjoin_receiver ( payjoin) ;
645639 }
646640 }
647641
@@ -734,6 +728,33 @@ impl<S: MutinyStorage> NodeManager<S> {
734728 Err ( MutinyError :: WalletOperationFailed )
735729 }
736730
731+ pub async fn start_payjoin_session ( & self ) -> Result < ( Enrolled , OhttpKeys ) , PayjoinError > {
732+ use crate :: payjoin:: { OHTTP_RELAYS , PAYJOIN_DIR } ;
733+
734+ let ohttp_keys =
735+ crate :: payjoin:: fetch_ohttp_keys ( OHTTP_RELAYS [ 0 ] . to_owned ( ) , PAYJOIN_DIR . to_owned ( ) )
736+ . await ?;
737+ let http_client = reqwest:: Client :: builder ( ) . build ( ) ?;
738+
739+ let mut enroller = payjoin:: receive:: v2:: Enroller :: from_directory_config (
740+ PAYJOIN_DIR . to_owned ( ) ,
741+ ohttp_keys. clone ( ) ,
742+ OHTTP_RELAYS [ 0 ] . to_owned ( ) , // TODO pick ohttp relay at random
743+ ) ;
744+ let ( req, context) = enroller. extract_req ( ) ?;
745+ let ohttp_response = http_client
746+ . post ( req. url )
747+ . header ( "Content-Type" , "message/ohttp-req" )
748+ . body ( req. body )
749+ . send ( )
750+ . await ?;
751+ let ohttp_response = ohttp_response. bytes ( ) . await ?;
752+ Ok ( (
753+ enroller. process_res ( ohttp_response. as_ref ( ) , context) ?,
754+ ohttp_keys,
755+ ) )
756+ }
757+
737758 // Send v1 payjoin request
738759 pub async fn send_payjoin (
739760 & self ,
@@ -809,15 +830,26 @@ impl<S: MutinyStorage> NodeManager<S> {
809830 Ok ( txid)
810831 }
811832
833+ pub fn spawn_payjoin_receiver ( & self , session : crate :: payjoin:: Session ) {
834+ let logger = self . logger . clone ( ) ;
835+ let wallet = self . wallet . clone ( ) ;
836+ let stop = self . stop . clone ( ) ;
837+ let storage = Arc :: new ( self . storage . clone ( ) ) ;
838+ utils:: spawn ( async move {
839+ match Self :: receive_payjoin ( wallet, stop, storage, session) . await {
840+ Ok ( txid) => log_info ! ( logger, "Received payjoin txid: {txid}" ) ,
841+ Err ( e) => log_error ! ( logger, "Error receiving payjoin: {e}" ) ,
842+ } ;
843+ } ) ;
844+ }
845+
812846 /// Poll the payjoin relay to maintain a payjoin session and create a payjoin proposal.
813- pub async fn receive_payjoin (
847+ async fn receive_payjoin (
814848 wallet : Arc < OnChainWallet < S > > ,
815849 stop : Arc < AtomicBool > ,
816850 storage : Arc < S > ,
817851 mut session : crate :: payjoin:: Session ,
818852 ) -> Result < Txid , MutinyError > {
819- use crate :: payjoin:: Error as PayjoinError ;
820-
821853 let http_client = reqwest:: Client :: builder ( )
822854 . build ( )
823855 . map_err ( PayjoinError :: Reqwest ) ?;
0 commit comments