diff options
| author | Adam Soltys <[email protected]> | 2020-07-12 06:53:34 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-07-12 06:53:34 -0700 |
| commit | 9cbe98b5c16262f14c06c2b2aaeabed8c42c7231 (patch) | |
| tree | a8a77b48f8c018e2e65590141321eeb41f275b35 | |
| parent | 5e0129aee69c527157786bc20a0b793080553e79 (diff) | |
| download | coinos-server-9cbe98b5c16262f14c06c2b2aaeabed8c42c7231.tar.gz coinos-server-9cbe98b5c16262f14c06c2b2aaeabed8c42c7231.zip | |
wrap on-chain payment receive code in a db transaction
| -rw-r--r-- | routes/bitcoin/receive.js | 10 | ||||
| -rw-r--r-- | 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); |
