Skip to content

Commit f316229

Browse files
Support abandoning pending outbound async payments.
1 parent 464798f commit f316229

File tree

1 file changed

+60
-14
lines changed

1 file changed

+60
-14
lines changed

lightning/src/ln/outbound_payment.rs

+60-14
Original file line numberDiff line numberDiff line change
@@ -212,20 +212,26 @@ impl PendingOutboundPayment {
212212
}
213213

214214
fn mark_abandoned(&mut self, reason: PaymentFailureReason) {
215-
if let PendingOutboundPayment::Retryable { session_privs, payment_hash, .. } = self {
216-
let mut our_session_privs = new_hash_set();
217-
core::mem::swap(&mut our_session_privs, session_privs);
218-
*self = PendingOutboundPayment::Abandoned {
219-
session_privs: our_session_privs,
220-
payment_hash: *payment_hash,
221-
reason: Some(reason)
222-
};
223-
} else if let PendingOutboundPayment::InvoiceReceived { payment_hash, .. } = self {
224-
*self = PendingOutboundPayment::Abandoned {
225-
session_privs: new_hash_set(),
226-
payment_hash: *payment_hash,
227-
reason: Some(reason)
228-
};
215+
let session_privs = match self {
216+
PendingOutboundPayment::Retryable { session_privs, .. } => {
217+
let mut our_session_privs = new_hash_set();
218+
core::mem::swap(&mut our_session_privs, session_privs);
219+
our_session_privs
220+
},
221+
_ => new_hash_set(),
222+
};
223+
match self {
224+
Self::Retryable { payment_hash, .. } |
225+
Self::InvoiceReceived { payment_hash, .. } |
226+
Self::StaticInvoiceReceived { payment_hash, .. } =>
227+
{
228+
*self = Self::Abandoned {
229+
session_privs,
230+
payment_hash: *payment_hash,
231+
reason: Some(reason),
232+
};
233+
},
234+
_ => {}
229235
}
230236
}
231237

@@ -2580,4 +2586,44 @@ mod tests {
25802586
reason: Some(PaymentFailureReason::PaymentExpired),
25812587
}, None));
25822588
}
2589+
2590+
#[test]
2591+
fn abandon_unreleased_async_payment() {
2592+
let pending_events = Mutex::new(VecDeque::new());
2593+
let outbound_payments = OutboundPayments::new();
2594+
let payment_id = PaymentId([0; 32]);
2595+
let absolute_expiry = 60;
2596+
2597+
let mut outbounds = outbound_payments.pending_outbound_payments.lock().unwrap();
2598+
let payment_params = PaymentParameters::from_node_id(test_utils::pubkey(42), 0)
2599+
.with_expiry_time(absolute_expiry);
2600+
let route_params = RouteParameters {
2601+
payment_params,
2602+
final_value_msat: 0,
2603+
max_total_routing_fee_msat: None,
2604+
};
2605+
let payment_hash = PaymentHash([0; 32]);
2606+
let outbound = PendingOutboundPayment::StaticInvoiceReceived {
2607+
payment_hash,
2608+
keysend_preimage: PaymentPreimage([0; 32]),
2609+
retry_strategy: Retry::Attempts(0),
2610+
payment_release_secret: [0; 32],
2611+
route_params,
2612+
};
2613+
outbounds.insert(payment_id, outbound);
2614+
core::mem::drop(outbounds);
2615+
2616+
outbound_payments.abandon_payment(
2617+
payment_id, PaymentFailureReason::UserAbandoned, &pending_events
2618+
);
2619+
let outbounds = outbound_payments.pending_outbound_payments.lock().unwrap();
2620+
assert_eq!(outbounds.len(), 0);
2621+
let events = pending_events.lock().unwrap();
2622+
assert_eq!(events.len(), 1);
2623+
assert_eq!(events[0], (Event::PaymentFailed {
2624+
payment_hash,
2625+
payment_id,
2626+
reason: Some(PaymentFailureReason::UserAbandoned),
2627+
}, None));
2628+
}
25832629
}

0 commit comments

Comments
 (0)