aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2020-07-12 06:53:34 -0700
committerAdam Soltys <[email protected]>2020-07-12 06:53:34 -0700
commit9cbe98b5c16262f14c06c2b2aaeabed8c42c7231 (patch)
treea8a77b48f8c018e2e65590141321eeb41f275b35
parent5e0129aee69c527157786bc20a0b793080553e79 (diff)
downloadcoinos-server-9cbe98b5c16262f14c06c2b2aaeabed8c42c7231.tar.gz
coinos-server-9cbe98b5c16262f14c06c2b2aaeabed8c42c7231.zip
wrap on-chain payment receive code in a db transaction
-rw-r--r--routes/bitcoin/receive.js10
-rw-r--r--routes/liquid/receive.js10
2 files changed, 14 insertions, 6 deletions
diff --git a/routes/bitcoin/receive.js b/routes/bitcoin/receive.js
index 0593584e..630da221 100644
--- a/routes/bitcoin/receive.js
+++ b/routes/bitcoin/receive.js
@@ -133,6 +133,7 @@ setInterval(async () => {
for (let i = 0; i < arr.length; i++) {
const hash = arr[i];
+ await db.transaction(async (transaction) => {
const p = await db.Payment.findOne({
where: { hash, confirmed: 0, received: 1 },
include: [
@@ -144,7 +145,9 @@ setInterval(async () => {
model: db.User,
as: "user"
}
- ]
+ ],
+ lock: transaction.LOCK.UPDATE,
+ transaction,
});
const { user } = p;
@@ -156,8 +159,8 @@ setInterval(async () => {
p.account.balance += total;
p.account.pending -= Math.min(p.account.pending, total);
- await p.account.save();
- await p.save();
+ await p.account.save({ transaction });
+ await p.save({ transaction });
emit(user.username, "account", p.account);
emit(user.username, "payment", p);
@@ -168,6 +171,7 @@ setInterval(async () => {
}
delete queue[hash];
+ });
}
} catch (e) {
l.error("problem processing queued bitcoin transaction", e.message);
diff --git a/routes/liquid/receive.js b/routes/liquid/receive.js
index 9a97aa47..2aadb43e 100644
--- a/routes/liquid/receive.js
+++ b/routes/liquid/receive.js
@@ -215,6 +215,7 @@ setInterval(async () => {
for (let i = 0; i < arr.length; i++) {
const hash = arr[i];
+ await db.transaction(async (transaction) => {
const p = await db.Payment.findOne({
where: { hash, confirmed: 0, received: 1 },
include: [
@@ -226,7 +227,9 @@ setInterval(async () => {
model: db.User,
as: "user"
}
- ]
+ ],
+ lock: transaction.LOCK.UPDATE,
+ transaction,
});
const { user } = p;
@@ -237,8 +240,8 @@ setInterval(async () => {
p.account.balance += total;
p.account.pending -= Math.min(p.account.pending, total);
- await p.account.save();
- await p.save();
+ await p.account.save({ transaction });
+ await p.save({ transaction });
emit(user.username, "account", p.account);
emit(user.username, "payment", p);
@@ -256,6 +259,7 @@ setInterval(async () => {
}
delete queue[hash];
+ });
}
} catch (e) {
l.error("problem processing queued liquid transaction", e.message);