From fa7f2b9d87581f7c07dee6c64b8a01e3697de355 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 12:33:29 +0200 Subject: [PATCH] calculateBalance: If we redeem a link, make sure we do not consider its amount as blocked when calculating the balance --- backend/src/util/validate.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index 95e1bf699..5d2f39aa0 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -4,6 +4,7 @@ import { Transaction } from '@entity/Transaction' import { Decay } from '@model/Decay' import { getCustomRepository } from '@dbTools/typeorm' import { TransactionLinkRepository } from '@repository/TransactionLink' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' function isStringBoolean(value: string): boolean { const lowerValue = value.toLowerCase() @@ -21,6 +22,7 @@ async function calculateBalance( userId: number, amount: Decimal, time: Date, + transactionLink?: dbTransactionLink | null, ): Promise<{ balance: Decimal; decay: Decay; lastTransactionId: number } | null> { const lastTransaction = await Transaction.findOne({ userId }, { order: { balanceDate: 'DESC' } }) if (!lastTransaction) return null @@ -32,7 +34,13 @@ async function calculateBalance( const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(userId, time) - if (balance.minus(sumHoldAvailableAmount.toString()).lessThan(0)) { + // If we want to redeem a link we need to make sure that the link amount is not calculated as blocked + // else we cannot redeem links which are more or equal to half of what an account actually owns + const sumHoldAvailableAmountMinusTransactionLink = transactionLink + ? sumHoldAvailableAmount.minus(transactionLink.amount.toString()) + : sumHoldAvailableAmount + + if (balance.minus(sumHoldAvailableAmountMinusTransactionLink.toString()).lessThan(0)) { return null } return { balance, lastTransactionId: lastTransaction.id, decay }