diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py
index 72749e85..37a4c57d 100644
--- a/lnbits/extensions/lnurldevice/lnurl.py
+++ b/lnbits/extensions/lnurldevice/lnurl.py
@@ -9,6 +9,7 @@ from embit import bech32, compact
from fastapi import Request
from fastapi.param_functions import Query
from starlette.exceptions import HTTPException
+from loguru import logger
from lnbits.core.services import create_invoice
from lnbits.core.views.api import pay_invoice
@@ -113,6 +114,14 @@ async def lnurl_v1_params(
else amount_in_cent
) * 1000
+ # Check they're not trying to trick the switch!
+ check = False
+ for switch in device.switches(request):
+ if switch[0] == gpio and switch[1] == profit and switch[2] == amount:
+ check = True
+ if not check:
+ return {"status": "ERROR", "reason": f"Switch params wrong"}
+
lnurldevicepayment = await create_lnurldevicepayment(
deviceid=device.id,
payload=amount,
@@ -129,7 +138,7 @@ async def lnurl_v1_params(
),
"minSendable": price_msat,
"maxSendable": price_msat,
- "metadata": await device.lnurlpay_metadata(),
+ "metadata": device.lnurlpay_metadata,
}
if len(p) % 4 > 0:
p += "=" * (4 - (len(p) % 4))
@@ -236,11 +245,17 @@ async def lnurl_callback(
if device.device == "switch":
payment_hash, payment_request = await create_invoice(
wallet_id=device.wallet,
- amount=lnurldevicepayment.sats / 1000,
- memo=device.title + "-" + lnurldevicepayment.id,
- unhashed_description=(await device.lnurlpay_metadata()).encode("utf-8"),
- extra={"tag": "Switch", "pin": lnurldevicepayment.pin,"amount": int(lnurldevicepayment.payload),"id": paymentid},
+ amount=int(lnurldevicepayment.sats / 1000),
+ memo=device.id + " PIN " + str(lnurldevicepayment.pin),
+ unhashed_description=device.lnurlpay_metadata.encode("utf-8"),
+ extra={
+ "tag": "Switch",
+ "pin": str(lnurldevicepayment.pin),
+ "amount": str(lnurldevicepayment.payload),
+ "id": paymentid
+ },
)
+
lnurldevicepayment = await update_lnurldevicepayment(
lnurldevicepayment_id=paymentid, payhash=payment_hash
)
diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py
index 62917632..ace22ca1 100644
--- a/lnbits/extensions/lnurldevice/models.py
+++ b/lnbits/extensions/lnurldevice/models.py
@@ -1,6 +1,6 @@
import json
from sqlite3 import Row
-from typing import Optional
+from typing import Optional, List
from fastapi import Request
from lnurl import Lnurl
@@ -9,7 +9,7 @@ from lnurl.models import LnurlPaySuccessAction, UrlAction # type: ignore
from lnurl.types import LnurlPayMetadata # type: ignore
from pydantic import BaseModel
from pydantic.main import BaseModel
-
+from loguru import logger
class createLnurldevice(BaseModel):
title: str
@@ -60,13 +60,28 @@ class lnurldevices(BaseModel):
def from_row(cls, row: Row) -> "lnurldevices":
return cls(**dict(row))
- def lnurl(self, req: Request) -> Lnurl:
- url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
- return lnurl_encode(url)
-
- async def lnurlpay_metadata(self) -> LnurlPayMetadata:
+ @property
+ def lnurlpay_metadata(self) -> LnurlPayMetadata:
return LnurlPayMetadata(json.dumps([["text/plain", self.title]]))
+ def switches(self, req: Request) -> List:
+ switches = []
+ if self.profit > 0:
+ url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
+ switches.append([str(self.pin), str(self.profit), str(self.amount), lnurl_encode(url + "?gpio=" + str(self.pin) + "&profit=" + str(self.profit) + "&amount=" + str(self.amount))])
+ if self.profit1 > 0:
+ url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
+ switches.append([str(self.pin1), str(self.profit1), str(self.amount1), lnurl_encode(url + "?gpio=" + str(self.pin1) + "&profit=" + str(self.profit1) + "&amount=" + str(self.amount1))])
+ if self.profit2 > 0:
+ url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
+ switches.append([str(self.pin2), str(self.profit2), str(self.amount2), lnurl_encode(url + "?gpio=" + str(self.pin2) + "&profit=" + str(self.profit2) + "&amount=" + str(self.amount2))])
+ if self.profit3 > 0:
+ url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
+ switches.append([str(self.pin3), str(self.profit3), str(self.amount3), lnurl_encode(url + "?gpio=" + str(self.pin3) + "&profit=" + str(self.profit3) + "&amount=" + str(self.amount3))])
+ if self.profit4 > 0:
+ url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
+ switches.append([str(self.pin4), str(self.profit4), str(self.amount4), lnurl_encode(url + "?gpio=" + str(self.pin4) + "&profit=" + str(self.profit4) + "&amount=" + str(self.amount4))])
+ return switches
class lnurldevicepayment(BaseModel):
id: str
diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py
index 2867577d..ca7aabb4 100644
--- a/lnbits/extensions/lnurldevice/tasks.py
+++ b/lnbits/extensions/lnurldevice/tasks.py
@@ -36,5 +36,5 @@ async def on_invoice_paid(payment: Payment) -> None:
lnurldevicepayment = await update_lnurldevicepayment(
lnurldevicepayment_id=payment.extra.get("id"), payhash="used"
)
- return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin, lnurldevicepayment.amount)
+ return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin, lnurldevicepayment.payload)
return
diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
index 72ea8082..17ce9f28 100644
--- a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
+++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
@@ -148,42 +148,6 @@
style="width: 700px; max-width: 80vw"
class="q-pa-lg q-pt-xl lnbits__dialog-card"
>
-
-
-
- ID: {{ qrCodeDialog.data.id }}
-