From 24cc1b02b768b21ff013b52cb5b4e9e4a3fe4a22 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 28 Feb 2020 10:54:01 -0800 Subject: query routes and send to route --- lib/createLnrpc.js | 2 +- package.json | 2 +- payments.js | 5 +++ queryRoutes.js | 12 ++++++ sendLiquid.js | 2 +- sendPayment.js | 110 ++++++++++++++++++++++++++--------------------------- yarn.lock | 4 +- 7 files changed, 76 insertions(+), 61 deletions(-) create mode 100644 queryRoutes.js diff --git a/lib/createLnrpc.js b/lib/createLnrpc.js index 661440bb..e32f6be3 100644 --- a/lib/createLnrpc.js +++ b/lib/createLnrpc.js @@ -23,7 +23,7 @@ module.exports = async ({ server, tls, macaroon, channelpeers }) => { let fn; if (streaming) { - if (key === "sendPayment") { + if (key === "sendPayment" || key === "sendToRoute") { fn = params => method.call(lnrpc, target.meta, params); } else { fn = params => method.call(lnrpc, params, target.meta); diff --git a/package.json b/package.json index c08f1a2d..d558f398 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "grpc": "^1.23.3", "http-proxy-middleware": "^0.20.0", "jsonwebtoken": "^8.5.1", - "lnrpc": "^0.6.1", + "lnrpc": "^0.6.2", "lodash": "^4.17.13", "mailgun-js": "^0.22.0", "moment": "^2.24.0", diff --git a/payments.js b/payments.js index 9866d244..d34b53f1 100644 --- a/payments.js +++ b/payments.js @@ -9,6 +9,11 @@ module.exports = async (app, auth, addresses, bc, db, emit, seen, payments) => { require("./liquidPayments")(app, db, addresses, payments, emit); require("./lightningPayments")(app, db, lna, lnb, emit, payments); + app.post( + "/queryRoutes", + auth, + require("./queryRoutes")(app, db, emit, seen, lna, lnb) + ); app.post( "/sendPayment", auth, diff --git a/queryRoutes.js b/queryRoutes.js new file mode 100644 index 00000000..0bdd76d7 --- /dev/null +++ b/queryRoutes.js @@ -0,0 +1,12 @@ +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(payreq); + const routes = await lna.queryRoutes({ "pub_key": payreq.payeeNodeKey, "amt": payreq.satoshis }); + res.send(routes); +}; diff --git a/sendLiquid.js b/sendLiquid.js index b9261493..1008f014 100644 --- a/sendLiquid.js +++ b/sendLiquid.js @@ -59,7 +59,7 @@ module.exports = (app, db, emit) => async (req, res) => { try { if (config.liquid.walletpass) - await bc.walletPassphrase(config.bitcoin.walletpass, 300); + await bc.walletPassphrase(config.liquid.walletpass, 300); rawtx = (await bc.signRawTransactionWithWallet(hex)).hex; let txid = await bc.sendRawTransaction(rawtx); diff --git a/sendPayment.js b/sendPayment.js index ff5b9609..1bc8b99a 100644 --- a/sendPayment.js +++ b/sendPayment.js @@ -6,6 +6,7 @@ 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); + let { route } = req.body; let { user } = req; l("sending lightning", user.username, payreq.satoshis); @@ -36,60 +37,57 @@ module.exports = (app, db, emit, seen, lna, lnb) => async (req, res) => { 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); - 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 } - ); - - emit(user.username, "payment", payment); - emit(user.username, "user", 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(payment); - }); - } - }); - - stream.on("error", e => { - let msg = e.message; - - res.status(500).send(msg); - }); + 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 (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 } + ); + + emit(user.username, "payment", payment); + emit(user.username, "user", 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(payment); + }); + } catch (e) { + l(e); + return res.status(500).send(e); + } }; diff --git a/yarn.lock b/yarn.lock index f67af1b9..d2c1ce3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1925,7 +1925,7 @@ __metadata: grpc: ^1.23.3 http-proxy-middleware: ^0.20.0 jsonwebtoken: ^8.5.1 - lnrpc: ^0.6.1 + lnrpc: ^0.6.2 lodash: ^4.17.13 mailgun-js: ^0.22.0 moment: ^2.24.0 @@ -5019,7 +5019,7 @@ fsevents@~2.1.2: languageName: node linkType: hard -"lnrpc@npm:^0.6.1": +"lnrpc@npm:^0.6.2": version: 0.6.2 resolution: "lnrpc@npm:0.6.2" dependencies: -- cgit v1.2.3