@@ -28,6 +28,7 @@ use lightning::util::logger::Level;
28
28
use bitcoin:: secp256k1:: PublicKey ;
29
29
30
30
use core:: ops:: Deref ;
31
+ use std:: sync:: MutexGuard ;
31
32
32
33
use crate :: lsps2:: msgs:: {
33
34
BuyRequest , BuyResponse , GetInfoRequest , GetInfoResponse , LSPS2Message , LSPS2Request ,
@@ -232,28 +233,13 @@ impl OutboundJITChannelState {
232
233
} => {
233
234
let mut payment_queue_lock = payment_queue. lock ( ) . unwrap ( ) ;
234
235
payment_queue_lock. add_htlc ( htlc) ;
235
- if let Some ( ( _payment_hash, htlcs) ) =
236
- payment_queue_lock. pop_greater_than_msat ( * opening_fee_msat)
237
- {
238
- let pending_payment_forward = OutboundJITChannelState :: PendingPaymentForward {
239
- payment_queue : payment_queue. clone ( ) ,
240
- opening_fee_msat : * opening_fee_msat,
241
- channel_id : * channel_id,
242
- } ;
243
- let forward_payment =
244
- HTLCInterceptedAction :: ForwardPayment ( ForwardPaymentAction (
245
- * channel_id,
246
- FeePayment { htlcs, opening_fee_msat : * opening_fee_msat } ,
247
- ) ) ;
248
- Ok ( ( pending_payment_forward, Some ( forward_payment) ) )
249
- } else {
250
- let pending_payment = OutboundJITChannelState :: PendingPayment {
251
- payment_queue : payment_queue. clone ( ) ,
252
- opening_fee_msat : * opening_fee_msat,
253
- channel_id : * channel_id,
254
- } ;
255
- Ok ( ( pending_payment, None ) )
256
- }
236
+ let ( state, payment_action) = try_get_payment (
237
+ Arc :: clone ( payment_queue) ,
238
+ payment_queue_lock,
239
+ * channel_id,
240
+ * opening_fee_msat,
241
+ ) ;
242
+ Ok ( ( state, payment_action. map ( |pa| HTLCInterceptedAction :: ForwardPayment ( pa) ) ) )
257
243
} ,
258
244
OutboundJITChannelState :: PaymentForwarded { channel_id } => {
259
245
let payment_forwarded =
@@ -269,19 +255,13 @@ impl OutboundJITChannelState {
269
255
) -> Result < ( Self , ForwardPaymentAction ) , ChannelStateError > {
270
256
match self {
271
257
OutboundJITChannelState :: PendingChannelOpen { payment_queue, opening_fee_msat } => {
272
- let mut payment_queue_lock = payment_queue. lock ( ) . unwrap ( ) ;
273
- if let Some ( ( _payment_hash, htlcs) ) =
274
- payment_queue_lock. pop_greater_than_msat ( * opening_fee_msat)
275
- {
276
- let pending_payment_forward = OutboundJITChannelState :: PendingPaymentForward {
277
- payment_queue : Arc :: clone ( & payment_queue) ,
278
- opening_fee_msat : * opening_fee_msat,
279
- channel_id,
280
- } ;
281
- let forward_payment = ForwardPaymentAction (
282
- channel_id,
283
- FeePayment { opening_fee_msat : * opening_fee_msat, htlcs } ,
284
- ) ;
258
+ let payment_queue_lock = payment_queue. lock ( ) . unwrap ( ) ;
259
+ if let ( pending_payment_forward, Some ( forward_payment) ) = try_get_payment (
260
+ Arc :: clone ( payment_queue) ,
261
+ payment_queue_lock,
262
+ channel_id,
263
+ * opening_fee_msat,
264
+ ) {
285
265
Ok ( ( pending_payment_forward, forward_payment) )
286
266
} else {
287
267
Err ( ChannelStateError (
@@ -306,28 +286,13 @@ impl OutboundJITChannelState {
306
286
opening_fee_msat,
307
287
channel_id,
308
288
} => {
309
- let mut payment_queue_lock = payment_queue. lock ( ) . unwrap ( ) ;
310
- if let Some ( ( _payment_hash, htlcs) ) =
311
- payment_queue_lock. pop_greater_than_msat ( * opening_fee_msat)
312
- {
313
- let pending_payment_forward = OutboundJITChannelState :: PendingPaymentForward {
314
- payment_queue : payment_queue. clone ( ) ,
315
- opening_fee_msat : * opening_fee_msat,
316
- channel_id : * channel_id,
317
- } ;
318
- let forward_payment = ForwardPaymentAction (
319
- * channel_id,
320
- FeePayment { htlcs, opening_fee_msat : * opening_fee_msat } ,
321
- ) ;
322
- Ok ( ( pending_payment_forward, Some ( forward_payment) ) )
323
- } else {
324
- let pending_payment = OutboundJITChannelState :: PendingPayment {
325
- payment_queue : payment_queue. clone ( ) ,
326
- opening_fee_msat : * opening_fee_msat,
327
- channel_id : * channel_id,
328
- } ;
329
- Ok ( ( pending_payment, None ) )
330
- }
289
+ let payment_queue_lock = payment_queue. lock ( ) . unwrap ( ) ;
290
+ Ok ( try_get_payment (
291
+ Arc :: clone ( payment_queue) ,
292
+ payment_queue_lock,
293
+ * channel_id,
294
+ * opening_fee_msat,
295
+ ) )
331
296
} ,
332
297
OutboundJITChannelState :: PendingPayment {
333
298
payment_queue,
@@ -1174,6 +1139,27 @@ fn calculate_amount_to_forward_per_htlc(
1174
1139
per_htlc_forwards
1175
1140
}
1176
1141
1142
+ fn try_get_payment (
1143
+ payment_queue : Arc < Mutex < PaymentQueue > > , mut payment_queue_lock : MutexGuard < PaymentQueue > ,
1144
+ channel_id : ChannelId , opening_fee_msat : u64 ,
1145
+ ) -> ( OutboundJITChannelState , Option < ForwardPaymentAction > ) {
1146
+ if let Some ( ( _payment_hash, htlcs) ) = payment_queue_lock. pop_greater_than_msat ( opening_fee_msat)
1147
+ {
1148
+ let pending_payment_forward = OutboundJITChannelState :: PendingPaymentForward {
1149
+ payment_queue,
1150
+ opening_fee_msat,
1151
+ channel_id,
1152
+ } ;
1153
+ let forward_payment =
1154
+ ForwardPaymentAction ( channel_id, FeePayment { htlcs, opening_fee_msat } ) ;
1155
+ ( pending_payment_forward, Some ( forward_payment) )
1156
+ } else {
1157
+ let pending_payment =
1158
+ OutboundJITChannelState :: PendingPayment { payment_queue, opening_fee_msat, channel_id } ;
1159
+ ( pending_payment, None )
1160
+ }
1161
+ }
1162
+
1177
1163
#[ cfg( test) ]
1178
1164
mod tests {
1179
1165
0 commit comments