diff --git a/__init__.py b/__init__.py index 4870562..f60ed98 100644 --- a/__init__.py +++ b/__init__.py @@ -15,7 +15,7 @@ myextension_ext: APIRouter = APIRouter( temp_static_files = [ { "path": "/myextension/static", - "name": "temp_static", + "name": "myextension_static", } ] diff --git a/__pycache__/__init__.cpython-39.pyc b/__pycache__/__init__.cpython-39.pyc index 06b20b0..b19632c 100644 Binary files a/__pycache__/__init__.cpython-39.pyc and b/__pycache__/__init__.cpython-39.pyc differ diff --git a/__pycache__/crud.cpython-39.pyc b/__pycache__/crud.cpython-39.pyc index d7c6ca9..462953b 100644 Binary files a/__pycache__/crud.cpython-39.pyc and b/__pycache__/crud.cpython-39.pyc differ diff --git a/__pycache__/lnurl.cpython-39.pyc b/__pycache__/lnurl.cpython-39.pyc index 6a0724b..bc0c96b 100644 Binary files a/__pycache__/lnurl.cpython-39.pyc and b/__pycache__/lnurl.cpython-39.pyc differ diff --git a/__pycache__/tasks.cpython-39.pyc b/__pycache__/tasks.cpython-39.pyc index 9b32097..8210659 100644 Binary files a/__pycache__/tasks.cpython-39.pyc and b/__pycache__/tasks.cpython-39.pyc differ diff --git a/crud.py b/crud.py index f5fde08..ddc85c6 100644 --- a/crud.py +++ b/crud.py @@ -7,6 +7,7 @@ from .models import CreateMyExtensionData, MyExtension from loguru import logger from fastapi import Request from lnurl import encode as lnurl_encode +import shortuuid async def create_myextension(wallet_id: str, data: CreateMyExtensionData, req: Request) -> MyExtension: myextension_id = urlsafe_short_hash() @@ -35,8 +36,15 @@ async def get_myextension(myextension_id: str, req: Optional[Request] = None) -> return None rowAmended = MyExtension(**row) if req: - rowAmended.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) - rowAmended.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) + rowAmended.lnurlpay = lnurl_encode( + req.url_for("myextension.api_lnurl_pay", + myextension_id=row.id)._url + ) + rowAmended.lnurlwithdraw = lnurl_encode( + req.url_for("myextension.api_lnurl_withdraw", + myextension_id=row.id, + tickerhash=shortuuid.uuid(name=rowAmended.id + str(rowAmended.ticker)))._url + ) return rowAmended async def get_myextensions(wallet_ids: Union[str, List[str]], req: Optional[Request] = None) -> List[MyExtension]: @@ -50,8 +58,15 @@ async def get_myextensions(wallet_ids: Union[str, List[str]], req: Optional[Requ tempRows = [MyExtension(**row) for row in rows] if req: for row in tempRows: - row.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) - row.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) + row.lnurlpay = lnurl_encode( + req.url_for("myextension.api_lnurl_pay", + myextension_id=row.id)._url + ) + row.lnurlwithdraw = lnurl_encode( + req.url_for("myextension.api_lnurl_withdraw", + myextension_id=row.id, + tickerhash=shortuuid.uuid(name=row.id + str(row.ticker)))._url + ) return tempRows async def update_myextension(myextension_id: str, req: Optional[Request] = None, **kwargs) -> MyExtension: diff --git a/lnurl.py b/lnurl.py index 0f6fff9..6e6ddeb 100644 --- a/lnurl.py +++ b/lnurl.py @@ -10,6 +10,7 @@ from lnbits.core.services import create_invoice, pay_invoice from loguru import logger from typing import Optional from .crud import update_myextension +from .models import MyExtension import shortuuid ################################################# @@ -81,26 +82,29 @@ async def api_lnurl_pay_cb( @myextension_ext.get( - "/api/v1/lnurl/withdraw/{myextension_id}", + "/api/v1/lnurl/withdraw/{myextension_id}/{tickerhash}/", status_code=HTTPStatus.OK, name="myextension.api_lnurl_withdraw", ) -async def api_lnurl_pay( +async def api_lnurl_withdraw( request: Request, myextension_id: str, + tickerhash: str, ): myextension = await get_myextension(myextension_id) if not myextension: return {"status": "ERROR", "reason": "No myextension found"} k1 = shortuuid.uuid(name=myextension.id + str(myextension.ticker)) + if k1 != tickerhash: + return {"status": "ERROR", "reason": "LNURLw already used"} + return { + "tag": "withdrawRequest", "callback": str(request.url_for("myextension.api_lnurl_withdraw_callback", myextension_id=myextension_id)), - "maxSendable": myextension.lnurlwithdrawamount * 1000, - "minSendable": myextension.lnurlwithdrawamount * 1000, "k1": k1, "defaultDescription": myextension.name, - "metadata":f"[[\"text/plain\", \"{myextension.name}\"]]", - "tag": "withdrawRequest" + "maxWithdrawable": myextension.lnurlwithdrawamount * 1000, + "minWithdrawable": myextension.lnurlwithdrawamount * 1000 } @myextension_ext.get( @@ -114,20 +118,26 @@ async def api_lnurl_withdraw_cb( pr: Optional[str] = None, k1: Optional[str] = None, ): + assert k1, "k1 is required" assert pr, "pr is required" - + logger.debug("cunt") myextension = await get_myextension(myextension_id) if not myextension: return {"status": "ERROR", "reason": "No myextension found"} - k1Check = shortuuid.uuid(name=myextension.id + str(myextension.ticker - 1)) + k1Check = shortuuid.uuid(name=myextension.id + str(myextension.ticker)) if k1Check != k1: - return {"status": "ERROR", "reason": "Already spent"} + return {"status": "ERROR", "reason": "Wrong k1 check provided"} + + await update_myextension(myextension_id=myextension_id, ticker=myextension.ticker + 1) + logger.debug(myextension.wallet) + logger.debug(pr) + logger.debug(int(myextension.lnurlwithdrawamount * 1000)) await pay_invoice( wallet_id=myextension.wallet, payment_request=pr, max_sat=int(myextension.lnurlwithdrawamount * 1000), - extra={"tag": "MyExtension", "myextensionId": myextension_id,} + extra={"tag": "MyExtension", "myextensionId": myextension_id, "lnurlwithdraw": True} ) - return {"status": "OK"} + return {"status": "OK"} \ No newline at end of file diff --git a/tasks.py b/tasks.py index 8231f48..1f46c8a 100644 --- a/tasks.py +++ b/tasks.py @@ -38,8 +38,12 @@ async def on_invoice_paid(payment: Payment) -> None: myextension = await get_myextension(myextension_id) # update something in the db + if payment.extra.get("lnurlwithdraw"): + total = myextension.total - payment.amount + else: + total = myextension.total + payment.amount data_to_update = { - "total": myextension.total + payment.amount + "total": total } await update_myextension(myextension_id=myextension_id, **data_to_update) diff --git a/templates/myextension/index.html b/templates/myextension/index.html index 24e2ca1..4e8c494 100644 --- a/templates/myextension/index.html +++ b/templates/myextension/index.html @@ -43,7 +43,8 @@ :key="col.name" :props="props" > - ${ col.value } +