aboutsummaryrefslogtreecommitdiffstats
path: root/bitcoinPayments.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2019-10-14 23:41:20 -0700
committerAdam Soltys <[email protected]>2019-10-14 23:41:20 -0700
commita3ae613d7e2cde43096dcd80f8a1e04a7fb2512f (patch)
treeb6a78851f106c9cf4849f140e5954da511588086 /bitcoinPayments.js
parent7c77d82d6bb52662b98461c67b7240182ded8002 (diff)
downloadcoinos-server-a3ae613d7e2cde43096dcd80f8a1e04a7fb2512f.tar.gz
coinos-server-a3ae613d7e2cde43096dcd80f8a1e04a7fb2512f.zip
use database transaction when updating balance on block receipt
Diffstat (limited to 'bitcoinPayments.js')
-rw-r--r--bitcoinPayments.js44
1 files changed, 29 insertions, 15 deletions
diff --git a/bitcoinPayments.js b/bitcoinPayments.js
index 479298b8..b3d54a21 100644
--- a/bitcoinPayments.js
+++ b/bitcoinPayments.js
@@ -103,26 +103,40 @@ module.exports = (app, bc, db, addresses, payments, emit) => {
let block = bitcoin.Block.fromHex(message);
l("block", block.getHash().toString("hex"));
- const processPayment = async p => {
- if ((await bc.getRawTransaction(p.hash, true)).confirmations > 0) {
- let user = await db.User.findByPk(p.user_id);
- l(user.pending);
- p.confirmed = true;
- user.balance += p.amount;
- user.pending -= p.amount;
- await user.save();
- await p.save();
+ const processPayment = async (payment, transaction) => {
+ if (
+ (await bc.getRawTransaction(payment.hash, true)).confirmations > 0
+ ) {
+ let user = await db.User.findByPk(payment.user_id, { transaction });
+ payment.confirmed = true;
+ user.balance += payment.amount;
+ user.pending -= payment.amount;
+ await user.save({ transaction });
+ await payment.save({ transaction });
emit(user.username, "user", user);
emit(user.username, "block", message);
}
};
- await db.Payment.findAll({
- where: { confirmed: false }
- }).reduce(async (prev, payment) => {
- const result = await prev;
- return [...result, await processPayment(payment)];
- }, Promise.resolve([]));
+ const transaction = await db.transaction();
+ try {
+ const payments = await db.Payment.findAll({
+ where: { confirmed: false },
+ lock: transaction.LOCK.UPDATE,
+ transaction
+ });
+
+ await Promise.all(
+ payments.map(async payment => {
+ await processPayment(payment, transaction);
+ return;
+ })
+ );
+ } catch (e) {
+ transaction.rollback();
+ }
+
+ await transaction.commit();
break;
}