aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-02-16 08:45:37 -0800
committerAdam Soltys <[email protected]>2026-02-16 08:45:37 -0800
commit20cee249905ee6975e88089b76b2eccb4019e19a (patch)
treeb8fbe28b5423aae6fef971378ac1cf1a292bab24
parenteedf7695d64e4c00af3d178484900c7c57087ac0 (diff)
downloadcoinos-server-20cee249905ee6975e88089b76b2eccb4019e19a.tar.gz
coinos-server-20cee249905ee6975e88089b76b2eccb4019e19a.zip
Prevent duplicate Ark vault accounts
Co-Authored-By: Claude Opus 4.6 <[email protected]>
-rw-r--r--routes/users.ts31
1 files changed, 15 insertions, 16 deletions
diff --git a/routes/users.ts b/routes/users.ts
index 4435ba6f..904a5bb0 100644
--- a/routes/users.ts
+++ b/routes/users.ts
@@ -844,22 +844,13 @@ export default {
}
if (account.type === PaymentType.ark) {
- const decoded = bech32m.decode(account.arkAddress, 1023);
- const data = new Uint8Array(bech32m.fromWords(decoded.words));
-
- const vtxoTaprootKey = data.slice(33, 65);
-
- const vtxoHex = Buffer.from(vtxoTaprootKey).toString("hex");
- const r = await fetch(
- `http://arkd:7070/v1/indexer/vtxos?scripts=5120${vtxoHex}&spendable_only=true`,
- { "content-type": "application/json" },
- );
- const { vtxos } = await r.json();
- if (!vtxos?.length) continue;
- account.balance = vtxos.reduce(
- (a, b) => a + Number.parseInt(b.amount),
- 0,
- );
+ const paymentIds = await db.lRange(`${id}:payments`, 0, -1);
+ let sum = 0;
+ for (const pid of paymentIds) {
+ const pay = await g(`payment:${pid}`);
+ if (pay) sum += pay.amount;
+ }
+ account.balance = Math.max(sum, 0);
}
}
@@ -897,6 +888,14 @@ export default {
// ARK accounts don't need Bitcoin Core wallet setup
if (type === "ark") {
+ const accountIds = await db.lRange(`${user.id}:accounts`, 0, -1);
+ for (const accId of accountIds) {
+ const acc = await g(`account:${accId}`);
+ if (acc?.type === "ark") {
+ bail(res, "You already have an Ark vault");
+ return;
+ }
+ }
const m = db.multi()
.set(`account:${id}`, JSON.stringify(account))
.lPush(`${user.id}:accounts`, id);