From 43a974af838944ae2e77b576ac6b848dfabdd5fa Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Tue, 29 Nov 2022 23:18:24 +0100 Subject: [PATCH 01/27] initializing the deezy extension --- lnbits/extensions/deezy/README.md | 11 ++++ lnbits/extensions/deezy/__init__.py | 16 +++++ lnbits/extensions/deezy/config.json | 6 ++ lnbits/extensions/deezy/migrations.py | 10 ++++ lnbits/extensions/deezy/models.py | 5 ++ .../deezy/templates/example/index.html | 59 +++++++++++++++++++ lnbits/extensions/deezy/views.py | 21 +++++++ lnbits/extensions/deezy/views_api.py | 35 +++++++++++ 8 files changed, 163 insertions(+) create mode 100644 lnbits/extensions/deezy/README.md create mode 100644 lnbits/extensions/deezy/__init__.py create mode 100644 lnbits/extensions/deezy/config.json create mode 100644 lnbits/extensions/deezy/migrations.py create mode 100644 lnbits/extensions/deezy/models.py create mode 100644 lnbits/extensions/deezy/templates/example/index.html create mode 100644 lnbits/extensions/deezy/views.py create mode 100644 lnbits/extensions/deezy/views_api.py diff --git a/lnbits/extensions/deezy/README.md b/lnbits/extensions/deezy/README.md new file mode 100644 index 00000000..27729459 --- /dev/null +++ b/lnbits/extensions/deezy/README.md @@ -0,0 +1,11 @@ +

Example Extension

+

*tagline*

+This is an example extension to help you organise and build you own. + +Try to include an image + + + +

If your extension has API endpoints, include useful ones here

+ +curl -H "Content-type: application/json" -X POST https://YOUR-LNBITS/YOUR-EXTENSION/api/v1/EXAMPLE -d '{"amount":"100","memo":"example"}' -H "X-Api-Key: YOUR_WALLET-ADMIN/INVOICE-KEY" diff --git a/lnbits/extensions/deezy/__init__.py b/lnbits/extensions/deezy/__init__.py new file mode 100644 index 00000000..663920cd --- /dev/null +++ b/lnbits/extensions/deezy/__init__.py @@ -0,0 +1,16 @@ +from fastapi import APIRouter + +from lnbits.db import Database +from lnbits.helpers import template_renderer + +db = Database("ext_deezy") + +deezy_ext: APIRouter = APIRouter(prefix="/deezy", tags=["deezy"]) + + +def deezy_renderer(): + return template_renderer(["lnbits/extensions/deezy/templates"]) + + +from .views import * # noqa +from .views_api import * # noqa diff --git a/lnbits/extensions/deezy/config.json b/lnbits/extensions/deezy/config.json new file mode 100644 index 00000000..200d1220 --- /dev/null +++ b/lnbits/extensions/deezy/config.json @@ -0,0 +1,6 @@ +{ + "name": "Deezy", + "short_description": "Join us, make an extension", + "icon": "info", + "contributors": ["Uthpala"] +} diff --git a/lnbits/extensions/deezy/migrations.py b/lnbits/extensions/deezy/migrations.py new file mode 100644 index 00000000..99d7c362 --- /dev/null +++ b/lnbits/extensions/deezy/migrations.py @@ -0,0 +1,10 @@ +# async def m001_initial(db): +# await db.execute( +# f""" +# CREATE TABLE example.example ( +# id TEXT PRIMARY KEY, +# wallet TEXT NOT NULL, +# time TIMESTAMP NOT NULL DEFAULT {db.timestamp_now} +# ); +# """ +# ) diff --git a/lnbits/extensions/deezy/models.py b/lnbits/extensions/deezy/models.py new file mode 100644 index 00000000..bfeb7517 --- /dev/null +++ b/lnbits/extensions/deezy/models.py @@ -0,0 +1,5 @@ +# from pydantic import BaseModel + +# class Example(BaseModel): +# id: str +# wallet: str diff --git a/lnbits/extensions/deezy/templates/example/index.html b/lnbits/extensions/deezy/templates/example/index.html new file mode 100644 index 00000000..d732ef37 --- /dev/null +++ b/lnbits/extensions/deezy/templates/example/index.html @@ -0,0 +1,59 @@ +{% extends "base.html" %} {% from "macros.jinja" import window_vars with context +%} {% block page %} + + +
+ Frameworks used by {{SITE_TITLE}} +
+ + + {% raw %} + + + {{ tool.name }} + {{ tool.language }} + + {% endraw %} + + + +

+ A magical "g" is always available, with info about the user, wallets and + extensions: +

