diff --git a/lnbits/commands.py b/lnbits/commands.py index 58899bb91..dd01160a0 100644 --- a/lnbits/commands.py +++ b/lnbits/commands.py @@ -4,7 +4,7 @@ import click import importlib import re import os -from sqlalchemy.exc import OperationalError # type: ignore +from sqlalchemy.exc import OperationalError # type: ignore from .core import db as core_db, migrations as core_migrations from .helpers import get_valid_extensions, get_css_vendored, get_js_vendored, url_for_vendored diff --git a/lnbits/core/migrations.py b/lnbits/core/migrations.py index 8a37b652d..5ec0c0a57 100644 --- a/lnbits/core/migrations.py +++ b/lnbits/core/migrations.py @@ -1,4 +1,4 @@ -from sqlalchemy.exc import OperationalError # type: ignore +from sqlalchemy.exc import OperationalError # type: ignore async def m000_create_migrations_table(db): diff --git a/lnbits/core/models.py b/lnbits/core/models.py index 89ffc1c14..d26c0aba5 100644 --- a/lnbits/core/models.py +++ b/lnbits/core/models.py @@ -40,7 +40,11 @@ class Wallet(NamedTuple): hashing_key = hashlib.sha256(self.id.encode("utf-8")).digest() linking_key = hmac.digest(hashing_key, domain.encode("utf-8"), "sha256") - return SigningKey.from_string(linking_key, curve=SECP256k1, hashfunc=hashlib.sha256,) + return SigningKey.from_string( + linking_key, + curve=SECP256k1, + hashfunc=hashlib.sha256, + ) async def get_payment(self, payment_hash: str) -> Optional["Payment"]: from .crud import get_wallet_payment diff --git a/lnbits/core/services.py b/lnbits/core/services.py index 718fa9767..df93d6a5a 100644 --- a/lnbits/core/services.py +++ b/lnbits/core/services.py @@ -131,7 +131,10 @@ async def pay_invoice( payment: PaymentResponse = WALLET.pay_invoice(payment_request) if payment.ok and payment.checking_id: await create_payment( - checking_id=payment.checking_id, fee=payment.fee_msat, preimage=payment.preimage, **payment_kwargs, + checking_id=payment.checking_id, + fee=payment.fee_msat, + preimage=payment.preimage, + **payment_kwargs, ) await delete_payment(temp_id) else: @@ -151,7 +154,8 @@ async def redeem_lnurl_withdraw(wallet_id: str, res: LnurlWithdrawResponse, memo async with httpx.AsyncClient() as client: await client.get( - res.callback.base, params={**res.callback.query_params, **{"k1": res.k1, "pr": payment_request}}, + res.callback.base, + params={**res.callback.query_params, **{"k1": res.k1, "pr": payment_request}}, ) @@ -208,7 +212,11 @@ async def perform_lnurlauth(callback: str) -> Optional[LnurlErrorResponse]: async with httpx.AsyncClient() as client: r = await client.get( callback, - params={"k1": k1.hex(), "key": key.verifying_key.to_string("compressed").hex(), "sig": sig.hex(),}, + params={ + "k1": k1.hex(), + "key": key.verifying_key.to_string("compressed").hex(), + "sig": sig.hex(), + }, ) try: resp = json.loads(r.text) @@ -217,7 +225,9 @@ async def perform_lnurlauth(callback: str) -> Optional[LnurlErrorResponse]: return LnurlErrorResponse(reason=resp["reason"]) except (KeyError, json.decoder.JSONDecodeError): - return LnurlErrorResponse(reason=r.text[:200] + "..." if len(r.text) > 200 else r.text,) + return LnurlErrorResponse( + reason=r.text[:200] + "..." if len(r.text) > 200 else r.text, + ) async def check_invoice_status(wallet_id: str, payment_hash: str) -> PaymentStatus: diff --git a/lnbits/core/views/api.py b/lnbits/core/views/api.py index ca56c881d..4e69275d2 100644 --- a/lnbits/core/views/api.py +++ b/lnbits/core/views/api.py @@ -21,7 +21,13 @@ from ..tasks import sse_listeners @api_check_wallet_key("invoice") async def api_wallet(): return ( - jsonify({"id": g.wallet.id, "name": g.wallet.name, "balance": g.wallet.balance_msat,}), + jsonify( + { + "id": g.wallet.id, + "name": g.wallet.name, + "balance": g.wallet.balance_msat, + } + ), HTTPStatus.OK, ) @@ -71,7 +77,11 @@ async def api_payments_create_invoice(): if g.data.get("lnurl_callback"): async with httpx.AsyncClient() as client: try: - r = await client.get(g.data["lnurl_callback"], params={"pr": payment_request}, timeout=10,) + r = await client.get( + g.data["lnurl_callback"], + params={"pr": payment_request}, + timeout=10, + ) if r.is_error: lnurl_response = r.text else: @@ -147,7 +157,9 @@ async def api_payments_pay_lnurl(): async with httpx.AsyncClient() as client: try: r = await client.get( - g.data["callback"], params={"amount": g.data["amount"], "comment": g.data["comment"]}, timeout=40, + g.data["callback"], + params={"amount": g.data["amount"], "comment": g.data["comment"]}, + timeout=40, ) if r.is_error: return jsonify({"message": "failed to connect"}), HTTPStatus.BAD_REQUEST @@ -187,7 +199,10 @@ async def api_payments_pay_lnurl(): extra["comment"] = g.data["comment"] payment_hash = await pay_invoice( - wallet_id=g.wallet.id, payment_request=params["pr"], description=g.data.get("description", ""), extra=extra, + wallet_id=g.wallet.id, + payment_request=params["pr"], + description=g.data.get("description", ""), + extra=extra, ) except Exception as exc: await db.rollback() @@ -347,7 +362,9 @@ async def api_lnurlscan(code: str): @core_app.route("/api/v1/lnurlauth", methods=["POST"]) @api_check_wallet_key("admin") @api_validate_post_request( - schema={"callback": {"type": "string", "required": True},} + schema={ + "callback": {"type": "string", "required": True}, + } ) async def api_perform_lnurlauth(): err = await perform_lnurlauth(g.data["callback"]) diff --git a/lnbits/db.py b/lnbits/db.py index 61891cad2..e55cad07c 100644 --- a/lnbits/db.py +++ b/lnbits/db.py @@ -1,7 +1,7 @@ import os from typing import Tuple, Optional, Any -from sqlalchemy_aio import TRIO_STRATEGY # type: ignore -from sqlalchemy import create_engine # type: ignore +from sqlalchemy_aio import TRIO_STRATEGY # type: ignore +from sqlalchemy import create_engine # type: ignore from quart import g from .settings import LNBITS_DATA_FOLDER diff --git a/lnbits/extensions/events/migrations.py b/lnbits/extensions/events/migrations.py index 52a7658c4..5d0e58403 100644 --- a/lnbits/extensions/events/migrations.py +++ b/lnbits/extensions/events/migrations.py @@ -72,6 +72,14 @@ async def m002_changed(db): ) VALUES (?, ?, ?, ?, ?, ?, ?) """, - (row[0], row[1], row[2], row[3], row[4], row[5], True,), + ( + row[0], + row[1], + row[2], + row[3], + row[4], + row[5], + True, + ), ) await db.execute("DROP TABLE tickets") diff --git a/lnbits/extensions/example/views_api.py b/lnbits/extensions/example/views_api.py index 29814a788..c04f8c77e 100644 --- a/lnbits/extensions/example/views_api.py +++ b/lnbits/extensions/example/views_api.py @@ -20,9 +20,21 @@ from . import example_ext async def api_example(): """Try to add descriptions for others.""" tools = [ - {"name": "Flask", "url": "https://flask.palletsprojects.com/", "language": "Python",}, - {"name": "Vue.js", "url": "https://vuejs.org/", "language": "JavaScript",}, - {"name": "Quasar Framework", "url": "https://quasar.dev/", "language": "JavaScript",}, + { + "name": "Flask", + "url": "https://flask.palletsprojects.com/", + "language": "Python", + }, + { + "name": "Vue.js", + "url": "https://vuejs.org/", + "language": "JavaScript", + }, + { + "name": "Quasar Framework", + "url": "https://quasar.dev/", + "language": "JavaScript", + }, ] return jsonify(tools), HTTPStatus.OK diff --git a/lnbits/extensions/lndhub/views_api.py b/lnbits/extensions/lndhub/views_api.py index 7c19c76e4..d7fb409c7 100644 --- a/lnbits/extensions/lndhub/views_api.py +++ b/lnbits/extensions/lndhub/views_api.py @@ -47,10 +47,19 @@ async def lndhub_auth(): async def lndhub_addinvoice(): try: _, pr = await create_invoice( - wallet_id=g.wallet.id, amount=int(g.data["amt"]), memo=g.data["memo"], extra={"tag": "lndhub"}, + wallet_id=g.wallet.id, + amount=int(g.data["amt"]), + memo=g.data["memo"], + extra={"tag": "lndhub"}, ) except Exception as e: - return jsonify({"error": True, "code": 7, "message": "Failed to create invoice: " + str(e),}) + return jsonify( + { + "error": True, + "code": 7, + "message": "Failed to create invoice: " + str(e), + } + ) invoice = bolt11.decode(pr) return jsonify( @@ -70,10 +79,18 @@ async def lndhub_addinvoice(): async def lndhub_payinvoice(): try: await pay_invoice( - wallet_id=g.wallet.id, payment_request=g.data["invoice"], extra={"tag": "lndhub"}, + wallet_id=g.wallet.id, + payment_request=g.data["invoice"], + extra={"tag": "lndhub"}, ) except Exception as e: - return jsonify({"error": True, "code": 10, "message": "Payment failed: " + str(e),}) + return jsonify( + { + "error": True, + "code": 10, + "message": "Payment failed: " + str(e), + } + ) invoice: bolt11.Invoice = bolt11.decode(g.data["invoice"]) return jsonify( diff --git a/lnbits/extensions/lnticket/crud.py b/lnbits/extensions/lnticket/crud.py index 06b10f41e..3cc1a8106 100644 --- a/lnbits/extensions/lnticket/crud.py +++ b/lnbits/extensions/lnticket/crud.py @@ -7,7 +7,13 @@ from .models import Tickets, Forms async def create_ticket( - payment_hash: str, wallet: str, form: str, name: str, email: str, ltext: str, sats: int, + payment_hash: str, + wallet: str, + form: str, + name: str, + email: str, + ltext: str, + sats: int, ) -> Tickets: await db.execute( """ diff --git a/lnbits/extensions/lnticket/migrations.py b/lnbits/extensions/lnticket/migrations.py index 09e26a788..8ff93b09d 100644 --- a/lnbits/extensions/lnticket/migrations.py +++ b/lnbits/extensions/lnticket/migrations.py @@ -71,6 +71,15 @@ async def m002_changed(db): ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) """, - (row[0], row[1], row[2], row[3], row[4], row[5], row[6], True,), + ( + row[0], + row[1], + row[2], + row[3], + row[4], + row[5], + row[6], + True, + ), ) await db.execute("DROP TABLE tickets") diff --git a/lnbits/extensions/lnticket/views_api.py b/lnbits/extensions/lnticket/views_api.py index 832a4f9e3..4f5a267ba 100644 --- a/lnbits/extensions/lnticket/views_api.py +++ b/lnbits/extensions/lnticket/views_api.py @@ -109,7 +109,10 @@ async def api_ticket_make_ticket(form_id): nwords = len(re.split(r"\s+", g.data["ltext"])) sats = nwords * form.costpword payment_hash, payment_request = await create_invoice( - wallet_id=form.wallet, amount=sats, memo=f"ticket with {nwords} words on {form_id}", extra={"tag": "lnticket"}, + wallet_id=form.wallet, + amount=sats, + memo=f"ticket with {nwords} words on {form_id}", + extra={"tag": "lnticket"}, ) ticket = await create_ticket(payment_hash=payment_hash, wallet=form.wallet, sats=sats, **g.data) diff --git a/lnbits/extensions/lnurlp/crud.py b/lnbits/extensions/lnurlp/crud.py index 7ceccc54e..fe96825bc 100644 --- a/lnbits/extensions/lnurlp/crud.py +++ b/lnbits/extensions/lnurlp/crud.py @@ -33,7 +33,17 @@ async def create_pay_link( ) VALUES (?, ?, ?, ?, 0, 0, ?, ?, ?, ?, ?) """, - (wallet_id, description, min, max, webhook_url, success_text, success_url, comment_chars, currency,), + ( + wallet_id, + description, + min, + max, + webhook_url, + success_text, + success_url, + comment_chars, + currency, + ), ) link_id = result._result_proxy.lastrowid link = await get_pay_link(link_id) diff --git a/lnbits/extensions/lnurlp/lnurl.py b/lnbits/extensions/lnurlp/lnurl.py index b505e4944..74dd6e352 100644 --- a/lnbits/extensions/lnurlp/lnurl.py +++ b/lnbits/extensions/lnurlp/lnurl.py @@ -79,6 +79,10 @@ async def api_lnurl_callback(link_id): extra={"tag": "lnurlp", "link": link.id, "comment": comment}, ) - resp = LnurlPayActionResponse(pr=payment_request, success_action=link.success_action(payment_hash), routes=[],) + resp = LnurlPayActionResponse( + pr=payment_request, + success_action=link.success_action(payment_hash), + routes=[], + ) return jsonify(resp.dict()), HTTPStatus.OK diff --git a/lnbits/extensions/lnurlp/templates/lnurlp/_api_docs.html b/lnbits/extensions/lnurlp/templates/lnurlp/_api_docs.html index ec8985e38..d23242cd3 100644 --- a/lnbits/extensions/lnurlp/templates/lnurlp/_api_docs.html +++ b/lnbits/extensions/lnurlp/templates/lnurlp/_api_docs.html @@ -17,8 +17,8 @@ [<pay_link_object>, ...]
Curl example
curl -X GET {{ request.url_root }}lnurlp/api/v1/links -H "X-Api-Key: {{ - g.user.wallets[0].inkey }}" + >curl -X GET {{ request.url_root }}lnurlp/api/v1/links -H "X-Api-Key: + {{ g.user.wallets[0].inkey }}" @@ -38,8 +38,8 @@ {"lnurl": <string>}
Curl example
curl -X GET {{ request.url_root }}lnurlp/api/v1/links/<pay_id> -H - "X-Api-Key: {{ g.user.wallets[0].inkey }}" + >curl -X GET {{ request.url_root }}lnurlp/api/v1/links/<pay_id> + -H "X-Api-Key: {{ g.user.wallets[0].inkey }}" @@ -93,8 +93,8 @@ {"lnurl": <string>}
Curl example
curl -X PUT {{ request.url_root }}lnurlp/api/v1/links/<pay_id> -d - '{"description": <string>, "amount": <integer>}' -H + >curl -X PUT {{ request.url_root }}lnurlp/api/v1/links/<pay_id> + -d '{"description": <string>, "amount": <integer>}' -H "Content-type: application/json" -H "X-Api-Key: {{ g.user.wallets[0].adminkey }}" @@ -120,8 +120,9 @@
Curl example
curl -X DELETE {{ request.url_root }}lnurlp/api/v1/links/<pay_id> - -H "X-Api-Key: {{ g.user.wallets[0].adminkey }}" + >curl -X DELETE {{ request.url_root + }}lnurlp/api/v1/links/<pay_id> -H "X-Api-Key: {{ + g.user.wallets[0].adminkey }}" diff --git a/lnbits/extensions/withdraw/views_api.py b/lnbits/extensions/withdraw/views_api.py index 0ec807204..cb8b7f0a7 100644 --- a/lnbits/extensions/withdraw/views_api.py +++ b/lnbits/extensions/withdraw/views_api.py @@ -24,7 +24,15 @@ async def api_links(): wallet_ids = (await get_user(g.wallet.user)).wallet_ids try: return ( - jsonify([{**link._asdict(), **{"lnurl": link.lnurl},} for link in await get_withdraw_links(wallet_ids)]), + jsonify( + [ + { + **link._asdict(), + **{"lnurl": link.lnurl}, + } + for link in await get_withdraw_links(wallet_ids) + ] + ), HTTPStatus.OK, ) except LnurlInvalidUrl: