From 7c0e227fd1dcbdcdf54a23338bf68dd42a7540fc Mon Sep 17 00:00:00 2001 From: benarc Date: Mon, 22 Jan 2024 13:34:48 +0000 Subject: [PATCH] Working on withdraw --- __pycache__/lnurl.cpython-39.pyc | Bin 2336 -> 3189 bytes __pycache__/tasks.cpython-39.pyc | Bin 1373 -> 1373 bytes lnurl.py | 71 ++++++++++++++++++++----------- migrations.py | 33 +++----------- static/confetti.min.js | 8 ---- tasks.py | 3 +- templates/myextension/index.html | 1 + 7 files changed, 55 insertions(+), 61 deletions(-) delete mode 100644 static/confetti.min.js diff --git a/__pycache__/lnurl.cpython-39.pyc b/__pycache__/lnurl.cpython-39.pyc index 1fe4cd5cec757f5048d20f3b021037ca1ff81302..4e309d63dfede2203cbb7634c34188c5df6dbb88 100644 GIT binary patch literal 3189 zcmYe~<>g{vU|>kkTbFuVh=JiTh=YvT85kHG7#J9e85kKDQW#Pga~N_NqZk=MY^EHh zT;?d|T$U)7T-GR7MursT6qX#eT=pn-Fq<`pBbPIZ6RegkhbxymiW|&k&*91Cjp7Bf zIdb@N`J?z58B*D^1X4It8M6daxKg-#nNwL)g;IFtFs1OO@U^fsGe!x6Rq%sV2!K_v zqzE=MrZIw4ri!Ep&0$UvP7!HgZDx!T1*;VWs}%#Qg_$Of#WV?!iWFI}Ibx|ok_@R} zGDT_*ONw-g4A?~R6vcNRGxPJ}Q!7e9Lg}d`@kqj&jJNobi&7Iy zQsXo8%JMUlQ#BcHvE}5ar>7QaGTved4fS-XQqoT>$kZ=0)X&K)Ey~d^NUYSaMlvHl zGo`jl5=lTWu^=-ZtTw(Nu~L)i7I!h&$??hgDXF(u@)C1XHJNU)7eQQmiw{X_d}c~A z6Uehr%*?>Rz{bG9a2S*p0vH$=N*HPwn;AVBQW!iKYME-7ie*w5Q(*ez#a%gM$2n zeu?w#b3Rf>HB>BZK)w0yG*082Cq;RM3K=jRJO5vTul)^WMIha9{->*mj6zqZ^0u&lW z;vkj;h>!%u9Jg(dmyuYUk(v^pl3JWxlvz-cnV(mr2{MR1H?_DpF+H`4H6SrFMM0CP2xNYd zF4(SHOa(=^*oyK?OHzw(@fMdRC#Mz{J0^p4YjT0pRuL#zZ?UGNCY7caae@qFgSg-p zb0#!x-C|441Ltd=LQo+TUyxXom|J{{IX$&RlMRvV!0s(l0vW+mkXV_UnpYAJa`Y{J z7!O(;fD6gE^z8%0+Ea?i~>wdj7*GNe_4JD@Gvnl zF)=Z6{bTuCWC==f>ZmEMJhLPtr6{o+Bh6LGA%#6s_J(OdDV|sv7#Ki#5S;S5&{G~} z@x)ld1S*W08O0e=SU`nTEprMRNF;?_oFS93mZgLxjUk1jhB1?|hGhw3AGDxjWGG>( zVaQ@l;jCdy;er-zAbo5#%r#6|>?zzJayCN>&s=6u#WjZ=Tk3ns!oa|=lJORMS!xle zO1Q;Vl9`;HT2uteKj5EXK`9I5AO=XO#VE$a^`C`B zf?0r(g^`63l*)J*nSK`8F)%RrX|f<$qX%*?$eLtO7=zL#2!k3ipbP{~9p@MrK;;jQ z7efkTGh-8D4O6j%7efjYh>cRIvDB~>n}C`$DXh>+4U}qFKvkIp132Zdr*QN#fl8hl z=4|GogcRl!PKeqnjS`j;)-1LfrW%$k_7pA=h7|4^Mo4p}mjzO4F*1ZRIQN6<>Zv#cV05C5f3iMWD*)7L&iXCJ(k0c8j|pu@ct!xy4dakY8M61hUWxWCo{eMRF>* zJiWyWYJ0)CMW9y7Ep8`Am-rypz);uV5KVS$2?AW?MX_faI%lLNXWwE>MN4?ML=oj1 z%scVPNqL~82=YDyHxDBZ6QmNAV&q`tVgwa&pv1_*$ni&jjgOIuQQ*G}bCD0INN4i% z)0DWyl2KAp0C6CDT4HfYVnJpRsJ<)$CC(yHnRSby2$VQ)u_PCjrhr4`mI$Q2*GtYX zO4Tb)Eh@`QPA!I(`8oONrA4KX%7CS`G&7|LoJ-9>!Q=`e!1)zau@@PGxS#^}7KcAL z+!AxZPDAoGJk#Ccu*uC&Da}c>1G%XL+S9UCLt9{@NFD0~0_ delta 1371 zcmew=u|P;Ck(ZZ?fq{Xc?9lR5W&s9<#~=-m3rjO&6hBx6FIWX1SOrT8e=}nmBS>YcK#IT|<`lsc zp%&I=#wbCsT4AtS5wKdAX`)z66HDRjRc21bG)^35T#7_6gQnzU1IFyhYZ*HkJtmto z8B5hLWih9))i7nTh%=tz;-toZQ14A}a(62oS-*$;ZgT$i*bU$im3N$iv9=yGVKR zUuNxkVFm^UJxyeT*b;N|OY=&SnUO-3m4Sf)6zqpV=4CK2FqAOVFg7!KGNdqgFw`>F zFc-_DFs3l2FwbEMW+-8-Va{SIVXk3HVUcEN2Ju)@SZkQU9%5U-x{v|nu^Pr2hAg)F z1?(vt3mH>5=P;*m^|C?@WT|0EXGq}&8MczguZR!iNq!I^z`($e`GT2&p-2?O6$23p zAVP(KfkBhGNCp%VEIFBZ*|%6zD@uwIHCbgVK@POfM35Wi@$7fFD8BMBm;Cck5ssh0*ZL9W+ig#?!@NI;H(fgws5>`RytkQ7w} zO0z}sAT{710TZBbDN<%&VDJD11t>yMlPV}cco>;}7MU?HFrcQ%dRiq)LTR!{732q9 z7Z7O-BEUWY6JYOv;wuj19Z=Zdi&;NSp~B|<7XXMA5>NmD diff --git a/__pycache__/tasks.cpython-39.pyc b/__pycache__/tasks.cpython-39.pyc index 1e4e1dcbd333f50492d5bd8562fb76545425872f..3dfb88c4d843c4988c37e0df6658b5bd06d8982f 100644 GIT binary patch delta 87 zcmcc1b(f1bk(ZZ?fq{YHcj&rQ{*AnK%#61t_b{g#NHH)l6v=`JZV({@BIH1XJcwXp dU|_h#TwGG5$yy`?5|Ey($P&%SGP#!J0RTHuc_b{g#NHQ=m6v==HZV(|2B4j~?9Ef0J dU|_h#TwGG5$yy`?5|Em#$P&%SI=PnR0RS(u5%>TA diff --git a/lnurl.py b/lnurl.py index 058e2d6..2588f8d 100644 --- a/lnurl.py +++ b/lnurl.py @@ -7,7 +7,8 @@ from fastapi import Depends, Query, Request from . import myextension_ext from .crud import get_myextension from lnbits.core.services import create_invoice - +from loguru import logger +from uuid import UUID ################################################# ########### A very simple LNURLpay ############## @@ -29,8 +30,8 @@ async def api_lnurl_pay( return {"status": "ERROR", "reason": "No myextension found"} return { "callback": str(request.url_for("myextension.api_lnurl_pay_callback", myextension_id=myextension_id)), - "maxSendable": myextension.lnurlpayamount, - "minSendable": myextension.lnurlpayamount, + "maxSendable": myextension.lnurlpayamount * 1000, + "minSendable": myextension.lnurlpayamount * 1000, "metadata":"[[\"text/plain\", \"" + myextension.name + "\"]]", "tag": "payRequest" } @@ -46,21 +47,29 @@ async def api_lnurl_pay_cb( amount: int = Query(...), ): myextension = await get_myextension(myextension_id) + logger.debug(myextension) if not myextension: return {"status": "ERROR", "reason": "No myextension found"} - payment_request = await create_invoice( + payment_hash, payment_request = await create_invoice( wallet_id=myextension.wallet, amount=int(amount / 1000), memo=myextension.name, - unhashed_description="[[\"text/plain\", \"" + myextension.name + "\"]]".encode(), + unhashed_description=f"[[\"text/plain\", \"{myextension.name}\"]]".encode(), extra= { - "tag": "myextension", - "link": myextension_id, + "tag": "MyExtension", + "myextensionId": myextension_id, "extra": request.query_params.get("amount"), }, ) - return { "pr": payment_request, "routes": []} + return { + "pr": payment_request, + "routes": [], + "successAction": { + "tag": "message", + "message": f"Paid {myextension.name}" + } + } ################################################# ######## A very simple LNURLwithdraw ############ @@ -81,13 +90,20 @@ 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) + return { "callback": str(request.url_for("myextension.api_lnurl_withdraw_callback", myextension_id=myextension_id)), "maxSendable": myextension.lnurlwithdrawamount, "minSendable": myextension.lnurlwithdrawamount, - "k1": "", + "k1": k1, "defaultDescription": myextension.name, - "metadata":"[[\"text/plain\", \"" + myextension.name + "\"]]", + "metadata":f"[[\"text/plain\", \"{myextension.name}\"]]", "tag": "withdrawRequest" } @@ -96,24 +112,31 @@ async def api_lnurl_pay( status_code=HTTPStatus.OK, name="myextension.api_lnurl_withdraw_callback", ) -async def api_lnurl_pay_cb( +async def api_lnurl_withdraw_cb( request: Request, myextension_id: str, - amount: int = Query(...), + pr: Optional[str] = None, + k1: Optional[str] = None, ): + assert k1, "k1 is required" + assert pr, "pr is required" + myextension = await get_myextension(myextension_id) if not myextension: return {"status": "ERROR", "reason": "No myextension found"} - payment_request = await create_invoice( - wallet_id=myextension.wallet, - amount=int(amount / 1000), - memo=myextension.name, - unhashed_description="[[\"text/plain\", \"" + myextension.name + "\"]]".encode(), - extra= { - "tag": "myextension", - "link": myextension_id, - "extra": request.query_params.get("amount"), - }, - ) - return { "pr": payment_request, "routes": []} \ No newline at end of file + k1Check = UUID(myextension_id + str(myextension.ticker - 1), version=4) + 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)}" + ) + return {"status": "OK"} diff --git a/migrations.py b/migrations.py index de2300d..40725e3 100644 --- a/migrations.py +++ b/migrations.py @@ -11,12 +11,15 @@ async def m001_initial(db): wallet TEXT NOT NULL, name TEXT NOT NULL, total INTEGER DEFAULT 0, - lnurlpayamount INTEGER DEFAULT 0 + lnurlpayamount INTEGER DEFAULT 0, + lnurlwithdrawamount INTEGER DEFAULT 0, + lnurlwithdraw TEXT, + lnurlpay TEXT ); """ ) -# Here we are adding an extra field to the database +# Here we add another field to the database async def m002_addtip_wallet(db): """ @@ -24,30 +27,6 @@ async def m002_addtip_wallet(db): """ await db.execute( """ - ALTER TABLE myextension.maintable ADD lnurlwithdrawamount INTEGER DEFAULT 0; - """ - ) - -# Here we add another field to the database, always add never edit! - -async def m004_addtip_wallet(db): - """ - Add total to templates table - """ - await db.execute( - """ - ALTER TABLE myextension.maintable ADD lnurlwithdraw TEXT; - """ - ) - -# Here we add another field to the database - -async def m005_addtip_wallet(db): - """ - Add total to templates table - """ - await db.execute( - """ - ALTER TABLE myextension.maintable ADD lnurlpay TEXT; + ALTER TABLE myextension.maintable ADD ticker INTEGER DEFAULT 1; """ ) \ No newline at end of file diff --git a/static/confetti.min.js b/static/confetti.min.js deleted file mode 100644 index 0a09dd0..0000000 --- a/static/confetti.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Minified by jsDelivr using Terser v5.3.5. - * Original file: /npm/canvas-confetti@1.4.0/dist/confetti.browser.js - * - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files - */ -!function(t,e){!function t(e,n,a,i){var o=!!(e.Worker&&e.Blob&&e.Promise&&e.OffscreenCanvas&&e.OffscreenCanvasRenderingContext2D&&e.HTMLCanvasElement&&e.HTMLCanvasElement.prototype.transferControlToOffscreen&&e.URL&&e.URL.createObjectURL);function r(){}function l(t){var a=n.exports.Promise,i=void 0!==a?a:e.Promise;return"function"==typeof i?new i(t):(t(r,r),null)}var c,s,u,d,f,h,g,m,b=(u=Math.floor(1e3/60),d={},f=0,"function"==typeof requestAnimationFrame&&"function"==typeof cancelAnimationFrame?(c=function(t){var e=Math.random();return d[e]=requestAnimationFrame((function n(a){f===a||f+u-1 None: myextension = await get_myextension(myextension_id) # update something in the db - data_to_update = { "total": myextension.total + payment.amount } - + await update_myextension(myextension_id=myextension_id, **data_to_update) # here we could send some data to a websocket on wss:///api/v1/ws/ diff --git a/templates/myextension/index.html b/templates/myextension/index.html index d6c2738..24e2ca1 100644 --- a/templates/myextension/index.html +++ b/templates/myextension/index.html @@ -419,6 +419,7 @@ openUrlDialog(id) { this.urlDialog.data = _.findWhere(this.temps, {id}) this.qrValue = this.urlDialog.data.lnurlpay + console.log(this.urlDialog.data.id) this.connectWebocket(this.urlDialog.data.id) this.urlDialog.show = true },