+ {% raw %}{{ g }}{% endraw %} +
+
+{% endblock %} {% block scripts %} {{ window_vars(user) }} + +{% endblock %} diff --git a/lnbits/extensions/deezy/views.py b/lnbits/extensions/deezy/views.py new file mode 100644 index 00000000..b8efeae8 --- /dev/null +++ b/lnbits/extensions/deezy/views.py @@ -0,0 +1,21 @@ +from fastapi import FastAPI, Request +from fastapi.params import Depends +from fastapi.templating import Jinja2Templates +from starlette.responses import HTMLResponse + +from lnbits.core.models import User +from lnbits.decorators import check_user_exists + +from . import deezy_ext, deezy_renderer + +templates = Jinja2Templates(directory="templates") + + +@deezy_ext.get("/", response_class=HTMLResponse) +async def index( + request: Request, + user: User = Depends(check_user_exists), # type: ignore +): + return deezy_renderer().TemplateResponse( + "example/index.html", {"request": request, "user": user.dict()} + ) diff --git a/lnbits/extensions/deezy/views_api.py b/lnbits/extensions/deezy/views_api.py new file mode 100644 index 00000000..e8d270a9 --- /dev/null +++ b/lnbits/extensions/deezy/views_api.py @@ -0,0 +1,35 @@ +# views_api.py is for you API endpoints that could be hit by another service + +# add your dependencies here + +# import httpx +# (use httpx just like requests, except instead of response.ok there's only the +# response.is_error that is its inverse) + +from . import deezy_ext + +# add your endpoints here + + +@deezy_ext.get("/api/v1/tools") +async def api_example(): + """Try to add descriptions for others.""" + tools = [ + { + "name": "fastAPI", + "url": "https://fastapi.tiangolo.com/", + "language": "Python", + }, + { + "name": "Vue.js", + "url": "https://vuejs.org/", + "language": "JavaScript", + }, + { + "name": "Quasar Framework", + "url": "https://quasar.dev/", + "language": "JavaScript", + }, + ] + + return tools From 4645b8338b1719abde50fdf6f6f8ff15b971343d Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Sun, 4 Dec 2022 23:29:57 +0100 Subject: [PATCH 02/27] added the reverse swap as well --- lnbits/extensions/deezy/config.json | 2 +- .../deezy/templates/deezy/index.html | 255 ++++++++++++++++++ .../deezy/templates/example/index.html | 59 ---- lnbits/extensions/deezy/views.py | 2 +- 4 files changed, 257 insertions(+), 61 deletions(-) create mode 100644 lnbits/extensions/deezy/templates/deezy/index.html delete mode 100644 lnbits/extensions/deezy/templates/example/index.html diff --git a/lnbits/extensions/deezy/config.json b/lnbits/extensions/deezy/config.json index 200d1220..27c4df2d 100644 --- a/lnbits/extensions/deezy/config.json +++ b/lnbits/extensions/deezy/config.json @@ -1,6 +1,6 @@ { "name": "Deezy", "short_description": "Join us, make an extension", - "icon": "info", + "icon": "swap_horiz", "contributors": ["Uthpala"] } diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html new file mode 100644 index 00000000..007144f0 --- /dev/null +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -0,0 +1,255 @@ +{% extends "base.html" %} {% from "macros.jinja" import window_vars with context +%} {% block page %} + + +
+ Deezy +
+ + + + + + Send onchain funds offchain (BTC -> LN) + + + + + Send offchain funds to onchain address (LN -> BTC) + + + + +
+
Lightning Btc -> Btc
+ + + + + + Cancel + + + + +
+
Pay invoice to complete swap
+ + + +
+
+ + + + + + + +
+
+
+
+
Btc -> Lightning Btc
+ + + + + + Cancel + + + + +
+
Response - Important
+ + + +
+
+ {% raw %} + + Address - {{ swapBtcToLn.response.address }} + + + Commitment - {{ swapBtcToLn.response.commitment }} + + + Secret Access Key - {{ swapBtcToLn.response.secret_access_key }} + + + Signature - {{ swapBtcToLn.response.signature }} + + + Webhook Url - {{ swapBtcToLn.response.webhook_url }} + + {% endraw %} +
+
+
+
+{% endblock %} {% block scripts %} {{ window_vars(user) }} + +{% endblock %} diff --git a/lnbits/extensions/deezy/templates/example/index.html b/lnbits/extensions/deezy/templates/example/index.html deleted file mode 100644 index d732ef37..00000000 --- a/lnbits/extensions/deezy/templates/example/index.html +++ /dev/null @@ -1,59 +0,0 @@ -{% extends "base.html" %} {% from "macros.jinja" import window_vars with context -%} {% block page %} - - -
- Frameworks used by {{SITE_TITLE}} -
- - - {% raw %} - - - {{ tool.name }} - {{ tool.language }} - - {% endraw %} - - - -

- A magical "g" is always available, with info about the user, wallets and - extensions: -

- {% raw %}{{ g }}{% endraw %} -
-
-{% endblock %} {% block scripts %} {{ window_vars(user) }} - -{% endblock %} diff --git a/lnbits/extensions/deezy/views.py b/lnbits/extensions/deezy/views.py index b8efeae8..131c03b2 100644 --- a/lnbits/extensions/deezy/views.py +++ b/lnbits/extensions/deezy/views.py @@ -17,5 +17,5 @@ async def index( user: User = Depends(check_user_exists), # type: ignore ): return deezy_renderer().TemplateResponse( - "example/index.html", {"request": request, "user": user.dict()} + "deezy/index.html", {"request": request, "user": user.dict()} ) From 6ec5b9abf6771071daab96f446619f74c3f3a650 Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Mon, 5 Dec 2022 21:07:38 +0100 Subject: [PATCH 03/27] convert string to ints --- lnbits/extensions/deezy/templates/deezy/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html index 007144f0..0d68f0a9 100644 --- a/lnbits/extensions/deezy/templates/deezy/index.html +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -53,7 +53,7 @@ filled dense emit-value - v-model.trim="swapLnToBtc.data.onChainFees" + v-model.trim="swapLnToBtc.data.on_chain_sats_per_vbyte" label="On chain fees" min="1" type="number" @@ -204,9 +204,9 @@ sendLnToBtc() { var self = this axios.post('https://api-testnet.deezy.io/v1/swap', { - amount_sats: self.swapLnToBtc.data.amount, + amount_sats: parseInt(self.swapLnToBtc.data.amount), on_chain_address: self.swapLnToBtc.data.on_chain_address, - on_chain_sats_per_vbyte: self.swapLnToBtc.data.on_chain_sats_per_vbyte + on_chain_sats_per_vbyte: parseInt(self.swapLnToBtc.data.on_chain_sats_per_vbyte) }) .then(function (response) { self.swapLnToBtc = { From 209750386edcafec949a60fe0ce2881c67da8ff4 Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Mon, 5 Dec 2022 21:12:17 +0100 Subject: [PATCH 04/27] forgot to update this one --- lnbits/extensions/deezy/templates/deezy/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html index 0d68f0a9..95bdc14b 100644 --- a/lnbits/extensions/deezy/templates/deezy/index.html +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -45,7 +45,7 @@ filled dense emit-value - v-model.trim="swapLnToBtc.data.refund_address" + v-model.trim="swapLnToBtc.data.on_chain_address" type="string" label="Onchain address to receive funds" > From 1b2e8d218d00babcd2058f8724d84dc4ecbab921 Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Tue, 6 Dec 2022 22:39:45 +0100 Subject: [PATCH 05/27] add api docs and update according to requirements --- .../deezy/templates/deezy/_api_docs.html | 221 ++++++++++++ .../deezy/templates/deezy/index.html | 332 +++++++++--------- 2 files changed, 384 insertions(+), 169 deletions(-) create mode 100644 lnbits/extensions/deezy/templates/deezy/_api_docs.html diff --git a/lnbits/extensions/deezy/templates/deezy/_api_docs.html b/lnbits/extensions/deezy/templates/deezy/_api_docs.html new file mode 100644 index 00000000..88e64e1f --- /dev/null +++ b/lnbits/extensions/deezy/templates/deezy/_api_docs.html @@ -0,0 +1,221 @@ + + + + +
+ Deezy.io: Do onchain to offchain and vice-versa swaps +
+

+ Link : + + https://deezy.io/ + +

+

+ API DOCS +

+

+ Created by, + Uthpala +

+
+
+
+ + + + + +
+ Get the current info about the swap service for converting LN btc to on-chain BTC. +
+ + GET (mainnet) + https://api.deezy.io/v1/swap/info + +
+ + GET (testnet) + https://api-testnet.deezy.io/v1/swap/info + +
Response
+
+            {
+              "liquidity_fee_ppm": 2000,
+              "on_chain_bytes_estimate": 300,
+              "max_swap_amount_sats": 100000000,
+              "min_swap_amount_sats": 100000,
+              "available": true
+            }
+          
+
+
+
+ + + +
+ Initiate a new swap to send lightning btc in exchange for on-chain btc +
+ + POST (mainnet) + https://api.deezy.io/v1/swap + +
+ + POST (testnet) + https://api-testnet.deezy.io/v1/swap + +
Payload
+
+            {
+              "amount_sats": 500000,
+              "on_chain_address": "tb1qrcdhlm0m...",
+              "on_chain_sats_per_vbyte": 2
+            }
+          
+
Response
+
+            {
+              "bolt11_invoice": "lntb603u1p3vmxj7p...",
+              "fee_sats": 600
+            }
+          
+
+
+
+ + + +
+ Lookup the on-chain transaction information for an existing swap +
+ + GET (mainnet) + https://api.deezy.io/v1/swap/lookup + +
+ + GET (testnet) + https://api-testnet.deezy.io/v1/swap/lookup + +
Query Parameter
+
+            "bolt11_invoice": "lntb603u1p3vmxj7pp54...",
+          
+
Response
+
+            {
+              "on_chain_txid": "string",
+              "tx_hex": "string"
+            }
+          
+
+
+
+
+ + + + +
+ Generate an on-chain deposit address for your lnurl or lightning address. +
+ + POST (mainnet) + https://api.deezy.io/v1/source + +
+ + POST (testnet) + https://api-testnet.deezy.io/v1/source + +
Payload
+
+            {
+              "lnurl_or_lnaddress": "LNURL1DP68GURN8GHJ...",
+              "secret_access_key": "b3c6056d2845867fa7..",
+              "webhook_url": "https://your.website.com/dee.."
+            }
+          
+
Response
+
+            {
+              "address": "bc1qkceyc5...",
+              "secret_access_key": "b3c6056d28458...",
+              "commitment": "for any satoshis sent to bc1..",
+              "signature": "d69j6aj1ssz5egmsr..",
+              "webhook_url": "https://your.website.com/deez.."
+            }
+          
+
+
+
+ + + +
+ Lookup (BTC to LN) swaps +
+ + GET (mainnet) + https://api.deezy.io/v1/source/lookup + +
+ + GET (testnet) + https://api-testnet.deezy.io/v1/source/lookup + +
Response
+
+            {
+              "swaps": [
+                {
+                  "lnurl_or_lnaddress": "string",
+                  "deposit_address": "string",
+                  "utxo_key": "string",
+                  "deposit_amount_sats": 0,
+                  "target_payout_amount_sats": 0,
+                  "paid_amount_sats": 0,
+                  "deezy_fee_sats": 0,
+                  "status": "string"
+                }
+              ],
+              "total_sent_sats": 0,
+              "total_received_sats": 0,
+              "total_pending_payout_sats": 0,
+              "total_deezy_fees_sats": 0
+            }
+          
+
+
+
+
+
diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html index 95bdc14b..233fce34 100644 --- a/lnbits/extensions/deezy/templates/deezy/index.html +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -1,176 +1,172 @@ {% extends "base.html" %} {% from "macros.jinja" import window_vars with context %} {% block page %} - - -
- Deezy -
- +
+
- - - Send onchain funds offchain (BTC -> LN) - - - - - Send offchain funds to onchain address (LN -> BTC) - - +
+ Deezy +
+ + + + + + Send onchain funds offchain (BTC -> LN) + + + + + Send offchain funds to onchain address (LN -> BTC) + + + + +
+
LIGHTNING BTC -> BTC
+ + + + + + Cancel + + + + +
+
Pay invoice to complete swap
+ + + +
+
+ + + + + + + +
+
+
+
+
BTC -> LIGHTNING BTC
+ + + + Cancel + + + + +
+
Response - Important
+ + + +
+
+ {% raw %} + + Address - {{ swapBtcToLn.response.address }} + + + Commitment - {{ swapBtcToLn.response.commitment }} + + + Secret Access Key - {{ swapBtcToLn.response.secret_access_key }} + + + Signature - {{ swapBtcToLn.response.signature }} + + {% endraw %} +
+
+
+
+
+
+ + +
{{SITE_TITLE}} Boltz extension
+
+ + + {% include "deezy/_api_docs.html" %}
-
-
Lightning Btc -> Btc
- - - - - - Cancel - - - - -
-
Pay invoice to complete swap
- - - -
-
- - - - - - - -
-
-
-
-
Btc -> Lightning Btc
- - - - - - Cancel - - - - -
-
Response - Important
- - - -
-
- {% raw %} - - Address - {{ swapBtcToLn.response.address }} - - - Commitment - {{ swapBtcToLn.response.commitment }} - - - Secret Access Key - {{ swapBtcToLn.response.secret_access_key }} - - - Signature - {{ swapBtcToLn.response.signature }} - - - Webhook Url - {{ swapBtcToLn.response.webhook_url }} - - {% endraw %} -
-
-
- +
+
{% endblock %} {% block scripts %} {{ window_vars(user) }} From d338e3889a74602854057a4084060aa78c39cee9 Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Thu, 8 Dec 2022 16:42:33 +0100 Subject: [PATCH 12/27] Add on chain fee suggestions --- .../deezy/templates/deezy/index.html | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html index 537ed887..60b31a09 100644 --- a/lnbits/extensions/deezy/templates/deezy/index.html +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -12,7 +12,7 @@ label="SWAP (LIGHTNING -> BTC)" unelevated color="primary" - @click="swapLnToBtc.show = true; swapBtcToLn.show = false" + @click="showLnToBtcForm" > Send lightning btc and receive on-chain btc @@ -60,7 +60,9 @@ label="On chain fee rate (sats/vbyte)" min="1" type="number" - > + :hint="swapLnToBtc.suggested_fees && `Economy Fee - ${swapLnToBtc.suggested_fees?.economyFee} | Half an hour fee - ${swapLnToBtc.suggested_fees?.halfHourFee} | Fastest fee - ${swapLnToBtc.suggested_fees?.fastestFee}`" + > + { + console.log(result.data) + this.swapLnToBtc.suggested_fees = result.data + }) + }, checkIfInvoiceIsPaid() { if (this.swapLnToBtc.response && !this.swapLnToBtc.invoicePaid) { var self = this From c2423605ccff3604640d765e5304ea424c280782 Mon Sep 17 00:00:00 2001 From: Danny Diekroeger Date: Sat, 10 Dec 2022 11:00:36 -0800 Subject: [PATCH 13/27] add migrations --- lnbits/extensions/deezy/migrations.py | 39 ++++++++++++++++++++------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/lnbits/extensions/deezy/migrations.py b/lnbits/extensions/deezy/migrations.py index 99d7c362..86edcf09 100644 --- a/lnbits/extensions/deezy/migrations.py +++ b/lnbits/extensions/deezy/migrations.py @@ -1,10 +1,29 @@ -# async def m001_initial(db): -# await db.execute( -# f""" -# CREATE TABLE example.example ( -# id TEXT PRIMARY KEY, -# wallet TEXT NOT NULL, -# time TIMESTAMP NOT NULL DEFAULT {db.timestamp_now} -# ); -# """ -# ) +async def m001_initial(db): + await db.execute( + f""" + CREATE TABLE deezy.ln_to_btc_swap ( + id TEXT PRIMARY KEY, + amount_sats {db.big_int} NOT NULL, + on_chain_address TEXT NOT NULL, + on_chain_sats_per_vbyte INT NOT NULL, + bolt11_invoice TEXT NOT NULL, + fee_sats {db.big_int} NOT NULL, + txid TEXT NULL, + tx_hex TEXT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + """ + ) + await db.execute( + f""" + CREATE TABLE deezy.btc_to_ln_swap ( + id TEXT PRIMARY KEY, + ln_address TEXT NOT NULL, + on_chain_address TEXT NOT NULL, + secret_access_key TEXT NOT NULL, + commitment TEXT NOT NULL, + signature TEXT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + """ + ) From 663cee8fbe1b5836d9421c854d7f075b9c081fa5 Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Sun, 11 Dec 2022 17:42:47 +0100 Subject: [PATCH 14/27] fix ui bug --- lnbits/extensions/deezy/templates/deezy/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html index 60b31a09..98067fd7 100644 --- a/lnbits/extensions/deezy/templates/deezy/index.html +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -223,12 +223,12 @@ showLnToBtcForm() { this.getSuggestedOnChainFees() this.swapLnToBtc.show = true + this.swapBtcToLn.show = false }, getSuggestedOnChainFees() { axios .get('https://mempool.space/api/v1/fees/recommended') .then(result => { - console.log(result.data) this.swapLnToBtc.suggested_fees = result.data }) }, From cd05eba183bc7b8bfdbd1c98d52bd07fae90a256 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 5 Jan 2023 00:52:08 +0000 Subject: [PATCH 15/27] Added tile and tweaked description for size limitation --- lnbits/extensions/deezy/__init__.py | 9 +++++++++ lnbits/extensions/deezy/config.json | 4 ++-- lnbits/extensions/deezy/static/deezy.png | Bin 0 -> 5196 bytes 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 lnbits/extensions/deezy/static/deezy.png diff --git a/lnbits/extensions/deezy/__init__.py b/lnbits/extensions/deezy/__init__.py index 120124e7..97f6d9ef 100644 --- a/lnbits/extensions/deezy/__init__.py +++ b/lnbits/extensions/deezy/__init__.py @@ -1,4 +1,5 @@ from fastapi import APIRouter +from starlette.staticfiles import StaticFiles from lnbits.db import Database from lnbits.helpers import template_renderer @@ -7,6 +8,14 @@ db = Database("ext_deezy") deezy_ext: APIRouter = APIRouter(prefix="/deezy", tags=["deezy"]) +deezy_static_files = [ + { + "path": "/deezy/static", + "app": StaticFiles(directory="lnbits/extensions/deezy/static"), + "name": "deezy_static", + } +] + def deezy_renderer(): return template_renderer(["lnbits/extensions/deezy/templates"]) diff --git a/lnbits/extensions/deezy/config.json b/lnbits/extensions/deezy/config.json index e3c1a3d7..4f945a79 100644 --- a/lnbits/extensions/deezy/config.json +++ b/lnbits/extensions/deezy/config.json @@ -1,6 +1,6 @@ { "name": "Deezy", - "short_description": "Swap lightning to on-chain, or receive on-chain to lightning addresses.", - "icon": "swap_horiz", + "short_description": "LN to onchain, onchain to LN swaps", + "tile": "/deezy/static/deezy.png", "contributors": ["Uthpala"] } diff --git a/lnbits/extensions/deezy/static/deezy.png b/lnbits/extensions/deezy/static/deezy.png new file mode 100644 index 0000000000000000000000000000000000000000..cb526705c4f83e165699236de8bdf4d69b61e1b7 GIT binary patch literal 5196 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 QU|?YIboFyt=akR{09nk?t^fc4 literal 0 HcmV?d00001 From 93d6d1279e8092f4b9c769a736ce4dede402f3c5 Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Thu, 5 Jan 2023 11:46:01 +0100 Subject: [PATCH 16/27] adding deezy token --- lnbits/extensions/deezy/__init__.py | 1 + lnbits/extensions/deezy/crud.py | 38 +++++ lnbits/extensions/deezy/migrations.py | 8 + lnbits/extensions/deezy/models.py | 9 +- .../deezy/templates/deezy/index.html | 151 +++++++++++++++++- lnbits/extensions/deezy/views_api.py | 31 ++++ 6 files changed, 233 insertions(+), 5 deletions(-) create mode 100644 lnbits/extensions/deezy/crud.py create mode 100644 lnbits/extensions/deezy/views_api.py diff --git a/lnbits/extensions/deezy/__init__.py b/lnbits/extensions/deezy/__init__.py index 97f6d9ef..05d1c9a7 100644 --- a/lnbits/extensions/deezy/__init__.py +++ b/lnbits/extensions/deezy/__init__.py @@ -22,3 +22,4 @@ def deezy_renderer(): from .views import * # noqa +from .views_api import * # noqa diff --git a/lnbits/extensions/deezy/crud.py b/lnbits/extensions/deezy/crud.py new file mode 100644 index 00000000..69630610 --- /dev/null +++ b/lnbits/extensions/deezy/crud.py @@ -0,0 +1,38 @@ +from http import HTTPStatus +from typing import List + +from . import db +from .models import ( + Token, +) + +""" +Get Deezy Token +""" + + +async def get_token() -> Token: + + row = await db.fetchone( + f"SELECT * FROM deezy.token ORDER BY created_at DESC", + ) + + return Token(**row) if row else None + + +async def save_token( + data: Token, +) -> Token: + + await db.execute( + """ + INSERT INTO deezy.token ( + deezy_token + ) + VALUES (?) + """, + ( + data.deezy_token, + ), + ) + return data diff --git a/lnbits/extensions/deezy/migrations.py b/lnbits/extensions/deezy/migrations.py index 86edcf09..67455d6b 100644 --- a/lnbits/extensions/deezy/migrations.py +++ b/lnbits/extensions/deezy/migrations.py @@ -27,3 +27,11 @@ async def m001_initial(db): ); """ ) + await db.execute( + f""" + CREATE TABLE deezy.token ( + deezy_token TEXT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + """ + ) diff --git a/lnbits/extensions/deezy/models.py b/lnbits/extensions/deezy/models.py index bfeb7517..751191f0 100644 --- a/lnbits/extensions/deezy/models.py +++ b/lnbits/extensions/deezy/models.py @@ -1,5 +1,6 @@ -# from pydantic import BaseModel +from pydantic.main import BaseModel +from sqlalchemy.engine import base # type: ignore -# class Example(BaseModel): -# id: str -# wallet: str + +class Token(BaseModel): + deezy_token: str diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html index 98067fd7..5c2f9ae4 100644 --- a/lnbits/extensions/deezy/templates/deezy/index.html +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -5,6 +5,30 @@
Deezy
+

Due to regulatory reasons you need to get a access token from deezy. Contact - support@deezy.io or @dannydeezy on telegram

+
+
+ Deezy token + Add or Update token +
+

+
+ + + + @@ -189,6 +213,14 @@ +
+ +
{% endblock %} {% block scripts %} {{ window_vars(user) }} -{% endblock %} +{% endblock %} \ No newline at end of file From af472ba8330ef28ff2174a25ed648b156c949e7c Mon Sep 17 00:00:00 2001 From: Uthpala Heenatigala Date: Fri, 6 Jan 2023 20:34:31 +0100 Subject: [PATCH 21/27] fix formatting --- .../deezy/templates/deezy/index.html | 182 ++++++++++++++---- 1 file changed, 145 insertions(+), 37 deletions(-) diff --git a/lnbits/extensions/deezy/templates/deezy/index.html b/lnbits/extensions/deezy/templates/deezy/index.html index b1e06362..858d3255 100644 --- a/lnbits/extensions/deezy/templates/deezy/index.html +++ b/lnbits/extensions/deezy/templates/deezy/index.html @@ -6,50 +6,105 @@
Deezy

- An access token is required to use the swap service. - Email support@deezy.io or contact @dannydeezy on telegram to get one. + An access token is required to use the swap service. Email + support@deezy.io or contact @dannydeezy on telegram to get one.

Deezy token - Add or Update token + Add or Update token

- - + + - + Send lightning btc and receive on-chain btc - + Send on-chain btc and receive via lightning -
+
LIGHTNING BTC -> BTC
- - - + + + - - Cancel + + Cancel @@ -62,22 +117,52 @@
- + - - + +
-
+
BTC -> LIGHTNING BTC
- - - Cancel + + + Cancel @@ -90,15 +175,28 @@
- + - + - + @@ -135,10 +233,20 @@
- +
- +
{% endblock %} {% block scripts %} {{ window_vars(user) }} @@ -176,8 +284,8 @@ align: 'left', field: 'fee_sats' }, - { name: 'txid', label: 'Tx Id', align: 'left', field: 'txid' }, - { name: 'tx_hex', label: 'Tx Hex', align: 'left', field: 'tx_hex' }, + {name: 'txid', label: 'Tx Id', align: 'left', field: 'txid'}, + {name: 'tx_hex', label: 'Tx Hex', align: 'left', field: 'tx_hex'}, { name: 'created_at', label: 'Created at', @@ -477,4 +585,4 @@ } }) -{% endblock %} \ No newline at end of file +{% endblock %} From ef456c66d7deba6d9659306b0232997566cd348f Mon Sep 17 00:00:00 2001 From: ben Date: Sat, 7 Jan 2023 21:59:10 +0000 Subject: [PATCH 22/27] Format --- lnbits/extensions/deezy/crud.py | 11 ++--------- lnbits/extensions/deezy/models.py | 1 + lnbits/extensions/deezy/views_api.py | 16 +++++----------- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/lnbits/extensions/deezy/crud.py b/lnbits/extensions/deezy/crud.py index d3b3f935..8df50eb6 100644 --- a/lnbits/extensions/deezy/crud.py +++ b/lnbits/extensions/deezy/crud.py @@ -2,12 +2,7 @@ from http import HTTPStatus from typing import List from . import db -from .models import ( - Token, - LnToBtcSwap, - BtcToLnSwap, - UpdateLnToBtcSwap -) +from .models import BtcToLnSwap, LnToBtcSwap, Token, UpdateLnToBtcSwap async def get_ln_to_btc() -> List[LnToBtcSwap]: @@ -48,9 +43,7 @@ async def save_token( ) VALUES (?) """, - ( - data.deezy_token, - ), + (data.deezy_token,), ) return data diff --git a/lnbits/extensions/deezy/models.py b/lnbits/extensions/deezy/models.py index 0fcc3ce8..e69db355 100644 --- a/lnbits/extensions/deezy/models.py +++ b/lnbits/extensions/deezy/models.py @@ -1,4 +1,5 @@ from typing import Optional + from pydantic.main import BaseModel from sqlalchemy.engine import base # type: ignore diff --git a/lnbits/extensions/deezy/views_api.py b/lnbits/extensions/deezy/views_api.py index 85741b43..6af3bd72 100644 --- a/lnbits/extensions/deezy/views_api.py +++ b/lnbits/extensions/deezy/views_api.py @@ -7,22 +7,16 @@ # response.is_error that is its inverse) from . import deezy_ext -from .models import ( - Token, - LnToBtcSwap, - BtcToLnSwap, - UpdateLnToBtcSwap, -) - from .crud import ( - get_token, - get_ln_to_btc, get_btc_to_ln, - save_token, + get_ln_to_btc, + get_token, save_btc_to_ln, save_ln_to_btc, - update_ln_to_btc + save_token, + update_ln_to_btc, ) +from .models import BtcToLnSwap, LnToBtcSwap, Token, UpdateLnToBtcSwap @deezy_ext.get("/api/v1/token") From 7f1a08e16ac0d75aa03e7cfaa9b9c2349e2acb6f Mon Sep 17 00:00:00 2001 From: ben Date: Sat, 7 Jan 2023 22:06:35 +0000 Subject: [PATCH 23/27] mypy --- lnbits/extensions/deezy/crud.py | 4 +++- lnbits/extensions/deezy/views_api.py | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lnbits/extensions/deezy/crud.py b/lnbits/extensions/deezy/crud.py index 8df50eb6..23eca774 100644 --- a/lnbits/extensions/deezy/crud.py +++ b/lnbits/extensions/deezy/crud.py @@ -23,7 +23,7 @@ async def get_btc_to_ln() -> List[BtcToLnSwap]: return [BtcToLnSwap(**row) for row in rows] -async def get_token() -> Token: +async def get_token() -> Optional[Token]: row = await db.fetchone( f"SELECT * FROM deezy.token ORDER BY created_at DESC", @@ -75,6 +75,7 @@ async def save_ln_to_btc( data.tx_hex, ), ) + return async def update_ln_to_btc(data: UpdateLnToBtcSwap) -> str: @@ -113,3 +114,4 @@ async def save_btc_to_ln( data.signature, ), ) + return diff --git a/lnbits/extensions/deezy/views_api.py b/lnbits/extensions/deezy/views_api.py index 6af3bd72..1006edeb 100644 --- a/lnbits/extensions/deezy/views_api.py +++ b/lnbits/extensions/deezy/views_api.py @@ -20,46 +20,46 @@ from .models import BtcToLnSwap, LnToBtcSwap, Token, UpdateLnToBtcSwap @deezy_ext.get("/api/v1/token") -async def api_deezy(): +async def api_deezy_get_token(): rows = await get_token() return rows @deezy_ext.get("/api/v1/ln-to-btc") -async def api_deezy(): +async def api_deezy_get_ln_to_btc(): rows = await get_ln_to_btc() return rows @deezy_ext.get("/api/v1/btc-to-ln") -async def api_deezy(): +async def api_deezy_get_btc_to_ln(): rows = await get_btc_to_ln() return rows @deezy_ext.post("/api/v1/store-token") -async def api_deezy(data: Token): +async def api_deezy_save_toke(data: Token): await save_token(data) return data.deezy_token @deezy_ext.post("/api/v1/store-ln-to-btc") -async def api_deezy(data: LnToBtcSwap): +async def api_deezy_save_ln_to_btc(data: LnToBtcSwap): response = await save_ln_to_btc(data) return response @deezy_ext.post("/api/v1/update-ln-to-btc") -async def api_deezy(data: UpdateLnToBtcSwap): +async def api_deezy_update_ln_to_btc(data: UpdateLnToBtcSwap): response = await update_ln_to_btc(data) return response @deezy_ext.post("/api/v1/store-btc-to-ln") -async def api_deezy(data: BtcToLnSwap): +async def api_deezy_save_btc_to_ln(data: BtcToLnSwap): response = await save_btc_to_ln(data) return response From ccdb6d76bdf12e53dd55f29ee3ede44a373c1741 Mon Sep 17 00:00:00 2001 From: ben Date: Sat, 7 Jan 2023 22:11:17 +0000 Subject: [PATCH 24/27] added Optional --- lnbits/extensions/deezy/crud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/deezy/crud.py b/lnbits/extensions/deezy/crud.py index 23eca774..c2768e25 100644 --- a/lnbits/extensions/deezy/crud.py +++ b/lnbits/extensions/deezy/crud.py @@ -1,5 +1,5 @@ from http import HTTPStatus -from typing import List +from typing import List, Optional from . import db from .models import BtcToLnSwap, LnToBtcSwap, Token, UpdateLnToBtcSwap From dfd86ed2e05703b553b5cbd6291849bec6a89864 Mon Sep 17 00:00:00 2001 From: ben Date: Sat, 7 Jan 2023 22:16:36 +0000 Subject: [PATCH 25/27] mypy --- lnbits/extensions/deezy/crud.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lnbits/extensions/deezy/crud.py b/lnbits/extensions/deezy/crud.py index c2768e25..75549349 100644 --- a/lnbits/extensions/deezy/crud.py +++ b/lnbits/extensions/deezy/crud.py @@ -52,7 +52,7 @@ async def save_ln_to_btc( data: LnToBtcSwap, ) -> LnToBtcSwap: - await db.execute( + return await db.execute( """ INSERT INTO deezy.ln_to_btc_swap ( amount_sats, @@ -75,7 +75,6 @@ async def save_ln_to_btc( data.tx_hex, ), ) - return async def update_ln_to_btc(data: UpdateLnToBtcSwap) -> str: @@ -95,7 +94,7 @@ async def save_btc_to_ln( data: BtcToLnSwap, ) -> BtcToLnSwap: - await db.execute( + return await db.execute( """ INSERT INTO deezy.btc_to_ln_swap ( ln_address, @@ -114,4 +113,3 @@ async def save_btc_to_ln( data.signature, ), ) - return From 49d286e7ea9ec5901f5b916f9783caeed2e869fd Mon Sep 17 00:00:00 2001 From: Joel Klabo Date: Sun, 8 Jan 2023 21:31:41 -0800 Subject: [PATCH 26/27] Add Satoshis as Currency Option Nostr NIP-5 --- lnbits/extensions/nostrnip5/templates/nostrnip5/index.html | 3 ++- lnbits/extensions/nostrnip5/views_api.py | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/nostrnip5/templates/nostrnip5/index.html b/lnbits/extensions/nostrnip5/templates/nostrnip5/index.html index b1459ee3..820d8718 100644 --- a/lnbits/extensions/nostrnip5/templates/nostrnip5/index.html +++ b/lnbits/extensions/nostrnip5/templates/nostrnip5/index.html @@ -201,7 +201,7 @@ dense v-model.trim="formDialog.data.amount" label="Amount" - placeholder="10.00" + placeholder="How much do you want to charge?" > Date: Mon, 9 Jan 2023 11:01:15 +0000 Subject: [PATCH 27/27] format --- lnbits/extensions/nostrnip5/views_api.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lnbits/extensions/nostrnip5/views_api.py b/lnbits/extensions/nostrnip5/views_api.py index 43c06389..79768d62 100644 --- a/lnbits/extensions/nostrnip5/views_api.py +++ b/lnbits/extensions/nostrnip5/views_api.py @@ -199,7 +199,9 @@ async def api_address_create( if domain.currency == "Satoshis": price_in_sats = domain.amount else: - price_in_sats = await fiat_amount_as_satoshis(domain.amount / 100, domain.currency) + price_in_sats = await fiat_amount_as_satoshis( + domain.amount / 100, domain.currency + ) try: payment_hash, payment_request = await create_invoice(