From b7008495b86db1082ed85b981fe4ceed2d848d52 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:35:35 +0200 Subject: [PATCH] lnurlp: support for floating point fiat values --- lnbits/extensions/lnurlp/crud.py | 6 ++++++ lnbits/extensions/lnurlp/lnurl.py | 4 ++-- lnbits/extensions/lnurlp/models.py | 11 +++++++---- lnbits/extensions/lnurlp/views_api.py | 6 +----- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lnbits/extensions/lnurlp/crud.py b/lnbits/extensions/lnurlp/crud.py index 4215faf66..0559e063a 100644 --- a/lnbits/extensions/lnurlp/crud.py +++ b/lnbits/extensions/lnurlp/crud.py @@ -9,6 +9,12 @@ async def create_pay_link(data: CreatePayLinkData, wallet_id: str) -> PayLink: returning = "" if db.type == SQLITE else "RETURNING ID" method = db.execute if db.type == SQLITE else db.fetchone + # database only allows int4 entries for min and max. For fiat currencies, + # we multiply by 100 to save the value in cents. + if data.currency: + data.min *= 100 + data.max *= 100 + result = await (method)( f""" INSERT INTO lnurlp.pay_links ( diff --git a/lnbits/extensions/lnurlp/lnurl.py b/lnbits/extensions/lnurlp/lnurl.py index 173b4823a..b193aa449 100644 --- a/lnbits/extensions/lnurlp/lnurl.py +++ b/lnbits/extensions/lnurlp/lnurl.py @@ -29,11 +29,11 @@ async def api_lnurl_response(request: Request, link_id): status_code=HTTPStatus.NOT_FOUND, detail="Pay link does not exist." ) - rate = await get_fiat_rate_satoshis(link.currency) if link.currency else 1 + rate = await get_fiat_rate_satoshis(link.currency) / 100 if link.currency else 1 resp = LnurlPayResponse( callback=request.url_for("lnurlp.api_lnurl_callback", link_id=link.id), - min_sendable=math.ceil(link.min * rate) * 1000, + min_sendable=round(link.min * rate) * 1000, max_sendable=round(link.max * rate) * 1000, metadata=link.lnurlpay_metadata, ) diff --git a/lnbits/extensions/lnurlp/models.py b/lnbits/extensions/lnurlp/models.py index 6fc9cc1a0..6d0b0ee0b 100644 --- a/lnbits/extensions/lnurlp/models.py +++ b/lnbits/extensions/lnurlp/models.py @@ -11,8 +11,8 @@ from pydantic import BaseModel class CreatePayLinkData(BaseModel): description: str - min: int = Query(0.01, ge=0.01) - max: int = Query(0.01, ge=0.01) + min: float = Query(1, ge=0.01) + max: float = Query(1, ge=0.01) currency: str = Query(None) comment_chars: int = Query(0, ge=0, lt=800) webhook_url: str = Query(None) @@ -24,7 +24,7 @@ class PayLink(BaseModel): id: int wallet: str description: str - min: int + min: float served_meta: int served_pr: int webhook_url: Optional[str] @@ -32,11 +32,14 @@ class PayLink(BaseModel): success_url: Optional[str] currency: Optional[str] comment_chars: int - max: int + max: float @classmethod def from_row(cls, row: Row) -> "PayLink": data = dict(row) + if data["currency"]: + data["min"] /= 100 + data["max"] /= 100 return cls(**data) def lnurl(self, req: Request) -> str: diff --git a/lnbits/extensions/lnurlp/views_api.py b/lnbits/extensions/lnurlp/views_api.py index ff6e96e21..52d729a98 100644 --- a/lnbits/extensions/lnurlp/views_api.py +++ b/lnbits/extensions/lnurlp/views_api.py @@ -76,10 +76,6 @@ async def api_link_create_or_update( link_id=None, wallet: WalletTypeInfo = Depends(get_key_type), ): - if data.min < 1: - raise HTTPException( - detail="Min must be more than 1.", status_code=HTTPStatus.BAD_REQUEST - ) if data.min > data.max: raise HTTPException( @@ -87,7 +83,7 @@ async def api_link_create_or_update( ) if data.currency == None and ( - round(data.min) != data.min or round(data.max) != data.max + round(data.min) != data.min or round(data.max) != data.max or data.min < 1 ): raise HTTPException( detail="Must use full satoshis.", status_code=HTTPStatus.BAD_REQUEST