feat: preimages for incoming payments, fundingsource saves preimage on create_invoice (#3085)

Co-authored-by: Vlad Stan <stan.v.vlad@gmail.com>
This commit is contained in:
dni ⚡ 2025-04-30 11:03:19 +02:00 committed by GitHub
parent f8b3644029
commit c4d0540e76
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 183 additions and 106 deletions

View file

@ -132,29 +132,29 @@ async def create_invoice(
status="failed", status="failed",
) )
( payment_response = await funding_source.create_invoice(
ok,
checking_id,
payment_request,
error_message,
) = await funding_source.create_invoice(
amount=amount_sat, amount=amount_sat,
memo=invoice_memo, memo=invoice_memo,
description_hash=description_hash, description_hash=description_hash,
unhashed_description=unhashed_description, unhashed_description=unhashed_description,
expiry=expiry or settings.lightning_invoice_expiry, 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( 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_response.payment_request)
invoice = bolt11_decode(payment_request)
create_payment_model = CreatePayment( create_payment_model = CreatePayment(
wallet_id=wallet_id, wallet_id=wallet_id,
bolt11=payment_request, bolt11=payment_response.payment_request,
payment_hash=invoice.payment_hash, payment_hash=invoice.payment_hash,
preimage=payment_response.preimage,
amount_msat=amount_sat * 1000, amount_msat=amount_sat * 1000,
expiry=invoice.expiry_date, expiry=invoice.expiry_date,
memo=memo, memo=memo,
@ -163,7 +163,7 @@ async def create_invoice(
) )
payment = await create_payment( payment = await create_payment(
checking_id=checking_id, checking_id=payment_response.checking_id,
data=create_payment_model, data=create_payment_model,
conn=conn, conn=conn,
) )
@ -486,6 +486,9 @@ async def _pay_internal_invoice(
if wallet.balance_msat < abs(amount_msat) + fee_reserve_total_msat: if wallet.balance_msat < abs(amount_msat) + fee_reserve_total_msat:
raise PaymentError("Insufficient balance.", status="failed") 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}" internal_id = f"internal_{create_payment_model.payment_hash}"
logger.debug(f"creating temporary internal payment with id {internal_id}") logger.debug(f"creating temporary internal payment with id {internal_id}")
payment = await create_payment( payment = await create_payment(

View file

@ -203,7 +203,8 @@ async def invoice_callback_dispatcher(checking_id: str, is_internal: bool = Fals
if payment and payment.is_in: if payment and payment.is_in:
status = await payment.check_status() status = await payment.check_status()
payment.fee = status.fee_msat or 0 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 payment.status = PaymentState.SUCCESS
await update_payment(payment) await update_payment(payment)
internal = "internal" if is_internal else "" internal = "internal" if is_internal else ""

View file

@ -99,10 +99,12 @@ class AlbyWallet(Wallet):
checking_id = data["payment_hash"] checking_id = data["payment_hash"]
payment_request = data["payment_request"] payment_request = data["payment_request"]
preimage = data.get("payment_preimage")
return InvoiceResponse( return InvoiceResponse(
ok=True, ok=True,
checking_id=checking_id, checking_id=checking_id,
payment_request=payment_request, payment_request=payment_request,
preimage=preimage,
) )
except KeyError as exc: except KeyError as exc:
logger.warning(exc) logger.warning(exc)

View file

@ -20,6 +20,7 @@ class InvoiceResponse(NamedTuple):
checking_id: str | None = None # payment_hash, rpc_id checking_id: str | None = None # payment_hash, rpc_id
payment_request: str | None = None payment_request: str | None = None
error_message: str | None = None error_message: str | None = None
preimage: str | None = None
@property @property
def success(self) -> bool: def success(self) -> bool:

View file

@ -99,6 +99,7 @@ class ClicheWallet(Wallet):
ok=True, ok=True,
checking_id=checking_id, checking_id=checking_id,
payment_request=payment_request, payment_request=payment_request,
preimage=data["result"].get("preimage"),
) )
async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse:

View file

@ -1,6 +1,7 @@
import asyncio import asyncio
import random 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.decode import decode as bolt11_decode
from bolt11.exceptions import Bolt11Exception from bolt11.exceptions import Bolt11Exception
@ -9,6 +10,7 @@ from pyln.client import LightningRpc, RpcError
from lnbits.nodes.cln import CoreLightningNode from lnbits.nodes.cln import CoreLightningNode
from lnbits.settings import settings from lnbits.settings import settings
from lnbits.utils.crypto import random_secret_and_hash
from .base import ( from .base import (
InvoiceResponse, InvoiceResponse,
@ -100,6 +102,11 @@ class CoreLightningWallet(Wallet):
) )
if unhashed_description and not self.supports_description_hash: if unhashed_description and not self.supports_description_hash:
raise UnsupportedError("unhashed_description") raise UnsupportedError("unhashed_description")
preimage = kwargs.get("preimage")
if not preimage:
preimage, _ = random_secret_and_hash()
r: dict = self.ln.invoice( # type: ignore r: dict = self.ln.invoice( # type: ignore
amount_msat=msat, amount_msat=msat,
label=label, label=label,
@ -107,6 +114,7 @@ class CoreLightningWallet(Wallet):
unhashed_description.decode() if unhashed_description else memo unhashed_description.decode() if unhashed_description else memo
), ),
exposeprivatechannels=True, exposeprivatechannels=True,
preimage=preimage,
deschashonly=( deschashonly=(
True if unhashed_description else False True if unhashed_description else False
), # we can't pass None here ), # we can't pass None here
@ -119,6 +127,7 @@ class CoreLightningWallet(Wallet):
ok=True, ok=True,
checking_id=r["payment_hash"], checking_id=r["payment_hash"],
payment_request=r["bolt11"], payment_request=r["bolt11"],
preimage=preimage,
) )
except RpcError as exc: except RpcError as exc:
logger.warning(exc) logger.warning(exc)

View file

@ -1,7 +1,8 @@
import asyncio import asyncio
import json import json
import random import random
from typing import AsyncGenerator, Optional from collections.abc import AsyncGenerator
from typing import Optional
import httpx import httpx
from bolt11 import Bolt11Exception from bolt11 import Bolt11Exception
@ -9,6 +10,7 @@ from bolt11.decode import decode
from loguru import logger from loguru import logger
from lnbits.settings import settings from lnbits.settings import settings
from lnbits.utils.crypto import random_secret_and_hash
from .base import ( from .base import (
InvoiceResponse, InvoiceResponse,
@ -126,8 +128,10 @@ class CoreLightningRestWallet(Wallet):
if kwargs.get("expiry"): if kwargs.get("expiry"):
data["expiry"] = kwargs["expiry"] data["expiry"] = kwargs["expiry"]
if kwargs.get("preimage"): preimage, _ = random_secret_and_hash()
data["preimage"] = kwargs["preimage"]
# https://github.com/Ride-The-Lightning/c-lightning-REST/blob/master/controllers/invoice.js#L52C17-L52C25
data["preimage"] = preimage
try: try:
r = await self.client.post( r = await self.client.post(
@ -160,6 +164,7 @@ class CoreLightningRestWallet(Wallet):
ok=True, ok=True,
checking_id=data["payment_hash"], checking_id=data["payment_hash"],
payment_request=data["bolt11"], payment_request=data["bolt11"],
preimage=preimage,
) )
except json.JSONDecodeError: except json.JSONDecodeError:
return InvoiceResponse( return InvoiceResponse(

View file

@ -10,6 +10,7 @@ from loguru import logger
from websockets.client import connect from websockets.client import connect
from lnbits.settings import settings from lnbits.settings import settings
from lnbits.utils.crypto import random_secret_and_hash
from .base import ( from .base import (
InvoiceResponse, InvoiceResponse,
@ -99,6 +100,9 @@ class EclairWallet(Wallet):
else: else:
data["description"] = memo data["description"] = memo
preimage, _ = random_secret_and_hash()
data["paymentPreimage"] = preimage
try: try:
r = await self.client.post("/createinvoice", data=data, timeout=40) r = await self.client.post("/createinvoice", data=data, timeout=40)
r.raise_for_status() r.raise_for_status()
@ -120,6 +124,7 @@ class EclairWallet(Wallet):
ok=True, ok=True,
checking_id=data["paymentHash"], checking_id=data["paymentHash"],
payment_request=data["serialized"], payment_request=data["serialized"],
preimage=preimage,
) )
except json.JSONDecodeError: except json.JSONDecodeError:
return InvoiceResponse( return InvoiceResponse(

View file

@ -100,7 +100,7 @@ class FakeWallet(Wallet):
ok=True, ok=True,
checking_id=payment_hash, checking_id=payment_hash,
payment_request=payment_request, payment_request=payment_request,
# preimage=preimage.hex(), preimage=preimage.hex(),
) )
async def pay_invoice(self, bolt11: str, _: int) -> PaymentResponse: async def pay_invoice(self, bolt11: str, _: int) -> PaymentResponse:

View file

@ -96,7 +96,10 @@ class LNbitsWallet(Wallet):
) )
return InvoiceResponse( 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: except json.JSONDecodeError:
return InvoiceResponse( return InvoiceResponse(

View file

@ -1,6 +1,6 @@
import asyncio import asyncio
import base64 import base64
import hashlib from hashlib import sha256
from os import environ from os import environ
from typing import AsyncGenerator, Dict, Optional 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 as router
import lnbits.wallets.lnd_grpc_files.router_pb2_grpc as routerrpc import lnbits.wallets.lnd_grpc_files.router_pb2_grpc as routerrpc
from lnbits.settings import settings from lnbits.settings import settings
from lnbits.utils.crypto import AESCipher from lnbits.utils.crypto import AESCipher, random_secret_and_hash
from .base import ( from .base import (
InvoiceResponse, InvoiceResponse,
@ -139,22 +139,37 @@ class LndWallet(Wallet):
if description_hash: if description_hash:
data["description_hash"] = description_hash data["description_hash"] = description_hash
elif unhashed_description: elif unhashed_description:
data["description_hash"] = hashlib.sha256( data["description_hash"] = sha256(unhashed_description).digest()
unhashed_description
).digest() # as bytes directly
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: try:
req = ln.Invoice(**data) req = ln.Invoice(**data)
resp = await self.rpc.AddInvoice(req) resp = await self.rpc.AddInvoice(req)
# response model
# {
# "r_hash": <bytes>,
# "payment_request": <string>,
# "add_index": <uint64>,
# "payment_addr": <bytes>,
# }
except Exception as exc: except Exception as exc:
logger.warning(exc) logger.warning(exc)
error_message = str(exc) return InvoiceResponse(ok=False, error_message=str(exc))
return InvoiceResponse(ok=False, error_message=error_message)
checking_id = bytes_to_hex(resp.r_hash) checking_id = bytes_to_hex(resp.r_hash)
payment_request = str(resp.payment_request) payment_request = str(resp.payment_request)
return InvoiceResponse( 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: async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse:
@ -197,15 +212,17 @@ class LndWallet(Wallet):
fee_msat = -resp.htlcs[-1].route.total_fees_msat fee_msat = -resp.htlcs[-1].route.total_fees_msat
preimage = resp.payment_preimage preimage = resp.payment_preimage
checking_id = resp.payment_hash 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: elif statuses[resp.status] is False:
error_message = failure_reasons[resp.failure_reason] error_message = failure_reasons[resp.failure_reason]
return PaymentResponse(ok=False, error_message=error_message)
else:
return PaymentResponse( return PaymentResponse(
ok=statuses[resp.status], ok=None,
checking_id=checking_id, checking_id=checking_id,
fee_msat=fee_msat, error_message="Payment in flight or non-existant.",
preimage=preimage,
error_message=error_message,
) )
async def get_invoice_status(self, checking_id: str) -> PaymentStatus: async def get_invoice_status(self, checking_id: str) -> PaymentStatus:
@ -217,10 +234,8 @@ class LndWallet(Wallet):
raise ValueError raise ValueError
resp = await self.rpc.LookupInvoice(ln.PaymentHash(r_hash=r_hash)) resp = await self.rpc.LookupInvoice(ln.PaymentHash(r_hash=r_hash))
# todo: where is the FAILED status
if resp.settled: if resp.settled:
return PaymentSuccessStatus() return PaymentSuccessStatus(preimage=resp.r_preimage.hex())
return PaymentPendingStatus() return PaymentPendingStatus()
except grpc.RpcError as exc: except grpc.RpcError as exc:

View file

@ -9,7 +9,7 @@ from loguru import logger
from lnbits.nodes.lndrest import LndRestNode from lnbits.nodes.lndrest import LndRestNode
from lnbits.settings import settings from lnbits.settings import settings
from lnbits.utils.crypto import AESCipher from lnbits.utils.crypto import AESCipher, random_secret_and_hash
from .base import ( from .base import (
InvoiceResponse, InvoiceResponse,
@ -110,24 +110,28 @@ class LndRestWallet(Wallet):
unhashed_description: Optional[bytes] = None, unhashed_description: Optional[bytes] = None,
**kwargs, **kwargs,
) -> InvoiceResponse: ) -> InvoiceResponse:
data: Dict = { _data: Dict = {
"value": amount, "value": amount,
"private": settings.lnd_rest_route_hints, "private": settings.lnd_rest_route_hints,
"memo": memo or "", "memo": memo or "",
} }
if kwargs.get("expiry"): if kwargs.get("expiry"):
data["expiry"] = kwargs["expiry"] _data["expiry"] = kwargs["expiry"]
if description_hash: if description_hash:
data["description_hash"] = base64.b64encode(description_hash).decode( _data["description_hash"] = base64.b64encode(description_hash).decode(
"ascii" "ascii"
) )
elif unhashed_description: elif unhashed_description:
data["description_hash"] = base64.b64encode( _data["description_hash"] = base64.b64encode(
hashlib.sha256(unhashed_description).digest() hashlib.sha256(unhashed_description).digest()
).decode("ascii") ).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: 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() r.raise_for_status()
data = r.json() data = r.json()
@ -156,6 +160,7 @@ class LndRestWallet(Wallet):
ok=True, ok=True,
checking_id=checking_id, checking_id=checking_id,
payment_request=payment_request, payment_request=payment_request,
preimage=preimage,
) )
except json.JSONDecodeError: except json.JSONDecodeError:

View file

@ -98,6 +98,7 @@ class LnTipsWallet(Wallet):
ok=True, ok=True,
checking_id=data["payment_hash"], checking_id=data["payment_hash"],
payment_request=data["payment_request"], payment_request=data["payment_request"],
preimage=data.get("preimage"),
) )
async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse:

View file

@ -138,10 +138,12 @@ class PhoenixdWallet(Wallet):
checking_id = data["paymentHash"] checking_id = data["paymentHash"]
payment_request = data["serialized"] payment_request = data["serialized"]
preimage = data.get("paymentPreimage", None) # if available
return InvoiceResponse( return InvoiceResponse(
ok=True, ok=True,
checking_id=checking_id, checking_id=checking_id,
payment_request=payment_request, payment_request=payment_request,
preimage=preimage,
) )
except json.JSONDecodeError: except json.JSONDecodeError:
return InvoiceResponse( return InvoiceResponse(

View file

@ -140,6 +140,7 @@ class SparkWallet(Wallet):
ok=True, ok=True,
payment_request=r["bolt11"], payment_request=r["bolt11"],
checking_id=label, checking_id=label,
preimage=r.get("preimage"),
) )
except (SparkError, UnknownError) as e: except (SparkError, UnknownError) as e:
return InvoiceResponse(ok=False, error_message=str(e)) return InvoiceResponse(ok=False, error_message=str(e))

View file

@ -94,10 +94,12 @@ class ZBDWallet(Wallet):
data = r.json()["data"] data = r.json()["data"]
checking_id = data["id"] # this is a zbd id checking_id = data["id"] # this is a zbd id
payment_request = data["invoice"]["request"] payment_request = data["invoice"]["request"]
preimage = data["invoice"].get("preimage")
return InvoiceResponse( return InvoiceResponse(
ok=True, ok=True,
checking_id=checking_id, checking_id=checking_id,
payment_request=payment_request, payment_request=payment_request,
preimage=preimage,
) )
async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse:

View file

@ -101,6 +101,8 @@ async def test_create_real_invoice(client, adminkey_headers_from, inkey_headers_
balance = await get_node_balance_sats() balance = await get_node_balance_sats()
assert balance - prev_balance == create_invoice.amount assert balance - prev_balance == create_invoice.amount
assert payment_status.get("preimage") is not None
# exit out of infinite loop # exit out of infinite loop
raise FakeError() raise FakeError()

View file

@ -17,6 +17,8 @@ async def test_create_invoice(from_wallet):
amount=1000, amount=1000,
memo=description, memo=description,
) )
assert payment.preimage
invoice = decode(payment.bolt11) invoice = decode(payment.bolt11)
assert invoice.payment_hash == payment.payment_hash assert invoice.payment_hash == payment.payment_hash
assert invoice.amount_msat == 1000000 assert invoice.amount_msat == 1000000
@ -33,6 +35,8 @@ async def test_create_internal_invoice(from_wallet):
payment = await create_invoice( payment = await create_invoice(
wallet_id=from_wallet.id, amount=1000, memo=description, internal=True wallet_id=from_wallet.id, amount=1000, memo=description, internal=True
) )
assert payment.preimage
invoice = decode(payment.bolt11) invoice = decode(payment.bolt11)
assert invoice.payment_hash == payment.payment_hash assert invoice.payment_hash == payment.payment_hash
assert invoice.amount_msat == 1000000 assert invoice.amount_msat == 1000000

View file

@ -19,6 +19,7 @@ async def test_services_pay_invoice(to_wallet, real_invoice):
assert payment assert payment
assert payment.status == PaymentState.SUCCESS assert payment.status == PaymentState.SUCCESS
assert payment.memo == description assert payment.memo == description
assert payment.preimage
@pytest.mark.anyio @pytest.mark.anyio

View file

@ -326,11 +326,12 @@
"call_params": { "call_params": {
"amount": 555, "amount": 555,
"memo": "Test Invoice", "memo": "Test Invoice",
"label": "test-label" "label": "test-label",
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
}, },
"expect": { "expect": {
"success": true, "success": true,
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417",
"payment_request": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n", "payment_request": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n",
"error_message": null "error_message": null
}, },
@ -355,7 +356,7 @@
"response_type": "data", "response_type": "data",
"response": { "response": {
"ln_invoice": { "ln_invoice": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417",
"bolt11": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n" "bolt11": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n"
} }
} }
@ -378,12 +379,13 @@
"expiry": null, "expiry": null,
"exposeprivatechannels": true, "exposeprivatechannels": true,
"label": "test-label", "label": "test-label",
"amount_msat": 555000 "amount_msat": 555000,
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
} }
}, },
"response_type": "json", "response_type": "json",
"response": { "response": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417",
"bolt11": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n" "bolt11": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n"
} }
} }
@ -402,12 +404,14 @@
"kwargs": { "kwargs": {
"value": 555, "value": 555,
"private": true, "private": true,
"memo": "Test Invoice" "memo": "Test Invoice",
"__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")",
"__eval__:r_preimage": "bytes.fromhex(\"0000000000000000000000000000000000000000000000000000000000000001\")"
} }
}, },
"response_type": "data", "response_type": "data",
"response": { "response": {
"__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")", "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")",
"payment_request": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n" "payment_request": "lnbc5550n1pnq9jg3sp52rvwstvjcypjsaenzdh0h30jazvzsf8aaye0julprtth9kysxtuspp5e5s3z7felv4t9zrcc6wpn7ehvjl5yzewanzl5crljdl3jgeffyhqdq2f38xy6t5wvxqzjccqpjrzjq0yzeq76ney45hmjlnlpvu0nakzy2g35hqh0dujq8ujdpr2e42pf2rrs6vqpgcsqqqqqqqqqqqqqqeqqyg9qxpqysgqwftcx89k5pp28435pgxfl2vx3ksemzxccppw2j9yjn0ngr6ed7wj8ztc0d5kmt2mvzdlcgrludhz7jncd5l5l9w820hc4clpwhtqj3gq62g66n"
} }
} }
@ -422,7 +426,8 @@
"call_params": { "call_params": {
"amount": 555, "amount": 555,
"memo": "Test Invoice", "memo": "Test Invoice",
"label": "test-label" "label": "test-label",
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
}, },
"expect": { "expect": {
"success": false, "success": false,
@ -470,7 +475,8 @@
"expiry": null, "expiry": null,
"exposeprivatechannels": true, "exposeprivatechannels": true,
"label": "test-label", "label": "test-label",
"amount_msat": 555000 "amount_msat": 555000,
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -491,7 +497,8 @@
"expiry": null, "expiry": null,
"exposeprivatechannels": true, "exposeprivatechannels": true,
"label": "test-label", "label": "test-label",
"amount_msat": 555000 "amount_msat": 555000,
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
} }
}, },
"response_type": "json", "response_type": "json",
@ -515,7 +522,9 @@
"kwargs": { "kwargs": {
"value": 555, "value": 555,
"private": true, "private": true,
"memo": "Test Invoice" "memo": "Test Invoice",
"__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")",
"__eval__:r_preimage": "bytes.fromhex(\"0000000000000000000000000000000000000000000000000000000000000001\")"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -534,7 +543,8 @@
"call_params": { "call_params": {
"amount": 555, "amount": 555,
"memo": "Test Invoice", "memo": "Test Invoice",
"label": "test-label" "label": "test-label",
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
}, },
"expect": { "expect": {
"success": false, "success": false,
@ -559,7 +569,8 @@
"expiry": null, "expiry": null,
"exposeprivatechannels": true, "exposeprivatechannels": true,
"label": "test-label", "label": "test-label",
"amount_msat": 555000 "amount_msat": 555000,
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
} }
}, },
"response_type": "json", "response_type": "json",
@ -576,7 +587,8 @@
"call_params": { "call_params": {
"amount": 555, "amount": 555,
"memo": "Test Invoice", "memo": "Test Invoice",
"label": "test-label" "label": "test-label",
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
}, },
"expect": { "expect": {
"success": false, "success": false,
@ -601,7 +613,8 @@
"expiry": null, "expiry": null,
"exposeprivatechannels": true, "exposeprivatechannels": true,
"label": "test-label", "label": "test-label",
"amount_msat": 555000 "amount_msat": 555000,
"preimage": "0000000000000000000000000000000000000000000000000000000000000001"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -689,7 +702,7 @@
"expect": { "expect": {
"error_message": null, "error_message": null,
"success": true, "success": true,
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417",
"fee_msat": 50, "fee_msat": 50,
"preimage": "0000000000000000000000000000000000000000000000000000000000000000" "preimage": "0000000000000000000000000000000000000000000000000000000000000000"
}, },
@ -739,7 +752,7 @@
"response": { "response": {
"amount_sent_msat": 21000, "amount_sent_msat": 21000,
"amount_msat": 21050, "amount_msat": 21050,
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417",
"payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000" "payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000"
} }
} }
@ -774,7 +787,7 @@
} }
], ],
"payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000", "payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
} }
} }
@ -806,7 +819,7 @@
} }
], ],
"payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000", "payment_preimage": "0000000000000000000000000000000000000000000000000000000000000000",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
} }
} }
@ -1237,7 +1250,7 @@
{ {
"description": "success", "description": "success",
"call_params": { "call_params": {
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
}, },
"expect": { "expect": {
"success": true, "success": true,
@ -1276,7 +1289,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1291,7 +1304,7 @@
"invoices": [ "invoices": [
{ {
"status": "paid", "status": "paid",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
] ]
} }
@ -1315,12 +1328,13 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash",
"kwargs": { "kwargs": {
"__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "data", "response_type": "data",
"response": { "response": {
"settled": true "settled": true,
"__eval__:r_preimage": "bytes.fromhex(\"0000000000000000000000000000000000000000000000000000000000000001\")"
} }
} }
} }
@ -1332,7 +1346,7 @@
{ {
"description": "pending", "description": "pending",
"call_params": { "call_params": {
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
}, },
"expect": { "expect": {
"success": false, "success": false,
@ -1364,7 +1378,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1376,7 +1390,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1395,7 +1409,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1407,7 +1421,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -1432,7 +1446,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1444,7 +1458,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -1463,7 +1477,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1475,7 +1489,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1492,7 +1506,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1504,7 +1518,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1528,7 +1542,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1540,7 +1554,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1548,7 +1562,7 @@
"invoices": [ "invoices": [
{ {
"status": "unpaid", "status": "unpaid",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
] ]
} }
@ -1573,7 +1587,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash",
"kwargs": { "kwargs": {
"__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "data", "response_type": "data",
@ -1591,7 +1605,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash",
"kwargs": { "kwargs": {
"__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -1611,7 +1625,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash", "klass": "lnbits.wallets.lnd_grpc_files.lightning_pb2.PaymentHash",
"kwargs": { "kwargs": {
"__eval__:r_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:r_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -1691,7 +1705,7 @@
"description": "failed", "description": "failed",
"description1": "pending should be false in the 'expect', this is a bug", "description1": "pending should be false in the 'expect', this is a bug",
"call_params": { "call_params": {
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
}, },
"expect": { "expect": {
"success": false, "success": false,
@ -1731,7 +1745,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1743,7 +1757,7 @@
"request_type": "function", "request_type": "function",
"request_data": { "request_data": {
"kwargs": { "kwargs": {
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
}, },
"response_type": "json", "response_type": "json",
@ -1751,7 +1765,7 @@
"invoices": [ "invoices": [
{ {
"status": "expired", "status": "expired",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
] ]
} }
@ -1823,7 +1837,7 @@
{ {
"description": "success", "description": "success",
"call_params": { "call_params": {
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
}, },
"expect": { "expect": {
"success": true, "success": true,
@ -1872,7 +1886,7 @@
"pays": [ "pays": [
{ {
"status": "complete", "status": "complete",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96", "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417",
"preimage": "0000000000000000000000000000000000000000000000000000000000000000", "preimage": "0000000000000000000000000000000000000000000000000000000000000000",
"amount_sent_msat": 21000, "amount_sent_msat": 21000,
"amount_msat": 21050 "amount_msat": 21050
@ -1900,7 +1914,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -1933,7 +1947,7 @@
{ {
"description": "success status, no payment found", "description": "success status, no payment found",
"call_params": { "call_params": {
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
}, },
"expect": { "expect": {
"success": true, "success": true,
@ -1960,7 +1974,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -1980,7 +1994,7 @@
{ {
"description": "pending", "description": "pending",
"call_params": { "call_params": {
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
}, },
"expect": { "expect": {
"success": false, "success": false,
@ -2073,7 +2087,7 @@
"pays": [ "pays": [
{ {
"status": "pending", "status": "pending",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
] ]
} }
@ -2117,7 +2131,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -2138,7 +2152,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -2154,7 +2168,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -2170,7 +2184,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -2198,7 +2212,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -2226,7 +2240,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",
@ -2254,7 +2268,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "exception", "response_type": "exception",
@ -2316,7 +2330,7 @@
"description": "failed", "description": "failed",
"description1": "pending should be false in the 'expect', this is a bug", "description1": "pending should be false in the 'expect', this is a bug",
"call_params": { "call_params": {
"checking_id": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "checking_id": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
}, },
"expect": { "expect": {
"success": false, "success": false,
@ -2360,7 +2374,7 @@
"pays": [ "pays": [
{ {
"status": "failed", "status": "failed",
"payment_hash": "e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96" "payment_hash": "c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417"
} }
] ]
} }
@ -2385,7 +2399,7 @@
"request_data": { "request_data": {
"klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest", "klass": "lnbits.wallets.lnd_grpc_files.router_pb2.TrackPaymentRequest",
"kwargs": { "kwargs": {
"__eval__:payment_hash": "bytes.fromhex(\"e35526a43d04e985594c0dfab848814f524b1c786598ec9a63beddb2d726ac96\")" "__eval__:payment_hash": "bytes.fromhex(\"c386d8e8d07342f2e39e189c8e6c57bb205bb373fe4e3a6f69404a8bb767b417\")"
} }
}, },
"response_type": "__aiter__", "response_type": "__aiter__",