gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-exchange] branch master updated: -towards p2p auditor sync implem


From: gnunet
Subject: [taler-exchange] branch master updated: -towards p2p auditor sync implementation: SQL still missing
Date: Mon, 30 May 2022 23:55:59 +0200

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 300194f4 -towards p2p auditor sync implementation: SQL still missing
300194f4 is described below

commit 300194f42a629ddbc24e59b7e16e906888afe905
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Mon May 30 23:55:55 2022 +0200

    -towards p2p auditor sync implementation: SQL still missing
---
 src/exchangedb/common-0001.sql              |   2 +-
 src/exchangedb/irbt_callbacks.c             | 303 +++++++++++++-
 src/exchangedb/lrbt_callbacks.c             | 604 +++++++++++++++++++++++++++-
 src/exchangedb/plugin_exchangedb_postgres.c |  70 ++++
 src/include/taler_exchangedb_plugin.h       | 116 +++++-
 5 files changed, 1071 insertions(+), 24 deletions(-)

diff --git a/src/exchangedb/common-0001.sql b/src/exchangedb/common-0001.sql
index cb64f446..31c4b68e 100644
--- a/src/exchangedb/common-0001.sql
+++ b/src/exchangedb/common-0001.sql
@@ -1186,7 +1186,7 @@ BEGIN
 
   table_name = concat_ws('_', table_name, shard_suffix);
 
