aboutsummaryrefslogtreecommitdiffstats
path: root/routes/lnurl.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-01-24 12:28:49 -0800
committerAdam Soltys <[email protected]>2023-01-24 12:28:49 -0800
commit692315c0d4259a274322ca579a7b6118d033bf7a (patch)
tree50dab3d2760130c5822b21f7293da3b34639579c /routes/lnurl.js
parentf24aec1fb7dd4080d961c26ab5216fd2dfe5d971 (diff)
downloadcoinos-server-692315c0d4259a274322ca579a7b6118d033bf7a.tar.gz
coinos-server-692315c0d4259a274322ca579a7b6118d033bf7a.zip
lnurl
Diffstat (limited to 'routes/lnurl.js')
-rw-r--r--routes/lnurl.js66
1 files changed, 66 insertions, 0 deletions
diff --git a/routes/lnurl.js b/routes/lnurl.js
new file mode 100644
index 00000000..cb1b75c5
--- /dev/null
+++ b/routes/lnurl.js
@@ -0,0 +1,66 @@
+import { g, s } from "$lib/db";
+import { l } from "$lib/logging";
+import { fail } from "$lib/utils";
+import { v4 } from "uuid";
+import got from "got";
+import { invoice } from "$lib/invoices";
+import { bech32 } from "bech32";
+
+export default {
+ async encode({ query: { address } }, res) {
+ let [name, domain] = address.split("@");
+ let url = `https://${domain}/.well-known/lnurlp/${name}`;
+ let r = await got(url).json();
+ if (r.tag !== "payRequest") fail("not an ln address");
+ let enc = bech32.encode("lnurl", bech32.toWords(Buffer.from(url)), 20000);
+ res.send(enc);
+ },
+
+ async decode({ query: { text } }, res) {
+ let url = Buffer.from(
+ bech32.fromWords(bech32.decode(text, 20000).words)
+ ).toString();
+
+ res.send(await got(url).json());
+ },
+
+ async lnurlp({ params: { username } }, res) {
+ let uid = await g(`user:${username}`);
+ if (!uid) fail("user not found");
+
+ let id = v4();
+ await s(`lnurl:${id}`, uid);
+ let { URL } = process.env;
+ let host = URL.split("/").at(-1);
+
+ res.send({
+ metadata: [
+ ["text/plain", `Paying ${username}@${host}`],
+ ["text/identifier", `${username}@${host}`]
+ ],
+ callback: `${URL}/lnurl/${id}`,
+ tag: "payRequest"
+ });
+ },
+
+ async lnurl({ params: { id }, query: { amount } }, res) {
+ let pr = await g(`lnurlp:${id}`);
+
+ if (!pr) {
+ let uid = await g(`lnurl:${id}`);
+ let user = await g(`user:${uid}`);
+
+ ({ text: pr } = await invoice({
+ invoice: {
+ amount,
+ type: types.lightning
+ },
+ user
+ }));
+
+ await s(`lnurlp:${id}`, pr);
+ }
+
+ res.send({ pr });
+ }
+};