From 66d44f95fb44f9674e7227661a8d8c4ffda39823 Mon Sep 17 00:00:00 2001 From: benarc Date: Thu, 1 Feb 2024 17:15:34 +0000 Subject: [PATCH] Withdraw working, also made them unique --- __init__.py | 2 +- __pycache__/__init__.cpython-39.pyc | Bin 1052 -> 1059 bytes __pycache__/crud.cpython-39.pyc | Bin 3027 -> 3203 bytes __pycache__/lnurl.cpython-39.pyc | Bin 3154 -> 3361 bytes __pycache__/tasks.cpython-39.pyc | Bin 1351 -> 1407 bytes crud.py | 23 ++++++++++++++++---- lnurl.py | 32 ++++++++++++++++++---------- tasks.py | 6 +++++- templates/myextension/index.html | 6 ++++-- 9 files changed, 50 insertions(+), 19 deletions(-) diff --git a/__init__.py b/__init__.py index 4870562..f60ed98 100644 --- a/__init__.py +++ b/__init__.py @@ -15,7 +15,7 @@ myextension_ext: APIRouter = APIRouter( temp_static_files = [ { "path": "/myextension/static", - "name": "temp_static", + "name": "myextension_static", } ] diff --git a/__pycache__/__init__.cpython-39.pyc b/__pycache__/__init__.cpython-39.pyc index 06b20b08db9a0cf26ca6293d018046006a0dfde9..b19632c00bfc330fdeb48a38ab965ec8a1da0b55 100644 GIT binary patch delta 46 zcmbQkv6zE5k(ZZ?fq{WR#%fpU>y5l+j66cQm8lgasd>ej`FWc=7}=Q^Z%v-S+yek4 C*bXWH delta 39 vcmZ3?F^7XUk(ZZ?fq{X6#c@^Yla0J(jI7)xsksH4`x)7p7^5anXYK(2yxt0R diff --git a/__pycache__/crud.cpython-39.pyc b/__pycache__/crud.cpython-39.pyc index d7c6ca969092ef39e093c7a1efde628487c3a71f..462953b287a3810f05b670dabc695e759cc58680 100644 GIT binary patch delta 822 zcmcaC-Ym(N$ji&cz`(#@ym@!(1fGd}GK@baYUkIdFr;wi2uBI0ilp+S3a0X=aLr*! z;ZEUcVTlq=kw_IuWl9y4WJqO7<&|Ve;hn>r!k5C|!Wt!(BALpZDw4{WDk8~{#spRY zQpX5ZCoqROMKDFEg*8e%MG9^PFIc~DibxAIGP!2nB)0sn1dNK+5M^vCfBfOP2R-fA+wUPNQi-fVI@tEv}Nx2j;KeqpDtdke9>Tz+xT)%4aE!GJ3 zWi>1=46$C5E!otxO1QIlYFM*4N*HTcp?=`%WlZ7jWzOPkW~^b2=PQh=VF_l?74I*?vX0R3MOBv?1iOl<5y+1qgBTdO7}=OWz7+b; z#SHQ%2UeeQuohWQ=I3~<3etItH7zqWC#6UNWIC9T1hI@67#KW343o*?oD+r2KoP*2 zS(2JtT*M6$R-C+xQ=idt@+(elX%CPC1i*nT0S;cN|6I%hj694*4wDVI)<_3|!NlP$RI<-r~Wd80@QWPvD%um%whAi{C-L~b=XkcOuYZ;}P7`Z2(WL9VNoBV-UiHntif#EO% z14D7nWEmDK#*E3~EGnWY%)Lxm9Laxfn$lSr}Ou`50LkB^V_bCv&msak0TnpEB8rErNYQ4T}pytjXks zY-%DY9KB3goXw0itnu81Q8g^V44Pb%KeF{Os!gtAmt!=VJeS=zN0a9kS7vc$UU5lc zUUKR!=Hil~TP#`mnR&OEb5iq)I2afhZgHfgmLz8+=HwJ9FfcF_DS`+k5TOhrR6v9( z0|SF5Tah}5%@5MUSa^%2D8IZoilZbow;(9Lytqhhay*BMvKGig5>OAZF@d}!^q-3v zAfs6`OHy--i?~6;a+8y} z^cjsOPv+8Qw4A)3OOnxQ@=dNa(#{}Tn83CaS%cih=%)!ml9Ly3J1{Cte#mVvr4KSf o3Pgy42vZONw#|C7J&&3U$dw{YJd7YH048~uL_}n`HTWgC07U_a2><{9 diff --git a/__pycache__/lnurl.cpython-39.pyc b/__pycache__/lnurl.cpython-39.pyc index 6a0724b8f00112295bf08df133710e2e514391c5..bc0c96b6b3092fbe78c4e4285ada77f84e9e141a 100644 GIT binary patch delta 1712 zcmca4u~3RHk(ZZ?fq{XcdH?RzK;emeGK^{ywF~N*Q@C=3a)qOW85vR-Qn+(OqC`^J zvqV#PQW>+vQg~DNdYMyMQ^iyG=P;!RqzJaKG&4p?fK>>ARS1Jsu%w7IGo~?uRHjO% zh|Xb75lazoVQprNk^-xh0IQV*t7T0UPZdv*n!}tTog!lcHc%R@NEWO}4x}hW32c-= zs<pTm-(kfI1SR3?Qxm_bu{vIpZ5c1^}x+`g5ro1ZY+GcpQIR$*>e6kuRr z&}1$WWME(@5@KLrxW%1YnOaejnpd2epSO~sNNw^N<`71)$%-t}j2e?|S+w~i7#JAz z;94e^v24~B2I&?75uzYM3PebQ2pJH;2O=~f_9#t`VO3|;oZP}{&Zsnb534t$z+?_K zMFF_|MIePms*^3*loi!L8o`7*$YlbF1)1?Vd8I`;@db&M@ySVAlWW<`7)>W{VN(~- zuP(_<&Q2}LNG#5%)vuD9{Eta&@&|T~dbmqLMsOh%B{PF!7>ZdL7#P?Y7#I#SFfbIC zFfcHbFw`(MGkP+lFnBQ3GS@H{%cL--Fr_fhVG3p_Va#HxVa{SMVX0xxVr^y=XGme` zWvpeXVX0xtW-f9|VN79#s7zri$ziEs$YM)juVGB#=w)hVtO03auVK#ONZ}M=fYB*j zbJ&6zG`anXP=j(MV-YBVs)T*~LW6wD6%uobQWH}u6-tX!Q*QB>XO?876eX4ir52W^ z7MJ`|hk9BlP!be!plHx!D^dcnS~yf#Z!1{7(r#r9Oe}MUKW^{pz8kOIOG?R7lQ9P0m&*D9SI(Oi4{CVgrRF z6Sy2GatB2fC=QB1`8Pz98Iq8+7#J9$cu`_}atxPry%;EMF!_6H@)mJ}bQ*&QP&^d5 zfLN{|!VN@#5)s63UJ%y=M3{mI4-f$=b~V|caS0MI01@D114=+q?AeCSAU79*(+`*c zC!!!x%v2PgoRkMjNE)C_&cnmV!^p)5PEJhV$vNaX-(t(nPf5)w1_uJfD;6LZd4mYBS3ss0fjwXi5(A}5upvk;L^zYfCO1E&G$+*# zRNxe+FfcIiFp4mOoF)J!K`agq7KoGnvan6&1Q9`NgS;8sYsf<}7DLg5> zz09essiG--bC^>2Qv_OAni-?Sz$yg6Dulo)SW<+W8Pga+DpSQ%MCLH3h^C0Our@PB zNr2UggVjoa)xu1ZL@`Y&l~FHCBt;seBt;%WcL7#MDG=T@dxl%(brXXfXvWGGUd z{E|6@QFO8$i!`J91C{CPGJS{Q`p2AG8t=GO4!mEQrK%4GZ|}G zmN51)dNQOicrY+Bl(5t=WU;4k)G(%S_A)gy)-Yvpq;QEaz-i_hrYz1BZV)+}A%$ly za|&+?-yHT}22FmyB5+`-z(Z>#V-YA0Zn2eQCTFJ>6|sRl3yO(f>XX>z>f@6Wb8?ar zle3E?KoV#{%U_;Zl95uBSRRyGSejZ~qRCz)3sNQrBIH4V#guJ$ODH8ZEwMDG#3i*j zxhS)sBr`v+NCBim5fm9*MWCR$#aWz@UsO_BnwfHo1xzw!rW7fGoK|EDQp*b>lqYZC zkVpeNSd$fzXo^%ok`4?E3{iY3i6x2gCHe8C1u2OosYT#u0~4UQD^h1*UtaF%x8A=$lm}*$Samr-#bhQUI3}z3 zvJEGfamm<0q7)vZkSMfaU|^`?b<8PBO-!j&C@x6ND=7lUo+ijkOhuruFVbRQV3_=e zOS)bZ99RC{nvmEiasmaYGl*~j5lSEe91WlnsK^AwH3bo_Aj8<8;R6yd01=>=0LMub zd$yr-Mrv|4T0GnmMdTq+60!uPq4?ya0(jJL^Dy!-fun~>hLMAj3mh#>j694Se|Xr6 zJV4em`T1!|O@6^$5&?0p1;}c55CL{BD5{IVjaGw0DZ$IkpKVy diff --git a/__pycache__/tasks.cpython-39.pyc b/__pycache__/tasks.cpython-39.pyc index 9b32097a24ca580adc044e2e4e628e49b50b186c..821065935d5db36cd90b9486eb3563e0a3820a66 100644 GIT binary patch delta 262 zcmX@k^`DD3k(ZZ?fq{V`r+jy6!$#g-CO$R>1_o9J28P273=G9 mfeeV6tjJ<5t_1QTBNw9pBMTD`BOfylBOenF6U*dWmRkV(tvFi% delta 206 zcmey*b)1Vgk(ZZ?fq{WxUHQ6Hrj5M4Onj^i3=ANAn1O+zxNq_bCTp1#)*7ZP)*6N^ zHgSeb##-hQ_B4hRwi?Dv#v10yvdpsb>~mOZSxUHT7)y9+SehA|nLHU%7(5sl8B!R6 z88kU2M>6|Q-p(B6D9OOUP$UB)K$aFsgIKa4LJmZLY`w)?TvDXTS|kV(kYZq9xW%1Y onOaejnpd2epLc6=FpISy$N&aLE=B=H7A77>J{F$IOIdCK0DXokWdHyG diff --git a/crud.py b/crud.py index f5fde08..ddc85c6 100644 --- a/crud.py +++ b/crud.py @@ -7,6 +7,7 @@ from .models import CreateMyExtensionData, MyExtension from loguru import logger from fastapi import Request from lnurl import encode as lnurl_encode +import shortuuid async def create_myextension(wallet_id: str, data: CreateMyExtensionData, req: Request) -> MyExtension: myextension_id = urlsafe_short_hash() @@ -35,8 +36,15 @@ async def get_myextension(myextension_id: str, req: Optional[Request] = None) -> return None rowAmended = MyExtension(**row) if req: - rowAmended.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) - rowAmended.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) + rowAmended.lnurlpay = lnurl_encode( + req.url_for("myextension.api_lnurl_pay", + myextension_id=row.id)._url + ) + rowAmended.lnurlwithdraw = lnurl_encode( + req.url_for("myextension.api_lnurl_withdraw", + myextension_id=row.id, + tickerhash=shortuuid.uuid(name=rowAmended.id + str(rowAmended.ticker)))._url + ) return rowAmended async def get_myextensions(wallet_ids: Union[str, List[str]], req: Optional[Request] = None) -> List[MyExtension]: @@ -50,8 +58,15 @@ async def get_myextensions(wallet_ids: Union[str, List[str]], req: Optional[Requ tempRows = [MyExtension(**row) for row in rows] if req: for row in tempRows: - row.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) - row.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) + row.lnurlpay = lnurl_encode( + req.url_for("myextension.api_lnurl_pay", + myextension_id=row.id)._url + ) + row.lnurlwithdraw = lnurl_encode( + req.url_for("myextension.api_lnurl_withdraw", + myextension_id=row.id, + tickerhash=shortuuid.uuid(name=row.id + str(row.ticker)))._url + ) return tempRows async def update_myextension(myextension_id: str, req: Optional[Request] = None, **kwargs) -> MyExtension: diff --git a/lnurl.py b/lnurl.py index 0f6fff9..6e6ddeb 100644 --- a/lnurl.py +++ b/lnurl.py @@ -10,6 +10,7 @@ from lnbits.core.services import create_invoice, pay_invoice from loguru import logger from typing import Optional from .crud import update_myextension +from .models import MyExtension import shortuuid ################################################# @@ -81,26 +82,29 @@ async def api_lnurl_pay_cb( @myextension_ext.get( - "/api/v1/lnurl/withdraw/{myextension_id}", + "/api/v1/lnurl/withdraw/{myextension_id}/{tickerhash}/", status_code=HTTPStatus.OK, name="myextension.api_lnurl_withdraw", ) -async def api_lnurl_pay( +async def api_lnurl_withdraw( request: Request, myextension_id: str, + tickerhash: str, ): myextension = await get_myextension(myextension_id) if not myextension: return {"status": "ERROR", "reason": "No myextension found"} k1 = shortuuid.uuid(name=myextension.id + str(myextension.ticker)) + if k1 != tickerhash: + return {"status": "ERROR", "reason": "LNURLw already used"} + return { + "tag": "withdrawRequest", "callback": str(request.url_for("myextension.api_lnurl_withdraw_callback", myextension_id=myextension_id)), - "maxSendable": myextension.lnurlwithdrawamount * 1000, - "minSendable": myextension.lnurlwithdrawamount * 1000, "k1": k1, "defaultDescription": myextension.name, - "metadata":f"[[\"text/plain\", \"{myextension.name}\"]]", - "tag": "withdrawRequest" + "maxWithdrawable": myextension.lnurlwithdrawamount * 1000, + "minWithdrawable": myextension.lnurlwithdrawamount * 1000 } @myextension_ext.get( @@ -114,20 +118,26 @@ async def api_lnurl_withdraw_cb( pr: Optional[str] = None, k1: Optional[str] = None, ): + assert k1, "k1 is required" assert pr, "pr is required" - + logger.debug("cunt") myextension = await get_myextension(myextension_id) if not myextension: return {"status": "ERROR", "reason": "No myextension found"} - k1Check = shortuuid.uuid(name=myextension.id + str(myextension.ticker - 1)) + k1Check = shortuuid.uuid(name=myextension.id + str(myextension.ticker)) if k1Check != k1: - return {"status": "ERROR", "reason": "Already spent"} + return {"status": "ERROR", "reason": "Wrong k1 check provided"} + + await update_myextension(myextension_id=myextension_id, ticker=myextension.ticker + 1) + logger.debug(myextension.wallet) + logger.debug(pr) + logger.debug(int(myextension.lnurlwithdrawamount * 1000)) await pay_invoice( wallet_id=myextension.wallet, payment_request=pr, max_sat=int(myextension.lnurlwithdrawamount * 1000), - extra={"tag": "MyExtension", "myextensionId": myextension_id,} + extra={"tag": "MyExtension", "myextensionId": myextension_id, "lnurlwithdraw": True} ) - return {"status": "OK"} + return {"status": "OK"} \ No newline at end of file diff --git a/tasks.py b/tasks.py index 8231f48..1f46c8a 100644 --- a/tasks.py +++ b/tasks.py @@ -38,8 +38,12 @@ async def on_invoice_paid(payment: Payment) -> None: myextension = await get_myextension(myextension_id) # update something in the db + if payment.extra.get("lnurlwithdraw"): + total = myextension.total - payment.amount + else: + total = myextension.total + payment.amount data_to_update = { - "total": myextension.total + payment.amount + "total": total } await update_myextension(myextension_id=myextension_id, **data_to_update) diff --git a/templates/myextension/index.html b/templates/myextension/index.html index 24e2ca1..4e8c494 100644 --- a/templates/myextension/index.html +++ b/templates/myextension/index.html @@ -43,7 +43,8 @@ :key="col.name" :props="props" > - ${ col.value } +
${ col.value / 1000} sats
+
${ col.value }