diff --git a/lnbits/extensions/cashu/__init__.py b/lnbits/extensions/cashu/__init__.py index ed67b134c..cf2776648 100644 --- a/lnbits/extensions/cashu/__init__.py +++ b/lnbits/extensions/cashu/__init__.py @@ -6,12 +6,9 @@ from lnbits.db import Database from lnbits.helpers import template_renderer from lnbits.tasks import catch_everything_and_restart -from cashu.mint.router import router as cashu_router - db = Database("ext_cashu") cashu_ext: APIRouter = APIRouter(prefix="/cashu", tags=["cashu"]) -cashu_ext.include_router(router=cashu_router) def cashu_renderer(): return template_renderer(["lnbits/extensions/cashu/templates"]) diff --git a/lnbits/extensions/cashu/crud.py b/lnbits/extensions/cashu/crud.py index e1cdaf4ea..2892e6a47 100644 --- a/lnbits/extensions/cashu/crud.py +++ b/lnbits/extensions/cashu/crud.py @@ -3,7 +3,7 @@ from typing import List, Optional, Union from lnbits.helpers import urlsafe_short_hash from . import db -from .models import Cashu, Pegs +from .models import Cashu, Pegs, Proof from embit import script from embit import ec @@ -76,9 +76,7 @@ async def delete_cashu(cashu_id: str) -> None: async def store_promise( amount: int, B_: str, - C_: str, - db: Database, - conn: Optional[Connection] = None, + C_: str ): await (conn or db).execute( @@ -95,10 +93,7 @@ async def store_promise( ) -async def get_proofs_used( - db: Database, - conn: Optional[Connection] = None, -): +async def get_proofs_used(): rows = await (conn or db).fetchall( """ @@ -109,9 +104,7 @@ async def get_proofs_used( async def invalidate_proof( - proof: Proof, - db: Database, - conn: Optional[Connection] = None, + proof: Proof ): # we add the proof and secret to the used list diff --git a/lnbits/extensions/cashu/ledger.py b/lnbits/extensions/cashu/ledger.py index cc5ef924e..59cc3b922 100644 --- a/lnbits/extensions/cashu/ledger.py +++ b/lnbits/extensions/cashu/ledger.py @@ -1,22 +1,23 @@ import hashlib from typing import List, Set -from models import BlindedMessage, BlindedSignature, Invoice, Proof +from .models import BlindedMessage, BlindedSignature, Invoice, Proof from secp256k1 import PublicKey, PrivateKey +from fastapi import Query + from lnbits.core.services import check_transaction_status, create_invoice class Ledger: - def __init__(self, secret_key: str, db: str, MAX_ORDER: int = Query(64)): + def __init__(self, secret_key: str, MAX_ORDER: int = Query(64)): self.proofs_used: Set[str] = set() self.master_key: str = secret_key self.keys: List[PrivateKey] = self._derive_keys(self.master_key) self.pub_keys: List[PublicKey] = self._derive_pubkeys(self.keys) - self.db: Database = Database("mint", db) async def load_used_proofs(self): - self.proofs_used = set(await get_proofs_used(db=self.db)) + self.proofs_used = set(await get_proofs_used) @staticmethod def _derive_keys(master_key: str): @@ -48,7 +49,7 @@ class Ledger: secret_key = self.keys[amount] # Get the correct key C_ = step2_bob(B_, secret_key) await store_promise( - amount, B_=B_.serialize().hex(), C_=C_.serialize().hex(), db=self.db + amount, B_=B_.serialize().hex(), C_=C_.serialize().hex() ) return BlindedSignature(amount=amount, C_=C_.serialize().hex()) @@ -126,7 +127,7 @@ class Ledger: self.proofs_used |= proof_msgs # store in db for p in proofs: - await invalidate_proof(p, db=self.db) + await invalidate_proof(p) # Public methods def get_pubkeys(self): @@ -150,13 +151,13 @@ class Ledger: ) if not payment_request or not payment_hash: raise Exception(f"Could not create Lightning invoice.") - await store_lightning_invoice(invoice, db=self.db) + await store_lightning_invoice(invoice) return payment_request, payment_hash async def mint(self, B_s: List[PublicKey], amounts: List[int], payment_hash=None): """Mints a promise for coins for B_.""" # check if lightning invoice was paid - if payment_hash and not await check_transaction_status(ayment_hash) + if payment_hash and not await check_transaction_status(payment_hash): raise Exception("Lightning invoice not paid yet.") for amount in amounts: @@ -224,7 +225,7 @@ class Ledger: return prom_fst, prom_snd -#######FUNCTIONS############### +##############FUNCTIONS############### def fee_reserve(amount_msat: int) -> int: """Function for calculating the Lightning fee reserve""" return max( diff --git a/lnbits/extensions/cashu/models.py b/lnbits/extensions/cashu/models.py index ba9303c5e..a673dfe78 100644 --- a/lnbits/extensions/cashu/models.py +++ b/lnbits/extensions/cashu/models.py @@ -1,5 +1,5 @@ from sqlite3 import Row -from typing import Optional +from typing import Optional, List from fastapi import Query from pydantic import BaseModel @@ -31,6 +31,8 @@ class Pegs(BaseModel): def from_row(cls, row: Row) -> "TPoS": return cls(**dict(row)) +class PayLnurlWData(BaseModel): + lnurl: str class Proof(BaseModel): amount: int diff --git a/lnbits/extensions/cashu/views_api.py b/lnbits/extensions/cashu/views_api.py index 5a1c500ee..5cc6e2713 100644 --- a/lnbits/extensions/cashu/views_api.py +++ b/lnbits/extensions/cashu/views_api.py @@ -16,9 +16,9 @@ from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key from . import cashu_ext from .crud import create_cashu, delete_cashu, get_cashu, get_cashus, update_cashu_keys -from .models import Cashu, Pegs, CheckPayload, MeltPayload, MintPayloads, SplitPayload +from .models import Cashu, Pegs, CheckPayload, MeltPayload, MintPayloads, SplitPayload, PayLnurlWData -import .ledger +from .ledger import Ledger, fee_reserve, amount_split, hash_to_point, step1_alice, step2_bob, step3_alice, verify @cashu_ext.get("/api/v1/cashus", status_code=HTTPStatus.OK) async def api_cashus(