Compare commits

..
11 Commits
Author SHA1 Message Date
dni ⚡andGitHub 609c949394 chore: update to v1.3.0-rc3 (#3313) 2025-08-18 10:07:29 +02:00
dni ⚡andGitHub c24d2f24cf fix: bump lnurl its not callback_url now, its just url (#3312) 2025-08-18 09:18:11 +02:00
dni ⚡andGitHub 0ba81ec719 bug: propergate LnurlErrorResponse in lnurl service and dont checks for redundant LnurlPayActionResponse (#3314) 2025-08-14 13:37:44 +02:00
dni ⚡andGitHub 5e03707be5 fix: mispelling in logs #3306 (#3310) 2025-08-13 14:40:24 +02:00
ArcandGitHub 50f1111356 Fix: fake wallet (#3309) 2025-08-13 14:39:42 +02:00
dni ⚡andGitHub 112a0f9698 fix: lnaddresses on new lnurlscan POST endpoint (#3305) 2025-08-13 08:45:36 +02:00
ArcandGitHub 75016d1a27 fix: lnurl_decode changed to url_decode (#3303) 2025-08-04 09:25:09 +02:00
Tiago VasconcelosandGitHub 5b9f244a9f fix: prevent overflow on dialog (#3295) 2025-07-31 20:06:17 +03:00
dni ⚡andGitHub 0d2ff2e663 feat: add lud17 support for wallet parse dialog (#3289) 2025-07-23 15:27:00 +02:00
Tiago VasconcelosandGitHub bdfefc2506 [Fix] Don't allow pay for expired invoice (#3290) 2025-07-23 15:25:27 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2a9f471783 build(deps): bump form-data from 4.0.0 to 4.0.4 (#3288)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 14:34:15 +03:00
13 changed files with 274 additions and 47 deletions
+5 -1
View File
@@ -1,6 +1,6 @@
from typing import Optional from typing import Optional
from lnurl import Lnurl, LnurlPayResponse from lnurl import LnAddress, Lnurl, LnurlPayResponse
from pydantic import BaseModel from pydantic import BaseModel
@@ -14,3 +14,7 @@ class CreateLnurlPayment(BaseModel):
class CreateLnurlWithdraw(BaseModel): class CreateLnurlWithdraw(BaseModel):
lnurl_w: Lnurl lnurl_w: Lnurl
class LnurlScan(BaseModel):
lnurl: Lnurl | LnAddress
+12 -7
View File
@@ -1,4 +1,5 @@
from lnurl import ( from lnurl import (
LnurlErrorResponse,
LnurlPayActionResponse, LnurlPayActionResponse,
LnurlPayResponse, LnurlPayResponse,
LnurlResponseException, LnurlResponseException,
@@ -11,22 +12,25 @@ from lnbits.settings import settings
from lnbits.utils.exchange_rates import fiat_amount_as_satoshis from lnbits.utils.exchange_rates import fiat_amount_as_satoshis
async def get_pr_from_lnurl(lnurl: str, amount_msat: int) -> str: async def get_pr_from_lnurl(
lnurl: str, amount_msat: int, comment: str | None = None
) -> str:
res = await handle(lnurl, user_agent=settings.user_agent, timeout=10) res = await handle(lnurl, user_agent=settings.user_agent, timeout=10)
if isinstance(res, LnurlErrorResponse):
raise LnurlResponseException(res.reason)
if not isinstance(res, LnurlPayResponse): if not isinstance(res, LnurlPayResponse):
raise LnurlResponseException( raise LnurlResponseException(
"Invalid LNURL response. Expected LnurlPayResponse." "Invalid LNURL response. Expected LnurlPayResponse."
) )
res2 = await execute_pay_request( res2 = await execute_pay_request(
res, res,
msat=str(amount_msat), msat=amount_msat,
comment=comment,
user_agent=settings.user_agent, user_agent=settings.user_agent,
timeout=10, timeout=10,
) )
if not isinstance(res, LnurlPayActionResponse): if isinstance(res2, LnurlErrorResponse):
raise LnurlResponseException( raise LnurlResponseException(res2.reason)
"Invalid LNURL pay response. Expected LnurlPayActionResponse."
)
return res2.pr return res2.pr
@@ -47,7 +51,8 @@ async def fetch_lnurl_pay_request(data: CreateLnurlPayment) -> LnurlPayActionRes
return await execute_pay_request( return await execute_pay_request(
data.res, data.res,
msat=str(amount_msat), msat=amount_msat,
comment=data.comment,
user_agent=settings.user_agent, user_agent=settings.user_agent,
timeout=10, timeout=10,
) )
+1 -1
View File
@@ -231,7 +231,7 @@ async def api_disable_extension(
return SimpleStatus( return SimpleStatus(
success=True, message=f"Extension '{ext_id}' already disabled." success=True, message=f"Extension '{ext_id}' already disabled."
) )
logger.info(f"Disabeling extension: {ext_id}.") logger.info(f"Disabling extension: {ext_id}.")
user_ext.active = False user_ext.active = False
await update_user_extension(user_ext) await update_user_extension(user_ext)
return SimpleStatus(success=True, message=f"Extension '{ext_id}' disabled.") return SimpleStatus(success=True, message=f"Extension '{ext_id}' disabled.")
+2 -2
View File
@@ -7,7 +7,7 @@ from fastapi import Cookie, Depends, Query, Request
from fastapi.exceptions import HTTPException from fastapi.exceptions import HTTPException
from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse
from fastapi.routing import APIRouter from fastapi.routing import APIRouter
from lnurl import decode as lnurl_decode from lnurl import url_decode
from pydantic.types import UUID4 from pydantic.types import UUID4
from lnbits.core.helpers import to_valid_user_id from lnbits.core.helpers import to_valid_user_id
@@ -456,7 +456,7 @@ async def lnurlwallet(request: Request, lightning: str = ""):
if not settings.lnbits_allow_new_accounts: if not settings.lnbits_allow_new_accounts:
return {"status": "ERROR", "reason": "New accounts are not allowed."} return {"status": "ERROR", "reason": "New accounts are not allowed."}
lnurl = lnurl_decode(lightning) lnurl = url_decode(lightning)
async with httpx.AsyncClient() as client: async with httpx.AsyncClient() as client:
check_callback_url(lnurl) check_callback_url(lnurl)
+24 -5
View File
@@ -23,7 +23,7 @@ from lnurl.models import (
from loguru import logger from loguru import logger
from lnbits.core.models import CreateLnurlWithdraw, Payment from lnbits.core.models import CreateLnurlWithdraw, Payment
from lnbits.core.models.lnurl import CreateLnurlPayment from lnbits.core.models.lnurl import CreateLnurlPayment, LnurlScan
from lnbits.decorators import ( from lnbits.decorators import (
WalletTypeInfo, WalletTypeInfo,
require_admin_key, require_admin_key,
@@ -40,6 +40,7 @@ lnurl_router = APIRouter(tags=["LNURL"])
@lnurl_router.get( @lnurl_router.get(
"/api/v1/lnurlscan/{code}", "/api/v1/lnurlscan/{code}",
dependencies=[Depends(require_invoice_key)], dependencies=[Depends(require_invoice_key)],
deprecated=True,
response_model=LnurlPayResponse response_model=LnurlPayResponse
| LnurlWithdrawResponse | LnurlWithdrawResponse
| LnurlAuthResponse | LnurlAuthResponse
@@ -58,6 +59,24 @@ async def api_lnurlscan(code: str) -> LnurlResponseModel:
return res return res
@lnurl_router.post(
"/api/v1/lnurlscan",
dependencies=[Depends(require_invoice_key)],
response_model=LnurlPayResponse
| LnurlWithdrawResponse
| LnurlAuthResponse
| LnurlErrorResponse,
)
async def api_lnurlscan_post(scan: LnurlScan) -> LnurlResponseModel:
try:
res = await lnurl_handle(scan.lnurl, user_agent=settings.user_agent, timeout=5)
except LnurlResponseException as exc:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST, detail=str(exc)
) from exc
return res
@lnurl_router.post("/api/v1/lnurlauth") @lnurl_router.post("/api/v1/lnurlauth")
async def api_perform_lnurlauth( async def api_perform_lnurlauth(
data: LnurlAuthResponse, key_type: WalletTypeInfo = Depends(require_admin_key) data: LnurlAuthResponse, key_type: WalletTypeInfo = Depends(require_admin_key)
@@ -115,12 +134,12 @@ async def api_payment_pay_with_nfc(
payment_request: str, payment_request: str,
lnurl_data: CreateLnurlWithdraw, lnurl_data: CreateLnurlWithdraw,
) -> LnurlErrorResponse | LnurlSuccessResponse: ) -> LnurlErrorResponse | LnurlSuccessResponse:
if not lnurl_data.lnurl_w.lud17:
return LnurlErrorResponse(reason="LNURL-withdraw lud17 not provided.")
try: try:
res = await lnurl_handle( url = lnurl_data.lnurl_w.lud17
lnurl_data.lnurl_w.callback_url, user_agent=settings.user_agent, timeout=10 res = await lnurl_handle(url, user_agent=settings.user_agent, timeout=10)
)
except (LnurlResponseException, Exception) as exc: except (LnurlResponseException, Exception) as exc:
logger.warning(exc)
return LnurlErrorResponse(reason=str(exc)) return LnurlErrorResponse(reason=str(exc))
if not isinstance(res, LnurlWithdrawResponse): if not isinstance(res, LnurlWithdrawResponse):
+2 -2
View File
@@ -10,7 +10,7 @@ from fastapi import (
Query, Query,
) )
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from lnurl import decode as lnurl_decode from lnurl import url_decode
from lnbits import bolt11 from lnbits import bolt11
from lnbits.core.crud.payments import ( from lnbits.core.crud.payments import (
@@ -318,7 +318,7 @@ async def api_payments_decode(data: DecodePayment) -> JSONResponse:
payment_str = data.data payment_str = data.data
try: try:
if payment_str[:5] == "LNURL": if payment_str[:5] == "LNURL":
url = str(lnurl_decode(payment_str)) url = str(url_decode(payment_str))
return JSONResponse({"domain": url}) return JSONResponse({"domain": url})
else: else:
invoice = bolt11.decode(payment_str) invoice = bolt11.decode(payment_str)
+1 -5
View File
@@ -99,11 +99,7 @@ def template_renderer(additional_folders: Optional[list] = None) -> Jinja2Templa
"USE_DEFAULT_BGIMAGE": settings.lnbits_default_bgimage, "USE_DEFAULT_BGIMAGE": settings.lnbits_default_bgimage,
"VOIDWALLET": settings.lnbits_backend_wallet_class == "VoidWallet", "VOIDWALLET": settings.lnbits_backend_wallet_class == "VoidWallet",
"WEBPUSH_PUBKEY": settings.lnbits_webpush_pubkey, "WEBPUSH_PUBKEY": settings.lnbits_webpush_pubkey,
"LNBITS_DENOMINATION": ( "LNBITS_DENOMINATION": settings.lnbits_denomination,
settings.lnbits_denomination
if settings.lnbits_denomination == "FakeWallet"
else "sats"
),
"has_holdinvoice": settings.has_holdinvoice, "has_holdinvoice": settings.has_holdinvoice,
} }
+31 -13
View File
@@ -141,6 +141,13 @@ window.WalletPageLogic = {
}, },
canPay() { canPay() {
if (!this.parse.invoice) return false if (!this.parse.invoice) return false
if (this.parse.invoice.expired) {
Quasar.Notify.create({
message: 'Invoice has expired',
color: 'negative'
})
return false
}
return this.parse.invoice.sat <= this.g.wallet.sat return this.parse.invoice.sat <= this.g.wallet.sat
}, },
formattedAmount() { formattedAmount() {
@@ -275,7 +282,10 @@ window.WalletPageLogic = {
this.readNfcTag() this.readNfcTag()
} }
// WITHDRAW // WITHDRAW
if (response.data.extra.lnurl_response !== null) { if (
this.receive.lnurl &&
response.data.extra?.lnurl_response !== null
) {
if (response.data.extra.lnurl_response === false) { if (response.data.extra.lnurl_response === false) {
response.data.extra.lnurl_response = `Unable to connect` response.data.extra.lnurl_response = `Unable to connect`
} }
@@ -342,11 +352,9 @@ window.WalletPageLogic = {
}, },
lnurlScan() { lnurlScan() {
LNbits.api LNbits.api
.request( .request('POST', '/api/v1/lnurlscan', this.g.wallet.adminkey, {
'GET', lnurl: this.parse.data.request
'/api/v1/lnurlscan/' + this.parse.data.request, })
this.g.wallet.adminkey
)
.then(response => { .then(response => {
const data = response.data const data = response.data
if (data.status === 'ERROR') { if (data.status === 'ERROR') {
@@ -394,19 +402,29 @@ window.WalletPageLogic = {
this.decodeRequest() this.decodeRequest()
this.parse.camera.show = false this.parse.camera.show = false
}, },
isLnurl(req) {
return (
req.toLowerCase().startsWith('lnurl1') ||
req.startsWith('lnurlp://') ||
req.startsWith('lnurlw://') ||
req.startsWith('lnurlauth://') ||
req.match(/[\w.+-~_]+@[\w.+-~_]/)
)
},
decodeRequest() { decodeRequest() {
this.parse.show = true this.parse.show = true
this.parse.data.request = this.parse.data.request.trim().toLowerCase() this.parse.data.request = this.parse.data.request.trim()
let req = this.parse.data.request const req = this.parse.data.request.toLowerCase()
if (req.startsWith('lightning:')) { if (req.startsWith('lightning:')) {
this.parse.data.request = req.slice(10) this.parse.data.request = this.parse.data.request.slice(10)
} else if (req.startsWith('lnurl:')) { } else if (req.startsWith('lnurl:')) {
this.parse.data.request = req.slice(6) this.parse.data.request = this.parse.data.request.slice(6)
} else if (req.includes('lightning=lnurl1')) { } else if (req.includes('lightning=lnurl1')) {
this.parse.data.request = req.split('lightning=')[1].split('&')[0] this.parse.data.request = this.parse.data.request
.split('lightning=')[1]
.split('&')[0]
} }
req = this.parse.data.request if (this.isLnurl(this.parse.data.request)) {
if (req.startsWith('lnurl1') || req.match(/[\w.+-~_]+@[\w.+-~_]/)) {
this.lnurlScan() this.lnurlScan()
return return
} }
+6 -1
View File
@@ -370,7 +370,12 @@
v-if="extras.length" v-if="extras.length"
> >
<template v-for="entry in extras"> <template v-for="entry in extras">
<q-item v-if="!!entry.value" key="entry.key" class="text-grey-4"> <q-item
v-if="!!entry.value"
key="entry.key"
class="text-grey-4"
style="white-space: normal; word-break: break-all"
>
<q-item-section> <q-item-section>
<q-item-label v-text="entry.key"></q-item-label> <q-item-label v-text="entry.key"></q-item-label>
<q-item-label caption v-text="entry.value"></q-item-label> <q-item-label caption v-text="entry.value"></q-item-label>
+184 -3
View File
@@ -448,6 +448,19 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true "dev": true
}, },
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/camel-case": { "node_modules/camel-case": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
@@ -589,6 +602,20 @@
"tslib": "^2.0.3" "tslib": "^2.0.3"
} }
}, },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/entities": { "node_modules/entities": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -600,6 +627,51 @@
"url": "https://github.com/fb55/entities?sponsor=1" "url": "https://github.com/fb55/entities?sponsor=1"
} }
}, },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/estree-walker": { "node_modules/estree-walker": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -637,12 +709,15 @@
} }
}, },
"node_modules/form-data": { "node_modules/form-data": {
"version": "4.0.0", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"license": "MIT",
"dependencies": { "dependencies": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12" "mime-types": "^2.1.12"
}, },
"engines": { "engines": {
@@ -663,6 +738,52 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0" "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
} }
}, },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/glob-parent": { "node_modules/glob-parent": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -675,6 +796,57 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/html-minifier-terser": { "node_modules/html-minifier-terser": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
@@ -776,6 +948,15 @@
"@jridgewell/sourcemap-codec": "^1.5.0" "@jridgewell/sourcemap-codec": "^1.5.0"
} }
}, },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime-db": { "node_modules/mime-db": {
"version": "1.52.0", "version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
Generated
+4 -4
View File
@@ -2133,14 +2133,14 @@ valkey = ["valkey (>=6)"]
[[package]] [[package]]
name = "lnurl" name = "lnurl"
version = "0.6.8" version = "0.7.2"
description = "LNURL implementation for Python." description = "LNURL implementation for Python."
optional = false optional = false
python-versions = ">=3.10" python-versions = ">=3.10"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "lnurl-0.6.8-py3-none-any.whl", hash = "sha256:4fff53efcdd401cf4169676bd1ab85e9e241a762a9a5407ee11e6a6e120e8279"}, {file = "lnurl-0.7.2-py3-none-any.whl", hash = "sha256:4323ac398d49e5b883000c166b4c2448df2acad2eddca99f656c67f7b97cd80f"},
{file = "lnurl-0.6.8.tar.gz", hash = "sha256:de64a47179980a4b52cd6b89ad377cda14502f1998f53724490683f6f5c4ed90"}, {file = "lnurl-0.7.2.tar.gz", hash = "sha256:9f0881cb5909512cadb35d238c27347d6a8afcec10b2b7aadd560083fd210c0b"},
] ]
[package.dependencies] [package.dependencies]
@@ -4573,4 +4573,4 @@ migration = ["psycopg2-binary"]
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = "~3.12 | ~3.11 | ~3.10" python-versions = "~3.12 | ~3.11 | ~3.10"
content-hash = "c1714a4df0e8f7d8702fffe9c57b21fc39effb194631741b4718466c18b73d8f" content-hash = "7100b67d94f82cb53ceb8f4e47ae8a4aa426408feabeb0746c323d09f229c242"
+2 -2
View File
@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "lnbits" name = "lnbits"
version = "1.3.0-rc2" version = "1.3.0-rc3"
description = "LNbits, free and open-source Lightning wallet and accounts system." description = "LNbits, free and open-source Lightning wallet and accounts system."
authors = ["Alan Bits <alan@lnbits.com>"] authors = ["Alan Bits <alan@lnbits.com>"]
readme = "README.md" readme = "README.md"
@@ -20,7 +20,7 @@ fastapi = "0.116.1"
starlette = "0.47.1" starlette = "0.47.1"
httpx = "0.27.0" httpx = "0.27.0"
jinja2 = "3.1.6" jinja2 = "3.1.6"
lnurl = "0.6.8" lnurl = "0.7.2"
pydantic = "1.10.22" pydantic = "1.10.22"
pyqrcode = "1.2.1" pyqrcode = "1.2.1"
shortuuid = "1.0.13" shortuuid = "1.0.13"
-1
View File
@@ -623,7 +623,6 @@ async def test_fiat_tracking(client, adminkey_headers_from, settings: Settings):
{ {
"tag": "payRequest", "tag": "payRequest",
"callback": "https://example.com/callback", "callback": "https://example.com/callback",
"k1": "randomk1value",
"minSendable": 1000, "minSendable": 1000,
"maxSendable": 1_500_000, "maxSendable": 1_500_000,
"metadata": '[["text/plain", "Payment to yo"]]', "metadata": '[["text/plain", "Payment to yo"]]',