From 9cbe98b5c16262f14c06c2b2aaeabed8c42c7231 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sun, 12 Jul 2020 06:53:34 -0700 Subject: wrap on-chain payment receive code in a db transaction --- routes/bitcoin/receive.js | 10 +++++++--- routes/liquid/receive.js | 10 +++++++--- 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); -- cgit v1.2.3