From 39339469bb1e0e59655a382220fc34660008351e Mon Sep 17 00:00:00 2001 From: benarc Date: Tue, 23 Jan 2024 09:14:57 +0000 Subject: [PATCH] lnurlwithdraw --- __pycache__/lnurl.cpython-39.pyc | Bin 3189 -> 3154 bytes __pycache__/migrations.cpython-39.pyc | Bin 1251 -> 934 bytes __pycache__/models.cpython-39.pyc | Bin 1270 -> 1311 bytes __pycache__/tasks.cpython-39.pyc | Bin 1373 -> 1351 bytes lnurl.py | 38 ++++++++++---------------- models.py | 2 ++ tasks.py | 2 +- 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/__pycache__/lnurl.cpython-39.pyc b/__pycache__/lnurl.cpython-39.pyc index 4e309d63dfede2203cbb7634c34188c5df6dbb88..6a0724b8f00112295bf08df133710e2e514391c5 100644 GIT binary patch delta 1575 zcmew=aY=$Vk(ZZ?fq{X+zh+%(^+aA-Mu~~quJyS*Q9O(cDGVv>IlQ@iQG8%FM-G3k zK$HL@Lke>WXAVcMV3Z(OoGV8tN+^{*OE`r)l`%^sg(ro#mpPR+RWyZf4pRz$ia-lX zGh>t(ScM>1g%DT;ONwwaV;Un!WvY0J$Qzwo}OBy$#{#yzn~;DKQA#ylkt{NX+a7|Q*LEyMM-L2 zab|v=-{!T9W{ix2lb{_W7%vh1kx=GB1AxhB#4j#5z=52eJfpIb{A{Fa9!>Z1x zG1-MxK~@{2h&?y8xHvIAwTd+$F*8L$lc`7%WPtwUMpg|*?#ZiIWf}P=pI}uKfV&iI zRFTT$pRCG?svxysLJee?Kw?2=d`@0zQBFK4jFOWyC)=_aGFng0XG>$8GTEF-u|A8b zhAE4=gr$Zli?x|ioFRp!m$8;Pg%!k4VH0P_WUOT=VM}93VXtA#WUOIX!q~^?$&kX} z!NAB+!cxPK#h$`Z!AGgHj7iQ;SP9*^6XB%H%+V{N#7+GG+=OCMXy+xr#VI;lf#*kzZ6&TAG=1iv>(F zWu_DYp-Vc_IrWMSlDlwjie&%z?XEWpUY$ic|O$im3O$n>*HOFyw7Q@_km z9~@WuFdykBt0w7JBc;Rm%#_+9J5b7DL2{D8{EY1{8 z5r$^Q6s{V^6z(}pDLlO_us8?BU?w9d1}7iqRH_F@B0LTuk!Hidz);2Om{XLRm{O@w zT#%YqQUs1PO_0l>30e!pW+~DE1*a7#PS|r3E8>e2ONv0*phy%X#N_V{jjlTMiZhlH> iPO2R%$b|_E3=BMsB8)tYJd6U2JdCU$2FGMI9)AEyJ6J0K delta 1662 zcmca4@l}F1k(ZZ?fq{V`J#Ss=@rk^$j0_XCUF#VcQW#R$b9i!jqj#^DT2+6X^bG1 zsUj&tbC^?vQ$$)=n;D}-!D>apYQ?~6A*MMprHErOP6DJPMHXz3SgMdDLn@d|k($Gj zBAp@wHc~uAGMGVAZn6hslrrNjzT~3R#FEtb%)GMv%;Z!}##?MT`RVDYMVgGaSVBWR zT{gdEG-G7spRB^%uE@*4z@W)o#K*wEP{hx`z;KH@w=%V&BsH%%Ge2)7Ly_|2Gt423 z!jlzQq#0Ew+p=i$i83%S=)tv2E@RnjECA9i2qJ_)ggA(h01=X46MZXPVI~%-LF|*C z9K)*4s5ZHURY6u0q=-E?wYWGjJ++E8ATcvVL6fOS9%O*-MP-m$Frfl6Odzo!Gd?G;v?wROAh9w&IZ1tTEt?^u<>d8jX^dTy z%bAqa8B3UIn6j9g8O0e=SW;MfnQEC+*gzsF?BWcWjI}H!ENKiW9Fr5-h0~d87_wMX zIBOVFxO$nI8EcrbKq}d4m}{7_*i*Pc`KSQj}O8lv-Gt zT3n*ZUL*}tAp;_0LH=dRHoPU2lA4xSnp5JETAW;zSx}OhpI0OYQUMA_O^zZC5StrB zD1ZoC1_p*Gq0)jBP)b3H@*+hBEe3{L!r;(@S)7=gUz%4^1Wqfgh_q6qG7>Yr*GjQ@TvM_QniZOBhXJL_G7GPvyWMO1tWMSlCWcpcT$H2hg zr^$k3q#np|4h#$o$)FGeWl|7kXJB9e<=Dd@bI&m_Fw`&?^LR0&Fg7zbO)lZouCD>b zCrcJ{3Y!E2I8ND9IC`0CS!-Bpn6sIS5>l8`I8#{XFaA3mT+Zpr|^|9)vz@)&Ssd) zl)~T3)WjIh5Xq1t%}~o$$Ck&H0;UZZ3>Z=bQUo&@gBdi1CjaGBsz*%?kXW|@dDWVM zfuV}mF{dasF{M(WxF9vJqzIgU)Ik{qnhP{QY?dM|kOm7-gtO-+R>T)4mK1^VPL&ue zo)q%(OBBlUi?TEG()B=jhzF#YEhV+SBr!9mNEpOp^7q!{!Im0saf9*-w9vT4Qc{p# zTx0~Y(FvrD)3qWw6`ZPW@p^=W1i-mPOdx4)Cr6j~AlJZ9*WeIMc8vI}2brS;N^Ge@Lz_x$OjZ!On!cv61P|~N=gcfm>4EoaJ$!oi^0;O(jrhwy2Vmj znwe4r&JboG*SUfSaMl1N;38uX*AnD44u7z>6LY`@BRLx3at@o^{FKt1R6ACXV`CT? U7(7@~ diff --git a/__pycache__/migrations.cpython-39.pyc b/__pycache__/migrations.cpython-39.pyc index eb1535d8612abca8b4387fe5bc9fed6f79d3b527..c97d1095e3d1bd631c28a3ef6973c4aad5bc7fb7 100644 GIT binary patch delta 209 zcmaFNxs07Jk(ZZ?fq{XcHE&%iFY`n`87UD428I-d6vh^YD25cK6y_F&D8>|)UCMGa4Fic$cXmS#x@Z>E_3LsjeJhLPtr6{pnA;dKzM2AZO3FPFJ7UdKq zR)VD_PhdR8ST#AENrTaMas!jTL`i0Hc50D=r(cMxyK9hwi>sSss85K3;p7?2s*`^* u@ykgtFfbIefgH)g!pQW$h=YNF!B3N^h@F9fp@?JhW)?LzCI$uu4p9KMpE9Tb delta 293 zcmZ3+{+N?5k(ZZ?fq{XcjbUl(T9%1?GFmDO3=Am@DU2-)Q4A?eDa(56I~*hsy|}a!d|m z4CJ`QR+5>Vomw<`IinYw7y|=Ck=W$#i~;OC3=9lhj69Qlm^2u>CYLg0sj`Cgv!rm^ zFr>1la-=Y%aLr*#;ZEUcVQFTJ;!NQUX3*rD{DaAvwTPdAfnl;WbC8@2*g!ZT&cMKM zizBTlKR3Q8zg&LuYGxIA0g$X9h!6r1!XQEfL@=jGh-BI3QsVD zChue^X6MOC%t3O}V58uK7y|>tEsnIJ{M`7W{BqgJmzY)R`9ZP*AVLsC2!RM;5Wx&0 zL_j*YlXDV_i*r*;GV)W3m_WkvAOhk}I16NWkvIbb14wrrow e3fy8ZF3ia+Nu6BIk}nFWPA diff --git a/__pycache__/tasks.cpython-39.pyc b/__pycache__/tasks.cpython-39.pyc index 3dfb88c4d843c4988c37e0df6658b5bd06d8982f..9b32097a24ca580adc044e2e4e628e49b50b186c 100644 GIT binary patch delta 391 zcmcc1b)1Vgk(ZZ?fq{WxUHQ6Hrir|=j3pDb4V@SnQW#QLb2xH2qd38Awj8cp?kH|X zh7|S`jvSs`-YDK&z9>FMh7`^et`>$U{#2F}#uV;3Oes7mye%wI0uvW0aWdWFOD;-H zEJ>Ys>$4ae0|Ub?_Qc}KyyVRMTdaYlsimn!?2{ienlTDZmSQU85Mf|o&}1qS+&r1d zgE5>Nq?|RiqNFIXh>wARp@>%@4l8Z`HAkG0h0_5%@knSR|kq820_$>~b-29Z%oK!nT1_p*= Y0R{#J4kjKZ9!3F19!4G}0d5X%0JyDF82|tP delta 403 zcmX@kb(f1bk(ZZ?fq{YHcj&rQ{)xP@j1?2L4c&4%qBs~CQW#QLb2xLkqPW0pwjAzU zo+uthh7|S`jvU@xz9_z2{wRJ%h7`^et`>$UfmD_h#uV;3Oes7mye%wIf)nQ{i80^e zOD;-HEJ=;e%qz>!OisPUU65Eg@#JSQb_NE9TkMI&m3hgT`L|dDOH)fzi#R4>?=;OBO_Mg9sTAAqOJl zK?EB}4|8!zktS=A5J*58B*2|pnOaejnpd2epBFV*kwsZR7$gTKL_jQo$ssJ790DNg zg^GA5x3YLf6oHN6%gIa1EGgE@NX;ooEh;Vodw~ZkSdv(rU0lQgvVkSJs5AxQK(Mnw eJ}Cm3R|K{ML5NINWR>9(VdP=tVG`ix;06GF&|4?~ diff --git a/lnurl.py b/lnurl.py index e4a6558..0f6fff9 100644 --- a/lnurl.py +++ b/lnurl.py @@ -6,10 +6,11 @@ from http import HTTPStatus from fastapi import Depends, Query, Request from . import myextension_ext from .crud import get_myextension -from lnbits.core.services import create_invoice +from lnbits.core.services import create_invoice, pay_invoice from loguru import logger -from uuid import UUID from typing import Optional +from .crud import update_myextension +import shortuuid ################################################# ########### A very simple LNURLpay ############## @@ -91,17 +92,11 @@ async def api_lnurl_pay( myextension = await get_myextension(myextension_id) if not myextension: return {"status": "ERROR", "reason": "No myextension found"} - k1 = UUID(myextension_id + str(myextension.ticker), version=4) - data_to_update = { - "ticker": myextension.ticker + 1 - } - - await update_myextension(myextension_id=myextension_id, **data_to_update) - + k1 = shortuuid.uuid(name=myextension.id + str(myextension.ticker)) return { "callback": str(request.url_for("myextension.api_lnurl_withdraw_callback", myextension_id=myextension_id)), - "maxSendable": myextension.lnurlwithdrawamount, - "minSendable": myextension.lnurlwithdrawamount, + "maxSendable": myextension.lnurlwithdrawamount * 1000, + "minSendable": myextension.lnurlwithdrawamount * 1000, "k1": k1, "defaultDescription": myextension.name, "metadata":f"[[\"text/plain\", \"{myextension.name}\"]]", @@ -109,7 +104,7 @@ async def api_lnurl_pay( } @myextension_ext.get( - "/api/v1/lnurl/pay/cb/{myextension_id}", + "/api/v1/lnurl/withdraw/cb/{myextension_id}", status_code=HTTPStatus.OK, name="myextension.api_lnurl_withdraw_callback", ) @@ -126,18 +121,13 @@ async def api_lnurl_withdraw_cb( if not myextension: return {"status": "ERROR", "reason": "No myextension found"} - k1Check = UUID(myextension_id + str(myextension.ticker - 1), version=4) + k1Check = shortuuid.uuid(name=myextension.id + str(myextension.ticker - 1)) if k1Check != k1: return {"status": "ERROR", "reason": "Already spent"} - try: - await pay_invoice( - wallet_id=tpos.wallet, - payment_request=pr, - max_sat=myextension.lnurlwithdrawamount * 1000, - extra={"tag": "MyExtension", "myextensionId": myextension_id,} - ) - except Exception as e: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, detail=f"withdraw not working. {str(e)}" - ) + await pay_invoice( + wallet_id=myextension.wallet, + payment_request=pr, + max_sat=int(myextension.lnurlwithdrawamount * 1000), + extra={"tag": "MyExtension", "myextensionId": myextension_id,} + ) return {"status": "OK"} diff --git a/models.py b/models.py index 513fe77..39cec07 100644 --- a/models.py +++ b/models.py @@ -15,6 +15,7 @@ class CreateMyExtensionData(BaseModel): total: Optional[int] lnurlpayamount: Optional[int] lnurlwithdrawamount: Optional[int] + ticker: Optional[int] class MyExtension(BaseModel): id: str @@ -25,6 +26,7 @@ class MyExtension(BaseModel): lnurlwithdrawamount: Optional[int] lnurlpay: Optional[str] lnurlwithdraw: Optional[str] + ticker: Optional[int] @classmethod def from_row(cls, row: Row) -> "MyExtension": diff --git a/tasks.py b/tasks.py index 001108b..8231f48 100644 --- a/tasks.py +++ b/tasks.py @@ -3,7 +3,7 @@ import asyncio from loguru import logger from lnbits.core.models import Payment -from lnbits.core.services import create_invoice, pay_invoice, websocketUpdater +from lnbits.core.services import create_invoice, websocketUpdater from lnbits.helpers import get_current_extension_name from lnbits.tasks import register_invoice_listener