aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-02-13 23:47:26 -0800
committerAdam Soltys <[email protected]>2026-02-13 23:47:26 -0800
commitddbe2e8afa46f3c8906b0abe0683998f85ab2e68 (patch)
tree4f364934ee893494a5e08572c867c247f34b0374
parentc7c6ee7ba59467b8ddcfe8196b4f7586a864f3c0 (diff)
downloadcoinos-server-ddbe2e8afa46f3c8906b0abe0683998f85ab2e68.tar.gz
coinos-server-ddbe2e8afa46f3c8906b0abe0683998f85ab2e68.zip
ark payment notifications
-rw-r--r--lib/payments.ts23
-rw-r--r--routes/payments.ts34
-rw-r--r--routes/users.ts8
3 files changed, 55 insertions, 10 deletions
diff --git a/lib/payments.ts b/lib/payments.ts
index e1254bad..d5819e30 100644
--- a/lib/payments.ts
+++ b/lib/payments.ts
@@ -520,16 +520,29 @@ const pay = async ({ aid = undefined, amount, to, user }) => {
});
if (to.startsWith("ark") || to.startsWith("tark")) {
- const fee = Math.max(5, Math.round(amount * 0.02));
- amount -= fee;
const txid = await sendArk(to, amount);
- return debit({
+ const p = await debit({
hash: txid,
- amount: amount + fee,
- fee,
+ amount,
user,
type: PaymentType.ark,
});
+
+ const vault = await g(`arkaddr:${to}`);
+ if (vault) {
+ const { rate, currency } = await getUserRate(user);
+ await createArkPayment({
+ aid: vault.aid,
+ uid: vault.uid,
+ amount,
+ hash: txid,
+ rate,
+ currency,
+ extraHashMappings: [txid],
+ });
+ }
+
+ return p;
}
let fee;
diff --git a/routes/payments.ts b/routes/payments.ts
index 52e9057e..13e3cb29 100644
--- a/routes/payments.ts
+++ b/routes/payments.ts
@@ -773,6 +773,7 @@ export default {
try {
await requirePin({ body, user });
+
const txid = await sendArk(address, amount);
const hash = txid;
@@ -784,6 +785,20 @@ export default {
aid,
});
+ const vault = await g(`arkaddr:${address}`);
+ if (vault) {
+ const { rate, currency } = await getUserRate(user);
+ await createArkPayment({
+ aid: vault.aid,
+ uid: vault.uid,
+ amount,
+ hash,
+ rate,
+ currency,
+ extraHashMappings: [hash],
+ });
+ }
+
res.send(p);
} catch (e) {
warn(user.username, "ark payment failed", e.message);
@@ -947,7 +962,24 @@ export default {
payments.push(p);
synced++;
- if (tx.amount > 0) received += tx.amount;
+ if (tx.amount > 0) {
+ received += tx.amount;
+
+ // Find an unpaid ark invoice for this account and mark it received
+ const invoiceIds = await db.lRange(`${aid}:invoices`, 0, 20);
+ for (const iid of invoiceIds) {
+ const inv = await getInvoice(iid);
+ if (!inv || inv.type !== "ark") continue;
+ if (inv.received >= inv.amount && inv.amount > 0) continue;
+ if (inv.amount > 0 && tx.amount < inv.amount) continue;
+ inv.received += tx.amount;
+ p.iid = iid;
+ await s(`invoice:${iid}`, inv);
+ await s(`payment:${p.id}`, p);
+ emit(uid, "payment", p);
+ break;
+ }
+ }
}
res.send({ synced, received, payments });
diff --git a/routes/users.ts b/routes/users.ts
index d1df6e5d..cf958927 100644
--- a/routes/users.ts
+++ b/routes/users.ts
@@ -897,11 +897,11 @@ export default {
// ARK accounts don't need Bitcoin Core wallet setup
if (type === "ark") {
- await db
- .multi()
+ const m = db.multi()
.set(`account:${id}`, JSON.stringify(account))
- .lPush(`${user.id}:accounts`, id)
- .exec();
+ .lPush(`${user.id}:accounts`, id);
+ if (arkAddress) m.set(`arkaddr:${arkAddress}`, JSON.stringify({ aid: id, uid }));
+ await m.exec();
res.send(account);
return;