diff --git a/lnbits/core/services/payments.py b/lnbits/core/services/payments.py index 5064b6a1d..a00dd4646 100644 --- a/lnbits/core/services/payments.py +++ b/lnbits/core/services/payments.py @@ -132,29 +132,29 @@ async def create_invoice( status="failed", ) - ( - ok, - checking_id, - payment_request, - error_message, - ) = await funding_source.create_invoice( + payment_response = await funding_source.create_invoice( amount=amount_sat, memo=invoice_memo, description_hash=description_hash, unhashed_description=unhashed_description, expiry=expiry or settings.lightning_invoice_expiry, ) - if not ok or not payment_request or not checking_id: + if ( + not payment_response.ok + or not payment_response.payment_request + or not payment_response.checking_id + ): raise InvoiceError( - error_message or "unexpected backend error.", status="pending" + message=payment_response.error_message or "unexpected backend error.", + status="pending", ) - - invoice = bolt11_decode(payment_request) + invoice = bolt11_decode(payment_response.payment_request) create_payment_model = CreatePayment( wallet_id=wallet_id, - bolt11=payment_request, + bolt11=payment_response.payment_request, payment_hash=invoice.payment_hash, + preimage=payment_response.preimage, amount_msat=amount_sat * 1000, expiry=invoice.expiry_date, memo=memo, @@ -163,7 +163,7 @@ async def create_invoice( ) payment = await create_payment( - checking_id=checking_id, + checking_id=payment_response.checking_id, data=create_payment_model, conn=conn, ) @@ -486,6 +486,9 @@ async def _pay_internal_invoice( if wallet.balance_msat < abs(amount_msat) + fee_reserve_total_msat: raise PaymentError("Insufficient balance.", status="failed") + # release the preimage + create_payment_model.preimage = internal_invoice.preimage + internal_id = f"internal_{create_payment_model.payment_hash}" logger.debug(f"creating temporary internal payment with id {internal_id}") payment = await create_payment( diff --git a/lnbits/tasks.py b/lnbits/tasks.py index 4d84cae11..a04407cc6 100644 --- a/lnbits/tasks.py +++ b/lnbits/tasks.py @@ -203,7 +203,8 @@ async def invoice_callback_dispatcher(checking_id: str, is_internal: bool = Fals if payment and payment.is_in: status = await payment.check_status() payment.fee = status.fee_msat or 0 - payment.preimage = status.preimage + # only overwrite preimage if status.preimage provides it + payment.preimage = status.preimage or payment.preimage payment.status = PaymentState.SUCCESS await update_payment(payment) internal = "internal" if is_internal else "" diff --git a/lnbits/wallets/alby.py b/lnbits/wallets/alby.py index cda22b076..72d40c257 100644 --- a/lnbits/wallets/alby.py +++ b/lnbits/wallets/alby.py @@ -99,10 +99,12 @@ class AlbyWallet(Wallet): checking_id = data["payment_hash"] payment_request = data["payment_request"] + preimage = data.get("payment_preimage") return InvoiceResponse( ok=True, checking_id=checking_id, payment_request=payment_request, + preimage=preimage, ) except KeyError as exc: logger.warning(exc) diff --git a/lnbits/wallets/base.py b/lnbits/wallets/base.py index ff024a070..1801e74e7 100644 --- a/lnbits/wallets/base.py +++ b/lnbits/wallets/base.py @@ -20,6 +20,7 @@ class InvoiceResponse(NamedTuple): checking_id: str | None = None # payment_hash, rpc_id payment_request: str | None = None error_message: str | None = None + preimage: str | None = None @property def success(self) -> bool: diff --git a/lnbits/wallets/cliche.py b/lnbits/wallets/cliche.py index c8a391bc5..09a95370e 100644 --- a/lnbits/wallets/cliche.py +++ b/lnbits/wallets/cliche.py @@ -99,6 +99,7 @@ class ClicheWallet(Wallet): ok=True, checking_id=checking_id, payment_request=payment_request, + preimage=data["result"].get("preimage"), ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: diff --git a/lnbits/wallets/corelightning.py b/lnbits/wallets/corelightning.py index f014791b1..3e32c9f14 100644 --- a/lnbits/wallets/corelightning.py +++ b/lnbits/wallets/corelightning.py @@ -1,6 +1,7 @@ import asyncio import random -from typing import Any, AsyncGenerator, Optional +from collections.abc import AsyncGenerator +from typing import Any, Optional from bolt11.decode import decode as bolt11_decode from bolt11.exceptions import Bolt11Exception @@ -9,6 +10,7 @@ from pyln.client import LightningRpc, RpcError from lnbits.nodes.cln import CoreLightningNode from lnbits.settings import settings +from lnbits.utils.crypto import random_secret_and_hash from .base import ( InvoiceResponse, @@ -100,6 +102,11 @@ class CoreLightningWallet(Wallet): ) if unhashed_description and not self.supports_description_hash: raise UnsupportedError("unhashed_description") + + preimage = kwargs.get("preimage") + if not preimage: + preimage, _ = random_secret_and_hash() + r: dict = self.ln.invoice( # type: ignore amount_msat=msat, label=label, @@ -107,6 +114,7 @@ class CoreLightningWallet(Wallet): unhashed_description.decode() if unhashed_description else memo ), exposeprivatechannels=True, + preimage=preimage, deschashonly=( True if unhashed_description else False ), # we can't pass None here @@ -119,6 +127,7 @@ class CoreLightningWallet(Wallet): ok=True, checking_id=r["payment_hash"], payment_request=r["bolt11"], + preimage=preimage, ) except RpcError as exc: logger.warning(exc) diff --git a/lnbits/wallets/corelightningrest.py b/lnbits/wallets/corelightningrest.py index d42ea9063..dfbea09ed 100644 --- a/lnbits/wallets/corelightningrest.py +++ b/lnbits/wallets/corelightningrest.py @@ -1,7 +1,8 @@ import asyncio import json import random -from typing import AsyncGenerator, Optional +from collections.abc import AsyncGenerator +from typing import Optional import httpx from bolt11 import Bolt11Exception @@ -9,6 +10,7 @@ from bolt11.decode import decode from loguru import logger from lnbits.settings import settings +from lnbits.utils.crypto import random_secret_and_hash from .base import ( InvoiceResponse, @@ -126,8 +128,10 @@ class CoreLightningRestWallet(Wallet): if kwargs.get("expiry"): data["expiry"] = kwargs["expiry"] - if kwargs.get("preimage"): - data["preimage"] = kwargs["preimage"] + preimage, _ = random_secret_and_hash() + + # https://github.com/Ride-The-Lightning/c-lightning-REST/blob/master/controllers/invoice.js#L52C17-L52C25 + data["preimage"] = preimage try: r = await self.client.post( @@ -160,6 +164,7 @@ class CoreLightningRestWallet(Wallet): ok=True, checking_id=data["payment_hash"], payment_request=data["bolt11"], + preimage=preimage, ) except json.JSONDecodeError: return InvoiceResponse( diff --git a/lnbits/wallets/eclair.py b/lnbits/wallets/eclair.py index b8b8ea82a..daec315fa 100644 --- a/lnbits/wallets/eclair.py +++ b/lnbits/wallets/eclair.py @@ -10,6 +10,7 @@ from loguru import logger from websockets.client import connect from lnbits.settings import settings +from lnbits.utils.crypto import random_secret_and_hash from .base import ( InvoiceResponse, @@ -99,6 +100,9 @@ class EclairWallet(Wallet): else: data["description"] = memo + preimage, _ = random_secret_and_hash() + data["paymentPreimage"] = preimage + try: r = await self.client.post("/createinvoice", data=data, timeout=40) r.raise_for_status() @@ -120,6 +124,7 @@ class EclairWallet(Wallet): ok=True, checking_id=data["paymentHash"], payment_request=data["serialized"], + preimage=preimage, ) except json.JSONDecodeError: return InvoiceResponse( diff --git a/lnbits/wallets/fake.py b/lnbits/wallets/fake.py index 528231d64..d4ac1e3d3 100644 --- a/lnbits/wallets/fake.py +++ b/lnbits/wallets/fake.py @@ -100,7 +100,7 @@ class FakeWallet(Wallet): ok=True, checking_id=payment_hash, payment_request=payment_request, - # preimage=preimage.hex(), + preimage=preimage.hex(), ) async def pay_invoice(self, bolt11: str, _: int) -> PaymentResponse: diff --git a/lnbits/wallets/lnbits.py b/lnbits/wallets/lnbits.py index d6cc58569..5066a5dec 100644 --- a/lnbits/wallets/lnbits.py +++ b/lnbits/wallets/lnbits.py @@ -96,7 +96,10 @@ class LNbitsWallet(Wallet): ) return InvoiceResponse( - ok=True, checking_id=data["checking_id"], payment_request=payment_str + ok=True, + checking_id=data["checking_id"], + payment_request=payment_str, + preimage=data.get("preimage"), ) except json.JSONDecodeError: return InvoiceResponse( diff --git a/lnbits/wallets/lndgrpc.py b/lnbits/wallets/lndgrpc.py index e338f223d..004901352 100644 --- a/lnbits/wallets/lndgrpc.py +++ b/lnbits/wallets/lndgrpc.py @@ -1,6 +1,6 @@ import asyncio import base64 -import hashlib +from hashlib import sha256 from os import environ from typing import AsyncGenerator, Dict, Optional @@ -12,7 +12,7 @@ import lnbits.wallets.lnd_grpc_files.lightning_pb2_grpc as lnrpc import lnbits.wallets.lnd_grpc_files.router_pb2 as router import lnbits.wallets.lnd_grpc_files.router_pb2_grpc as routerrpc from lnbits.settings import settings -from lnbits.utils.crypto import AESCipher +from lnbits.utils.crypto import AESCipher, random_secret_and_hash from .base import ( InvoiceResponse, @@ -139,22 +139,37 @@ class LndWallet(Wallet): if description_hash: data["description_hash"] = description_hash elif unhashed_description: - data["description_hash"] = hashlib.sha256( - unhashed_description - ).digest() # as bytes directly + data["description_hash"] = sha256(unhashed_description).digest() + preimage = kwargs.get("preimage") + if preimage: + payment_hash = sha256(preimage.encode()).hexdigest() + else: + preimage, payment_hash = random_secret_and_hash() + + data["r_hash"] = bytes.fromhex(payment_hash) + data["r_preimage"] = bytes.fromhex(preimage) try: req = ln.Invoice(**data) resp = await self.rpc.AddInvoice(req) + # response model + # { + # "r_hash": , + # "payment_request": , + # "add_index": , + # "payment_addr": , + # } except Exception as exc: logger.warning(exc) - error_message = str(exc) - return InvoiceResponse(ok=False, error_message=error_message) + return InvoiceResponse(ok=False, error_message=str(exc)) checking_id = bytes_to_hex(resp.r_hash) payment_request = str(resp.payment_request) return InvoiceResponse( - ok=True, checking_id=checking_id, payment_request=payment_request + ok=True, + checking_id=checking_id, + payment_request=payment_request, + preimage=preimage, ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: @@ -197,16 +212,18 @@ class LndWallet(Wallet): fee_msat = -resp.htlcs[-1].route.total_fees_msat preimage = resp.payment_preimage checking_id = resp.payment_hash + return PaymentResponse( + ok=True, checking_id=checking_id, fee_msat=fee_msat, preimage=preimage + ) elif statuses[resp.status] is False: error_message = failure_reasons[resp.failure_reason] - - return PaymentResponse( - ok=statuses[resp.status], - checking_id=checking_id, - fee_msat=fee_msat, - preimage=preimage, - error_message=error_message, - ) + return PaymentResponse(ok=False, error_message=error_message) + else: + return PaymentResponse( + ok=None, + checking_id=checking_id, + error_message="Payment in flight or non-existant.", + ) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: try: @@ -217,10 +234,8 @@ class LndWallet(Wallet): raise ValueError resp = await self.rpc.LookupInvoice(ln.PaymentHash(r_hash=r_hash)) - - # todo: where is the FAILED status if resp.settled: - return PaymentSuccessStatus() + return PaymentSuccessStatus(preimage=resp.r_preimage.hex()) return PaymentPendingStatus() except grpc.RpcError as exc: diff --git a/lnbits/wallets/lndrest.py b/lnbits/wallets/lndrest.py index 4d6662dfe..1601f2a96 100644 --- a/lnbits/wallets/lndrest.py +++ b/lnbits/wallets/lndrest.py @@ -9,7 +9,7 @@ from loguru import logger from lnbits.nodes.lndrest import LndRestNode from lnbits.settings import settings -from lnbits.utils.crypto import AESCipher +from lnbits.utils.crypto import AESCipher, random_secret_and_hash from .base import ( InvoiceResponse, @@ -110,24 +110,28 @@ class LndRestWallet(Wallet): unhashed_description: Optional[bytes] = None, **kwargs, ) -> InvoiceResponse: - data: Dict = { + _data: Dict = { "value": amount, "private": settings.lnd_rest_route_hints, "memo": memo or "", } if kwargs.get("expiry"): - data["expiry"] = kwargs["expiry"] + _data["expiry"] = kwargs["expiry"] if description_hash: - data["description_hash"] = base64.b64encode(description_hash).decode( + _data["description_hash"] = base64.b64encode(description_hash).decode( "ascii" ) elif unhashed_description: - data["description_hash"] = base64.b64encode( + _data["description_hash"] = base64.b64encode( hashlib.sha256(unhashed_description).digest() ).decode("ascii") + preimage, _payment_hash = random_secret_and_hash() + _data["r_hash"] = base64.b64encode(bytes.fromhex(_payment_hash)).decode() + _data["r_preimage"] = base64.b64encode(bytes.fromhex(preimage)).decode() + try: - r = await self.client.post(url="/v1/invoices", json=data) + r = await self.client.post(url="/v1/invoices", json=_data) r.raise_for_status() data = r.json() @@ -156,6 +160,7 @@ class LndRestWallet(Wallet): ok=True, checking_id=checking_id, payment_request=payment_request, + preimage=preimage, ) except json.JSONDecodeError: diff --git a/lnbits/wallets/lntips.py b/lnbits/wallets/lntips.py index 3e3e348ab..e5101650d 100644 --- a/lnbits/wallets/lntips.py +++ b/lnbits/wallets/lntips.py @@ -98,6 +98,7 @@ class LnTipsWallet(Wallet): ok=True, checking_id=data["payment_hash"], payment_request=data["payment_request"], + preimage=data.get("preimage"), ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: diff --git a/lnbits/wallets/phoenixd.py b/lnbits/wallets/phoenixd.py index 64808fbe3..0af3db661 100644 --- a/lnbits/wallets/phoenixd.py +++ b/lnbits/wallets/phoenixd.py @@ -138,10 +138,12 @@ class PhoenixdWallet(Wallet): checking_id = data["paymentHash"] payment_request = data["serialized"] + preimage = data.get("paymentPreimage", None) # if available return InvoiceResponse( ok=True, checking_id=checking_id, payment_request=payment_request, + preimage=preimage, ) except json.JSONDecodeError: return InvoiceResponse( diff --git a/lnbits/wallets/spark.py b/lnbits/wallets/spark.py index 39dde5494..ca667a379 100644 --- a/lnbits/wallets/spark.py +++ b/lnbits/wallets/spark.py @@ -140,6 +140,7 @@ class SparkWallet(Wallet): ok=True, payment_request=r["bolt11"], checking_id=label, + preimage=r.get("preimage"), ) except (SparkError, UnknownError) as e: return InvoiceResponse(ok=False, error_message=str(e)) diff --git a/lnbits/wallets/zbd.py b/lnbits/wallets/zbd.py index ca7c482b4..bee60fde6 100644 --- a/lnbits/wallets/zbd.py +++ b/lnbits/wallets/zbd.py @@ -94,10 +94,12 @@ class ZBDWallet(Wallet): data = r.json()["data"] checking_id = data["id"] # this is a zbd id payment_request = data["invoice"]["request"] + preimage = data["invoice"].get("preimage") return InvoiceResponse( ok=True, checking_id=checking_id, payment_request=payment_request, + preimage=preimage, ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: diff --git a/tests/regtest/test_real_invoice.py b/tests/regtest/test_real_invoice.py index 047124a8a..c799c1f3a 100644 --- a/tests/regtest/test_real_invoice.py +++ b/tests/regtest/test_real_invoice.py @@ -101,6 +101,8 @@ async def test_create_real_invoice(client, adminkey_headers_from, inkey_headers_ balance = await get_node_balance_sats() assert balance - prev_balance == create_invoice.amount + assert payment_status.get("preimage") is not None + # exit out of infinite loop raise FakeError() diff --git a/tests/regtest/test_services_create_invoice.py b/tests/regtest/test_services_create_invoice.py index fb854f552..82cd87f5b 100644 --- a/tests/regtest/test_services_create_invoice.py +++ b/tests/regtest/test_services_create_invoice.py @@ -17,6 +17,8 @@ async def test_create_invoice(from_wallet): amount=1000, memo=description, ) + assert payment.preimage + invoice = decode(payment.bolt11) assert invoice.payment_hash == payment.payment_hash assert invoice.amount_msat == 1000000 @@ -33,6 +35,8 @@ async def test_create_internal_invoice(from_wallet): payment = await create_invoice( wallet_id=from_wallet.id, amount=1000, memo=description, internal=True ) + assert payment.preimage + invoice = decode(payment.bolt11) assert invoice.payment_hash == payment.payment_hash assert invoice.amount_msat == 1000000 diff --git a/tests/regtest/test_services_pay_invoice.py b/tests/regtest/test_services_pay_invoice.py index 4c373b227..69da6406c 100644 --- a/tests/regtest/test_services_pay_invoice.py +++ b/tests/regtest/test_services_pay_invoice.py @@ -19,6 +19,7 @@ async def test_services_pay_invoice(to_wallet, real_invoice): assert payment assert payment.status == PaymentState.SUCCESS assert payment.memo == description + assert payment.preimage @pytest.mark.anyio diff --git a/tests/wallets/fixtures/json/fixtures_rpc.json b/tests/wallets/fixtures/json/fixtures_rpc.json index b1855227a..684ed2ffd 100644 --- a/tests/wallets/fixtures/json/fixtures_rpc.json +++ b/tests/wallets/fixtures/json/fixtures_rpc.json @@ -326,11 +326,12 @@ "call_params": { "amount": 555, "memo": "Test Invoice", - "label": "test-label" + "label": "test-label", + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" }, "expect": { "success": true, - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417", "payment_request": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n", "error_message": null }, @@ -355,7 +356,7 @@ "response_type": "data", "response": { "ln_invoice": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417", "bolt11": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n" } } @@ -378,12 +379,13 @@ "expiry": null, "exposeprivatechannels": true, "label": "test-label", - "amount_msat": 555000 + "amount_msat": 555000, + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" } }, "response_type": "json", "response": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417", "bolt11": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n" } } @@ -402,12 +404,14 @@ "kwargs": { "value": 555, "private": true, - "memo": "Test Invoice" + "memo": "Test Invoice", + "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")", + "__eval__:r_preimage": "bytes.fromhex(\"0000000000000000000000000000000000000000000000000000000000000001\")" } }, "response_type": "data", "response": { - "__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")", + "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")", "payment_request": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n" } } @@ -422,7 +426,8 @@ "call_params": { "amount": 555, "memo": "Test Invoice", - "label": "test-label" + "label": "test-label", + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" }, "expect": { "success": false, @@ -470,7 +475,8 @@ "expiry": null, "exposeprivatechannels": true, "label": "test-label", - "amount_msat": 555000 + "amount_msat": 555000, + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" } }, "response_type": "exception", @@ -491,7 +497,8 @@ "expiry": null, "exposeprivatechannels": true, "label": "test-label", - "amount_msat": 555000 + "amount_msat": 555000, + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" } }, "response_type": "json", @@ -515,7 +522,9 @@ "kwargs": { "value": 555, "private": true, - "memo": "Test Invoice" + "memo": "Test Invoice", + "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")", + "__eval__:r_preimage": "bytes.fromhex(\"0000000000000000000000000000000000000000000000000000000000000001\")" } }, "response_type": "exception", @@ -534,7 +543,8 @@ "call_params": { "amount": 555, "memo": "Test Invoice", - "label": "test-label" + "label": "test-label", + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" }, "expect": { "success": false, @@ -559,7 +569,8 @@ "expiry": null, "exposeprivatechannels": true, "label": "test-label", - "amount_msat": 555000 + "amount_msat": 555000, + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" } }, "response_type": "json", @@ -576,7 +587,8 @@ "call_params": { "amount": 555, "memo": "Test Invoice", - "label": "test-label" + "label": "test-label", + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" }, "expect": { "success": false, @@ -601,7 +613,8 @@ "expiry": null, "exposeprivatechannels": true, "label": "test-label", - "amount_msat": 555000 + "amount_msat": 555000, + "preimage": "0000000000000000000000000000000000000000000000000000000000000001" } }, "response_type": "exception", @@ -689,7 +702,7 @@ "expect": { "error_message": null, "success": true, - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417", "fee_msat": 50, "preimage": "0000000000000000000000000000000000000000000000000000000000000000" }, @@ -739,7 +752,7 @@ "response": { "amount_sent_msat": 21000, "amount_msat": 21050, - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417", "payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000" } } @@ -774,7 +787,7 @@ } ], "payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } } } @@ -806,7 +819,7 @@ } ], "payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } } } @@ -1237,7 +1250,7 @@ { "description": "success", "call_params": { - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" }, "expect": { "success": true, @@ -1276,7 +1289,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1291,7 +1304,7 @@ "invoices": [ { "status": "paid", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } ] } @@ -1315,12 +1328,13 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "kwargs": { - "__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "data", "response": { - "settled": true + "settled": true, + "__eval__:r_preimage": "bytes.fromhex(\"0000000000000000000000000000000000000000000000000000000000000001\")" } } } @@ -1332,7 +1346,7 @@ { "description": "pending", "call_params": { - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" }, "expect": { "success": false, @@ -1364,7 +1378,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1376,7 +1390,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1395,7 +1409,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1407,7 +1421,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "exception", @@ -1432,7 +1446,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1444,7 +1458,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "exception", @@ -1463,7 +1477,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1475,7 +1489,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1492,7 +1506,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1504,7 +1518,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1528,7 +1542,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1540,7 +1554,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1548,7 +1562,7 @@ "invoices": [ { "status": "unpaid", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } ] } @@ -1573,7 +1587,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "kwargs": { - "__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "data", @@ -1591,7 +1605,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "kwargs": { - "__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "exception", @@ -1611,7 +1625,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "kwargs": { - "__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "exception", @@ -1691,7 +1705,7 @@ "description": "failed", "description1": "pending should be false in the 'expect', this is a bug", "call_params": { - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" }, "expect": { "success": false, @@ -1731,7 +1745,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1743,7 +1757,7 @@ "request_type": "function", "request_data": { "kwargs": { - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } }, "response_type": "json", @@ -1751,7 +1765,7 @@ "invoices": [ { "status": "expired", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } ] } @@ -1823,7 +1837,7 @@ { "description": "success", "call_params": { - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" }, "expect": { "success": true, @@ -1872,7 +1886,7 @@ "pays": [ { "status": "complete", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417", "preimage": "0000000000000000000000000000000000000000000000000000000000000000", "amount_sent_msat": 21000, "amount_msat": 21050 @@ -1900,7 +1914,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -1933,7 +1947,7 @@ { "description": "success status, no payment found", "call_params": { - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" }, "expect": { "success": true, @@ -1960,7 +1974,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -1980,7 +1994,7 @@ { "description": "pending", "call_params": { - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" }, "expect": { "success": false, @@ -2073,7 +2087,7 @@ "pays": [ { "status": "pending", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } ] } @@ -2117,7 +2131,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -2138,7 +2152,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -2154,7 +2168,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -2170,7 +2184,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -2198,7 +2212,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -2226,7 +2240,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__", @@ -2254,7 +2268,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "exception", @@ -2316,7 +2330,7 @@ "description": "failed", "description1": "pending should be false in the 'expect', this is a bug", "call_params": { - "checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" }, "expect": { "success": false, @@ -2360,7 +2374,7 @@ "pays": [ { "status": "failed", - "payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" + "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417" } ] } @@ -2385,7 +2399,7 @@ "request_data": { "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "kwargs": { - "__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" + "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")" } }, "response_type": "__aiter__",