diff options
| -rw-r--r-- | index.js | 6 | ||||
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | routes/lightning/channel.js | 39 | ||||
| -rw-r--r-- | routes/lightning/channelRequest.js | 20 | ||||
| -rw-r--r-- | routes/lightning/decode.js | 15 | ||||
| -rw-r--r-- | routes/payments.js | 3 | ||||
| -rw-r--r-- | yarn.lock | 98 |
7 files changed, 173 insertions, 9 deletions
@@ -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")); @@ -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" |
