1
0

Merge pull request #10059 from f321x/fix_issue_10057

fix: cli: check_hold_invoice showing settled invoice as unpaid
This commit is contained in:
ghost43
2025-07-21 15:53:54 +00:00
committed by GitHub
2 changed files with 22 additions and 6 deletions

View File

@@ -1427,6 +1427,8 @@ class Commands(Logger):
assert payment_hash in wallet.lnworker.dont_settle_htlcs, f"Invoice {payment_hash=} not a hold invoice?"
assert wallet.lnworker.is_accepted_mpp(bfh(payment_hash)), \
f"MPP incomplete, cannot settle hold invoice {payment_hash} yet"
info: Optional['PaymentInfo'] = wallet.lnworker.get_payment_info(bfh(payment_hash))
assert (wallet.lnworker.get_payment_mpp_amount_msat(bfh(payment_hash)) or 0) >= (info.amount_msat or 0)
del wallet.lnworker.dont_settle_htlcs[payment_hash]
wallet.lnworker.save_preimage(bfh(payment_hash), bfh(preimage))
util.trigger_callback('wallet_updated', wallet)
@@ -1474,18 +1476,23 @@ class Commands(Logger):
status = "unknown"
if info is None:
pass
elif not is_accepted_mpp:
elif not is_accepted_mpp and not wallet.lnworker.get_preimage_hex(payment_hash):
# is_accepted_mpp is False for settled payments
status = "unpaid"
elif is_accepted_mpp and payment_hash in wallet.lnworker.dont_settle_htlcs:
status = "paid"
elif (payment_hash in wallet.lnworker._preimages
and payment_hash not in wallet.lnworker.dont_settle_htlcs
and is_accepted_mpp):
elif wallet.lnworker.get_preimage_hex(payment_hash) is not None \
and payment_hash not in wallet.lnworker.dont_settle_htlcs:
status = "settled"
plist = wallet.lnworker.get_payments(status='settled')[bfh(payment_hash)]
_dir, amount_msat, _fee, _ts = wallet.lnworker.get_payment_value(info, plist)
amount_sat = amount_msat // 1000
result = {
"status": status,
"amount_sat": amount_sat
"received_amount_sat": amount_sat,
}
if info is not None:
result["invoice_amount_sat"] = (info.amount_msat or 0) // 1000
return result
@command('w')

View File

@@ -495,7 +495,7 @@ class TestCommandsTestnet(ElectrumTestCase):
mock.patch.object(wallet.lnworker, 'get_payment_mpp_amount_msat', return_value=10_000 * 1000):
status: dict = await cmds.check_hold_invoice(payment_hash=payment_hash, wallet=wallet)
assert status['status'] == 'paid'
assert status['amount_sat'] == 10000
assert status['received_amount_sat'] == 10000
settle_result = await cmds.settle_hold_invoice(
preimage=preimage.hex(),
@@ -504,6 +504,15 @@ class TestCommandsTestnet(ElectrumTestCase):
assert settle_result['settled'] == payment_hash
assert wallet.lnworker._preimages[payment_hash] == preimage.hex()
assert payment_hash not in wallet.lnworker.dont_settle_htlcs
with (mock.patch.object(
wallet.lnworker,
'get_payment_value',
return_value=(None, 10000*1000, None, None),
)):
settled_status: dict = await cmds.check_hold_invoice(payment_hash=payment_hash, wallet=wallet)
assert settled_status['status'] == 'settled'
assert settled_status['received_amount_sat'] == 10000
assert settled_status['invoice_amount_sat'] == 10000
with self.assertRaises(AssertionError):
# cancelling a settled invoice should raise