chore: various tweaks

This commit is contained in:
Eneko Illarramendi
2020-04-16 20:58:16 +02:00
parent 490e166f75
commit dd23b20090
25 changed files with 156 additions and 99 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
from uuid import uuid4
from typing import List, Optional
from uuid import uuid4
from lnbits.db import open_db
from lnbits.settings import DEFAULT_WALLET_NAME, FEE_RESERVE
@@ -1,9 +1,10 @@
from typing import Tuple
from typing import Optional, Tuple
from lnbits.bolt11 import decode as bolt11_decode
from lnbits.settings import WALLET, FEE_RESERVE
from .crud import create_payment
from .models import Wallet
def create_invoice(*, wallet_id: str, amount: int, memo: str) -> Tuple[str, str]:
@@ -21,14 +22,23 @@ def create_invoice(*, wallet_id: str, amount: int, memo: str) -> Tuple[str, str]
return checking_id, payment_request
def pay_invoice(*, wallet_id: str, bolt11: str) -> str:
def pay_invoice(*, wallet: Wallet, bolt11: str, max_sat: Optional[int] = None) -> str:
try:
invoice = bolt11_decode(bolt11)
ok, checking_id, fee_msat, error_message = WALLET.pay_invoice(bolt11)
if invoice.amount_msat == 0:
raise ValueError("Amountless invoices not supported.")
if max_sat and invoice.amount_msat > max_sat * 1000:
raise ValueError("Amount in invoice is too high.")
if invoice.amount_msat > wallet.balance_msat:
raise PermissionError("Insufficient balance.")
if ok:
create_payment(
wallet_id=wallet_id,
wallet_id=wallet.id,
checking_id=checking_id,
amount=-invoice.amount_msat,
memo=invoice.description,
@@ -42,3 +52,7 @@ def pay_invoice(*, wallet_id: str, bolt11: str) -> str:
raise Exception(error_message or "Unexpected backend error.")
return checking_id
def check_payment(*, checking_id: str) -> str:
pass
+1 -1
View File
@@ -35,7 +35,7 @@
</q-card>
</q-expansion-item>
<q-expansion-item group="api" dense expand-separator label="Check an invoice (incoming or outgoing)"
class="q-mb-md">
class="q-pb-md">
<q-card>
<q-card-section>
<code><span class="text-light-blue">GET</span> /api/v1/payments/&lt;checking_id&gt;</code>
+1 -4
View File
@@ -8,12 +8,9 @@
{% endassets %}
{% endblock %}
{% block drawer %}
{% endblock %}
{% block page %}
<div class="row q-col-gutter-md justify-between">
<div class="col-12 col-md-8 col-lg-7 q-gutter-y-md">
<div class="col-12 col-md-7 q-gutter-y-md">
<q-card>
<q-card-section>
+19 -20
View File
@@ -9,6 +9,7 @@
{% block scripts %}
{{ window_vars(user, wallet) }}
<script src="{{ url_for('static', filename='vendor/vue-qrcode@1.0.2/vue-qrcode.min.js') }}"></script>
{% assets filters='rjsmin', output='__bundle__/core/chart.js',
'vendor/moment@2.24.0/moment.min.js',
'vendor/chart.js@2.9.3/chart.min.js' %}
@@ -17,7 +18,6 @@
{% assets filters='rjsmin', output='__bundle__/core/wallet.js',
'vendor/bolt11/utils.js',
'vendor/bolt11/decoder.js',
'vendor/vue-qrcode@1.0.2/vue-qrcode.min.js',
'vendor/vue-qrcode-reader@2.1.1/vue-qrcode-reader.min.js',
'core/js/wallet.js' %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
@@ -26,7 +26,7 @@
{% block page %}
<div class="row q-col-gutter-md">
<div class="col-12 col-md-8 col-lg-7 q-gutter-y-md">
<div class="col-12 col-md-7 q-gutter-y-md">
<q-card>
<q-card-section>
<h3 class="q-my-none"><strong>{% raw %}{{ fbalance }}{% endraw %}</strong> sat</h3>
@@ -105,9 +105,10 @@
</q-card>
</div>
<div class="col-12 col-md-4 col-lg-5 q-gutter-y-md">
<div class="col-12 col-md-5 q-gutter-y-md">
<q-card>
<q-card-section>
<q-btn flat color="grey" @click="exportCSV" class="float-right">Renew keys</q-btn>
<h6 class="text-subtitle1 q-mt-none q-mb-sm">LNbits wallet</h6>
<strong>Wallet name: </strong><em>{{ wallet.name }}</em><br>
<strong>Wallet ID: </strong><em>{{ wallet.id }}</em><br>
@@ -139,12 +140,12 @@
</div>
<q-dialog v-model="receive.show" position="top" @hide="closeReceiveDialog">
<q-card class="q-pa-lg q-pt-xl" style="width: 500px">
<q-form v-if="!receive.paymentReq" class="q-gutter-md">
<q-card v-if="!receive.paymentReq" class="q-pa-lg q-pt-xl lnbits__dialog-card">
<q-form class="q-gutter-md">
<q-input filled dense
v-model.number="receive.data.amount"
type="number"
label="Amount *"></q-input>
label="Amount (sat) *"></q-input>
<q-input filled dense
v-model.trim="receive.data.memo"
label="Memo"
@@ -158,26 +159,24 @@
</div>
<q-spinner v-if="receive.status == 'loading'" color="deep-purple" size="2.55em"></q-spinner>
</q-form>
<div v-else>
<div class="text-center q-mb-md">
<a :href="'lightning:' + receive.paymentReq">
</q-card>
<q-card v-else class="q-pa-lg lnbits__dialog-card">
<div class="text-center q-mb-md">
<a :href="'lightning:' + receive.paymentReq">
<q-responsive :ratio="1" class="q-mx-xl">
<qrcode :value="receive.paymentReq" :options="{width: 340}" class="rounded-borders"></qrcode>
</a>
</div>
<!--<q-separator class="q-my-md"></q-separator>
<p class="text-caption" style="word-break: break-all">
{% raw %}{{ receive.paymentReq }}{% endraw %}
</p>-->
<div class="row justify-between">
<q-btn flat color="grey" @click="copyText(receive.paymentReq)">Copy invoice</q-btn>
<q-btn v-close-popup flat color="grey">Close</q-btn>
</div>
</q-responsive>
</a>
</div>
<div class="row justify-between">
<q-btn flat color="grey" @click="copyText(receive.paymentReq)">Copy invoice</q-btn>
<q-btn v-close-popup flat color="grey">Close</q-btn>
</div>
</q-card>
</q-dialog>
<q-dialog v-model="send.show" position="top" @hide="closeSendDialog">
<q-card class="q-pa-lg q-pt-xl" style="width: 500px">
<q-card class="q-pa-lg q-pt-xl lnbits__dialog-card">
<div v-if="!send.invoice">
<q-form v-if="!sendCamera.show" class="q-gutter-md">
<q-input filled dense
+6 -12
View File
@@ -1,12 +1,11 @@
from flask import g, jsonify, request
from lnbits.bolt11 import decode as bolt11_decode
from lnbits.core import core_app
from lnbits.decorators import api_check_wallet_macaroon, api_validate_post_request
from lnbits.helpers import Status
from lnbits.settings import WALLET
from ..utils import create_invoice, pay_invoice
from ..services import create_invoice, pay_invoice
@core_app.route("/api/v1/payments", methods=["GET"])
@@ -44,16 +43,11 @@ def api_payments_create_invoice():
@api_validate_post_request(schema={"bolt11": {"type": "string", "empty": False, "required": True}})
def api_payments_pay_invoice():
try:
invoice = bolt11_decode(g.data["bolt11"])
if invoice.amount_msat == 0:
return jsonify({"message": "Amountless invoices not supported."}), Status.BAD_REQUEST
if invoice.amount_msat > g.wallet.balance_msat:
return jsonify({"message": "Insufficient balance."}), Status.FORBIDDEN
checking_id = pay_invoice(wallet_id=g.wallet.id, bolt11=g.data["bolt11"])
checking_id = pay_invoice(wallet=g.wallet, bolt11=g.data["bolt11"])
except ValueError as e:
return jsonify({"message": str(e)}), Status.BAD_REQUEST
except PermissionError as e:
return jsonify({"message": str(e)}), Status.FORBIDDEN
except Exception as e:
return jsonify({"message": str(e)}), Status.INTERNAL_SERVER_ERROR