Withdraw working, also made them unique
This commit is contained in:
parent
39339469bb
commit
66d44f95fb
9 changed files with 50 additions and 19 deletions
|
|
@ -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
23
crud.py
|
|
@ -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:
|
||||||
|
|
|
||||||
32
lnurl.py
32
lnurl.py
|
|
@ -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"}
|
||||||
6
tasks.py
6
tasks.py
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue