Withdraw working, also made them unique

This commit is contained in:
benarc 2024-02-01 17:15:34 +00:00
parent 39339469bb
commit 66d44f95fb
9 changed files with 50 additions and 19 deletions

View file

@ -15,7 +15,7 @@ myextension_ext: APIRouter = APIRouter(
temp_static_files = [
{
"path": "/myextension/static",
"name": "temp_static",
"name": "myextension_static",
}
]

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

23
crud.py
View file

@ -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:

View file

@ -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"}

View file

@ -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)

View file

@ -43,7 +43,8 @@
:key="col.name"
:props="props"
>
${ col.value }
<div v-if="col.field == 'total'">${ col.value / 1000} sats</div>
<div v-else>${ col.value }</div>
</q-td>
<q-td auto-width>
<q-btn
@ -248,7 +249,8 @@
align: 'left',
label: 'Wallet',
field: 'wallet'
}
},
{name: 'total', align: 'left', label: 'Total sent/received', field: 'total'},
],
pagination: {
rowsPerPage: 10