-  -- FIXME: change to materialized index by marge_pub!
+  -- FIXME: change to materialized index by merge_pub!
   EXECUTE FORMAT (
     'CREATE INDEX IF NOT EXISTS ' || table_name || '_merge_pub '
     'ON ' || table_name || ' '
diff --git a/src/exchangedb/irbt_callbacks.c b/src/exchangedb/irbt_callbacks.c
index 172dfcbe..c1802b96 100644
--- a/src/exchangedb/irbt_callbacks.c
+++ b/src/exchangedb/irbt_callbacks.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet
-   Copyright (C) 2020, 2021 Taler Systems SA
+   Copyright (C) 2020, 2021, 2022 Taler Systems SA
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -150,7 +150,6 @@ irbt_cb_table_reserves (struct PostgresClosure *pg,
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_uint64 (&td->serial),
     GNUNET_PQ_query_param_auto_from_type (&td->details.reserves.reserve_pub),
-    TALER_PQ_query_param_amount (&td->details.reserves.current_balance),
     GNUNET_PQ_query_param_timestamp (&td->details.reserves.expiration_date),
     GNUNET_PQ_query_param_timestamp (&td->details.reserves.gc_date),
     GNUNET_PQ_query_param_end
@@ -383,8 +382,6 @@ irbt_cb_table_known_coins (struct PostgresClosure *pg,
       &td->details.known_coins.denom_sig),
     GNUNET_PQ_query_param_uint64 (
       &td->details.known_coins.denominations_serial),
-    TALER_PQ_query_param_amount (
-      &td->details.known_coins.remaining),
     GNUNET_PQ_query_param_end
   };
 
@@ -526,7 +523,6 @@ irbt_cb_table_deposits (struct PostgresClosure *pg,
     GNUNET_PQ_query_param_auto_from_type (&td->details.deposits.wire_salt),
     GNUNET_PQ_query_param_auto_from_type (
       &td->details.deposits.wire_target_h_payto),
-    GNUNET_PQ_query_param_bool (td->details.deposits.done),
     GNUNET_PQ_query_param_bool (td->details.deposits.extension_blocked),
     0 == td->details.deposits.extension_details_serial_id
     ? GNUNET_PQ_query_param_null ()
@@ -801,4 +797,301 @@ irbt_cb_table_extension_details (struct PostgresClosure 
*pg,
 }
 
 
+/**
+ * Function called with purse_requests records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_purse_requests (struct PostgresClosure *pg,
+                              const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.purse_requests.merge_pub),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.purse_requests.purse_creation),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.purse_requests.purse_expiration),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.purse_requests.h_contract_terms),
+    GNUNET_PQ_query_param_uint32 (&td->details.purse_requests.age_limit),
+    GNUNET_PQ_query_param_uint32 (&td->details.purse_requests.flags),
+    TALER_PQ_query_param_amount (&td->details.purse_requests.amount_with_fee),
+    TALER_PQ_query_param_amount (&td->details.purse_requests.purse_fee),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.purse_requests.purse_sig),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             
"insert_into_table_purse_requests",
+                                             params);
+}
+
+
+/**
+ * Function called with purse_merges records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_purse_merges (struct PostgresClosure *pg,
+                            const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.purse_merges.reserve_pub),
+    GNUNET_PQ_query_param_auto_from_type (&td->details.purse_merges.purse_pub),
+    GNUNET_PQ_query_param_auto_from_type (&td->details.purse_merges.merge_sig),
+    GNUNET_PQ_query_param_timestamp 
(&td->details.purse_merges.merge_timestamp),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             "insert_into_table_purse_merges",
+                                             params);
+}
+
+
+/**
+ * Function called with purse_deposits records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_purse_deposits (struct PostgresClosure *pg,
+                              const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.purse_deposits.purse_pub),
+    GNUNET_PQ_query_param_auto_from_type 
(&td->details.purse_deposits.coin_pub),
+    TALER_PQ_query_param_amount (&td->details.purse_deposits.amount_with_fee),
+    GNUNET_PQ_query_param_auto_from_type 
(&td->details.purse_deposits.coin_sig),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             
"insert_into_table_purse_deposits",
+                                             params);
+}
+
+
+/**
+ * Function called with account_mergers records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_account_mergers (struct PostgresClosure *pg,
+                               const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.account_merges.reserve_pub),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.account_merges.reserve_sig),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.account_merges.purse_pub),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             
"insert_into_table_account_mergers",
+                                             params);
+}
+
+
+/**
+ * Function called with history_requests records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_history_requests (struct PostgresClosure *pg,
+                                const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.history_requests.reserve_pub),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.history_requests.request_timestamp),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.history_requests.reserve_sig),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             
"insert_into_table_history_requests",
+                                             params);
+}
+
+
+/**
+ * Function called with close_requests records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_close_requests (struct PostgresClosure *pg,
+                              const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.close_requests.reserve_pub),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.close_requests.close_timestamp),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.close_requests.reserve_sig),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             
"insert_into_table_close_requests",
+                                             params);
+}
+
+
+/**
+ * Function called with wads_out records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_wads_out (struct PostgresClosure *pg,
+                        const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (&td->details.wads_out.wad_id),
+    TALER_PQ_query_param_amount (&td->details.wads_out.amount),
+    GNUNET_PQ_query_param_timestamp (&td->details.wads_out.execution_time),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             "insert_into_table_wads_out",
+                                             params);
+}
+
+
+/**
+ * Function called with wads_out_entries records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_wads_out_entries (struct PostgresClosure *pg,
+                                const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_out_entries.reserve_pub),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_out_entries.purse_pub),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_out_entries.h_contract),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.wads_out_entries.purse_expiration),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.wads_out_entries.merge_timestamp),
+    TALER_PQ_query_param_amount (
+      &td->details.wads_out_entries.amount_with_fee),
+    TALER_PQ_query_param_amount (
+      &td->details.wads_out_entries.deposit_fees),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_out_entries.reserve_sig),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_out_entries.purse_sig),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             
"insert_into_table_wads_out_entries",
+                                             params);
+}
+
+
+/**
+ * Function called with wads_in records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_wads_in (struct PostgresClosure *pg,
+                       const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (&td->details.wads_in.wad_id),
+    GNUNET_PQ_query_param_string (td->details.wads_in.origin_exchange_url),
+    TALER_PQ_query_param_amount (&td->details.wads_in.amount),
+    GNUNET_PQ_query_param_timestamp (&td->details.wads_in.arrival_time),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             "insert_into_table_wads_in",
+                                             params);
+}
+
+
+/**
+ * Function called with wads_in_entries records to insert into table.
+ *
+ * @param pg plugin context
+ * @param td record to insert
+ */
+static enum GNUNET_DB_QueryStatus
+irbt_cb_table_wads_in_entries (struct PostgresClosure *pg,
+                               const struct TALER_EXCHANGEDB_TableData *td)
+{
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_uint64 (&td->serial),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_in_entries.reserve_pub),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_in_entries.purse_pub),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_in_entries.h_contract),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.wads_in_entries.purse_expiration),
+    GNUNET_PQ_query_param_timestamp (
+      &td->details.wads_in_entries.merge_timestamp),
+    TALER_PQ_query_param_amount (
+      &td->details.wads_in_entries.amount_with_fee),
+    TALER_PQ_query_param_amount (
+      &td->details.wads_in_entries.wad_fee),
+    TALER_PQ_query_param_amount (
+      &td->details.wads_in_entries.deposit_fees),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_in_entries.reserve_sig),
+    GNUNET_PQ_query_param_auto_from_type (
+      &td->details.wads_in_entries.purse_sig),
+    GNUNET_PQ_query_param_end
+  };
+
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             
"insert_into_table_wads_in_entries",
+                                             params);
+}
+
+
 /* end of irbt_callbacks.c */
