diff --git a/lnbits/extensions/satspay/__init__.py b/lnbits/extensions/satspay/__init__.py index 778c66d0..4bdaa2b6 100644 --- a/lnbits/extensions/satspay/__init__.py +++ b/lnbits/extensions/satspay/__init__.py @@ -5,7 +5,8 @@ db = Database("ext_satspay") satspay_ext: Blueprint = Blueprint( - "satspay", __name__, static_folder="static", template_folder="templates") + "satspay", __name__, static_folder="static", template_folder="templates" +) from .views_api import * # noqa diff --git a/lnbits/extensions/satspay/crud.py b/lnbits/extensions/satspay/crud.py index 0883aadf..566eddb8 100644 --- a/lnbits/extensions/satspay/crud.py +++ b/lnbits/extensions/satspay/crud.py @@ -1,6 +1,6 @@ from typing import List, Optional, Union -#from lnbits.db import open_ext_db +# from lnbits.db import open_ext_db from . import db from .models import Charges @@ -15,7 +15,17 @@ from ..watchonly.crud import get_watch_wallet, get_fresh_address, get_mempool ###############CHARGES########################## -async def create_charge(user: str, description: str = None, onchainwallet: Optional[str] = None, lnbitswallet: Optional[str] = None, webhook: Optional[str] = None, completelink: Optional[str] = None, completelinktext: Optional[str] = None, time: Optional[int] = None, amount: Optional[int] = None) -> Charges: +async def create_charge( + user: str, + description: str = None, + onchainwallet: Optional[str] = None, + lnbitswallet: Optional[str] = None, + webhook: Optional[str] = None, + completelink: Optional[str] = None, + completelinktext: Optional[str] = None, + time: Optional[int] = None, + amount: Optional[int] = None, +) -> Charges: charge_id = urlsafe_short_hash() if onchainwallet: wallet = await get_watch_wallet(onchainwallet) @@ -25,9 +35,8 @@ async def create_charge(user: str, description: str = None, onchainwallet: Optio onchainaddress = None if lnbitswallet: payment_hash, payment_request = await create_invoice( - wallet_id=lnbitswallet, - amount=amount, - memo=charge_id) + wallet_id=lnbitswallet, amount=amount, memo=charge_id + ) else: payment_hash = None payment_request = None @@ -51,15 +60,31 @@ async def create_charge(user: str, description: str = None, onchainwallet: Optio ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, - (charge_id, user, description, onchainwallet, onchainaddress, lnbitswallet, - payment_request, payment_hash, webhook, completelink, completelinktext, time, amount, 0), + ( + charge_id, + user, + description, + onchainwallet, + onchainaddress, + lnbitswallet, + payment_request, + payment_hash, + webhook, + completelink, + completelinktext, + time, + amount, + 0, + ), ) return await get_charge(charge_id) async def update_charge(charge_id: str, **kwargs) -> Optional[Charges]: q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()]) - await db.execute(f"UPDATE charges SET {q} WHERE id = ?", (*kwargs.values(), charge_id)) + await db.execute( + f"UPDATE charges SET {q} WHERE id = ?", (*kwargs.values(), charge_id) + ) row = await db.fetchone("SELECT * FROM charges WHERE id = ?", (charge_id,)) return Charges.from_row(row) if row else None @@ -85,14 +110,18 @@ async def check_address_balance(charge_id: str) -> List[Charges]: mempool = await get_mempool(charge.user) try: async with httpx.AsyncClient() as client: - r = await client.get(mempool.endpoint + "/api/address/" + charge.onchainaddress) - respAmount = r.json()['chain_stats']['funded_txo_sum'] + r = await client.get( + mempool.endpoint + "/api/address/" + charge.onchainaddress + ) + respAmount = r.json()["chain_stats"]["funded_txo_sum"] if respAmount >= charge.balance: await update_charge(charge_id=charge_id, balance=respAmount) except Exception: pass if charge.lnbitswallet: - invoice_status = await check_invoice_status(charge.lnbitswallet, charge.payment_hash) + invoice_status = await check_invoice_status( + charge.lnbitswallet, charge.payment_hash + ) if invoice_status.paid: return await update_charge(charge_id=charge_id, balance=charge.amount) row = await db.fetchone("SELECT * FROM charges WHERE id = ?", (charge_id,)) diff --git a/lnbits/extensions/satspay/views.py b/lnbits/extensions/satspay/views.py index e02e10af..2c99a925 100644 --- a/lnbits/extensions/satspay/views.py +++ b/lnbits/extensions/satspay/views.py @@ -17,5 +17,6 @@ async def index(): @satspay_ext.route("/") async def display(charge_id): charge = await get_charge(charge_id) or abort( - HTTPStatus.NOT_FOUND, "Charge link does not exist.") + HTTPStatus.NOT_FOUND, "Charge link does not exist." + ) return await render_template("satspay/display.html", charge=charge) diff --git a/lnbits/extensions/satspay/views_api.py b/lnbits/extensions/satspay/views_api.py index b0851cab..9440312a 100644 --- a/lnbits/extensions/satspay/views_api.py +++ b/lnbits/extensions/satspay/views_api.py @@ -48,7 +48,19 @@ async def api_charge_create_or_update(charge_id=None): @api_check_wallet_key("invoice") async def api_charges_retrieve(): try: - return jsonify([{**charge._asdict(), **{"time_elapsed": charge.time_elapsed}, **{"paid": charge.paid}}for charge in await get_charges(g.wallet.user)]), HTTPStatus.OK + return ( + jsonify( + [ + { + **charge._asdict(), + **{"time_elapsed": charge.time_elapsed}, + **{"paid": charge.paid}, + } + for charge in await get_charges(g.wallet.user) + ] + ), + HTTPStatus.OK, + ) except: return "" @@ -61,7 +73,16 @@ async def api_charge_retrieve(charge_id): if not charge: return jsonify({"message": "charge does not exist"}), HTTPStatus.NOT_FOUND - return jsonify({**charge._asdict(), **{"time_elapsed": charge.time_elapsed}, **{"paid": charge.paid}}), HTTPStatus.OK + return ( + jsonify( + { + **charge._asdict(), + **{"time_elapsed": charge.time_elapsed}, + **{"paid": charge.paid}, + } + ), + HTTPStatus.OK, + ) @satspay_ext.route("/api/v1/charge/", methods=["DELETE"]) @@ -79,6 +100,7 @@ async def api_charge_delete(charge_id): #############################BALANCE########################## + @satspay_ext.route("/api/v1/charges/balance/", methods=["GET"]) async def api_charges_balance(charge_id): @@ -110,12 +132,13 @@ async def api_charges_balance(charge_id): charge.webhook = None return jsonify(charge._asdict()), HTTPStatus.OK + #############################MEMPOOL########################## -@ satspay_ext.route("/api/v1/mempool", methods=["PUT"]) -@ api_check_wallet_key("invoice") -@ api_validate_post_request( +@satspay_ext.route("/api/v1/mempool", methods=["PUT"]) +@api_check_wallet_key("invoice") +@api_validate_post_request( schema={ "endpoint": {"type": "string", "empty": False, "required": True}, } @@ -125,8 +148,8 @@ async def api_update_mempool(): return jsonify(mempool._asdict()), HTTPStatus.OK -@ satspay_ext.route("/api/v1/mempool", methods=["GET"]) -@ api_check_wallet_key("invoice") +@satspay_ext.route("/api/v1/mempool", methods=["GET"]) +@api_check_wallet_key("invoice") async def api_get_mempool(): mempool = await get_mempool(g.wallet.user) if not mempool: diff --git a/lnbits/extensions/watchonly/__init__.py b/lnbits/extensions/watchonly/__init__.py index 830f8fc4..b8df3197 100644 --- a/lnbits/extensions/watchonly/__init__.py +++ b/lnbits/extensions/watchonly/__init__.py @@ -5,7 +5,8 @@ db = Database("ext_watchonly") watchonly_ext: Blueprint = Blueprint( - "watchonly", __name__, static_folder="static", template_folder="templates") + "watchonly", __name__, static_folder="static", template_folder="templates" +) from .views_api import * # noqa diff --git a/lnbits/extensions/watchonly/crud.py b/lnbits/extensions/watchonly/crud.py index 9255c952..24f6896e 100644 --- a/lnbits/extensions/watchonly/crud.py +++ b/lnbits/extensions/watchonly/crud.py @@ -1,6 +1,6 @@ from typing import List, Optional, Union -#from lnbits.db import open_ext_db +# from lnbits.db import open_ext_db from . import db from .models import Wallets, Addresses, Mempool @@ -15,6 +15,7 @@ import httpx ##########################WALLETS#################### + def detect_network(k): version = k.key.version for network_name in NETWORKS: @@ -23,6 +24,7 @@ def detect_network(k): if version in [net["xpub"], net["ypub"], net["zpub"], net["Zpub"], net["Ypub"]]: return net + def parse_key(masterpub: str): """Parses masterpub or descriptor and returns a tuple: (Descriptor, network) To create addresses use descriptor.derive(num).address(network=network) @@ -37,7 +39,9 @@ def parse_key(masterpub: str): raise ValueError("Private keys are not allowed") # check depth if k.key.depth != 3: - raise ValueError("Non-standard depth. Only bip44, bip49 and bip84 are supported with bare xpubs. For custom derivation paths use descriptors.") + raise ValueError( + "Non-standard depth. Only bip44, bip49 and bip84 are supported with bare xpubs. For custom derivation paths use descriptors." + ) # if allowed derivation is not provided use default /{0,1}/* if k.allowed_derivation is None: k.allowed_derivation = AllowedDerivation.default() @@ -110,7 +114,9 @@ async def get_watch_wallets(user: str) -> List[Wallets]: async def update_watch_wallet(wallet_id: str, **kwargs) -> Optional[Wallets]: q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()]) - await db.execute(f"UPDATE wallets SET {q} WHERE id = ?", (*kwargs.values(), wallet_id)) + await db.execute( + f"UPDATE wallets SET {q} WHERE id = ?", (*kwargs.values(), wallet_id) + ) row = await db.fetchone("SELECT * FROM wallets WHERE id = ?", (wallet_id,)) return Wallets.from_row(row) if row else None @@ -161,6 +167,7 @@ async def get_addresses(wallet_id: str) -> List[Addresses]: rows = await db.fetchall("SELECT * FROM addresses WHERE wallet = ?", (wallet_id,)) return [Addresses(**row) for row in rows] + ######################MEMPOOL####################### @@ -173,7 +180,7 @@ async def create_mempool(user: str) -> Mempool: ) VALUES (?, ?) """, - (user, 'https://mempool.space'), + (user, "https://mempool.space"), ) row = await db.fetchone("SELECT * FROM mempool WHERE user = ?", (user,)) return Mempool.from_row(row) if row else None diff --git a/lnbits/extensions/watchonly/views.py b/lnbits/extensions/watchonly/views.py index a30dc888..e8246968 100644 --- a/lnbits/extensions/watchonly/views.py +++ b/lnbits/extensions/watchonly/views.py @@ -16,6 +16,7 @@ async def index(): @watchonly_ext.route("/") async def display(charge_id): link = get_payment(charge_id) or abort( - HTTPStatus.NOT_FOUND, "Charge link does not exist.") + HTTPStatus.NOT_FOUND, "Charge link does not exist." + ) return await render_template("watchonly/display.html", link=link) diff --git a/lnbits/extensions/watchonly/views_api.py b/lnbits/extensions/watchonly/views_api.py index f63ad70e..01ae2527 100644 --- a/lnbits/extensions/watchonly/views_api.py +++ b/lnbits/extensions/watchonly/views_api.py @@ -30,7 +30,10 @@ async def api_wallets_retrieve(): try: return ( - jsonify([wallet._asdict() for wallet in await get_watch_wallets(g.wallet.user)]), HTTPStatus.OK + jsonify( + [wallet._asdict() for wallet in await get_watch_wallets(g.wallet.user)] + ), + HTTPStatus.OK, ) except: return "" @@ -57,7 +60,9 @@ async def api_wallet_retrieve(wallet_id): ) async def api_wallet_create_or_update(wallet_id=None): try: - wallet = await create_watch_wallet(user=g.wallet.user, masterpub=g.data["masterpub"], title=g.data["title"]) + wallet = await create_watch_wallet( + user=g.wallet.user, masterpub=g.data["masterpub"], title=g.data["title"] + ) except Exception as e: return jsonify({"message": str(e)}), HTTPStatus.BAD_REQUEST mempool = await get_mempool(g.wallet.user) @@ -81,6 +86,7 @@ async def api_wallet_delete(wallet_id): #############################ADDRESSES########################## + @watchonly_ext.route("/api/v1/address/", methods=["GET"]) @api_check_wallet_key("invoice") async def api_fresh_address(wallet_id): @@ -110,6 +116,7 @@ async def api_get_addresses(wallet_id): #############################MEMPOOL########################## + @watchonly_ext.route("/api/v1/mempool", methods=["PUT"]) @api_check_wallet_key("admin") @api_validate_post_request(