@@ -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,34 @@ 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+ // enroll client
745+ let ( req, context) = enroller. extract_req ( ) ?;
746+ let ohttp_response = http_client
747+ . post ( req. url )
748+ . header ( "Content-Type" , "message/ohttp-req" )
749+ . body ( req. body )
750+ . send ( )
751+ . await ?;
752+ let ohttp_response = ohttp_response. bytes ( ) . await ?;
753+ Ok ( (
754+ enroller. process_res ( ohttp_response. as_ref ( ) , context) ?,
755+ ohttp_keys,
756+ ) )
757+ }
758+
737759 // Send v1 payjoin request
738760 pub async fn send_payjoin (
739761 & self ,
@@ -809,8 +831,21 @@ impl<S: MutinyStorage> NodeManager<S> {
809831 Ok ( txid)
810832 }
811833
834+ pub fn spawn_payjoin_receiver ( & self , session : crate :: payjoin:: Session ) {
835+ let logger = self . logger . clone ( ) ;
836+ let wallet = self . wallet . clone ( ) ;
837+ let stop = self . stop . clone ( ) ;
838+ let storage = Arc :: new ( self . storage . clone ( ) ) ;
839+ utils:: spawn ( async move {
840+ match Self :: receive_payjoin ( wallet, stop, storage, session) . await {
841+ Ok ( txid) => log_info ! ( logger, "Received payjoin txid: {txid}" ) ,
842+ Err ( e) => log_error ! ( logger, "Error receiving payjoin: {e}" ) ,
843+ } ;
844+ } ) ;
845+ }
846+
812847 /// Poll the payjoin relay to maintain a payjoin session and create a payjoin proposal.
813- pub async fn receive_payjoin (
848+ async fn receive_payjoin (
814849 wallet : Arc < OnChainWallet < S > > ,
815850 stop : Arc < AtomicBool > ,
816851 storage : Arc < S > ,
@@ -819,7 +854,9 @@ impl<S: MutinyStorage> NodeManager<S> {
819854 let http_client = reqwest:: Client :: builder ( ) . build ( ) ?;
820855 let proposal: payjoin:: receive:: v2:: UncheckedProposal =
821856 Self :: poll_for_fallback_psbt ( stop, storage, & http_client, & mut session) . await ?;
822- let mut payjoin_proposal = wallet. process_payjoin_proposal ( proposal) . unwrap ( ) ;
857+ let mut payjoin_proposal = wallet
858+ . process_payjoin_proposal ( proposal)
859+ . map_err ( PayjoinError :: Wallet ) ?;
823860
824861 let ( req, ohttp_ctx) = payjoin_proposal. extract_v2_req ( ) ?;
825862 let res = http_client
0 commit comments