aboutsummaryrefslogtreecommitdiffstats
path: root/sendPayment.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2019-09-15 23:05:26 -0700
committerAdam Soltys <[email protected]>2019-09-15 23:05:26 -0700
commit765c6a42135b9334b616c26b22c816edd06e382a (patch)
tree05da4f343358fb5e9a9083e348783f0fab973dd8 /sendPayment.js
parent087fdd27f3683a1deb9376b7a72aa608e6fd8e6a (diff)
downloadcoinos-server-765c6a42135b9334b616c26b22c816edd06e382a.tar.gz
coinos-server-765c6a42135b9334b616c26b22c816edd06e382a.zip
refactor
Diffstat (limited to 'sendPayment.js')
-rw-r--r--sendPayment.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/sendPayment.js b/sendPayment.js
new file mode 100644
index 00000000..d4391087
--- /dev/null
+++ b/sendPayment.js
@@ -0,0 +1,87 @@
+const bolt11 = require("bolt11");
+const config = require("./config");
+
+const l = console.log;
+
+module.exports = (app, db, emit, seen, lna, lnb) => async (req, res) => {
+ let hash = req.body.payreq;
+ let payreq = bolt11.decode(hash);
+ l("sending lightning", req.user.username, payreq.satoshis);
+
+ if (seen.includes(hash)) {
+ return res.status(500).send("Invoice has been paid, can't pay again");
+ }
+
+ try {
+ await db.transaction(async transaction => {
+ let { balance } = await db.User.findOne(
+ {
+ where: {
+ username: req.user.username
+ }
+ },
+ { transaction }
+ );
+
+ if (balance < payreq.satoshis) {
+ throw new Error();
+ }
+
+ req.user.balance -= payreq.satoshis;
+ await req.user.save({ transaction });
+ });
+ } catch (e) {
+ return res.status(500).send("Not enough satoshis");
+ }
+
+ const stream = lna.sendPayment(lna.meta, {});
+ stream.write({ payment_request: req.body.payreq });
+
+ stream.on("data", async m => {
+ if (m.payment_error) {
+ res.status(500).send(m.payment_error);
+ } else {
+ if (seen.includes(m.payment_preimage)) return;
+ seen.push(m.payment_preimage);
+
+ let total = parseInt(m.payment_route.total_amt);
+ req.user.balance -= total - payreq.satoshis;
+
+ await db.transaction(async transaction => {
+ await req.user.save({ transaction });
+
+ await db.Payment.create(
+ {
+ amount: -total,
+ user_id: req.user.id,
+ hash,
+ rate: app.get("rates").ask,
+ currency: "CAD"
+ },
+ { transaction }
+ );
+ });
+
+ emit(req.user.username, "user", req.user);
+
+ if (payreq.payeeNodeKey === config.lnb.id) {
+ let invoice = await lna.addInvoice({ value: payreq.satoshis });
+ let payback = lnb.sendPayment(lnb.meta, {});
+
+ /* eslint-disable-next-line */
+ let { payment_request } = invoice;
+ /* eslint-disable-next-line */
+ payback.write({ payment_request });
+ }
+
+ seen.push(hash);
+ res.send(m);
+ }
+ });
+
+ stream.on("error", e => {
+ let msg = e.message;
+
+ res.status(500).send(msg);
+ });
+};