From 3dc1e86d8cffde5815e0e65531f680f846dbf200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dni=20=E2=9A=A1?= Date: Thu, 14 Aug 2025 12:16:16 +0200 Subject: [PATCH] feat: support lud-11 disposable links (#95) --- crud.py | 1 + migrations.py | 6 ++++++ models.py | 3 +++ static/js/index.js | 1 - templates/lnurlp/index.html | 12 ++++++++++++ views_lnurl.py | 10 +++++++--- 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/crud.py b/crud.py index 5727da7..c1b5335 100644 --- a/crud.py +++ b/crud.py @@ -66,6 +66,7 @@ async def create_pay_link(data: CreatePayLinkData) -> PayLink: fiat_base_multiplier=data.fiat_base_multiplier, created_at=now, updated_at=now, + disposable=data.disposable if data.disposable is not None else True, ) await db.insert("lnurlp.pay_links", link) diff --git a/migrations.py b/migrations.py index 8de7e82..2b0e28b 100644 --- a/migrations.py +++ b/migrations.py @@ -212,3 +212,9 @@ async def m011_add_created_at(db: Connection): """, {"now": now}, ) + + +async def m012_add_disposable(db: Connection): + await db.execute( + "ALTER TABLE lnurlp.pay_links ADD COLUMN disposable BOOLEAN DEFAULT TRUE" + ) diff --git a/models.py b/models.py index 39b247e..be2a39b 100644 --- a/models.py +++ b/models.py @@ -39,6 +39,7 @@ class CreatePayLinkData(BaseModel): fiat_base_multiplier: int = Query(100, ge=1) username: str = Query(None) zaps: Optional[bool] = Query(False) + disposable: bool | None = Query(True) class PayLink(BaseModel): @@ -63,6 +64,8 @@ class PayLink(BaseModel): created_at: datetime updated_at: datetime + disposable: bool + def lnurl(self, req: Request) -> str: url = req.url_for("lnurlp.api_lnurl_response", link_id=self.id) url = url.replace(path=normalize_path(url.path)) diff --git a/static/js/index.js b/static/js/index.js index e804774..11668c7 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -11,7 +11,6 @@ const mapPayLink = obj => { obj._data = _.clone(obj) obj.created_at = LNbits.utils.formatDateString(obj.created_at) obj.updated_at = LNbits.utils.formatDateString(obj.updated_at) - obj.print_url = [locationPath, 'print/', obj.id].join('') obj.pay_url = [locationPath, 'link/', obj.id].join('') return obj diff --git a/templates/lnurlp/index.html b/templates/lnurlp/index.html index 1eaeab4..7491c01 100644 --- a/templates/lnurlp/index.html +++ b/templates/lnurlp/index.html @@ -235,6 +235,18 @@ > +
+ LUD-11: Disposable and storeable payRequests. +
+
+
+ +
+
LNURL
diff --git a/views_lnurl.py b/views_lnurl.py index 3d882bd..fd9cec7 100644 --- a/views_lnurl.py +++ b/views_lnurl.py @@ -119,15 +119,19 @@ async def api_lnurl_callback( text = link.success_text or f"Link to {link.success_url}" desc = parse_obj_as(Max144Str, text) action = UrlAction(tag=LnurlPaySuccessActionTag.url, url=url, description=desc) - return LnurlPayActionResponse(pr=invoice, successAction=action) + return LnurlPayActionResponse( + pr=invoice, successAction=action, disposable=link.disposable + ) if link.success_text: message = parse_obj_as(Max144Str, link.success_text) return LnurlPayActionResponse( - pr=invoice, successAction=MessageAction(message=message) + pr=invoice, + successAction=MessageAction(message=message), + disposable=link.disposable, ) - return LnurlPayActionResponse(pr=invoice) + return LnurlPayActionResponse(pr=invoice, disposable=link.disposable) @lnurlp_lnurl_router.get(