Skip to content

Commit 0e00bee

Browse files
committed
f Fail duplicate inbound payments
1 parent c8e5f12 commit 0e00bee

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/event.rs

+16
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,22 @@ where
295295
via_channel_id: _,
296296
via_user_channel_id: _,
297297
} => {
298+
if let Some(info) = self.payment_store.get(&payment_hash) {
299+
if info.status == PaymentStatus::Succeeded {
300+
log_info!(
301+
self.logger,
302+
"Refused duplicate inbound payment from payment hash {} of {}msat",
303+
hex_utils::to_string(&payment_hash.0),
304+
amount_msat,
305+
);
306+
self.channel_manager.fail_htlc_backwards(&payment_hash);
307+
self.payment_store
308+
.set_status(&payment_hash, PaymentStatus::Failed)
309+
.expect("Failed to access payment store");
310+
return;
311+
}
312+
}
313+
298314
log_info!(
299315
self.logger,
300316
"Received payment from payment hash {} of {}msat",

src/tests/functional_tests.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,23 @@ fn channel_full_cycle() {
197197
};
198198

199199
println!("\nB receive_payment");
200-
let invoice = node_b.receive_payment(1000000, &"asdf", 9217).unwrap();
200+
let invoice_amount = 1000000;
201+
let invoice = node_b.receive_payment(invoice_amount, &"asdf", 9217).unwrap();
201202

202203
println!("\nA send_payment");
203-
node_a.send_payment(invoice).unwrap();
204+
let payment_hash = node_a.send_payment(invoice.clone()).unwrap();
204205

205206
expect_event!(node_a, PaymentSuccessful);
206207
expect_event!(node_b, PaymentReceived);
208+
assert_eq!(node_a.payment_info(&payment_hash).unwrap().status, PaymentStatus::Succeeded);
209+
assert_eq!(node_a.payment_info(&payment_hash).unwrap().direction, PaymentDirection::Outbound);
210+
assert_eq!(node_a.payment_info(&payment_hash).unwrap().amount_msat, Some(invoice_amount));
211+
assert_eq!(node_b.payment_info(&payment_hash).unwrap().status, PaymentStatus::Succeeded);
212+
assert_eq!(node_b.payment_info(&payment_hash).unwrap().direction, PaymentDirection::Inbound);
213+
assert_eq!(node_b.payment_info(&payment_hash).unwrap().amount_msat, Some(invoice_amount));
214+
215+
// Assert we fail duplicate outbound payments.
216+
assert_eq!(Err(Error::NonUniquePaymentHash), node_a.send_payment(invoice));
207217

208218
// Test under-/overpayment
209219
let invoice_amount = 1000000;

0 commit comments

Comments
 (0)