[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-exchange] branch master updated: work on #9386
From: |
gnunet |
Subject: |
[taler-exchange] branch master updated: work on #9386 |
Date: |
Tue, 17 Dec 2024 15:14:39 +0100 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository exchange.
The following commit(s) were added to refs/heads/master by this push:
new 4915fe568 work on #9386
new a6a164072 Merge branch 'master' of git+ssh://git.taler.net/exchange
4915fe568 is described below
commit 4915fe568e8b7e7bf5e5cd4eecacf3cdefa10d04
Author: Christian Grothoff <grothoff@gnunet.org>
AuthorDate: Tue Dec 17 15:14:21 2024 +0100
work on #9386
---
src/auditor/taler-helper-auditor-wire-credit.c | 139 ++++++++++++++++++++-
src/auditordb/Makefile.am | 1 +
src/auditordb/pg_get_reserve_in_inconsistency.c | 5 +-
src/auditordb/pg_lookup_reserve_in_inconsistency.c | 75 +++++++++++
src/auditordb/pg_lookup_reserve_in_inconsistency.h | 37 ++++++
src/auditordb/plugin_auditordb_postgres.c | 6 +-
src/bank-lib/Makefile.am | 2 +-
src/bank-lib/bank_api_credit.c | 21 ++++
src/bank-lib/fakebank_twg.c | 2 +-
src/exchangedb/test-exchange-db-postgres.conf | 2 +
src/include/taler_auditordb_plugin.h | 24 +++-
src/include/taler_bank_service.h | 5 +
12 files changed, 308 insertions(+), 11 deletions(-)
diff --git a/src/auditor/taler-helper-auditor-wire-credit.c
b/src/auditor/taler-helper-auditor-wire-credit.c
index 98dae195c..e716b6eeb 100644
--- a/src/auditor/taler-helper-auditor-wire-credit.c
+++ b/src/auditor/taler-helper-auditor-wire-credit.c
@@ -168,6 +168,11 @@ static TALER_ARL_DEF_AB (total_misattribution_in);
*/
static TALER_ARL_DEF_AB (total_wire_in);
+/**
+ * Total wire credit fees charged to the exchange account.
+ */
+static TALER_ARL_DEF_AB (total_wire_credit_fees);
+
/**
* Amount of zero in our currency.
*/
@@ -338,6 +343,7 @@ commit (enum GNUNET_DB_QueryStatus qs)
qs = TALER_ARL_adb->update_balance (
TALER_ARL_adb->cls,
TALER_ARL_SET_AB (total_wire_in),
+ TALER_ARL_SET_AB (total_wire_credit_fees),
TALER_ARL_SET_AB (total_bad_amount_in_plus),
TALER_ARL_SET_AB (total_bad_amount_in_minus),
TALER_ARL_SET_AB (total_misattribution_in),
@@ -347,6 +353,7 @@ commit (enum GNUNET_DB_QueryStatus qs)
qs = TALER_ARL_adb->insert_balance (
TALER_ARL_adb->cls,
TALER_ARL_SET_AB (total_wire_in),
+ TALER_ARL_SET_AB (total_wire_credit_fees),
TALER_ARL_SET_AB (total_bad_amount_in_plus),
TALER_ARL_SET_AB (total_bad_amount_in_minus),
TALER_ARL_SET_AB (total_misattribution_in),
@@ -427,6 +434,59 @@ conclude_credit_history (void)
}
+/**
+ * Check if the given wire transfers are equivalent.
+ *
+ * @param credit amount that was received
+ * @param credit2 2nd amount that was received
+ * @param reserve_pub public key of the reserve (also the WTID)
+ * @param reserve_pub2 2nd public key of the reserve (also the WTID)
+ * @param sender_account_details payto://-URL of the sender's bank account
+ * @param sender_account_details2 2nd payto://-URL of the sender's bank account
+ * @param execution_date when did we receive the funds
+ * @param execution_date2 2nd when did we receive the funds
+ * @return #GNUNET_YES if so,
+ * #GNUNET_NO if not
+ * #GNUNET_SYSERR on internal error
+ */
+static enum GNUNET_GenericReturnValue
+check_equality (const struct TALER_Amount *credit,
+ const struct TALER_Amount *credit2,
+ const struct TALER_ReservePublicKeyP *reserve_pub,
+ const struct TALER_ReservePublicKeyP *reserve_pub2,
+ const struct TALER_FullPayto sender_account_details,
+ const struct TALER_FullPayto sender_account_details2,
+ struct GNUNET_TIME_Timestamp execution_date,
+ struct GNUNET_TIME_Timestamp execution_date2)
+{
+ if (0 != TALER_amount_cmp (credit,
+ credit2))
+ return GNUNET_NO;
+ if (0 != GNUNET_memcmp (reserve_pub,
+ reserve_pub2))
+ return GNUNET_NO;
+ {
+ struct TALER_NormalizedPayto np;
+ struct TALER_NormalizedPayto np2;
+ bool fail;
+
+ np = TALER_payto_normalize (sender_account_details);
+ np2 = TALER_payto_normalize (sender_account_details2);
+ fail = (0 != TALER_normalized_payto_cmp (np,
+ np2));
+ GNUNET_free (np.normalized_payto);
+ GNUNET_free (np2.normalized_payto);
+ if (fail)
+ return GNUNET_NO;
+ }
+ if (GNUNET_TIME_timestamp_cmp (execution_date,
+ !=,
+ execution_date2))
+ return GNUNET_NO;
+ return GNUNET_YES;
+}
+
+
/**
* Function called with details about incoming wire transfers
* as claimed by the exchange DB.
@@ -462,6 +522,56 @@ reserve_in_cb (void *cls,
TALER_ARL_amount_add (&TALER_ARL_USE_AB (total_wire_in),
&TALER_ARL_USE_AB (total_wire_in),
credit);
+ {
+ enum GNUNET_DB_QueryStatus qs;
+ struct TALER_AUDITORDB_ReserveInInconsistency dc;
+
+ qs = TALER_ARL_adb->select_reserve_in_inconsistency (
+ TALER_ARL_adb->cls,
+ wire_reference,
+ &dc);
+ switch (qs)
+ {
+ case GNUNET_DB_STATUS_HARD_ERROR:
+ case GNUNET_DB_STATUS_SOFT_ERROR:
+ global_qs = qs;
+ GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
+ return GNUNET_SYSERR;
+ case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
+ break;
+ case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+ if (TALER_amount_is_zero (&dc.amount_exchange_expected))
+ {
+ /* database entry indicates unmatched transaction */
+ enum GNUNET_GenericReturnValue ret;
+
+ ret = check_equality (&dc.amount_wired,
+ credit,
+ &dc.reserve_pub,
+ reserve_pub,
+ dc.account,
+ sender_account_details,
+ GNUNET_TIME_absolute_to_timestamp (dc.timestamp),
+ execution_date);
+ if (GNUNET_SYSERR == ret)
+ return GNUNET_SYSERR;
+ if (GNUNET_YES == ret)
+ {
+ qs = TALER_ARL_adb->delete_reserve_in_inconsistency (
+ TALER_ARL_adb->cls,
+ dc.serial_id);
+ if (qs < 0)
+ {
+ global_qs = qs;
+ GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+ }
+ }
+ break;
+ }
+ }
slen = strlen (sender_account_details.full_payto) + 1;
rii = GNUNET_malloc (sizeof (struct ReserveInInfo) + slen);
rii->rowid = rowid;
@@ -621,6 +731,9 @@ analyze_credit (
GNUNET_TIME_timestamp2s (credit_details->execution_date),
TALER_amount2s (&credit_details->amount),
TALER_B2S (&credit_details->details.reserve.reserve_pub));
+ TALER_ARL_amount_add (&TALER_ARL_USE_AB (total_wire_credit_fees),
+ &TALER_ARL_USE_AB (total_wire_credit_fees),
+ &credit_details->credit_fee);
GNUNET_CRYPTO_hash (&credit_details->serial_id,
sizeof (credit_details->serial_id),
&key);
@@ -628,11 +741,31 @@ analyze_credit (
&key);
if (NULL == rii)
{
- // FIXME: add to auditor DB and report missing!
- // (and modify balances!)
+ struct TALER_AUDITORDB_ReserveInInconsistency dc = {
+ .bank_row_id = credit_details->serial_id,
+ .amount_exchange_expected = zero,
+ .amount_wired = credit_details->amount,
+ .reserve_pub = credit_details->details.reserve.reserve_pub,
+ .timestamp = credit_details->execution_date.abs_time,
+ .account = credit_details->debit_account_uri,
+ .diagnostic = (char *) "unknown to exchange"
+ };
+ enum GNUNET_DB_QueryStatus qs;
+
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Failed to find wire transfer at `%s' in exchange database.\n",
GNUNET_TIME_timestamp2s (credit_details->execution_date));
+ qs = TALER_ARL_adb->insert_reserve_in_inconsistency (TALER_ARL_adb->cls,
+ &dc);
+ if (qs <= 0)
+ {
+ global_qs = qs;
+ GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
+ return false;
+ }
+ TALER_ARL_amount_add (&TALER_ARL_USE_AB (total_bad_amount_in_plus),
+ &TALER_ARL_USE_AB (total_bad_amount_in_plus),
+ &credit_details->amount);
return true;
}
@@ -783,7 +916,6 @@ analyze_credit (
if (qs < 0)
{
- /* FIXME: this error handling sucks... */
global_qs = qs;
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
return false;
@@ -980,6 +1112,7 @@ begin_transaction (void)
qs = TALER_ARL_adb->get_balance (
TALER_ARL_adb->cls,
TALER_ARL_GET_AB (total_wire_in),
+ TALER_ARL_GET_AB (total_wire_credit_fees),
TALER_ARL_GET_AB (total_bad_amount_in_plus),
TALER_ARL_GET_AB (total_bad_amount_in_minus),
TALER_ARL_GET_AB (total_misattribution_in),
diff --git a/src/auditordb/Makefile.am b/src/auditordb/Makefile.am
index ae78ed847..9adc4f5de 100644
--- a/src/auditordb/Makefile.am
+++ b/src/auditordb/Makefile.am
@@ -115,6 +115,7 @@ libtaler_plugin_auditordb_postgres_la_SOURCES = \
pg_insert_refreshes_hanging.c pg_insert_refreshes_hanging.h \
pg_get_refreshes_hanging.c pg_get_refreshes_hanging.h \
pg_get_reserve_in_inconsistency.c pg_get_reserve_in_inconsistency.h \
+ pg_lookup_reserve_in_inconsistency.c pg_lookup_reserve_in_inconsistency.h \
pg_insert_reserve_in_inconsistency.c pg_insert_reserve_in_inconsistency.h \
pg_get_reserve_not_closed_inconsistency.c
pg_get_reserve_not_closed_inconsistency.h \
pg_insert_reserve_not_closed_inconsistency.c
pg_insert_reserve_not_closed_inconsistency.h \
diff --git a/src/auditordb/pg_get_reserve_in_inconsistency.c
b/src/auditordb/pg_get_reserve_in_inconsistency.c
index 0d9562733..b276c2461 100644
--- a/src/auditordb/pg_get_reserve_in_inconsistency.c
+++ b/src/auditordb/pg_get_reserve_in_inconsistency.c
@@ -65,11 +65,10 @@ reserve_in_inconsistency_cb (void *cls,
for (unsigned int i = 0; i < num_results; i++)
{
- uint64_t serial_id;
struct TALER_AUDITORDB_ReserveInInconsistency dc;
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 ("row_id",
- &serial_id),
+ &dc.serial_id),
GNUNET_PQ_result_spec_uint64 ("bank_row_id",
&dc.bank_row_id),
TALER_PQ_RESULT_SPEC_AMOUNT ("amount_exchange_expected",
@@ -101,9 +100,7 @@ reserve_in_inconsistency_cb (void *cls,
}
dcc->qs = i + 1;
-
rval = dcc->cb (dcc->cb_cls,
- serial_id,
&dc);
GNUNET_PQ_cleanup_result (rs);
if (GNUNET_OK != rval)
diff --git a/src/auditordb/pg_lookup_reserve_in_inconsistency.c
b/src/auditordb/pg_lookup_reserve_in_inconsistency.c
new file mode 100644
index 000000000..7f0a42bde
--- /dev/null
+++ b/src/auditordb/pg_lookup_reserve_in_inconsistency.c
@@ -0,0 +1,75 @@
+/*
+ This file is part of TALER
+ Copyright (C) 2024 Taler Systems SA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+ */
+#include "platform.h"
+#include "taler_error_codes.h"
+#include "taler_dbevents.h"
+#include "taler_pq_lib.h"
+#include "pg_helper.h"
+#include "pg_lookup_reserve_in_inconsistency.h"
+
+
+enum GNUNET_DB_QueryStatus
+TAH_PG_lookup_reserve_in_inconsistency (
+ void *cls,
+ uint64_t bank_row_id,
+ struct TALER_AUDITORDB_ReserveInInconsistency *dc)
+{
+ struct PostgresClosure *pg = cls;
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_uint64 (&bank_row_id),
+ GNUNET_PQ_query_param_end
+ };
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ GNUNET_PQ_result_spec_uint64 ("row_id",
+ &dc->serial_id),
+ TALER_PQ_RESULT_SPEC_AMOUNT ("amount_exchange_expected",
+ &dc->amount_exchange_expected),
+ TALER_PQ_RESULT_SPEC_AMOUNT ("amount_wired",
+ &dc->amount_wired),
+ GNUNET_PQ_result_spec_auto_from_type ("reserve_pub",
+ &dc->reserve_pub),
+ GNUNET_PQ_result_spec_absolute_time ("timestamp",
+ &dc->timestamp),
+ GNUNET_PQ_result_spec_string ("account",
+ &dc->account.full_payto),
+ GNUNET_PQ_result_spec_string ("diagnostic",
+ &dc->diagnostic),
+ GNUNET_PQ_result_spec_bool ("suppressed",
+ &dc->suppressed),
+ GNUNET_PQ_result_spec_end
+ };
+
+ PREPARE (pg,
+ "auditor_lookup_reserve_in_inconsistency",
+ "SELECT"
+ " row_id"
+ ",amount_exchange_expected"
+ ",amount_wired"
+ ",reserve_pub"
+ ",timestamp"
+ ",account"
+ ",diagnostic"
+ ",suppressed"
+ " FROM auditor_reserve_in_inconsistency"
+ " WHERE (bank_row_id = $1)"
+ );
+ dc->bank_row_id = bank_row_id;
+ return GNUNET_PQ_eval_prepared_singleton_select (
+ pg->conn,
+ "auditor_lookup_reserve_in_inconsistency",
+ params,
+ rs);
+}
diff --git a/src/auditordb/pg_lookup_reserve_in_inconsistency.h
b/src/auditordb/pg_lookup_reserve_in_inconsistency.h
new file mode 100644
index 000000000..8abb6c853
--- /dev/null
+++ b/src/auditordb/pg_lookup_reserve_in_inconsistency.h
@@ -0,0 +1,37 @@
+/*
+ This file is part of TALER
+ Copyright (C) 2024 Taler Systems SA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+ */
+#ifndef PG_LOOKUP_RESERVE_IN_INCONSISTENCY_H
+#define PG_LOOKUP_RESERVE_IN_INCONSISTENCY_H
+
+#include "taler_util.h"
+#include "taler_json_lib.h"
+#include "taler_auditordb_plugin.h"
+
+/**
+ * Lookup information about reserve-in-inconsistency from the database.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param bank_row_id row of the transaction at the bank
+ * @param[out] dc set to the transaction details
+ * @return query result status
+ */
+enum GNUNET_DB_QueryStatus
+TAH_PG_lookup_reserve_in_inconsistency (
+ void *cls,
+ uint64_t bank_row_id,
+ struct TALER_AUDITORDB_ReserveInInconsistency *dc);
+
+#endif
diff --git a/src/auditordb/plugin_auditordb_postgres.c
b/src/auditordb/plugin_auditordb_postgres.c
index 22cad886b..4ca6a8785 100644
--- a/src/auditordb/plugin_auditordb_postgres.c
+++ b/src/auditordb/plugin_auditordb_postgres.c
@@ -95,6 +95,7 @@
#include "pg_insert_reserve_balance_insufficient_inconsistency.h"
#include "pg_get_reserve_in_inconsistency.h"
+#include "pg_lookup_reserve_in_inconsistency.h"
#include "pg_insert_reserve_in_inconsistency.h"
#include "pg_get_reserve_not_closed_inconsistency.h"
@@ -656,7 +657,10 @@ libtaler_plugin_auditordb_postgres_init (void *cls)
plugin->insert_reserve_in_inconsistency =
&TAH_PG_insert_reserve_in_inconsistency;
- plugin->get_reserve_in_inconsistency = &TAH_PG_get_reserve_in_inconsistency;
+ plugin->get_reserve_in_inconsistency
+ = &TAH_PG_get_reserve_in_inconsistency;
+ plugin->lookup_reserve_in_inconsistency
+ = &TAH_PG_lookup_reserve_in_inconsistency;
plugin->insert_reserve_not_closed_inconsistency =
&TAH_PG_insert_reserve_not_closed_inconsistency;
diff --git a/src/bank-lib/Makefile.am b/src/bank-lib/Makefile.am
index 355852239..5f7e4eab7 100644
--- a/src/bank-lib/Makefile.am
+++ b/src/bank-lib/Makefile.am
@@ -34,7 +34,7 @@ lib_LTLIBRARIES = \
libtalerfakebank.la
libtalerbank_la_LDFLAGS = \
- -version-info 2:0:0 \
+ -version-info 3:0:0 \
-no-undefined
libtalerbank_la_SOURCES = \
bank_api_account_token.c \
diff --git a/src/bank-lib/bank_api_credit.c b/src/bank-lib/bank_api_credit.c
index c461fe614..6980d2a54 100644
--- a/src/bank-lib/bank_api_credit.c
+++ b/src/bank-lib/bank_api_credit.c
@@ -109,11 +109,16 @@ parse_account_history (struct
TALER_BANK_CreditHistoryHandle *hh,
{
struct TALER_BANK_CreditDetails *td = &cd[i];
const char *type;
+ bool no_credit_fee;
struct GNUNET_JSON_Specification hist_spec[] = {
GNUNET_JSON_spec_string ("type",
&type),
TALER_JSON_spec_amount_any ("amount",
&td->amount),
+ GNUNET_JSON_spec_mark_optional (
+ TALER_JSON_spec_amount_any ("credit_fee",
+ &td->credit_fee),
+ &no_credit_fee),
GNUNET_JSON_spec_timestamp ("date",
&td->execution_date),
GNUNET_JSON_spec_uint64 ("row_id",
@@ -134,6 +139,22 @@ parse_account_history (struct
TALER_BANK_CreditHistoryHandle *hh,
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
+ if (no_credit_fee)
+ {
+ GNUNET_assert (GNUNET_OK ==
+ TALER_amount_set_zero (td->amount.currency,
+ &td->credit_fee));
+ }
+ else
+ {
+ if (GNUNET_YES !=
+ TALER_amount_cmp_currency (&td->amount,
+ &td->credit_fee))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ }
if (0 == strcasecmp ("RESERVE",
type))
{
diff --git a/src/bank-lib/fakebank_twg.c b/src/bank-lib/fakebank_twg.c
index a32028734..cf35ec616 100644
--- a/src/bank-lib/fakebank_twg.c
+++ b/src/bank-lib/fakebank_twg.c
@@ -61,7 +61,7 @@ TALER_FAKEBANK_twg_main_ (
connection,
MHD_HTTP_OK,
GNUNET_JSON_pack_string ("version",
- "0:0:0"),
+ "3:0:3"),
GNUNET_JSON_pack_string ("currency",
h->currency),
GNUNET_JSON_pack_string ("implementation",
diff --git a/src/exchangedb/test-exchange-db-postgres.conf
b/src/exchangedb/test-exchange-db-postgres.conf
index fe00f2019..767f2da77 100644
--- a/src/exchangedb/test-exchange-db-postgres.conf
+++ b/src/exchangedb/test-exchange-db-postgres.conf
@@ -17,6 +17,8 @@ CURRENCY = EUR
[exchangedb]
+MAX_AML_PROGRAM_RUNTIME = 1 minute
+
# After how long do we close idle reserves? The exchange
# and the auditor must agree on this value. We currently
# expect it to be globally defined for the whole system,
diff --git a/src/include/taler_auditordb_plugin.h
b/src/include/taler_auditordb_plugin.h
index 87f886512..b4f2155a5 100644
--- a/src/include/taler_auditordb_plugin.h
+++ b/src/include/taler_auditordb_plugin.h
@@ -387,6 +387,7 @@ struct
TALER_AUDITORDB_ReserveBalanceInsufficientInconsistency
*/
struct TALER_AUDITORDB_ReserveInInconsistency
{
+ uint64_t serial_id;
uint64_t bank_row_id;
struct TALER_Amount amount_exchange_expected;
struct TALER_Amount amount_wired;
@@ -861,7 +862,6 @@ typedef enum GNUNET_GenericReturnValue
typedef enum GNUNET_GenericReturnValue
(*TALER_AUDITORDB_ReserveInInconsistencyCallback)(
void *cls,
- uint64_t serial_id,
const struct TALER_AUDITORDB_ReserveInInconsistency *dc);
typedef enum GNUNET_GenericReturnValue
@@ -1521,6 +1521,21 @@ struct TALER_AUDITORDB_Plugin
enum TALER_AUDITORDB_DeletableSuppressableTables table,
uint64_t row_id);
+ /**
+ * Lookup information about reserve-in-inconsistency from the database.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param bank_row_id row of the transaction at the bank
+ * @param[out] dc set to the transaction details
+ * @return query result status
+ */
+ enum GNUNET_DB_QueryStatus
+ (*lookup_reserve_in_inconsistency) (
+ void *cls,
+ uint64_t bank_row_id,
+ struct TALER_AUDITORDB_ReserveInInconsistency *dc);
+
+
enum GNUNET_DB_QueryStatus
(*get_reserve_in_inconsistency)(
void *cls,
@@ -1542,6 +1557,13 @@ struct TALER_AUDITORDB_Plugin
void *cls,
const struct TALER_AUDITORDB_ReserveInInconsistency *dc);
+
+ enum GNUNET_DB_QueryStatus
+ (*select_reserve_in_inconsistency)(
+ void *cls,
+ uint64_t bank_row_id,
+ struct TALER_AUDITORDB_ReserveInInconsistency *dc);
+
enum GNUNET_DB_QueryStatus
(*get_reserve_not_closed_inconsistency)(
void *cls,
diff --git a/src/include/taler_bank_service.h b/src/include/taler_bank_service.h
index 3f685f70f..e6555ec3f 100644
--- a/src/include/taler_bank_service.h
+++ b/src/include/taler_bank_service.h
@@ -657,6 +657,11 @@ struct TALER_BANK_CreditDetails
*/
struct TALER_Amount amount;
+ /**
+ * Fee paid by the creditor.
+ */
+ struct TALER_Amount credit_fee;
+
/**
* Time of the the transfer
*/
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-exchange] branch master updated: work on #9386,
gnunet <=