Skip to content

Commit ba5eaee

Browse files
Support abandoning pending outbound async payments.
1 parent 7bdaf90 commit ba5eaee

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
@@ -202,20 +202,26 @@ impl PendingOutboundPayment {
202202
}
203203

204204
fn mark_abandoned(&mut self, reason: PaymentFailureReason) {
205-
if let PendingOutboundPayment::Retryable { session_privs, payment_hash, .. } = self {
206-
let mut our_session_privs = new_hash_set();
207-
core::mem::swap(&mut our_session_privs, session_privs);
208-
*self = PendingOutboundPayment::Abandoned {
209-
session_privs: our_session_privs,
210-
payment_hash: *payment_hash,
211-
reason: Some(reason)
212-
};
213-
} else if let PendingOutboundPayment::InvoiceReceived { payment_hash, .. } = self {
214-
*self = PendingOutboundPayment::Abandoned {
215-
session_privs: new_hash_set(),
216-
payment_hash: *payment_hash,
217-
reason: Some(reason)
218-
};
205+
let session_privs = match self {
206+
PendingOutboundPayment::Retryable { session_privs, .. } => {
207+
let mut our_session_privs = new_hash_set();
208+
core::mem::swap(&mut our_session_privs, session_privs);
209+
our_session_privs
210+
},
211+
_ => new_hash_set(),
212+
};
213+
match self {
214+
Self::Retryable { payment_hash, .. } |
215+
Self::InvoiceReceived { payment_hash, .. } |
216+
Self::StaticInvoiceReceived { payment_hash, .. } =>
217+
{
218+
*self = Self::Abandoned {
219+
session_privs,
220+
payment_hash: *payment_hash,
221+
reason: Some(reason),
222+
};
223+
},
224+
_ => {}
219225
}
220226
}
221227

@@ -2676,4 +2682,44 @@ mod tests {
26762682
reason: Some(PaymentFailureReason::PaymentExpired),
26772683
}, None));
26782684
}
2685+
2686+
#[test]
2687+
fn abandon_unreleased_async_payment() {
2688+
let pending_events = Mutex::new(VecDeque::new());
2689+
let outbound_payments = OutboundPayments::new();
2690+
let payment_id = PaymentId([0; 32]);
2691+
let absolute_expiry = 60;
2692+
2693+
let mut outbounds = outbound_payments.pending_outbound_payments.lock().unwrap();
2694+
let payment_params = PaymentParameters::from_node_id(test_utils::pubkey(42), 0)
2695+
.with_expiry_time(absolute_expiry);
2696+
let route_params = RouteParameters {
2697+
payment_params,
2698+
final_value_msat: 0,
2699+
max_total_routing_fee_msat: None,
2700+
};
2701+
let payment_hash = PaymentHash([0; 32]);
2702+
let outbound = PendingOutboundPayment::StaticInvoiceReceived {
2703+
payment_hash,
2704+
keysend_preimage: PaymentPreimage([0; 32]),
2705+
retry_strategy: Retry::Attempts(0),
2706+
payment_release_secret: [0; 32],
2707+
route_params,
2708+
};
2709+
outbounds.insert(payment_id, outbound);
2710+
core::mem::drop(outbounds);
2711+
2712+
outbound_payments.abandon_payment(
2713+
payment_id, PaymentFailureReason::UserAbandoned, &pending_events
2714+
);
2715+
let outbounds = outbound_payments.pending_outbound_payments.lock().unwrap();
2716+
assert_eq!(outbounds.len(), 0);
2717+
let events = pending_events.lock().unwrap();
2718+
assert_eq!(events.len(), 1);
2719+
assert_eq!(events[0], (Event::PaymentFailed {
2720+
payment_hash,
2721+
payment_id,
2722+
reason: Some(PaymentFailureReason::UserAbandoned),
2723+
}, None));
2724+
}
26792725
}

0 commit comments

Comments
 (0)