diff options
| author | Adam Soltys <[email protected]> | 2020-03-11 15:10:40 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-03-11 15:10:40 -0700 |
| commit | c0888fab024cc9f7c99812bfabf9d7774312dbf7 (patch) | |
| tree | cad95683af97432f6092a2c2bae10fbb7a588db5 /routes/lightning/send.js | |
| parent | bf2b51f0c2ae9b8f0f330dde6411e45fc0da8a25 (diff) | |
| download | coinos-server-c0888fab024cc9f7c99812bfabf9d7774312dbf7.tar.gz coinos-server-c0888fab024cc9f7c99812bfabf9d7774312dbf7.zip | |
refactor
Diffstat (limited to 'routes/lightning/send.js')
| -rw-r--r-- | routes/lightning/send.js | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/routes/lightning/send.js b/routes/lightning/send.js new file mode 100644 index 00000000..2b661b60 --- /dev/null +++ b/routes/lightning/send.js @@ -0,0 +1,93 @@ +const bolt11 = require("bolt11"); + +module.exports = async (req, res) => { + let hash = req.body.payreq; + let payreq = bolt11.decode(hash); + let { route } = req.body; + let { user } = req; + + if (seen.includes(hash)) { + l.warn("attempted to pay a paid invoice", user.username); + 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: user.username + } + }, + { transaction } + ); + + if (balance < payreq.satoshis) { + throw new Error("insufficient funds"); + } + + user.balance -= payreq.satoshis; + await user.save({ transaction }); + }); + } catch (e) { + l.warn("insufficient funds for lightning payment", e); + return res.status(500).send("Not enough satoshis"); + } + + let m; + try { + let paymentHash = payreq.tags.find(t => t.tagName === 'payment_hash').data; + m = await lna.sendToRouteSync({ + "payment_hash": Buffer.from(paymentHash, 'hex'), + route + }); + + if (m.payment_error) return res.status(500).send(m.payment_error); + if (seen.includes(m.payment_preimage)) return; + seen.push(m.payment_preimage); + + let total = parseInt(m.payment_route.total_amt); + let fee = m.payment_route.total_fees; + + user.balance -= total - payreq.satoshis; + + await db.transaction(async transaction => { + await user.save({ transaction }); + + const payment = await db.Payment.create( + { + amount: -total, + fee, + user_id: user.id, + hash, + rate: app.get("rates")[user.currency], + currency: user.currency, + confirmed: true, + asset: 'LNBTC', + }, + { transaction } + ); + + l.info("sent lightning", user.username, -payment.amount); + emit(user.username, "payment", payment); + emit(user.username, "user", user); + + if (payreq.payeeNodeKey === config.lnb.id) { + lna.addInvoice({ value: payreq.satoshis }, (err, invoice) => { + 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(payment); + }); + } catch (e) { + l.info("error sending lightning", e); + return res.status(500).send(e); + } +}; |
