aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2020-06-17 11:04:18 -0700
committerAdam Soltys <[email protected]>2020-06-17 11:04:18 -0700
commit139000e710e7cd5f76bc272fb8940305dc6475f1 (patch)
treeb5dd5964eb5d5e4fc02d122da8d995d2ae9947e3
parented0da89c7d98195294ced6d71812183a04e24c76 (diff)
downloadcoinos-server-139000e710e7cd5f76bc272fb8940305dc6475f1.tar.gz
coinos-server-139000e710e7cd5f76bc272fb8940305dc6475f1.zip
lnurl channel flow
-rw-r--r--index.js6
-rw-r--r--package.json1
-rw-r--r--routes/lightning/channel.js39
-rw-r--r--routes/lightning/channelRequest.js20
-rw-r--r--routes/lightning/decode.js15
-rw-r--r--routes/payments.js3
-rw-r--r--yarn.lock98
7 files changed, 173 insertions, 9 deletions
diff --git a/index.js b/index.js
index 8372f49b..ea9bf2f3 100644
--- a/index.js
+++ b/index.js
@@ -3,6 +3,7 @@ const compression = require("compression");
const cookieParser = require("cookie-parser");
const cors = require("cors");
const express = require("express");
+const lnurl = require('lnurl');
l = require("pino")();
config = require("./config");
@@ -33,9 +34,9 @@ require("./lib/rates");
require("./lib/notifications");
require("./routes/assets");
-require("./routes/info");
require("./routes/invoices");
require("./routes/payments");
+require("./routes/info");
require("./routes/users");
app.use((err, req, res, next) => {
@@ -57,3 +58,6 @@ app.use((err, req, res, next) => {
server.listen(config.port, () =>
console.log(`CoinOS Server listening on port ${config.port}`)
);
+
+lnurlServer = lnurl.createServer(config.lnurl);
+
diff --git a/package.json b/package.json
index d982b218..34493ea8 100644
--- a/package.json
+++ b/package.json
@@ -27,6 +27,7 @@
"grpc": "^1.24.2",
"http-proxy-middleware": "^0.20.0",
"jsonwebtoken": "^8.5.1",
+ "lnurl": "^0.7.0",
"long": "^4.0.0",
"mailgun-js": "^0.22.0",
"mysql2": "^2.1.0",
diff --git a/routes/lightning/channel.js b/routes/lightning/channel.js
new file mode 100644
index 00000000..c5ab6a02
--- /dev/null
+++ b/routes/lightning/channel.js
@@ -0,0 +1,39 @@
+const axios = require("axios");
+
+module.exports = async (req, res) => {
+ const { params } = req.body;
+ const [pubkey, host] = params.uri.split("@");
+
+ l.info("connecting to peer", req.user.username, pubkey, host);
+ let result;
+ try {
+ result = await lna.connectPeer({
+ addr: { pubkey, host },
+ perm: true
+ });
+ } catch (e) {
+ if (!e.message.includes('already connected')) {
+ l.error("problem connecting to peer", e.message);
+ return res.status(500).send(e.message);
+ }
+ }
+
+ const { callback, k1 } = params;
+ let remoteid;
+ try {
+ remoteid = (await lna.getInfo({})).identity_pubkey;
+ } catch(e) {
+ l.error("problem getting lightning node info", e.message);
+ return res.status(500).send(e.message);
+ }
+
+ let url = `${callback}?k1=${k1}&remoteid=${remoteid}&private=0`;
+
+ try {
+ let response = await axios.get(url);
+ res.send(response.data);
+ } catch(e) {
+ l.error("problem sending channel request", e.message);
+ return res.status(500).send({ status: "ERROR", reason: e.message });
+ }
+};
diff --git a/routes/lightning/channelRequest.js b/routes/lightning/channelRequest.js
new file mode 100644
index 00000000..9ba74009
--- /dev/null
+++ b/routes/lightning/channelRequest.js
@@ -0,0 +1,20 @@
+module.exports = async (req, res) => {
+ let { localAmt, pushAmt } = req.body;
+
+ pushAmt = 0;
+
+ try {
+ if (localAmt < 20000) throw new Error("amount must be greater than 20000 SAT");
+ if (localAmt > 1000000) throw new Error("amount must be <= 1000000");
+
+ const result = await lnurlServer.generateNewUrl("channelRequest", {
+ localAmt,
+ pushAmt
+ });
+
+ res.send(result);
+ } catch (e) {
+ l.error("problem generating channel request", e.message);
+ res.status(500).send(e.message);
+ }
+};
diff --git a/routes/lightning/decode.js b/routes/lightning/decode.js
new file mode 100644
index 00000000..b7dba120
--- /dev/null
+++ b/routes/lightning/decode.js
@@ -0,0 +1,15 @@
+const axios = require('axios');
+const lnurl = require('lnurl');
+
+module.exports = async (req, res) => {
+ let { text } = req.query;
+ const decoded = lnurl.decode(text);
+
+ try {
+ let result = await axios.get(decoded);
+ res.send(result.data);
+ } catch(e) {
+ l.error(e.message);
+ res.status(500).send(e.message);
+ }
+};
diff --git a/routes/payments.js b/routes/payments.js
index 8f731f78..1840c381 100644
--- a/routes/payments.js
+++ b/routes/payments.js
@@ -34,6 +34,9 @@ const { join } = require("path");
lnb = lnd(config.lnb);
}
+ app.get("/lightning/decode", require("./lightning/decode"));
+ app.post("/lightning/channel", auth, require("./lightning/channel"));
+ app.post("/lightning/channelRequest", auth, require("./lightning/channelRequest"));
app.post("/lightning/invoice", auth, require("./lightning/invoice"));
app.post("/lightning/query", auth, require("./lightning/query"));
app.post("/lightning/send", auth, require("./lightning/send"));
diff --git a/yarn.lock b/yarn.lock
index 34ad1fce..49ac142d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -472,6 +472,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
[email protected], async@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
+ integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
+
async@^2.6.1, async@^2.6.3, async@~2.6.1:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
@@ -479,11 +484,6 @@ async@^2.6.1, async@^2.6.3, async@~2.6.1:
dependencies:
lodash "^4.17.14"
-async@~3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
- integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
-
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -543,6 +543,11 @@ bcrypt@^3.0.6:
nan "2.14.0"
node-pre-gyp "0.14.0"
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd"
+ integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==
+
bech32@^1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
@@ -553,6 +558,11 @@ bigi@^1.1.0, bigi@^1.4.0:
resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825"
integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075"
+ integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==
+
bignumber.js@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1"
@@ -694,7 +704,7 @@ [email protected], body-parser@^1.19.0:
raw-body "2.4.0"
type-is "~1.6.17"
-bolt11@^1.2.5:
[email protected], bolt11@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/bolt11/-/bolt11-1.2.7.tgz#75852e215aeb28d6ccd6dd7c721c09d8ccb40a88"
integrity sha512-og00WBenEDUeMOVLoiWIiA0i14+tslzqhk/fJIYt5L7GWFFvY88kl0J1ib5DqMXp7mQKez4E8/XI6nrG0Rek4g==
@@ -898,6 +908,11 @@ [email protected], chalk@^3.0.0, chalk@~3.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+charenc@~0.0.1:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+ integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
+
charm@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/charm/-/charm-0.1.2.tgz#06c21eed1a1b06aeb67553cdc53e23274bac2296"
@@ -1068,6 +1083,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+ integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+
compressible@~2.0.16:
version "2.0.18"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
@@ -1199,6 +1219,11 @@ [email protected]:
dependencies:
moment-timezone "^0.5.x"
+crypt@~0.0.1:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+ integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
+
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
@@ -1532,6 +1557,11 @@ es6-promisify@^5.0.0:
dependencies:
es6-promise "^4.0.3"
+es6-promisify@^6.0.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621"
+ integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==
+
escape-goat@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
@@ -2258,6 +2288,11 @@ is-bluebird@^1.0.2:
resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2"
integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=
+is-buffer@~1.1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
is-buffer@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
@@ -2540,6 +2575,22 @@ levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
+lnurl@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/lnurl/-/lnurl-0.7.0.tgz#3f3dfb9f53975bf83e3e7d47c7d54313139bec71"
+ integrity sha512-GZdULXt+p8us9rx4mgt4HvtFfdq6lyaXypq3i9cJ39Pweg8NbxQyxYTwQiZ0pSHPI7cglMvBiXra4hIOApTD9A==
+ dependencies:
+ async "3.2.0"
+ bech32 "1.1.3"
+ bignumber.js "9.0.0"
+ bolt11 "1.2.7"
+ commander "5.1.0"
+ debug "4.1.1"
+ express "4.17.1"
+ pem "1.14.4"
+ secp256k1 "3.8.0"
+ underscore "1.10.2"
+
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@@ -2676,6 +2727,15 @@ md5.js@^1.3.4:
inherits "^2.0.1"
safe-buffer "^5.1.2"
+md5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
+ integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=
+ dependencies:
+ charenc "~0.0.1"
+ crypt "~0.0.1"
+ is-buffer "~1.1.1"
+
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -3159,7 +3219,7 @@ os-locale@^1.4.0:
dependencies:
lcid "^1.0.0"
-os-tmpdir@^1.0.0:
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
@@ -3305,6 +3365,16 @@ [email protected]:
resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
+ version "1.14.4"
+ resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.4.tgz#a68c70c6e751ccc5b3b5bcd7af78b0aec1177ff9"
+ integrity sha512-v8lH3NpirgiEmbOqhx0vwQTxwi0ExsiWBGYh0jYNq7K6mQuO4gI6UEFlr6fLAdv9TPXRt6GqiwE37puQdIDS8g==
+ dependencies:
+ es6-promisify "^6.0.0"
+ md5 "^2.2.1"
+ os-tmpdir "^1.0.1"
+ which "^2.0.2"
+
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -3874,7 +3944,7 @@ sax@^1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-secp256k1@^3.4.0:
[email protected], secp256k1@^3.4.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d"
integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==
@@ -4440,6 +4510,11 @@ undefsafe@^2.0.2:
dependencies:
debug "^2.2.0"
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf"
+ integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==
+
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
@@ -4567,6 +4642,13 @@ [email protected]:
dependencies:
isexe "^2.0.0"
+which@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
[email protected], wide-align@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"