diff --git a/lnbits/extensions/watchonly/crud.py b/lnbits/extensions/watchonly/crud.py index 0fe277569..af5364ba2 100644 --- a/lnbits/extensions/watchonly/crud.py +++ b/lnbits/extensions/watchonly/crud.py @@ -77,62 +77,45 @@ async def update_watch_wallet(wallet_id: str, **kwargs) -> Optional[Wallets]: async def delete_watch_wallet(wallet_id: str) -> None: await db.execute("DELETE FROM wallets WHERE id = ?", (wallet_id,)) + ########################ADDRESSES####################### -###############CHARGES########################## +async def get_derive_address(wallet_id: str, num: int): + + wallet = await get_watch_wallet(wallet_id) + k = bip32.HDKey.from_base58(str(wallet[2])) + child = k.derive([0, num]) + address = script.p2wpkh(child).address() + return address -async def create_charge(walletid: str, user: str, title: Optional[str] = None, time: Optional[int] = None, amount: Optional[int] = None) -> Charges: - wallet = await get_watch_wallet(walletid) - address = await get_derive_address(walletid, wallet[4] + 1) +async def get_fresh_address(wallet_id: str) -> Addresses: + wallet = await get_watch_wallet(wallet_id) + + address = await get_derive_address(wallet_id, wallet[4] + 1) - charge_id = urlsafe_short_hash() + await update_watch_wallet(wallet_id = wallet_id, address_no = wallet[4] + 1) await db.execute( """ - INSERT INTO charges ( - id, - user, - title, - wallet, + INSERT INTO addresses ( address, - time_to_pay, - amount, - balance + wallet, + amount ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) + VALUES (?, ?, ?) """, - (charge_id, user, title, walletid, address, time, amount, 0), + (address, wallet_id, 0), ) - return await get_charge(charge_id) + + return await get_address(address) -async def get_charge(charge_id: str) -> Charges: - row = await db.fetchone("SELECT * FROM charges WHERE id = ?", (charge_id,)) - return Charges.from_row(row) if row else None +async def get_address(address: str) -> Addresses: + row = await db.fetchone("SELECT * FROM addresses WHERE address = ?", (address,)) + return Addresses.from_row(row) if row else None - -async def get_charges(user: str) -> List[Charges]: - rows = await db.fetchall("SELECT * FROM charges WHERE user = ?", (user,)) - for row in rows: - await check_address_balance(row.address) - rows = await db.fetchall("SELECT * FROM charges WHERE user = ?", (user,)) - return [charges.from_row(row) for row in rows] - - -async def delete_charge(charge_id: str) -> None: - await db.execute("DELETE FROM charges WHERE id = ?", (charge_id,)) - -async def check_address_balance(address: str) -> List[Charges]: - address_data = await get_address(address) - mempool = await get_mempool(address_data.user) - - try: - async with httpx.AsyncClient() as client: - r = await client.get(mempool.endpoint + "/api/address/" + address) - except Exception: - pass - - amount_paid = r.json()['chain_stats']['funded_txo_sum'] - r.json()['chain_stats']['spent_txo_sum'] - print(amount_paid) +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####################### diff --git a/lnbits/extensions/watchonly/views_api.py b/lnbits/extensions/watchonly/views_api.py index 8b3ef38c1..7f6c3e4c2 100644 --- a/lnbits/extensions/watchonly/views_api.py +++ b/lnbits/extensions/watchonly/views_api.py @@ -82,6 +82,37 @@ async def api_wallet_delete(wallet_id): return jsonify({"deleted": "true"}), HTTPStatus.NO_CONTENT +#############################ADDRESSES########################## + +@watchonly_ext.route("/api/v1/address/", methods=["GET"]) +@api_check_wallet_key("invoice") +async def api_fresh_address(wallet_id): + await get_fresh_address(wallet_id) + + addresses = await get_addresses(wallet_id) + + return jsonify([address._asdict() for address in addresses]), HTTPStatus.OK + + +@watchonly_ext.route("/api/v1/addresses/", methods=["GET"]) +@api_check_wallet_key("invoice") +async def api_get_addresses(wallet_id): + print(wallet_id) + + wallet = await get_watch_wallet(wallet_id) + + if not wallet: + return jsonify({"message": "wallet does not exist"}), HTTPStatus.NOT_FOUND + + addresses = await get_addresses(wallet_id) + + if not addresses: + await get_fresh_address(wallet_id) + addresses = await get_addresses(wallet_id) + + return jsonify([address._asdict() for address in addresses]), HTTPStatus.OK + + #############################MEMPOOL########################## @watchonly_ext.route("/api/v1/mempool", methods=["PUT"])