diff --git a/src/exchangedb/lrbt_callbacks.c b/src/exchangedb/lrbt_callbacks.c
index 5451be76..b621b7b0 100644
--- a/src/exchangedb/lrbt_callbacks.c
+++ b/src/exchangedb/lrbt_callbacks.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet
-   Copyright (C) 2020, 2021 Taler Systems SA
+   Copyright (C) 2020, 2021, 2022 Taler Systems SA
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -219,7 +219,6 @@ lrbt_cb_table_reserves (void *cls,
                         unsigned int num_results)
 {
   struct LookupRecordsByTableContext *ctx = cls;
-  struct PostgresClosure *pg = ctx->pg;
   struct TALER_EXCHANGEDB_TableData td = {
     .table = TALER_EXCHANGEDB_RT_RESERVES
   };
@@ -231,8 +230,6 @@ lrbt_cb_table_reserves (void *cls,
                                     &td.serial),
       GNUNET_PQ_result_spec_auto_from_type ("reserve_pub",
                                             &td.details.reserves.reserve_pub),
-      TALER_PQ_RESULT_SPEC_AMOUNT ("current_balance",
-                                   &td.details.reserves.current_balance),
       GNUNET_PQ_result_spec_timestamp ("expiration_date",
                                        &td.details.reserves.expiration_date),
       GNUNET_PQ_result_spec_timestamp ("gc_date",
@@ -659,7 +656,6 @@ lrbt_cb_table_known_coins (void *cls,
                            unsigned int num_results)
 {
   struct LookupRecordsByTableContext *ctx = cls;
-  struct PostgresClosure *pg = ctx->pg;
   struct TALER_EXCHANGEDB_TableData td = {
     .table = TALER_EXCHANGEDB_RT_KNOWN_COINS
   };
@@ -679,9 +675,6 @@ lrbt_cb_table_known_coins (void *cls,
       GNUNET_PQ_result_spec_uint64 (
         "denominations_serial",
         &td.details.known_coins.denominations_serial),
-      TALER_PQ_RESULT_SPEC_AMOUNT (
-        "remaining",
-        &td.details.known_coins.remaining),
       GNUNET_PQ_result_spec_end
     };
 
@@ -953,9 +946,6 @@ lrbt_cb_table_deposits (void *cls,
       GNUNET_PQ_result_spec_auto_from_type (
         "wire_target_h_payto",
         &td.details.deposits.wire_target_h_payto),
-      GNUNET_PQ_result_spec_bool (
-        "done",
-        &td.details.deposits.done),
       GNUNET_PQ_result_spec_auto_from_type (
         "extension_blocked",
         &td.details.deposits.extension_blocked),
@@ -1455,10 +1445,10 @@ lrbt_cb_table_extension_details (void *cls,
   struct TALER_EXCHANGEDB_TableData td = {
     .table = TALER_EXCHANGEDB_RT_EXTENSION_DETAILS
   };
-  bool no_config = false;
 
   for (unsigned int i = 0; i<num_results; i++)
   {
+    bool no_config = false;
     struct GNUNET_PQ_ResultSpec rs[] = {
       GNUNET_PQ_result_spec_uint64 ("extension_details_serial_id",
                                     &td.serial),
@@ -1486,4 +1476,594 @@ lrbt_cb_table_extension_details (void *cls,
 }
 
 
+/**
+ * Function called with purse_requests table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_purse_requests (void *cls,
+                              PGresult *result,
+                              unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_PURSE_REQUESTS
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_pub",
+        &td.details.purse_requests.purse_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "merge_pub",
+        &td.details.purse_requests.merge_pub),
+      GNUNET_PQ_result_spec_timestamp (
+        "purse_creation",
+        &td.details.purse_requests.purse_creation),
+      GNUNET_PQ_result_spec_timestamp (
+        "purse_expiration",
+        &td.details.purse_requests.purse_expiration),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "h_contract_terms",
+        &td.details.purse_requests.h_contract_terms),
+      GNUNET_PQ_result_spec_uint32 (
+        "age_limit",
+        &td.details.purse_requests.age_limit),
+      GNUNET_PQ_result_spec_uint32 (
+        "flags",
+        &td.details.purse_requests.flags),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "amount_with_fee",
+        &td.details.purse_requests.amount_with_fee),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "purse_fee",
+        &td.details.purse_requests.purse_fee),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_sig",
+        &td.details.purse_requests.purse_sig),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with purse_merges table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_purse_merges (void *cls,
+                            PGresult *result,
+                            unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_PURSE_MERGES
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_pub",
+        &td.details.purse_merges.reserve_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_pub",
+        &td.details.purse_merges.purse_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "merge_sig",
+        &td.details.purse_merges.merge_sig),
+      GNUNET_PQ_result_spec_timestamp (
+        "purse_expiration",
+        &td.details.purse_merges.merge_timestamp),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with purse_deposits table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_purse_deposits (void *cls,
+                              PGresult *result,
+                              unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_PURSE_DEPOSITS
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_pub",
+        &td.details.purse_deposits.purse_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "coin_pub",
+        &td.details.purse_deposits.coin_pub),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "amount_with_fee",
+        &td.details.purse_deposits.amount_with_fee),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "coin_sig",
+        &td.details.purse_deposits.coin_sig),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with account_merges table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_account_merges (void *cls,
+                              PGresult *result,
+                              unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_ACCOUNT_MERGES
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_pub",
+        &td.details.account_merges.reserve_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_sig",
+        &td.details.account_merges.reserve_sig),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_pub",
+        &td.details.account_merges.purse_pub),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with history_requests table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_history_requests (void *cls,
+                                PGresult *result,
+                                unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_HISTORY_REQUESTS
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_pub",
+        &td.details.history_requests.reserve_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_sig",
+        &td.details.history_requests.reserve_sig),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "history_fee",
+        &td.details.history_requests.history_fee),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with close_requests table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_close_requests (void *cls,
+                              PGresult *result,
+                              unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_CLOSE_REQUESTS
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_pub",
+        &td.details.close_requests.reserve_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_sig",
+        &td.details.close_requests.reserve_sig),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "close",
+        &td.details.close_requests.close),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with wads_out table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_wads_out (void *cls,
+                        PGresult *result,
+                        unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_WADS_OUT
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "wad_id",
+        &td.details.wads_out.wad_id),
+      GNUNET_PQ_result_spec_uint64 (
+        "partner_serial_id",
+        &td.details.wads_out.partner_serial_id),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "amount",
+        &td.details.wads_out.amount),
+      GNUNET_PQ_result_spec_timestamp (
+        "execution_time",
+        &td.details.wads_out.execution_time),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with wads_out_entries table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_wads_out_entries (void *cls,
+                                PGresult *result,
+                                unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_pub",
+        &td.details.wads_out_entries.reserve_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_pub",
+        &td.details.wads_out_entries.purse_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "h_contract",
+        &td.details.wads_out_entries.h_contract),
+      GNUNET_PQ_result_spec_timestamp (
+        "purse_expiration",
+        &td.details.wads_out_entries.purse_expiration),
+      GNUNET_PQ_result_spec_timestamp (
+        "merge_timestamp",
+        &td.details.wads_out_entries.merge_timestamp),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "amount_with_fee",
+        &td.details.wads_out_entries.amount_with_fee),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "deposit_fees",
+        &td.details.wads_out_entries.deposit_fees),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_sig",
+        &td.details.wads_out_entries.reserve_sig),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_sig",
+        &td.details.wads_out_entries.purse_sig),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with wads_in table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_wads_in (void *cls,
+                       PGresult *result,
+                       unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_WADS_IN
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "wad_id",
+        &td.details.wads_in.wad_id),
+      GNUNET_PQ_result_spec_string (
+        "origin_exchange_url",
+        &td.details.wads_in.origin_exchange_url),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "amount",
+        &td.details.wads_in.amount),
+      GNUNET_PQ_result_spec_timestamp (
+        "arrival_time",
+        &td.details.wads_in.arrival_time),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
+/**
+ * Function called with wads_in_entries table entries.
+ *
+ * @param cls closure
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lrbt_cb_table_wads_in_entries (void *cls,
+                               PGresult *result,
+                               unsigned int num_results)
+{
+  struct LookupRecordsByTableContext *ctx = cls;
+  struct PostgresClosure *pg = ctx->pg;
+  struct TALER_EXCHANGEDB_TableData td = {
+    .table = TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES
+  };
+
+  for (unsigned int i = 0; i<num_results; i++)
+  {
+    struct GNUNET_PQ_ResultSpec rs[] = {
+      GNUNET_PQ_result_spec_uint64 (
+        "extension_details_serial_id",
+        &td.serial),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_pub",
+        &td.details.wads_in_entries.reserve_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_pub",
+        &td.details.wads_in_entries.purse_pub),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "h_contract",
+        &td.details.wads_in_entries.h_contract),
+      GNUNET_PQ_result_spec_timestamp (
+        "purse_expiration",
+        &td.details.wads_in_entries.purse_expiration),
+      GNUNET_PQ_result_spec_timestamp (
+        "merge_timestamp",
+        &td.details.wads_in_entries.merge_timestamp),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "amount_with_fee",
+        &td.details.wads_in_entries.amount_with_fee),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "wad_fee",
+        &td.details.wads_in_entries.wad_fee),
+      TALER_PQ_RESULT_SPEC_AMOUNT (
+        "deposit_fees",
+        &td.details.wads_in_entries.deposit_fees),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "reserve_sig",
+        &td.details.wads_in_entries.reserve_sig),
+      GNUNET_PQ_result_spec_auto_from_type (
+        "purse_sig",
+        &td.details.wads_in_entries.purse_sig),
+      GNUNET_PQ_result_spec_end
+    };
+
+    if (GNUNET_OK !=
+        GNUNET_PQ_extract_result (result,
+                                  rs,
+                                  i))
+    {
+      GNUNET_break (0);
+      ctx->error = true;
+      return;
+    }
+    ctx->cb (ctx->cb_cls,
+             &td);
+    GNUNET_PQ_cleanup_result (rs);
+  }
+}
+
+
 /* end of lrbt_callbacks.c */
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index b2a72764..71338e5f 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -12738,6 +12738,46 @@ postgres_lookup_records_by_table (void *cls,
     statement = "select_above_serial_by_table_extension_details";
     rh = &lrbt_cb_table_extension_details;
     break;
+  case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
+    statement = "select_above_serial_by_table_purse_requests";
+    rh = &lrbt_cb_table_purse_requests;
+    break;
+  case TALER_EXCHANGEDB_RT_PURSE_MERGES:
+    statement = "select_above_serial_by_table_purse_merges";
+    rh = &lrbt_cb_table_purse_merges;
+    break;
+  case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
+    statement = "select_above_serial_by_table_purse_deposits";
+    rh = &lrbt_cb_table_purse_deposits;
+    break;
+  case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
+    statement = "select_above_serial_by_table_account_merges";
+    rh = &lrbt_cb_table_account_merges;
+    break;
+  case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
+    statement = "select_above_serial_by_table_history_requests";
+    rh = &lrbt_cb_table_history_requests;
+    break;
+  case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
+    statement = "select_above_serial_by_table_close_requests";
+    rh = &lrbt_cb_table_close_requests;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_OUT:
+    statement = "select_above_serial_by_table_wads_out";
+    rh = &lrbt_cb_table_wads_out;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
+    statement = "select_above_serial_by_table_wads_out_entries";
+    rh = &lrbt_cb_table_wads_out_entries;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_IN:
+    statement = "select_above_serial_by_table_wads_in";
+    rh = &lrbt_cb_table_wads_in;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
+    statement = "select_above_serial_by_table_wads_in_entries";
+    rh = &lrbt_cb_table_wads_in_entries;
+    break;
   default:
     GNUNET_break (0);
     return GNUNET_DB_STATUS_HARD_ERROR;
@@ -12872,6 +12912,36 @@ postgres_insert_records_by_table (void *cls,
   case TALER_EXCHANGEDB_RT_EXTENSION_DETAILS:
     rh = &irbt_cb_table_extension_details;
     break;
+  case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
+    rh = &irbt_cb_table_purse_requests;
+    break;
+  case TALER_EXCHANGEDB_RT_PURSE_MERGES:
+    rh = &irbt_cb_table_purse_merges;
+    break;
+  case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
+    rh = &irbt_cb_table_purse_deposits;
+    break;
+  case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
+    rh = &irbt_cb_table_account_mergers;
+    break;
+  case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
+    rh = &irbt_cb_table_history_requests;
+    break;
+  case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
+    rh = &irbt_cb_table_close_requests;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_OUT:
+    rh = &irbt_cb_table_wads_out;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
+    rh = &irbt_cb_table_wads_out_entries;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_IN:
+    rh = &irbt_cb_table_wads_in;
+    break;
+  case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
+    rh = &irbt_cb_table_wads_in_entries;
+    break;
   default:
     GNUNET_break (0);
     return GNUNET_DB_STATUS_HARD_ERROR;
diff --git a/src/include/taler_exchangedb_plugin.h 
b/src/include/taler_exchangedb_plugin.h
index d08c9ff1..1cef0d2d 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -216,6 +216,16 @@ enum TALER_EXCHANGEDB_ReplicatedTable
   TALER_EXCHANGEDB_RT_RECOUP_REFRESH,
   TALER_EXCHANGEDB_RT_EXTENSIONS,
   TALER_EXCHANGEDB_RT_EXTENSION_DETAILS,
+  TALER_EXCHANGEDB_RT_PURSE_REQUESTS,
+  TALER_EXCHANGEDB_RT_PURSE_MERGES,
+  TALER_EXCHANGEDB_RT_PURSE_DEPOSITS,
+  TALER_EXCHANGEDB_RT_ACCOUNT_MERGES,
+  TALER_EXCHANGEDB_RT_HISTORY_REQUESTS,
+  TALER_EXCHANGEDB_RT_CLOSE_REQUESTS,
+  TALER_EXCHANGEDB_RT_WADS_OUT,
+  TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES,
+  TALER_EXCHANGEDB_RT_WADS_IN,
+  TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES,
 };
 
 
@@ -273,10 +283,6 @@ struct TALER_EXCHANGEDB_TableData
     struct
     {
       struct TALER_ReservePublicKeyP reserve_pub;
-      /**
-       * Note: not useful for auditor, because not UPDATEd!
-       */
-      struct TALER_Amount current_balance;
       struct GNUNET_TIME_Timestamp expiration_date;
       struct GNUNET_TIME_Timestamp gc_date;
     } reserves;
@@ -347,7 +353,6 @@ struct TALER_EXCHANGEDB_TableData
       struct TALER_AgeCommitmentHash age_hash;
       uint64_t denominations_serial;
       struct TALER_DenominationSignature denom_sig;
-      struct TALER_Amount remaining;
     } known_coins;
 
     struct
@@ -394,7 +399,6 @@ struct TALER_EXCHANGEDB_TableData
       struct TALER_CoinSpendSignatureP coin_sig;
       struct TALER_WireSaltP wire_salt;
       struct TALER_PaytoHashP wire_target_h_payto;
-      bool done;
       bool extension_blocked;
       uint64_t extension_details_serial_id;
     } deposits;
@@ -476,6 +480,106 @@ struct TALER_EXCHANGEDB_TableData
       char *extension_options;
     } extension_details;
 
+    struct
+    {
+      struct TALER_PurseContractPublicKeyP purse_pub;
+      struct TALER_PurseMergePublicKeyP merge_pub;
+      struct GNUNET_TIME_Timestamp purse_creation;
+      struct GNUNET_TIME_Timestamp purse_expiration;
+      struct TALER_PrivateContractHashP h_contract_terms;
+      uint32_t age_limit;
+      uint32_t flags;
+      struct TALER_Amount amount_with_fee;
+      struct TALER_Amount purse_fee;
+      struct TALER_PurseContractSignatureP purse_sig;
+    } purse_requests;
+
+    struct
+    {
+      uint64_t partner_serial_id;
+      struct TALER_ReservePublicKeyP reserve_pub;
+      struct TALER_PurseContractPublicKeyP purse_pub;
+      struct TALER_PurseMergeSignatureP merge_sig;
+      struct GNUNET_TIME_Timestamp merge_timestamp;
+    } purse_merges;
+
+    struct
+    {
+      uint64_t partner_serial_id;
+      struct TALER_PurseContractPublicKeyP purse_pub;
+      struct TALER_CoinSpendPublicKeyP coin_pub;
+      struct TALER_Amount amount_with_fee;
+      struct TALER_CoinSpendSignatureP coin_sig;
+    } purse_deposits;
+
+    struct
+    {
+      struct TALER_ReservePublicKeyP reserve_pub;
+      struct TALER_ReserveSignatureP reserve_sig;
+      struct TALER_PurseContractPublicKeyP purse_pub;
+    } account_merges;
+
+    struct
+    {
+      struct TALER_ReservePublicKeyP reserve_pub;
+      struct TALER_ReserveSignatureP reserve_sig;
+      struct GNUNET_TIME_Timestamp request_timestamp;
+      struct TALER_Amount history_fee;
+    } history_requests;
+
+    struct
+    {
+      struct TALER_ReservePublicKeyP reserve_pub;
+      struct GNUNET_TIME_Timestamp close_timestamp;
+      struct TALER_ReserveSignatureP reserve_sig;
+      struct TALER_Amount close;
+    } close_requests;
+
+    struct
+    {
+      struct TALER_WadIdentifierP wad_id;
+      uint64_t partner_serial_id;
+      struct TALER_Amount amount;
+      struct GNUNET_TIME_Timestamp execution_time;
+    } wads_out;
+
+    struct
+    {
+      uint64_t wad_out_serial_id;
+      struct TALER_ReservePublicKeyP reserve_pub;
+      struct TALER_PurseContractPublicKeyP purse_pub;
+      struct TALER_PrivateContractHashP h_contract;
+      struct GNUNET_TIME_Timestamp purse_expiration;
+      struct GNUNET_TIME_Timestamp merge_timestamp;
+      struct TALER_Amount amount_with_fee;
+      struct TALER_Amount deposit_fees;
+      struct TALER_ReserveSignatureP reserve_sig;
+      struct TALER_PurseContractSignatureP purse_sig;
+    } wads_out_entries;
+
+    struct
+    {
+      struct TALER_WadIdentifierP wad_id;
+      char *origin_exchange_url;
+      struct TALER_Amount amount;
+      struct GNUNET_TIME_Timestamp arrival_time;
+    } wads_in;
+
+    struct
+    {
+      uint64_t wad_in_serial_id;
+      struct TALER_ReservePublicKeyP reserve_pub;
+      struct TALER_PurseContractPublicKeyP purse_pub;
+      struct TALER_PrivateContractHashP h_contract;
+      struct GNUNET_TIME_Timestamp purse_expiration;
+      struct GNUNET_TIME_Timestamp merge_timestamp;
+      struct TALER_Amount amount_with_fee;
+      struct TALER_Amount wad_fee;
+      struct TALER_Amount deposit_fees;
+      struct TALER_ReserveSignatureP reserve_sig;
+      struct TALER_PurseContractSignatureP purse_sig;
+    } wads_in_entries;
+
   } details;
 
 };

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]