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 = [ temp_static_files = [
{ {
"path": "/myextension/static", "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 loguru import logger
from fastapi import Request from fastapi import Request
from lnurl import encode as lnurl_encode from lnurl import encode as lnurl_encode
import shortuuid
async def create_myextension(wallet_id: str, data: CreateMyExtensionData, req: Request) -> MyExtension: async def create_myextension(wallet_id: str, data: CreateMyExtensionData, req: Request) -> MyExtension:
myextension_id = urlsafe_short_hash() myextension_id = urlsafe_short_hash()
@ -35,8 +36,15 @@ async def get_myextension(myextension_id: str, req: Optional[Request] = None) ->
return None return None
rowAmended = MyExtension(**row) rowAmended = MyExtension(**row)
if req: if req:
rowAmended.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) rowAmended.lnurlpay = lnurl_encode(
rowAmended.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) 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 return rowAmended
async def get_myextensions(wallet_ids: Union[str, List[str]], req: Optional[Request] = None) -> List[MyExtension]: 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] tempRows = [MyExtension(**row) for row in rows]
if req: if req:
for row in tempRows: for row in tempRows:
row.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) row.lnurlpay = lnurl_encode(
row.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) 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 return tempRows
async def update_myextension(myextension_id: str, req: Optional[Request] = None, **kwargs) -> MyExtension: 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 loguru import logger
from typing import Optional from typing import Optional
from .crud import update_myextension from .crud import update_myextension
from .models import MyExtension
import shortuuid import shortuuid
################################################# #################################################
@ -81,26 +82,29 @@ async def api_lnurl_pay_cb(
@myextension_ext.get( @myextension_ext.get(
"/api/v1/lnurl/withdraw/{myextension_id}", "/api/v1/lnurl/withdraw/{myextension_id}/{tickerhash}/",
status_code=HTTPStatus.OK, status_code=HTTPStatus.OK,
name="myextension.api_lnurl_withdraw", name="myextension.api_lnurl_withdraw",
) )
async def api_lnurl_pay( async def api_lnurl_withdraw(
request: Request, request: Request,
myextension_id: str, myextension_id: str,
tickerhash: str,
): ):
myextension = await get_myextension(myextension_id) myextension = await get_myextension(myextension_id)
if not myextension: if not myextension:
return {"status": "ERROR", "reason": "No myextension found"} return {"status": "ERROR", "reason": "No myextension found"}
k1 = shortuuid.uuid(name=myextension.id + str(myextension.ticker)) k1 = shortuuid.uuid(name=myextension.id + str(myextension.ticker))
if k1 != tickerhash:
return {"status": "ERROR", "reason": "LNURLw already used"}
return { return {
"tag": "withdrawRequest",
"callback": str(request.url_for("myextension.api_lnurl_withdraw_callback", myextension_id=myextension_id)), "callback": str(request.url_for("myextension.api_lnurl_withdraw_callback", myextension_id=myextension_id)),
"maxSendable": myextension.lnurlwithdrawamount * 1000,
"minSendable": myextension.lnurlwithdrawamount * 1000,
"k1": k1, "k1": k1,
"defaultDescription": myextension.name, "defaultDescription": myextension.name,
"metadata":f"[[\"text/plain\", \"{myextension.name}\"]]", "maxWithdrawable": myextension.lnurlwithdrawamount * 1000,
"tag": "withdrawRequest" "minWithdrawable": myextension.lnurlwithdrawamount * 1000
} }
@myextension_ext.get( @myextension_ext.get(
@ -114,20 +118,26 @@ async def api_lnurl_withdraw_cb(
pr: Optional[str] = None, pr: Optional[str] = None,
k1: Optional[str] = None, k1: Optional[str] = None,
): ):
assert k1, "k1 is required" assert k1, "k1 is required"
assert pr, "pr is required" assert pr, "pr is required"
logger.debug("cunt")
myextension = await get_myextension(myextension_id) myextension = await get_myextension(myextension_id)
if not myextension: if not myextension:
return {"status": "ERROR", "reason": "No myextension found"} 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: 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( await pay_invoice(
wallet_id=myextension.wallet, wallet_id=myextension.wallet,
payment_request=pr, payment_request=pr,
max_sat=int(myextension.lnurlwithdrawamount * 1000), 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"}

View file

@ -38,8 +38,12 @@ async def on_invoice_paid(payment: Payment) -> None:
myextension = await get_myextension(myextension_id) myextension = await get_myextension(myextension_id)
# update something in the db # update something in the db
if payment.extra.get("lnurlwithdraw"):
total = myextension.total - payment.amount
else:
total = myextension.total + payment.amount
data_to_update = { data_to_update = {
"total": myextension.total + payment.amount "total": total
} }
await update_myextension(myextension_id=myextension_id, **data_to_update) await update_myextension(myextension_id=myextension_id, **data_to_update)

View file

@ -43,7 +43,8 @@
:key="col.name" :key="col.name"
:props="props" :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>
<q-td auto-width> <q-td auto-width>
<q-btn <q-btn
@ -248,7 +249,8 @@
align: 'left', align: 'left',
label: 'Wallet', label: 'Wallet',
field: 'wallet' field: 'wallet'
} },
{name: 'total', align: 'left', label: 'Total sent/received', field: 'total'},
], ],
pagination: { pagination: {
rowsPerPage: 10 rowsPerPage: 10