aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/lnd.js36
-rw-r--r--package.json1
-rw-r--r--routes/payments.js2
-rw-r--r--yarn.lock14
4 files changed, 51 insertions, 2 deletions
diff --git a/lib/lnd.js b/lib/lnd.js
new file mode 100644
index 00000000..c6caf3be
--- /dev/null
+++ b/lib/lnd.js
@@ -0,0 +1,36 @@
+const fs = require('fs');
+const path = require('path');
+const grpc = require('@grpc/grpc-js');
+const protoLoader = require('@grpc/proto-loader');
+const { promisify } = require('util');
+
+
+module.exports = ({ tls, macaroon, server }) => {
+ const packageDefinition = protoLoader.loadSync('config/rpc.proto', {
+ keepCase: true,
+ longs: String,
+ enums: String,
+ defaults: true,
+ oneofs: true
+ });
+ const lnrpc = grpc.loadPackageDefinition(packageDefinition).lnrpc;
+ process.env.GRPC_SSL_CIPHER_SUITES = 'HIGH+ECDSA'
+ const lndCert = fs.readFileSync(tls);
+ const sslCreds = grpc.credentials.createSsl(lndCert);
+ const macaroonCreds = grpc.credentials.createFromMetadataGenerator(function(args, callback) {
+ const macaroonFile = fs.readFileSync(macaroon).toString('hex');
+ const metadata = new grpc.Metadata()
+ metadata.add('macaroon', macaroonFile);
+ callback(null, metadata);
+ });
+ const creds = grpc.credentials.combineChannelCredentials(sslCreds, macaroonCreds);
+ const lnd = new lnrpc.Lightning(server, creds);
+
+ return new Proxy(lnd, {
+ get(target, key) {
+ const method = target[key];
+ if (typeof method === 'function' && !key.startsWith('sub')) return promisify(method);
+ return target[key];
+ },
+ });
+}
diff --git a/package.json b/package.json
index d1d126bd..909ce5de 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
"dependencies": {
"@asoltys/bitcoin-core": "^3.0.7",
"@asoltys/liquidjs-lib": "^5.1.38",
+ "@grpc/grpc-js": "^1.3.6",
"@grpc/proto-loader": "^0.5.3",
"async-mutex": "^0.2.4",
"axios": "^0.21.1",
diff --git a/routes/payments.js b/routes/payments.js
index a749e333..a171b92f 100644
--- a/routes/payments.js
+++ b/routes/payments.js
@@ -96,7 +96,7 @@ ah(async () => {
if (config.lna.clightning) {
lna = require("clightning-client")(config.lna.dir);
} else {
- throw new Error("lnd not supported");
+ lna = lnd(config.lna);
}
app.post("/lightning/channel", require("./lightning/channel"));
diff --git a/yarn.lock b/yarn.lock
index d8cfa79c..ebe8c6f2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -70,6 +70,13 @@
"@types/node" "^13.9.2"
long "^4.0.0"
+"@grpc/grpc-js@^1.3.6":
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.6.tgz#6e2d17610c2c8df0f6ceab0e1968f563df74b173"
+ integrity sha512-v7+LQFbqZKmd/Tvf5/j1Xlbq6jXL/4d+gUtm2TNX4QiEC3ELWADmGr2dGlUyLl6aKTuYfsN72vAsO5zmavYkEg==
+ dependencies:
+ "@types/node" ">=12.12.47"
+
"@grpc/proto-loader@^0.5.3":
version "0.5.6"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.6.tgz#1dea4b8a6412b05e2d58514d507137b63a52a98d"
@@ -320,6 +327,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a"
integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==
+"@types/node@>=12.12.47":
+ version "16.4.10"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.10.tgz#e57e2a54fc6da58da94b3571b1cb456d39f88597"
+ integrity sha512-TmVHsm43br64js9BqHWqiDZA+xMtbUpI1MBIA0EyiBmoV9pcEYFOSdj5fr6enZNfh4fChh+AGOLIzGwJnkshyQ==
+
"@types/node@^13.9.2":
version "13.13.52"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.52.tgz#03c13be70b9031baaed79481c0c0cfb0045e53f7"
@@ -644,7 +656,7 @@ bip174@^2.0.1:
resolved "https://registry.yarnpkg.com/bip174/-/bip174-2.0.1.tgz#39cf8ca99e50ce538fb762589832f4481d07c254"
integrity sha512-i3X26uKJOkDTAalYAp0Er+qGMDhrbbh2o93/xiPyAN2s25KrClSpe3VXo/7mNJoqA5qfko8rLS2l3RWZgYmjKQ==
-"bip174@github:vulpemventures/bip174":
+bip174@vulpemventures/bip174.git:
version "1.0.3"
resolved "https://codeload.github.com/vulpemventures/bip174/tar.gz/b6d0ffe54e0dfa72e971b68372f89b25f7602502"