summaryrefslogtreecommitdiff
path: root/src/auditor/taler-helper-auditor-coins.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2022-07-04 23:25:51 +0200
committerChristian Grothoff <christian@grothoff.org>2022-07-04 23:25:51 +0200
commite68206b1f9725a82b38225025c4693580d6aad10 (patch)
treee69621826621ca73b32885f7030da31044bb7b24 /src/auditor/taler-helper-auditor-coins.c
parent84c78612f3bdf24b42984451352af146da4576c2 (diff)
downloadexchange-e68206b1f9725a82b38225025c4693580d6aad10.tar.gz
exchange-e68206b1f9725a82b38225025c4693580d6aad10.tar.bz2
exchange-e68206b1f9725a82b38225025c4693580d6aad10.zip
-deduplicate logic
Diffstat (limited to 'src/auditor/taler-helper-auditor-coins.c')
-rw-r--r--src/auditor/taler-helper-auditor-coins.c199
1 files changed, 68 insertions, 131 deletions
diff --git a/src/auditor/taler-helper-auditor-coins.c b/src/auditor/taler-helper-auditor-coins.c
index 6940369f9..20c9b2ed1 100644
--- a/src/auditor/taler-helper-auditor-coins.c
+++ b/src/auditor/taler-helper-auditor-coins.c
@@ -1198,6 +1198,65 @@ check_known_coin (
/**
+ * Update the denom balance in @a dso reducing it by
+ * @a amount_with_fee. If this is not possible, report
+ * an emergency. Also updates the #total_escrow_balance.
+ *
+ * @param dso denomination summary to update
+ * @param rowid responsible row (for logging)
+ * @param amount_with_fee amount to subtract
+ */
+static void
+reduce_denom_balance (struct DenominationSummary *dso,
+ uint64_t rowid,
+ const struct TALER_Amount *amount_with_fee)
+{
+ struct TALER_Amount tmp;
+
+ if (TALER_ARL_SR_INVALID_NEGATIVE ==
+ TALER_ARL_amount_subtract_neg (&tmp,
+ &dso->denom_balance,
+ amount_with_fee))
+ {
+ TALER_ARL_amount_add (&dso->denom_loss,
+ &dso->denom_loss,
+ amount_with_fee);
+ dso->report_emergency = true;
+ }
+ else
+ {
+ dso->denom_balance = tmp;
+ }
+ if (-1 == TALER_amount_cmp (&total_escrow_balance,
+ amount_with_fee))
+ {
+ /* This can theoretically happen if for example the exchange
+ never issued any coins (i.e. escrow balance is zero), but
+ accepted a forged coin (i.e. emergency situation after
+ private key compromise). In that case, we cannot even
+ subtract the profit we make from the fee from the escrow
+ balance. Tested as part of test-auditor.sh, case #18 */
+ report_amount_arithmetic_inconsistency (
+ "subtracting amount from escrow balance",
+ rowid,
+ &total_escrow_balance,
+ amount_with_fee,
+ 0);
+ }
+ else
+ {
+ TALER_ARL_amount_subtract (&total_escrow_balance,
+ &total_escrow_balance,
+ amount_with_fee);
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "New balance of denomination `%s' is %s\n",
+ GNUNET_h2s (&dso->issue->denom_hash.hash),
+ TALER_amount2s (&dso->denom_balance));
+}
+
+
+/**
* Function called with details about coins that were melted, with the
* goal of auditing the refresh's execution. Verifies the signature
* and updates our information about coins outstanding (the old coin's
@@ -1230,7 +1289,6 @@ refresh_session_cb (void *cls,
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
struct DenominationSummary *dso;
struct TALER_Amount amount_without_fee;
- struct TALER_Amount tmp;
enum GNUNET_DB_QueryStatus qs;
(void) noreveal_index;
@@ -1462,47 +1520,9 @@ refresh_session_cb (void *cls,
}
else
{
- // FIXME: refactor: repeated logic!
- if (TALER_ARL_SR_INVALID_NEGATIVE ==
- TALER_ARL_amount_subtract_neg (&tmp,
- &dso->denom_balance,
- amount_with_fee))
- {
- TALER_ARL_amount_add (&dso->denom_loss,
- &dso->denom_loss,
- amount_with_fee);
- dso->report_emergency = true;
- }
- else
- {
- dso->denom_balance = tmp;
- }
- if (-1 == TALER_amount_cmp (&total_escrow_balance,
- amount_with_fee))
- {
- /* This can theoretically happen if for example the exchange
- never issued any coins (i.e. escrow balance is zero), but
- accepted a forged coin (i.e. emergency situation after
- private key compromise). In that case, we cannot even
- subtract the profit we make from the fee from the escrow
- balance. Tested as part of test-auditor.sh, case #18 */
- report_amount_arithmetic_inconsistency (
- "subtracting refresh fee from escrow balance",
- rowid,
- &total_escrow_balance,
- amount_with_fee,
- 0);
- }
- else
- {
- TALER_ARL_amount_subtract (&total_escrow_balance,
- &total_escrow_balance,
- amount_with_fee);
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "New balance of denomination `%s' after melt is %s\n",
- GNUNET_h2s (&issue->denom_hash.hash),
- TALER_amount2s (&dso->denom_balance));
+ reduce_denom_balance (dso,
+ rowid,
+ amount_with_fee);
}
/* update global melt fees */
@@ -1648,51 +1668,9 @@ deposit_cb (void *cls,
}
else
{
- struct TALER_Amount tmp;
-
- // FIXME: refactor: repeated logic!
- if (TALER_ARL_SR_INVALID_NEGATIVE ==
- TALER_ARL_amount_subtract_neg (&tmp,
- &ds->denom_balance,
- &deposit->amount_with_fee))
- {
- TALER_ARL_amount_add (&ds->denom_loss,
- &ds->denom_loss,
- &deposit->amount_with_fee);
- ds->report_emergency = true;
- }
- else
- {
- ds->denom_balance = tmp;
- }
-
- if (-1 == TALER_amount_cmp (&total_escrow_balance,
- &deposit->amount_with_fee))
- {
- /* This can theoretically happen if for example the exchange
- never issued any coins (i.e. escrow balance is zero), but
- accepted a forged coin (i.e. emergency situation after
- private key compromise). In that case, we cannot even
- subtract the profit we make from the fee from the escrow
- balance. Tested as part of test-auditor.sh, case #18 */
- report_amount_arithmetic_inconsistency (
- "subtracting deposit fee from escrow balance",
- rowid,
- &total_escrow_balance,
- &deposit->amount_with_fee,
- 0);
- }
- else
- {
- TALER_ARL_amount_subtract (&total_escrow_balance,
- &total_escrow_balance,
- &deposit->amount_with_fee);
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "New balance of denomination `%s' after deposit is %s\n",
- GNUNET_h2s (&issue->denom_hash.hash),
- TALER_amount2s (&ds->denom_balance));
+ reduce_denom_balance (ds,
+ rowid,
+ &deposit->amount_with_fee);
}
/* update global deposit fees */
@@ -2449,50 +2427,9 @@ purse_deposit_cb (
}
else
{
- struct TALER_Amount tmp;
-
- // FIXME: refactor: repeated logic!
- if (TALER_ARL_SR_INVALID_NEGATIVE ==
- TALER_ARL_amount_subtract_neg (&tmp,
- &ds->denom_balance,
- &deposit->amount))
- {
- TALER_ARL_amount_add (&ds->denom_loss,
- &ds->denom_loss,
- &deposit->amount);
- ds->report_emergency = true;
- }
- else
- {
- ds->denom_balance = tmp;
- }
- if (-1 == TALER_amount_cmp (&total_escrow_balance,
- &deposit->amount))
- {
- /* This can theoretically happen if for example the exchange
- never issued any coins (i.e. escrow balance is zero), but
- accepted a forged coin (i.e. emergency situation after
- private key compromise). In that case, we cannot even
- subtract the profit we make from the fee from the escrow
- balance. Tested as part of test-auditor.sh, case #18 */
- report_amount_arithmetic_inconsistency (
- "subtracting purse deposit fee from escrow balance",
- rowid,
- &total_escrow_balance,
- &deposit->amount,
- 0);
- }
- else
- {
- TALER_ARL_amount_subtract (&total_escrow_balance,
- &total_escrow_balance,
- &deposit->amount);
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "New balance of denomination `%s' after purse deposit is %s\n",
- GNUNET_h2s (&issue->denom_hash.hash),
- TALER_amount2s (&ds->denom_balance));
+ reduce_denom_balance (ds,
+ rowid,
+ &deposit->amount);
}
/* update global deposit fees */