@@ -809,8 +809,11 @@ impl<S: MutinyStorage> NodeManager<S> {
809
809
for payjoin in all {
810
810
let wallet = nm. wallet . clone ( ) ;
811
811
let stop = nm. stop . clone ( ) ;
812
+ let storage = Arc :: new ( nm. storage . clone ( ) ) ;
812
813
utils:: spawn ( async move {
813
- let pj_txid = Self :: receive_payjoin ( wallet, stop, payjoin) . await . unwrap ( ) ;
814
+ let pj_txid = Self :: receive_payjoin ( wallet, stop, storage, payjoin)
815
+ . await
816
+ . unwrap ( ) ;
814
817
log:: info!( "Received payjoin txid: {}" , pj_txid) ;
815
818
} ) ;
816
819
}
@@ -1057,14 +1060,17 @@ impl<S: MutinyStorage> NodeManager<S> {
1057
1060
. process_res ( ohttp_response. as_ref ( ) , context)
1058
1061
. map_err ( |e| anyhow ! ( "parse error {}" , e) )
1059
1062
. unwrap ( ) ;
1060
- self . storage . persist_payjoin ( enrolled. clone ( ) ) . unwrap ( ) ;
1063
+ let session = self . storage . persist_payjoin ( enrolled. clone ( ) ) . unwrap ( ) ;
1061
1064
let pj_uri = enrolled. fallback_target ( ) ;
1062
1065
log_debug ! ( self . logger, "{pj_uri}" ) ;
1063
1066
// run await payjoin task in the background as it'll keep polling the relay
1064
1067
let wallet = self . wallet . clone ( ) ;
1065
1068
let stop = self . stop . clone ( ) ;
1069
+ let storage = Arc :: new ( self . storage . clone ( ) ) ;
1066
1070
utils:: spawn ( async move {
1067
- let pj_txid = Self :: receive_payjoin ( wallet, stop, enrolled) . await . unwrap ( ) ;
1071
+ let pj_txid = Self :: receive_payjoin ( wallet, stop, storage, session)
1072
+ . await
1073
+ . unwrap ( ) ;
1068
1074
log:: info!( "Received payjoin txid: {}" , pj_txid) ;
1069
1075
} ) ;
1070
1076
Some ( pj_uri)
@@ -1155,14 +1161,15 @@ impl<S: MutinyStorage> NodeManager<S> {
1155
1161
pub async fn receive_payjoin (
1156
1162
wallet : Arc < OnChainWallet < S > > ,
1157
1163
stop : Arc < AtomicBool > ,
1158
- mut enrolled : payjoin:: receive:: v2:: Enrolled ,
1164
+ storage : Arc < S > ,
1165
+ mut session : crate :: payjoin:: Session ,
1159
1166
) -> Result < Txid , MutinyError > {
1160
1167
let http_client = reqwest:: Client :: builder ( )
1161
1168
//.danger_accept_invalid_certs(true) ? is tls unchecked :O
1162
1169
. build ( )
1163
1170
. unwrap ( ) ;
1164
1171
let proposal: payjoin:: receive:: v2:: UncheckedProposal =
1165
- Self :: poll_for_fallback_psbt ( stop, & http_client, & mut enrolled )
1172
+ Self :: poll_for_fallback_psbt ( stop, storage , & http_client, & mut session )
1166
1173
. await
1167
1174
. unwrap ( ) ;
1168
1175
let payjoin_proposal = wallet. process_payjoin_proposal ( proposal) . unwrap ( ) ;
@@ -1187,17 +1194,23 @@ impl<S: MutinyStorage> NodeManager<S> {
1187
1194
1188
1195
async fn poll_for_fallback_psbt (
1189
1196
stop : Arc < AtomicBool > ,
1197
+ storage : Arc < S > ,
1190
1198
client : & reqwest:: Client ,
1191
- enroller : & mut payjoin :: receive :: v2 :: Enrolled ,
1199
+ session : & mut crate :: payjoin :: Session ,
1192
1200
) -> Result < payjoin:: receive:: v2:: UncheckedProposal , ( ) > {
1193
1201
loop {
1194
1202
if stop. load ( Ordering :: Relaxed ) {
1195
1203
return Err ( ( ) ) ; // stopped
1196
1204
}
1197
- let ( req, context) = enroller. extract_req ( ) . unwrap ( ) ;
1205
+ if session. expiry < utils:: now ( ) {
1206
+ let _ = storage. delete_payjoin ( & session. enrolled . pubkey ( ) ) ;
1207
+ return Err ( ( ) ) ; // expired
1208
+ }
1209
+ let ( req, context) = session. enrolled . extract_req ( ) . unwrap ( ) ;
1198
1210
let ohttp_response = client. post ( req. url ) . body ( req. body ) . send ( ) . await . unwrap ( ) ;
1199
1211
let ohttp_response = ohttp_response. bytes ( ) . await . unwrap ( ) ;
1200
- let proposal = enroller
1212
+ let proposal = session
1213
+ . enrolled
1201
1214
. process_res ( ohttp_response. as_ref ( ) , context)
1202
1215
. map_err ( |e| anyhow ! ( "parse error {}" , e) )
1203
1216
. unwrap ( ) ;
0 commit comments