-deduplicate logic
This commit is contained in:
parent
84c78612f3
commit
e68206b1f9
@ -1197,6 +1197,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
|
* Function called with details about coins that were melted, with the
|
||||||
* goal of auditing the refresh's execution. Verifies the signature
|
* goal of auditing the refresh's execution. Verifies the signature
|
||||||
@ -1230,7 +1289,6 @@ refresh_session_cb (void *cls,
|
|||||||
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
struct DenominationSummary *dso;
|
struct DenominationSummary *dso;
|
||||||
struct TALER_Amount amount_without_fee;
|
struct TALER_Amount amount_without_fee;
|
||||||
struct TALER_Amount tmp;
|
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
(void) noreveal_index;
|
(void) noreveal_index;
|
||||||
@ -1462,48 +1520,10 @@ refresh_session_cb (void *cls,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// FIXME: refactor: repeated logic!
|
reduce_denom_balance (dso,
|
||||||
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,
|
rowid,
|
||||||
&total_escrow_balance,
|
|
||||||
amount_with_fee,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TALER_ARL_amount_subtract (&total_escrow_balance,
|
|
||||||
&total_escrow_balance,
|
|
||||||
amount_with_fee);
|
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update global melt fees */
|
/* update global melt fees */
|
||||||
TALER_ARL_amount_add (&total_melt_fee_income,
|
TALER_ARL_amount_add (&total_melt_fee_income,
|
||||||
@ -1648,53 +1668,11 @@ deposit_cb (void *cls,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct TALER_Amount tmp;
|
reduce_denom_balance (ds,
|
||||||
|
|
||||||
// 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,
|
rowid,
|
||||||
&total_escrow_balance,
|
|
||||||
&deposit->amount_with_fee,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TALER_ARL_amount_subtract (&total_escrow_balance,
|
|
||||||
&total_escrow_balance,
|
|
||||||
&deposit->amount_with_fee);
|
&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));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update global deposit fees */
|
/* update global deposit fees */
|
||||||
TALER_ARL_amount_add (&total_deposit_fee_income,
|
TALER_ARL_amount_add (&total_deposit_fee_income,
|
||||||
&total_deposit_fee_income,
|
&total_deposit_fee_income,
|
||||||
@ -2449,52 +2427,11 @@ purse_deposit_cb (
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct TALER_Amount tmp;
|
reduce_denom_balance (ds,
|
||||||
|
|
||||||
// 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,
|
rowid,
|
||||||
&total_escrow_balance,
|
|
||||||
&deposit->amount,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TALER_ARL_amount_subtract (&total_escrow_balance,
|
|
||||||
&total_escrow_balance,
|
|
||||||
&deposit->amount);
|
&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));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update global deposit fees */
|
/* update global deposit fees */
|
||||||
TALER_ARL_amount_add (&total_deposit_fee_income,
|
TALER_ARL_amount_add (&total_deposit_fee_income,
|
||||||
&total_deposit_fee_income,
|
&total_deposit_fee_income,
|
||||||
|
Loading…
Reference in New Issue
Block a user