From a406f7bba0e8fa9df142be37eefd7b0857aa7970 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Wed, 6 Sep 2023 20:59:15 +0200 Subject: [PATCH] lnpeer: return hold invoice callback after checking received amount --- electrum/lnpeer.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py index dc5ef224b..a9714bc7f 100644 --- a/electrum/lnpeer.py +++ b/electrum/lnpeer.py @@ -1885,14 +1885,6 @@ class Peer(Logger): trampoline_onion=trampoline_onion) return None, callback - preimage = self.lnworker.get_preimage(payment_hash) - hold_invoice_callback = self.lnworker.hold_invoice_callbacks.get(payment_hash) - if hold_invoice_callback: - if preimage: - return preimage, None - else: - return None, lambda: hold_invoice_callback(payment_hash) - # TODO don't accept payments twice for same invoice # TODO check invoice expiry info = self.lnworker.get_payment_info(payment_hash) @@ -1901,12 +1893,9 @@ class Peer(Logger): raise exc_incorrect_or_unknown_pd preimage = self.lnworker.get_preimage(payment_hash) - if not preimage: - self.logger.info(f"missing preimage and no hold invoice callback {payment_hash.hex()}") - raise exc_incorrect_or_unknown_pd - expected_payment_secrets = [self.lnworker.get_payment_secret(htlc.payment_hash)] - expected_payment_secrets.append(derive_payment_secret_from_payment_preimage(preimage)) # legacy secret for old invoices + if preimage: + expected_payment_secrets.append(derive_payment_secret_from_payment_preimage(preimage)) # legacy secret for old invoices if payment_secret_from_onion not in expected_payment_secrets: log_fail_reason(f'incorrect payment secret {payment_secret_from_onion.hex()} != {expected_payment_secrets[0].hex()}') raise exc_incorrect_or_unknown_pd @@ -1914,6 +1903,15 @@ class Peer(Logger): if not (invoice_msat is None or invoice_msat <= total_msat <= 2 * invoice_msat): log_fail_reason(f"total_msat={total_msat} too different from invoice_msat={invoice_msat}") raise exc_incorrect_or_unknown_pd + + hold_invoice_callback = self.lnworker.hold_invoice_callbacks.get(payment_hash) + if hold_invoice_callback and not preimage: + return None, lambda: hold_invoice_callback(payment_hash) + + if not preimage: + self.logger.info(f"missing preimage and no hold invoice callback {payment_hash.hex()}") + raise exc_incorrect_or_unknown_pd + self.logger.info(f"maybe_fulfill_htlc. will FULFILL HTLC: chan {chan.short_channel_id}. htlc={str(htlc)}") return preimage, None