summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exchangedb/exchangedb_transactions.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/exchangedb/exchangedb_transactions.c b/src/exchangedb/exchangedb_transactions.c
index c862f5a0b..ade7f9cf2 100644
--- a/src/exchangedb/exchangedb_transactions.c
+++ b/src/exchangedb/exchangedb_transactions.c
@@ -40,10 +40,13 @@ TALER_EXCHANGEDB_calculate_transaction_list_totals (
{
struct TALER_Amount spent = *off;
struct TALER_Amount refunded;
+ struct TALER_Amount deposit_fee;
+ int have_refund;
GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (spent.currency,
&refunded));
+ have_refund = GNUNET_NO;
for (struct TALER_EXCHANGEDB_TransactionList *pos = tl;
NULL != pos;
pos = pos->next)
@@ -60,6 +63,7 @@ TALER_EXCHANGEDB_calculate_transaction_list_totals (
GNUNET_break (0);
return GNUNET_SYSERR;
}
+ deposit_fee = pos->details.deposit->deposit_fee;
break;
case TALER_EXCHANGEDB_TT_MELT:
/* spent += pos->amount_with_fee */
@@ -83,13 +87,14 @@ TALER_EXCHANGEDB_calculate_transaction_list_totals (
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
- TALER_amount_subtract (&refunded,
- &refunded,
- &pos->details.refund->refund_fee))
+ TALER_amount_add (&spent,
+ &spent,
+ &pos->details.refund->refund_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
+ have_refund = GNUNET_YES;
break;
case TALER_EXCHANGEDB_TT_OLD_COIN_RECOUP:
/* refunded += pos->value */
@@ -126,6 +131,18 @@ TALER_EXCHANGEDB_calculate_transaction_list_totals (
break;
}
}
+ if (have_refund)
+ {
+ /* If we gave any refund, also discount ONE deposit fee */
+ if (GNUNET_OK !=
+ TALER_amount_add (&refunded,
+ &refunded,
+ &deposit_fee))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ }
/* spent = spent - refunded */
if (GNUNET_SYSERR ==
TALER_amount_subtract (&spent,