diff --git a/lnbits/wallets/lndgrpc.py b/lnbits/wallets/lndgrpc.py index 00490135..61cdbe6c 100644 --- a/lnbits/wallets/lndgrpc.py +++ b/lnbits/wallets/lndgrpc.py @@ -16,6 +16,7 @@ from lnbits.utils.crypto import AESCipher, random_secret_and_hash from .base import ( InvoiceResponse, + PaymentFailedStatus, PaymentPendingStatus, PaymentResponse, PaymentStatus, @@ -237,6 +238,9 @@ class LndWallet(Wallet): if resp.settled: return PaymentSuccessStatus(preimage=resp.r_preimage.hex()) + if resp.state == "CANCELED": + return PaymentFailedStatus() + return PaymentPendingStatus() except grpc.RpcError as exc: logger.warning(exc) diff --git a/lnbits/wallets/lndrest.py b/lnbits/wallets/lndrest.py index 1601f2a9..394a43b4 100644 --- a/lnbits/wallets/lndrest.py +++ b/lnbits/wallets/lndrest.py @@ -225,15 +225,22 @@ class LndRestWallet(Wallet): try: r.raise_for_status() data = r.json() - - if r.is_error or not data.get("settled"): - # this must also work when checking_id is not a hex recognizable by lnd - # it will return an error and no "settled" attribute on the object - return PaymentPendingStatus() except Exception as e: logger.error(f"Error getting invoice status: {e}") return PaymentPendingStatus() - return PaymentSuccessStatus() + + if r.is_error or data.get("settled") is None: + # this must also work when checking_id is not a hex recognizable by lnd + # it will return an error and no "settled" attribute on the object + return PaymentPendingStatus() + + if data.get("settled") is True: + return PaymentSuccessStatus() + + if data.get("state") == "CANCELED": + return PaymentFailedStatus() + + return PaymentPendingStatus() async def get_payment_status(self, checking_id: str) -> PaymentStatus: """