aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2025-03-15 21:28:15 -0700
committerAdam Soltys <[email protected]>2025-03-15 21:28:15 -0700
commit1629a9ea8542324b93b9918da6620966fe8af36a (patch)
treef3280b0c01c7bd4133e36c6cc1d84207c71597a6
parent32f51142a734136803f134524eb2b90fdc71c302 (diff)
downloadcoinos-server-1629a9ea8542324b93b9918da6620966fe8af36a.tar.gz
coinos-server-1629a9ea8542324b93b9918da6620966fe8af36a.zip
fund routes
-rw-r--r--index.ts6
-rw-r--r--routes/lnurl.ts94
-rw-r--r--routes/payments.ts69
3 files changed, 106 insertions, 63 deletions
diff --git a/index.ts b/index.ts
index 8f45adad..db9d1cec 100644
--- a/index.ts
+++ b/index.ts
@@ -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 },