diff options
| author | Adam Soltys <[email protected]> | 2023-01-24 12:28:49 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-01-24 12:28:49 -0800 |
| commit | 692315c0d4259a274322ca579a7b6118d033bf7a (patch) | |
| tree | 50dab3d2760130c5822b21f7293da3b34639579c /routes/lnurl.js | |
| parent | f24aec1fb7dd4080d961c26ab5216fd2dfe5d971 (diff) | |
| download | coinos-server-692315c0d4259a274322ca579a7b6118d033bf7a.tar.gz coinos-server-692315c0d4259a274322ca579a7b6118d033bf7a.zip | |
lnurl
Diffstat (limited to 'routes/lnurl.js')
| -rw-r--r-- | routes/lnurl.js | 66 |
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 }); + } +}; |
