lnbits-legend/lnbits/extensions/watchonly/crud.py

147 lines
4.4 KiB
Python
Raw Normal View History

2020-12-01 19:54:16 +00:00
from typing import List, Optional, Union
2020-12-01 20:29:21 +00:00
#from lnbits.db import open_ext_db
from . import db
from .models import Wallets, Addresses, Mempool
2020-12-01 20:29:21 +00:00
2020-12-01 19:54:16 +00:00
from lnbits.helpers import urlsafe_short_hash
from embit import bip32
from embit import ec
from embit.networks import NETWORKS
from embit import base58
from embit.util import hashlib
import io
from embit.util import secp256k1
from embit import hashes
from binascii import hexlify
from quart import jsonify
from embit import script
from embit import ec
from embit.networks import NETWORKS
from binascii import unhexlify, hexlify, a2b_base64, b2a_base64
2021-02-21 13:25:54 +00:00
import httpx
2020-12-01 19:54:16 +00:00
2020-12-04 10:15:46 +00:00
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
2020-12-01 19:54:16 +00:00
##########################WALLETS####################
2020-12-01 21:39:33 +00:00
async def create_watch_wallet(*, user: str, masterpub: str, title: str) -> Wallets:
2020-12-01 19:54:16 +00:00
wallet_id = urlsafe_short_hash()
2020-12-01 21:39:33 +00:00
await db.execute(
"""
INSERT INTO wallets (
id,
user,
masterpub,
title,
address_no,
balance
2020-12-01 19:54:16 +00:00
)
2020-12-01 21:39:33 +00:00
VALUES (?, ?, ?, ?, ?, ?)
""",
(wallet_id, user, masterpub, title, 0, 0),
)
2020-12-01 19:54:16 +00:00
# weallet_id = db.cursor.lastrowid
2020-12-04 10:15:46 +00:00
address = await create_charge(wallet_id, user)
2021-02-21 17:00:13 +00:00
print(address)
2020-12-01 21:39:33 +00:00
return await get_watch_wallet(wallet_id)
2020-12-01 19:54:16 +00:00
2020-12-01 21:39:33 +00:00
async def get_watch_wallet(wallet_id: str) -> Wallets:
row = await db.fetchone("SELECT * FROM wallets WHERE id = ?", (wallet_id,))
2020-12-01 19:54:16 +00:00
return Wallets.from_row(row) if row else None
2020-12-03 17:26:11 +00:00
2020-12-01 21:39:33 +00:00
async def get_watch_wallets(user: str) -> List[Wallets]:
rows = await db.fetchall("SELECT * FROM wallets WHERE user = ?", (user,))
2020-12-01 19:54:16 +00:00
return [Wallets(**row) for row in rows]
2020-12-01 21:39:33 +00:00
async def update_watch_wallet(wallet_id: str, **kwargs) -> Optional[Wallets]:
2020-12-01 19:54:16 +00:00
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
2020-12-01 21:39:33 +00:00
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,))
2020-12-01 19:54:16 +00:00
return Wallets.from_row(row) if row else None
2020-12-01 21:39:33 +00:00
async def delete_watch_wallet(wallet_id: str) -> None:
await db.execute("DELETE FROM wallets WHERE id = ?", (wallet_id,))
2020-12-01 19:54:16 +00:00
########################ADDRESSES#######################
2020-12-01 19:54:16 +00:00
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()
2020-12-01 19:54:16 +00:00
return address
2021-02-21 17:00:13 +00:00
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)
2020-12-01 19:54:16 +00:00
await update_watch_wallet(wallet_id = wallet_id, address_no = wallet[4] + 1)
2020-12-01 21:39:33 +00:00
await db.execute(
"""
INSERT INTO addresses (
2020-12-01 21:39:33 +00:00
address,
wallet,
amount
2020-12-01 19:54:16 +00:00
)
VALUES (?, ?, ?)
2020-12-01 21:39:33 +00:00
""",
(address, wallet_id, 0),
2020-12-01 21:39:33 +00:00
)
2020-12-01 19:54:16 +00:00
return await get_address(address)
2020-12-01 19:54:16 +00:00
2021-02-21 13:25:54 +00:00
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
2021-02-21 13:25:54 +00:00
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]
2020-12-01 19:54:16 +00:00
######################MEMPOOL#######################
2020-12-01 21:39:33 +00:00
async def create_mempool(user: str) -> Mempool:
await db.execute(
"""
INSERT INTO mempool (
user,
endpoint
)
VALUES (?, ?)
""",
(user, 'https://mempool.space'),
)
row = await db.fetchone("SELECT * FROM mempool WHERE user = ?", (user,))
2020-12-01 19:54:16 +00:00
return Mempool.from_row(row) if row else None
2020-12-01 21:39:33 +00:00
async def update_mempool(user: str, **kwargs) -> Optional[Mempool]:
2020-12-01 19:54:16 +00:00
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
2020-12-01 21:39:33 +00:00
await db.execute(f"UPDATE mempool SET {q} WHERE user = ?", (*kwargs.values(), user))
row = await db.fetchone("SELECT * FROM mempool WHERE user = ?", (user,))
2020-12-01 19:54:16 +00:00
return Mempool.from_row(row) if row else None
2020-12-01 21:39:33 +00:00
async def get_mempool(user: str) -> Mempool:
row = await db.fetchone("SELECT * FROM mempool WHERE user = ?", (user,))
2020-12-01 19:54:16 +00:00
return Mempool.from_row(row) if row else None