aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/lightning.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/lightning.js b/lib/lightning.js
index e69de29b..2a8e8053 100644
--- a/lib/lightning.js
+++ b/lib/lightning.js
@@ -0,0 +1,82 @@
+import { emit } from "$lib/sockets";
+import config from "$config";
+import { notify } from "$lib/notifications";
+import { callWebhook } from "$lib/webhooks";
+import ln from "$lib/ln";
+import { l, err, warn } from "$lib/logging";
+import { g, s, db } from "$lib/db";
+
+export async function listenForLightning() {
+ let {
+ payment_hash,
+ bolt11: request,
+ pay_index,
+ status,
+ msatoshi_received,
+ payment_preimage: preimage
+ } = await ln.waitanyinvoice(await g("pay_index"));
+
+ await s("pay_index", pay_index);
+
+ let received = Math.round(msatoshi_received / 1000);
+
+ try {
+ l("incoming lightning payment", received);
+
+ if (!preimage) return;
+
+ let invoice = await g(`invoice:${payment_hash}`);
+ if (!invoice) return warn("received lightning with no invoice", request);
+
+ let { hash, currency, memo, rate, tip, uid } = invoice;
+ let amount = parseInt(received) - tip;
+ if (amount < 0) throw new Error("amount out of range");
+
+ let user = await g(`user:${uid}`);
+
+ let payment = {
+ amount,
+ created: Date.now(),
+ currency,
+ fee: 0,
+ hash,
+ memo,
+ preimage,
+ rate,
+ tip,
+ type: "lightning",
+ uid
+ };
+
+ invoice.status = "paid";
+ invoice.received += received;
+ await s(`invoice:${payment_hash}`, invoice);
+
+ let t = async () => {
+ await db.watch(`balance:${uid}`);
+ let b = await g(`balance:${uid}`);
+ b += received;
+ let m = await db.multi();
+ await s(`balance:${uid}`, b);
+ if (!(await m.exec())) t();
+ };
+ await t();
+
+ payment.invoice = invoice;
+
+ await s(`payment:${hash}`, payment);
+ await db.lPush(`${uid}:payments`, hash);
+
+ callWebhook(invoice, payment);
+
+ emit(uid, "payment", payment);
+ notify(user, `Received ${received} SAT`);
+
+ l("lightning payment received", user.username, payment.amount, payment.tip);
+ } catch (e) {
+ console.log(e);
+ err("problem receiving lightning payment", e.message);
+ }
+
+ setTimeout(listenForLightning);
+}