diff options
| author | Adam Soltys <[email protected]> | 2025-03-15 21:28:15 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2025-03-15 21:28:15 -0700 |
| commit | 1629a9ea8542324b93b9918da6620966fe8af36a (patch) | |
| tree | f3280b0c01c7bd4133e36c6cc1d84207c71597a6 | |
| parent | 32f51142a734136803f134524eb2b90fdc71c302 (diff) | |
| download | coinos-server-1629a9ea8542324b93b9918da6620966fe8af36a.tar.gz coinos-server-1629a9ea8542324b93b9918da6620966fe8af36a.zip | |
fund routes
| -rw-r--r-- | index.ts | 6 | ||||
| -rw-r--r-- | routes/lnurl.ts | 94 | ||||
| -rw-r--r-- | routes/payments.ts | 69 |
3 files changed, 106 insertions, 63 deletions
@@ -70,7 +70,9 @@ app.get("/payments", auth, payments.list); app.get("/payments/:hash", payments.get); app.post("/parse", auth, payments.parse); app.get("/fund/:name", payments.fund); -app.get("/fund/:name/withdraw", payments.withdraw); +// app.get("/fund/:name/withdraw", auth, payments.withdraw); +app.get("/fund/:name/managers", payments.managers); +app.post("/fund/managers", auth, payments.addManager); app.post("/take", auth, payments.take); app.post("/print", auth, payments.print); app.post("/send/:lnaddress/:amount", auth, payments.lnaddress); @@ -85,7 +87,7 @@ app.get("/decode", lnurl.decode); app.get("/lnurl/verify/:id", lnurl.verify); app.get("/lnurlp/:username", lnurl.lnurlp); app.get("/lnurl/:id", lnurl.lnurl); -app.get("/lnurlw", lnurl.withdraw); +// app.get("/lnurlw", lnurl.withdraw); app.post("/freeze", payments.freeze); diff --git a/routes/lnurl.ts b/routes/lnurl.ts index c1270dd4..9f247267 100644 --- a/routes/lnurl.ts +++ b/routes/lnurl.ts @@ -149,51 +149,51 @@ export default { res.send({ pr: hash, status: "OK", settled, preimage: preimage || null }); }, - async withdraw(req, res) { - try { - const { pr, k1: id } = req.query; - const invoice = await getInvoice(pr); - const { amount_msat } = await ln.decode(pr); - const amount = Math.ceil(amount_msat / 1000); - await db.debit(`fund:${id}`, "", amount, 0, 0, 0); - let p; - if (invoice) { - const { hash } = invoice; - p = await credit({ - hash, - amount, - memo: id, - ref: id, - type: PaymentType.fund, - }); - } else { - await ln.xpay({ - invstring: pr.replace(/\s/g, "").toLowerCase(), - maxfee: 0, - retry_for: 10, - }); - const rates = await g("rates"); - p = { - id: v4(), - amount: -amount, - hash: pr, - confirmed: true, - rate: rates.USD, - currency: "USD", - type: PaymentType.fund, - ref: id, - created: Date.now(), - }; - await s(`payment:${p.id}`, p); - await s(`payment:${pr}`, p); - } - - await db.lPush(`fund:${id}:payments`, p.id); - res.send({ status: "OK" }); - } catch (e) { - console.log(e); - warn("lnurlw failed", e.message); - res.send({ status: "ERROR", reason: "Withdrawal failed" }); - } - }, + // async withdraw(req, res) { + // try { + // const { pr, k1: id } = req.query; + // const invoice = await getInvoice(pr); + // const { amount_msat } = await ln.decode(pr); + // const amount = Math.ceil(amount_msat / 1000); + // await db.debit(`fund:${id}`, "", amount, 0, 0, 0); + // let p; + // if (invoice) { + // const { hash } = invoice; + // p = await credit({ + // hash, + // amount, + // memo: id, + // ref: id, + // type: PaymentType.fund, + // }); + // } else { + // await ln.xpay({ + // invstring: pr.replace(/\s/g, "").toLowerCase(), + // maxfee: 0, + // retry_for: 10, + // }); + // const rates = await g("rates"); + // p = { + // id: v4(), + // amount: -amount, + // hash: pr, + // confirmed: true, + // rate: rates.USD, + // currency: "USD", + // type: PaymentType.fund, + // ref: id, + // created: Date.now(), + // }; + // await s(`payment:${p.id}`, p); + // await s(`payment:${pr}`, p); + // } + // + // await db.lPush(`fund:${id}:payments`, p.id); + // res.send({ status: "OK" }); + // } catch (e) { + // console.log(e); + // warn("lnurlw failed", e.message); + // res.send({ status: "ERROR", reason: "Withdrawal failed" }); + // } + // }, }; diff --git a/routes/payments.ts b/routes/payments.ts index ec342dc4..dd41b730 100644 --- a/routes/payments.ts +++ b/routes/payments.ts @@ -243,20 +243,23 @@ export default { res.send({ amount, payments }); }, - async withdraw(req, res) { - const { - params: { name }, - } = req; - const balance = await g(`fund:${name}`); - res.send({ - tag: "withdrawRequest", - callback: `${URL}/api/lnurlw`, - k1: name, - defaultDescription: `Withdraw from coinos fund ${name}`, - minWithdrawable: balance > 0 ? 1000 : 0, - maxWithdrawable: balance * 1000, - }); - }, + // async withdraw(req, res) { + // const { + // params: { name }, + // } = req; + // const { user } = req; + // const balance = await g(`fund:${name}`); + // const managers = await db.sMembers(`fund:${name}:managers`); + // if (managers.length && !managers.includes(user.id)) fail("Unauthorized"); + // res.send({ + // tag: "withdrawRequest", + // callback: `${URL}/api/lnurlw`, + // k1: name, + // defaultDescription: `Withdraw from coinos fund ${name}`, + // minWithdrawable: balance > 0 ? 1000 : 0, + // maxWithdrawable: balance * 1000, + // }); + // }, async take(req, res) { let { @@ -308,6 +311,44 @@ export default { } }, + async managers(req, res) { + const { name } = req.params; + + const ids = await db.sMembers(`fund:${name}:managers`); + + const managers = await Promise.all( + ids.map(async (id) => await getUser(id)), + ); + + res.send(managers); + }, + + async addManager(req, res) { + const { id, username } = req.body; + const { user } = req; + + const k = `fund:${id}:managers`; + + let managers = await db.sMembers(k); + if (managers.length) { + if (!managers.includes(user.id)) fail("Unauthorized"); + } else { + await db.sAdd(k, user.id); + } + + const u = await getUser(username); + if (!u) fail("User not found"); + const { id: uid } = u; + + await db.sAdd(k, uid); + + const ids = await db.sMembers(k); + if (!managers.length) + managers = await Promise.all(ids.map(async (id) => await getUser(id))); + + res.send(managers); + }, + async confirm(req, res) { const { body: { txid, wallet, type }, |
