diff --git a/lnbits/extensions/cashu/__init__.py b/lnbits/extensions/cashu/__init__.py index b36e94ef8..81b18bc70 100644 --- a/lnbits/extensions/cashu/__init__.py +++ b/lnbits/extensions/cashu/__init__.py @@ -13,7 +13,8 @@ import sys sys.path.append("/Users/cc/git/cashu") from cashu.mint.ledger import Ledger -from .crud import LedgerCrud + +# from .crud import LedgerCrud # db = Database("ext_cashu", LNBITS_DATA_FOLDER) @@ -22,7 +23,6 @@ ledger = Ledger( # seed=MINT_PRIVATE_KEY, seed="asd", derivation_path="0/0/0/1", - crud=LedgerCrud, ) cashu_ext: APIRouter = APIRouter(prefix="/api/v1/cashu", tags=["cashu"]) diff --git a/lnbits/extensions/cashu/config.json b/lnbits/extensions/cashu/config.json index e71e68895..99838eb4f 100644 --- a/lnbits/extensions/cashu/config.json +++ b/lnbits/extensions/cashu/config.json @@ -3,7 +3,5 @@ "short_description": "Ecash mint and wallet", "icon": "approval", "contributors": ["arcbtc", "calle", "vlad"], - "hidden": false, - "migration_module": "cashu.mint.migrations", - "db_name": "cashu" + "hidden": false } diff --git a/lnbits/extensions/cashu/crud.py b/lnbits/extensions/cashu/crud.py index 48b90d70f..31c185dc1 100644 --- a/lnbits/extensions/cashu/crud.py +++ b/lnbits/extensions/cashu/crud.py @@ -11,6 +11,7 @@ from loguru import logger from lnbits.helpers import urlsafe_short_hash from . import db + from .core.base import Invoice from .models import Cashu, Pegs, Promises, Proof @@ -18,44 +19,44 @@ from cashu.core.base import MintKeyset from lnbits.db import Database, Connection -class LedgerCrud: - """ - Database interface for Cashu mint. +# class LedgerCrud: +# """ +# Database interface for Cashu mint. - This class needs to be overloaded by any app that imports the Cashu mint. - """ +# This class needs to be overloaded by any app that imports the Cashu mint. +# """ - async def get_keyset(*args, **kwags): +# async def get_keyset(*args, **kwags): - return await get_keyset(*args, **kwags) +# return await get_keyset(*args, **kwags) - async def get_lightning_invoice(*args, **kwags): +# async def get_lightning_invoice(*args, **kwags): - return await get_lightning_invoice(*args, **kwags) +# return await get_lightning_invoice(*args, **kwags) - async def get_proofs_used(*args, **kwags): +# async def get_proofs_used(*args, **kwags): - return await get_proofs_used(*args, **kwags) +# return await get_proofs_used(*args, **kwags) - async def invalidate_proof(*args, **kwags): +# async def invalidate_proof(*args, **kwags): - return await invalidate_proof(*args, **kwags) +# return await invalidate_proof(*args, **kwags) - async def store_keyset(*args, **kwags): +# async def store_keyset(*args, **kwags): - return await store_keyset(*args, **kwags) +# return await store_keyset(*args, **kwags) - async def store_lightning_invoice(*args, **kwags): +# async def store_lightning_invoice(*args, **kwags): - return await store_lightning_invoice(*args, **kwags) +# return await store_lightning_invoice(*args, **kwags) - async def store_promise(*args, **kwags): +# async def store_promise(*args, **kwags): - return await store_promise(*args, **kwags) +# return await store_promise(*args, **kwags) - async def update_lightning_invoice(*args, **kwags): +# async def update_lightning_invoice(*args, **kwags): - return await update_lightning_invoice(*args, **kwags) +# return await update_lightning_invoice(*args, **kwags) async def create_cashu(wallet_id: str, data: Cashu) -> Cashu: @@ -132,9 +133,9 @@ async def delete_cashu(cashu_id) -> None: await db.execute("DELETE FROM cashu.cashu WHERE id = ?", (cashu_id,)) -########################################## -###############MINT STUFF################# -########################################## +# ########################################## +# ###############MINT STUFF################# +# ########################################## async def store_promises( @@ -241,55 +242,55 @@ async def update_lightning_invoice(cashu_id: str, hash: str, issued: bool): ############################## -async def store_keyset( - keyset: MintKeyset, - db: Database = None, - conn: Optional[Connection] = None, -): +# async def store_keyset( +# keyset: MintKeyset, +# db: Database = None, +# conn: Optional[Connection] = None, +# ): - await (conn or db).execute( # type: ignore - """ - INSERT INTO cashu.keysets - (id, derivation_path, valid_from, valid_to, first_seen, active, version) - VALUES (?, ?, ?, ?, ?, ?, ?) - """, - ( - keyset.id, - keyset.derivation_path, - keyset.valid_from or db.timestamp_now, - keyset.valid_to or db.timestamp_now, - keyset.first_seen or db.timestamp_now, - True, - keyset.version, - ), - ) +# await (conn or db).execute( # type: ignore +# """ +# INSERT INTO cashu.keysets +# (id, derivation_path, valid_from, valid_to, first_seen, active, version) +# VALUES (?, ?, ?, ?, ?, ?, ?) +# """, +# ( +# keyset.id, +# keyset.derivation_path, +# keyset.valid_from or db.timestamp_now, +# keyset.valid_to or db.timestamp_now, +# keyset.first_seen or db.timestamp_now, +# True, +# keyset.version, +# ), +# ) -async def get_keyset( - id: str = None, - derivation_path: str = "", - db: Database = None, - conn: Optional[Connection] = None, -): - clauses = [] - values: List[Any] = [] - clauses.append("active = ?") - values.append(True) - if id: - clauses.append("id = ?") - values.append(id) - if derivation_path: - clauses.append("derivation_path = ?") - values.append(derivation_path) - where = "" - if clauses: - where = f"WHERE {' AND '.join(clauses)}" +# async def get_keyset( +# id: str = None, +# derivation_path: str = "", +# db: Database = None, +# conn: Optional[Connection] = None, +# ): +# clauses = [] +# values: List[Any] = [] +# clauses.append("active = ?") +# values.append(True) +# if id: +# clauses.append("id = ?") +# values.append(id) +# if derivation_path: +# clauses.append("derivation_path = ?") +# values.append(derivation_path) +# where = "" +# if clauses: +# where = f"WHERE {' AND '.join(clauses)}" - rows = await (conn or db).fetchall( # type: ignore - f""" - SELECT * from cashu.keysets - {where} - """, - tuple(values), - ) - return [MintKeyset.from_row(row) for row in rows] +# rows = await (conn or db).fetchall( # type: ignore +# f""" +# SELECT * from cashu.keysets +# {where} +# """, +# tuple(values), +# ) +# return [MintKeyset.from_row(row) for row in rows] diff --git a/lnbits/extensions/cashu/migrations.py b/lnbits/extensions/cashu/migrations.py index 019ee84d8..6af53d5d5 100644 --- a/lnbits/extensions/cashu/migrations.py +++ b/lnbits/extensions/cashu/migrations.py @@ -1 +1,148 @@ -# this extension will use the migration_module module cashu.mint.migrations (see config.json) +async def m001_initial(db): + """ + Initial cashu table. + """ + await db.execute( + """ + CREATE TABLE cashu.cashu ( + id TEXT PRIMARY KEY, + wallet TEXT NOT NULL, + name TEXT NOT NULL, + tickershort TEXT DEFAULT 'sats', + fraction BOOL, + maxsats INT, + coins INT, + prvkey TEXT NOT NULL, + pubkey TEXT NOT NULL + ); + """ + ) + + """ + Initial cashus table. + """ + await db.execute( + """ + CREATE TABLE cashu.pegs ( + id TEXT PRIMARY KEY, + wallet TEXT NOT NULL, + inout BOOL NOT NULL, + amount INT + ); + """ + ) + + +# async def m001_initial(db): +# await db.execute( +# """ +# CREATE TABLE IF NOT EXISTS cashu.promises ( +# amount INTEGER NOT NULL, +# B_b TEXT NOT NULL, +# C_b TEXT NOT NULL, + +# UNIQUE (B_b) + +# ); +# """ +# ) + +# await db.execute( +# """ +# CREATE TABLE IF NOT EXISTS cashu.proofs_used ( +# amount INTEGER NOT NULL, +# C TEXT NOT NULL, +# secret TEXT NOT NULL, + +# UNIQUE (secret) + +# ); +# """ +# ) + +# await db.execute( +# """ +# CREATE TABLE IF NOT EXISTS cashu.invoices ( +# amount INTEGER NOT NULL, +# pr TEXT NOT NULL, +# hash TEXT NOT NULL, +# issued BOOL NOT NULL, + +# UNIQUE (hash) + +# ); +# """ +# ) + +# await db.execute( +# """ +# CREATE VIEW IF NOT EXISTS cashu.balance_issued AS +# SELECT COALESCE(SUM(s), 0) AS balance FROM ( +# SELECT SUM(amount) AS s +# FROM cashu.promises +# WHERE amount > 0 +# ); +# """ +# ) + +# await db.execute( +# """ +# CREATE VIEW IF NOT EXISTS cashu.balance_used AS +# SELECT COALESCE(SUM(s), 0) AS balance FROM ( +# SELECT SUM(amount) AS s +# FROM cashu.proofs_used +# WHERE amount > 0 +# ); +# """ +# ) + +# await db.execute( +# """ +# CREATE VIEW IF NOT EXISTS cashu.balance AS +# SELECT s_issued - s_used AS balance FROM ( +# SELECT bi.balance AS s_issued, bu.balance AS s_used +# FROM cashu.balance_issued bi +# CROSS JOIN balance_used bu +# ); +# """ +# ) + + +# async def m003_mint_keysets(db): +# """ +# Stores mint keysets from different mints and epochs. +# """ +# await db.execute( +# f""" +# CREATE TABLE IF NOT EXISTS cashu.keysets ( +# id TEXT NOT NULL, +# derivation_path TEXT, +# valid_from TIMESTAMP NOT NULL DEFAULT {db.timestamp_now}, +# valid_to TIMESTAMP NOT NULL DEFAULT {db.timestamp_now}, +# first_seen TIMESTAMP NOT NULL DEFAULT {db.timestamp_now}, +# active BOOL DEFAULT TRUE, + +# UNIQUE (derivation_path) + +# ); +# """ +# ) +# await db.execute( +# f""" +# CREATE TABLE IF NOT EXISTS cashu.mint_pubkeys ( +# id TEXT NOT NULL, +# amount INTEGER NOT NULL, +# pubkey TEXT NOT NULL, + +# UNIQUE (id, pubkey) + +# ); +# """ +# ) + + +# async def m004_keysets_add_version(db): +# """ +# Column that remembers with which version +# """ +# await db.execute("ALTER TABLE cashu.keysets ADD COLUMN version TEXT") diff --git a/lnbits/extensions/cashu/tasks.py b/lnbits/extensions/cashu/tasks.py index 9d2d7f15b..03bba895d 100644 --- a/lnbits/extensions/cashu/tasks.py +++ b/lnbits/extensions/cashu/tasks.py @@ -12,13 +12,13 @@ from .crud import get_cashu import sys sys.path.append("/Users/cc/git/cashu") -# from cashu.mint import migrations -# from cashu.core.migrations import migrate_databases +from cashu.mint import migrations +from cashu.core.migrations import migrate_databases from . import db, ledger async def startup_cashu_mint(): - # await migrate_databases(db, migrations) + await migrate_databases(db, migrations) await ledger.load_used_proofs() await ledger.init_keysets() print(ledger.get_keyset()) diff --git a/lnbits/extensions/cashu/views_api.py b/lnbits/extensions/cashu/views_api.py index e786cd2f5..e643c2ac1 100644 --- a/lnbits/extensions/cashu/views_api.py +++ b/lnbits/extensions/cashu/views_api.py @@ -29,6 +29,13 @@ from .crud import ( update_lightning_invoice, ) +# from cashu.mint.crud import ( +# get_lightning_invoice, +# store_lightning_invoice, +# store_promise, +# update_lightning_invoice, +# ) + # from .ledger import mint, request_mint from .mint import generate_promises, get_pubkeys, melt, split from .models import (