exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit daf1c9adbf4b9785926a93ad3ee477f71792e2d9
parent ab36fb1f5795be052fd8d986a6a3075934459e93
Author: Christian Grothoff <christian@grothoff.org>
Date:   Wed, 18 Mar 2026 14:17:20 +0100

process increments before decrements to avoid false-positives

Diffstat:
Msrc/auditor/taler-helper-auditor-coins.c | 93++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 50 insertions(+), 43 deletions(-)

diff --git a/src/auditor/taler-helper-auditor-coins.c b/src/auditor/taler-helper-auditor-coins.c @@ -232,7 +232,7 @@ report_emergency_by_amount ( .value = *&issue->value }; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Reporting emergency on denomination `%s' over loss of %s\n", GNUNET_h2s (&issue->denom_hash.hash), TALER_amount2s (loss)); @@ -289,7 +289,7 @@ report_emergency_by_count ( .value = issue->value }; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Reporting emergency on denomination `%s' with issued %lu vs known %lu over risk of %s\n", GNUNET_h2s (&issue->denom_hash.hash), num_issued, @@ -699,7 +699,7 @@ init_denomination (const struct TALER_DenominationHashP *denom_hash, TALER_amount_set_zero (TALER_ARL_currency, &ds->dcd.recoup_loss)); } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Starting balance for denomination `%s' is %s (%llu)\n", GNUNET_h2s (&denom_hash->hash), TALER_amount2s (&ds->dcd.denom_balance), @@ -847,7 +847,7 @@ sync_denomination (void *cls, (! TALER_amount_is_zero (&ds->dcd.denom_balance)) ) { /* book denom_balance coin expiration profits! */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Denomination `%s' expired, booking %s in expiration profits\n", GNUNET_h2s (denom_hash), TALER_amount2s (&ds->dcd.denom_balance)); @@ -872,7 +872,7 @@ sync_denomination (void *cls, to auditor database for next iteration */ long long cnt; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Final balance for denomination `%s' is %s (%llu)\n", GNUNET_h2s (denom_hash), TALER_amount2s (&ds->dcd.denom_balance), @@ -1054,11 +1054,11 @@ withdraw_cb ( return GNUNET_SYSERR; } ds->dcd.num_issued++; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Issued coin in denomination `%s' of total value %s\n", GNUNET_h2s (&issue->denom_hash.hash), TALER_amount2s (&issue->value)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "New balance of denomination `%s' after withdraw is %s\n", GNUNET_h2s (&issue->denom_hash.hash), TALER_amount2s (&ds->dcd.denom_balance)); @@ -1185,6 +1185,10 @@ reduce_denom_balance (struct DenominationSummary *dso, &dso->dcd.denom_balance, amount_with_fee)) { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Emergency: failed to reduce balance of denomination `%s' by %s\n", + GNUNET_h2s (&dso->issue->denom_hash.hash), + TALER_amount2s (amount_with_fee)); TALER_ARL_amount_add (&dso->dcd.denom_loss, &dso->dcd.denom_loss, amount_with_fee); @@ -1197,6 +1201,9 @@ reduce_denom_balance (struct DenominationSummary *dso, if (-1 == TALER_amount_cmp (&TALER_ARL_USE_AB (total_escrowed), amount_with_fee)) { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Failed to total escrow by %s\n", + TALER_amount2s (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 @@ -1221,7 +1228,7 @@ reduce_denom_balance (struct DenominationSummary *dso, &TALER_ARL_USE_AB (total_escrowed), amount_with_fee); } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "New balance of denomination `%s' is %s\n", GNUNET_h2s (&dso->issue->denom_hash.hash), TALER_amount2s (&dso->dcd.denom_balance)); @@ -1440,7 +1447,7 @@ refresh_session_cb (void *cls, } else { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Created fresh coin in denomination `%s' of value %s\n", GNUNET_h2s (&ni->denom_hash.hash), TALER_amount2s (&ni->value)); @@ -1451,7 +1458,7 @@ refresh_session_cb (void *cls, TALER_ARL_amount_add (&dsi->dcd.denom_risk, &dsi->dcd.denom_risk, &ni->value); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "New balance of denomination `%s' after refresh_reveal is %s\n", GNUNET_h2s (&ni->denom_hash.hash), TALER_amount2s (&dsi->dcd.denom_balance)); @@ -1637,7 +1644,7 @@ deposit_cb (void *cls, return GNUNET_OK; } } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Deposited coin %s in denomination `%s' of value %s\n", TALER_B2S (&deposit->coin.coin_pub), GNUNET_h2s (&issue->denom_hash.hash), @@ -1794,7 +1801,7 @@ refund_cb (void *cls, return GNUNET_OK; } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Refunding coin %s in denomination `%s' value %s\n", TALER_B2S (coin_pub), GNUNET_h2s (&issue->denom_hash.hash), @@ -1829,7 +1836,7 @@ refund_cb (void *cls, TALER_ARL_amount_add (&TALER_ARL_USE_AB (coin_balance_risk), &TALER_ARL_USE_AB (coin_balance_risk), &amount_without_fee); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "New balance of denomination `%s' after refund is %s\n", GNUNET_h2s (&issue->denom_hash.hash), TALER_amount2s (&ds->dcd.denom_balance)); @@ -1893,7 +1900,7 @@ purse_refund_coin_cb ( GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); return GNUNET_SYSERR; } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Aborted purse-deposit of coin %s in denomination `%s' value %s\n", TALER_B2S (coin_pub), GNUNET_h2s (&issue->denom_hash.hash), @@ -1928,7 +1935,7 @@ purse_refund_coin_cb ( TALER_ARL_amount_add (&TALER_ARL_USE_AB (coin_balance_risk), &TALER_ARL_USE_AB (coin_balance_risk), amount_with_fee); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "New balance of denomination `%s' after purse-refund is %s\n", GNUNET_h2s (&issue->denom_hash.hash), TALER_amount2s (&ds->dcd.denom_balance)); @@ -2300,7 +2307,7 @@ recoup_refresh_cb (void *cls, TALER_ARL_amount_add (&dso->dcd.denom_balance, &dso->dcd.denom_balance, amount); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "New balance of denomination `%s' after refresh-recoup is %s\n", GNUNET_h2s (&issue->denom_hash.hash), TALER_amount2s (&dso->dcd.denom_balance)); @@ -2689,13 +2696,12 @@ analyze_coins (void *cls) qs = cc.qs; goto cleanup; } -#if FIXME_9828 - /* process recoups */ + /* process refreshes */ if (0 > - (qs = TALER_ARL_edb->select_recoup_refresh_above_serial_id ( + (qs = TALER_ARL_edb->select_refreshes_above_serial_id ( TALER_ARL_edb->cls, - TALER_ARL_USE_PP (coins_recoup_refresh_serial_id), - &recoup_refresh_cb, + TALER_ARL_USE_PP (coins_melt_serial_id), + &refresh_session_cb, &cc))) { GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); @@ -2706,13 +2712,12 @@ analyze_coins (void *cls) qs = cc.qs; goto cleanup; } -#endif - /* process deposits */ + /* process refunds */ if (0 > - (qs = TALER_ARL_edb->select_coin_deposits_above_serial_id ( + (qs = TALER_ARL_edb->select_refunds_above_serial_id ( TALER_ARL_edb->cls, - TALER_ARL_USE_PP (coins_deposit_serial_id), - &deposit_cb, + TALER_ARL_USE_PP (coins_refund_serial_id), + &refund_cb, &cc))) { GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); @@ -2723,12 +2728,13 @@ analyze_coins (void *cls) qs = cc.qs; goto cleanup; } - /* process purse_deposits */ +#if FIXME_9828 + /* process recoups */ if (0 > - (qs = TALER_ARL_edb->select_purse_deposits_above_serial_id ( + (qs = TALER_ARL_edb->select_recoup_refresh_above_serial_id ( TALER_ARL_edb->cls, - TALER_ARL_USE_PP (coins_purse_deposits_serial_id), - &purse_deposit_cb, + TALER_ARL_USE_PP (coins_recoup_refresh_serial_id), + &recoup_refresh_cb, &cc))) { GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); @@ -2739,12 +2745,13 @@ analyze_coins (void *cls) qs = cc.qs; goto cleanup; } - /* process refunds */ +#endif + /* process deposits */ if (0 > - (qs = TALER_ARL_edb->select_refunds_above_serial_id ( + (qs = TALER_ARL_edb->select_coin_deposits_above_serial_id ( TALER_ARL_edb->cls, - TALER_ARL_USE_PP (coins_refund_serial_id), - &refund_cb, + TALER_ARL_USE_PP (coins_deposit_serial_id), + &deposit_cb, &cc))) { GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); @@ -2755,13 +2762,12 @@ analyze_coins (void *cls) qs = cc.qs; goto cleanup; } - /* process purse_refunds */ + /* process purse_deposits */ if (0 > - (qs = TALER_ARL_edb->select_purse_decisions_above_serial_id ( + (qs = TALER_ARL_edb->select_purse_deposits_above_serial_id ( TALER_ARL_edb->cls, - TALER_ARL_USE_PP (coins_purse_refunds_serial_id), - true, /* only go for refunds! */ - &purse_refund_cb, + TALER_ARL_USE_PP (coins_purse_deposits_serial_id), + &purse_deposit_cb, &cc))) { GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); @@ -2772,12 +2778,13 @@ analyze_coins (void *cls) qs = cc.qs; goto cleanup; } - /* process refreshes */ + /* process purse_refunds */ if (0 > - (qs = TALER_ARL_edb->select_refreshes_above_serial_id ( + (qs = TALER_ARL_edb->select_purse_decisions_above_serial_id ( TALER_ARL_edb->cls, - TALER_ARL_USE_PP (coins_melt_serial_id), - &refresh_session_cb, + TALER_ARL_USE_PP (coins_purse_refunds_serial_id), + true, /* only go for refunds! */ + &purse_refund_cb, &cc))) { GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);