gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [taler-exchange] branch stable updated (ae68bd7 -> 9041840)


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] branch stable updated (ae68bd7 -> 9041840)
Date: Wed, 29 Nov 2017 21:02:42 +0100

This is an automated email from the git hooks/post-receive script.

dold pushed a change to branch stable
in repository exchange.

    from ae68bd7  fix --with-libcurl and --with-libgnurl options; they used to 
ignore the given path.
     add 4da0956  missing conf from 'make dist'
     add 9807e5c  releasing v0.4.0
     add 2cb6c5b  starting with error codes for tipping API
     add 288c716  more error codes for tipping
     add d107baa  fix #5108
     add a946dc3  start template for generating nicely formatted auditor reports
     add a491a47  rename: TALER_FreshCoinP -> TALER_PlanchetSecretsP, and 
TALER_setup_fresh_coin -> TALER_setup_planchet
     add ec8146d  rename: TALER_setup_planchet -> TALER_planchet_setup_refresh
     add 2f2930f  major API refactoring, adding planchet generation and coin 
extraction APIs to the Taler crypto library, thereby simplifying code in 
withdraw, refresh, tipping, payback and testcases; slight API incompatibilities 
to previous versions are introduced
     add beeece1  add TALER_EXCHANGE_reserve_withdraw2 function for easy 
withdrawal of tips
     add 6b4313d  fix stupid ordering issue after refactoring
     add 07e1155  be less verbose
     add 4f212a1  add status code
     add 0b580d8  helps to keep enum values distinct
     add f393908  define more error codes
     add b6907bb  clarify soft DB error code - they now could be returned
     add db3c297  fix balance calculation for reserve withdrawals
     add 9236f3a  indentation
     add 84998f9  fix #5167
     add 169962d  lets use 52, the number of bits stored
     add 215c6db  true/false are keywords, use all-caps
     add 2ddd4cb  use proper longtable for report
     add c5f9c0c  work on making auditor reports nicer (#4962)
     add cc09fbb  working on #4962
     add 45c443f  update auditor report format to capture nicely all 
diagnostics that may currently be generated by the auditor (closes #4962)
     add f8af22b  more work on wire auditor and reporting (#4958)
     add 1139f74  fix minor wire auditor bugs, add samples of output
     add 1665941  fix misc typos in auditor report logic
     add 25d96e8  more work on auditor report formatting
     add f299130  make -m option optional for taler-auditor and 
taler-wire-auditor
     add 8440de1  work on #5077: reserve_pub vs. wtid issue, add reject 
functionality to wire plugin API (with stub implementations for now)
     add 53be6c6  update bug refs to #5177
     add 6d845c9  Add on-more- forgery citation for security proof
     add 029d323  test select_deposits_missing_wire, fix uninitialized 
wire_deadline in deposit listing
     add 92d616b  add last_timestamp to wire auditor progress point; fix 
confusion in param/result specs between 'auto' and 'absolute time'
     add 8f48db8  implementing #4961: detection of missing aggregate transfers
     add 1126912  implement #5177 (not yet tested)
     add 7749a68  fix issue in wire auditor's history processing
     add 111abd5  do not break on issues we log to JSON
     add 846b5c6  regenerate samples based on current auditor logic
     add 5ed64ed  fix minor template issue
     add aa79aca  Add error code TIP_QUERY_TIP_ID_UNKNOWN
     add 9041840  round timestamp so that the exchange does not crash when 
converting to JSON

No new revisions were added by this update.

Summary of changes:
 .gitignore                                         |     4 +
 ChangeLog                                          |    16 +
 Makefile.am                                        |     8 +
 configure.ac                                       |    11 +-
 contrib/auditor-report.tex.j2                      |   824 ++
 contrib/render.py                                  |    46 +
 contrib/samples/auditor.json                       | 11842 +------------------
 contrib/samples/wire-auditor.json                  |  4227 +------
 doc/paper/taler.bib                                |    18 +
 doc/paper/taler.tex                                |     2 +-
 doc/taler-auditor.1                                |     2 +-
 doc/taler-exchange-httpd.1                         |     4 +-
 src/auditor/Makefile.am                            |     1 +
 src/auditor/taler-auditor.c                        |  1246 +-
 src/auditor/taler-wire-auditor.c                   |   754 +-
 src/auditordb/plugin_auditordb_postgres.c          |    65 +-
 src/bank-lib/Makefile.am                           |     3 +
 src/benchmark/taler-exchange-benchmark.c           |     6 +-
 src/exchange-lib/Makefile.am                       |     2 +-
 src/exchange-lib/exchange_api_payback.c            |    14 +-
 src/exchange-lib/exchange_api_refresh.c            |   149 +-
 src/exchange-lib/exchange_api_refresh_link.c       |     4 +-
 src/exchange-lib/exchange_api_reserve.c            |   263 +-
 src/exchange-lib/test_exchange_api.c               |    46 +-
 src/exchange/taler-exchange-aggregator.c           |     1 +
 src/exchange/taler-exchange-httpd_admin.c          |     8 +-
 src/exchange/taler-exchange-httpd_keystate.c       |     8 +-
 src/exchange/taler-exchange-httpd_refresh_reveal.c |     4 +-
 .../taler-exchange-httpd_reserve_withdraw.c        |    34 +-
 src/exchange/taler-exchange-wirewatch.c            |   110 +-
 src/exchangedb/Makefile.am                         |     2 +-
 src/exchangedb/plugin_exchangedb_postgres.c        |    21 +-
 src/exchangedb/test_exchangedb.c                   |    72 +
 src/include/taler_auditordb_plugin.h               |     6 +
 src/include/taler_crypto_lib.h                     |   178 +-
 src/include/taler_error_codes.h                    |   147 +-
 src/include/taler_exchange_service.h               |    59 +-
 src/include/taler_json_lib.h                       |    10 +
 src/include/taler_util.h                           |     2 -
 src/include/taler_wire_plugin.h                    |    71 +-
 src/json/json_helper.c                             |    18 +
 src/util/amount.c                                  |    49 +-
 src/util/crypto.c                                  |   139 +-
 src/util/test_crypto.c                             |    61 +-
 src/wire/Makefile.am                               |     2 +-
 src/wire/plugin_wire_sepa.c                        |   103 +
 src/wire/plugin_wire_test.c                        |   203 +-
 src/wire/test_wire_plugin_transactions_test.c      |     5 +-
 48 files changed, 3966 insertions(+), 16904 deletions(-)
 create mode 100644 contrib/auditor-report.tex.j2
 create mode 100755 contrib/render.py

diff --git a/.gitignore b/.gitignore
index 16c6234..5f227d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -88,3 +88,7 @@ contrib/taler-exchange.tag
 doxygen-doc/
 src/exchange-lib/test_exchange_api_keys_cherry_picking
 src/auditor/taler-wire-auditor
+contrib/auditor-report.aux
+contrib/auditor-report.log
+contrib/auditor-report.tex
+contrib/auditor-report.pdf
diff --git a/ChangeLog b/ChangeLog
index 9a5caa7..2948a76 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+Thu Nov  2 17:39:40 CET 2017
+       Limit amount values to 2^53 as we always wanted (#5167). -CG
+
+Thu Nov  2 16:50:46 CET 2017
+       Fixing serious bug in reserve balance calculations, as
+       fees were not always properly included in the summation. -CG
+
+Tue Oct 31 13:43:55 CET 2017
+       Extended crypto API to provide planchet generation functions
+       explicitly (to be used on withdraw, refresh and tipping).
+       Renamed a few API calls to better reflect their functions.
+       Changed a few function signatures to use new structs. -CG
+
+Wed Oct 18 15:20:29 CEST 2017
+       Releasing Taler v0.4.0. -CG
+
 Tue Oct 17 14:32:46 CEST 2017
        Fix building of /keys response to include full auditor
        signature set instead of partial map. -CG
diff --git a/Makefile.am b/Makefile.am
index ab0f3ac..2499efb 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,9 +2,17 @@
 AM_CPPFLAGS = -I$(top_srcdir)/src/include
 
 if DOC_ONLY
+if ENABLE_DOC
   SUBDIRS = . doc
 else
+  SUBDIRS = .
+endif
+else
+if ENABLE_DOC
   SUBDIRS = . src doc
+else
+  SUBDIRS = . src doc
+endif
 endif
 
 @DX_RULES@
diff --git a/configure.ac b/configure.ac
index f9eb7fa..1b904b5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@
 #
 #
 AC_PREREQ([2.69])
-AC_INIT([taler-exchange], [0.3.0], address@hidden)
+AC_INIT([taler-exchange], [0.4.0], address@hidden)
 AC_CONFIG_SRCDIR([src/util/util.c])
 AC_CONFIG_HEADERS([taler_config.h])
 # support for non-recursive builds
@@ -472,6 +472,14 @@ AC_TYPE_UINTMAX_T
 # Checks for library functions.
 AC_CHECK_FUNCS([strdup])
 
+
+AC_ARG_ENABLE([[doc]],
+  [AS_HELP_STRING([[--disable-doc]], [do not build any documentation])], ,
+    [enable_doc=yes])
+test "x$enable_doc" = "xno" || enable_doc=yes
+AM_CONDITIONAL([ENABLE_DOC], [test "x$enable_doc" = "xyes"])
+
+
 else
 
 # logic if doc_only is set, make sure conditionals are still defined
@@ -482,6 +490,7 @@ AM_CONDITIONAL([HAVE_LIBCURL], [false])
 AM_CONDITIONAL([HAVE_LIBGNURL], [false])
 AM_CONDITIONAL([HAVE_DEVELOPER], [false])
 AM_CONDITIONAL([USE_COVERAGE], [false])
+AM_CONDITIONAL([ENABLE_DOC], [true])
 
 
 # end of 'doc_only'
diff --git a/contrib/auditor-report.tex.j2 b/contrib/auditor-report.tex.j2
new file mode 100644
index 0000000..8eb0230
--- /dev/null
+++ b/contrib/auditor-report.tex.j2
@@ -0,0 +1,824 @@
+% This file is part of TALER
+% Copyright (C) 2016, 2017 Taler Systems SA
+%
+% TALER is free software; you can redistribute it and/or modify it under the
+% terms of the GNU Affero 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 Affero General Public License for more 
details.
+%
+% You should have received a copy of the GNU Affero General Public License 
along with
+% TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+%
+%
+% With respect to this file, our interpretation of the license is
+% that publishing an audit report (i.e. in TeX or PDF) requires
+% publishing the corresponding j2 template sources under AGPL, and
+% linking to them from the report. (This file _is_ source code,
+% the generated PDF is the service under definition of the AGPL.)
+%
+\documentclass{article} % {acmart}
+\usepackage{url}
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage{multirow}
+\usepackage{longtable}
+
+\begin{document}
+
+\title{Taler Auditor Report}
+
+% You must also credit the original author.
+\author{Christian Grothoff}
+\maketitle
+
+% If you update this template, complying with the license requires
+% stating the license and publishing the J2 source and linking to it
+% from the generated PDF.  So if you change this outside of the Taler
+% Git repository, you must update this link (and the link must remain
+% available to the receiver of the result from the generated TeX, PDF
+% or other format).
+
+This report is based on a template licensed under the Affero General Public
+License, either version 3, or (at your option) any later version.
+The source code for the template is available at \url{https://git.taler.net/}.
+
+
+\section{Operations}
+
+The balance of the escrow account should
+be {\bf
+\mbox{
+  {{ data.total_escrow_balance.value }}.{{ data.total_escrow_balance.fraction 
}}
+  {{ data.total_escrow_balance.currency }}}}.
+
+\noindent
+The active operational risk stands at
+\mbox{
+{\bf
+  {{ data.total_active_risk.value }}.{{ data.total_active_risk.fraction }}
+  {{ data.total_active_risk.currency }}}}.
+
+
+\section{Income}
+
+This section analyzes the income of the exchange operator from fees.
+
+\begin{table}[h!]
+\begin{center}
+  \caption{Fee revenue summary}
+  \label{table:revenue}
+  \begin{tabular}{l|rl}
+    Category    & Amount &   \\ \hline \hline
+  Withdraw fees &
+  {{ data.total_withdraw_fee_income.value }}.{{ 
data.total_withdraw_fee_income.fraction }} &
+  {{ data.total_withdraw_fee_income.currency }} \\
+  Deposit fees &
+  {{ data.total_deposit_fee_income.value }}.{{ 
data.total_deposit_fee_income.fraction }} &
+  {{ data.total_deposit_fee_income.currency }} \\
+  Melt fees &
+  {{ data.total_melt_fee_income.value }}.{{ 
data.total_melt_fee_income.fraction }} &
+  {{ data.total_melt_fee_income.currency }} \\
+  Refund fees &
+  {{ data.total_refund_fee_income.value }}.{{ 
data.total_refund_fee_income.fraction }} &
+  {{ data.total_refund_fee_income.currency }} \\
+  Aggregation fees &
+  {{ data.total_aggregation_fee_income.value }}.{{ 
data.total_aggregation_fee_income.fraction }} &
+  {{ data.total_aggregation_fee_income.currency }} \\
+  {\bf Total}  &
+  {{ data.income_fee_total.value }}.{{ data.income_fee_total.fraction }} &
+  {{ data.income_fee_total.currency }} \\
+\end{tabular}
+\end{center}
+\end{table}
+
+
+\section{Lag}
+
+This section analyzes the lag, which is by how much the exchange's aggregator 
is behind in
+making wire transfers that have been due.
+
+The total amount the exchange currently lags behind is
+{\bf  {{ wire.total_amount_lag.value }}.{{ wire.total_amount_lag.fraction }}
+      {{ wire.total_amount_lag.currency }}
+}.
+
+Note that some lag is perfectly normal, as tiny amounts that are too small to 
be wired
+are deferred beyond the due date, hoping that additional transfers will push 
them above
+the tiny threshold. Below, we report {\em non-tiny} wire transfers that are 
lagging behind.
+
+{% if wire.lag_details|length() == 0 %}
+  {\bf No non-tiny wire transfers that are lagging behind detected.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|rl|c|rl}
+  \multicolumn{4}{l}{\bf Coin} \\
+  {\bf Deadline} & {\bf Amount} & {\bf Row} & {\bf Claimed done} \\
+  \multicolumn{4}{l}{\bf Target account} \\ \hline \hline
+\endfirsthead
+  \multicolumn{4}{l}{\bf Coin} \\
+  {\bf Deadline} & {\bf Amount} & {\bf Row} & {\bf Claimed done} \\
+  \multicolumn{4}{l}{\bf Target account} \\ \hline \hline
+\endhead
+  \hline \hline
+  \multicolumn{4}{l}{\bf Coin} \\
+  {\bf Deadline} & {\bf Amount} & {\bf Row} & {\bf Claimed done} \\
+  \multicolumn{4}{l}{\bf Target account} \\
+\endfoot
+  \hline \hline
+  \multicolumn{4}{l}{\bf Coin} \\
+  {\bf Deadline} & {\bf Amount} & {\bf Row} & {\bf Claimed done} \\
+  \multicolumn{4}{l}{\bf Target account} \\
+    \caption{Lagging non-tiny transactions.}
+    \label{table:lag}
+\endlastfoot
+{% for item in wire.lag_details %}
+  \multicolumn{4}{l}{ {\tt {{ item.coin_pub }} } } \\
+\nopagebreak
+  &
+  {{ item.deadline }} &
+  {{ item.amount.value }}.{{ item.amount.fraction }} &
+  {{ item.amount.currency }} &
+  {{ item.row }} &
+  {{ item.claimed_done }} \\
+\nopagebreak
+  \multicolumn{4}{l}{ {\tt {{ item.account }} } } \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\section{Major irregularities}
+
+This section describes the possible major irregularities that the
+auditor has checked, and lists all of the actual irregularities
+encountered in detail.
+
+\subsection{Emergencies}
+
+Emergencies are errors where more coins were deposited than the
+exchange remembers issuing.  This usually means that the private keys
+of the exchange were compromised (stolen or factored) and subsequently
+used to sign coins off the books.  If this happens, all coins of the
+respective denomination that the exchange has redeemed so far may have
+been created by the attacker, and the exchange would have to refund
+all of the outstanding coins from ordinary users.  Thus, the {\bf risk
+exposure} is the amount of coins in circulation for a particular
+denominatin and the maximum loss for the exchange from this type of
+compromise.
+
+{% if data.emergencies|length() == 0 %}
+  {\bf No emergencies detected.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|rl|c|rl}
+  {\bf Public key hash} & {\bf Denomination} & {\bf Lifetime} & {\bf Risk 
exposure} \\ \hline \hline
+\endfirsthead
+  {\bf Public key hash} & {\bf Denomination} & {\bf Lifetime} & {\bf Risk 
exposure} \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Public key hash} & {\bf Denomination} & {\bf Lifetime} & {\bf Risk 
exposure} \\
+\endfoot
+  \hline
+% FIXME: replace these with the summary column adding up the amounts!
+  \multicolumn{4}{|c|}{ {\bf Total risk from emergencies}} & {{ 
data.emergencies_risk_total }} \\
+    \caption{Emergencies.}
+    \label{table:emergencies}
+\endlastfoot
+{% for item in data.reserve_inconsistencies %}
+  \multicolumn{6}{l}{ {\tt {{ item.denompub_hash }} } } \\
+\nopagebreak
+  &
+  {{ item.value.value }}.{{ item.value.fraction }} &
+  {{ item.value.currency }} &
+  {{ item.start }} - {{ item.deposit_end }} &
+  {{ item.denom_risk.value }}.{{ item.denom_risk.fraction }} &
+  {{ item.denom_risk.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Arithmetic problems}
+
+This section lists cases where the arithmetic of the exchange
+involving amounts disagrees with the arithmetic of the auditor.
+Disagreements imply that either the exchange made a loss (sending out
+too much money), or screwed a customer (and thus at least needs to fix
+the financial damage done to the customer).
+
+{% if data.amount_arithmetic_inconsistencies|length() == 0 %}
+  {\bf No arithmetic problems detected.}
+{% else %}
+  \begin{longtable}{p{4.5cm}|l|rl|rl}
+  {\bf Operation} & {\bf Table row} & \multicolumn{2}{|c|}{ {\bf Exchange}} & 
\multicolumn{2}{|c}{ {\bf Auditor}} \\
+  \hline \hline
+\endfirsthead
+  {\bf Operation} & {\bf Table row} & \multicolumn{2}{|c|}{ {\bf Exchange}} & 
\multicolumn{2}{|c}{ {\bf Auditor}} \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Operation} & {\bf Table row} & \multicolumn{2}{|c|}{ {\bf Exchange}} & 
\multicolumn{2}{|c}{ {\bf Auditor}} \\
+\endfoot
+  \hline
+  {\bf Total} & &
+  {{ data.total_arithmetic_delta_plus.value }}.{{ 
data.total_arithmetic_delta_plus.fraction }} &
+  {{ data.total_arithmetic_delta_plus.currency }} &
+  {{ data.total_arithmetic_delta_minus.value }}.{{ 
data.total_arithmetic_delta_minus.fraction }} &
+  {{ data.total_arithmetic_delta_minus.currency }} \\
+    \caption{Arithmetic inconsistencies.}
+    \label{table:amount:arithmetic:inconsistencies}
+\endlastfoot
+{% for item in data.amount_arithmetic_inconsistencies %}
+  {{ item.operation }} &
+  {{ item.rowid }} &
+  {{ item.exchange.value }}.{{ item.exchange.fraction }} &
+  {{ item.exchange.currency }} &
+  {{ item.auditor.value }}.{{ item.auditor.fraction }} &
+  {{ item.auditor.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+\subsection{Reserve withdrawals exceeding balance}
+
+This section highlights cases where more coins were withdrawn from a
+reserve than the reserve contained funding for.  This is a serious
+compromise resulting in proportional financial losses to the exchange.
+
+
+{% if data.reserve_balance_insufficient_inconsistencies|length() == 0 %}
+  {\bf All withdrawals were covered by sufficient reserve funding.}
+{% else %}
+  \begin{longtable}{p{4.5cm}|rl}
+  {\bf Reserve} & \multicolumn{2}{|c|}{ {\bf Loss}}  \\ \hline \hline
+\endfirsthead
+  {\bf Reserve} & \multicolumn{2}{|c|}{ {\bf Loss}}  \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Reserve} & \multicolumn{2}{|c|}{ {\bf Loss}}
+\endfoot
+  \hline
+  {\bf Total loss}  & &
+  {{ data.total_loss_balance_insufficient.value}}.{{ 
data.total_loss_balance_insufficient.fraction}} & {{ 
data.total_loss_balance_insufficient.currency}} \\
+  \caption{Reserves with withdrawals higher than reserve funding.}
+  \label{table:reserve:balance_insufficient}
+\endlastfoot
+{% for item in data.reserve_balance_insufficient_inconsistencies %}
+  \multicolumn{3}{l}{ {\tt {{ item.reserve_pub }} } } \\
+\nopagebreak
+  &
+  {{ item.loss.value }}.{{ item.loss.fraction }} &
+  {{ item.loss.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Claimed outgoing wire transfer inconsistencies}
+
+This section is about the exchange's database containing a
+justification to make an outgoing wire transfer for an aggregated
+amount for various deposits. It is reported as an inconsistency if the
+amount claimed for the wire transfer does not match up the deposits
+aggregated.  This is about a {\em claimed} outgoing wire transfer as
+violations do not imply that the wire transfer was actually made (as
+that is a separate check).  Note that not making the wire transfer
+would be reported separately in Section~\ref{sec:wire_check_out}.
+
+
+{% if data.wire_out_inconsistencies|length() == 0 %}
+  {\bf All aggregations matched up.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|l|rl|rl}
+  {\bf Destination account} & {\bf Database row} & \multicolumn{2}{|c|}{ {\bf 
Expected}} & \multicolumn{2}{|c|}{ {\bf Claimed}} \\ \hline \hline
+\endfirsthead
+  {\bf Destination account} & {\bf Database row} & \multicolumn{2}{|c|}{ {\bf 
Expected}} & \multicolumn{2}{|c|}{ {\bf Claimed}} \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Destination account} & {\bf Database row} & \multicolumn{2}{|c|}{ {\bf 
Expected}} & \multicolumn{2}{|c|}{ {\bf Claimed}} \\
+\endfoot
+  \hline
+  {\bf Total deltas}  & &
+  {{ data.total_wire_out_delta_plus.value}}.{{ 
data.total_wire_out_delta_plus.fraction}} & {{ 
data.total_wire_out_delta_plus.currency}} &
+  - {{ data.total_wire_out_delta_minus.value}}.{{ 
data.total_wire_out_delta_minus.fraction}} & {{ 
data.total_wire_out_delta_minus.currency}} \\
+  \caption{Claimed wire out aggregate totals not matching up.}
+  \label{table:reserve:wire_out_balance_inconsistencies}
+\endlastfoot
+{% for item in data.wire_out_inconsistencies %}
+  \multicolumn{6}{l}{ {\tt {{ item.destination_account }} } } \\
+\nopagebreak
+  & {{ item.rowid }} &
+  {{ item.expected.value }}.{{ item.expected.fraction }} &
+  {{ item.expected.currency }} &
+  {{ item.claimed.value }}.{{ item.claimed.fraction }} &
+  {{ item.claimed.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Coin history inconsistencies}
+
+This section lists cases where the exchange made arithmetic errors found when
+looking at the transaction history of a coin.  The totals sum up the 
differences
+in amounts that matter for profit/loss calculations of the exchange. When an
+exchange merely shifted money from customers to merchants (or vice versa) 
without
+any effects on its own balance, those entries are excluded from the total.
+
+{% if data.coin_inconsistencies|length() == 0 %}
+  {\bf All coin histories were unproblematic.}
+{% else %}
+  \begin{longtable}{l|p{5.5cm}|rl|rl}
+  {\bf Operation} & {\bf Coin public key} & \multicolumn{2}{|c|}{ {\bf 
Exchange}} & \multicolumn{2}{|c|}{ {\bf Auditor}} \\
+  \hline \hline
+\endfirsthead
+  {\bf Operation} & {\bf Coin public key} & \multicolumn{2}{|c|}{ {\bf 
Exchange}} & \multicolumn{2}{|c|}{ {\bf Auditor}} \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Operation} & {\bf Coin public key} & \multicolumn{2}{|c|}{ {\bf 
Exchange}} & \multicolumn{2}{|c|}{ {\bf Auditor}} \\
+\endfoot
+  \hline
+  {\bf Total} & &
+  {{ data.total_coin_delta_plus.value }}.{{ 
data.total_coin_delta_plus.fraction }} &
+  {{ data.total_coin_delta_plus.currency }} &
+  - {{ data.total_coin_delta_minus.value }}.{{ 
data.total_coin_delta_minus.fraction }} &
+  {{ data.total_coin_delta_minus.currency }} \\
+    \caption{Arithmetic inconsistencies of amount calculations involving a 
coin.}
+    \label{table:amount:arithmetic:coin:inconsistencies}
+\endlastfoot
+{% for item in data.coin_inconsistencies %}
+  {{ item.operation }} &
+  \multicolumn{5}{l}{ {\tt {{ item.coin_pub }} } } \\
+\nopagebreak & &
+  {{ item.exchange.value }}.{{ item.exchange.fraction }} &
+  {{ item.exchange.currency }} &
+  {{ item.auditor.value }}.{{ item.auditor.fraction }} &
+  {{ item.auditor.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Operations with bad signatures}
+
+This section lists operations that the exchange performed, but for
+which the signatures provided are invalid. Hence the operations were
+invalid and the amount involved should be considered lost.
+
+The key given is always the key for which the signature verification
+step failed. This is the reserve public key for ``withdraw''
+operations, the coin public key for ``deposit'' and ``melt''
+operations, the merchant's public key for ``melt'' operations,
+the (hash of the) denomination public key for
+``payback-verify'' and ``deposit-verify'' operations, and the master
+public key for ``payback-master'' operations.
+
+{% if data.bad_sig_losses|length() == 0 %}
+  {\bf All signatures were valid.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|c|l|rl}
+  {\bf Public key} & {\bf Operation type} & Database row & 
\multicolumn{2}{|c|}{ {\bf Loss amount}} \\
+  \hline \hline
+\endfirsthead
+  {\bf Public key} & {\bf Operation type} & Database row & 
\multicolumn{2}{|c|}{ {\bf Loss amount}} \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Public key} & {\bf Operation type} & Database row & 
\multicolumn{2}{|c|}{ {\bf Loss amount}} \\
+\endfoot
+  \hline
+  {\bf Total losses}  & & &
+  {{ data.total_bad_sig_loss.value}}.{{ data.total_bad_sig_loss.fraction}} & 
{{ data.total_bad_sig_loss.currency}} \\
+  \caption{Losses from operations performed on coins without proper 
signatures.}
+  \label{table:bad_signature_losses}
+\endlastfoot
+{% for item in data.bad_sig_losses %}
+  \multicolumn{5}{l}{ {\tt {{ item.key_pub }} } } \\
+\nopagebreak
+  & {{ item.operation }} & {{ item.rowid }} &
+    {{ item.loss.value }}.{{ item.loss.fraction }} &
+    {{ item.loss.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+
+\subsection{Actual incoming wire transfers}
+
+This section highlights cases where the exchange's record about
+incoming wire transfers does not match with that of the bank.
+
+{% if wire.reserve_in_amount_inconsistencies|length() == 0 %}
+  {\bf All incoming wire transfer amounts and subjects matched up.}
+{% else %}
+  \begin{longtable}{p{5.5cm}|rl|rl}
+  \multicolumn{5}{l}{ {\bf Wire transfer identifier} ({\bf Row}) } \\
+  {\bf Diagnostic} & \multicolumn{2}{|c|}{ {\bf Wired}} & \multicolumn{2}{|c}{ 
{\bf Expected}}  \\
+  \hline \hline
+\endfirsthead
+  \multicolumn{5}{l}{ {\bf Wire transfer identifier} ({\bf Row}) } \\
+  {\bf Diagnostic} & \multicolumn{2}{|c|}{ {\bf Wired}} & \multicolumn{2}{|c}{ 
{\bf Expected}}  \\
+  \hline \hline
+\endhead
+  \hline \hline
+  \multicolumn{5}{l}{ {\bf Wire transfer identifier} ({\bf Row}) } \\
+  {\bf Diagnostic} & \multicolumn{2}{|c|}{ {\bf Wired}} & \multicolumn{2}{|c}{ 
{\bf Expected}}  \\
+\endfoot
+  \hline \hline
+  {\bf Total deltas}  &
+  {{ wire.total_wire_in_delta_plus.value}}.{{ 
wire.total_wire_in_delta_plus.fraction}} & {{ 
wire.total_wire_in_delta_plus.currency}} &
+  - {{ wire.total_wire_in_delta_minus.value}}.{{ 
wire.total_wire_in_delta_minus.fraction}} & {{ 
wire.total_wire_in_delta_minus.currency}} \\
+  \caption{Incoming wire transfer amounts not matching up.}
+  \label{table:wire_in:transfer_amount_inconsistencies}
+\endlastfoot
+{% for item in wire.reserve_in_amount_inconsistencies %}
+  \multicolumn{5}{l}{ {\tt {{ item.wtid }} } ({{ item.row }}) } \\
+\nopagebreak
+  {{ item.timestamp }}: &
+  {{ item.amount_wired.value }}.{{ item.amount_wired.fraction }} &
+  {{ item.amount_wired.currency }} &
+  {{ item.amount_expected.value }}.{{ item.amount_expected.fraction }} &
+  {{ item.amount_expected.currency }} \\
+  {{ item.diagnostic }}  & & & & \\
+%\nopagebreak
+%  & \multicolumn{4}{|c}{ {{ item.timestamp }} }
+  \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Missattributed incoming wire transfers}
+
+This section lists cases where the sender account record of an
+incoming wire transfer differs between the exchange and the bank.
+This will cause funds to be sent to the wrong account when the reserve
+is closed and the remaining balance is refunded to the original
+account.
+
+
+{% if wire.missattribution_in_inconsistencies|length() == 0 %}
+  {\bf All incoming wire transfer sender accounts matched up.}
+{% else %}
+  \begin{longtable}{p{6.5cm}|rl}
+  {\bf Wire transfer identifier} & \multicolumn{2}{|c|}{ {\bf Amount}} \\
+  \hline \hline
+\endfirsthead
+  {\bf Wire transfer identifier} & \multicolumn{2}{|c|}{ {\bf Amount}} \\
+  \hline \hline
+\endhead
+  \hline \hline
+  {\bf Wire transfer identifier} & \multicolumn{2}{|c|}{ {\bf Amount}} \\
+\endfoot
+  \hline
+  {\bf Total amount}  &
+  {{ wire.total_missattribution_in_plus.value}}.{{ 
wire.total_missattribution_in_plus.fraction}} & {{ 
wire.total_missattribution_in_plus.currency}} \\
+  \caption{Incoming wire transfer sender accounts not matching up.}
+  \label{table:wire_in:sender_account_inconsistencies}
+\endlastfoot
+{% for item in wire.missattribution_in_inconsistencies %}
+  {\tt {{ item.wtid }} } &
+  {{ item.amount.value }}.{{ item.amount.fraction }} &
+  {{ item.amount.currency }} \\ hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+
+
+\subsection{Actual outgoing wire transfers} \label{sec:wire_check_out}
+
+This section highlights cases where the exchange missbehaved
+with respect to outgoing wire transfers.
+
+{% if wire.wire_out_amount_inconsistencies|length() == 0 %}
+  {\bf All outgoing wire transfers matched up.}
+{% else %}
+  \begin{longtable}{p{6.5cm}|rl|rl}
+  {\bf Wire transfer identifier} & \multicolumn{2}{|c|}{ {\bf Wired}} & 
\multicolumn{2}{|c|}{ {\bf Justified}}  \\
+  {\bf Diagnostic}               & \multicolumn{2}{|c|}{ {\bf Row}} & 
\multicolumn{2}{|c|}{ {\bf Timestamp}}  \\
+  \hline \hline
+\endfirsthead
+  {\bf Wire transfer identifier} & \multicolumn{2}{|c|}{ {\bf Wired}} & 
\multicolumn{2}{|c|}{ {\bf Justified}}  \\
+  {\bf Diagnostic}               & \multicolumn{2}{|c|}{ {\bf Row}} & 
\multicolumn{2}{|c|}{ {\bf Timestamp}}  \\
+  \hline \hline
+\endhead
+  \hline \hline
+  {\bf Wire transfer identifier} & \multicolumn{2}{|c|}{ {\bf Wired}} & 
\multicolumn{2}{|c|}{ {\bf Justified}}  \\
+  {\bf Diagnostic}               & \multicolumn{2}{|c|}{ {\bf Row}} & 
\multicolumn{2}{|c|}{ {\bf Timestamp}}  \\
+\endfoot
+  \hline
+  {\bf Total deltas}  & &
+  {{ wire.total_wire_out_delta_plus.value}}.{{ 
wire.total_wire_out_delta_plus.fraction}} & {{ 
wire.total_wire_out_delta_plus.currency}} &
+  - {{ wire.total_wire_out_delta_minus.value}}.{{ 
wire.total_bad_amount_out_minus.fraction}} & {{ 
wire.total_wire_out_delta_minus.currency}} \\
+  \caption{Outgoing wire transfer amounts not matching up.}
+  \label{table:wire_out:transfer_amount_inconsistencies}
+\endlastfoot
+{% for item in wire.wire_out_amount_inconsistencies %}
+  {\tt {{ item.wtid }} } &
+  {{ item.amount_wired.value }}.{{ item.amount_wired.fraction }} &
+  {{ item.amount_wired.currency }} &
+  {{ item.amount_justified.value }}.{{ item.amount_justified.fraction }} &
+  {{ item.amount_justified.currency }} \\ \hline
+\nopagebreak
+  &
+  {{ item.diagnostic }} &
+  {{ item.row }} &
+  {{ item.timestmap }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\section{Minor irregularities}
+
+\subsection{Incorrect reserve balance summary in database}
+
+This section highlights cases where the reserve balance summary
+in the database does not match the calculations made by the auditor.
+Deltas may indicate a corrupt database, but do not necessarily
+translate into a financial loss (yet).
+
+
+{% if data.reserve_balance_summary_wrong_inconsistencies|length() == 0 %}
+  {\bf All balances matched up.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|rl|rl}
+  {\bf Reserve} & \multicolumn{2}{|c|}{ {\bf Auditor}} & \multicolumn{2}{|c|}{ 
{\bf Exchange}} \\ \hline \hline
+\endfirsthead
+  {\bf Reserve} & \multicolumn{2}{|c|}{ {\bf Auditor}} & \multicolumn{2}{|c|}{ 
{\bf Exchange}} \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Reserve} & \multicolumn{2}{|c|}{ {\bf Auditor}} & \multicolumn{2}{|c|}{ 
{\bf Exchange}}
+\endfoot
+  \hline
+  {\bf Total deltas}  & &
+  {{ data.total_balance_summary_delta_plus.value}}.{{ 
data.total_balance_summary_delta_plus.fraction}} & {{ 
data.total_balance_summary_delta_plus.currency}} &
+  - {{ data.total_balance_summary_delta_minus.value}}.{{ 
data.total_balance_summary_delta_minus.fraction}} & {{ 
data.total_balance_summary_delta_minus.currency}} \\
+  \caption{Reserves balances not matching up.}
+  \label{table:reserve:balance_inconsistencies}
+\endlastfoot
+{% for item in data.reserve_balance_summary_wrong_inconsistencies %}
+  \multicolumn{5}{l}{ {\tt {{ item.reserve_pub }} } } \\
+\nopagebreak
+  &
+  {{ item.auditor.value }}.{{ item.auditor.fraction }} &
+  {{ item.auditor.currency }} &
+  {{ item.exchange.value }}.{{ item.exchange.fraction }} &
+  {{ item.exchange.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Wire table issues}
+
+This section describes issues found by the wire auditor that do not
+have a clear financial impact.
+
+{% if wire.row_inconsistencies|length() == 0 %}
+  {\bf No wire row inconsistencies found.}
+{% else %}
+  \begin{longtable}{p{5.5cm}|l|p{4.5cm}}
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+  \hline \hline
+\endfirsthead
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+  \hline \hline
+\endhead
+  \hline
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+\endfoot
+  \hline
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+  \caption{Other wire table issues found (by table and row).}
+  \label{table:misc}
+\endlastfoot
+{% for item in wire.row_inconsistencies %}
+  \verb! {{ item.table }} ! &
+  {{ item.row }} &
+  {{ item.diagnostic }} \\
+\nopagebreak
+  \multicolumn{3}{l}{ {\tiny {\tt {{ item.wire_offset_hash }} } } } \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Outgoing wire transfer subject issues}
+
+This section describes issues found by the wire auditor that
+relate to outgoing wire transfers being malformed.
+This happens if the exchange somehow creates wire transfers
+with duplicate or malformed wire transfer subjects.
+
+{% if wire.wire_format_inconsistencies|length() == 0 %}
+  {\bf No wire format inconsistencies found.}
+{% else %}
+  \begin{longtable}{p{4.5cm}|rl}
+  \multicolumn{3}{c}{ {\bf Row hash} } \\
+  {\bf Diagnostic} & \multicolumn{2}{c|}{ {\bf Amount} } \\
+  \hline \hline
+\endfirsthead
+  \multicolumn{3}{c}{ {\bf Row hash} } \\
+  {\bf Diagnostic} & \multicolumn{2}{c|}{ {\bf Amount} } \\
+  \hline \hline
+\endhead
+  \hline
+  \multicolumn{3}{c}{ {\bf Row hash} } \\
+  {\bf Diagnostic} & \multicolumn{2}{c|}{ {\bf Amount} } \\
+\endfoot
+  \hline
+  \hline
+  {\bf Total} &
+  {{ wire.total_wire_format_amount.value }}.{{ 
wire.total_wire_format_amount.fraction }} &
+  {{ wire.total_wire_format_amount.currency }} \\
+  \caption{Outgoing wire transfer subject issues found.}
+  \label{table:outgoing:wtid}
+\endlastfoot
+{% for item in wire.wire_format_inconsistencies %}
+  \multicolumn{3}{l}{ \verb! {{ item.wire_offset_hash }} ! } \\
+\nopagebreak
+  {{ item.diagnostic }} &
+  {{ item.amount.value }}.{{ item.amount.fraction }} &
+  {{ item.amount.currency }} \\
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Wire fee structure inconsistencies}
+
+This section lists cases where the exchange's database may be ambiguous
+with respect to what wire fee it charges at what time.
+
+{% if data.wire_fee_time_inconsistencies|length() == 0 %}
+  {\bf No wire fee timing issues detected.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|r|p{5.5}}
+  {\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic}
+  \\ \hline \hline
+\endfirsthead
+  {\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic}
+  \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic} \\
+\endfoot
+  \hline \hline
+  {\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic} \\
+  \caption{Wire fees with ambiguous timestamps.}
+  \label{table:wire_fee:ambiguity}
+\endlastfoot
+{% for item in data.wire_fee_time_inconsistencies %}
+  {\tt {{ item.type }} } & {{ item.time }} & {{ item.diagnostic }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+
+\subsection{Other issues}
+
+This section describes issues found that do not have a clear financial
+impact.
+
+{% if data.row_inconsistencies|length() == 0 %}
+  {\bf No row inconsistencies found.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|l|p{5.5}}
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+  \hline \hline
+\endfirsthead
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+  \hline \hline
+\endhead
+  \hline \hline
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+\endfoot
+  \hline
+  {\bf Table} & {\bf Row} & {\bf Diagnostic} \\
+  \caption{Other issues found (by table and row).}
+  \label{table:misc}
+\endlastfoot
+{% for item in data.row_inconsistencies %}
+  {{ item.table }} &
+  {{ item.row }} &
+  {{ item.diagnostic }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\section{Delays and timing}
+
+This section describes issues that are likely caused simply by
+some job process of the exchange not running properly or not having
+caught up with the work load yet.
+
+\subsection{Delayed closure of reserves}
+
+This section describes cases where the exchange did not
+close a reserve and wire back the remaining funds when the
+reserve expired.
+
+
+{% if data.reserve_not_closed_inconsistencies|length() == 0 %}
+  {\bf All expired reserves were closed.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|c|rl}
+  {\bf Reserve} & {\bf Expired} & \multicolumn{2}{|c|}{ {\bf Balance}} \\ 
\hline \hline
+\endfirsthead
+  {\bf Reserve} & {\bf Expired} & \multicolumn{2}{|c|}{ {\bf Balance}} \\ 
\hline \hline
+\endhead
+  \hline \hline
+  {\bf Reserve} & {\bf Expired} & \multicolumn{2}{|c|}{ {\bf Balance}}
+\endfoot
+  \hline
+  {\bf Sum}     & &
+  {{ data.total_balance_reserve_not_closed.value}}.{{ 
data.total_balance_reserve_not_closed.fraction}} & {{ 
data.total_balance_reserve_not_closed.currency}} \\
+  \caption{Reserves not closed on time.}
+  \label{table:reserve:not_closed}
+\endlastfoot
+{% for item in data.reserve_not_closed_inconsistencies %}
+  \multicolumn{4}{l}{ {\tt {{ item.reserve_pub }} } } \\
+\nopagebreak
+  &
+  {{ item.expiration_time }} &
+  {{ item.balance.value }}.{{ item.balance.fraction }} &
+  {{ item.balance.currency }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Denomination key invalid at time of withdrawal}
+
+This section lists cases where a denomination key was not valid for
+withdrawal at the time when the exchange claims to have signed a coin
+with it.  This would be irregular, but has no obvious financial
+implications.
+
+
+{% if data.denomination_key_validity_withdraw_inconsistencies|length() == 0 %}
+  {\bf All denomination keys were valid at the time of withdrawals.}
+{% else %}
+  \begin{longtable}{p{7.5cm}|c}
+  {\bf Reserve} & {\bf Table row} \\
+  {\bf Denomination key hash} & {\bf Execution time} \\ \hline \hline
+\endfirsthead
+  {\bf Reserve} & {\bf Table row} \\
+  {\bf Denomination key hash} & {\bf Execution time} \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Reserve} & {\bf Table row} \\
+  {\bf Denomination key hash} & {\bf Execution time} \\
+\endfoot
+  \hline
+  {\bf Reserve} & {\bf Table row} \\
+  {\bf Denomination key hash} & {\bf Execution time} \\
+  \caption{Execution times not matching denomination key validity period.}
+  \label{table:withdraw:bad_time}
+\endlastfoot
+{% for item in data.denomination_key_validity_withdraw_inconsistencies %}
+  {\tt {{ item.reserve_pub }} } & {{ item.row }} \\
+\nopagebreak
+  &
+  {\tt {{ item.denompub_h }} } & {{ item.execution_date }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\subsection{Wire transfer timestamp issues}
+
+This section lists issues with wire transfers related to timestamps.
+
+
+{% if wire.row_minor_inconsistencies|length() == 0 %}
+  {\bf No timestamp issues detected.}
+{% else %}
+  \begin{longtable}{p{1.5cm}|r|p{5.5}}
+  {\bf Table} & {\bf Table row} & {\bf Diagnostic}
+  \\ \hline \hline
+\endfirsthead
+  {\bf Table} & {\bf Table row} & {\bf Diagnostic}
+  \\ \hline \hline
+\endhead
+  \hline \hline
+  {\bf Table} & {\bf Table row} & {\bf Diagnostic} \\
+\endfoot
+  \hline \hline
+  {\bf Table} & {\bf Table row} & {\bf Diagnostic} \\
+  \caption{Execution times not matching in wire transfers.}
+  \label{table:wire:bad_time}
+\endlastfoot
+{% for item in wire.row_minor_inconsistencies %}
+  {\tt {{ item.table }} } & {{ item.row }} & {{ item.diagnostic }} \\ \hline
+{% endfor %}
+  \end{longtable}
+{% endif %}
+
+
+\end{document}
diff --git a/contrib/render.py b/contrib/render.py
new file mode 100755
index 0000000..47c00bb
--- /dev/null
+++ b/contrib/render.py
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+# This file is in the public domain.
+
+"""Expand Jinja2 templates based on JSON input.
+
+First command-line argument must be the JSON input from taler-auditor.
+Second command-line argument must be the JSON input from the
+taler-wire-auditor.
+
+The tool then reads the template from stdin and writes the expanded
+output to stdout.
+
+TODO: proper installation, man page, error handling, --help option.
+
address@hidden Christian Grothoff
+
+"""
+
+import sys
+import json
+import jinja2
+from jinja2 import BaseLoader
+
+
+class StdinLoader(BaseLoader):
+     def __init__ (self):
+         self.path = '-'
+     def get_source(self, environment, template):
+              source = sys.stdin.read().decode('utf-8')
+              return source, self.path, lambda: false
+
+
+jsonFile1 = open (sys.argv[1], 'r')
+jsonData1 = json.load(jsonFile1)
+
+jsonFile2 = open (sys.argv[2], 'r')
+jsonData2 = json.load(jsonFile2)
+
+jinjaEnv = jinja2.Environment(loader=StdinLoader(),
+                              lstrip_blocks=True,
+                              trim_blocks=True,
+                              undefined=jinja2.StrictUndefined,
+                              autoescape=False)
+tmpl = jinjaEnv.get_template('stdin');
+
+print(tmpl.render(data = jsonData1, wire = jsonData2))
diff --git a/contrib/samples/auditor.json b/contrib/samples/auditor.json
index 1848492..1d0da4c 100644
--- a/contrib/samples/auditor.json
+++ b/contrib/samples/auditor.json
@@ -1,11737 +1,113 @@
 {
+  "reserve_balance_insufficient_inconsistencies": [],
+  "total_loss_balance_insufficient": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "reserve_balance_summary_wrong_inconsistencies": [],
+  "total_balance_summary_delta_plus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_balance_summary_delta_minus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_escrow_balance": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_active_risk": {
+    "currency": "KUDOS",
+    "value": 150,
+    "fraction": 0
+  },
+  "total_withdraw_fee_income": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 30000000
+  },
+  "total_deposit_fee_income": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 30000000
+  },
+  "total_melt_fee_income": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_refund_fee_income": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "income_fee_total": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 60000000
+  },
   "emergencies": [],
-  "row-inconsistencies": [],
-  "row-minor-inconsistencies": [],
-  "reserve-inconsistencies": [
-    {
-      "reserve_pub": "8ZV52AB6MHX8YVV0W0FHVDEZB54197JB85703J0E0AY6ZC4BFR7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZJXM9B5551GKXWVAYPXNK30M79ZGQ56C90GJXQ1QQBGPHJH55QEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TJMX59TVK8CBGJVSSPM0VF2CVAWW66G2FRJ618V06G96QT1T161G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GCR9P392CHBBZC5Q6WB638MVFNFFDHAHENXXJR0S9T2C1YQRBXM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KRF7HSVKT07XE1T6PQM2V787JG0KJP1NHDJ30QGG762AQSX7KN50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1A1CKR6CBZA9CX4SSQDQ4N3BX2H2X60YPZY415Y3D9411AGHJG70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HPKBGK7E2NB6M7W2P9W2CCSFDRXR2W35T9AXR2WXF9TDMN3V3JMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HJNDF2PAFPW42HDN9T902NDXNP859FC1FV2ATCJ5VSMNM1R61FQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7R9ZDNJV3P1ZZTK8M3CQGE3MEA5KW6178JG9G74JV91VJ7PPFW00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "98THXRYYWB3FEVR4A6Q34MERN9E4WW2EYY9JCMPX792KX67HXPNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H0TTEZ4VGNTQJ652W65CKSC8GDSBCEK1P6Q60ZGD80J7BS5DCQB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RWDA7MKZ98DS6P7N6Q7DDQM186AK872DFA7V5TKG19MMSTRWRC20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YZPTMT5D96MWP853E56K3GY7DX6NEZMMEXV0V91RZ7ZG34K8NZ30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NC02RDV3BKP0T5E5RAMNB2WWTE14DTZ0JD1SYH60VYN9WWGB9GZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "F8838830DJ2M6KXZ1R92G6NNF8D7S0QY734XP3K35XTFXSWCWQH0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2XMJAX4NJFDY3442YQEDJV9C2WSH72ARKGT7W9C5SE5B59NQ97V0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QDCMQSJZ5K106CT4Q51CQWSAPQ92PG16VEWHVQZRF3ATAB2TV8K0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G55D8ZM6M534A21HEHX0NGTX98X3QR7MPYKZ0SC06VEZK9R7GPD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8GGW3YVFF04FTPNN1D0PA4YXDHZA1MFP5YVMGXKSYG5ZQ9J39F8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QE7A14VTQZACKP85E4K93PGKKBECY0YKP8RXBKKMRSCD8HP2HNA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "W0CFNP998T148RFEEAB4VM7ZH9APD5FPYCACG0M72FB1W86QEQ80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E37MNVKKENQR3ZQTW4VT3XM6EPE1R3M91B4PVSHBSQARX43E9GW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "68DPD5K998Y8XREE91Q51V2ADB1WHFNPWTFMC3WT940D28YWVE50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7Q8SZD065QDB64VHVE8BN325Q0PGZ117YA7DWGTX31GXTEHGJ4X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CPXA5R18G77HNF1BC24GRH84XQWWNZ0RNT552T7153GW2V5P4BVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TZG11N6H199HG95PFYQBZNH138NS0SC4QSPTKDGZJNAEWMAA3J0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DX1H1HMEKR63NX6QG72BWH2PF6QG2T625W2A938P1CGNHF4ANPV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2DDX75V8ZW1A51YR4PJ133HX7E1S3V9DJ3ZSPJ9CFYM32903V36G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MY6TD61VDRF2TAC8SXXT5ZHV8V6DQPM2ZDJSYQP8ZVS4HB5YXTG0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "K1YVGX7BRKCAC6V7YB5YNSHJ73RYKJ2TBBJEXQ7475TYSKVS5VJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XK8VMEB5HVTFWKFYPH5XJNFATTRMYKNJYZQMMACCX90SY326S07G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7GDJ7QS5GKKD8YPBFQ8TVHGPS84SSS9GR5R0681XJA0G4J2R6NB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "33C2901ARBVCZAYFCQ8BDAN69CF1FJRYD3577GDQ1D16A8H0T12G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R6EWQMP7T2B6XCAJH46PJCWVVR6VFDZEMWZ0SP7RP1NMPWCN4JX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E9XQMN2A54VW3C1GZDVZ29AX057X1TGTQ2M4XFCYP0HA4BXJ8KF0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JGDKVJ5HJ90VCC1BHCQV09BYN8T57PTCT7GN3W3KNMAFT2JCCT80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DA6AMKDRB8X10SC9XVHJNA9VA9FGTBNDQQ2F75Z751G8DTKGJ37G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YM8P57X99T3J3GG5MD4HVJ21N8EGYGZ2QJVHF24Y93SWKS19ES8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D7BJD4B6SGW7W1H040MM4M4R782BGT63SQ52R20Q14KZVEYE1TEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FWGTYEWQF36N56MJ38D6SJPC0CPBBVAVR94V2D61VBF2703DYSJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DS80HSE492JXEEB0VBZKRG0CZ18FKB56T9CXGFTA8ZGXMMVYRDG0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "91WSTNPS2RKJTRQBMRA2QZ419WTR9GKK810A9KVBP7ZB3F8JQH20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8RB8AS3GQ6PKHT00XGV4T4RZ691J6WF30X33DK2W40NG156ZTXVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SFKR5GKK9DCMTDX09HR2ANDP47NVH686VSXPSVM45K6RH7XSKQPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6B2JMS5BAMKT6Z93D9GGP17R9WFJTY5JJTDGMPCGXXGM1TSJNXK0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X70QF80H5EPK5YR9NM98QKNDQFGJB9KYY3Q1WFXTEXQNJ10XJAKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PRAXN67GY19041PP80NTBT5Q0T85NCW5HAQH3GV03Y8XJMSEVET0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4TKAXYV245XAQKCJYRWPZEF5E42QKJXPDT017T0AJNT81YQMM3R0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R6DH9CVA5K3TFW0YVTN5764Z6CXJK3HQCEX361X21NEKQ9T2CZD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NKCKQYEYAFP68EQM0XGR6MP00QKAY8V15N95Z7VTJ4A1YKCRZM9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WV9HE24FV4KTJDWP6WN4WCP562KZQAY0TYH4YP34WEXTE1DPXS10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "965D34Q420Q9PK6RMTNPYDN4JTHY4ET9R86AJ7XY7RXTSD7AFGMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NZ1V3W4D9DGTYN6Z92D793G1832AA5A1MEF6JTCM83KTKFW0JBD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DTCK11V0N1PESM3GDBK5GA1PAZARZYMC8EPN6B155WRCN54JVA7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JFJR59W4G92JQEDQJG9P47MQATWNFMEMWPHD7BT5KMWVRRV8D29G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9XSZBKFF7MQXHNBM6EV1FH75HZ31TFDC32NXH2A0M3M61AG3QN0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CS2207FWY8XVCE39PKSBZTPV8YCFFYJDNGFSBKTNY602GS0E0W1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Q6ERBVVHN5Q0MXCADQH5GA386V0EK0RCXS9R2Y0T4A8JVBDDY0X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N41QF6FNFY9VK8Q933PQ8PJT6Y6HQ8RXM68XTXD9A0YVB2XS5SV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9WFKGNW4CBZVK4AYZW3PZJAR4D8FCT8478ACV5PV0CS5WRRSHW2G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VHJ8H9X567R6PFRJP85A6JJ5R2VPF2H5JQDC8QNZYQXJXWJQEK10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5NYX3M8DKSXH0Z6525E6804K4XMG1NBS349EA2VG369476HWEN00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H8N49R7D4KEJJ9BZG8QNM24Y5Y27EXSCHY3N1XCDH1VZR36PJ59G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SDC78S5A5Z3MJ6NMMYQRER463Q1ADM6Q9WW1MSG2KA6H7QW7A5P0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2QVN7XK5VS29TPKRRRB8RGSV67AQRA3G1W504047YZBE0NYGJDQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NKYJ5AQE6AWPG8XS42TB9K9HE0R560HXKAK4V4182XQP2AKNTCN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N8YQASSA4474ZWS4TQP16MRG9H1WHXKXNJZENDW5XJESX6T9Z6KG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RQA4N1DP3RP0SXHY2FPJJVWMD3MGCFYCYTY2VKH3H0QE9Z34A7E0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Y2DRYT62SQ91S83V23DR6G0EW3A2PXFPKPP86JMM7AYXD8W7067G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PB4ZKF9HF0J8B52148X104JTE35VAC89VFPXAV54RJ274DV8HBT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KCZ2WNRKPZJC2ZSR507RAE3896GH41ASTR12NGV23DD9FX6T1FMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5DZ465K5P6EHFXYDB3SHEZHG7QGKVVGZ33HAYCYHM44TGJ2JVM1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NCG9H41JCV8R2KQ71Q44S8JHPZKEZZPJTG4B0GCF9MEAT1ZH4C8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DXC077MXZ5QYJ6Y958FNSF88YZ46V2H3BRG3NNY4HJHB3539RJDG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NZWFZW7G251WMD80C4B3EXVBJCD3NB2XSX8T7XD12XQEK51H8H00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DY8XECF7BJ19ANNJ9QNH3VB49ZX4N0DV51R6ADZW7E10EM9GA9DG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GQQTFYYRA4141VXFBGT138663AD751GYQ4V7W6MBN51F8V5ATEK0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZM23WYMH8FZ7M20N9YQGZ3NAKY9MDKF6R26M0TZ9QDF4WV1841R0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T6A09HW5RCRSNM0B9SCGSTES1NRR7W6QQYHW916Y1TJW5QN2HR3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "37NV59SDCXEBF2M5ACTD463C86X1CC2KBHA1C41A4B8V38MR8MZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ABAB2J1EANGW6HJ984K4HVE9057C7H5SX2NEV3H656K9E5H4A9GG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JWEFHA9ST9K17XWBYNT32DXW7GW61TYYCJMJNNEF0S39F168WY20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KSF9E8VR88N2KAPMGYPS1P6QAXF15F1VX4S33DE4MHRFW4XDGZX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0H74YACCVQ0X9WF2JAXNNPD8MG1FAP60345H9EEPABE369BREZPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GWA4NB4KVNKFXVMGH2FA3G4C8RGWTTPMKQYYF1ZDE6DM7E3DGBQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "46MKA5QRJKBGN1P1EZP8T2TGRTV97EZTBP0210SRSX2111S07W70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XJJ7337CE50SHC5V7MY6V27B73XGGCHM8XSAES0RBAZ3XTZVDE0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "F0XN5Z03WPHBC3RW0HRGXYYCEYB7YB4X81QKSXJSM92T2PPHW0MG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SZHDF9GNQG9NHAERYBQ2TEA9XFF2Z44EHBDZR9GNKY2KDK6MPHZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VAWX6EFPNRYZ9SBMCMGVJ4ANRJGS9B3V95T9ZK0G9M02J2XRHEDG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SAKJQ4ERKX7N0TGWHC4MRWS3HDBJSQZHH3ZWVCRPHCPKJKC4JSB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JZE07XYM613DY07WAF4NV678RW8JM7JHVPDE3PW9B7NA9RCD9ZYG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SF34JEBVH5WPD7GNMSM8GM5BREA4NDGRBFMZ7WZD25SKFNKQFPHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2RFV5PCMHKANMHTZ5T5P1Y5YFRR4DYR0RTZXVB2X27WAXCNJA63G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P9J6AWSF5QQJED6QE2PF1B5KWB7TJ5K5PBV9XBK8430NA8D4WYGG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XSJFKFJCT7AJJ82VFPPH10YHYCCS0KCAKPYWANPDXW8QST116ZRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KBE6KPAE52JPTWBAWDDTTT3679QN4EDTC8MKZW958ER45TTAGXZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5SZ2FA8EWAZSY9GDWRNXYGKAS529FJZ97W16G4R0C4N3EKY7F040",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YZEVFG8CJPKY20SPDK0X1ZK0JQ3C1JCDT9AE6S8AZ7Y2P5PHSMS0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WMFBAVG2XVY5QJWH5RXCDCN9G3RHJQ75TP6T3MYRC852P0T05FV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KR3WTF6MF7CVJ41FJ4W1CXMPXAW986VFTB1S2340S5R355BJ2JYG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7TRSKCWPJTSGR05PC35JKY72DCM2H38PJZXGPJ2FQ30WC3S5JPCG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z08Z8S01KHDF3WZ4F666YD40368XE2XZEY6GERDJ58YY3EKSWNWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WZ3V1FVAWP6SS7KRARRJ9D4YTSXREZJQKP794JEJEBHQ9MKR410G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6EX3KH446ZBMP9M4ZFDA8K3B7FWR52SCMHQ7N8A1S9KBPGMXR0MG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MP9ND4HRBQSSGDVZC9F936F3A474DSHNWWNQGC853APHEVGSW6JG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GT1M8AYSM9G48794F03PW75NDTY8ACDHSERVW4ED2A84WXWQDKH0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CYCBER3ND4JQEDYQ2BQBB19K69GJEK85P1ZE75H9H24H8KD6TWF0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4J2V1661Q1SJ21GPH814XX7VNSPDR5WGNNWF8Y4TT9B407NNE7H0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6JM4WXC4QM0D4JK4K01CBRB4BDRVEJ2GF2NEBVTQXCQDAE4EV450",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4GW89Z5KNYST60MDWEQVA2PNSWWFCE5Z9TRWD2EN4RAV1KF2VFD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "23H8FTH0J1FXJS9N7V0XHP75KGGVD45VQ0EGRGHSN16PQ1Y8PJKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P4SXQ305WTV2W0AKMQ7E3VR1WFVK0RXJ3J73AHX6ZY6C6EQ4N170",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GXQ1RS4YJRHS6MDCP9QGN4XBKRJB2NZ0DYWK705MGYQ587K2ZN80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SF93HCBSKNXPYC5RPC6KBVD4TYD333GBH6DRPC81SY24WEBY0260",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XH6X1XCE0VRB87W2ZYYJKNYGM65DWC1CSD0JZ4XJ9S69P6BAR4YG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GT3AJ4DMKBN2ZA397MSBGGVAFGWBZ5QSXPVEHBX6FNNK80B984YG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TSH0GD1YGEQY8MR5JC8TPTTPGJSGB3EV4ZGCBZTP46P6QRDAYFHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z706KF6HKT8ZG6K1YA796QZ6C6RYDZ9NQMXTBYBQKX1PHZRZ5X8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VPHJFH0N5F3KHZ9X5F68VNKVVHXTZZDXZYYP744XQDBVYTN14900",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0G5JKFVXSDHW6B03H8QAMHSZ3FRVBDNYS0MTASX11G68KFT60QW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HCPZD80RQH1P5SEKEJFTCDQ1SMJGJF4DCYTFCS564FHW9RXH0FN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DH6ANP2YN928BTT8G7WH2RN9PX0KQG6Y0HWT6HREDC7MFZCA58TG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3GZNVBN60H3D9NJ9ZRFTPGX02QVRJMR67NDHVEZCP9AWWJPHHJTG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8FN8C8VXJZV9VVGCH0AQX4G815P8QB1044B8VPBR5RZSEW6VV9X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HNF2K3YQMGFCNKBVMMC6AJDHM46PVM8X2B1BYZSY77QGX731VP80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "K5EDQ58J67KGYMCDN6VDYMM2V9CJ4NA8H247B2526MYF9JRB5YMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RMHKXT2EQ2B20KAWJR7N4HWW8FGCR3JZFGAPCR42K6XETVTQ8EZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EV38SES4KZXGBCJVZANW4885E7A5YMHP8C3EWBMGF1XJ73W954YG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7SZM3K3GPCJ5FZZMRDFE5H7WNPZ0RRJM2PFSBRGNFZX3Z0CS31J0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AY7GM4G52VMV2VN5AFF82G9SMGFPEBNW69J909JBFCMDBHPAWSA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VBZVCSKTDK3VDDJ4AT904PDCCKSCA4Y8CWNH3KBMVZNMCC60NJEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FBX6317CV0EBMSB6FNQAA72AYFD3K5FXCCEQETNQ98NQSG99SV8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PSV3X7F6S2B31ZY6GH9RJ5PMYSQH0X3TRXNGCRZT5G31RYAVKQSG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GYC867JNM5D7X64VRCNB0CQM2CPJ2YPDP8N1H8VMY5FGW65CSD60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XHMDKBH49J5T0FSGWVP8S8J700PKS4K3D48TXAT17J977ZBWEKR0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QS0EX9YK2ZTMS09MD6STWQ51JVGKC5WDQ9F81BSMJ1JYAYGB4QBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5TDXNCYN0P89PXGF3800R81FWRVBEKP6RB1D5RHZ4VKYFXTYK5KG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1J2TZDYEDSM2MCJHC64VNCN6GSV3HN1ZZZZAW1TBJZV32VKTXC80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H3P2JXFDVY057PZ4A3XGTW0M78NHSNJGGFXDN3995N76FM4M9CW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VC6KRMYN0FDVJBSFQWQ7D1EH9GTN7REC6FY398JPQ85Z74QH37X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "53E091E3YEWER57M12P9R7BF08BRH4WR7K5RXMCYAQTF812HQNZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2JFQK8CEWCPW9NR79Q80TJA8S4C7TJVQY2WYNNKNBAXB3JY3SCTG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GASHZ1ZJPD8XY4CTTYXJRY0TYPZS9DDX0FR3DEPFGFPDYHER5EW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G80TWQ602VTGDE54ZH2A873B3D7W9JH0N113953S7YHNZCDA9MRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6FT82396X250SEE3TAB35PFRB8KTF2FKCC5X5RSM3QBT12VQMAW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VJSDEJ16B67N1VR2AA8RPFZY8VY0V90Z9D4FVKG5P2WAH6KQB55G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RXS70DGBS4NWJNCRSEEVP37Z386MV5Z71VHHTTQDCN45MMDPYDP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5T1W7ACKKE38KFM56PRPVR4Y7KZ9R585CCXZWXFWSDKQ2H340E40",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SWZYF5VXXD8Q3Z27FFB9J1W4RFTVQ7RJE7S0068J53NV7WZ4KKAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7E23H6FAQR882GQCWD8Z05Q8Z4K9D6THYR742N83ACXSSZXPGPZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ACC5S73VCQ1BF0SN509D1CHQR2NWB0KHR3DWC3N0PB9Q3E7JNKK0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X2JK6S3VVS8KX3SGJVDE49PXW2HQMEPRW8K3R6YPSH06GY5FT6C0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "K603M3BNYAVC0VZ51VH42XX6VTY8SS3S3VA07KH44V5XX8SPB0PG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZRNZGNR5AT1PBBYG5XM5SH33A2F7ZSZGJ62RXRETCVNW1VCGAWV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "32VDNHA7A7Z8MVZVHXF5B9E16QRBXK7DM1MEQMHBQ8JTA6CW1X50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YVPMJSSMKFT02PAQD1TKF4Q4QXH9H07XTH9GQX5TSHV5N5WTJ0FG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JM31ZPDEJ7FP8R8J5G1JX39G98PJGTSK7F0HEFD5Z7N0MMEGFKA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4TK2VZWZPCD5DFNX4124DTCE52XBQNRDCMAZH7VD65QY199EDC60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H6FC1MWRCFTFEXVBSDZ6NVTDDTKWP53VVTEFT527QRD4JRBDKPAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ENN2AY3MBPVM6PZWVYW2E0Y8GA3DXKY2CTEZ4NPW3HQ5BEHMM0AG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8QSRS83KD7XYX430N290HWV38J12JMKNSJCWPJD6Q2EG549P9B60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MF7SEEBW0JQNGZSWK7YHS5W6RSRN1V1S4Y7C8WRQWA6HE8BASFY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MFFH7SGZ9XVNHEGFTR5MWJH7YT8KCTYDE71XHVW9W1A4GSRK4GVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "54QK3NPWRJ5JFBVVRJRRGK940V7H27DTZDRPC5QWKESP8F9GMY8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EYNWH3QG84A1PNACQ96BKT6NG0TDK2MXEPD0QAGZDTDPMSSZBSRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "10KBXRGYYP9V4DBS4NSFSMTJX2W0G724J7JCH0FDQHS985ZWV82G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P8TQ0BA3KM96TWBENSRJRZRW8FPE12X650R46HHVXKSRFNBJ5C9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "APN2QE5M4EY3B1V8T8JH1DK4Z3K3D8X18NWFVAYSE67TK5XVBGJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6X8RQ8XFA6XHAACQ2MVYE21GMWQ0M4TV2DYNR1CT0NFWEZW9HQJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DA3YKQQY13BC0ZTDVXGFVCSEECPCQ38434GZXYW9VRESZ0BN9M1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SFZA39BD0VZYW63Q6FNKMVYVQ68S01NZYD8R7XD94J7MBH9YW710",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Q60B2Y3YJ71KJHEKBD0E77H2GTD6Q2PJHS3VY7P0TABV02B7AWV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1QEX5G6QMRK1RRBZZ17FQ7X9VNEQK9T4T2PTQ7P1WNR457XZ3930",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YQPP24Y3WMVDCB3Z9SSZDYRWVBEEFQ2MKVZZN277S3R34T42HFBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "M7037WZAB3523QW5M8GZF77X8CB21FA0XJ2JEBXX431PRPHAJ4J0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RJCVEPADX6MFQZNX87N2H2T5J15K8N7K4XSHRT95ZX34GD3P7SD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X8Y4N75P4V8ANMS47NFM3H06T0E9NJT8V6GMP2HXRD0XHAFP4XH0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WS4RJ5HS0A55H7ZQRA421T22DR0BZKK3PVAMPGB7V2A4FM08FJHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Q0DF4K3P69HY75129H45N20F7FFJ5HVTCTDMD4BNGZ9M8CX8A8BG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YSF6F2BD8PDGJBR7WDMQXGGT58DJ789BTRQHAY85QD80Q6GPZ8GG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D6YE6SFEKQCP5R1PNJFAJ8XSTJH2P85061M6P3EH9CE6APWYT7N0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2F38C68K5DWQ1T3A40Z5DZK164821XX8TD4ZMV0CSKV0S6HS5AB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D3AQA0VRD4Y91M1TTNGQBQ26A34FY5TSP1BEZ2WJ5H2QJAQHTTNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "K4K0B7357NRWTZ2A5NFG1N46JGQQ3HXPRS9W07JZ40X5090K3EQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8Y6XDXXXS416J8BE2WAKR79RGYFFXVV5J0S4XZSBD3RG39MSM2P0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "69DMS3TMHQ1R0PEG7EN1JHFWRRQBXZYH4JE3DW6PK7T8W67Y00VG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3V63YJGDMTKM8ZJ05VMKA9TH408053SXYS950EA8GP0QDSB1N3DG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "354ZFTRWX0R2JY5AF7HQGNJSPMGSHPX2K44P34B6RGGSPKH6478G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NE8VG1999FM31R79SJT0V4QP7CBBC1NQS2Q25CR5RHKMBMFWBENG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R6R2J0QJ3E82FQ0WMGT2AMJ1ZGR05FWXEZNKET0M33G7K4PS47HG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E0YP64K6TJNREM3EPF03ZKB8TWYMZ19Q50G5K1Q99D4QRNE23PGG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "M34490SCNZR0MF1CJNTC9EN4Y96WZ985KGJA3FCAMA2GK5J27YP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XHT12RV3D1VZFHDY1PD490GE0XD81E598PVYBFTDCVY2YYH5KT80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5W041WC3PKC1V9JW423HHRTYBSDSPK3WATJS35NK2SGG9S63MJ50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BDQRDQ6NG7PBPF76DTX5PYTY73REGRPSEXAAZP053WG0QTJFJM30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TA61C4DK8VSD2F0C8CAYH7QRK8B7HTR71MVG1PFX54MQAMXPDV6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7RRNY435S8TMRCCH440422Z8V9CY1NBEVPKQYC7TXQ0N3F7XFBBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CJC6T2VKA9W6HHSZXFCR8K8QFGWAVQ85P14NK8011WGAHECX372G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RSZ7JFHGRSKKTWSVVKE39N9XYV49EGJHGGP7JQZY36AGCP6VQXY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8ES5VVMJ8R22Y360H0PJ3Q0F5CPTZY4ZM850TVN7JQHAZBTCPVEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EF0YGPBPS8S5007QGXFQN6F21KM3CK60QHBMDK8S17YPAEFVZBR0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RWDGR2KAH36A6MHAAWVXBJJ5SP27MAZDRPYXJKCRHTATTPVXPD7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0RJHDS4F3JDFDHXBBTZT4ATTKQ88R43J843WQY3X4QHMM35NAV80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MGNAZE7CN1ZHC719SFCYBDE57GFSCRXV5XY145GQ3FBQKEASQ0CG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SRJZQV63WN0JRBKDZYTBN0R1H0BFP272M4VZWRZVJGMHJ0QNKDB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DF18FHCB0XGGRVD4KBC8NFMSVCTN0JYF6M8PWC4Y4V39FF8Y3430",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NHXF6V8FXCH6TBA02H7A3AE9B4K7V0TV2C2A0V1GGRKHDRW6MDHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "B6RP7KFYAEQBWGFWD5DTQVJFCEAEQH3X7SCEDPF9REXP1615ZXT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "42TATKYEBV5Y5TE3HEVSBBZFF8EVPHKT9WEYNWDJXNFY67290HJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AMH9SMPYSYQXFWJ3CRFN1ZSPVXPD04DDMQJYV9D3N67WB8C5R820",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PYQNERJ0KV9N2KSJDNW8J0Q8S3017T5JEV5ZP7GGVJYX8CZ58PM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "89GVQ3EJ610PGZR96T33GN410VDXCM02A2MJPFGQMSSY7MA1BK2G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9REGXXQYZPWHRSCGBHKXSTCRFRYZG9RHGME9WHPBWEVV95ME46S0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5RYA42N7Q3N40NED31T46XNPP74P089XZK0ZHHSGFQ4HF13KE8V0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1YH4FB6S3E30JDAF419BA8G39NB97Z61RT7YKSQ4VBD16GQDW9RG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3ME5JJGW33QSGVEMCHV4ZAQYB5XCYAVF3GE2F0YQFMG15RR1Q1Z0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2FRFYDRVPYS4TABG7DDN251SB3M0TGJJJ7GBP87E2VW9DKY1PG5G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "J4D7DW8F7DPH6YJJZ96XB09GBVH95SXZHX4GTEETGPVZDWR7G4DG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "14MTRH9N4HP8R8NMQ3Q48K68AV8998MTB6MVE7V6D4KCMD7XBN5G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "W26W6KVWJ9G887K7HGSBERH74YGR0AZ2NTSSZ8NXSS3JMJBKTCBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QG3RZ288S22Q8REVHCVEF7KNEF6QNYQ4M2T7CX20EB7HHH773BAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BJ5SF3VF8G6ZCZ5CH25EN9N2AR5GFVAF4N3AMPPC40SBCSQ92JP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "THVEGH9C995HJXEZMV0AP69Z26RXHY6AS7KGJF0H0A7ZFRVP2B90",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T6RVXZ3YMV53KFFHT98NFPTPFC4H6Y48QGPAFW3JBVPWTTJKVKX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KZNJNAA6XKQ99JVM9ZRCJ8MZ42MPWQX2TD6NPR0B8KGXYWH7RWXG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EBZVS4JEREDSHC8KJG21VD1JBHMN4A0DPH8T0H2C693YB9N7WHZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BTQSRQC7ERPXRFP66NE1KFN98Q7N0CESPQ55E21J3VQ0HRRTDYW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7AGZAXMGQVS3NWJ7TFWQAC6593AD64P7BBJWDKRDZ4QZ8QZ90F00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6SF5S00RK68RAVJY4739SX8VWN5FXGEWHAPXE85C1DXCZM4BW8CG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FST0J75W7H8H08AFDHP2Q88GJ8Z5SAN7EH19YQJ6C31W01F0ATPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YC246FX5E4XZEQD5XNT9V2D5SPPP9J3ZVM60DD9HJA4BFBZFJP30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "C4DFKHJWYZK2ZTJ1Z3YN91FVZ5KPVGBZHZTAEGEYNVCM98FQCD20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R6KQDA3W40B4H94HJAH07PWZ0JABXJZS90TCHYAM031TV52N5BP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RAQ2YBNMDWCFFKQJWTR5Z8BAGP7YKJ6T96HNBZSSRR42NDCFJ35G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9KSQ49Z9X0YXH64D2TAW2S6EJPB242NZ5E7ZP6CR500ZXMZTET30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PPKMAVKC8RT4CDBVJ352P63EE5WJRQHP1XWG3XR3HT7XM9SK56KG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1YFSMEDVFB5PGW04T0HPB0DNFVBRSW5Y6F7Z41S4JT2X2YT170S0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HX7R0EWRDZPY6HJH4HR4V957Q1373SB9ZAF5TRWAZTDRQ3TP4SNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P9W4FZQ7D6BB6M0H9TSXSDB4EJ7VW3VHCPN4GYKVCPHT40BHZWQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AQ1MRDM6Q95TFKCJZK2QKPPSFWD1M4M8S4B6RPZ1KB3JN9J181JG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BN8H3PCNG5BZBSYNK2Z43Z25Q5CS65ZT9HJMZV2ZTKHKHB5CDWZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HARKJNGR5NFV87PKF6M1FRH70XREERW0SX31XNNFYN8KVFR8Q630",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CKJA9E7332B4ASFMJZGN9E2AD33W3BEX05S89V1C3F6Q8RTFBKJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GVH6B061YAH2N91SYJTDK5D7QM41ZWN3XA1RYX7D086XSJZASZKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VXMPN88WC1HA056RP2GX9Z465VKW68WM0NDXN1BRZ73REM3KQQNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D7A037JZP99RN3TZXFJNQJHKTZZQ95F1PK0DGYT2XT0VNN7PJ460",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "J2PEDWSR0KDFK8PN4VC31SA1KQ1W7KQ4H88EH5JY45XV34YR5T40",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RNSKC282QT24MC33GQV3MEJMCJYHQYSWR6MGC29JJYVCVQTB593G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S9PRSTN1JQ3ZJTZ3Z1YJ2TBM8GRNHTYMJHC2SGGC6YK87HPPXJ3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CVY0JMX9FCZXVNMB4S4SV9WHDW200BK213QPS789BRKY7MD4YC7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5CQJXWH3ZSADG272HPF9JA5V31E7K479M2FMDGDE2XCSM4A09BZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FRWJ01A7W0EQEPAY0BT0ND6B7YBRK98YGC3P7ADHH4XWKC5E50M0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z2TAQ9X5EA92MJ2Z5K0E7VXEQYGGBCY58RCPERVM2P2WWE49VDPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XFM9168FAHJX0QGBT4HCRMY85CKB0NT04X6178DTDGT2T2R03VF0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N5ZGERJ7ETNMV3QNYYX66YXEK0WAAC5W90DTSWNFMM5YSDT7FD1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GZMVXXXGAJPGPZ2284R7F19AGCHR0ZF3590KBVMA5PZ7VR5NCFB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "M18B9BWETER0BNMTASA9VP0N3PMM46S1RZE0EQQ48A4EW7DVXQP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9T33Y3D6VPWWRVDM8YK6GR3945VM4MFQ5N457MVCQNMRCH378930",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X8PCM80BRQV39GJ365HE8BG05P921TBF17T1X01YJMWBHJXYPNY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6HP4RDZ8CBREDVAHQFXXSZ526BWJ37D72GND862844MN2MF9DBD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "54912W2G34F68A3MTR5XDRRWCC82HJSD9WAT3Q14NM8MWCYEZG40",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WHN4NVV0ZB3X6G0XP7THCWGG3SZD7Z0CMN0NSWMKWEAHB6HDJVJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ENEK3RF44GK8RYGQFYX23G4B7PXYXYX70DN5JCGFD9X9R4Y2JFGG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PDDCHA45Q5VKXVHVF8EA0N39GAD8DPF53P1RB6VW14331E9CQXY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "A5PEZT7HNS6S2N67A92DRG9YCBC5J7HSTYQZVADSTXDGYMVCFR6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DCKJSCPVNYE4B61RK9ZAEMNY7F54KBX7V5E8DKT9RC323B7RCDQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "W1R1CCSQPRHCDRMCS8HT910VWMSHAYPBZG3A2HM5Q0FYT2BP6860",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GF1542R7JMCB107ETXDK25M4N3DNHK0PZVN28WY9KXYPYJVDRYK0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ADAF96R91E5RTJ013NGE34TQJSHMV4K5AXWWT6J8Y5T1963TAZ7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VNZJED1MNW3EQ7BCT79J8E6C10QHXBDEE9X709M8H0433Y6AX42G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0CTAS9XKVC7J2FDBR5HHJTS7B0MYG0R1B6JDJY7R521807ZTXET0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "31NK4XJQG4VTG6ZEVKFHRPRRMZ572X8JJYE9AQX9ZYQ6VCYC0HNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "APEWZD36K7SMHFPY9DGRTZVH7GX7YA7QMJ1G6W4Z1JJ2E97SP670",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6Z5QJWHCG4NVBRW4S9SFBMVGRH823R66FV06TYX8BE601CSZCC00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EV5SCRQ47546WQ3KRCA7B8CSE2TSGF5BJJ4FYQK52HM0F57CVP8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9PNN63EKAJFB6KWKHZRD7T5712DZVKRJX4JKD2FYY6QB8YQHSNJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7292HFBJNFH8G9B3TE8F2W8VMZAPHD0Y5XSDAD9MDKREP2PEDP6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MEXMC8Z9HZ4PBHM4QQQNE1WP59KKG2A6PV2AFJ9K0D8JFHS1ABF0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EHKJG3404NCSYMQDBK6JEP7RASM6WPRRHB48ZYD1JWY0M3ZJ8VC0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "63ZTWF0ZTYG352GKDFZ1RKY0W1D56AX63S8J51BPET3RA2YXWY40",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "36FXVZPKM5NF2G2Q4NT38WTEF57KDS8T0C2M6TT58BFPQ7C7NRWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7TFZWEX698DJ9GZATZK5SMVHSWMHYB92P92CQG8TZ6N32ZH35SW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R8KSJCT2NFTBATZKN6M7BQN8S2MAMH4TC9N2X2JYKEQMV9XKXJB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SZ8Z0KS2RS7NXRTVJEE226DBP57BY467NCJ99548GYDFGERNJFT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H1D9A50T0PWRAMDDEZDRYHY4QYCF3FJ5ZDTDF62Q457483CN5MCG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EFQQFHAWPS35HN12V022X50AP4YPGPKX55ZTMM0944GN67YVAJ5G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0CFJ3QSSG2JWE2ZT4M21KKQ3GYP19JVHVRARM71ZJ62JE42GMD10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0T2ESYT4Z4JX3AZ3JDP3GYDZ9W864RAY77STV334T4CSMQJ2BM00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "10YT3WXY0QNJW2MCFTF9RCVGEX6CKWQNADWK884X5DJH279HJRY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PBFYC80S5T8FME0RJJR6JJ2BVJBWG9HDTYJG7TW2MN3JEPYZBAE0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "79FZG4V73KMRNG4GKGJC2Q57HSKZ25JSTPK64SRDDF11JKZ53A70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T9SQF1QSNGTTW9RAD8VGG0Z22GDFMADBXAFFF6KQBZWMST6D7F00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NM1GA6N9AAR2PNM9XC246C4KX95ZC21MHPP5FZ3Z7F64A80TXAX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2WWM7EC9XVBAEBCN7TRPZYDQDHR3RK5X0SS8D967RE8KBBQ14RP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T75XY9D4K71FG0435ZF6GC73ZD6KMRFJ405PWZGZ220K4TS1X620",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3R0ET8N5B7ECRAJZSCP33DWCRE042S1XKMK611C7V0VJWXFPY1D0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z3KGX3T977TXSHZQ1M822F5QSZ2XSXMYY1H692H580725F3A5YK0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TB86YBGP7WHPE2TEDQMSYGWJ9MDQQAZGSTYGR1TFGFJTVNQ96VAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "A2R3NPMWTXKF6V9E9V65TMWXJ0H1XT4YD0D8KCQZET6HEWX67VVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5X9M21043RAY20QBTVWJ9QWA1WEE5R31FCPKM9HC8T7H9J0JQ6P0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XRTN1Q02RBR0M9EPJZNTBB5T9HC94QFGVSY4VB7JYWAZA0Q0T4ZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "863R69FPFK1R7GJE0QJWBTTMYJJX5MXYDTSWK94MMM589TNWYNW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Q8DYHC6AKHC7CS85PAF8BT0R8A3B5H00F0PZ8VJY1QP98WA7E4X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QX562EK2581ZBMYV7APZ5P50K0Z511BNXX70AX7AK5SPZRHW0NYG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S3NK7HMFJ6QPZTT3YKDN2WXVBKKG1A162AGYXCPG8M4FM97Y3E50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "K6S4BF4ZQTVMXD2RVAWNQC13C15Z249WMGY23Y0JKEQ3BFE2KDQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8METC0RJ7VE0861YHZT8YVZQ8F3RJXTCDCMDP9P1GH7FA3GFTZD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "92QC11ZGF0AFN9K2WGBR0SNCNAB48ZEWNVJRZ2ESH8AP96HBPPHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XVMX2S1EJ6HJ6YEWDBND3A0R9G87BQRW367GE6NRZRWGKGF2VPEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0QZ2HEK7FYWFYK9GA7EPRB90ENDMBRHM9DVQM0EAWHEDMZ3R9ZGG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S3BYDERHK76XA7QNYDFARW1W2R6TG5N0363NR8PW6F0QTV1NR58G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YCYXTAG3JB6CS18S53THCHK1DCE5ZKZ4SE0BXJNQAX4JKX3TQSR0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QB6MPEPCJP5N2K4YT8A1EWMHTE42ZRJS647B90GMSSKR1F7EXTY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "A2GJCKWPE8NP5F11THDMBGNKJJC12GWHKBWM80RBR4FTMGR4X1W0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3SYFG08BMT9VRW6W7JS98FSB934TA4TPP8A82041TBPBD0DYM4DG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BN47H1QPM4XJG0MZ5XKNMYY6R6AN1RS4P83XZ1ZAMSRR41H87P3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CX3KR35YHQD7AZMQ1ANZM8M1447GPA13GNPQDPKY23QFH7ACCAFG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EMDG8MEXCVG9FGWH9WKDV9AFMX8AZS5PGN01P0N37D92XS3RJX00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "46HTK122WRSXDS82D877SHK7X9BHGPK8KHRTY333JA2D02VEYMTG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EYHSF8ZRDVBXRTAFNA72HV9T3AVWR4GMMX170RZN6BNRYKQQ5SWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TE5H9EP7E4H9X2V777JA683Z229SXBEFNA3TQ9A8WBVP7Z0MWVNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CGPR1TQSJ0KGHT743Y1G02VHYJ3GPATS54QRAV3E5XYQGXW711KG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "B2V81QPB7T3DHBCAYJ6AEV1C5EQ41GGP3X611RRTDKNSSKXH70K0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4MABC7CYPG5FWWN6ZPF3P9MKRWSBSS3PSEB8EEEHSFD408MDJ4D0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AVY3HHXRDD3QR8MC19FDP6V7WXNQ82ZH84PRM4TNMVBFJEWSJCRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HWXB4NX8HGEQDY8C4F1P1DDVHAAAK9E8YD1MZR0W08XA9YTR9SRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YSQQKNC1X1GX8DWKTJXYQC10PCE1V5W36BSNA7Q5D4E8YX92V4C0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S2GE5FADBPXRT04091H9QTY4HNHW81T3C3AQ89MEDSA5NDHHDHXG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YJ375Z9NTB6DJC1XYVCFHF4AQHJBM16N6B8N3WQN8E23AVX5JZA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WGX6NQ3R933JK3J4P5CVV2C2KTN9BRW9H0SJMM9ASXAQTBGF61EG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZW0GWP37TBQ0CCFXEG12R0TSM51JAQCBNWA2FHKGZZGV95QCK3F0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BPYDG93N8AWW2A00TJRAXE0X7YJHJVVDV9R56CKW7RRQNCXRX2R0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0ASCG912FBYWYGXNPWQ7WHZCANTF4KZPY1JNCBTFFQ984B4KFED0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "F54NPHAAY2EZKY9ZHDJ5EVZT73QVJS754DSG2E9KXPN0A1N7560G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SCGE6RPN942WEXGT87ACW2T5A99YDFFXAQQVNSRGG58PBE1CMA20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RY9BGRQTV36DP6CDAEP90YDZY7JNKVE40ZBAD2XKVXHQ1QCB2QZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FETMWBDAR53P19N3H8NJMJRS0D2BTPYKXCQTBHCX6EJBWTAV0D3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4F4AVFEWPMQHCAN5Y7B4N3VH6S2MJ577H8NCB37V5CYBQA539TA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "09EWDW3S46MG1B6XSHBJMS1FNG1J85H1HCGV8S8YN77ZFGC61QK0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XQ5HFHKDAQNBKWHVQVCRWKT4XDND60B3VT0ZEV08E3BZD70BA2CG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5GX0M78E60YVQ82VZ36M4GFPQ33ZDXFSKMKNTA2VYY7T76ND8SCG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6CHH40JP8GMYJJ19G9QHEZZCAFF1JRAB6MZR51FNK3ZQEJ5R2Y10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "A76V2FDBP3EZKBT5P6YCJXQH73X7K2ABE3DJ9C8CZ44GMFYTJRA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "W0RWJ2Z5Z21SK6TYMRXW2N5GDPBXBQRW36X2BXPDEQYT1AWGMEYG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AW0GXCZGRVZ4ZG1RWVS3JVT7FGP9CKH2SV1NKN9QRXQEVGGSGXR0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MR288XSZ65313BN0BD8KD5QZ5R89NQ277AF5WNX0MJYJWJER3Q80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "952NF7PZMHRCYSKBDYE4Y3M438TZNDJM9T85F80X7WKWE0AXD6KG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZXPYB7GNH578RJVK861EK8X81T2TQ1TCD7Y50ER1QSH4CXAMQHA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HESSVCNM6WYC58GYKG4ME6MZWN8C8YRBSTHGYSG8X4MBNWAV5M0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QZZ1FZVFNPE4VN0B4XEF5BHT5MKM9CZFBH4JMS9FHAQG8R74WDCG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8FD8NCCNYM2461682WW43KY1VZE6FTB67DXT7BEAR3CXGZVTZRZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X3MEH9JZM5RBZCJYH8GHFM7JGC8FMWC981525DSADYTYCNTS3SAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VYZS03TB7SVGMGYQZBJRBDJEAYYKAANARRPE9QWC6Q4TYSPNPG6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S2YV13BD8X6BQTZW0FPFXN6064K97J4D0YS62RF0PP7XW16RVTJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2TQM5J443EADA2YRFDEHFQ1TQGK7CHZXRWGBB8NW3W1F0CSFWCV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T1Y35C2XMH4VPTH76BW0M18PCHJ5T543QWQQYR8468BJV5NNBVC0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XYTKMH78YSQNCSM8D94A4174JP73JABZ03AH4VS34DT3JYV9XPPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "801Y8ZM6WV78P20HH4R6SZ5EZRDJFWEST5RSFVWQMHJRK9M8AAJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X49NQ85YMXHQJGRDHQ7P8KZ5X2C50MMCZBKKXBJYMX9WPTJHY9D0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HKP3E7XTFBZXP95PH4Z9YE1RPKNF1ZJ6Y497ZJ9GYHP9JMVX0N30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SEKT2EBMWC379288ACHCNJSXNWQ1F333S5B04TRQM17NP6XSEHWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "97MH379M67TZNJSS2F0QNKBQ7DX9WX8K21Y3A9TP6RPXW5HEKRVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "36D46BTJ71V704WM1AS3FRVH6F33GGVQRCS1XNEKR9F0XC5PAMNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EXX3G37FFHP3QAXAGHJ7DCBQADG44R1T5TFBBE4P86GWXWY8C3BG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WAF611F18ZJFV0TPVN4JDFBJ5VQ7DGV7YGF881GKN3TSRDQXEK40",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "J9M3JDJDMV29SBMPEMDE5HTZRYYS4MRWZBF4RMZHYK0Y4JTK44Q0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "M50RGZ0PH2QRFJHF3PFE1JBKM437CMB0401HARWYQ8NV5QBYSPKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7BVPB0XWJ200Z8HKZMPHGXDAP9B95GD2VYX0VYX5CBVB4RKDTG3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VNDX56Q6W5RBESEH8NRBM1XQQX3TX3C258TH27BNV6PSZZY279AG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6Y3136FPT91E2724T4FTTY4SS7DGB9KK8GB40BSZ8TZ8FCT6FS30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CJRRZ0S47W89M92YZ8HREAS7P61NWA6ACJD5F4Y2NH3P8YWFD4B0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TMMX5BA6WJ0M6CJJDM6DAV2D4M5QFHN5YE5KQ3CAKY824E4RKPB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TJGB8AF8NMDVPVT58ZYDM74VRA6BBRFG4Z2761FXYRGWJVNJPYZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YF29DCF4S38TGYFBCJR1D55T8DVZQ01XYN3G5W1CT1438T8DCX70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YWJ3GYPG00ZYRKXTJP2047JCW36H6Y3NMFZEV5RAE581EKSNP1NG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z68Q27CBYEZBT8ZD43VKY5SWS05K0DY0WNEGVPK0QAHE8ND3127G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S95N1VWDXN8KDVK09TFHCCM05VEBSR5JCQBYKQXD4DJS3EBJC81G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T3EY154881GJY3YRRR0RNV8RGB1NV8S96SWGW936TMTMFE6AB1ZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "F5FZ2VGPZXS5F4CY2ZCGY49J11RYRNWNWGCTF0CMJPN496A7K960",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "52MME29FC243FB4HZC4HRART8EX3Z00PKS7BTVBTRSCRENWSC020",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4Y16BA2NDGV68R0WN3R4ZCZW9C68Q79534XGHTNTQ4SKWA0D5BCG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KTPRM4J837HHYJM3VBW59Z4MAT514GMG6EPN3T8EK4RRT2SZ5240",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7VTHF3229S2CGP7CVPWDGHAY652XSKVGMFGA8JCYETHKER9FH6T0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BVQT07KTD2K8WWRK9C1SBW5V8SDXE2AWAWW801DHMDBGBF0HYWX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BXFP998HBRG30RHXWVHDXE434NGRF39R3R7R5SSJMNCHMKWCKSN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D9QG6Y250H76G7913P9M610AHQXH1AN0QGZT1NW2MCJ6460WXXP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H7KVTQMGQCXG4FKEFMN2NEESFDGQZS1185D4H41HWPD8AQ14PA60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DA5DZMN77B79K3Y7H07SN7XTX1H91ZJ62PMXFFP0KA6JXJAJ7XJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7SQ0DFJF126Y72YEJ7TH6THDMYXKSNEBJ5RPV0CT5SAR6VE6DEB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KNNYCY6258D9JQ0T3DW6X201EYEMYCETNEC2QCJRD7XHEJ9V0C6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G8T9ATAJQSCEAN6TWMW0BVNBCKEXK83108TN20QRTJR3RN1PR1VG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SB1716AEXB0K44MWGCAB0E2QYWV443BYFG0JNBDG25ECWGSAGFJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1BQGW59MZJCQMSRNA0AJGA6M0DWPKKZYQVZCW3ZM1Y5GBN9FJMD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8AEBK5G2HPWEDS9AY1B569HCPVEV6QEPS5M9BB28WSTR2NDZPBZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P08XKV98Q3HXM0RPQXZ2VTFT2CBZY2W0VJGXW8PSHS7JNKZBNBE0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D8RHFG1BYH2EQQQSNBSWYNQ2CNRHQNK682MRY70W68KQ24B51EXG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "W7F0JA4AAFCX2Y7FKB78KZ94W88C6JCA3V9P7FXG6FK01J07CMW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RV5SNA1Z670TKNZ1MR2Y51XHGJBS75TR49R7FX74KJ0DH17DY9JG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "70DZ4D0228DAAVQZKH9JRKS9XF6C74R18JPQWKWANFYHGRZ4VBJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TYQCE0DH59H1PS0YCYJQXY6DXZM7T0XHM6Z6G0C44Y8KQ1MC3YA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NRX8SEB5PA3KW124JB28Y5DJM8G69D0TA00DJ3MG2NGTA7D05T30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4PCX5KM2H5WN6A7P2E8NVYJJCZMVEKM07N57W3Y0Z24VZA20WWQG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MZEBEZQ7QWE1SVF8Z6FBESC8T73H6WQT4PM46VXMBT0FVB4SNW80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E2PHPNC8JMAPPX54ZT36MFV3DCYZG5K504AN77G6FQYKKE3MGEYG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3HCD5AGY29004MEK89Y13B3BCEHN45AAX0RN1V15SSQGGQPRQ3DG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DKBNGTJC4RZDZ5SKMB16BN27973MQR1NAB3ZXEDGPZD8DARGXJ3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ETQZWR748KFKF37JVTKK0G8MD72K49MS18FA5GA5RZ129T45PT20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CYQX1M38R4Q551Z1RFE2298WSTP7CDWF1DBS5TTAAYD5856A1340",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EY3KAE5B64S2MXSF0CM2BW53043KX19FRJH3DAQK9J26KSKE0JAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "68HTVMJGEPE25G6ZVFMJJAES9SKJPK0S40PEHQD9S89VF9PET78G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SKH6YXXWSQ1ACQTJGMXVPF9JV2F5JEYRXHC2G37E31TFJ3K00WBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7F0N7P5NX4JMQ3BHJKH83NPHKZ6NXDV39M3CEAN6WXYPVJ947J4G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZK0S8APWSQAH4SSXK62B2MMDJBCGNYRVX8ZWWVAD6W13W2TPCK6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z116P9CCR2BM6ANH32RP5NCCJQCBXR51BF92WXAQ5QCFR28G9WEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MWT808JVRRC0CKDBPJ0ZH5TSS0Y7GJP22RTY6AKN0XHWRE9EE2DG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YK7RGXR8K1X60JM4P56CT6FFST7Q93C0JZBWPWBXPKHJ795XXCAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3VQZ59VK97KW2FC1V6PME87SE08PV2JQXF0A58N75HGQ9N7Z09X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "12TQTR7S0SPKZGM5J38ABWJFQPJGP7FQPXSR4EVMESGXVR9MVW40",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4RK83SFKBMQHSCE78X41GEA4C41BCM31V4QG3BX6NKDJFCPZ2JJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DJ23WS41K0WAGJHNN2AN2PWPWKT2MDBEZQZYV1Y8EG5SK7QVT9E0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EV12RZ4VFESA955ECKECN9T0FSA9VJ9ATP1C5A50Y49WQF81JGTG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VHHQ2PTQY19VRFXTP9FQRRCYR6TXXG19TXNY5ZG7EMBA6FC27650",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "882P8FBMXWHQNFE8NE7C0EYQRY0EA3NYTWF6X1NHTNBXWEVGVEG0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "C1AFJC4TY1WK0RKR3GNCSNWVZS252GCR6XFS1EKGJX6GTH9M8KA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WQKEAX2GVWBK5WV0D4024P4BTXPQ3S45V8ZVFMDV0BR6JPFWGVKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SPQYTY434Y90W1C66ZJ02MM12GDY25W6H888T52HSYCQX2XVSHNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JKARGYTZ9ADYV5NKWC1ZYZ1XSRDJ8YFFSW39HNAZ254VERS4HHT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HT4W86SEQRTA7CWRAFCEZDBVXV6QTC9ZJSER4JMJR8KY8YE5T310",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H03AJ2YZSCQEZNRAM4AF3MXPKG75ASXDCXDAS707YFQ9YEB6WBHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9HB4Z6JYTD02X86T5CEX8NCVM9Q1T53NMQ22KHKRHCXK5PZCMCDG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X9RA7KC7028CESCGGBSTHEMPR3Z3DMPWVWCQEG0DFQF4H6H5MKH0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JH715AFRB15ER97XW1A4V5TQ8W40PEM13J5EDPPF50XWPTQ8D49G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N5K826HKNQECFPVGQTHJ2WXVBFHV02FFGJTDQ5CBP2YJPB0GKEMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NK3BH5MPKKTD3F4B87ZJ4H2B9VJVF3E47GRWYV5EYK6YQRZZABT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "90E3Q0246ZRJ7AM5N6TRF5CDWZP366VZ6294K0AGYGWVPM3DV2QG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QRG0BFBKJA3MAW5TSR0YR7GMJG2E1YE435W7YXXFRBAN5T5VDSC0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VBC96W50RJ8R2M4RK7VEJAJFPNE6YWMRNB9DG0RG0A55HA6HBZY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "930WXATKP54PMHD6RPV0WHC05AZPHZ6NYTR8WJDKP1ZV3SA84B60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2AHZ7HV4QPKS8W9FPW91REFGP47SH6BNRCBGBWM3HJCVC1NMZ9F0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EXCJQSJ6FEG8HHC6FZH6VPXCT8QAT3YY2DH5B010M6N5CJF0DDDG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RY57YM23S14JGYRW4WVPXKPW9NNZF2TYAQGDSTCX8GRA333HTV8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CNK1J6PXSY64H8ZVNMGWSC06NRADW4R3PWA7QE6ZH0FJZX2S6Y4G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MWFR8CW0CPHHAANRZMQ5WA33FTKBEMEETNE9JE7H1S356X3TYHDG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "STMPYZHMY0P54SKN176EMZTSPX0JZ0T8H0C65C832KWZQSQQZR9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2S86BKA14CRMGA8J21524T1FGZ5MTM3GM9RQ9JQXAB3J17SXFC7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1YFQ1YEET7R4M46RV7AW3308XJJ3SH5GPD9Z80SFXNQ811EZF7N0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KGTKJZ0H3EN217QGF143XA4QJZE2R13TTYPRRYR58PQBHPHF6B10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D96QM835QM1QQJZJPMT205V8JC8GY3WGG13BA1145NZAV60PK3V0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JT4VS59T9ZYMD84VWDG00NN3TQ7KJFYKDARJ1SZS6XGD4JF02040",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SN9M2Y9HGNED55KCV029GJ96SQF517MYPK92ZKVPS3BPV308YH60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4H2AXFTHB9AMKKBJ4V6A8XMSVNFQ1GPAFPRHKD1SJ9N5SPG9YY5G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WVQNP69JG5XFY5G04W67MZ6QVTP33H1YE2RFQYEK6Q817FXS97W0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2MVVVXTG09DK7QTGGSV3ER1S5SK4DV75XJ236THKGJCR1Z00TPJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "83T1X84DZ7XZTCRJ4SVB1R9EYM6NFAYFZ18SVYMBQH263RBKRY20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N7S1Q8QS53Z8ZQESCC41PRCX0326M4H2DS5HBEZBV0JMBD6QVCP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WZQT5S00Z3RY0VB7XVKVYGFBWWRKZ9XZ49EGAQ1A4SX2A3KQNZQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "C5YEBFX8C9ZAXZBA64XKY1T558C7YJXNFZ0KVJB29FPP2ZR83AJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "453WE9ZHTHBR31PFC7N3Q3DKJB374X093KXT2DGEY63TZPRWFRFG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XEJ9HJ5W226TXAQA6CFP4VSHWTR1QB2EQ702JK3ZQ08DXQCBJ6JG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BGVCYF1TZ2GWHMXFES9A2X49S90S61GVM8AEDNBR92QCS28HMA9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "47DRDE056NDB576GV3HK4KMHDEE940V45JNWG94CH5WNAVD008BG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "K7VFDPD2JHBG9ZJV9TFB0NWCW5XR4A13EJ9R8FZ3T9ME7V04Y1F0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YNSYRM28047DA8PXS35YYYHEV6GJB4EP8ZG3GB0GQ5CBYSDBQVM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Q49G173PXAHD117SCEZTJ6N7YY9WDXVWTVN75KPHG4KQNCJYR4FG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0G5TQN0R27QSBVHG84SYPFE4SHWJ3KHG6CH7VN32BB2ANQTT662G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4540R77BQ4CYFHCSNFSYBMYXF2Y614KSCDKEMX6KZXN6VF4AKFTG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TTS79B6JF13ZR1WZRF66MPPBVVX1D6QX4BQ7JAGHSWMP7RS9Q6G0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EXC4Z403H0W55WQN3M6MQSWQKSB6A6TMMF2MSJ1N1TDBQYD9F66G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TSRZ41RAKDE2APW2ND4K5GKFGWWS4Q3F9N4ANAFPJKBCV83NH730",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZXFWNP3P02WDDEY077XK0BH3G2T2JQDS7CBS033HSJ47AM0WJQP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5Q2NYW74JK520H4VD6GV7R1E25P0FM8ZNS6MW7TFEAEVTFVMC380",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E8R8PYVYW565FN0QQ45A7D8BS88DXERN1XJ89T59RVA7B5FN4B80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "80GGFB7BRZHFCHB4C8YP7MQ5MFTTK1N30TDNG814S2FAWPMKDCCG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G6FX91APZCTGJHPEV2KY1F9SRV1E6N88XV5TMS2JQ6BBF1RGGB00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6KH7X4QRB18F64JFHVYXMCRXYT17FXXRFKBSNTGXW8HQBFD9M5F0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "864PYEASTWZ4G65S01HC3ZV4PV9R6VRDBX88266H3V3S2GG1ZCHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "20FAPCMN6VXG5KMJ9C1V1E5HAYJG9FKSG53Y3G3PFBKJ7PQW176G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "C6METX2B4H1TW1MRKA2P4RGZE2GPQRRCA05S5VD6ZFQCAA84X7RG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "17TETBHGA1ZS2D1DR35KYM9DEJH0TPP3B7DG53DFDXCQVJAJMEY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6B66QME25XESKDJ9WBNR7K3GQ378A0MRZSF8ZA8NQ2JD9PSHVF10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z603HRD2C622SZ5HN8BDX0N6R7DWBFA3RPCE2K66F2PSA9NKNXD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TZZYF6Y5GVV9T5BXT75WTZW11B4ECM7K1RXNMWG4TJ63GNVFNGTG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H61XDR8G3D56BPG2GRB4WHWET8DQ68EQVD94B9WJASYM95BEYYZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0GX4P35R2VRXJ2ARJ5F336791BSHGHXZKDD4BRPTW5RYJ7KDTE2G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TVQATKNGF8FZCJ963TEZHYVRCBKZPMVKFH8NGY327AT1HJ7CB81G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XQXXC823PHNR2PKJ4H3SYQ4V9HVKCT2VWWZBHH8PK4W5H1W9VFE0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NVEATA9RP21VP5KVCF25R942C9EZ197TGTKY0H8QETXQARE7YH0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CV968YC9T0KF165M1JTFA4X7KQRP3SD87GE7B9D8S6NH0AWARA50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5TW7ZNKVC0NT6GA9R2CAWGTFEZ4365SSW5RKG0A6J0D9JS79BZ6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VEDG85Y30ZK8PZD7SCQBBA0Q7NPN3BEYH3XSE424KXGX0BAW1HAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HHT87XXGJRHDFV5FMHQAPBAM6YGSF8ABBC2HR2R4SM3838V1TQA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1G9TYX7GZVR7J9EAN3D0KB7WJD4HXJHB0M2T4W4PMQZEA58EQWPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "11CD6K4VY8M5256PHCS10S0C6347QHVRGW3H8MNQ611AR018Q720",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "C5B72X9TBHX3K0PSGDJ0JV4GAH53C4S6QC4P1H0SZ55GTXK640TG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D2AC53HMXM7YN5QHYY1JFH4QEBTBBFSSCH98E513S4XKMM7RCV70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GDNM3VDEKB35ZSXTASQBE20RS4SWEJMVWQH8RR78PWFTHX6E3HKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CRBJQ9D5SJ9DMBN9M3SA7AMH6YC9DN5FEY6PBFF4MF1YGWWYDRC0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SZHPX2M9MW8AY8D726A9TSABHYDXAK30MDZK44S7YH65AM5NGPH0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DBSK1HFSJQ2RTVPBFR5NZZKM7AAMSG79Y1A5ZTCECND6CEZP5W10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "30P8HMEYVM9WGKK0B5GPJWG1C6P1CH0BC97636AJ8Y1CNWKVF57G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FF4HE6EYWRD2KBQSCBRPM6T8YZVPPPS05Z0NYXKAA1SEJRCT596G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AGR1HYC0BDCH6VNN3W6VGAK7TDFYQMBSKQZ8JVT1ZDRWMC9WG2ZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "B6JZ0GFRABW28SBB8N05KG10EPZ23J2ACFNS7TEQY699ZA5FJN5G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GKFAWDC2DBJ4H28V1RQFJEQJW8K2XEG56RRCYGRRV55TEF4YY4W0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GDFHS0302C1A5ZR003W3DHQY5BPPNYXJAAH6SS0ZM31FKKT9MN7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "49K6RSABMMHCCF2RSJJ9Z64XEC9C1GJC7RTM6KTT21W486N3N6P0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G50M5G7P6BEWD0JXNMXTK1DFNXJMQY6GK3ZM0NAA82SM2R7QYVN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "49W1VWC3XDXHRYPVQZ6BV0DK3FHDCNKFH50ZDAYA9TXGGSNMJ0KG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 984,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CZHSG3WFWG6HR8AKXESH96SXNEVKTNRV5NGWRFZSDVFHSW0DSJ8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D30M1WJNA80YP3STAZR5E4Z2F7211KNKCY46AWJ9DWM5438ST650",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8K6A7E0WNDPZ5N3KY84GG84BDNPEC6JTYZSREK9AP51EQZPZS480",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2MY2ZZE6FKA0H14WFQ7P0WHHHD6XDQFMZY0YZ5SZ9V2K898KGKV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "520V1JVTBXEB0BYBHSXZPHZAFN8NPJFFPNS58RDE2XP8ZYJ6NC2G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "242Q4C9ZAYWHP81W3A8V97F9GDC38CGQ7C297D1AV46Y1Y094EX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RQE062BQ5QD9GYXBXBBCRQY4J2ZX1Y4WWDTFVTMAKNN2R4CAD820",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P41SMRP44TFB6ZCHGKKTHNFEKF0DQFD5Z6NF2AW0TKSW68WGEJN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DQTZNBQ36TR9QJEF6BE76FXK6Y1RV2V59JEY099X6AZ562PYSR0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZV65EAWJRKZ3DB1VK3XY589MR6BN139M6DAC0MPFQQF32KG4TJNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "V3S690CQVC0QNQJEFQJCQ1XM4QDCNV9FCCTJX3NVV459ZXNG8H0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S4XVBMN6RP2DSCJEQCK1DYAANEHH51VZZJGR795SBXQR7Q9VD20G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2ZYBQ1YP7K801B0X11VZDS0R0SCV7976QY4RYC9GSYAB7GFW6AQG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YX8WAAS8ZE3SF1GA6RW20WPQCADKVJKQ0ZDNSEAPFZ8WAXVNYGQG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CKQKP7B1TC7965VDX6PKVGR4QR1VM2XX7NXD4FR7SNEN66AQ12A0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z0S0T1STGE6JBDWGXX7HQW5N6JCTS06Q3B3ZWTYEF0KDSG428QGG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R9V6F63DXF3H4VHAF53MH7X3HWPKJDCRKZ8K23NH3568DWE9ARWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "17ZZXXPK862CH53GM499AAMC8X366WEV8MM1R5YB40ZGEMZMP9GG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H6Z94C8RCPY4NK89R0P8D8JHME4J3G5W22GPBZ3YST1Z7ET99NQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P5YSBPTVBB7YFHT3FSCEE3KHVNR34QMAS636A5G12K7D83T6Z61G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7HZ2N88TPZXKB92HJZF6M6VWB7MHCN4WXCQYA9ZPP8H7KBM8F1YG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7TM1P2B6A755ZSGPTAN47VF0Z99ARMWHFW6RQY9WSYV0QBGZ4HJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KMZRYGJ57BR37EE9PD4NR282MMG3NAKK3QXHD658RA9RZXJE14FG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G8ET6HCD1XKT55NTQ4F0VMD8RSFCCVZ18DVK0KNPFFV0BBG9YXJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BQJV2J7S8H2NAKS61C1FXE1YQ66XMMXBCQE9QMKSVYJA6VHW2KWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5Z4PRB8NSZ8GAKJA44DT8RZRAN7JA2QWTFAWZP1TB3DJM4RSTTAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D2KBAWH5RGXBT520QD6AZ4WX6QX2V93Z4YCRE6D7Y4QW4525FCZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3QFN10MVAM9552MXSFFRANK1FYKCVZSXJS99FJ1Q2F4BF26XFGT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3Q201CHJ6JGJW8716P01YCADPX3FT3X8N1H3GZQ7GG16REXXBDZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z1B0BRYTDXS0FBYQKV935YV3R9JB1RR7EA4F9F5PDK1YWMSJXS9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "B3ZXHTDD8VH89J3408QJKFHFTS2MTKFQHT21ZX639QX80TAF8D9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ACC4VMXKQB9DRN0SE6JFP41EH4WVQPHWC9KZXD02H90GRJ3T2XD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2WZRD7Z77Z41Q8ECZ79574XKCDV6C0Q6G16D6Z77MWHNFXB49G80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GDK812SS0MTZFP79EAFB0H4MY04PJG6CA87HREV9TBN4JZTBR59G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "53P6SHJF48578DQ51847VWTJE4ESPQKBVXZKF5VXYPGZG4SDETZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZX4DKYQ5EQ6FR7CDVCVEGY25YXNT2V3CB4MS6AE2Z5NZJDGQCNZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WW01K0E63446YNMQT7SKA4ZZ5MFX1Z2HSETR499Z44JPJZWD1ENG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "77ZNRRYC9CHE6Y6WSY40GE3ADY6SFEM6TX69BG9M98FFJMGNM5R0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SXVKZRQP28MKAA09W18Y6JXJMC9X0C6THFJ4BM32AZ9JWFQPQQQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EKXNHJRTFYH1KXTAE22NR6NDV41RBW0Z15GKBSDZDH6F2DDMGFQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JG1BX8YBKWNZ9FJSXPMTAG8BACF50DPX09NSMVT9Y7G1X32ZXA50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7HJ4BA719SDK39TWRTARB261Q0D1SAMTSE4HT6ZXGM9WBSX7BCH0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WMCWQM7TZKZQVDWZP8NNGMAY41AEYQQRGKWSQVMKGQSMX67F6440",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NDN3HG4F9KGCZ918Y4E6FXQD2YRM1FR44FH3R8QZ5DZVWPGK4RMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KVKN3DBA2HAK5WKB9CPT36G38FR7XJ0M1A8924XER7TKHH0NDGV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D3303VVYP801KFYRA0X7EMY7JQHPJY16V1Z31BKQPFZBKC1BE4XG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VMV1MYKK83YQ6YT1H5N4J478YPXSA82MM8KSRKW8MEVD6B122BA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3YVAG4M41SP85PQ2GN8HS4PTP1118M04HYJJ601HTA6MH4S9AY7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XGJK5BEJ3SZAC72GZK3ST6GR4MK43EKAQ6KWTTJEB82A2W7K1JC0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BF6GRW62K7JQP73CWH0R7T1REAZSGKRSBVTZGNEJK1RTZMR6KAP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CM4SVCNFKH9G5NZT92V3W2S1RZMR21J7HF2GSQ9BC879WH8DB800",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7WQ33PRC9KQPFX3XVZ3WRG85S3ZQV8YMW1TWQ44VE6QMSH6QHR6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TG74MNQXYFXB48Q7QJCM0TCXVGZB86NG2FKGPRTFAVANCYX2NVA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BJ0JRZHVJB9WR0WV7GE9K0VJC6D5XP40MKHYVHBM2CG7WVYT461G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "A77RE0TTARGBKT74GFDSNP8YX0ZB40JND33ZB3GDA01NR1VK68JG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4KEGY9RZCHSS2PTFXQSHEZQY3JME6SKQGC5HVAJ6XEGNQGWXMSNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XZ6JM3Y6SJ2ZVVTJHNPMVB4Z69K779D35S98P2REYAZ1WK50S8F0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FR8S9G61M4P519N8Y401N8BYCFQ28BD35VFPGZQEHRQA0GNP2DA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z51D421JTKMT1R30GHSE73DXTDEBVAH5ZC1PWRNG24KSHXQ33R20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3364WN57PDSJHW7B72Z4JVYY9W72FN6KTSH050SKAD133RS2ZXAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PSN7AXWR7FNYB84YV0MMRP904XXWA4Z6QFJVGVCSNQ6X8E86AMNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EMR074MFT3B03G3AKYEVPMWSGKN0DYNDN8YX841NZK7M9FP1EJT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1TXTYW8V4C4B1NC6YW4603N9XGBBK6ZMJMQFWWDN6GGQ3Y6XQ5Q0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P3XFMQD4P8C5QZ3TJGD3CBP9152ASBHH4YTR0SSPN7K70VVZEJQG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TM509VPF71HJS7AVEJXKG1BNA7C7VGWFCKQVX891NM9H46MC4QM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "C7G769HA56JDGM6SXB3N2AM7154BE7J2P8C4EAW1S46SG4J50Z20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "V4995XHNSX7R7RT705A11J3ESSCNTYNDFQV4HFEBYGD8W3X6RCS0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6ADF9XYB39ZBN5SMWGR5RFW5WNT38PM18WYXBVE7NX9VT2XAY6EG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3RKRHK9D09KTAM1429FNXVAC1Z5GCTCAGSYVWYR6NXDMWXNM4HM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Q6VFT4JQDZWDV1BFXYTF3ECQT224EZV77XJM313Q2TTB6HV4K8B0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5ERT0JZEEJ1RM7S58ZGAH0WBSQFZRSG0P8PGPT0BXX18XHZQE4YG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T6VHV2R1RW9S5XG4QSWC238NJKRD2KT0BYCP04KQHB1AB31MV2P0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1D7W7VWWYGVCY6T77FMBV1VDDDZAZZ1VM7WTMG9QRYY9K1Y4KY9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "21HA5RGXQHT1YGBQYG00X175NPS21MH12KVVRVQQ00HB56HGSHVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3FC1PSS26WYHHNCZJR3X8EX5QQNTKNRMZD5RKZ1WKEMZ5XHNDWS0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "96XMY25V3VV6J577QM8E0E35EJ59F3SHMJ2VS2HTNFQ0D7J421HG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GYW6MF9TP4YAA9QR88CFFYCGWW83P9PCASAWZRBYKZQ4QZ83536G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HGT6T2Q63M0XJR9AYXERRVX0KD9V3SYAB6CR940EF823HG6G914G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "A1KW7W4TX12RRVT4YMWGGJ5E9W7CR8ZEFEDMCJG6H3NVTWE5BG3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WY2Q4JKW3HTEXQD3Z57SXCPH2XVYF529X54AATET0Q52BV947Y70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3BW5SYW143JWFM4NACQKD4GDC2S7X890NMPV9NQHNV6QZM995AN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2QEEEN8X3QSAEFDH21TM55Y7BDG25PDP06R3P8JW5F9VWJQVME90",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3NEFDYK4H9GRJFWSF9VDY78N1MA8W62B27VJJ3APT6WEAB54VQ2G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N66MN29ZAS6NJQT73GDFPGJM1082XTWZESH7PENW1XJCD5FY366G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "DX2FF0J8B223JTNX9F0Q6FBC44W7QQPTAC4PKQTFKH0B2J58Q51G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JHRK8NG5QCZFR55MNWR3G97PZCSNGKTV8FCH6BNTJCZWP9WTAXA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RRC95ME78NQ06WQS5J14MCWTW13B00QC4AMKVR0ERH4DVJTC9HJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MAK1QMASK2TZF20R7JT1Y3PKAK1TDE068R42BHBH1B4Z4TNHNFRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7GNZPGXFTGR0TEWVRH8M9DD8WBNK7RNP4BQXXQ873972MEABXZA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3WPW8AJ37YV80GB25JF820V7X7YT1XGMZ9ZP4QNZ03M0XE7Y27YG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T5ARQ4VVWSSC995835AZGJ5QJF8JQEAQYJE7MZ5XQ0MNGYM3VAB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XSRAP2YHD0AKJY911622KR7PHNMB1NXQGVM969K16N0PWV8RV56G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QD7RWZ3PW6TD17NDBZK7QBS6BJXDM7T6845C6EYRYPX0GRT5Q2RG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1QKNEEY3CGDTGKD0SPBKYWXRAGKYC473K3KNR2NWJ3YD48YJXCBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1G1VZXKXS1KN2CVP6Z7AP0TX8DZ3HSTG661YA873PHF25029V5A0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WGTPG5DY1E7506B6BMSEJJV2907C6CZK1P6YJZKH8N7059GBH560",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G9BKHQKWZ96XAQJZWNXPRE1FFS6QV2ECVM84673PH62XWFKAK470",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3FKYX99V10HVCAVWDHR0NJXBPQ0H51PYJEKNWP4NP1VXRJYJN0S0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3Z5G33TZYEMN5W486ZNNVDMWSZFXND7A94D9CFGSP0YZDC579QKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7S7W2AFTMMCD5TCTM0YNAGFEGFEQ4TDEBFJAY6RAANB4NPDDENHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RSD86JKXCQQSQSE3QV4TF4D5154C4H8ZDQ13HDX38P1DAGCTA110",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "60QGXAGGJ8TC434XSD0WKVT421JFR8SKM5M3N0V02H3DYEA88TZG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5D52C57EGVQV9XN2PA2E7KK85JTGDXTP86J5ZN4T7C827ZYPXCVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CX8MK9V8VB2BQR77DPGQJC8Q0Q87QDS9GBGXYBHHRAX2CPJ0DQRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3JT1PDAXVWJSGRDN51F48D8B4VJJACVJHJ9N1PV0Y0NCYMT1A9PG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z62X4KH6Z04DVTAZ4WFJZ93KR6TMXZK7727WAN855RQ4EJ5MRK90",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6RTCNWSC0SFJW4MP3HB1SS3CKYVYF1PEQ840TT2140ETG37BYBWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MXMNTAN306HTCFEXHZA1E9HP9YRY50PX0H6ZX2K7Q2ZZ3WT9FYPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ABFQG5NR9QHSTN97A20A114GVTY35VSGHWW1G815Y5WFF5VB7VKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P4Z849141H998H966NXBKNP42Y534ARPGYT2XK8208T1XSR2FTS0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CGP54WC3TVTFFF9YHTJ606JY1QYX3F81N5FYS5TSVK8NRYRCXV20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "71AX1W2FMCMHXR3ZZTCKEQW3DTKZFQK7Q0B1MMKGKQT8AWMBXD50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2NVKG5BX0NVEGX3JB2GPWARNMR765STZZSJXCDVW3E1TK6RS89NG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S2BBQP40V98F1D416C5BV2GM813WR0YAQHSN62ZZ9NWHMYYES3WG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YBGA9NGWHCN27738RENEZQAKCACY58RJDQ7QK88N2Y68KXP8MS4G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "X8FK1CKRPJMHTR2MS5BVVY9VSXDWT52XDVVABT7Y0G6JZTQC03W0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VE0KT9DAZ8QKSWZQ68HWEBNAG87NQ47YS79QBHW6BPNP2JMMZZAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P2QJHNSQ2YHB6C2W7NQYTFWKV2DK7PJ8XR3A60HZ9PS18BSVAAS0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NX4WNTDS690JFCGJA1AQNFCK2E0YVFCAGGSXC3YNM7EJ6XFTRKBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XVTDMPSKCCVJ7E82J2DS13HG9R4VXWP4WJPGBVK6X66C7HHWMCA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TK325T42JXQ0AC6TJC1BW8YHNWWMRF7RFNJRK0TN1R5QBTKNK31G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EMP65KJ8CGJ78HCNSZQEC38Q3469QG90Q0TZPM9CW7ANP5HFQ3CG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "29HYCTZH165NDFJM3RXHPP4W3021QCMVZSR9RY5MBHGB7JKXFTM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N34HX54PC0G10AT0E12WWY602ETDB8SES63BJ7AV2NMVQJJFV1A0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4YP00Y5M6PBMC32X0MDXW0863Z7EF6H9MFRCRTYNFQ7FMG80F2G0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "64H9NC8V5A5AE9ZJYSSBVMPG0H54BSCFSBAF7J1YVECFFZJWN6QG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YGZ80JEENCB11YJ0ZW9V9MZPXPB1ZWPCYNW47749RA4BNJR0H9D0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "78MGYYPG8YF4A6SBWD2879VKXRZP2VR0S6J52YF38C1W26VSS9RG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BWW93KMEY7CY1PTVGJ7J64E4BN2NPPYMME7NGNZMP06ABQDF8T80",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WVYY9E3KQNP3QMAFDYS04A6Q8YD0D5G6XGQVAVA5FVB99BVQ9WT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NYGW6FKPTHDVMN8YB6X6YQ8P3AF8K6SYRY95FMY2BF9G0TZG5BE0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3ZG5YTZ38SZNMGE7X1ABN692PR6ENXTC8WZZEVXTZ9H14QC9DDQG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R1C6S7X8MF8098VX6XCDYSE8NFD3MHCFXTKK4EHJTG8BYQDAF3VG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KK32AKC8ASD7YB3SDQ4AN5Y0P8BDD9TY4JWPBHVG307CZJ4GPJVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ECEK0CG2D4HTZTAP9TH9YJ1GRVWYEVYR3GTQ8SCN93TBN4EAD7V0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "46KVGCK3FAWHGA417P95B88NB1KMXNRGCA02BWYY6T0E3FZVZCE0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E1PZH83SJVRN3M0ZDWWECKNEXNC6EWABYSPJ33JT1F9MXEBDR9NG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "12ANM629642YMC0KBC4CME6G1QHD0RDTMP62GANW2MP7SA57NFB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4TZ2M9R0YZDPZG6M7Q34Q6WHRF5NT7P6VTHSSDQEKTKR8M0M6KJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3JDVTVGSCGTSZV7VE4CJGQVTB2CEX7NRE87R3REMY2EG87Y0K00G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3TF3ACRQBCJM2WC5977BH6TN2DQGGH2PTDDGT9JEMYQABTCMECKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "J1NGE0R611Q7EVR2N4V0EHD53RNE7YJ6C8NQWK1RBHV6GSB5Q3R0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3SR9XWM0CZHWBPMXH7FPZ8DNHNTMSPQGAZCFWXA16W1XHNNK9PF0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8RZPYN7SN3CWZHAV4P2TXC7V7J2ANJ1BN6QZ5PHEGW92NRBM4SP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "70HN6TCDE1HFQQS8D5KVRBVGT977RRSHQBAEBGGA54BFM8VRRQA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NHAX9C1NPDTG0J6RT8NY2T674J11EGZARRNKSDDBWR35RS2A0TEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4DSW8HHFD2WF50FQJWHTK6P9J2YF4NWZJT4NDNSSDZ7E58X799X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3DJJDJCJB8NHKM98Z9CM9YC00BTABTRESV3T878ZE61FA25CYMB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "P7DMYM2ZHAYNQFQ8DK943DGTKMV9ZEV46VBCSW2BB7DMEDP7KMXG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "240M4VSBN90JWZXZVYVYQ4G11PVR95X5BPYSDP0GHGVET95JN1K0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0W514ED2PWEPRNNDVNDNMTC3QXEJYJVFTBAG53HWTFBBQKMPXYDG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T9WTPWA022C5M333MYAN4BVJ1EH14B0CXP428V8XZ603HA2JE5MG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "20NP8JJ7105BBZN4YA5W36QCBZPZ84WH60FTT82YMRMMQ35RWR1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KCF7CDCN6TBY058GH6RF7Z49XA7YE9MV0MN6FJ9X9R043AV49KVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E0PTYD9SQNTBVDN211S20C8SRGYJQAHXW2B4CYN3FKSP0GKV4S8G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Y2GRGEAX2BMG813G14CTMVPH1NZFC816DHGA5RAZGHV3G7S0XQAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NY1MW7XK5F0N97QY1NR6N75NFMK8QKDQ4J1AY1JT3QJTM6FNCJ90",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8Y8Q89NK348MAVWM16NDG8NBQ560EZJQZ14CXK9A6CN0098HFWS0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "H9093N1ZJ1AB9X09FQ3AG9VN6VCQ86JDQW362WHSSX3EV2AE3N6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YM8N2R6HG8E9MMW38HEW50K5TG4F40MAFPWY3E475QE8CEM6EF30",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "F1Y5ZR8JQ59M4EQKTBB6GJ2C3063325XWPKJ3284PYJMVXBQ6490",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6NZ96G3CZAMR4JTE3XFP1369S7PCTNXWAHNGE00X8K1B4QQ6TJV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WS2PYS56WSW37GY3ZP8KGM3AZEGBMWFK2E48T0K5B1VFZTQKZEP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "703XKDKFGAWE1K4J3F3W7BM6W49D8M2SDKZ5MCBRTBQ5VW8QKS3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FBK9J3R58YK2D8T1ERQR4A8E559S7DWYP5TPYWZDZPM1WZMQY0R0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PKHX116QWYHA711N1AY7W3MP2WFH55XZWH0QW03PGNPBKJY9SYD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1245P0M5FY7V6GM1Y6PA4ZTATS3MG7DZ80XR5EAWZ4W5WVK26FQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SVJ7HH6QB7BZKX0M8A24C6R6RZQ9WXXH0CEEV88TXRZA0X79ET9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "S7WK9TK4HWM2G4RC4N837JATB40TT1SNF2CVD3SWG7503Z6EGPS0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Y0TMD5NFMSE6F5655PZNWD094QTNXSRZ7AX13ZE89FSDZJ2XVB0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PN4DHQN9SGF3GJYJS98MV24CQPQ1NQ0NZRFXZ4JJXPM8WV9RNGXG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HND4WFNQ4W0GS8F56N4VMGRTFCJ1ZXKKYE35AVWVMRYE27V500DG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "05FYC5D9HG6Q1DK3EDVVN2K6G4BER38TD06T2147GAAJWTHG6PX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QV2413JZ55KWA0W76ZYBPB9VK0899KTWHFX105M7QT46B31B85WG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "R3HM264PNTSQB3BZKNC1VEGD7NC08CDS8KB6TBHR67Z92GPSSQBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CJM4ZAF16JJSTETYSFGEN4B82G0W50VCCQZWK9XKPSAQZ8EZ0JJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0W5ZJBN8JM1FQVCVH8YNGXGVEN1SYGN40NVKS6WG2DMJYMBP3BJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ES8JE82K8BMS39PVS0VYGVG7E1Z8Z01YPPX4AVE1BYYBR6XFG150",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JV1D51RCQ8Z3RQJVX56RRKCVERQJM4X62GZTHZQNSQAQ6SNVW8FG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2VKN6VWY0JDQWMWD72RX0P1DFFTYV8006MCDXCZPER7EAHTQJ2PG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PJFS3HQ7MN9QMB279E8YH7FVY7P89MNZDFTPH4ZXM0TBCRNYTGVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WKQPJ3MQCQKK55DNZZT2P91WF1H13Y8HH98TAEJ6YH1RW4SX0ZN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "76AWG0BRVR1MGGQ8JNHWSMAHDTP1PKPW4EDAAZ0N54VM4WNWVJ2G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VY5DB9RY44BWGX8B40YNCGEC7NZ0E5GDER1GQ32X6MMZQAQDS750",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RAP5N25JG1MPW608CTRB4840S30NNSJJNFDFP9NJCKB3FEK05CA0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0PNY3860HHWTY1C16KTMHRQ0NP6K8P05H1FCHFR3H4BQK04A8NH0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "N5DK5GS4QWEM9XXJYBA9YBB8J3YTKSYCKX7JGQ5NAFMDNGMM2VG0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1KMGA6FD3AEDS3AMYMNQ11M02YGR2SSC1BS7TD233E2GR8S17K90",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E9Y3K5T6A54VVFP20YBP6JH5FR6PFAA4S3849SA156RBNKQV6030",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RXJ1CTJPABDWR2WA1NGKAACKC6CCQDQS9N3Q3DCZQ9GGGRGGSR6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FC7CSVFKFM31Z83B5KQGH1HPSQDEW0ENXJVEAF7P1T3EJVK5BPW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3Z26ERDPCA4DS4WKA88M2003PRN1RK93X2W3YY549JW024VM87J0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "B2PMFA3W41F2YMPDXKY4VW4SS3RY0N94VS3XVDJSPJWKJPQHRGP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0JZCPKYXDF3EF2Q82PCXB20PTDQF1WJE1TNE2XD8419H9ZZ0NABG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XCKNX0CKWQWCSD345WRSWRAK6YFH5K4MPQ9GMYT734M82PXGWKKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VD9SAP0HRR2Y85Y7JC3HS0BXNPZJT1Y5W7HSQMF1T7BRFDTK8H0G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5MHRG1D3Q5RYZT5MT69Z71994HMD0VN5QAZDPBC0W8Z2HT59VDYG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YFKB0GVTDGVZBHR0K0CEJ8F4YY86KH4PCN36ME49YFBXW4Q1Z34G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "1AESTJPMEA0G82K8JCSQANJ1NE65X0MDKCAWTPRPRW7YSYHGTK70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "97Z0GS5BNAZ98FZ15JM35D1TCYSMFNRPVD4W9DDRX24Q9QDBB7AG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AJZY1B9EGGDDW36N417QA52KZ2M58BABJYAFYW6TYJ20HEXFCGHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KW5ZYTWSXDY1MCQ852FN624K3FJSFD2XQY08JVG83QXR7Z1XX55G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T4CH1TXWRKVXZVJHGNEPM0K34AR2X65QEKPQF8V89JC7KF8GBX1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KQNW8R52K40RZRZVE6ZABZGXYRDW0Z1VYVKW7MSVD66ZW41YN1VG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MPBF7VP0BK9954B4YQR03YDVDT3QGPRD6M602GS1NT089BFR8VR0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VA86EG0VWBKB9S9Z0Y7FS9VPTHRE4BAXNR2MPC56ZZFSC98PZ9H0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9R01CD9RAKVMR703K5KAG7SWMKZ9C5NWWZQ76BXNNWZWE5AFCGN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "F0QV8BX5Z8GPF1GJJ8JCNRZHEPR282XAYVA48HYJMME1VQY5WBAG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "GD4QHQ32CKNG9DGVBRVA51GWHBNR1CWB8PKMH2ZHKHG7TDFF3J00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZDK87K0FF5HP0GXFNVRCR357V843D2HMSRGC4TVQ47M1ADW8YEXG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4VNV55Y147JWPCBGJRSV5489NNZF2QG00SEMFVNPNEX695KTM0B0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "V5S65H3RT9BCT4ACBZG46AQNCH8M4D6Z1GRS1HZSD7T4TJ5WYPC0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6WJ10Z8XA996MHR063MQ0TQCB9B2RX1P00YBM4Q7CE1B0DQ9X3CG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HN1B4Y4N2HTPWN9XE278X3XCSC1K6YZXE1Z4NNZPMEW27BYB1A9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YRHSX1CS3102AWGA9M34FBCTTPJQ7KNFXDRGK373FWVAK0K4V400",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JW5KA38H36PD28JGC8DQ5EWH46E6TCSYJX4QJG18TQBCVYYZV4BG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0DQCS3557VXHD8A7KC6EE63YSRZ301CMNBJQCCVKX0DHSCGV2QC0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "018RPWC95NWG2N1HH30NEMSEFEW53R1R995PRZ67PQ1VG0RQZAY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KMDZGBABACQ4CGB6FXKC5HK9PAQ0D4BY6BHXMNZ839XE7R341D7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5Z539SANHVG2YSJF501YTDNRWXS4XN049DYE9JFHN408NH4MAW50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "50BRN6B6C6D5K00AKME93K60EW5ZM0HCCNQDZPPYSY7TRG0T1NZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0NSHYHGRZ7CPAJ8KV58RSB21A9PTEAT8QH2M7FGK3THHRKY8ZEF0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SM789GCHZDJ6PWS8F1NRX4821A14W713EYF462R48CMMZ91FZM6G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2YB6WBDWJ0JE756P3W03SHTFJKJ18W1ZF6YD7HZKP1E9E958VM00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YGWJ3SA96TBFSBH96AS8RYH3H0Y784WS77RJD4RYB55JMDZK6550",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "75F99T7QZJ6V5WCA9PNQYHJ6WEPX7B8TFN6DEB7YJ6JERQ3XF8SG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FDMMAKTN26ZAW76ZMQN6909Q8Q5TD0JSY1827WGX0T46WTCAWRQG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MZWBDCZ7C14X7JJDJZ6SHVF1SEFBQ5F9HQANDJFMC6EB8DBJE55G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "V870QC3VH1Y37C97VYYZ7FCJM3KZQFYPAHAH5684D984DWDHY1B0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YNTVB7518A2031615N1H1ZM3JRJ0G3A29C8VBCCMGJRYYSAGBFWG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "EH06D66YDPSBZYBC8P92FAMECTGAB0SGNWK8TG42JBBH2A2QQQR0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KBV9W1H2D2G62XA392C24JBWNY2RCKEHX75MPTZHVMD6HDBN89X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VA7X5JXZ2XPHX34S0RMT48PAZM1MEGMVW082X78FVKT181J3RY9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "C8R5JN6DEC8TY8TR45NKBATHRXZCM9Y41ZVMJR6HJYWJFM6DEFD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "14CWK768S2PCDT7WBEN2MA0FRQ19WYYAQGKPS2PD1QW3HJD129G0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0TCA87BDGM7SHVCMSB9R9EA21QKB0HC5W2YZKT6JGG3H1226ECMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XF3QYVTAB07RXJX0K0R3DHQNRDPQNJAW09QNABKQ9Q21GE88EQV0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "XD91Z84AVANJ74DJWHPW032HS3XXJB5R1NMPV29A8M0ZMFKB7B60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Y30581BW1GMWV0WXGJBWVCEYDBGE97DEYVNM1A4HXKFFYPW5Y0GG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QSG2NKAYMM3PTTTAMCFVQN84BG5TXK3Z9QVETRQK70P743MANQX0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YWB3BKYYT45WTHYTC49ZW37MGHBAH97Z8FE8P2EMEZ6DMNN7C2QG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "A8RG21XFNKW34HVTDD85AHBF1VXC4N78F8Z0J899M0KF4NYMTFJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ZN1PXHANJRYQFXCPPX195Q61X1ZSCYBVXEHHQS832YHNEGNC2EJG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PKPTN9CVBQRJDRTCP7WGJTDDYNAHC42SJVTK1Q9DKNXXN6NP05W0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "03Y6Y9XHNTHVSJZY5WE11N2SRTBHXFP3D9H9V354V2FYFMVFXB70",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "ETSVYVBDAC68NHTPYAC9TD8J7MN2KNZASA7PFADRSD1B9TP2SXPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Y4DXGPFX8QBGB0NPVFCXTFB64R7GT3W8538PHTXFXNKMRD8VMH60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5VGH8FD9P6G8H3M5J7FYM3VYBFGC089MQAY7B69QY74TS5FNE89G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TKM29QAFQ48YXNXXS0NZB1ET7RNAC2PWEB2QWXP0CXFB1S393ZY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YFZY73DFX71SB9Z35W04KABJ3KZR8KCM4Q8F405VHWXSFP0QDXT0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WXEB6GNY2QW601E996QEMC1ZR19JD7BY80C0ZP4RJZF96CJGE17G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0TSQJH2AN46Y8G7SX3NVD4CHBZBWE9513E3TX4ZGE7BPHH9DBM10",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "2GEE0EWTPCPD87RJSGVS0TSW0MDMTNH1C7A4B8E1S0N8PNT7XRQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "WB8YMB681DJ8HHWPAYKVQB8F0AP5TA1MPDE7BVPHCXG9PZBJ1X90",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "0394H8JYQM2C2T1M19C0YME4KCTH7E29TJR97CX8QS1W03MK8F4G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MJSP3YBVXB8EBFE70YKZWG9ZHD4NQ7CER68TRAG71H2R1RJQRZ50",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "818R3Q5SVS3CESW0FPV9JRSWJZCCH5TP3EXHHF2QVAJQKAATKC1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "17M30VGJBBT62KKQTTWE2JWX8NVHCF5TPM534J52MQJ6DMVQ10AG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6NXHE0HGTBJGW8CT32GAQAXT88VWBRGV6WYN13EX0NGEKS9VXHHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QTCPYTC6TXHX8GCEN4MDFMHN0JF6ERQX7YJQ61618RTYER1HHVM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "W3TSHS86VYJA9WR7M6RBEY02SHBHA60S8S466N66ES3K6RX912B0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FR4CTMX8NX3MAYR45MY3NEK7WB2FGRG942ZPDMPRMFZHNXG61BRG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VDRQQMGRDTD6N8CASR5E38EZD2Q9BH1T80Y4T931Y1QQRGQHWN20",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4BZSAFH9TDKK76VWBXV0BBS4PWFJGE4BE2BM81F0756786Y92AN0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QG2F6JYPBNRXHYEPAV1230JY2RJJT9YQ5RHT7BY3GKQ86H7BWNJ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HTXSF7VDF0FAY0SYAR7AKTD06YQ4KVEDFYRM6DPT55ZGRTFBH7X0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Q6W6QKCMCBHGKVNFZR8G4EYK9E8CR63V0ZN3KHDDE7Q34E9RJ5V0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4HRM7X1QNJ5R597G7W18ANJ570CH3SFSKZ1R7G8AQBATYS4PT0MG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T3TX15WSFC6B5K84WN5T31AF25REMFZVGEKD812RT5HH70ZXJHHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "80E5MYTR5XWJJECX6659DK4DTRP9ZQ34SZR404P3HFXNEQ0AKFHG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MAVY2Y2N883V443TGWPGK9GTVQD63W7T3J5519X83CC1VDQ60D1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QPGNDB3XP3DZG8VF0JEPFC1MAG7VZPV3XWAMDQMGDW083G5C11R0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BH5FPZTDJ9797W1BG1WREWXBCQ2VDW9ZY89AHVMBK5NAC2YG2270",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "QDMYJFKZ0MQZTZHGN8MSSKMJBMTSQ4H7HB33REX1KKFXZD5WZ0F0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JPQ35NTEK00M9PHPJX6XW7YCGJ1P9CHHVHBBMKXV1BY3C7D25M7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "SR9AJG9K0SPSH6643E27XZEHEPPDPME1D7E4HF0K8RVHYPA575FG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "HRQGDEQXSZK6MNP6EHD7K6DAHYTW8943Z98PKEWZYD278FW98EPG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "V2C8JNPMF1H3474M0RWZZD89J3C9SB2ZDBDQV822P57MF14PP8FG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G74PT57V50VB1F7K7HG1FENXMH7B4FVGG0V6GMRAVVAWZW6R7170",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RT3KGZ76C3GM31RN2GS25407KT3BXMDBR529P2X844D7FSE5WWW0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RKNQ9D76DMASP74R4CMT65WBMNGNWSHNATPJW12G7HF0K19246FG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "9A01JGYM3DJ7QPWSZJ4Z0MVMJQZG6CPAKEW2E59YA0PP4QABCMK0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NBQ3TDKKF9ATB8SA31JBZJV9C5BAECB6HDHY6A3GQ9WH335PFVEG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "YZDW3RHY1WZ1EFKZVBE25FR4477G4FZ1W36PEG8VHE5P8CVDRX1G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4E24TZXT5B10R927MYZGXYYN93EQN5030Z0G81DDWS1GC2E0TCM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "JYYSTHBVBE5XKHWRPFHTSTS01STNF2VAFW789MKZG635H1FDN8SG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "PS0GPE2WX1ZHCVPYDSFQ66ABYY6D0YKF5PA13BG1WN704CXSAX40",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "385JQHFA6PW2SR43AR84A40T8ECCKCS0TZC11VKDSRMXJHJPKCNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VFS2DM86S18X2NWEQD02B57WYW2E2ZZKJGNQ9QMM7K52R9RQV63G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KJCGHQR3DYDYWWJ560XCJJGKA6FY8V87G3NPJWQY24JC2Q3FM47G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "36YKZYFQT4ACM91B1EKY5F8HF3JKSHBTJ6N6BHP8KGGQD5WT4G00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "T6T4G56HJ0E4ZK0A7T3X3Y8XRTT3DBT1F9GRVZW7S58CN0BYMB9G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "8GKJ6SGW3NV57AA2X7H6D3B51S74H74V53VJNE0A8CKM7E8YR9A0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "KYC8YWPP8BEJSQCDE6WGFN8237FZXGMWSSQEYRDAT5RCN7RZW2F0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NJY3J8WQZS2PM33N8TCN161WVB8P15SCR410E416NJ03KN1F1AMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D37FBJC2Z1WNZVZGP7AFF7SDXRWVMMAJW7SM17KZWQB11NQFQR7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "TJ7HK4A3FQWYGWZK8YQZRVQAPXAR3W2CWES1V2TXZHC3HZPD5YD0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "004VYVFZMR4KFJVDAT1JAG7W8HVJDHCAS4WD6DVEZ06B88VBVTNG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "4W0Z0DZKM1VRJPKT01EHHGX4XJNGJTKPBEHVD0E6BD2Q4HNPWVKG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MX1ADAGS43V6815TTTN70YQH02ZJM429F18D6PPKVT3HM4977CMG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "83XSDQ8DHN3MXB6HG0KD273B90NEFFJ9SC3830TJ5BCF5SBA6Q3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "79ZHFA6ZY5KXSEWX94N0MAYA14PCBC8Q718HCSXHGA42KZ5G1EB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "RM9242RDYRR7FE4F9CN69KH1YKM90Q9E2JTVHMSK18P6XVCX74QG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "E4BBRRG1Z2KSPJP5P9YWGK0W2FBW3VT8TKMTARR4S75XD73N2QR0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FE5TXTFTAV0VBFD1CXQ0T38717DG1P7C51RJ0MYDZAFMMPS2NTP0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "G42X7JN9HN35G2SJCYB7PE6GH0VDPG8QQB965S3V00RKTMDKJKZ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "33BJ1AZ37W9G16HHX8XQQEV83V364HCXTNG1FSJWFTMV7YKC1AQG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "Z3AQJA64JVYYF0V3PH73GKCW5QSNHRHTAZTC3BKRCE380CFFV020",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "NN4G5WGDRQW2RC0PK45V1YZ98EW0H3DHQSWZP9JKGEM6XGKWD0W0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "3YSC3ZFNHZ6G1APC88WCPMDGXA9SXNG3XNC0K6VZGA33FSKPDBVG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "FBXWPAJZBNMW08GG8WKM2NXWH53DARGG780WMBVG9804E7WJF0XG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "VFQ2Q9ZABKFW8TB45QGQHYX3KAMN1MKXA3VN63N8CQH8EDY8V07G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "D0Q3NZ37638KMSR7P74EFK2XM4EYBTR6GKXDZDKBYSA57F2CCXM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CSD8AE34FJG1RSP7YSB92H2MEECGCB7121RRY5X487ZEP1RCHWQ0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "APSFE8RP0H4HYCJT58HVJJBPTSFEGH3P1NQ86ERRZBYH0T04ED3G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "MP9TQ8GEG5BDP4M896A2YMPZQCXPDNMM8AT6FTNMQSXJJ00DFJM0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 1000,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "68QBV99WKFRFY34PKHS2SRKQCEMQ6CEGHVW1P6BEK65FR120TT7G",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "K9DMHQJZMMHWBTHB0N327SJV3AAVPSF6S16GB9MSR91WF6N30JY0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "6R78RF722Q1REGBZCWJQBBPCJDAD0YJ1DKGJ1WMXK925A33HAK00",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "BD7HVKVRA7RR05K5MGFNKVJ6QN91REJZG6TJRQPCNB3W23QFWK60",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "AQQ6Q6YH72BDSBPNEAPJ7A0YQ457VHAFGK4A5ABP2PEZ4Y3ZM890",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5W6ZM3MDQ4QWP5SW71JH8MWTN43QK17Q8EHGEDB58FDWK8HDW890",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "5AKSDR22Q7MXS4MKEV3DD70K0APGVMJJ7NQCSKYE79MR4WN1WEB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "CPME271SE6RQ0BDAN3RKR8GQ2042230KMDTHH82FPRT589GJTYBG",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    },
-    {
-      "reserve_pub": "7CVBX01XHV2JWB5FY9HA7PKWV0XM2NFJKSFNAKX53WATFMDDAJB0",
-      "expected": {
-        "currency": "KUDOS",
-        "value": 904,
-        "fraction": 0
-      },
-      "observed": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "diagnostic": "expired reserve needs to be closed"
-    }
-  ],
-  "wire-out-inconsistencies": [],
+  "emergencies_risk_total": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "reserve_not_closed_inconsistencies": [],
+  "total_balance_reserve_not_closed": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "wire_out_inconsistencies": [],
+  "total_wire_out_delta_plus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_wire_out_delta_minus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "bad_sig_losses": [],
+  "total_bad_sig_loss": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "row_inconsistencies": [],
+  "denomination_key_validity_withdraw_inconsistencies": [],
   "coin_inconsistencies": [],
-  "reserve_balance": [
-    {
-      "total_escrow_balance": {
-        "currency": "KUDOS",
-        "value": 768512,
-        "fraction": 0
-      },
-      "total_withdraw_fee_income": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      }
-    }
-  ],
-  "aggregation_fee_balance": [
-    {
-      "total_aggregation_fee_income": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      }
-    }
-  ],
-  "report_denomination_balance": [
-    {
-      "total_escrow_balance": {
-        "currency": "KUDOS",
-        "value": 65488,
-        "fraction": 0
-      },
-      "total_active_risk": {
-        "currency": "KUDOS",
-        "value": 65488,
-        "fraction": 0
-      },
-      "total_deposit_fee_income": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "total_melt_fee_income": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      },
-      "total_refund_fee_income": {
-        "currency": "KUDOS",
-        "value": 0,
-        "fraction": 0
-      }
-    }
-  ]
+  "total_coin_delta_plus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_coin_delta_minus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "amount_arithmetic_inconsistencies": [],
+  "total_arithmetic_delta_plus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_arithmetic_delta_minus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_aggregation_fee_income": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "wire_fee_time_inconsistencies": []
 }
\ No newline at end of file
diff --git a/contrib/samples/wire-auditor.json 
b/contrib/samples/wire-auditor.json
index b81d486..ce2baf2 100644
--- a/contrib/samples/wire-auditor.json
+++ b/contrib/samples/wire-auditor.json
@@ -1,4175 +1,236 @@
 {
-  "row-inconsistencies": [
+  "wire_out_amount_inconsistencies": [],
+  "total_wire_out_delta_plus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_wire_out_delta_minus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "reserve_in_amount_inconsistencies": [
     {
-      "table": "reserves_in",
-      "row": 192,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 233,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 75,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 282,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 361,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 275,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 458,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 234,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 716,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 586,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 176,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 330,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 696,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 815,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 500,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 252,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 135,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 397,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 786,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 621,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 532,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 337,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 721,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 633,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 146,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 161,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 300,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 666,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 415,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 573,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 460,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 339,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 3,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 61,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 373,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 648,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 443,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 285,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 165,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 755,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 376,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 540,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 214,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 784,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 736,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 766,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 215,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 662,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 462,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 255,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 94,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 780,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 515,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 529,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 419,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 39,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 123,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 560,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 2,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 811,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 683,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 660,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 358,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 187,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 538,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 632,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 559,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 86,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 49,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 332,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 594,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 566,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 659,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 228,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 626,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 162,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 527,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 320,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 713,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 743,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 248,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 459,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 182,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 291,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 191,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 81,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 717,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 693,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 159,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 571,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 829,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 557,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 266,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 294,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 601,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 674,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 12,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 70,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 669,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 753,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 226,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 67,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 724,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 280,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 307,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 143,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 142,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 169,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 37,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 516,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 615,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 308,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 388,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 719,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 577,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 466,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 40,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 801,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 765,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 304,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 237,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 687,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 225,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 310,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 639,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 288,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 493,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 561,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 194,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 530,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 473,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 85,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 734,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 16,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 32,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 630,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 732,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 193,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 58,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 756,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 768,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 273,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 111,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 287,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 329,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 798,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 587,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 24,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 380,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 240,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 550,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 539,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 14,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 93,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 402,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 352,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 481,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 504,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 597,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 556,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 708,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 414,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 612,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 694,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 469,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 712,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 108,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 63,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 797,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 271,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 463,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 242,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 788,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 438,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 232,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 427,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 749,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 783,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 74,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 514,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 269,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 372,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 336,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 545,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 431,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 444,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 474,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 150,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 624,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 396,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 52,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 406,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 823,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 803,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 217,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 4,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 385,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 62,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 92,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 185,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 441,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 382,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 640,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 644,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 112,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 564,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 546,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 518,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 118,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 486,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 430,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 691,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 476,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 521,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 690,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 574,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 31,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 195,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 149,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 775,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 211,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 277,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 383,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 425,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 638,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 728,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 374,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 34,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 445,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 246,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 116,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 138,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 186,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 347,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 387,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 657,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 257,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 593,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 315,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 678,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 89,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 497,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 88,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 370,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 153,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 457,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 661,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 824,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 137,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 110,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 122,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 168,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 747,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 750,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 55,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 344,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 84,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 447,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 124,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 461,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 549,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 606,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 468,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 283,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 665,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 284,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 386,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 525,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 831,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 377,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 609,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 570,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 109,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 148,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 318,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 622,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 113,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 297,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 245,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 433,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 517,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 528,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 33,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 507,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 56,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 80,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 647,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 429,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 720,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 25,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 483,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 27,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 477,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 730,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 177,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 592,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 311,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 326,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 354,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 9,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 567,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 48,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 679,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 196,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 652,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 764,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 96,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 821,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 548,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 792,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 171,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 77,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 272,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 718,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 689,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 698,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 82,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 141,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 655,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 375,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 351,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 298,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 204,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 772,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 295,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 366,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 658,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 763,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 488,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 725,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 305,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 512,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 793,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 809,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 543,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 741,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 407,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 107,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 46,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 356,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 472,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 270,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 535,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 256,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 499,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 230,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 317,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 787,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 224,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 145,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 22,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 66,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 551,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 758,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 428,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 11,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 263,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 279,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 132,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 501,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 184,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 353,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 244,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 432,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 794,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 365,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 201,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 247,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 363,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 172,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 378,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 379,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 205,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 18,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 53,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 79,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 759,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 547,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 5,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 774,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 642,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 697,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 555,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 342,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 631,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 748,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 579,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 744,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 519,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 554,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 218,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 767,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 26,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 267,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 492,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 681,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 575,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 506,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 754,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 781,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 757,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 101,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 175,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 817,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 738,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 126,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 833,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 264,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 152,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 729,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 90,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 411,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 209,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 314,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 654,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 76,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 254,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 580,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 348,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 178,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 45,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 220,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 513,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 139,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 389,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 727,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 663,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 684,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 785,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 322,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 369,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 197,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 437,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 119,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 381,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 250,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 544,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 578,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 649,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 808,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 673,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 746,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 537,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 711,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 319,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 440,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 151,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 588,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 453,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 582,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 834,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 331,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 563,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 413,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 505,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 274,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 705,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 790,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 174,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 216,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 219,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 435,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 490,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 395,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 827,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 221,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 391,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 147,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 482,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 820,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 87,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 324,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 416,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 686,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 13,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 723,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 213,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 627,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 65,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 333,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 6,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 44,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 259,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 349,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 448,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 590,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 819,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 789,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 503,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 296,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 286,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 17,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 183,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 832,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 249,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 421,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 158,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 335,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 133,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 394,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 471,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 806,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 299,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 702,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 465,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 313,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 552,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 95,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 620,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 384,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 610,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 253,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 393,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 104,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 208,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 778,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 584,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 618,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 188,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 761,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 522,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 403,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 818,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 599,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 289,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 569,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 276,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 495,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 589,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 360,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 115,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 452,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 140,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 212,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 591,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 616,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 68,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 733,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 164,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 302,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 456,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 170,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 368,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 189,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 390,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 714,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 485,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 278,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 704,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 364,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 646,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 822,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 401,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 268,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 676,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 737,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 69,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 762,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 509,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 399,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 524,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 779,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 494,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 701,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 602,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 553,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 125,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 442,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 156,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 523,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 645,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 613,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 656,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 357,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 520,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 120,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 321,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 498,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 636,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 199,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 312,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 328,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 752,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 688,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 451,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 479,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 251,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 751,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 436,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 707,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 362,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 731,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 97,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 796,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 629,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 664,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 38,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 542,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 651,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 628,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 814,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 478,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 10,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 410,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 136,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 583,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 715,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 671,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 709,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 699,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 408,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 470,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 334,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 166,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 484,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 129,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 338,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 558,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 8,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 131,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 42,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 309,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 565,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 99,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 562,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 677,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 355,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 637,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 800,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 598,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 650,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 350,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 359,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 572,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 20,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 78,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 340,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 179,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 541,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 341,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 585,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 1,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 409,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 685,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 345,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 98,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 239,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 316,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 568,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 480,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 617,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 327,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 190,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 202,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 64,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 227,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 29,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 160,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 28,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 464,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 802,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 144,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 668,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 236,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 91,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 449,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 813,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 812,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 290,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 607,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 508,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 412,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 782,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 15,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 670,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 773,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 830,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 243,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 534,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 455,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 423,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 799,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 206,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 600,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 635,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 771,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 35,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 51,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 760,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 367,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 398,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 603,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 222,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 595,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 536,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 47,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 198,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 292,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 740,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 281,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 675,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 641,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 643,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 770,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 581,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 60,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 634,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 7,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 323,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 117,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 400,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 526,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 739,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 262,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 805,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 420,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 36,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 114,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 604,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 810,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 826,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 102,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 614,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 229,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 181,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 241,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 163,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 238,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 103,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 346,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 722,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 203,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 450,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 265,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 510,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 306,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 57,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 816,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 703,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 424,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 533,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 576,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 392,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 173,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 50,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 128,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 619,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 769,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 130,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 59,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 710,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 653,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 726,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 371,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 106,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 454,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 605,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 426,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 667,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 293,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 235,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 467,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 825,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 200,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 325,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 531,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 745,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 475,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 121,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 496,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 611,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 502,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 71,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 210,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 422,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 487,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 804,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 672,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 260,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 30,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 41,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 795,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 343,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 231,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 72,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 776,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 105,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 43,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 54,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 489,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 100,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 434,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 155,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 73,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 154,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 23,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 742,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 680,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 258,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 404,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 625,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 596,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 301,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 692,
-      "diagnostic": "matching wire transfer not found"
-    },
-    {
-      "table": "reserves_in",
-      "row": 439,
-      "diagnostic": "matching wire transfer not found"
-    },
+      "row": 1,
+      "amount_expected": {
+        "currency": "KUDOS",
+        "value": 5,
+        "fraction": 1000000
+      },
+      "amount_wired": {
+        "currency": "KUDOS",
+        "value": 0,
+        "fraction": 0
+      },
+      "wtid": "EVYQ70623BNNGM26CC3FCPRZ2R3Q8ZVRMD8M10W4WGBAHA83RDCG",
+      "timestamp": "Wed Nov 08 18:13:41 2017",
+      "diagnostic": "incoming wire transfer claimed by exchange not found"
+    }
+  ],
+  "total_wire_in_delta_plus": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "total_wire_in_delta_minus": {
+    "currency": "KUDOS",
+    "value": 5,
+    "fraction": 1000000
+  },
+  "missattribution_in_inconsistencies": [],
+  "total_missattribution_in": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "row_inconsistencies": [
     {
       "table": "reserves_in",
-      "row": 608,
-      "diagnostic": "matching wire transfer not found"
+      "row": 2,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 417,
-      "diagnostic": "matching wire transfer not found"
+      "row": 3,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 807,
-      "diagnostic": "matching wire transfer not found"
+      "row": 4,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 791,
-      "diagnostic": "matching wire transfer not found"
+      "row": 5,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 223,
-      "diagnostic": "matching wire transfer not found"
+      "row": 6,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 167,
-      "diagnostic": "matching wire transfer not found"
+      "row": 7,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 623,
-      "diagnostic": "matching wire transfer not found"
+      "row": 8,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 828,
-      "diagnostic": "matching wire transfer not found"
+      "row": 9,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 303,
-      "diagnostic": "matching wire transfer not found"
+      "row": 10,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 695,
-      "diagnostic": "matching wire transfer not found"
+      "row": 11,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 405,
-      "diagnostic": "matching wire transfer not found"
+      "row": 12,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 446,
-      "diagnostic": "matching wire transfer not found"
+      "row": 13,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 735,
-      "diagnostic": "matching wire transfer not found"
+      "row": 14,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 134,
-      "diagnostic": "matching wire transfer not found"
+      "row": 15,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 21,
-      "diagnostic": "matching wire transfer not found"
+      "row": 16,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 491,
-      "diagnostic": "matching wire transfer not found"
+      "row": 17,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 706,
-      "diagnostic": "matching wire transfer not found"
+      "row": 18,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
       "row": 19,
-      "diagnostic": "matching wire transfer not found"
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 83,
-      "diagnostic": "matching wire transfer not found"
+      "row": 20,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 700,
-      "diagnostic": "matching wire transfer not found"
+      "row": 21,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 127,
-      "diagnostic": "matching wire transfer not found"
+      "row": 22,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 682,
-      "diagnostic": "matching wire transfer not found"
+      "row": 23,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 180,
-      "diagnostic": "matching wire transfer not found"
+      "row": 24,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 511,
-      "diagnostic": "matching wire transfer not found"
+      "row": 25,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 777,
-      "diagnostic": "matching wire transfer not found"
+      "row": 26,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 207,
-      "diagnostic": "matching wire transfer not found"
+      "row": 27,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 418,
-      "diagnostic": "matching wire transfer not found"
+      "row": 28,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 261,
-      "diagnostic": "matching wire transfer not found"
+      "row": 29,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     },
     {
       "table": "reserves_in",
-      "row": 157,
-      "diagnostic": "matching wire transfer not found"
+      "row": 30,
+      "wire_offset_hash": 
"KXG6WNM57M0SYS2S4A34C2XE89C5DBKQGZ78VGQEB8QHDH54DV3EP88TFCYYC3XXGTKADXJX6R3QEQRD420M07RPWS9N3Q4GS78TZ98",
+      "diagnostic": "duplicate wire offset"
     }
   ],
-  "row-minor-inconsistencies": []
+  "row_minor_inconsistencies": [],
+  "total_wire_format_amount": {
+    "currency": "KUDOS",
+    "value": 0,
+    "fraction": 0
+  },
+  "wire_format_inconsistencies": [],
+  "total_amount_lag": {
+    "currency": "KUDOS",
+    "value": 5,
+    "fraction": 1000000
+  },
+  "lag_details": []
 }
\ No newline at end of file
diff --git a/doc/paper/taler.bib b/doc/paper/taler.bib
index 0b67fa5..a46c938 100644
--- a/doc/paper/taler.bib
+++ b/doc/paper/taler.bib
@@ -388,6 +388,24 @@ year="2017",
 }
 
 
address@hidden,
+  author="Pointcheval, David and Stern, Jacques",
+  title="Security Arguments for Digital Signatures and Blind Signatures ",
+  journal="Journal of Cryptology",
+  year="2000",
+  month="Jun",
+  day="01",
+  volume="13",
+  number="3",
+  pages="361--396",
+  abstract="Since the appearance of public-key cryptography in the seminal 
Diffie---Hellman paper, many new schemes have been proposed and many have been 
broken. Thus, the simple fact that a cryptographic algorithm withstands 
cryptanalytic attacks for several years is often considered as a kind of 
validation procedure. A much more convincing line of research has tried to 
provide ``provable'' security for cryptographic protocols. Unfortunately, in 
many cases, provable security is at the c [...]
+issn="1432-1378",
+  doi="10.1007/s001450010003",
+  url="https://doi.org/10.1007/s001450010003";
+}
+
+
+
 @article{OneMoreInversion,
   author="Bellare and Namprempre and Pointcheval and Semanko",
   title="The One-More-RSA-Inversion Problems and the Security of Chaum's Blind 
Signature Scheme ",
diff --git a/doc/paper/taler.tex b/doc/paper/taler.tex
index f341d46..10a76c5 100644
--- a/doc/paper/taler.tex
+++ b/doc/paper/taler.tex
@@ -1929,7 +1929,7 @@ data being persisted are represented in between 
$\langle\rangle$.
   \item[$\overline{b_s^{(i)}}$]{Blinding factors obtained from decryption by 
the verifier}
   \item[$\overline{C^{(i)}_p}$]{Public coin keys computed from 
$\overline{c_s^{(i)}}$ by the verifier}
 \end{description}
-
+\end{document}
 \newpage
 \onecolumn
 \section{Supplemental: Reviews and Responses from Financial Cryptography}
diff --git a/doc/taler-auditor.1 b/doc/taler-auditor.1
index 7682bf9..dc4da23 100644
--- a/doc/taler-auditor.1
+++ b/doc/taler-auditor.1
@@ -17,7 +17,7 @@ taler\-auditor \- Audit exchange.
 Print short help on options.
 .B
 .IP "\-m KEY,  \-\-exchange-key=KEY"
-Public master key of the exchange in Crockford base32 encoding, for example as 
generated by gnunet\-ecc \-p.
+Public master key of the exchange in Crockford base32 encoding, for example as 
generated by gnunet\-ecc \-p.  If this option is missing, taler\-auditor will 
use the MASTER_PUBLIC_KEY value from the "exchange" section of the 
configuration.
 .B
 .IP "\-r,  \-\-reset"
 Reset the audit, starts everything from the beginning. Useful for testing and 
required for the first audit to setup auditor's tables. Note that if (just) the 
exchange key changes, the \-r option should not be used again.
diff --git a/doc/taler-exchange-httpd.1 b/doc/taler-exchange-httpd.1
index a02619d..3ebbb6c 100644
--- a/doc/taler-exchange-httpd.1
+++ b/doc/taler-exchange-httpd.1
@@ -16,8 +16,8 @@ taler\-exchange\-httpd \- Run Taler exchange (with RESTful 
API)
 .IP "\-C,  \-\-connection-close"
 Force each HTTP connection to be closed after each request (useful in 
combination with \-f to avoid having to wait for nc to time out).
 .B
-.IP "\-d DIRNAME,  \-\-exchange-dir=DIRNAME"
-Use the configuration and other resources for the exchange to operate from 
DIRNAME.
+.IP "\-c FILENAME,  \-\-config=FILENAME"
+Use the configuration and other resources for the merchant to operate from 
FILENAME.
 .B
 .IP "\-h, \-\-help"
 Print short help on options.
diff --git a/src/auditor/Makefile.am b/src/auditor/Makefile.am
index 439db7f..0770338 100644
--- a/src/auditor/Makefile.am
+++ b/src/auditor/Makefile.am
@@ -39,6 +39,7 @@ taler_wire_auditor_LDADD = \
   $(top_builddir)/src/exchangedb/libtalerexchangedb.la \
   $(top_builddir)/src/auditordb/libtalerauditordb.la \
   -ljansson \
+  -lgnunetjson \
   -lgnunetutil
 
 taler_auditor_sign_SOURCES = \
diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c
index 3e4eca1..cd1ee0d 100644
--- a/src/auditor/taler-auditor.c
+++ b/src/auditor/taler-auditor.c
@@ -3,14 +3,14 @@
   Copyright (C) 2016, 2017 Inria
 
   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
+  terms of the GNU Affero 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.
+  A PARTICULAR PURPOSE.  See the GNU Affero Public License for more details.
 
-  You should have received a copy of the GNU General Public License along with
+  You should have received a copy of the GNU Affero Public License along with
   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */
 /**
@@ -125,14 +125,47 @@ static json_t *report_emergencies;
 static json_t *report_row_inconsistencies;
 
 /**
- * Array of reports about minor row inconcistencies.
+ * Array of reports about the denomination key not being
+ * valid at the time of withdrawal.
  */
-static json_t *report_row_minor_inconsistencies;
+static json_t *denomination_key_validity_withdraw_inconsistencies;
 
 /**
- * Array of reports about reserve inconsitencies.
+ * Array of reports about reserve balance insufficient inconsitencies.
  */
-static json_t *report_reserve_inconsistencies;
+static json_t *report_reserve_balance_insufficient_inconsistencies;
+
+/**
+ * Total amount reserves were charged beyond their balance.
+ */
+static struct TALER_Amount total_balance_insufficient_loss;
+
+/**
+ * Array of reports about reserve balance summary wrong in database.
+ */
+static json_t *report_reserve_balance_summary_wrong_inconsistencies;
+
+/**
+ * Total delta between expected and stored reserve balance summaries,
+ * for positive deltas.
+ */
+static struct TALER_Amount total_balance_summary_delta_plus;
+
+/**
+ * Total delta between expected and stored reserve balance summaries,
+ * for negative deltas.
+ */
+static struct TALER_Amount total_balance_summary_delta_minus;
+
+/**
+ * Array of reports about reserve's not being closed inconsitencies.
+ */
+static json_t *report_reserve_not_closed_inconsistencies;
+
+/**
+ * Total amount affected by reserves not having been closed on time.
+ */
+static struct TALER_Amount total_balance_reserve_not_closed;
 
 /**
  * Array of reports about irregular wire out entries.
@@ -140,14 +173,31 @@ static json_t *report_reserve_inconsistencies;
 static json_t *report_wire_out_inconsistencies;
 
 /**
+ * Total delta between calculated and stored wire out transfers,
+ * for positive deltas.
+ */
+static struct TALER_Amount total_wire_out_delta_plus;
+
+/**
+ * Total delta between calculated and stored wire out transfers
+ * for negative deltas.
+ */
+static struct TALER_Amount total_wire_out_delta_minus;
+
+/**
  * Array of reports about inconsistencies about coins.
  */
 static json_t *report_coin_inconsistencies;
 
 /**
- * Report about expected reserve balances.
+ * Profits the exchange made by bad amount calculations on coins.
+ */
+static struct TALER_Amount total_coin_delta_plus;
+
+/**
+ * Losses the exchange made by bad amount calculations on coins.
  */
-static json_t *report_reserve_balances;
+static struct TALER_Amount total_coin_delta_minus;
 
 /**
  * Report about aggregate wire transfer fee profits.
@@ -155,9 +205,75 @@ static json_t *report_reserve_balances;
 static json_t *report_aggregation_fee_balances;
 
 /**
- * Report about denomination fee balances.
+ * Report about amount calculation differences (causing profit
+ * or loss at the exchange).
+ */
+static json_t *report_amount_arithmetic_inconsistencies;
+
+/**
+ * Array of reports about wire fees being ambiguous in terms of validity 
periods.
+ */
+static json_t *report_fee_time_inconsistencies;
+
+/**
+ * Profits the exchange made by bad amount calculations.
+ */
+static struct TALER_Amount total_arithmetic_delta_plus;
+
+/**
+ * Losses the exchange made by bad amount calculations.
+ */
+static struct TALER_Amount total_arithmetic_delta_minus;
+
+/**
+ * Total amount reported in all calls to #report_emergency().
+ */
+static struct TALER_Amount reported_emergency_sum;
+
+/**
+ * Expected balance in the escrow account.
  */
-static json_t *report_denomination_balances;
+static struct TALER_Amount total_escrow_balance;
+
+/**
+ * Active risk exposure.
+ */
+static struct TALER_Amount total_risk;
+
+/**
+ * Total withdraw fees earned.
+ */
+static struct TALER_Amount total_withdraw_fee_income;
+
+/**
+ * Total deposit fees earned.
+ */
+static struct TALER_Amount total_deposit_fee_income;
+
+/**
+ * Total melt fees earned.
+ */
+static struct TALER_Amount total_melt_fee_income;
+
+/**
+ * Total refund fees earned.
+ */
+static struct TALER_Amount total_refund_fee_income;
+
+/**
+ * Total aggregation fees earned.
+ */
+static struct TALER_Amount total_aggregation_fee_income;
+
+/**
+ * Array of reports about coin operations with bad signatures.
+ */
+static json_t *report_bad_sig_losses;
+
+/**
+ * Total amount lost by operations for which signatures were invalid.
+ */
+static struct TALER_Amount total_bad_sig_loss;
 
 
 /* ***************************** Report logic **************************** */
@@ -168,7 +284,7 @@ static json_t *report_denomination_balances;
  *
  * @param array report array to append @a object to
  * @param object object to append, should be check that it is not NULL
- */ 
+ */
 static void
 report (json_t *array,
        json_t *object)
@@ -189,220 +305,170 @@ report (json_t *array,
  * denomination (and as an exchange suffer a huge financial loss).
  *
  * @param dki denomination key where the loss was detected
+ * @param risk maximum risk that might have just become real (coins created by 
this @a dki)
  */
 static void
-report_emergency (const struct TALER_EXCHANGEDB_DenominationKeyInformationP 
*dki)
+report_emergency (const struct TALER_EXCHANGEDB_DenominationKeyInformationP 
*dki,
+                  const struct TALER_Amount *risk)
 {
   report (report_emergencies,
-         json_pack ("{s:o}",
+         json_pack ("{s:o, s:o, s:s, s:s, s:o}",
                     "denompub_hash",
-                    GNUNET_JSON_from_data_auto (&dki->properties.denom_hash)));
-}
-
-
-/**
- * Report a (serious) inconsistency in the exchange's database.
- *
- * @param table affected table
- * @param rowid affected row, UINT64_MAX if row is missing
- * @param diagnostic message explaining the problem
- */
-static void
-report_row_inconsistency (const char *table,
-                          uint64_t rowid,
-                          const char *diagnostic)
-{
-  report (report_row_inconsistencies,
-         json_pack ("{s:s, s:I, s:s}",
-                    "table", table,
-                    "row", (json_int_t) rowid,
-                    "diagnostic", diagnostic));
+                    GNUNET_JSON_from_data_auto (&dki->properties.denom_hash),
+                     "denom_risk",
+                     TALER_JSON_from_amount (risk),
+                     "start",
+                     GNUNET_STRINGS_absolute_time_to_string 
(GNUNET_TIME_absolute_ntoh (dki->properties.start)),
+                     "deposit_end",
+                     GNUNET_STRINGS_absolute_time_to_string 
(GNUNET_TIME_absolute_ntoh (dki->properties.expire_deposit)),
+                     "value",
+                     TALER_JSON_from_amount_nbo (&dki->properties.value)));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_add (&reported_emergency_sum,
+                                   &reported_emergency_sum,
+                                   risk));
 }
 
 
 /**
- * Report a minor inconsistency in the exchange's database (i.e. something
- * relating to timestamps that should have no financial implications).
+ * Report a (serious) inconsistency in the exchange's database with
+ * respect to calculations involving amounts.
  *
- * @param table affected table
+ * @param operation what operation had the inconsistency
  * @param rowid affected row, UINT64_MAX if row is missing
- * @param diagnostic message explaining the problem
+ * @param exchange amount calculated by exchange
+ * @param auditor amount calculated by auditor
+ * @param proftable 1 if @a exchange being larger than @a auditor is
+ *           profitable for the exchange for this operation,
+ *           -1 if @a exchange being smaller than @a auditor is
+ *           profitable for the exchange, and 0 if it is unclear
  */
 static void
-report_row_minor_inconsistency (const char *table,
-                                uint64_t rowid,
-                                const char *diagnostic)
+report_amount_arithmetic_inconsistency (const char *operation,
+                                        uint64_t rowid,
+                                        const struct TALER_Amount *exchange,
+                                        const struct TALER_Amount *auditor,
+                                        int profitable)
 {
-  report (report_row_minor_inconsistencies,
-         json_pack ("{s:s, s:I, s:s}",
-                    "table", table,
-                    "row", (json_int_t) rowid,
-                    "diagnostic", diagnostic));
-}
+  struct TALER_Amount delta;
+  struct TALER_Amount *target;
 
-
-/**
- * Report a global inconsistency with respect to a reserve.
- *
- * @param reserve_pub the affected reserve
- * @param expected expected amount
- * @param observed observed amount
- * @param diagnostic message explaining what @a expected and @a observed refer 
to
- */
-static void
-report_reserve_inconsistency (const struct TALER_ReservePublicKeyP 
*reserve_pub,
-                              const struct TALER_Amount *expected,
-                              const struct TALER_Amount *observed,
-                              const char *diagnostic)
-{
-  report (report_reserve_inconsistencies,
-         json_pack ("{s:o, s:o, s:o, s:s}",
-                    "reserve_pub",
-                    GNUNET_JSON_from_data_auto (reserve_pub),
-                    "expected",
-                    TALER_JSON_from_amount (expected),
-                    "observed",
-                    TALER_JSON_from_amount (observed),
-                    "diagnostic",
-                    diagnostic));
+  if (0 < TALER_amount_cmp (exchange,
+                            auditor))
+  {
+    /* exchange > auditor */
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_subtract (&delta,
+                                         exchange,
+                                         auditor));
+  }
+  else
+  {
+    /* auditor < exchange */
+    profitable = - profitable;
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_subtract (&delta,
+                                         auditor,
+                                         exchange));
+  }
+  report (report_amount_arithmetic_inconsistencies,
+          json_pack ("{s:s, s:I, s:o, s:o, s:I}",
+                     "operation", operation,
+                     "rowid", (json_int_t) rowid,
+                     "exchange", TALER_JSON_from_amount (exchange),
+                     "auditor", TALER_JSON_from_amount (auditor),
+                     "profitable", (json_int_t) profitable));
+  if (0 != profitable)
+  {
+    target = profitable
+      ? &total_arithmetic_delta_plus
+      : &total_arithmetic_delta_minus;
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (target,
+                                    target,
+                                    &delta));
+  }
 }
 
 
 /**
- * Report a global inconsistency with respect to a wire transfer.
+ * Report a (serious) inconsistency in the exchange's database with
+ * respect to calculations involving amounts of a coin.
  *
- * @param destination wire transfer target account
- * @param rowid which row is the inconsitency in
- * @param expected expected amount
- * @param observed observed amount
- * @param diagnostic message explaining what @a expected and @a observed refer 
to
+ * @param operation what operation had the inconsistency
+ * @param coin_pub affected coin
+ * @param exchange amount calculated by exchange
+ * @param auditor amount calculated by auditor
+ * @param proftable 1 if @a exchange being larger than @a auditor is
+ *           profitable for the exchange for this operation,
+ *           -1 if @a exchange being smaller than @a auditor is
+ *           profitable for the exchange, and 0 if it is unclear
  */
 static void
-report_wire_out_inconsistency (const json_t *destination,
-                               uint64_t rowid,
-                               const struct TALER_Amount *expected,
-                               const struct TALER_Amount *observed,
-                               const char *diagnostic)
+report_coin_arithmetic_inconsistency (const char *operation,
+                                      const struct TALER_CoinSpendPublicKeyP 
*coin_pub,
+                                      const struct TALER_Amount *exchange,
+                                      const struct TALER_Amount *auditor,
+                                      int profitable)
 {
-  report (report_wire_out_inconsistencies,
-         json_pack ("{s:O, s:I, s:o, s:o, s:s}",
-                    "destination_account",
-                    destination,
-                    "rowid",
-                    (json_int_t) rowid,
-                    "expected",
-                    TALER_JSON_from_amount (expected),
-                    "observed",
-                    TALER_JSON_from_amount (observed),
-                    "diagnostic",
-                    diagnostic));
-}
-
+  struct TALER_Amount delta;
+  struct TALER_Amount *target;
 
-/**
- * Report a global inconsistency with respect to a coin's history.
- *
- * @param coin_pub the affected coin
- * @param expected expected amount
- * @param observed observed amount
- * @param diagnostic message explaining what @a expected and @a observed refer 
to
- */
-static void
-report_coin_inconsistency (const struct TALER_CoinSpendPublicKeyP *coin_pub,
-                           const struct TALER_Amount *expected,
-                           const struct TALER_Amount *observed,
-                           const char *diagnostic)
-{
+  if (0 < TALER_amount_cmp (exchange,
+                            auditor))
+  {
+    /* exchange > auditor */
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_subtract (&delta,
+                                         exchange,
+                                         auditor));
+  }
+  else
+  {
+    /* auditor < exchange */
+    profitable = - profitable;
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_subtract (&delta,
+                                         auditor,
+                                         exchange));
+  }
   report (report_coin_inconsistencies,
-         json_pack ("{s:o, s:o, s:o, s:s}",
-                    "coin_pub",
-                    GNUNET_JSON_from_data_auto (coin_pub),
-                    "expected",
-                    TALER_JSON_from_amount (expected),
-                    "observed",
-                    TALER_JSON_from_amount (observed),
-                    "diagnostic",
-                    diagnostic));
-}
-
-
-/**
- * Report the final result on the reserve balances of the exchange.
- * The reserve must have @a total_balance in its escrow account just
- * to cover outstanding reserve funds (outstanding coins are on top).
- * The reserve has made @a total_fee_balance in profit from withdrawal
- * operations alone.
- *
- * Note that this is for the "ongoing" reporting period.  Historic
- * revenue (as stored via the "insert_historic_reserve_revenue")
- * is not included in the @a total_fee_balance.
- *
- * @param total_balance how much money (in total) is left in all of the
- *        reserves (that has not been withdrawn)
- * @param total_fee_balance how much money (in total) did the reserve
- *        make from withdrawal fees
- */
-static void
-report_reserve_balance (const struct TALER_Amount *total_balance,
-                        const struct TALER_Amount *total_fee_balance)
-{
-  report (report_reserve_balances,
-         json_pack ("{s:o, s:o}",
-                    "total_escrow_balance",
-                    TALER_JSON_from_amount (total_balance),
-                    "total_withdraw_fee_income",
-                    TALER_JSON_from_amount (total_fee_balance)));
-}
-
-
-/**
- * Report on the aggregation fees the exchange made.
- *
- * Note that this is for the "ongoing" reporting period.  Historic
- * revenue (as stored via the "insert_historic_reserve_revenue")
- * is not included in the @a total_fee_balance.
- *
- * @param total_fee_balance how much money (in total) did the reserve
- *        make from aggregation fees
- */
-static void
-report_aggregation_fee_balance (const struct TALER_Amount *total_fee_balance)
-{
-  report (report_aggregation_fee_balances,
-         json_pack ("{s:o}",
-                    "total_aggregation_fee_income",
-                    TALER_JSON_from_amount (total_fee_balance)));
+          json_pack ("{s:s, s:o, s:o, s:o, s:I}",
+                     "operation", operation,
+                     "coin_pub", GNUNET_JSON_from_data_auto (coin_pub),
+                     "exchange", TALER_JSON_from_amount (exchange),
+                     "auditor", TALER_JSON_from_amount (auditor),
+                     "profitable", (json_int_t) profitable));
+  if (0 != profitable)
+  {
+    target = profitable
+      ? &total_coin_delta_plus
+      : &total_coin_delta_minus;
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (target,
+                                    target,
+                                    &delta));
+  }
 }
 
 
 /**
- * Report state of denomination processing.
+ * Report a (serious) inconsistency in the exchange's database.
  *
- * @param total_balance total value of outstanding coins
- * @param total_risk total value of issued coins in active denominations
- * @param deposit_fees total deposit fees collected
- * @param melt_fees total melt fees collected
- * @param refund_fees total refund fees collected
+ * @param table affected table
+ * @param rowid affected row, UINT64_MAX if row is missing
+ * @param diagnostic message explaining the problem
  */
 static void
-report_denomination_balance (const struct TALER_Amount *total_balance,
-                             const struct TALER_Amount *total_risk,
-                             const struct TALER_Amount *deposit_fees,
-                             const struct TALER_Amount *melt_fees,
-                             const struct TALER_Amount *refund_fees)
+report_row_inconsistency (const char *table,
+                          uint64_t rowid,
+                          const char *diagnostic)
 {
-  report (report_denomination_balances,
-         json_pack ("{s:o, s:o, s:o, s:o, s:o}",
-                    "total_escrow_balance",
-                    TALER_JSON_from_amount (total_balance),
-                    "total_active_risk",
-                    TALER_JSON_from_amount (total_risk),
-                    "total_deposit_fee_income",
-                    TALER_JSON_from_amount (deposit_fees),
-                    "total_melt_fee_income",
-                    TALER_JSON_from_amount (melt_fees),
-                    "total_refund_fee_income",
-                    TALER_JSON_from_amount (refund_fees)));
+  report (report_row_inconsistencies,
+         json_pack ("{s:s, s:I, s:s}",
+                    "table", table,
+                    "row", (json_int_t) rowid,
+                    "diagnostic", diagnostic));
 }
 
 
@@ -629,10 +695,6 @@ load_auditor_reserve_summary (struct ReserveSummary *rs)
         TALER_amount_cmp_currency (&rs->total_in,
                                    &rs->a_balance)) )
   {
-    report_row_inconsistency ("auditor-reserve-info",
-                              rowid,
-                              "currencies for reserve differ");
-    /* TODO: find a sane way to continue... */
     GNUNET_break (0);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
@@ -663,16 +725,6 @@ struct ReserveContext
   struct GNUNET_CONTAINER_MultiHashMap *revoked;
 
   /**
-   * Total balance in all reserves (updated).
-   */
-  struct TALER_Amount total_balance;
-
-  /**
-   * Total withdraw fees gotten in all reserves (updated).
-   */
-  struct TALER_Amount total_fee_balance;
-
-  /**
    * Transaction status code, set to error codes if applicable.
    */
   enum GNUNET_DB_QueryStatus qs;
@@ -826,9 +878,12 @@ handle_reserve_out (void *cls,
   if ( (valid_start.abs_value_us > execution_date.abs_value_us) ||
        (expire_withdraw.abs_value_us < execution_date.abs_value_us) )
   {
-    report_row_minor_inconsistency ("withdraw",
-                                    rowid,
-                                    "denomination key not valid at time of 
withdrawal");
+    report (denomination_key_validity_withdraw_inconsistencies,
+            json_pack ("{s:I, s:s, s:o, s:o}",
+                       "row", (json_int_t) rowid,
+                       "execution_date", 
GNUNET_STRINGS_absolute_time_to_string (execution_date),
+                       "reserve_pub", GNUNET_JSON_from_data_auto (reserve_pub),
+                       "denompub_h", GNUNET_JSON_from_data_auto 
(&wsrd.h_denomination_pub)));
   }
 
   /* check reserve_sig */
@@ -845,9 +900,16 @@ handle_reserve_out (void *cls,
                                   &reserve_sig->eddsa_signature,
                                   &reserve_pub->eddsa_pub))
   {
-    report_row_inconsistency ("withdraw",
-                              rowid,
-                              "invalid signature for withdrawal");
+    report (report_bad_sig_losses,
+            json_pack ("{s:s, s:I, s:o, s:o}",
+                       "operation", "withdraw",
+                       "row", (json_int_t) rowid,
+                       "loss", TALER_JSON_from_amount (amount_with_fee),
+                       "key_pub", GNUNET_JSON_from_data_auto (reserve_pub)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_sig_loss,
+                                    &total_bad_sig_loss,
+                                    amount_with_fee));
     return GNUNET_OK;
   }
 
@@ -940,19 +1002,26 @@ handle_payback_by_reserve (void *cls,
   /* should be monotonically increasing */
   GNUNET_assert (rowid >= pp.last_reserve_payback_serial_id);
   pp.last_reserve_payback_serial_id = rowid + 1;
+  GNUNET_CRYPTO_rsa_public_key_hash (coin->denom_pub.rsa_public_key,
+                                     &pr.h_denom_pub);
 
   if (GNUNET_OK !=
       TALER_test_coin_valid (coin))
   {
-    report_row_inconsistency ("payback",
-                              rowid,
-                              "coin denomination signature invalid");
+    report (report_bad_sig_losses,
+            json_pack ("{s:s, s:I, s:o, s:o}",
+                       "operation", "payback-verify",
+                       "row", (json_int_t) rowid,
+                       "loss", TALER_JSON_from_amount (amount),
+                       "key_pub", GNUNET_JSON_from_data_auto 
(&pr.h_denom_pub)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_sig_loss,
+                                    &total_bad_sig_loss,
+                                    amount));
   }
   pr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_PAYBACK);
   pr.purpose.size = htonl (sizeof (pr));
   pr.coin_pub = coin->coin_pub;
-  GNUNET_CRYPTO_rsa_public_key_hash (coin->denom_pub.rsa_public_key,
-                                     &pr.h_denom_pub);
   pr.coin_blind = *coin_blind;
   if (GNUNET_OK !=
       GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_WALLET_COIN_PAYBACK,
@@ -960,9 +1029,16 @@ handle_payback_by_reserve (void *cls,
                                   &coin_sig->eddsa_signature,
                                   &coin->coin_pub.eddsa_pub))
   {
-    report_row_inconsistency ("payback",
-                              rowid,
-                              "coin payback signature invalid");
+    report (report_bad_sig_losses,
+            json_pack ("{s:s, s:I, s:o, s:o}",
+                       "operation", "payback",
+                       "row", (json_int_t) rowid,
+                       "loss", TALER_JSON_from_amount (amount),
+                       "key_pub", GNUNET_JSON_from_data_auto 
(&coin->coin_pub)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_sig_loss,
+                                    &total_bad_sig_loss,
+                                    amount));
   }
 
   /* check that the coin was eligible for payback!*/
@@ -1001,9 +1077,6 @@ handle_payback_by_reserve (void *cls,
                                      &msig.eddsa_signature,
                                      &master_pub.eddsa_pub))
       {
-       report_row_inconsistency ("denomination_revocations",
-                                 rev_rowid,
-                                 "master signature invalid");
        rev = "master signature invalid";
       }
       else
@@ -1017,6 +1090,19 @@ handle_payback_by_reserve (void *cls,
                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
     }
   }
+  if (0 == strcmp (rev, "master signature invalid"))
+  {
+    report (report_bad_sig_losses,
+            json_pack ("{s:s, s:I, s:o, s:o}",
+                       "operation", "payback-master",
+                       "row", (json_int_t) rev_rowid,
+                       "loss", TALER_JSON_from_amount (amount),
+                       "key_pub", GNUNET_JSON_from_data_auto (&master_pub)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_sig_loss,
+                                    &total_bad_sig_loss,
+                                    amount));
+  }
 
   GNUNET_CRYPTO_hash (reserve_pub,
                       sizeof (*reserve_pub),
@@ -1200,10 +1286,7 @@ verify_reserve_balance (void *cls,
                         &rs->total_in,
                         &rs->a_balance))
   {
-    report_reserve_inconsistency (&rs->reserve_pub,
-                                  &rs->total_in,
-                                  &rs->a_balance,
-                                  "could not add old balance to new balance");
+    GNUNET_break (0);
     goto cleanup;
   }
 
@@ -1212,19 +1295,62 @@ verify_reserve_balance (void *cls,
                              &balance,
                              &rs->total_out))
   {
-    report_reserve_inconsistency (&rs->reserve_pub,
-                                  &rs->total_in,
-                                  &rs->total_out,
-                                  "available balance insufficient to cover 
transfers");
+    struct TALER_Amount loss;
+
+    GNUNET_break (GNUNET_SYSERR !=
+                  TALER_amount_subtract (&loss,
+                                         &rs->total_out,
+                                         &balance));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_balance_insufficient_loss,
+                                    &total_balance_insufficient_loss,
+                                    &loss));
+    report (report_reserve_balance_insufficient_inconsistencies,
+            json_pack ("{s:o, s:o, s:o, s:s}",
+                       "reserve_pub",
+                       GNUNET_JSON_from_data_auto (&rs->reserve_pub),
+                       "loss",
+                       TALER_JSON_from_amount (&loss)));
     goto cleanup;
   }
   if (0 != TALER_amount_cmp (&balance,
                              &reserve.balance))
   {
-    report_reserve_inconsistency (&rs->reserve_pub,
-                                  &balance,
-                                  &reserve.balance,
-                                  "computed balance does not match stored 
balance");
+    struct TALER_Amount delta;
+
+    if (0 < TALER_amount_cmp (&balance,
+                              &reserve.balance))
+    {
+      /* balance > reserve.balance */
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_subtract (&delta,
+                                            &balance,
+                                            &reserve.balance));
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_add (&total_balance_summary_delta_plus,
+                                       &total_balance_summary_delta_plus,
+                                       &delta));
+    }
+    else
+    {
+      /* balance < reserve.balance */
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_subtract (&delta,
+                                            &reserve.balance,
+                                            &balance));
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_add (&total_balance_summary_delta_minus,
+                                       &total_balance_summary_delta_minus,
+                                       &delta));
+    }
+    report (report_reserve_balance_summary_wrong_inconsistencies,
+            json_pack ("{s:o, s:o, s:o}",
+                       "reserve_pub",
+                       GNUNET_JSON_from_data_auto (&rs->reserve_pub),
+                       "exchange",
+                       TALER_JSON_from_amount (&reserve.balance),
+                       "auditor",
+                       TALER_JSON_from_amount (&balance)));
     goto cleanup;
   }
 
@@ -1234,16 +1360,18 @@ verify_reserve_balance (void *cls,
        ( (0 != balance.value) ||
         (0 != balance.fraction) ) )
   {
-    struct TALER_Amount zero;
-
     GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (balance.currency,
-                                          &zero));
-
-    report_reserve_inconsistency (&rs->reserve_pub,
-                                  &balance,
-                                  &zero,
-                                  "expired reserve needs to be closed");
+                   TALER_amount_add (&total_balance_reserve_not_closed,
+                                     &total_balance_reserve_not_closed,
+                                     &balance));
+    report (report_reserve_not_closed_inconsistencies,
+            json_pack ("{s:o, s:o, s:s}",
+                       "reserve_pub",
+                       GNUNET_JSON_from_data_auto (&rs->reserve_pub),
+                       "balance",
+                       TALER_JSON_from_amount (&balance),
+                       "expiration_time",
+                       GNUNET_STRINGS_absolute_time_to_string 
(rs->a_expiration_date)));
   }
 
   /* Add withdraw fees we encountered to totals */
@@ -1261,16 +1389,16 @@ verify_reserve_balance (void *cls,
     goto cleanup;
   }
   if ( (GNUNET_YES !=
-        TALER_amount_add (&rc->total_balance,
-                          &rc->total_balance,
+        TALER_amount_add (&total_escrow_balance,
+                          &total_escrow_balance,
                           &rs->total_in)) ||
        (GNUNET_SYSERR ==
-        TALER_amount_subtract (&rc->total_balance,
-                               &rc->total_balance,
+        TALER_amount_subtract (&total_escrow_balance,
+                               &total_escrow_balance,
                                &rs->total_out)) ||
        (GNUNET_YES !=
-        TALER_amount_add (&rc->total_fee_balance,
-                          &rc->total_fee_balance,
+        TALER_amount_add (&total_withdraw_fee_income,
+                          &total_withdraw_fee_income,
                           &rs->total_fee)) )
   {
     GNUNET_break (0);
@@ -1367,23 +1495,13 @@ analyze_reserves (void *cls)
   qsx = adb->get_reserve_summary (adb->cls,
                                  asession,
                                  &master_pub,
-                                 &rc.total_balance,
-                                 &rc.total_fee_balance);
+                                 &total_escrow_balance,
+                                 &total_withdraw_fee_income);
   if (qsx < 0)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qsx);
     return qsx;
   }
-  if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qsx)
-  {
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &rc.total_balance));
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &rc.total_fee_balance));
-  }
-
   rc.reserves = GNUNET_CONTAINER_multihashmap_create (512,
                                                       GNUNET_NO);
   rc.revoked = GNUNET_CONTAINER_multihashmap_create (4,
@@ -1446,24 +1564,22 @@ analyze_reserves (void *cls)
     qs = adb->insert_reserve_summary (adb->cls,
                                      asession,
                                      &master_pub,
-                                     &rc.total_balance,
-                                     &rc.total_fee_balance);
+                                     &total_escrow_balance,
+                                     &total_withdraw_fee_income);
   }
   else
   {
     qs = adb->update_reserve_summary (adb->cls,
                                      asession,
                                      &master_pub,
-                                     &rc.total_balance,
-                                     &rc.total_fee_balance);
+                                     &total_escrow_balance,
+                                     &total_withdraw_fee_income);
   }
   if (0 >= qs)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
     return qs;
   }
-  report_reserve_balance (&rc.total_balance,
-                          &rc.total_fee_balance);
   return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
 }
 
@@ -1565,7 +1681,7 @@ struct AggregationContext
   /**
    * How much did we make in aggregation fees.
    */
-  struct TALER_Amount total_aggregation_fees;
+  struct TALER_Amount total_aggregation_feesX;
 
   /**
    * Final result status.
@@ -1883,10 +1999,11 @@ check_transaction_history (const struct 
TALER_CoinSpendPublicKeyP *coin_pub,
                              &refunds))
   {
     /* refunds above expenditures? Bad! */
-    report_coin_inconsistency (coin_pub,
-                               &expenditures,
-                               &refunds,
-                               "could not subtract refunded amount from 
expenditures");
+    report_coin_arithmetic_inconsistency ("refund (balance)",
+                                          coin_pub,
+                                          &expenditures,
+                                          &refunds,
+                                          0);
     return GNUNET_SYSERR;
   }
 
@@ -1897,10 +2014,11 @@ check_transaction_history (const struct 
TALER_CoinSpendPublicKeyP *coin_pub,
                              &value))
   {
     /* spent > value */
-    report_coin_inconsistency (coin_pub,
-                               &spent,
-                               &value,
-                               "accepted deposits (minus refunds) exceeds 
denomination value");
+    report_coin_arithmetic_inconsistency ("spend",
+                                          coin_pub,
+                                          &spent,
+                                          &value,
+                                          -1);
     return GNUNET_SYSERR;
   }
 
@@ -1911,10 +2029,11 @@ check_transaction_history (const struct 
TALER_CoinSpendPublicKeyP *coin_pub,
                              &merchant_loss))
   {
     /* refunds above deposits? Bad! */
-    report_coin_inconsistency (coin_pub,
-                               merchant_gain,
-                               &merchant_loss,
-                               "merchant was granted more refunds than he 
deposited");
+    report_coin_arithmetic_inconsistency ("refund (merchant)",
+                                          coin_pub,
+                                          merchant_gain,
+                                          &merchant_loss,
+                                          0);
     return GNUNET_SYSERR;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1955,7 +2074,6 @@ wire_transfer_information_cb (void *cls,
 {
   struct WireCheckContext *wcc = cls;
   const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
-  struct TALER_Amount contribution;
   struct TALER_Amount computed_value;
   struct TALER_Amount computed_fees;
   struct TALER_Amount coin_value_without_fee;
@@ -2027,9 +2145,11 @@ wire_transfer_information_cb (void *cls,
                              coin_fee))
   {
     wcc->qs = GNUNET_DB_STATUS_HARD_ERROR;
-    report_row_inconsistency ("aggregation",
-                              rowid,
-                              "inconsistent coin value and fee claimed in 
aggregation");
+    report_amount_arithmetic_inconsistency ("aggregation (fee structure)",
+                                            rowid,
+                                            coin_value,
+                                            coin_fee,
+                                            -1);
     return;
   }
   if (0 !=
@@ -2037,18 +2157,22 @@ wire_transfer_information_cb (void *cls,
                         &coin_value_without_fee))
   {
     wcc->qs = GNUNET_DB_STATUS_HARD_ERROR;
-    report_row_inconsistency ("aggregation",
-                              rowid,
-                              "coin transaction history and aggregation 
disagree about coin's contribution");
+    report_amount_arithmetic_inconsistency ("aggregation (contribution)",
+                                            rowid,
+                                            &coin_value_without_fee,
+                                            &computed_value,
+                                            -1);
   }
   if (0 !=
       TALER_amount_cmp (&computed_fees,
                         coin_fee))
   {
     wcc->qs = GNUNET_DB_STATUS_HARD_ERROR;
-    report_row_inconsistency ("aggregation",
-                              rowid,
-                              "coin transaction history and aggregation 
disagree about applicable fees");
+    report_amount_arithmetic_inconsistency ("aggregation (fee)",
+                                            rowid,
+                                            coin_fee,
+                                            &computed_fees,
+                                            1);
   }
   edb->free_coin_transaction_list (edb->cls,
                                    tl);
@@ -2082,23 +2206,12 @@ wire_transfer_information_cb (void *cls,
                               "date given in aggregate does not match wire 
transfer date");
     return;
   }
-  if (GNUNET_SYSERR ==
-      TALER_amount_subtract (&contribution,
-                             coin_value,
-                             coin_fee))
-  {
-    wcc->qs = GNUNET_DB_STATUS_HARD_ERROR;
-    report_row_inconsistency ("aggregation",
-                              rowid,
-                              "could not calculate contribution of coin");
-    return;
-  }
 
   /* Add coin's contribution to total aggregate value */
   if (GNUNET_OK !=
       TALER_amount_add (&wcc->total_deposits,
                        &wcc->total_deposits,
-                       &contribution))
+                       &coin_value_without_fee))
   {
     GNUNET_break (0);
     wcc->qs = GNUNET_DB_STATUS_HARD_ERROR;
@@ -2195,11 +2308,24 @@ get_wire_fee (struct AggregationContext *ac,
                                        pos->prev,
                                        wfi);
   /* Check non-overlaping fee invariant */
-  /* TODO (#4963): maybe report problems more nicely? */
-  if (NULL != wfi->prev)
-    GNUNET_break (wfi->prev->end_date.abs_value_us <= 
wfi->start_date.abs_value_us);
-  if (NULL != wfi->next)
-    GNUNET_break (wfi->next->start_date.abs_value_us >= 
wfi->end_date.abs_value_us);
+  if ( (NULL != wfi->prev) &&
+       (wfi->prev->end_date.abs_value_us > wfi->start_date.abs_value_us) )
+  {
+    report (report_fee_time_inconsistencies,
+            json_pack ("{s:s, s:s, s:s}",
+                       "type", type,
+                       "diagnostic", "start date before previous end date",
+                       "time", GNUNET_STRINGS_absolute_time_to_string 
(wfi->start_date)));
+  }
+  if ( (NULL != wfi->next) &&
+       (wfi->next->start_date.abs_value_us >= wfi->end_date.abs_value_us) )
+  {
+    report (report_fee_time_inconsistencies,
+            json_pack ("{s:s, s:s, s:s}",
+                       "type", type,
+                       "diagnostic", "end date date after next start date",
+                       "time", GNUNET_STRINGS_absolute_time_to_string 
(wfi->end_date)));
+  }
   return &wfi->wire_fee;
 }
 
@@ -2263,10 +2389,8 @@ check_wire_out_cb (void *cls,
       TALER_JSON_hash (wire,
                        &wcc.h_wire))
   {
-    report_row_inconsistency ("wire_out",
-                              rowid,
-                              "could not hash wire address");
-    return GNUNET_OK;
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
   }
   qs = edb->lookup_wire_transfer (edb->cls,
                                  esession,
@@ -2281,6 +2405,7 @@ check_wire_out_cb (void *cls,
   }
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != wcc.qs)
   {
+    /* FIXME: can we provide a more detailed error report? */
     report_row_inconsistency ("wire_out",
                               rowid,
                               "audit of associated transactions failed");
@@ -2302,9 +2427,11 @@ check_wire_out_cb (void *cls,
                              &wcc.total_deposits,
                              wire_fee))
   {
-    report_row_inconsistency ("wire_out",
-                              rowid,
-                              "could not subtract wire fee from total amount");
+    report_amount_arithmetic_inconsistency ("wire out (fee structure)",
+                                            rowid,
+                                            &wcc.total_deposits,
+                                            wire_fee,
+                                            -1);
     return GNUNET_OK;
   }
 
@@ -2313,20 +2440,13 @@ check_wire_out_cb (void *cls,
                             wcc.method);
   if (NULL == plugin)
   {
-    report_row_inconsistency ("wire_out",
-                              rowid,
-                              "could not load required wire plugin to 
validate");
-    return GNUNET_OK;
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
   }
 
-  if (GNUNET_SYSERR ==
-      plugin->amount_round (plugin->cls,
-                            &final_amount))
-  {
-    report_row_minor_inconsistency ("wire_out",
-                                    rowid,
-                                    "wire plugin failed to round given 
amount");
-  }
+  GNUNET_break (GNUNET_SYSERR !=
+                plugin->amount_round (plugin->cls,
+                                      &final_amount));
 
   /* Calculate the exchange's gain as the fees plus rounding differences! */
   if (GNUNET_OK !=
@@ -2341,8 +2461,8 @@ check_wire_out_cb (void *cls,
 
   /* Sum up aggregation fees (we simply include the rounding gains) */
   if (GNUNET_OK !=
-      TALER_amount_add (&ac->total_aggregation_fees,
-                        &ac->total_aggregation_fees,
+      TALER_amount_add (&total_aggregation_fee_income,
+                        &total_aggregation_fee_income,
                         &exchange_gain))
   {
     GNUNET_break (0);
@@ -2354,11 +2474,44 @@ check_wire_out_cb (void *cls,
   if (0 != TALER_amount_cmp (amount,
                              &final_amount))
   {
-    report_wire_out_inconsistency (wire,
-                                   rowid,
-                                   &final_amount,
-                                   amount,
-                                   "computed amount inconsistent with wire 
amount");
+    struct TALER_Amount delta;
+
+    if (0 < TALER_amount_cmp (amount,
+                              &final_amount))
+    {
+      /* amount > final_amount */
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_subtract (&delta,
+                                            amount,
+                                            &final_amount));
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_add (&total_wire_out_delta_plus,
+                                       &total_wire_out_delta_plus,
+                                       &delta));
+    }
+    else
+    {
+      /* amount < final_amount */
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_subtract (&delta,
+                                            &final_amount,
+                                            amount));
+      GNUNET_assert (GNUNET_OK ==
+                     TALER_amount_add (&total_wire_out_delta_minus,
+                                       &total_wire_out_delta_minus,
+                                       &delta));
+    }
+
+    report (report_wire_out_inconsistencies,
+            json_pack ("{s:O, s:I, s:o, s:o}",
+                       "destination_account",
+                       wire,
+                       "rowid",
+                       (json_int_t) rowid,
+                       "expected",
+                       TALER_JSON_from_amount (&final_amount),
+                       "claimed",
+                       TALER_JSON_from_amount (amount)));
     return GNUNET_OK;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@@ -2393,16 +2546,12 @@ analyze_aggregations (void *cls)
   qsx = adb->get_wire_fee_summary (adb->cls,
                                   asession,
                                   &master_pub,
-                                  &ac.total_aggregation_fees);
+                                  &total_aggregation_fee_income);
   if (0 > qsx)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qsx);
     return qsx;
   }
-  if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qsx)
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &ac.total_aggregation_fees));
   ac.qs = GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
   qs = edb->select_wire_out_above_serial_id (edb->cls,
                                             esession,
@@ -2439,18 +2588,17 @@ analyze_aggregations (void *cls)
     ac.qs = adb->insert_wire_fee_summary (adb->cls,
                                          asession,
                                          &master_pub,
-                                         &ac.total_aggregation_fees);
+                                         &total_aggregation_fee_income);
   else
     ac.qs = adb->update_wire_fee_summary (adb->cls,
                                          asession,
                                          &master_pub,
-                                         &ac.total_aggregation_fees);
+                                         &total_aggregation_fee_income);
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != ac.qs)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == ac.qs);
     return ac.qs;
   }
-  report_aggregation_fee_balance (&ac.total_aggregation_fees);
   return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
 }
 
@@ -2503,32 +2651,6 @@ struct CoinContext
   struct GNUNET_CONTAINER_MultiHashMap *denom_summaries;
 
   /**
-   * Total outstanding balances across all denomination keys.
-   */
-  struct TALER_Amount total_denom_balance;
-
-  /**
-   * Total deposit fees earned so far.
-   */
-  struct TALER_Amount deposit_fee_balance;
-
-  /**
-   * Total melt fees earned so far.
-   */
-  struct TALER_Amount melt_fee_balance;
-
-  /**
-   * Total refund fees earned so far.
-   */
-  struct TALER_Amount refund_fee_balance;
-
-  /**
-   * Current financial risk of the exchange operator with respect
-   * to key compromise.
-   */
-  struct TALER_Amount risk;
-
-  /**
    * Current write/replace offset in the circular @e summaries buffer.
    */
   unsigned int summaries_off;
@@ -2670,8 +2792,8 @@ sync_denomination (void *cls,
          book the remaining balance as profit, and reduce our risk
          exposure by the accumulated risk of the denomination. */
       if (GNUNET_SYSERR ==
-          TALER_amount_subtract (&cc->risk,
-                                 &cc->risk,
+          TALER_amount_subtract (&total_risk,
+                                 &total_risk,
                                  &ds->denom_risk))
       {
         /* Holy smokes, our risk assessment was inconsistent!
@@ -2815,8 +2937,8 @@ withdraw_cb (void *cls,
               GNUNET_h2s (&dh),
               TALER_amount2s (&ds->denom_balance));
   if (GNUNET_OK !=
-      TALER_amount_add (&cc->total_denom_balance,
-                        &cc->total_denom_balance,
+      TALER_amount_add (&total_escrow_balance,
+                        &total_escrow_balance,
                         &value))
   {
     GNUNET_break (0);
@@ -2824,8 +2946,8 @@ withdraw_cb (void *cls,
     return GNUNET_SYSERR;
   }
   if (GNUNET_OK !=
-      TALER_amount_add (&cc->risk,
-                        &cc->risk,
+      TALER_amount_add (&total_risk,
+                        &total_risk,
                         &value))
   {
     GNUNET_break (0);
@@ -2909,9 +3031,16 @@ refresh_session_cb (void *cls,
                                   &coin_sig->eddsa_signature,
                                   &coin_pub->eddsa_pub))
   {
-    report_row_inconsistency ("melt",
-                              rowid,
-                              "invalid signature for coin melt");
+    report (report_bad_sig_losses,
+            json_pack ("{s:s, s:I, s:o, s:o}",
+                       "operation", "melt",
+                       "row", (json_int_t) rowid,
+                       "loss", TALER_JSON_from_amount (amount_with_fee),
+                       "key_pub", GNUNET_JSON_from_data_auto (coin_pub)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_sig_loss,
+                                    &total_bad_sig_loss,
+                                    amount_with_fee));
     return GNUNET_OK;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -3009,9 +3138,11 @@ refresh_session_cb (void *cls,
                                &amount_without_fee))
     {
       /* refresh_cost > amount_without_fee */
-      report_row_inconsistency ("melt",
-                                rowid,
-                                "refresh costs exceed value of melt");
+      report_amount_arithmetic_inconsistency ("melt (fee)",
+                                              rowid,
+                                              &amount_without_fee,
+                                              &refresh_cost,
+                                              -1);
       return GNUNET_OK;
     }
 
@@ -3058,8 +3189,8 @@ refresh_session_cb (void *cls,
                   GNUNET_h2s (&new_dki[i]->properties.denom_hash),
                   TALER_amount2s (&dsi->denom_balance));
       if (GNUNET_OK !=
-          TALER_amount_add (&cc->total_denom_balance,
-                            &cc->total_denom_balance,
+          TALER_amount_add (&total_escrow_balance,
+                            &total_escrow_balance,
                             &value))
       {
         GNUNET_break (0);
@@ -3067,8 +3198,8 @@ refresh_session_cb (void *cls,
         return GNUNET_SYSERR;
       }
       if (GNUNET_OK !=
-          TALER_amount_add (&cc->risk,
-                            &cc->risk,
+          TALER_amount_add (&total_risk,
+                            &total_risk,
                             &value))
       {
         GNUNET_break (0);
@@ -3092,13 +3223,14 @@ refresh_session_cb (void *cls,
                              &dso->denom_balance,
                              amount_with_fee))
   {
-    report_emergency (dki);
+    report_emergency (dki,
+                      &dso->denom_risk);
     return GNUNET_SYSERR;
   }
   dso->denom_balance = tmp;
   if (GNUNET_SYSERR ==
-      TALER_amount_subtract (&cc->total_denom_balance,
-                             &cc->total_denom_balance,
+      TALER_amount_subtract (&total_escrow_balance,
+                             &total_escrow_balance,
                              amount_with_fee))
   {
     /* This should not be possible, unless the AUDITOR
@@ -3120,8 +3252,8 @@ refresh_session_cb (void *cls,
     TALER_amount_ntoh (&rfee,
                        &dki->properties.fee_refresh);
     if (GNUNET_OK !=
-        TALER_amount_add (&cc->melt_fee_balance,
-                          &cc->melt_fee_balance,
+        TALER_amount_add (&total_melt_fee_income,
+                          &total_melt_fee_income,
                           &rfee))
     {
       GNUNET_break (0);
@@ -3216,9 +3348,16 @@ deposit_cb (void *cls,
                                   &coin_sig->eddsa_signature,
                                   &coin_pub->eddsa_pub))
   {
-    report_row_inconsistency ("deposit",
-                              rowid,
-                              "invalid signature for coin deposit");
+    report (report_bad_sig_losses,
+            json_pack ("{s:s, s:I, s:o, s:o}",
+                       "operation", "deposit",
+                       "row", (json_int_t) rowid,
+                       "loss", TALER_JSON_from_amount (amount_with_fee),
+                       "key_pub", GNUNET_JSON_from_data_auto (coin_pub)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_sig_loss,
+                                    &total_bad_sig_loss,
+                                    amount_with_fee));
     return GNUNET_OK;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -3241,14 +3380,15 @@ deposit_cb (void *cls,
                              &ds->denom_balance,
                              amount_with_fee))
   {
-    report_emergency (dki);
+    report_emergency (dki,
+                      &ds->denom_risk);
     cc->qs = GNUNET_DB_STATUS_HARD_ERROR;
     return GNUNET_SYSERR;
   }
   ds->denom_balance = tmp;
   if (GNUNET_SYSERR ==
-      TALER_amount_subtract (&cc->total_denom_balance,
-                             &cc->total_denom_balance,
+      TALER_amount_subtract (&total_escrow_balance,
+                             &total_escrow_balance,
                              amount_with_fee))
   {
     /* This should not be possible, unless the AUDITOR
@@ -3270,8 +3410,8 @@ deposit_cb (void *cls,
     TALER_amount_ntoh (&dfee,
                        &dki->properties.fee_deposit);
     if (GNUNET_OK !=
-        TALER_amount_add (&cc->deposit_fee_balance,
-                          &cc->deposit_fee_balance,
+        TALER_amount_add (&total_deposit_fee_income,
+                          &total_deposit_fee_income,
                           &dfee))
     {
       GNUNET_break (0);
@@ -3348,9 +3488,16 @@ refund_cb (void *cls,
                                   &merchant_sig->eddsa_sig,
                                   &merchant_pub->eddsa_pub))
   {
-    report_row_inconsistency ("refund",
-                              rowid,
-                              "invalid signature for refund");
+    report (report_bad_sig_losses,
+            json_pack ("{s:s, s:I, s:o, s:o}",
+                       "operation", "refund",
+                       "row", (json_int_t) rowid,
+                       "loss", TALER_JSON_from_amount (amount_with_fee),
+                       "key_pub", GNUNET_JSON_from_data_auto (merchant_pub)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_sig_loss,
+                                    &total_bad_sig_loss,
+                                    amount_with_fee));
     return GNUNET_OK;
   }
 
@@ -3361,9 +3508,11 @@ refund_cb (void *cls,
                              amount_with_fee,
                              &refund_fee))
   {
-    report_row_inconsistency ("refund",
-                              rowid,
-                              "refunded amount smaller than refund fee");
+    report_amount_arithmetic_inconsistency ("refund (fee)",
+                                            rowid,
+                                            &amount_without_fee,
+                                            &refund_fee,
+                                            -1);
     return GNUNET_OK;
   }
 
@@ -3401,8 +3550,8 @@ refund_cb (void *cls,
     return GNUNET_SYSERR;
   }
   if (GNUNET_OK !=
-      TALER_amount_add (&cc->total_denom_balance,
-                        &cc->total_denom_balance,
+      TALER_amount_add (&total_escrow_balance,
+                        &total_escrow_balance,
                         &amount_without_fee))
   {
     GNUNET_break (0);
@@ -3410,8 +3559,8 @@ refund_cb (void *cls,
     return GNUNET_SYSERR;
   }
   if (GNUNET_OK !=
-      TALER_amount_add (&cc->risk,
-                        &cc->risk,
+      TALER_amount_add (&total_risk,
+                        &total_risk,
                         &amount_without_fee))
   {
     GNUNET_break (0);
@@ -3426,8 +3575,8 @@ refund_cb (void *cls,
 
   /* update total refund fee balance */
   if (GNUNET_OK !=
-      TALER_amount_add (&cc->refund_fee_balance,
-                        &cc->refund_fee_balance,
+      TALER_amount_add (&total_refund_fee_income,
+                        &total_refund_fee_income,
                         &refund_fee))
   {
     GNUNET_break (0);
@@ -3461,34 +3610,16 @@ analyze_coins (void *cls)
   qsx = adb->get_balance_summary (adb->cls,
                                  asession,
                                  &master_pub,
-                                 &cc.total_denom_balance,
-                                 &cc.deposit_fee_balance,
-                                 &cc.melt_fee_balance,
-                                 &cc.refund_fee_balance,
-                                 &cc.risk);
+                                 &total_escrow_balance,
+                                 &total_deposit_fee_income,
+                                 &total_melt_fee_income,
+                                 &total_refund_fee_income,
+                                 &total_risk);
   if (0 > qsx)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qsx);
     return qsx;
   }
-  if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qsx)
-  {
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &cc.total_denom_balance));
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &cc.deposit_fee_balance));
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &cc.melt_fee_balance));
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &cc.refund_fee_balance));
-    GNUNET_assert (GNUNET_OK ==
-                   TALER_amount_get_zero (currency,
-                                          &cc.risk));
-  }
 
   /* process withdrawals */
   if (0 >
@@ -3553,30 +3684,25 @@ analyze_coins (void *cls)
     qs = adb->update_balance_summary (adb->cls,
                                      asession,
                                      &master_pub,
-                                     &cc.total_denom_balance,
-                                     &cc.deposit_fee_balance,
-                                     &cc.melt_fee_balance,
-                                     &cc.refund_fee_balance,
-                                     &cc.risk);
+                                     &total_escrow_balance,
+                                     &total_deposit_fee_income,
+                                     &total_melt_fee_income,
+                                     &total_refund_fee_income,
+                                     &total_risk);
   else
     qs = adb->insert_balance_summary (adb->cls,
                                      asession,
                                      &master_pub,
-                                     &cc.total_denom_balance,
-                                     &cc.deposit_fee_balance,
-                                     &cc.melt_fee_balance,
-                                     &cc.refund_fee_balance,
-                                     &cc.risk);
+                                     &total_escrow_balance,
+                                     &total_deposit_fee_income,
+                                     &total_melt_fee_income,
+                                     &total_refund_fee_income,
+                                     &total_risk);
   if (0 >= qs)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
     return qs;
   }
-  report_denomination_balance (&cc.total_denom_balance,
-                               &cc.risk,
-                               &cc.deposit_fee_balance,
-                               &cc.melt_fee_balance,
-                               &cc.refund_fee_balance);
   return qs;
 }
 
@@ -3793,11 +3919,48 @@ run (void *cls,
      const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *c)
 {
+  static const struct TALER_MasterPublicKeyP zeromp;
+  struct TALER_Amount income_fee_total;
   json_t *report;
-  
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Launching auditor\n");
   cfg = c;
+  if (0 == memcmp (&zeromp,
+                   &master_pub,
+                   sizeof (struct TALER_MasterPublicKeyP)))
+  {
+    /* -m option not given, try configuration */
+    char *master_public_key_str;
+
+    if (GNUNET_OK !=
+        GNUNET_CONFIGURATION_get_value_string (cfg,
+                                               "exchange",
+                                               "MASTER_PUBLIC_KEY",
+                                               &master_public_key_str))
+    {
+      fprintf (stderr,
+               "Pass option -m or set it in the configuration!\n");
+      GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                                 "exchange",
+                                 "MASTER_PUBLIC_KEY");
+      global_ret = 1;
+      return;
+    }
+    if (GNUNET_OK !=
+        GNUNET_CRYPTO_eddsa_public_key_from_string (master_public_key_str,
+                                                    strlen 
(master_public_key_str),
+                                                    &master_pub.eddsa_pub))
+    {
+      fprintf (stderr,
+               "Invalid master public key given in configuration file.");
+      GNUNET_free (master_public_key_str);
+      global_ret = 1;
+      return;
+    }
+    GNUNET_free (master_public_key_str);
+  } /* end of -m not given */
+
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (cfg,
                                              "taler",
@@ -3861,39 +4024,183 @@ run (void *cls,
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Starting audit\n");
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &reported_emergency_sum));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_escrow_balance));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_risk));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_withdraw_fee_income));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_deposit_fee_income));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_melt_fee_income));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_refund_fee_income));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_aggregation_fee_income));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_balance_insufficient_loss));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_balance_summary_delta_plus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_balance_summary_delta_minus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_wire_out_delta_plus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_wire_out_delta_minus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_arithmetic_delta_plus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_arithmetic_delta_minus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_coin_delta_plus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_coin_delta_minus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_balance_reserve_not_closed));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_bad_sig_loss));
   GNUNET_assert (NULL !=
                 (report_emergencies = json_array ()));
   GNUNET_assert (NULL !=
                 (report_row_inconsistencies = json_array ()));
   GNUNET_assert (NULL !=
-                (report_row_minor_inconsistencies = json_array ()));
+                (denomination_key_validity_withdraw_inconsistencies = 
json_array ()));
+  GNUNET_assert (NULL !=
+                (report_reserve_balance_summary_wrong_inconsistencies = 
json_array ()));
   GNUNET_assert (NULL !=
-                (report_reserve_inconsistencies = json_array ()));
+                (report_reserve_balance_insufficient_inconsistencies = 
json_array ()));
+  GNUNET_assert (NULL !=
+                (report_reserve_not_closed_inconsistencies = json_array ()));
   GNUNET_assert (NULL !=
                 (report_wire_out_inconsistencies = json_array ()));
   GNUNET_assert (NULL !=
                 (report_coin_inconsistencies = json_array ()));
   GNUNET_assert (NULL !=
-                (report_reserve_balances = json_array ()));
-  GNUNET_assert (NULL !=
                 (report_aggregation_fee_balances = json_array ()));
   GNUNET_assert (NULL !=
-                (report_denomination_balances = json_array ()));
+                (report_amount_arithmetic_inconsistencies = json_array ()));
+  GNUNET_assert (NULL !=
+                (report_bad_sig_losses = json_array ()));
+  GNUNET_assert (NULL !=
+                (report_fee_time_inconsistencies = json_array ()));
   setup_sessions_and_run ();
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Audit complete\n");
   TALER_AUDITORDB_plugin_unload (adb);
   TALER_EXCHANGEDB_plugin_unload (edb);
-  report = json_pack ("{s:o, s:o, s:o, s:o, s:o, s:o, s:o, s:o, s:o}",
-                     "emergencies", report_emergencies,
-                     "row-inconsistencies", report_row_inconsistencies,
-                     "row-minor-inconsistencies", 
report_row_minor_inconsistencies,
-                     "reserve-inconsistencies", report_reserve_inconsistencies,
-                     "wire-out-inconsistencies", 
report_wire_out_inconsistencies,
-                     "coin_inconsistencies", report_coin_inconsistencies,
-                     "reserve_balance", report_reserve_balances,
-                     "aggregation_fee_balance", 
report_aggregation_fee_balances,
-                     "report_denomination_balance", 
report_denomination_balances);
+
+  GNUNET_assert (TALER_amount_add (&income_fee_total,
+                                   &total_withdraw_fee_income,
+                                   &total_deposit_fee_income));
+  GNUNET_assert (TALER_amount_add (&income_fee_total,
+                                   &income_fee_total,
+                                   &total_melt_fee_income));
+  GNUNET_assert (TALER_amount_add (&income_fee_total,
+                                   &income_fee_total,
+                                   &total_refund_fee_income));
+  GNUNET_assert (TALER_amount_add (&income_fee_total,
+                                   &income_fee_total,
+                                   &total_aggregation_fee_income));
+  report = json_pack ("{s:o, s:o, s:o, s:o, s:o,"
+                      " s:o, s:o, s:o, s:o, s:o,"
+                      " s:o, s:o, s:o, s:o, s:o,"
+                      " s:o, s:o, s:o, s:o, s:o,"
+                      " s:o, s:o, s:o, s:o, s:o,"
+                      " s:o, s:o, s:o, s:o, s:o,"
+                      " s:o }",
+                      /* blocks of 5 for easier counting/matching to format 
string */
+                      /* block */
+                     "reserve_balance_insufficient_inconsistencies",
+                      report_reserve_balance_insufficient_inconsistencies,
+                      "total_loss_balance_insufficient",
+                      TALER_JSON_from_amount 
(&total_balance_insufficient_loss),
+                     "reserve_balance_summary_wrong_inconsistencies",
+                      report_reserve_balance_summary_wrong_inconsistencies,
+                      "total_balance_summary_delta_plus",
+                      TALER_JSON_from_amount 
(&total_balance_summary_delta_plus),
+                      "total_balance_summary_delta_minus",
+                      TALER_JSON_from_amount 
(&total_balance_summary_delta_minus),
+                      /* block */
+                      "total_escrow_balance",
+                      TALER_JSON_from_amount (&total_escrow_balance),
+                      "total_active_risk",
+                      TALER_JSON_from_amount (&total_risk),
+                      "total_withdraw_fee_income",
+                      TALER_JSON_from_amount (&total_withdraw_fee_income),
+                      "total_deposit_fee_income",
+                      TALER_JSON_from_amount (&total_deposit_fee_income),
+                      "total_melt_fee_income",
+                      TALER_JSON_from_amount (&total_melt_fee_income),
+                      /* block */
+                      "total_refund_fee_income",
+                      TALER_JSON_from_amount (&total_refund_fee_income),
+                      "income_fee_total",
+                      TALER_JSON_from_amount (&income_fee_total),
+                     "emergencies",
+                      report_emergencies,
+                      "emergencies_risk_total",
+                      TALER_JSON_from_amount (&reported_emergency_sum),
+                     "reserve_not_closed_inconsistencies",
+                      report_reserve_not_closed_inconsistencies,
+                      /* block */
+                      "total_balance_reserve_not_closed",
+                      TALER_JSON_from_amount 
(&total_balance_reserve_not_closed),
+                     "wire_out_inconsistencies",
+                      report_wire_out_inconsistencies,
+                      "total_wire_out_delta_plus",
+                      TALER_JSON_from_amount (&total_wire_out_delta_plus),
+                      "total_wire_out_delta_minus",
+                      TALER_JSON_from_amount (&total_wire_out_delta_minus),
+                      "bad_sig_losses",
+                      report_bad_sig_losses,
+                      /* block */
+                      "total_bad_sig_loss",
+                      TALER_JSON_from_amount (&total_bad_sig_loss),
+                     "row_inconsistencies",
+                      report_row_inconsistencies,
+                     "denomination_key_validity_withdraw_inconsistencies",
+                      denomination_key_validity_withdraw_inconsistencies,
+                     "coin_inconsistencies",
+                      report_coin_inconsistencies,
+                      "total_coin_delta_plus",
+                      TALER_JSON_from_amount (&total_coin_delta_plus),
+                      /* block */
+                      "total_coin_delta_minus",
+                      TALER_JSON_from_amount (&total_coin_delta_minus),
+                      "amount_arithmetic_inconsistencies",
+                      report_amount_arithmetic_inconsistencies,
+                      "total_arithmetic_delta_plus",
+                      TALER_JSON_from_amount (&total_arithmetic_delta_plus),
+                      "total_arithmetic_delta_minus",
+                      TALER_JSON_from_amount (&total_arithmetic_delta_minus),
+                     "total_aggregation_fee_income",
+                      TALER_JSON_from_amount (&total_aggregation_fee_income),
+                      /* block */
+                      "wire_fee_time_inconsistencies",
+                      report_fee_time_inconsistencies);
+  GNUNET_break (NULL != report);
   json_dumpf (report,
              stdout,
              JSON_INDENT (2));
@@ -3914,12 +4221,11 @@ main (int argc,
       char *const *argv)
 {
   const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    GNUNET_GETOPT_option_mandatory
-    (GNUNET_GETOPT_option_base32_auto ('m',
-                                      "exchange-key",
-                                      "KEY",
-                                      "public key of the exchange (Crockford 
base32 encoded)",
-                                      &master_pub)),
+    GNUNET_GETOPT_option_base32_auto ('m',
+                                      "exchange-key",
+                                      "KEY",
+                                      "public key of the exchange (Crockford 
base32 encoded)",
+                                      &master_pub),
     GNUNET_GETOPT_option_flag ('r',
                               "restart",
                               "restart audit from the beginning (required on 
first run)",
diff --git a/src/auditor/taler-wire-auditor.c b/src/auditor/taler-wire-auditor.c
index 7cc741b..6d5085e 100644
--- a/src/auditor/taler-wire-auditor.c
+++ b/src/auditor/taler-wire-auditor.c
@@ -22,6 +22,8 @@
  *   the incoming wire transfers from the bank.
  * - Second, we check that the outgoing wire transfers match those
  *   given in the 'wire_out' table
+ * - Finally, we check that all wire transfers that should have been made,
+ *   were actually made
  */
 #include "platform.h"
 #include <gnunet/gnunet_util_lib.h>
@@ -31,6 +33,12 @@
 #include "taler_wire_lib.h"
 #include "taler_signatures.h"
 
+/**
+ * How much time do we allow the aggregator to lag behind?  If
+ * wire transfers should have been made more than #GRACE_PERIOD
+ * before, we issue warnings.
+ */
+#define GRACE_PERIOD GNUNET_TIME_UNIT_HOURS
 
 /**
  * Return value from main().
@@ -70,7 +78,8 @@ static struct GNUNET_CONTAINER_MultiHashMap *in_map;
 
 /**
  * Map with information about outgoing wire transfers.
- * Maps hashes of the wire offsets to `struct ReserveOutInfo`s.
+ * Maps hashes of the wire subjects (in binary encoding)
+ * to `struct ReserveOutInfo`s.
  */
 static struct GNUNET_CONTAINER_MultiHashMap *out_map;
 
@@ -130,26 +139,95 @@ static void *out_wire_off;
 static size_t wire_off_size;
 
 /**
- * Array of reports about row inconsitencies.
+ * Array of reports about row inconsitencies in wire_out table.
+ */
+static json_t *report_wire_out_inconsistencies;
+
+/**
+ * Array of reports about row inconsitencies in reserves_in table.
+ */
+static json_t *report_reserve_in_inconsistencies;
+
+/**
+ * Array of reports about wrong bank account being recorded for
+ * incoming wire transfers.
+ */
+static json_t *report_missattribution_in_inconsistencies;
+
+/**
+ * Array of reports about row inconcistencies.
  */
 static json_t *report_row_inconsistencies;
 
 /**
+ * Array of reports about inconcistencies in the database about
+ * the incoming wire transfers (exchange is not exactly to blame).
+ */
+static json_t *report_wire_format_inconsistencies;
+
+/**
  * Array of reports about minor row inconcistencies.
  */
 static json_t *report_row_minor_inconsistencies;
 
+/**
+ * Array of reports about lagging transactions.
+ */
+static json_t *report_lags;
+
+/**
+ * Total amount that was transferred too much from the exchange.
+ */
+static struct TALER_Amount total_bad_amount_out_plus;
+
+/**
+ * Total amount that was transferred too little from the exchange.
+ */
+static struct TALER_Amount total_bad_amount_out_minus;
+
+/**
+ * Total amount that was transferred too much to the exchange.
+ */
+static struct TALER_Amount total_bad_amount_in_plus;
+
+/**
+ * Total amount that was transferred too little to the exchange.
+ */
+static struct TALER_Amount total_bad_amount_in_minus;
+
+/**
+ * Total amount where the exchange has the wrong sender account
+ * for incoming funds and may thus wire funds to the wrong
+ * destination when closing the reserve.
+ */
+static struct TALER_Amount total_missattribution_in;
+
+/**
+ * Total amount which the exchange did not transfer in time.
+ */
+static struct TALER_Amount total_amount_lag;
+
+/**
+ * Total amount affected by wire format trouble.s
+ */
+static struct TALER_Amount total_wire_format_amount;
+
+/**
+ * Amount of zero in our currency.
+ */
+static struct TALER_Amount zero;
+
 
 /* *****************************   Shutdown   **************************** */
 
-/** 
+/**
  * Entry in map with wire information we expect to obtain from the
  * bank later.
  */
 struct ReserveInInfo
 {
 
-  /** 
+  /**
    * Hash of expected row offset.
    */
   struct GNUNET_HashCode row_off_hash;
@@ -168,18 +246,18 @@ struct ReserveInInfo
    * RowID in reserves_in table.
    */
   uint64_t rowid;
-  
+
 };
 
 
-/** 
+/**
  * Entry in map with wire information we expect to obtain from the
  * #edb later.
  */
 struct ReserveOutInfo
 {
 
-  /** 
+  /**
    * Hash of the wire transfer subject.
    */
   struct GNUNET_HashCode subject_hash;
@@ -188,7 +266,7 @@ struct ReserveOutInfo
    * Expected details about the wire transfer.
    */
   struct TALER_WIRE_TransferDetails details;
-  
+
 };
 
 
@@ -253,17 +331,54 @@ do_shutdown (void *cls)
   if (NULL != report_row_inconsistencies)
   {
     json_t *report;
-    
+
     GNUNET_assert (NULL != report_row_minor_inconsistencies);
-    report = json_pack ("{s:o, s:o}",
-                       "row-inconsistencies", report_row_inconsistencies,
-                       "row-minor-inconsistencies", 
report_row_minor_inconsistencies);
+    report = json_pack ("{s:o, s:o, s:o, s:o, s:o,"
+                        " s:o, s:o, s:o, s:o, s:o,"
+                        " s:o, s:o, s:o, s:o }",
+                        /* blocks of 5 */
+                       "wire_out_amount_inconsistencies",
+                        report_wire_out_inconsistencies,
+                        "total_wire_out_delta_plus",
+                        TALER_JSON_from_amount (&total_bad_amount_out_plus),
+                        "total_wire_out_delta_minus",
+                        TALER_JSON_from_amount (&total_bad_amount_out_minus),
+                       "reserve_in_amount_inconsistencies",
+                        report_reserve_in_inconsistencies,
+                        "total_wire_in_delta_plus",
+                        TALER_JSON_from_amount (&total_bad_amount_in_plus),
+                        /* block */
+                        "total_wire_in_delta_minus",
+                        TALER_JSON_from_amount (&total_bad_amount_in_minus),
+                        "missattribution_in_inconsistencies",
+                        report_missattribution_in_inconsistencies,
+                        "total_missattribution_in",
+                        TALER_JSON_from_amount (&total_missattribution_in),
+                       "row_inconsistencies",
+                        report_row_inconsistencies,
+                       "row_minor_inconsistencies",
+                        report_row_minor_inconsistencies,
+                        /* block */
+                        "total_wire_format_amount",
+                        TALER_JSON_from_amount (&total_wire_format_amount),
+                        "wire_format_inconsistencies",
+                        report_wire_format_inconsistencies,
+                        "total_amount_lag",
+                        TALER_JSON_from_amount (&total_bad_amount_in_minus),
+                        "lag_details",
+                        report_lags);
+    GNUNET_break (NULL != report);
     json_dumpf (report,
                stdout,
                JSON_INDENT (2));
     json_decref (report);
+    report_wire_out_inconsistencies = NULL;
+    report_reserve_in_inconsistencies = NULL;
     report_row_inconsistencies = NULL;
     report_row_minor_inconsistencies = NULL;
+    report_missattribution_in_inconsistencies = NULL;
+    report_lags = NULL;
+    report_wire_format_inconsistencies = NULL;
   }
   if (NULL != hh)
   {
@@ -313,7 +428,7 @@ do_shutdown (void *cls)
  *
  * @param array report array to append @a object to
  * @param object object to append, should be check that it is not NULL
- */ 
+ */
 static void
 report (json_t *array,
        json_t *object)
@@ -325,47 +440,6 @@ report (json_t *array,
 }
 
 
-/**
- * Report a (serious) inconsistency in the exchange's database.
- *
- * @param table affected table
- * @param rowid affected row, UINT64_MAX if row is missing
- * @param diagnostic message explaining the problem
- */
-static void
-report_row_inconsistency (const char *table,
-                          uint64_t rowid,
-                          const char *diagnostic)
-{
-  report (report_row_inconsistencies,
-         json_pack ("{s:s, s:I, s:s}",
-                    "table", table,
-                    "row", (json_int_t) rowid,
-                    "diagnostic", diagnostic));
-}
-
-
-/**
- * Report a minor inconsistency in the exchange's database (i.e. something
- * relating to timestamps that should have no financial implications).
- *
- * @param table affected table
- * @param rowid affected row, UINT64_MAX if row is missing
- * @param diagnostic message explaining the problem
- */
-static void
-report_row_minor_inconsistency (const char *table,
-                                uint64_t rowid,
-                                const char *diagnostic)
-{
-  report (report_row_minor_inconsistencies,
-         json_pack ("{s:s, s:I, s:s}",
-                    "table", table,
-                    "row", (json_int_t) rowid,
-                    "diagnostic", diagnostic));
-}
-
-
 /* *************************** General transaction logic ****************** */
 
 /**
@@ -475,15 +549,15 @@ commit (enum GNUNET_DB_QueryStatus qs)
  */
 static int
 wire_out_cb (void *cls,
-               uint64_t rowid,
-               struct GNUNET_TIME_Absolute date,
-               const struct TALER_WireTransferIdentifierRawP *wtid,
-               const json_t *wire,
-               const struct TALER_Amount *amount)
+             uint64_t rowid,
+             struct GNUNET_TIME_Absolute date,
+             const struct TALER_WireTransferIdentifierRawP *wtid,
+             const json_t *wire,
+             const struct TALER_Amount *amount)
 {
   struct GNUNET_HashCode key;
   struct ReserveOutInfo *roi;
-  
+
   GNUNET_CRYPTO_hash (wtid,
                      sizeof (struct TALER_WireTransferIdentifierRawP),
                      &key);
@@ -491,37 +565,108 @@ wire_out_cb (void *cls,
                                           &key);
   if (NULL == roi)
   {
-    /* FIXME (#4963): do proper logging! */
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-               "Failed to find wire transfer `%s' over %s at `%s' in exchange 
database!\n",
-               TALER_B2S (wtid),
-               TALER_amount2s (amount),
-               GNUNET_STRINGS_absolute_time_to_string (date));
+    /* Wire transfer was not made (yet) at all (but would have been
+       justified), so the entire amount is missing / still to be done.
+       This is moderately harmless, it might just be that the aggreator
+       has not yet fully caught up with the transfers it should do. */
+    report (report_wire_out_inconsistencies,
+            json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                       "row", (json_int_t) rowid,
+                       "amount_wired", TALER_JSON_from_amount (&zero),
+                       "amount_justified", TALER_JSON_from_amount (amount),
+                       "wtid", GNUNET_JSON_from_data_auto (wtid),
+                       "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(date),
+                       "diagnostic", "wire transfer not made (yet?)"));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_amount_out_minus,
+                                    &total_bad_amount_out_minus,
+                                    amount));
     return GNUNET_OK;
   }
+  if (! json_equal ((json_t *) wire,
+                   roi->details.account_details))
+  {
+    /* Destination bank account is wrong in actual wire transfer, so
+       we should count the wire transfer as entirely spurious, and
+       additionally consider the justified wire transfer as missing. */
+    report (report_wire_out_inconsistencies,
+            json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                       "row", (json_int_t) rowid,
+                       "amount_wired", TALER_JSON_from_amount 
(&roi->details.amount),
+                       "amount_justified", TALER_JSON_from_amount (&zero),
+                       "wtid", GNUNET_JSON_from_data_auto (wtid),
+                       "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(date),
+                       "diagnostic", "recevier account missmatch"));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_amount_out_plus,
+                                    &total_bad_amount_out_plus,
+                                    &roi->details.amount));
+    report (report_wire_out_inconsistencies,
+            json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                       "row", (json_int_t) rowid,
+                       "amount_wired", TALER_JSON_from_amount (&zero),
+                       "amount_justified", TALER_JSON_from_amount (amount),
+                       "wtid", GNUNET_JSON_from_data_auto (wtid),
+                       "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(date),
+                       "diagnostic", "receiver account missmatch"));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_amount_out_minus,
+                                    &total_bad_amount_out_minus,
+                                    amount));
+    goto cleanup;
+  }
   if (0 != TALER_amount_cmp (&roi->details.amount,
                             amount))
   {
-    report_row_inconsistency ("reserves_out",
-                             rowid,
-                             "wire amount missmatch");
-    return GNUNET_OK;
+    report (report_wire_out_inconsistencies,
+            json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                       "row", (json_int_t) rowid,
+                       "amount_justified", TALER_JSON_from_amount (amount),
+                       "amount_wired", TALER_JSON_from_amount 
(&roi->details.amount),
+                       "wtid", GNUNET_JSON_from_data_auto (wtid),
+                       "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(date),
+                       "diagnostic", "wire amount does not match"));
+    if (0 < TALER_amount_cmp (amount,
+                              &roi->details.amount))
+    {
+      /* amount > roi->details.amount: wire transfer was smaller than it 
should have been */
+      struct TALER_Amount delta;
+
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_subtract (&delta,
+                                           amount,
+                                           &roi->details.amount));
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_add (&total_bad_amount_out_minus,
+                                      &total_bad_amount_out_minus,
+                                      &delta));
+    }
+    else
+    {
+      /* roi->details.amount < amount: wire transfer was larger than it should 
have been */
+      struct TALER_Amount delta;
+
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_subtract (&delta,
+                                           &roi->details.amount,
+                                           amount));
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_add (&total_bad_amount_out_plus,
+                                      &total_bad_amount_out_plus,
+                                      &delta));
+    }
+    goto cleanup;
   }
   if (roi->details.execution_date.abs_value_us !=
       date.abs_value_us)
   {
-    report_row_minor_inconsistency ("reserves_out",
-                                   rowid,
-                                   "execution date missmatch");
-  }
-  if (! json_equal ((json_t *) wire,
-                   roi->details.account_details))
-  {
-    report_row_inconsistency ("reserves_out",
-                             rowid,
-                             "receiver account missmatch");
-    return GNUNET_OK;
+    report (report_row_minor_inconsistencies,
+            json_pack ("{s:s, s:I, s:s}",
+                       "table", "wire_out",
+                       "row", (json_int_t) rowid,
+                       "diagnostic", "execution date missmatch"));
   }
+cleanup:
   GNUNET_assert (GNUNET_OK ==
                 GNUNET_CONTAINER_multihashmap_remove (out_map,
                                                       &key,
@@ -535,11 +680,12 @@ wire_out_cb (void *cls,
 
 
 /**
- * Complain that we failed to match an entry from #out_map.
+ * Complain that we failed to match an entry from #out_map.  This
+ * means a wire transfer was made without proper justification.
  *
  * @param cls NULL
  * @param key unused key
- * @param value the `struct ReserveOutInfo` to free
+ * @param value the `struct ReserveOutInfo` to report
  * @return #GNUNET_OK
  */
 static int
@@ -549,17 +695,76 @@ complain_out_not_found (void *cls,
 {
   struct ReserveOutInfo *roi = value;
 
-  (void) roi;
-  /* FIXME (#4963): log more precisely which wire transfer (and amount)
-     is bogus. */
-  report_row_inconsistency ("reserves_out",
-                           UINT64_MAX,
-                           "matching wire transfer not found");
+  report (report_wire_out_inconsistencies,
+          json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                     "row", (json_int_t) 0,
+                     "amount_wired", TALER_JSON_from_amount 
(&roi->details.amount),
+                     "amount_justified", TALER_JSON_from_amount (&zero),
+                     "wtid", (NULL == roi->details.wtid_s)
+                     ? GNUNET_JSON_from_data_auto (&roi->details.wtid)
+                     : json_string (roi->details.wtid_s),
+                     "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(roi->details.execution_date),
+                     "diagnostic", "justification for wire transfer not 
found"));
+  GNUNET_break (GNUNET_OK ==
+                TALER_amount_add (&total_bad_amount_out_plus,
+                                  &total_bad_amount_out_plus,
+                                  &roi->details.amount));
   return GNUNET_OK;
 }
 
 
 /**
+ * Function called on deposits that are past their due date
+ * and have not yet seen a wire transfer.
+ *
+ * @param cls closure
+ * @param rowid deposit table row of the coin's deposit
+ * @param coin_pub public key of the coin
+ * @param amount value of the deposit, including fee
+ * @param wire where should the funds be wired
+ * @param deadline what was the requested wire transfer deadline
+ * @param tiny did the exchange defer this transfer because it is too small?
+ * @param done did the exchange claim that it made a transfer?
+ */
+static void
+wire_missing_cb (void *cls,
+                 uint64_t rowid,
+                 const struct TALER_CoinSpendPublicKeyP *coin_pub,
+                 const struct TALER_Amount *amount,
+                 const json_t *wire,
+                 struct GNUNET_TIME_Absolute deadline,
+                 /* bool? */ int tiny,
+                 /* bool? */ int done)
+{
+  GNUNET_break (GNUNET_OK ==
+                TALER_amount_add (&total_amount_lag,
+                                  &total_amount_lag,
+                                  amount));
+  if (GNUNET_YES == tiny)
+  {
+    struct TALER_Amount rounded;
+
+    rounded = *amount;
+    GNUNET_break (GNUNET_SYSERR !=
+                  wp->amount_round (wp->cls,
+                                    &rounded));
+    if (0 == TALER_amount_cmp (&rounded,
+                               &zero))
+      return; /* acceptable, amount was tiny */
+  }
+  report (report_lags,
+          json_pack ("{s:I, s:o, s:s, s:s, s:o, s:O}",
+                     "row", (json_int_t) rowid,
+                     "amount", TALER_JSON_from_amount (amount),
+                     "deadline", GNUNET_STRINGS_absolute_time_to_string 
(deadline),
+                     "claimed_done", (done) ? "yes" : "no",
+                     "coin_pub", GNUNET_JSON_from_data_auto (coin_pub),
+                     "account", wire));
+
+}
+
+
+/**
  * Go over the "wire_out" table of the exchange and
  * verify that all wire outs are in that table.
  */
@@ -567,7 +772,8 @@ static void
 check_exchange_wire_out ()
 {
   enum GNUNET_DB_QueryStatus qs;
-    
+  struct GNUNET_TIME_Absolute next_timestamp;
+
   qs = edb->select_wire_out_above_serial_id (edb->cls,
                                             esession,
                                             pp.last_wire_out_serial_id,
@@ -582,14 +788,36 @@ check_exchange_wire_out ()
   }
   GNUNET_CONTAINER_multihashmap_iterate (out_map,
                                         &complain_out_not_found,
-                                        NULL); 
-  /* clean up (technically redundant, but nicer) */
+                                        NULL);
+  /* clean up */
   GNUNET_CONTAINER_multihashmap_iterate (out_map,
                                         &free_roi,
                                         NULL);
   GNUNET_CONTAINER_multihashmap_destroy (out_map);
   out_map = NULL;
- 
+
+  /* now check that all wire transfers that should have happened,
+     have indeed happened */
+  next_timestamp = GNUNET_TIME_absolute_get ();
+  /* Subtract #GRACE_PERIOD, so we can be a bit behind in processing
+     without immediately raising undue concern */
+  next_timestamp = GNUNET_TIME_absolute_subtract (next_timestamp,
+                                                  GRACE_PERIOD);
+  qs = edb->select_deposits_missing_wire (edb->cls,
+                                          esession,
+                                          pp.last_timestamp,
+                                          next_timestamp,
+                                          &wire_missing_cb,
+                                          &next_timestamp);
+  if (0 > qs)
+  {
+    GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
+    global_ret = 1;
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
+  pp.last_timestamp = next_timestamp;
+
   /* conclude with: */
   commit (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT);
   GNUNET_SCHEDULER_shutdown ();
@@ -616,7 +844,8 @@ history_debit_cb (void *cls,
                  const struct TALER_WIRE_TransferDetails *details)
 {
   struct ReserveOutInfo *roi;
-  
+  struct GNUNET_HashCode rowh;
+
   if (TALER_BANK_DIRECTION_NONE == dir)
   {
     /* end of iteration, now check wire_out to see
@@ -625,13 +854,35 @@ history_debit_cb (void *cls,
     check_exchange_wire_out ();
     return GNUNET_OK;
   }
+  if (NULL != details->wtid_s)
+  {
+    char *diagnostic;
+
+    GNUNET_CRYPTO_hash (row_off,
+                        row_off_size,
+                        &rowh);
+    GNUNET_asprintf (&diagnostic,
+                     "malformed subject `%8s...'",
+                     details->wtid_s);
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_wire_format_amount,
+                                    &total_wire_format_amount,
+                                    &details->amount));
+    report (report_wire_format_inconsistencies,
+            json_pack ("{s:o, s:o, s:s}",
+                       "amount", TALER_JSON_from_amount (&details->amount),
+                       "wire_offset_hash", GNUNET_JSON_from_data_auto (&rowh),
+                       "diagnostic", diagnostic));
+    GNUNET_free (diagnostic);
+    return GNUNET_OK;
+  }
   roi = GNUNET_new (struct ReserveOutInfo);
-  GNUNET_CRYPTO_hash (&details->reserve_pub, /* FIXME (#5077): missnomer */
-                     sizeof (details->reserve_pub),
+  GNUNET_CRYPTO_hash (&details->wtid,
+                     sizeof (details->wtid),
                      &roi->subject_hash);
   roi->details.amount = details->amount;
   roi->details.execution_date = details->execution_date;
-  roi->details.reserve_pub = details->reserve_pub; /* FIXME (#5077): missnomer 
& redundant */
+  roi->details.wtid = details->wtid;
   roi->details.account_details = json_incref ((json_t *) 
details->account_details);
   if (GNUNET_OK !=
       GNUNET_CONTAINER_multihashmap_put (out_map,
@@ -639,18 +890,32 @@ history_debit_cb (void *cls,
                                         roi,
                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY))
   {
-    GNUNET_break_op (0); /* duplicate wire offset is not allowed! */
-    report_row_inconsistency ("bank wire log",
-                             UINT64_MAX,
-                             "duplicate wire offset");
-    return GNUNET_SYSERR;
+    char *diagnostic;
+
+    GNUNET_CRYPTO_hash (row_off,
+                        row_off_size,
+                        &rowh);
+    GNUNET_asprintf (&diagnostic,
+                     "duplicate subject hash `%8s...'",
+                     TALER_B2S (&roi->subject_hash));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_wire_format_amount,
+                                    &total_wire_format_amount,
+                                    &details->amount));
+    report (report_wire_format_inconsistencies,
+            json_pack ("{s:o, s:o, s:s}",
+                       "amount", TALER_JSON_from_amount (&details->amount),
+                       "wire_offset_hash", GNUNET_JSON_from_data_auto (&rowh),
+                       "diagnostic", diagnostic));
+    GNUNET_free (diagnostic);
+    return GNUNET_OK;
   }
   return GNUNET_OK;
 }
 
 
 /**
- * Main functin for processing 'reserves_out' data.
+ * Main function for processing 'reserves_out' data.
  * We start by going over the DEBIT transactions this
  * time, and then verify that all of them are justified
  * by 'reserves_out'.
@@ -717,7 +982,12 @@ reserve_in_cb (void *cls,
   rii->row_off_size = wire_reference_size;
   rii->details.amount = *credit;
   rii->details.execution_date = execution_date;
-  rii->details.reserve_pub = *reserve_pub;
+  /* reserve public key should be the WTID */
+  GNUNET_assert (sizeof (rii->details.wtid) ==
+                 sizeof (*reserve_pub));
+  memcpy (&rii->details.wtid,
+          reserve_pub,
+          sizeof (*reserve_pub));
   rii->details.account_details = json_incref ((json_t *) 
sender_account_details);
   rii->rowid = rowid;
   if (GNUNET_OK !=
@@ -726,11 +996,15 @@ reserve_in_cb (void *cls,
                                         rii,
                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY))
   {
-    GNUNET_break_op (0); /* duplicate wire offset is not allowed! */
-    report_row_inconsistency ("reserves_in",
-                             rowid,
-                             "duplicate wire offset");
-    return GNUNET_SYSERR;
+    report (report_row_inconsistencies,
+            json_pack ("{s:s, s:I, s:o, s:s}",
+                       "table", "reserves_in",
+                       "row", (json_int_t) rowid,
+                       "wire_offset_hash", GNUNET_JSON_from_data_auto 
(&rii->row_off_hash),
+                       "diagnostic", "duplicate wire offset"));
+    json_decref (rii->details.account_details);
+    GNUNET_free (rii);
+    return GNUNET_OK;
   }
   pp.last_reserve_in_serial_id = rowid + 1;
   return GNUNET_OK;
@@ -752,14 +1026,44 @@ complain_in_not_found (void *cls,
 {
   struct ReserveInInfo *rii = value;
 
-  report_row_inconsistency ("reserves_in",
-                           rii->rowid,
-                           "matching wire transfer not found");
+  report (report_reserve_in_inconsistencies,
+          json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                     "row", (json_int_t) rii->rowid,
+                     "amount_expected", TALER_JSON_from_amount 
(&rii->details.amount),
+                     "amount_wired", TALER_JSON_from_amount (&zero),
+                     "wtid", GNUNET_JSON_from_data_auto (&rii->details.wtid),
+                     "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(rii->details.execution_date),
+                     "diagnostic", "incoming wire transfer claimed by exchange 
not found"));
+  GNUNET_break (GNUNET_OK ==
+                TALER_amount_add (&total_bad_amount_in_minus,
+                                  &total_bad_amount_in_minus,
+                                  &rii->details.amount));
   return GNUNET_OK;
 }
 
 
 /**
+ * Conclude the credit history check by logging entries that
+ * were not found and freeing resources. Then move on to
+ * processing debits.
+ */
+static void
+conclude_credit_history ()
+{
+  GNUNET_CONTAINER_multihashmap_iterate (in_map,
+                                         &complain_in_not_found,
+                                         NULL);
+  /* clean up before 2nd phase */
+  GNUNET_CONTAINER_multihashmap_iterate (in_map,
+                                         &free_rii,
+                                         NULL);
+  GNUNET_CONTAINER_multihashmap_destroy (in_map);
+  in_map = NULL;
+  process_debits ();
+}
+
+
+/**
  * This function is called for all transactions that
  * are credited to the exchange's account (incoming
  * transactions).
@@ -780,22 +1084,13 @@ history_credit_cb (void *cls,
 {
   struct ReserveInInfo *rii;
   struct GNUNET_HashCode key;
-  
+
   if (TALER_BANK_DIRECTION_NONE == dir)
   {
     /* end of operation */
     hh = NULL;
-    GNUNET_CONTAINER_multihashmap_iterate (in_map,
-                                          &complain_in_not_found,
-                                          NULL);
-    /* clean up before 2nd phase */
-    GNUNET_CONTAINER_multihashmap_iterate (in_map,
-                                          &free_rii,
-                                          NULL);
-    GNUNET_CONTAINER_multihashmap_destroy (in_map);
-    in_map = NULL;
-    process_debits ();
-    return GNUNET_SYSERR;
+    conclude_credit_history ();
+    return GNUNET_OK;
   }
   GNUNET_CRYPTO_hash (row_off,
                      row_off_size,
@@ -807,7 +1102,9 @@ history_credit_cb (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                "Failed to find wire transfer at `%s' in exchange database. 
Audit ends at this point in time.\n",
                GNUNET_STRINGS_absolute_time_to_string 
(details->execution_date));
-    return GNUNET_SYSERR;
+    hh = NULL;
+    conclude_credit_history ();
+    return GNUNET_SYSERR; /* not an error, just end of processing */
   }
 
   /* Update offset */
@@ -821,6 +1118,7 @@ history_credit_cb (void *cls,
     GNUNET_break (0);
     commit (GNUNET_DB_STATUS_HARD_ERROR);
     GNUNET_SCHEDULER_shutdown ();
+    hh = NULL;
     return GNUNET_SYSERR;
   }
   memcpy (in_wire_off,
@@ -831,42 +1129,110 @@ history_credit_cb (void *cls,
   if (row_off_size != rii->row_off_size)
   {
     GNUNET_break (0);
-    report_row_inconsistency ("reserves_in",
-                             rii->rowid,
-                             "wire reference size missmatch");
+    report (report_row_inconsistencies,
+            json_pack ("{s:s, s:o, s:o, s:s}",
+                       "table", "reserves_in",
+                       "row", GNUNET_JSON_from_data (row_off, row_off_size),
+                       "wire_offset_hash", GNUNET_JSON_from_data_auto (&key),
+                       "diagnostic", "wire reference size missmatch"));
     return GNUNET_OK;
   }
-  if (0 != TALER_amount_cmp (&rii->details.amount,
-                            &details->amount))
+  if (0 != memcmp (&details->wtid,
+                  &rii->details.wtid,
+                  sizeof (struct TALER_WireTransferIdentifierRawP)))
   {
-    report_row_inconsistency ("reserves_in",
-                             rii->rowid,
-                             "wire amount missmatch");
-    return GNUNET_OK;
-  }
-  if (details->execution_date.abs_value_us !=
-      rii->details.execution_date.abs_value_us)
-  {
-    report_row_minor_inconsistency ("reserves_in",
-                                   rii->rowid,
-                                   "execution date missmatch");
+    report (report_reserve_in_inconsistencies,
+            json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                       "row", GNUNET_JSON_from_data (row_off, row_off_size),
+                       "amount_exchange_expected", TALER_JSON_from_amount 
(&rii->details.amount),
+                       "amount_wired", TALER_JSON_from_amount (&zero),
+                       "wtid", GNUNET_JSON_from_data_auto (&rii->details.wtid),
+                       "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(rii->details.execution_date),
+                       "diagnostic", "wire subject does not match"));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_amount_in_minus,
+                                    &total_bad_amount_in_minus,
+                                    &rii->details.amount));
+    report (report_reserve_in_inconsistencies,
+            json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                       "row", GNUNET_JSON_from_data (row_off, row_off_size),
+                       "amount_exchange_expected", TALER_JSON_from_amount 
(&zero),
+                       "amount_wired", TALER_JSON_from_amount 
(&details->amount),
+                       "wtid", GNUNET_JSON_from_data_auto (&details->wtid),
+                       "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(details->execution_date),
+                       "diagnostic", "wire subject does not match"));
+
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_bad_amount_in_plus,
+                                    &total_bad_amount_in_plus,
+                                    &details->amount));
+    goto cleanup;
   }
-  if (0 != memcmp (&details->reserve_pub,
-                  &rii->details.reserve_pub,
-                  sizeof (struct TALER_ReservePublicKeyP)))
+  if (0 != TALER_amount_cmp (&rii->details.amount,
+                            &details->amount))
   {
-    report_row_inconsistency ("reserves_in",
-                             rii->rowid,
-                             "reserve public key / wire subject missmatch");
-    return GNUNET_OK;
+    report (report_reserve_in_inconsistencies,
+            json_pack ("{s:I, s:o, s:o, s:o, s:s, s:s}",
+                       "row", GNUNET_JSON_from_data (row_off, row_off_size),
+                       "amount_exchange_expected", TALER_JSON_from_amount 
(&rii->details.amount),
+                       "amount_wired", TALER_JSON_from_amount 
(&details->amount),
+                       "wtid", GNUNET_JSON_from_data_auto (&details->wtid),
+                       "timestamp", GNUNET_STRINGS_absolute_time_to_string 
(details->execution_date),
+                       "diagnostic", "wire amount does not match"));
+    if (0 < TALER_amount_cmp (&details->amount,
+                              &rii->details.amount))
+    {
+      /* details->amount > rii->details.amount: wire transfer was larger than 
it should have been */
+      struct TALER_Amount delta;
+
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_subtract (&delta,
+                                           &details->amount,
+                                           &rii->details.amount));
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_add (&total_bad_amount_in_plus,
+                                      &total_bad_amount_in_plus,
+                                      &delta));
+    }
+    else
+    {
+      /* rii->details.amount < details->amount: wire transfer was smaller than 
it should have been */
+      struct TALER_Amount delta;
+
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_subtract (&delta,
+                                           &rii->details.amount,
+                                           &details->amount));
+      GNUNET_break (GNUNET_OK ==
+                    TALER_amount_add (&total_bad_amount_in_minus,
+                                      &total_bad_amount_in_minus,
+                                      &delta));
+    }
+    goto cleanup;
   }
   if (! json_equal (details->account_details,
                    rii->details.account_details))
   {
-    report_row_minor_inconsistency ("reserves_in",
-                                   rii->rowid,
-                                   "sender account missmatch");
+    report (report_missattribution_in_inconsistencies,
+            json_pack ("{s:s, s:o, s:o}",
+                       "amount", TALER_JSON_from_amount (&rii->details.amount),
+                       "row", GNUNET_JSON_from_data (row_off, row_off_size),
+                       "wtid", GNUNET_JSON_from_data_auto 
(&rii->details.wtid)));
+    GNUNET_break (GNUNET_OK ==
+                  TALER_amount_add (&total_missattribution_in,
+                                    &total_missattribution_in,
+                                    &rii->details.amount));
+  }
+  if (details->execution_date.abs_value_us !=
+      rii->details.execution_date.abs_value_us)
+  {
+    report (report_row_minor_inconsistencies,
+            json_pack ("{s:s, s:o, s:s}",
+                       "table", "reserves_in",
+                       "row", GNUNET_JSON_from_data (row_off, row_off_size),
+                       "diagnostic", "execution date missmatch"));
   }
+ cleanup:
   GNUNET_assert (GNUNET_OK ==
                 GNUNET_CONTAINER_multihashmap_remove (in_map,
                                                       &key,
@@ -879,7 +1245,7 @@ history_credit_cb (void *cls,
 }
 
 
-/* ***************************** Setup logic    ************************ */
+/* ***************************** Setup logic ************************ */
 
 
 /**
@@ -896,12 +1262,48 @@ run (void *cls,
      const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *c)
 {
+  static const struct TALER_MasterPublicKeyP zeromp;
   enum GNUNET_DB_QueryStatus qs;
   int ret;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Launching auditor\n");
   cfg = c;
+  if (0 == memcmp (&zeromp,
+                   &master_pub,
+                   sizeof (struct TALER_MasterPublicKeyP)))
+  {
+    /* -m option not given, try configuration */
+    char *master_public_key_str;
+
+    if (GNUNET_OK !=
+        GNUNET_CONFIGURATION_get_value_string (cfg,
+                                               "exchange",
+                                               "MASTER_PUBLIC_KEY",
+                                               &master_public_key_str))
+    {
+      fprintf (stderr,
+               "Pass option -m or set it in the configuration!\n");
+      GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                                 "exchange",
+                                 "MASTER_PUBLIC_KEY");
+      global_ret = 1;
+      return;
+    }
+    if (GNUNET_OK !=
+        GNUNET_CRYPTO_eddsa_public_key_from_string (master_public_key_str,
+                                                    strlen 
(master_public_key_str),
+                                                    &master_pub.eddsa_pub))
+    {
+      fprintf (stderr,
+               "Invalid master public key given in configuration file.");
+      GNUNET_free (master_public_key_str);
+      global_ret = 1;
+      return;
+    }
+    GNUNET_free (master_public_key_str);
+  } /* end of -m not given */
+
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (cfg,
                                              "taler",
@@ -1002,9 +1404,44 @@ run (void *cls,
     return;
   }
   GNUNET_assert (NULL !=
-                (report_row_inconsistencies = json_array ()));
+                (report_wire_out_inconsistencies = json_array ()));
+  GNUNET_assert (NULL !=
+                (report_reserve_in_inconsistencies = json_array ()));
   GNUNET_assert (NULL !=
                 (report_row_minor_inconsistencies = json_array ()));
+  GNUNET_assert (NULL !=
+                (report_wire_format_inconsistencies = json_array ()));
+  GNUNET_assert (NULL !=
+                (report_row_inconsistencies = json_array ()));
+  GNUNET_assert (NULL !=
+                (report_missattribution_in_inconsistencies = json_array ()));
+  GNUNET_assert (NULL !=
+                (report_lags = json_array ()));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_bad_amount_out_plus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_bad_amount_out_minus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_bad_amount_in_plus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_bad_amount_in_minus));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_missattribution_in));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_amount_lag));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &total_wire_format_amount));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_amount_get_zero (currency,
+                                        &zero));
+
   qsx = adb->get_wire_auditor_progress (adb->cls,
                                         asession,
                                         &master_pub,
@@ -1085,12 +1522,11 @@ main (int argc,
       char *const *argv)
 {
   const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    GNUNET_GETOPT_option_mandatory
-    (GNUNET_GETOPT_option_base32_auto ('m',
-                                       "exchange-key",
-                                       "KEY",
-                                       "public key of the exchange (Crockford 
base32 encoded)",
-                                       &master_pub)),
+    GNUNET_GETOPT_option_base32_auto ('m',
+                                      "exchange-key",
+                                      "KEY",
+                                      "public key of the exchange (Crockford 
base32 encoded)",
+                                      &master_pub),
     GNUNET_GETOPT_option_flag ('r',
                                "restart",
                                "restart audit from the beginning (required on 
first run)",
diff --git a/src/auditordb/plugin_auditordb_postgres.c 
b/src/auditordb/plugin_auditordb_postgres.c
index 1001ba9..b699a76 100644
--- a/src/auditordb/plugin_auditordb_postgres.c
+++ b/src/auditordb/plugin_auditordb_postgres.c
@@ -233,6 +233,7 @@ postgres_create_tables (void *cls)
                            "(master_pub BYTEA PRIMARY KEY CHECK 
(LENGTH(master_pub)=32)"
                            ",last_wire_reserve_in_serial_id INT8 NOT NULL 
DEFAULT 0"
                            ",last_wire_wire_out_serial_id INT8 NOT NULL 
DEFAULT 0"
+                           ",last_timestamp INT8 NOT NULL"
                             ",wire_in_off BYTEA"
                             ",wire_out_off BYTEA"
                            ")"),
@@ -522,24 +523,27 @@ postgres_prepare (PGconn *db_conn)
                            "(master_pub"
                            ",last_wire_reserve_in_serial_id"
                            ",last_wire_wire_out_serial_id"
+                            ",last_timestamp"
                             ",wire_in_off"
                             ",wire_out_off"
-                           ") VALUES ($1,$2,$3,$4,$5);",
-                           5),
+                           ") VALUES ($1,$2,$3,$4,$5,$6);",
+                           6),
     /* Used in #postgres_update_wire_auditor_progress() */
     GNUNET_PQ_make_prepare ("wire_auditor_progress_update",
                            "UPDATE wire_auditor_progress SET "
                            " last_wire_reserve_in_serial_id=$1"
                            ",last_wire_wire_out_serial_id=$2"
-                            ",wire_in_off=$3"
-                            ",wire_out_off=$4"
-                           " WHERE master_pub=$5",
-                           5),
+                            ",last_timestamp=$3"
+                            ",wire_in_off=$4"
+                            ",wire_out_off=$5"
+                           " WHERE master_pub=$6",
+                           6),
     /* Used in #postgres_get_wire_auditor_progress() */
     GNUNET_PQ_make_prepare ("wire_auditor_progress_select",
                            "SELECT"
                            " last_wire_reserve_in_serial_id"
                            ",last_wire_wire_out_serial_id"
+                            ",last_timestamp"
                             ",wire_in_off"
                             ",wire_out_off"
                            " FROM wire_auditor_progress"
@@ -1059,10 +1063,10 @@ postgres_insert_denomination_info (void *cls,
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (&issue->denom_hash),
     GNUNET_PQ_query_param_auto_from_type (&issue->master),
-    GNUNET_PQ_query_param_auto_from_type (&issue->start),
-    GNUNET_PQ_query_param_auto_from_type (&issue->expire_withdraw),
-    GNUNET_PQ_query_param_auto_from_type (&issue->expire_deposit),
-    GNUNET_PQ_query_param_auto_from_type (&issue->expire_legal),
+    GNUNET_PQ_query_param_absolute_time_nbo (&issue->start),
+    GNUNET_PQ_query_param_absolute_time_nbo (&issue->expire_withdraw),
+    GNUNET_PQ_query_param_absolute_time_nbo (&issue->expire_deposit),
+    GNUNET_PQ_query_param_absolute_time_nbo (&issue->expire_legal),
     TALER_PQ_query_param_amount_nbo (&issue->value),
     TALER_PQ_query_param_amount_nbo (&issue->fee_withdraw),
     TALER_PQ_query_param_amount_nbo (&issue->fee_deposit),
@@ -1141,10 +1145,10 @@ denomination_info_cb (void *cls,
     };
     struct GNUNET_PQ_ResultSpec rs[] = {
       GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", 
&issue.denom_hash),
-      GNUNET_PQ_result_spec_auto_from_type ("valid_from", &issue.start),
-      GNUNET_PQ_result_spec_auto_from_type ("expire_withdraw", 
&issue.expire_withdraw),
-      GNUNET_PQ_result_spec_auto_from_type ("expire_deposit", 
&issue.expire_deposit),
-      GNUNET_PQ_result_spec_auto_from_type ("expire_legal", 
&issue.expire_legal),
+      GNUNET_PQ_result_spec_absolute_time_nbo ("valid_from", &issue.start),
+      GNUNET_PQ_result_spec_absolute_time_nbo ("expire_withdraw", 
&issue.expire_withdraw),
+      GNUNET_PQ_result_spec_absolute_time_nbo ("expire_deposit", 
&issue.expire_deposit),
+      GNUNET_PQ_result_spec_absolute_time_nbo ("expire_legal", 
&issue.expire_legal),
       TALER_PQ_result_spec_amount_nbo ("coin", &issue.value),
       TALER_PQ_result_spec_amount_nbo ("fee_withdraw", &issue.fee_withdraw),
       TALER_PQ_result_spec_amount_nbo ("fee_deposit", &issue.fee_deposit),
@@ -1354,6 +1358,7 @@ postgres_insert_wire_auditor_progress (void *cls,
     GNUNET_PQ_query_param_auto_from_type (master_pub),
     GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id),
     GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id),
+    GNUNET_PQ_query_param_absolute_time (&pp->last_timestamp),
     GNUNET_PQ_query_param_fixed_size (in_wire_off,
                                       wire_off_size),
     GNUNET_PQ_query_param_fixed_size (out_wire_off,
@@ -1389,11 +1394,12 @@ postgres_update_wire_auditor_progress (void *cls,
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id),
     GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id),
-    GNUNET_PQ_query_param_auto_from_type (master_pub),
+    GNUNET_PQ_query_param_absolute_time (&pp->last_timestamp),
     GNUNET_PQ_query_param_fixed_size (in_wire_off,
                                       wire_off_size),
     GNUNET_PQ_query_param_fixed_size (out_wire_off,
                                       wire_off_size),
+    GNUNET_PQ_query_param_auto_from_type (master_pub),
     GNUNET_PQ_query_param_end
   };
 
@@ -1428,10 +1434,12 @@ postgres_get_wire_auditor_progress (void *cls,
     GNUNET_PQ_query_param_end
   };
   struct GNUNET_PQ_ResultSpec rs[] = {
-    GNUNET_PQ_result_spec_uint64 ("last_reserve_in_serial_id",
+    GNUNET_PQ_result_spec_uint64 ("last_wire_reserve_in_serial_id",
                                   &pp->last_reserve_in_serial_id),
-    GNUNET_PQ_result_spec_uint64 ("last_wire_out_serial_id",
+    GNUNET_PQ_result_spec_uint64 ("last_wire_wire_out_serial_id",
                                   &pp->last_wire_out_serial_id),
+    GNUNET_PQ_result_spec_absolute_time ("last_timestamp",
+                                         &pp->last_timestamp),
     GNUNET_PQ_result_spec_variable_size ("wire_in_off",
                                          in_wire_off,
                                          wire_off_size),
@@ -1483,7 +1491,7 @@ postgres_insert_reserve_info (void *cls,
     GNUNET_PQ_query_param_auto_from_type (master_pub),
     TALER_PQ_query_param_amount (reserve_balance),
     TALER_PQ_query_param_amount (withdraw_fee_balance),
-    GNUNET_PQ_query_param_auto_from_type (&expiration_date),
+    GNUNET_PQ_query_param_absolute_time (&expiration_date),
     GNUNET_PQ_query_param_end
   };
 
@@ -1523,7 +1531,7 @@ postgres_update_reserve_info (void *cls,
   struct GNUNET_PQ_QueryParam params[] = {
     TALER_PQ_query_param_amount (reserve_balance),
     TALER_PQ_query_param_amount (withdraw_fee_balance),
-    GNUNET_PQ_query_param_auto_from_type (&expiration_date),
+    GNUNET_PQ_query_param_absolute_time (&expiration_date),
     GNUNET_PQ_query_param_auto_from_type (reserve_pub),
     GNUNET_PQ_query_param_auto_from_type (master_pub),
     GNUNET_PQ_query_param_end
@@ -1592,14 +1600,13 @@ postgres_get_reserve_info (void *cls,
 {
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (reserve_pub),
-
     GNUNET_PQ_query_param_auto_from_type (master_pub),
     GNUNET_PQ_query_param_end
   };
   struct GNUNET_PQ_ResultSpec rs[] = {
     TALER_PQ_result_spec_amount ("reserve_balance", reserve_balance),
     TALER_PQ_result_spec_amount ("withdraw_fee_balance", withdraw_fee_balance),
-    GNUNET_PQ_result_spec_auto_from_type ("expiration_date", expiration_date),
+    GNUNET_PQ_result_spec_absolute_time ("expiration_date", expiration_date),
     GNUNET_PQ_result_spec_uint64 ("auditor_reserves_rowid", rowid),
     GNUNET_PQ_result_spec_end
   };
@@ -2059,7 +2066,7 @@ postgres_insert_historic_denom_revenue (void *cls,
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (master_pub),
     GNUNET_PQ_query_param_auto_from_type (denom_pub_hash),
-    GNUNET_PQ_query_param_auto_from_type (&revenue_timestamp),
+    GNUNET_PQ_query_param_absolute_time (&revenue_timestamp),
     TALER_PQ_query_param_amount (revenue_balance),
     GNUNET_PQ_query_param_end
   };
@@ -2115,7 +2122,7 @@ historic_denom_revenue_cb (void *cls,
     struct TALER_Amount revenue_balance;
     struct GNUNET_PQ_ResultSpec rs[] = {
       GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", &denom_pub_hash),
-      GNUNET_PQ_result_spec_auto_from_type ("revenue_timestamp", 
&revenue_timestamp),
+      GNUNET_PQ_result_spec_absolute_time ("revenue_timestamp", 
&revenue_timestamp),
       TALER_PQ_result_spec_amount ("revenue_balance", &revenue_balance),
       GNUNET_PQ_result_spec_end
     };
@@ -2206,7 +2213,7 @@ postgres_insert_historic_losses (void *cls,
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (master_pub),
     GNUNET_PQ_query_param_auto_from_type (denom_pub_hash),
-    GNUNET_PQ_query_param_auto_from_type (&loss_timestamp),
+    GNUNET_PQ_query_param_absolute_time (&loss_timestamp),
     TALER_PQ_query_param_amount (loss_balance),
     GNUNET_PQ_query_param_end
   };
@@ -2262,7 +2269,7 @@ losses_cb (void *cls,
     struct TALER_Amount loss_balance;
     struct GNUNET_PQ_ResultSpec rs[] = {
       GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", &denom_pub_hash),
-      GNUNET_PQ_result_spec_auto_from_type ("loss_timestamp", &loss_timestamp),
+      GNUNET_PQ_result_spec_absolute_time ("loss_timestamp", &loss_timestamp),
       TALER_PQ_result_spec_amount ("loss_balance", &loss_balance),
       GNUNET_PQ_result_spec_end
     };
@@ -2347,8 +2354,8 @@ postgres_insert_historic_reserve_revenue (void *cls,
 {
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (master_pub),
-    GNUNET_PQ_query_param_auto_from_type (&start_time),
-    GNUNET_PQ_query_param_auto_from_type (&end_time),
+    GNUNET_PQ_query_param_absolute_time (&start_time),
+    GNUNET_PQ_query_param_absolute_time (&end_time),
     TALER_PQ_query_param_amount (reserve_profits),
     GNUNET_PQ_query_param_end
   };
@@ -2403,8 +2410,8 @@ historic_reserve_revenue_cb (void *cls,
     struct GNUNET_TIME_Absolute end_date;
     struct TALER_Amount reserve_profits;
     struct GNUNET_PQ_ResultSpec rs[] = {
-      GNUNET_PQ_result_spec_auto_from_type ("start_date", &start_date),
-      GNUNET_PQ_result_spec_auto_from_type ("end_date", &end_date),
+      GNUNET_PQ_result_spec_absolute_time ("start_date", &start_date),
+      GNUNET_PQ_result_spec_absolute_time ("end_date", &end_date),
       TALER_PQ_result_spec_amount ("reserve_profits", &reserve_profits),
       GNUNET_PQ_result_spec_end
     };
diff --git a/src/bank-lib/Makefile.am b/src/bank-lib/Makefile.am
index d499753..7489fe7 100644
--- a/src/bank-lib/Makefile.am
+++ b/src/bank-lib/Makefile.am
@@ -81,3 +81,6 @@ test_bank_api_with_fakebank_LDADD = \
   -lgnunetcurl \
   -lgnunetutil \
   -ljansson
+
+EXTRA_DIST = \
+  bank.conf
diff --git a/src/benchmark/taler-exchange-benchmark.c 
b/src/benchmark/taler-exchange-benchmark.c
index 93afb68..a90773b 100644
--- a/src/benchmark/taler-exchange-benchmark.c
+++ b/src/benchmark/taler-exchange-benchmark.c
@@ -981,6 +981,7 @@ withdraw_coin (struct Coin *coin)
   struct TALER_Amount left;
   const struct TALER_EXCHANGE_Keys *keys;
   struct Reserve *r;
+  struct TALER_PlanchetSecretsP ps;
 
   keys = TALER_EXCHANGE_get_keys (exchange);
   r = &reserves[coin->reserve_index];
@@ -996,12 +997,13 @@ withdraw_coin (struct Coin *coin)
   GNUNET_assert (NULL != (coin->pk = find_pk (keys, &amount)));
   if (warm >= WARM_THRESHOLD)
     num_withdraw++;
+  ps.coin_priv = coin->coin_priv;
+  ps.blinding_key = blinding_key;
   coin->wsh =
     TALER_EXCHANGE_reserve_withdraw (exchange,
                                     coin->pk,
                                     &r->reserve_priv,
-                                    &coin->coin_priv,
-                                    &blinding_key,
+                                    &ps,
                                     &reserve_withdraw_cb,
                                     coin);
   GNUNET_assert (GNUNET_SYSERR !=
diff --git a/src/exchange-lib/Makefile.am b/src/exchange-lib/Makefile.am
index ce1653c..b3a30e1 100644
--- a/src/exchange-lib/Makefile.am
+++ b/src/exchange-lib/Makefile.am
@@ -10,7 +10,7 @@ lib_LTLIBRARIES = \
   libtalerexchange.la
 
 libtalerexchange_la_LDFLAGS = \
-  -version-info 2:0:0 \
+  -version-info 3:0:0 \
   -no-undefined
 
 libtalerexchange_la_SOURCES = \
diff --git a/src/exchange-lib/exchange_api_payback.c 
b/src/exchange-lib/exchange_api_payback.c
index 40b7138..ec0cda1 100644
--- a/src/exchange-lib/exchange_api_payback.c
+++ b/src/exchange-lib/exchange_api_payback.c
@@ -260,8 +260,7 @@ handle_payback_finished (void *cls,
  * @param exchange the exchange handle; the exchange must be ready to operate
  * @param pk kind of coin to pay back
  * @param denom_sig signature over the coin by the exchange using @a pk
- * @param coin_priv the coin's private key,
- * @param blinding_key where to fetch the coin's blinding key
+ * @param ps secret internals of the original planchet
  * @param payback_cb the callback to call when the final result for this 
request is available
  * @param payback_cb_cls closure for @a payback_cb
  * @return NULL
@@ -272,8 +271,7 @@ struct TALER_EXCHANGE_PaybackHandle *
 TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle *exchange,
                         const struct TALER_EXCHANGE_DenomPublicKey *pk,
                         const struct TALER_DenominationSignature *denom_sig,
-                        const struct TALER_CoinSpendPrivateKeyP *coin_priv,
-                        const struct TALER_DenominationBlindingKeyP 
*blinding_key,
+                        const struct TALER_PlanchetSecretsP *ps,
                         TALER_EXCHANGE_PaybackResultCallback payback_cb,
                         void *payback_cb_cls)
 {
@@ -288,12 +286,12 @@ TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle 
*exchange,
                 MAH_handle_is_ready (exchange));
   pr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_PAYBACK);
   pr.purpose.size = htonl (sizeof (struct TALER_PaybackRequestPS));
-  GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv,
+  GNUNET_CRYPTO_eddsa_key_get_public (&ps->coin_priv.eddsa_priv,
                                       &pr.coin_pub.eddsa_pub);
   pr.h_denom_pub = pk->h_key;
-  pr.coin_blind = *blinding_key;
+  pr.coin_blind = ps->blinding_key;
   GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CRYPTO_eddsa_sign (&coin_priv->eddsa_priv,
+                 GNUNET_CRYPTO_eddsa_sign (&ps->coin_priv.eddsa_priv,
                                            &pr.purpose,
                                            &coin_sig.eddsa_signature));
 
@@ -304,7 +302,7 @@ TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle 
*exchange,
                            "denom_sig", GNUNET_JSON_from_rsa_signature 
(denom_sig->rsa_signature),
                            "coin_pub", GNUNET_JSON_from_data_auto 
(&pr.coin_pub),
                            "coin_sig", GNUNET_JSON_from_data_auto (&coin_sig),
-                           "coin_blind_key_secret", GNUNET_JSON_from_data_auto 
(blinding_key)
+                           "coin_blind_key_secret", GNUNET_JSON_from_data_auto 
(&ps->blinding_key)
                          );
   if (NULL == payback_obj)
   {
diff --git a/src/exchange-lib/exchange_api_refresh.c 
b/src/exchange-lib/exchange_api_refresh.c
index 79381f3..305747f 100644
--- a/src/exchange-lib/exchange_api_refresh.c
+++ b/src/exchange-lib/exchange_api_refresh.c
@@ -117,7 +117,7 @@ struct MeltDataP
      1) struct MeltedCoinP melted_coins[num_melted_coins];
      2) struct TALER_EXCHANGE_DenomPublicKey fresh_pks[num_fresh_coins];
      3) TALER_CNC_KAPPA times:
-        3a) struct TALER_FreshCoinP fresh_coins[num_fresh_coins];
+        3a) struct TALER_PlanchetSecretsP fresh_coins[num_fresh_coins];
   */
 };
 
@@ -204,7 +204,7 @@ struct MeltData
    * Arrays of @e num_fresh_coins with information about the fresh
    * coins to be created, for each cut-and-choose dimension.
    */
-  struct TALER_FreshCoinP *fresh_coins[TALER_CNC_KAPPA];
+  struct TALER_PlanchetSecretsP *fresh_coins[TALER_CNC_KAPPA];
 };
 
 
@@ -236,18 +236,16 @@ free_melted_coin (struct MeltedCoin *mc)
 static void
 free_melt_data (struct MeltData *md)
 {
-  unsigned int i;
-
   free_melted_coin (&md->melted_coin);
   if (NULL != md->fresh_pks)
   {
-    for (i=0;i<md->num_fresh_coins;i++)
+    for (unsigned int i=0;i<md->num_fresh_coins;i++)
       if (NULL != md->fresh_pks[i].rsa_public_key)
         GNUNET_CRYPTO_rsa_public_key_free (md->fresh_pks[i].rsa_public_key);
     GNUNET_free (md->fresh_pks);
   }
 
-  for (i=0;i<TALER_CNC_KAPPA;i++)
+  for (unsigned int i=0;i<TALER_CNC_KAPPA;i++)
     GNUNET_free (md->fresh_coins[i]);
   /* Finally, clean up a bit...
      (NOTE: compilers might optimize this away, so this is
@@ -490,15 +488,15 @@ deserialize_denomination_key (struct 
TALER_DenominationPublicKey *dk,
  *        @a buf is NULL, number of bytes required
  */
 static size_t
-serialize_fresh_coin (const struct TALER_FreshCoinP *fc,
+serialize_fresh_coin (const struct TALER_PlanchetSecretsP *fc,
                       char *buf,
                       size_t off)
 {
   if (NULL != buf)
     memcpy (&buf[off],
            fc,
-           sizeof (struct TALER_FreshCoinP));
-  return sizeof (struct TALER_FreshCoinP);
+           sizeof (struct TALER_PlanchetSecretsP));
+  return sizeof (struct TALER_PlanchetSecretsP);
 }
 
 
@@ -512,12 +510,12 @@ serialize_fresh_coin (const struct TALER_FreshCoinP *fc,
  * @return number of bytes read from @a buf, 0 on error
  */
 static size_t
-deserialize_fresh_coin (struct TALER_FreshCoinP *fc,
+deserialize_fresh_coin (struct TALER_PlanchetSecretsP *fc,
                         const char *buf,
                         size_t size,
                         int *ok)
 {
-  if (size < sizeof (struct TALER_FreshCoinP))
+  if (size < sizeof (struct TALER_PlanchetSecretsP))
   {
     GNUNET_break (0);
     *ok = GNUNET_NO;
@@ -525,8 +523,8 @@ deserialize_fresh_coin (struct TALER_FreshCoinP *fc,
   }
   memcpy (fc,
           buf,
-          sizeof (struct TALER_FreshCoinP));
-  return sizeof (struct TALER_FreshCoinP);
+          sizeof (struct TALER_PlanchetSecretsP));
+  return sizeof (struct TALER_PlanchetSecretsP);
 }
 
 
@@ -600,8 +598,6 @@ deserialize_melt_data (const char *buf,
 {
   struct MeltData *md;
   struct MeltDataP mdp;
-  unsigned int i;
-  unsigned int j;
   size_t off;
   int ok;
 
@@ -615,23 +611,23 @@ deserialize_melt_data (const char *buf,
   md->num_fresh_coins = ntohs (mdp.num_fresh_coins);
   md->fresh_pks = GNUNET_new_array (md->num_fresh_coins,
                                     struct TALER_DenominationPublicKey);
-  for (i=0;i<TALER_CNC_KAPPA;i++)
+  for (unsigned int i=0;i<TALER_CNC_KAPPA;i++)
     md->fresh_coins[i] = GNUNET_new_array (md->num_fresh_coins,
-                                           struct TALER_FreshCoinP);
+                                           struct TALER_PlanchetSecretsP);
   off = sizeof (struct MeltDataP);
   ok = GNUNET_YES;
   off += deserialize_melted_coin (&md->melted_coin,
                                   &buf[off],
                                   buf_size - off,
                                   &ok);
-  for (i=0;(i<md->num_fresh_coins)&&(GNUNET_YES == ok);i++)
+  for (unsigned int i=0;(i<md->num_fresh_coins)&&(GNUNET_YES == ok);i++)
     off += deserialize_denomination_key (&md->fresh_pks[i],
                                          &buf[off],
                                          buf_size - off,
                                          &ok);
 
-  for (i=0;i<TALER_CNC_KAPPA;i++)
-    for(j=0;(j<md->num_fresh_coins)&&(GNUNET_YES == ok);j++)
+  for (unsigned int i=0;i<TALER_CNC_KAPPA;i++)
+    for (unsigned int j=0;(j<md->num_fresh_coins)&&(GNUNET_YES == ok);j++)
       off += deserialize_fresh_coin (&md->fresh_coins[i][j],
                                      &buf[off],
                                      buf_size - off,
@@ -704,8 +700,6 @@ TALER_EXCHANGE_refresh_prepare (const struct 
TALER_CoinSpendPrivateKeyP *melt_pr
 {
   struct MeltData md;
   char *buf;
-  unsigned int i;
-  unsigned int j;
   struct GNUNET_HashContext *hash_context;
   struct TALER_Amount total;
   struct TALER_CoinSpendPublicKeyP coin_pub;
@@ -715,7 +709,7 @@ TALER_EXCHANGE_refresh_prepare (const struct 
TALER_CoinSpendPrivateKeyP *melt_pr
                                       &coin_pub.eddsa_pub);
   hash_context = GNUNET_CRYPTO_hash_context_start ();
   /* build up melt data structure */
-  for (i=0;i<TALER_CNC_KAPPA;i++)
+  for (unsigned int i=0;i<TALER_CNC_KAPPA;i++)
   {
     struct GNUNET_CRYPTO_EcdhePrivateKey *tpk;
     struct TALER_TransferPublicKeyP tp;
@@ -747,18 +741,18 @@ TALER_EXCHANGE_refresh_prepare (const struct 
TALER_CoinSpendPrivateKeyP *melt_pr
     = GNUNET_CRYPTO_rsa_signature_dup (melt_sig->rsa_signature);
   md.fresh_pks = GNUNET_new_array (fresh_pks_len,
                                    struct TALER_DenominationPublicKey);
-  for (i=0;i<fresh_pks_len;i++)
+  for (unsigned int i=0;i<fresh_pks_len;i++)
     md.fresh_pks[i].rsa_public_key
       = GNUNET_CRYPTO_rsa_public_key_dup (fresh_pks[i].key.rsa_public_key);
-  for (i=0;i<TALER_CNC_KAPPA;i++)
+  for (unsigned int i=0;i<TALER_CNC_KAPPA;i++)
   {
     md.fresh_coins[i] = GNUNET_new_array (fresh_pks_len,
-                                          struct TALER_FreshCoinP);
-    for (j=0;j<fresh_pks_len;j++)
+                                          struct TALER_PlanchetSecretsP);
+    for (unsigned int j=0;j<fresh_pks_len;j++)
     {
-      TALER_setup_fresh_coin (&trans_sec[i],
-                              j,
-                              &md.fresh_coins[i][j]);
+      TALER_planchet_setup_refresh (&trans_sec[i],
+                                    j,
+                                    &md.fresh_coins[i][j]);
     }
   }
 
@@ -766,7 +760,7 @@ TALER_EXCHANGE_refresh_prepare (const struct 
TALER_CoinSpendPrivateKeyP *melt_pr
   GNUNET_assert (GNUNET_OK ==
                 TALER_amount_get_zero (melt_amount->currency,
                                        &total));
-  for (j=0;j<fresh_pks_len;j++)
+  for (unsigned int j=0;j<fresh_pks_len;j++)
   {
     if ( (GNUNET_OK !=
          TALER_amount_add (&total,
@@ -795,7 +789,7 @@ TALER_EXCHANGE_refresh_prepare (const struct 
TALER_CoinSpendPrivateKeyP *melt_pr
 
   /* next, add all of the hashes from the denomination keys to the
      hash_context */
-  for (i=0;i<fresh_pks_len;i++)
+  for (unsigned int i=0;i<fresh_pks_len;i++)
   {
     char *buf;
     size_t buf_size;
@@ -820,28 +814,18 @@ TALER_EXCHANGE_refresh_prepare (const struct 
TALER_CoinSpendPrivateKeyP *melt_pr
                                      sizeof (struct TALER_AmountNBO));
 
   }
-  for (i = 0; i < TALER_CNC_KAPPA; i++)
+  for (unsigned int i = 0; i < TALER_CNC_KAPPA; i++)
   {
-    for (j = 0; j < fresh_pks_len; j++)
+    for (unsigned int j = 0; j < fresh_pks_len; j++)
     {
-      const struct TALER_FreshCoinP *fc; /* coin this is about */
-      struct TALER_CoinSpendPublicKeyP coin_pub;
-      struct GNUNET_HashCode coin_hash;
-      char *coin_ev; /* blinded message to be signed (in envelope) for each 
coin */
-      size_t coin_ev_size;
+      const struct TALER_PlanchetSecretsP *fc; /* coin this is about */
+      struct TALER_PlanchetDetail pd;
 
       fc = &md.fresh_coins[i][j];
-      GNUNET_CRYPTO_eddsa_key_get_public (&fc->coin_priv.eddsa_priv,
-                                          &coin_pub.eddsa_pub);
-      GNUNET_CRYPTO_hash (&coin_pub.eddsa_pub,
-                          sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey),
-                          &coin_hash);
-      if (GNUNET_YES !=
-          GNUNET_CRYPTO_rsa_blind (&coin_hash,
-                                   &fc->blinding_key.bks,
-                                   md.fresh_pks[j].rsa_public_key,
-                                   &coin_ev,
-                                   &coin_ev_size))
+      if (GNUNET_OK !=
+          TALER_planchet_prepare (&md.fresh_pks[j],
+                                  fc,
+                                  &pd))
       {
         GNUNET_break_op (0);
         GNUNET_CRYPTO_hash_context_abort (hash_context);
@@ -849,9 +833,9 @@ TALER_EXCHANGE_refresh_prepare (const struct 
TALER_CoinSpendPrivateKeyP *melt_pr
         return NULL;
       }
       GNUNET_CRYPTO_hash_context_read (hash_context,
-                                       coin_ev,
-                                       coin_ev_size);
-      GNUNET_free (coin_ev);
+                                       pd.coin_ev,
+                                       pd.coin_ev_size);
+      GNUNET_free (pd.coin_ev);
     }
   }
   GNUNET_CRYPTO_hash_context_finish (hash_context,
@@ -1293,23 +1277,13 @@ TALER_EXCHANGE_refresh_melt (struct 
TALER_EXCHANGE_Handle *exchange,
     tmp = json_array ();
     for (i=0;i<md->num_fresh_coins;i++)
     {
-      const struct TALER_FreshCoinP *fc = &md->fresh_coins[j][i];
-      struct TALER_CoinSpendPublicKeyP coin_pub;
-      struct GNUNET_HashCode coin_hash;
-      char *coin_ev; /* blinded message to be signed (in envelope) for each 
coin */
-      size_t coin_ev_size;
-
-      GNUNET_CRYPTO_eddsa_key_get_public (&fc->coin_priv.eddsa_priv,
-                                          &coin_pub.eddsa_pub);
-      GNUNET_CRYPTO_hash (&coin_pub.eddsa_pub,
-                          sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey),
-                          &coin_hash);
-      if (GNUNET_YES !=
-          GNUNET_CRYPTO_rsa_blind (&coin_hash,
-                                   &fc->blinding_key.bks,
-                                   md->fresh_pks[i].rsa_public_key,
-                                   &coin_ev,
-                                   &coin_ev_size))
+      const struct TALER_PlanchetSecretsP *fc = &md->fresh_coins[j][i];
+      struct TALER_PlanchetDetail pd;
+
+      if (GNUNET_OK !=
+          TALER_planchet_prepare (&md->fresh_pks[i],
+                                  fc,
+                                  &pd))
       {
         /* This should have been noticed during the preparation stage. */
         GNUNET_break (0);
@@ -1322,9 +1296,9 @@ TALER_EXCHANGE_refresh_melt (struct TALER_EXCHANGE_Handle 
*exchange,
       }
       GNUNET_assert (0 ==
                      json_array_append_new (tmp,
-                                            GNUNET_JSON_from_data (coin_ev,
-                                                                   
coin_ev_size)));
-      GNUNET_free (coin_ev);
+                                            GNUNET_JSON_from_data (pd.coin_ev,
+                                                                   
pd.coin_ev_size)));
+      GNUNET_free (pd.coin_ev);
     }
     GNUNET_assert (0 ==
                    json_array_append_new (coin_evs,
@@ -1506,17 +1480,17 @@ refresh_reveal_ok (struct 
TALER_EXCHANGE_RefreshRevealHandle *rrh,
   }
   for (i=0;i<rrh->md->num_fresh_coins;i++)
   {
-    const struct TALER_FreshCoinP *fc;
+    const struct TALER_PlanchetSecretsP *fc;
     struct TALER_DenominationPublicKey *pk;
     json_t *jsonai;
     struct GNUNET_CRYPTO_RsaSignature *blind_sig;
-    struct GNUNET_CRYPTO_RsaSignature *sig;
     struct TALER_CoinSpendPublicKeyP coin_pub;
     struct GNUNET_HashCode coin_hash;
     struct GNUNET_JSON_Specification spec[] = {
       GNUNET_JSON_spec_rsa_signature ("ev_sig", &blind_sig),
       GNUNET_JSON_spec_end()
     };
+    struct TALER_FreshCoin coin;
 
     fc = &rrh->md->fresh_coins[rrh->noreveal_index][i];
     pk = &rrh->md->fresh_pks[i];
@@ -1533,31 +1507,28 @@ refresh_reveal_ok (struct 
TALER_EXCHANGE_RefreshRevealHandle *rrh,
       return GNUNET_SYSERR;
     }
 
-    /* unblind the signature */
-    sig = GNUNET_CRYPTO_rsa_unblind (blind_sig,
-                                    &fc->blinding_key.bks,
-                                     pk->rsa_public_key);
-    GNUNET_CRYPTO_rsa_signature_free (blind_sig);
-
-    /* verify the signature */
+    /* needed to verify the signature, and we didn't store it earlier,
+       hence recomputing it here... */
     GNUNET_CRYPTO_eddsa_key_get_public (&fc->coin_priv.eddsa_priv,
                                         &coin_pub.eddsa_pub);
     GNUNET_CRYPTO_hash (&coin_pub.eddsa_pub,
                         sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey),
                         &coin_hash);
-
     if (GNUNET_OK !=
-        GNUNET_CRYPTO_rsa_verify (&coin_hash,
-                                  sig,
-                                  pk->rsa_public_key))
+        TALER_planchet_to_coin (pk,
+                                blind_sig,
+                                fc,
+                                &coin_hash,
+                                &coin))
     {
       GNUNET_break_op (0);
-      GNUNET_CRYPTO_rsa_signature_free (sig);
+      GNUNET_CRYPTO_rsa_signature_free (blind_sig);
       GNUNET_JSON_parse_free (outer_spec);
       return GNUNET_SYSERR;
     }
-    coin_privs[i] = fc->coin_priv;
-    sigs[i].rsa_signature = sig;
+    GNUNET_CRYPTO_rsa_signature_free (blind_sig);
+    coin_privs[i] = coin.coin_priv;
+    sigs[i] = coin.sig;
   }
   GNUNET_JSON_parse_free (outer_spec);
   return GNUNET_OK;
diff --git a/src/exchange-lib/exchange_api_refresh_link.c 
b/src/exchange-lib/exchange_api_refresh_link.c
index 5b7f686..4cefec5 100644
--- a/src/exchange-lib/exchange_api_refresh_link.c
+++ b/src/exchange-lib/exchange_api_refresh_link.c
@@ -99,7 +99,7 @@ parse_refresh_link_coin (const struct 
TALER_EXCHANGE_RefreshLinkHandle *rlh,
     GNUNET_JSON_spec_end()
   };
   struct TALER_TransferSecretP secret;
-  struct TALER_FreshCoinP fc;
+  struct TALER_PlanchetSecretsP fc;
 
   /* parse reply */
   if (GNUNET_OK !=
@@ -114,7 +114,7 @@ parse_refresh_link_coin (const struct 
TALER_EXCHANGE_RefreshLinkHandle *rlh,
   TALER_link_recover_transfer_secret (trans_pub,
                                       &rlh->coin_priv,
                                       &secret);
-  TALER_setup_fresh_coin (&secret,
+  TALER_planchet_setup_refresh (&secret,
                           coin_num,
                           &fc);
 
diff --git a/src/exchange-lib/exchange_api_reserve.c 
b/src/exchange-lib/exchange_api_reserve.c
index 22e0e3d..35fd0e0 100644
--- a/src/exchange-lib/exchange_api_reserve.c
+++ b/src/exchange-lib/exchange_api_reserve.c
@@ -693,9 +693,9 @@ struct TALER_EXCHANGE_ReserveWithdrawHandle
   TALER_EXCHANGE_ReserveWithdrawResultCallback cb;
 
   /**
-   * Key used to blind the value.
+   * Secrets of the planchet.
    */
-  struct TALER_DenominationBlindingKeyP blinding_key;
+  struct TALER_PlanchetSecretsP ps;
 
   /**
    * Denomination key we are withdrawing.
@@ -739,8 +739,7 @@ reserve_withdraw_ok (struct 
TALER_EXCHANGE_ReserveWithdrawHandle *wsh,
                      const json_t *json)
 {
   struct GNUNET_CRYPTO_RsaSignature *blind_sig;
-  struct GNUNET_CRYPTO_RsaSignature *sig;
-  struct TALER_DenominationSignature dsig;
+  struct TALER_FreshCoin fc;
   struct GNUNET_JSON_Specification spec[] = {
     GNUNET_JSON_spec_rsa_signature ("ev_sig", &blind_sig),
     GNUNET_JSON_spec_end()
@@ -754,29 +753,28 @@ reserve_withdraw_ok (struct 
TALER_EXCHANGE_ReserveWithdrawHandle *wsh,
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
   }
-  sig = GNUNET_CRYPTO_rsa_unblind (blind_sig,
-                                   &wsh->blinding_key.bks,
-                                   wsh->pk->key.rsa_public_key);
-  GNUNET_CRYPTO_rsa_signature_free (blind_sig);
   if (GNUNET_OK !=
-      GNUNET_CRYPTO_rsa_verify (&wsh->c_hash,
-                                sig,
-                                wsh->pk->key.rsa_public_key))
+      TALER_planchet_to_coin (&wsh->pk->key,
+                              blind_sig,
+                              &wsh->ps,
+                              &wsh->c_hash,
+                              &fc))
   {
     GNUNET_break_op (0);
-    GNUNET_CRYPTO_rsa_signature_free (sig);
+    GNUNET_JSON_parse_free (spec);
     return GNUNET_SYSERR;
   }
+  GNUNET_JSON_parse_free (spec);
+
   /* signature is valid, return it to the application */
-  dsig.rsa_signature = sig;
   wsh->cb (wsh->cb_cls,
            MHD_HTTP_OK,
           TALER_EC_NONE,
-           &dsig,
+           &fc.sig,
            json);
   /* make sure callback isn't called again after return */
   wsh->cb = NULL;
-  GNUNET_CRYPTO_rsa_signature_free (sig);
+  GNUNET_CRYPTO_rsa_signature_free (fc.sig.rsa_signature);
   return GNUNET_OK;
 }
 
@@ -927,7 +925,7 @@ handle_reserve_withdraw_finished (void *cls,
        check the signatures in the history... */
     if (GNUNET_OK !=
         reserve_withdraw_payment_required (wsh,
-                                        json))
+                                           json))
     {
       GNUNET_break_op (0);
       response_code = 0;
@@ -969,42 +967,34 @@ handle_reserve_withdraw_finished (void *cls,
 
 
 /**
- * Withdraw a coin from the exchange using a /reserve/withdraw request.  Note
- * that to ensure that no money is lost in case of hardware failures,
- * the caller must have committed (most of) the arguments to disk
- * before calling, and be ready to repeat the request with the same
- * arguments in case of failures.
+ * Helper function for #TALER_EXCHANGE_reserve_withdraw2() and
+ * #TALER_EXCHANGE_reserve_withdraw().
  *
  * @param exchange the exchange handle; the exchange must be ready to operate
  * @param pk kind of coin to create
- * @param reserve_priv private key of the reserve to withdraw from
- * @param coin_priv where to fetch the coin's private key,
- *        caller must have committed this value to disk before the call (with 
@a pk)
- * @param blinding_key where to fetch the coin's blinding key
+ * @param reserve_sig signature from the reserve authorizing the withdrawal
+ * @param reserve_pub public key of the reserve to withdraw from
+ * @param ps secrets of the planchet
  *        caller must have committed this value to disk before the call (with 
@a pk)
+ * @param pd planchet details matching @a ps
  * @param res_cb the callback to call when the final result for this request 
is available
- * @param res_cb_cls closure for the above callback
- * @return handle for the operation on success, NULL on error, i.e.
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
  *         if the inputs are invalid (i.e. denomination key not with this 
exchange).
  *         In this case, the callback is not called.
  */
 struct TALER_EXCHANGE_ReserveWithdrawHandle *
-TALER_EXCHANGE_reserve_withdraw (struct TALER_EXCHANGE_Handle *exchange,
-                                 const struct TALER_EXCHANGE_DenomPublicKey 
*pk,
-                                 const struct TALER_ReservePrivateKeyP 
*reserve_priv,
-                                 const struct TALER_CoinSpendPrivateKeyP 
*coin_priv,
-                                 const struct TALER_DenominationBlindingKeyP 
*blinding_key,
-                                 TALER_EXCHANGE_ReserveWithdrawResultCallback 
res_cb,
-                                 void *res_cb_cls)
+reserve_withdraw_internal (struct TALER_EXCHANGE_Handle *exchange,
+                           const struct TALER_EXCHANGE_DenomPublicKey *pk,
+                           const struct TALER_ReserveSignatureP *reserve_sig,
+                           const struct TALER_ReservePublicKeyP *reserve_pub,
+                           const struct TALER_PlanchetSecretsP *ps,
+                           const struct TALER_PlanchetDetail *pd,
+                           TALER_EXCHANGE_ReserveWithdrawResultCallback res_cb,
+                           void *res_cb_cls)
 {
   struct TALER_EXCHANGE_ReserveWithdrawHandle *wsh;
-  struct TALER_WithdrawRequestPS req;
-  struct TALER_ReserveSignatureP reserve_sig;
-  struct TALER_CoinSpendPublicKeyP coin_pub;
   struct GNUNET_CURL_Context *ctx;
-  struct TALER_Amount amount_with_fee;
-  char *coin_ev;
-  size_t coin_ev_size;
   json_t *withdraw_obj;
   CURL *eh;
 
@@ -1013,68 +1003,22 @@ TALER_EXCHANGE_reserve_withdraw (struct 
TALER_EXCHANGE_Handle *exchange,
   wsh->cb = res_cb;
   wsh->cb_cls = res_cb_cls;
   wsh->pk = pk;
-
-  GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv,
-                                      &coin_pub.eddsa_pub);
-  GNUNET_CRYPTO_hash (&coin_pub.eddsa_pub,
-                      sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey),
-                      &wsh->c_hash);
-  if (GNUNET_YES !=
-      GNUNET_CRYPTO_rsa_blind (&wsh->c_hash,
-                               &blinding_key->bks,
-                               pk->key.rsa_public_key,
-                               &coin_ev,
-                               &coin_ev_size))
-  {
-    GNUNET_break_op (0);
-    GNUNET_free (wsh);
-    return NULL;
-  }
-  GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
-                                      &wsh->reserve_pub.eddsa_pub);
-  req.purpose.size = htonl (sizeof (struct TALER_WithdrawRequestPS));
-  req.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW);
-  req.reserve_pub = wsh->reserve_pub;
-  if (GNUNET_OK !=
-      TALER_amount_add (&amount_with_fee,
-                        &pk->fee_withdraw,
-                        &pk->value))
-  {
-    /* exchange gave us denomination keys that overflow like this!? */
-    GNUNET_break_op (0);
-    GNUNET_free (coin_ev);
-    GNUNET_free (wsh);
-    return NULL;
-  }
-  TALER_amount_hton (&req.amount_with_fee,
-                     &amount_with_fee);
-  TALER_amount_hton (&req.withdraw_fee,
-                     &pk->fee_withdraw);
-  GNUNET_CRYPTO_rsa_public_key_hash (pk->key.rsa_public_key,
-                                     &req.h_denomination_pub);
-  GNUNET_CRYPTO_hash (coin_ev,
-                      coin_ev_size,
-                      &req.h_coin_envelope);
-  GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CRYPTO_eddsa_sign (&reserve_priv->eddsa_priv,
-                                           &req.purpose,
-                                           &reserve_sig.eddsa_signature));
+  wsh->reserve_pub = *reserve_pub;
+  wsh->c_hash = pd->c_hash;
   withdraw_obj = json_pack ("{s:o, s:o," /* denom_pub and coin_ev */
                             " s:o, s:o}",/* reserve_pub and reserve_sig */
                             "denom_pub", GNUNET_JSON_from_rsa_public_key 
(pk->key.rsa_public_key),
-                            "coin_ev", GNUNET_JSON_from_data (coin_ev,
-                                                              coin_ev_size),
-                            "reserve_pub", GNUNET_JSON_from_data_auto 
(&wsh->reserve_pub),
-                            "reserve_sig", GNUNET_JSON_from_data_auto 
(&reserve_sig));
-  GNUNET_free (coin_ev);
+                            "coin_ev", GNUNET_JSON_from_data (pd->coin_ev,
+                                                              
pd->coin_ev_size),
+                            "reserve_pub", GNUNET_JSON_from_data_auto 
(reserve_pub),
+                            "reserve_sig", GNUNET_JSON_from_data_auto 
(reserve_sig));
   if (NULL == withdraw_obj)
   {
     GNUNET_break (0);
     return NULL;
   }
 
-
-  wsh->blinding_key = *blinding_key;
+  wsh->ps = *ps;
   wsh->url = MAH_path_to_url (exchange, "/reserve/withdraw");
 
   eh = curl_easy_init ();
@@ -1105,6 +1049,139 @@ TALER_EXCHANGE_reserve_withdraw (struct 
TALER_EXCHANGE_Handle *exchange,
 
 
 /**
+ * Withdraw a coin from the exchange using a /reserve/withdraw request.  Note
+ * that to ensure that no money is lost in case of hardware failures,
+ * the caller must have committed (most of) the arguments to disk
+ * before calling, and be ready to repeat the request with the same
+ * arguments in case of failures.
+ *
+ * @param exchange the exchange handle; the exchange must be ready to operate
+ * @param pk kind of coin to create
+ * @param reserve_priv private key of the reserve to withdraw from
+ * @param ps secrets of the planchet
+ *        caller must have committed this value to disk before the call (with 
@a pk)
+ * @param res_cb the callback to call when the final result for this request 
is available
+ * @param res_cb_cls closure for the above callback
+ * @return handle for the operation on success, NULL on error, i.e.
+ *         if the inputs are invalid (i.e. denomination key not with this 
exchange).
+ *         In this case, the callback is not called.
+ */
+struct TALER_EXCHANGE_ReserveWithdrawHandle *
+TALER_EXCHANGE_reserve_withdraw (struct TALER_EXCHANGE_Handle *exchange,
+                                 const struct TALER_EXCHANGE_DenomPublicKey 
*pk,
+                                 const struct TALER_ReservePrivateKeyP 
*reserve_priv,
+                                 const struct TALER_PlanchetSecretsP *ps,
+                                 TALER_EXCHANGE_ReserveWithdrawResultCallback 
res_cb,
+                                 void *res_cb_cls)
+{
+  struct TALER_Amount amount_with_fee;
+  struct TALER_ReserveSignatureP reserve_sig;
+  struct TALER_WithdrawRequestPS req;
+  struct TALER_PlanchetDetail pd;
+  struct TALER_EXCHANGE_ReserveWithdrawHandle *wsh;
+
+  GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
+                                      &req.reserve_pub.eddsa_pub);
+  req.purpose.size = htonl (sizeof (struct TALER_WithdrawRequestPS));
+  req.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW);
+  if (GNUNET_OK !=
+      TALER_amount_add (&amount_with_fee,
+                        &pk->fee_withdraw,
+                        &pk->value))
+  {
+    /* exchange gave us denomination keys that overflow like this!? */
+    GNUNET_break_op (0);
+    return NULL;
+  }
+  TALER_amount_hton (&req.amount_with_fee,
+                     &amount_with_fee);
+  TALER_amount_hton (&req.withdraw_fee,
+                     &pk->fee_withdraw);
+  if (GNUNET_OK !=
+      TALER_planchet_prepare (&pk->key,
+                              ps,
+                              &pd))
+  {
+    GNUNET_break_op (0);
+    return NULL;
+  }
+  req.h_denomination_pub = pd.denom_pub_hash;
+  GNUNET_CRYPTO_hash (pd.coin_ev,
+                      pd.coin_ev_size,
+                      &req.h_coin_envelope);
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_CRYPTO_eddsa_sign (&reserve_priv->eddsa_priv,
+                                           &req.purpose,
+                                           &reserve_sig.eddsa_signature));
+  wsh = reserve_withdraw_internal (exchange,
+                                   pk,
+                                   &reserve_sig,
+                                   &req.reserve_pub,
+                                   ps,
+                                   &pd,
+                                   res_cb,
+                                   res_cb_cls);
+  GNUNET_free (pd.coin_ev);
+  return wsh;
+}
+
+
+/**
+ * Withdraw a coin from the exchange using a /reserve/withdraw
+ * request.  This API is typically used by a wallet to withdraw a tip
+ * where the reserve's signature was created by the merchant already.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
+ *
+ * @param exchange the exchange handle; the exchange must be ready to operate
+ * @param pk kind of coin to create
+ * @param reserve_sig signature from the reserve authorizing the withdrawal
+ * @param reserve_pub public key of the reserve to withdraw from
+ * @param ps secrets of the planchet
+ *        caller must have committed this value to disk before the call (with 
@a pk)
+ * @param res_cb the callback to call when the final result for this request 
is available
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
+ *         if the inputs are invalid (i.e. denomination key not with this 
exchange).
+ *         In this case, the callback is not called.
+ */
+struct TALER_EXCHANGE_ReserveWithdrawHandle *
+TALER_EXCHANGE_reserve_withdraw2 (struct TALER_EXCHANGE_Handle *exchange,
+                                  const struct TALER_EXCHANGE_DenomPublicKey 
*pk,
+                                  const struct TALER_ReserveSignatureP 
*reserve_sig,
+                                  const struct TALER_ReservePublicKeyP 
*reserve_pub,
+                                  const struct TALER_PlanchetSecretsP *ps,
+                                  TALER_EXCHANGE_ReserveWithdrawResultCallback 
res_cb,
+                                  void *res_cb_cls)
+{
+  struct TALER_EXCHANGE_ReserveWithdrawHandle *wsh;
+  struct TALER_PlanchetDetail pd;
+
+  if (GNUNET_OK !=
+      TALER_planchet_prepare (&pk->key,
+                              ps,
+                              &pd))
+  {
+    GNUNET_break_op (0);
+    return NULL;
+  }
+  wsh = reserve_withdraw_internal (exchange,
+                                   pk,
+                                   reserve_sig,
+                                   reserve_pub,
+                                   ps,
+                                   &pd,
+                                   res_cb,
+                                   res_cb_cls);
+  GNUNET_free (pd.coin_ev);
+  return wsh;
+}
+
+
+/**
  * Cancel a withdraw status request.  This function cannot be used
  * on a request handle if a response is already served for it.
  *
diff --git a/src/exchange-lib/test_exchange_api.c 
b/src/exchange-lib/test_exchange_api.c
index 70fb3ff..7c0dfa9 100644
--- a/src/exchange-lib/test_exchange_api.c
+++ b/src/exchange-lib/test_exchange_api.c
@@ -341,14 +341,9 @@ struct Command
       struct TALER_DenominationSignature sig;
 
       /**
-       * Set (by the interpreter) to the coin's private key.
+       * Private key material of the coin, set by the interpreter.
        */
-      struct TALER_CoinSpendPrivateKeyP coin_priv;
-
-      /**
-       * Blinding key used for the operation.
-       */
-      struct TALER_DenominationBlindingKeyP blinding_key;
+      struct TALER_PlanchetSecretsP ps;
 
       /**
        * Withdraw handle (while operation is running).
@@ -1984,7 +1979,7 @@ get_public_key_from_coin_command (const struct Command 
*coin,
   switch (coin->oc)
   {
   case OC_WITHDRAW_SIGN:
-    GNUNET_CRYPTO_eddsa_key_get_public 
(&coin->details.reserve_withdraw.coin_priv.eddsa_priv,
+    GNUNET_CRYPTO_eddsa_key_get_public 
(&coin->details.reserve_withdraw.ps.coin_priv.eddsa_priv,
                                         &coin_pub->eddsa_pub);
     break;
   case OC_REFRESH_REVEAL:
@@ -2016,7 +2011,6 @@ interpreter_run (void *cls)
   struct Command *cmd = &is->commands[is->ip];
   const struct Command *ref;
   struct TALER_ReservePublicKeyP reserve_pub;
-  struct TALER_CoinSpendPublicKeyP coin_pub;
   struct TALER_Amount amount;
   struct GNUNET_TIME_Absolute execution_date;
   json_t *sender_details;
@@ -2165,27 +2159,14 @@ interpreter_run (void *cls)
       return;
     }
 
-    /* create coin's private key */
-    {
-      struct GNUNET_CRYPTO_EddsaPrivateKey *priv;
-
-      priv = GNUNET_CRYPTO_eddsa_key_create ();
-      cmd->details.reserve_withdraw.coin_priv.eddsa_priv = *priv;
-      GNUNET_free (priv);
-    }
-    GNUNET_CRYPTO_eddsa_key_get_public 
(&cmd->details.reserve_withdraw.coin_priv.eddsa_priv,
-                                        &coin_pub.eddsa_pub);
-    GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
-                               &cmd->details.reserve_withdraw.blinding_key,
-                               sizeof 
(cmd->details.reserve_withdraw.blinding_key));
+    TALER_planchet_setup_random (&cmd->details.reserve_withdraw.ps);
     cmd->details.reserve_withdraw.wsh
       = TALER_EXCHANGE_reserve_withdraw (exchange,
-                                     cmd->details.reserve_withdraw.pk,
-                                     
&ref->details.admin_add_incoming.reserve_priv,
-                                     &cmd->details.reserve_withdraw.coin_priv,
-                                     
&cmd->details.reserve_withdraw.blinding_key,
-                                     &reserve_withdraw_cb,
-                                     is);
+                                         cmd->details.reserve_withdraw.pk,
+                                         
&ref->details.admin_add_incoming.reserve_priv,
+                                         &cmd->details.reserve_withdraw.ps,
+                                         &reserve_withdraw_cb,
+                                         is);
     if (NULL == cmd->details.reserve_withdraw.wsh)
     {
       GNUNET_break (0);
@@ -2217,7 +2198,7 @@ interpreter_run (void *cls)
       switch (ref->oc)
       {
       case OC_WITHDRAW_SIGN:
-        coin_priv = &ref->details.reserve_withdraw.coin_priv;
+        coin_priv = &ref->details.reserve_withdraw.ps.coin_priv;
         coin_pk = ref->details.reserve_withdraw.pk;
         coin_pk_sig = &ref->details.reserve_withdraw.sig;
         break;
@@ -2376,7 +2357,7 @@ interpreter_run (void *cls)
         GNUNET_assert (NULL != ref);
         GNUNET_assert (OC_WITHDRAW_SIGN == ref->oc);
 
-        melt_priv = ref->details.reserve_withdraw.coin_priv;
+        melt_priv = ref->details.reserve_withdraw.ps.coin_priv;
         if (GNUNET_OK !=
             TALER_string_to_amount (md->amount,
                                     &melt_amount))
@@ -2478,7 +2459,7 @@ interpreter_run (void *cls)
     /* finally, use private key from withdraw sign command */
     cmd->details.refresh_link.rlh
       = TALER_EXCHANGE_refresh_link (exchange,
-                                     &ref->details.reserve_withdraw.coin_priv,
+                                     
&ref->details.reserve_withdraw.ps.coin_priv,
                                      &link_cb,
                                      is);
     if (NULL == cmd->details.refresh_link.rlh)
@@ -2745,8 +2726,7 @@ interpreter_run (void *cls)
         = TALER_EXCHANGE_payback (exchange,
                                   ref->details.reserve_withdraw.pk,
                                   &ref->details.reserve_withdraw.sig,
-                                  &ref->details.reserve_withdraw.coin_priv,
-                                  &ref->details.reserve_withdraw.blinding_key,
+                                  &ref->details.reserve_withdraw.ps,
                                   &payback_cb,
                                   is);
       return;
diff --git a/src/exchange/taler-exchange-aggregator.c 
b/src/exchange/taler-exchange-aggregator.c
index 5e0c52c..84aef1a 100644
--- a/src/exchange/taler-exchange-aggregator.c
+++ b/src/exchange/taler-exchange-aggregator.c
@@ -961,6 +961,7 @@ expired_reserve_cb (void *cls,
 
   GNUNET_assert (NULL == ctc);
   now = GNUNET_TIME_absolute_get ();
+  (void) GNUNET_TIME_round_abs (&now);
 
   /* lookup wire plugin */
   type = extract_type (account_details);
diff --git a/src/exchange/taler-exchange-httpd_admin.c 
b/src/exchange/taler-exchange-httpd_admin.c
index 83bfedf..f65b9c3 100644
--- a/src/exchange/taler-exchange-httpd_admin.c
+++ b/src/exchange/taler-exchange-httpd_admin.c
@@ -64,10 +64,10 @@ struct AddIncomingContext
 };
 
 
-/** 
+/**
  * Add an incoming transaction to the database.  Checks if the
- * transaction is fresh (not a duplicate) and if so adds it to
- * the database.
+ * transaction is fresh (not a duplicate) and if so adds it to the
+ * database.
  *
  * If it returns a non-error code, the transaction logic MUST
  * NOT queue a MHD response.  IF it returns an hard error, the
@@ -109,7 +109,7 @@ admin_add_incoming_transaction (void *cls,
                                            json_str,
                                            strlen (json_str));
   free (json_str);
-  
+
   if (GNUNET_DB_STATUS_HARD_ERROR == aic->qs)
   {
     GNUNET_break (0);
diff --git a/src/exchange/taler-exchange-httpd_keystate.c 
b/src/exchange/taler-exchange-httpd_keystate.c
index 07ccd61..be87f6d 100644
--- a/src/exchange/taler-exchange-httpd_keystate.c
+++ b/src/exchange/taler-exchange-httpd_keystate.c
@@ -677,7 +677,7 @@ reload_keys_denom_iter (void *cls,
   expire_deposit = GNUNET_TIME_absolute_ntoh 
(dki->issue.properties.expire_deposit);
   if (expire_deposit.abs_value_us < now.abs_value_us)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Skipping expired denomination key `%s'\n",
                 alias);
     return GNUNET_OK;
@@ -729,7 +729,7 @@ reload_keys_denom_iter (void *cls,
   start = GNUNET_TIME_absolute_ntoh (dki->issue.properties.start);
   if (start.abs_value_us > horizon.abs_value_us)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Skipping future denomination key `%s' (%s), validity starts 
at %s\n",
                 alias,
                GNUNET_h2s (&dki->issue.properties.denom_hash),
@@ -814,7 +814,7 @@ reload_keys_sign_iter (void *cls,
   if (GNUNET_TIME_absolute_ntoh (ski->issue.start).abs_value_us >
       horizon.abs_value_us)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Skipping future signing key `%s'\n",
                 filename);
     return GNUNET_OK;
@@ -823,7 +823,7 @@ reload_keys_sign_iter (void *cls,
   if (GNUNET_TIME_absolute_ntoh (ski->issue.expire).abs_value_us <
       now.abs_value_us)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Skipping expired signing key `%s'\n",
                 filename);
     return GNUNET_OK;
diff --git a/src/exchange/taler-exchange-httpd_refresh_reveal.c 
b/src/exchange/taler-exchange-httpd_refresh_reveal.c
index 5d857fc..a64ec1c 100644
--- a/src/exchange/taler-exchange-httpd_refresh_reveal.c
+++ b/src/exchange/taler-exchange-httpd_refresh_reveal.c
@@ -171,13 +171,13 @@ check_commitment (struct MHD_Connection *connection,
   /* Check that the commitments for all new coins were correct */
   for (unsigned int j = 0; j < num_newcoins; j++)
   {
-    struct TALER_FreshCoinP fc;
+    struct TALER_PlanchetSecretsP fc;
     struct TALER_CoinSpendPublicKeyP coin_pub;
     struct GNUNET_HashCode h_msg;
     char *buf;
     size_t buf_len;
 
-    TALER_setup_fresh_coin (&transfer_secret,
+    TALER_planchet_setup_refresh (&transfer_secret,
                             j,
                             &fc);
     GNUNET_CRYPTO_eddsa_key_get_public (&fc.coin_priv.eddsa_priv,
diff --git a/src/exchange/taler-exchange-httpd_reserve_withdraw.c 
b/src/exchange/taler-exchange-httpd_reserve_withdraw.c
index cc21972..11265b4 100644
--- a/src/exchange/taler-exchange-httpd_reserve_withdraw.c
+++ b/src/exchange/taler-exchange-httpd_reserve_withdraw.c
@@ -163,7 +163,6 @@ withdraw_transaction (void *cls,
   struct TALER_Amount deposit_total;
   struct TALER_Amount withdraw_total;
   struct TALER_Amount balance;
-  struct TALER_Amount value;
   struct TALER_Amount fee_withdraw;
   int res;
   enum GNUNET_DB_QueryStatus qs;
@@ -236,27 +235,13 @@ withdraw_transaction (void *cls,
       break;
     case TALER_EXCHANGEDB_RO_WITHDRAW_COIN:
       {
-       struct TALER_EXCHANGEDB_DenominationKeyIssueInformation *tdki;
-
-       tdki = TEH_KS_denomination_key_lookup (wc->key_state,
-                                              
&pos->details.withdraw->denom_pub,
-                                              TEH_KS_DKU_WITHDRAW);
-       if (NULL == tdki)
-        {
-         GNUNET_break (0);
-         *mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
-                                                          
TALER_EC_WITHDRAW_HISTORIC_DENOMINATION_KEY_NOT_FOUND);
-         return GNUNET_DB_STATUS_HARD_ERROR;
-       }
-       TALER_amount_ntoh (&value,
-                          &tdki->issue.properties.value);
        if (0 == (res & 2))
-         withdraw_total = value;
+         withdraw_total = pos->details.withdraw->amount_with_fee;
        else
          if (GNUNET_OK !=
              TALER_amount_add (&withdraw_total,
                                &withdraw_total,
-                               &value))
+                               &pos->details.withdraw->amount_with_fee))
          {
            *mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
                                                             
TALER_EC_WITHDRAW_AMOUNT_WITHDRAWALS_OVERFLOW);
@@ -283,17 +268,27 @@ withdraw_transaction (void *cls,
 
     case TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK:
       if (0 == (res & 2))
-        withdraw_total = pos->details.bank->amount;
+        withdraw_total = pos->details.closing->amount;
       else
         if (GNUNET_OK !=
             TALER_amount_add (&withdraw_total,
                               &withdraw_total,
-                              &pos->details.bank->amount))
+                              &pos->details.closing->amount))
         {
           *mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
                                                           
TALER_EC_WITHDRAW_AMOUNT_WITHDRAWALS_OVERFLOW);
          return GNUNET_DB_STATUS_HARD_ERROR;
         }
+      if (GNUNET_OK !=
+          TALER_amount_add (&withdraw_total,
+                            &withdraw_total,
+                            &pos->details.closing->closing_fee))
+      {
+        *mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
+                                                         
TALER_EC_WITHDRAW_AMOUNT_WITHDRAWALS_OVERFLOW);
+        return GNUNET_DB_STATUS_HARD_ERROR;
+      }
+
       res |= 2;
       break;
     }
@@ -324,6 +319,7 @@ withdraw_transaction (void *cls,
                                                     
TALER_EC_WITHDRAW_RESERVE_HISTORY_IMPOSSIBLE);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
+
   if (0 < TALER_amount_cmp (&wc->amount_required,
                             &balance))
   {
diff --git a/src/exchange/taler-exchange-wirewatch.c 
b/src/exchange/taler-exchange-wirewatch.c
index 312f8ac..ca7f3ba 100644
--- a/src/exchange/taler-exchange-wirewatch.c
+++ b/src/exchange/taler-exchange-wirewatch.c
@@ -37,6 +37,23 @@
 
 
 /**
+ * Closure for #reject_cb().
+ */
+struct RejectContext
+{
+  /**
+   * Wire transfer subject that was illformed.
+   */
+  char *wtid_s;
+
+  /**
+   * Database session that encountered the problem.
+   */
+  struct TALER_EXCHANGEDB_Session *session;
+};
+
+
+/**
  * Handle to the plugin.
  */
 static struct TALER_WIRE_Plugin *wire_plugin;
@@ -109,6 +126,11 @@ static struct GNUNET_SCHEDULER_Task *task;
  */
 static struct TALER_WIRE_HistoryHandle *hh;
 
+/**
+ * Active request to reject a wire transfer.
+ */
+static struct TALER_WIRE_RejectHandle *rt;
+
 
 /**
  * We're being aborted with CTRL-C (or SIGTERM). Shut down.
@@ -129,6 +151,15 @@ shutdown_task (void *cls)
                                     hh);
     hh = NULL;
   }
+  if (NULL != rt)
+  {
+    char *wtid_s;
+
+    wtid_s = wire_plugin->reject_transfer_cancel (wire_plugin->cls,
+                                                  rt);
+    rt = NULL;
+    GNUNET_free (wtid_s);
+  }
   TALER_EXCHANGEDB_plugin_unload (db_plugin);
   db_plugin = NULL;
   TALER_WIRE_plugin_unload (wire_plugin);
@@ -205,6 +236,48 @@ find_transfers (void *cls);
 
 
 /**
+ * Function called upon completion of the rejection of a wire transfer.
+ *
+ * @param cls closure with the `struct RejectContext`
+ * @param ec error code for the operation
+ */
+static void
+reject_cb (void *cls,
+           enum TALER_ErrorCode ec)
+{
+  struct RejectContext *rtc = cls;
+  enum GNUNET_DB_QueryStatus qs;
+
+  rt = NULL;
+  if (TALER_EC_NONE != ec)
+  {
+    fprintf (stderr,
+             "Failed to wire back transfer `%s': %d\n",
+             rtc->wtid_s,
+             ec);
+    GNUNET_free (rtc->wtid_s);
+    db_plugin->rollback (db_plugin->cls,
+                        rtc->session);
+    GNUNET_free (rtc);
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
+  GNUNET_free (rtc->wtid_s);
+  qs = db_plugin->commit (db_plugin->cls,
+                          rtc->session);
+  GNUNET_free (rtc);
+  if (0 <= qs)
+  {
+    GNUNET_free_non_null (start_off);
+    start_off = last_row_off;
+    start_off_size = last_row_off_size;
+  }
+  task = GNUNET_SCHEDULER_add_now (&find_transfers,
+                                   NULL);
+}
+
+
+/**
  * Callbacks of this type are used to serve the result of asking
  * the bank for the transaction history.
  *
@@ -224,6 +297,7 @@ history_cb (void *cls,
 {
   struct TALER_EXCHANGEDB_Session *session = cls;
   enum GNUNET_DB_QueryStatus qs;
+  struct TALER_ReservePublicKeyP reserve_pub;
 
   if (TALER_BANK_DIRECTION_NONE == dir)
   {
@@ -254,13 +328,45 @@ history_cb (void *cls,
                                       NULL);
     return GNUNET_OK; /* will be ignored anyway */
   }
+  if (NULL != details->wtid_s)
+  {
+    struct RejectContext *rtc;
+
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                "Wire transfer over %s has invalid subject `%s', sending it 
back!\n",
+                TALER_amount2s (&details->amount),
+                details->wtid_s);
+    if (last_row_off_size != row_off_size)
+    {
+      GNUNET_free_non_null (last_row_off);
+      last_row_off = GNUNET_malloc (row_off_size);
+    }
+    memcpy (last_row_off,
+            row_off,
+            row_off_size);
+    rtc = GNUNET_new (struct RejectContext);
+    rtc->session = session;
+    rtc->wtid_s = GNUNET_strdup (details->wtid_s);
+    rt = wire_plugin->reject_transfer (wire_plugin->cls,
+                                       row_off,
+                                       row_off_size,
+                                       &reject_cb,
+                                       rtc);
+    return GNUNET_SYSERR; /* will continue later... */
+  }
+
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Adding wire transfer over %s with subject `%s'\n",
               TALER_amount2s (&details->amount),
-              TALER_B2S (&details->reserve_pub));
+              TALER_B2S (&details->wtid));
+  /* Wire transfer identifier == reserve public key */
+  GNUNET_assert (sizeof (reserve_pub) == sizeof (details->wtid));
+  memcpy (&reserve_pub,
+          &details->wtid,
+          sizeof (reserve_pub));
   qs = db_plugin->reserves_in_insert (db_plugin->cls,
                                      session,
-                                     &details->reserve_pub,
+                                     &reserve_pub,
                                      &details->amount,
                                      details->execution_date,
                                      details->account_details,
diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am
index 2122c17..66299d7 100644
--- a/src/exchangedb/Makefile.am
+++ b/src/exchangedb/Makefile.am
@@ -54,7 +54,7 @@ libtalerexchangedb_la_LIBADD = \
 
 libtalerexchangedb_la_LDFLAGS = \
   $(POSTGRESQL_LDFLAGS) \
-  -version-info 0:0:0 \
+  -version-info 1:0:0 \
   -no-undefined
 
 
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index d39adf2..93a8c1a 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -343,8 +343,8 @@ postgres_create_tables (void *cls)
                            ",h_wire BYTEA NOT NULL CHECK (LENGTH(h_wire)=64)"
                            ",coin_sig BYTEA NOT NULL CHECK 
(LENGTH(coin_sig)=64)"
                            ",wire TEXT NOT NULL"
-                           ",tiny BOOLEAN NOT NULL DEFAULT false"
-                           ",done BOOLEAN NOT NULL DEFAULT false"
+                           ",tiny BOOLEAN NOT NULL DEFAULT FALSE"
+                           ",done BOOLEAN NOT NULL DEFAULT FALSE"
                            ",UNIQUE (coin_pub, h_contract_terms, merchant_pub)"
                            ");"),
     /* Index for get_deposit statement on coin_pub, h_contract_terms and 
merchant_pub */
@@ -1035,8 +1035,8 @@ postgres_prepare (PGconn *db_conn)
                             " FROM deposits"
                             "    JOIN known_coins USING (coin_pub)"
                             "    JOIN denominations denom USING 
(denom_pub_hash)"
-                            " WHERE tiny=false"
-                            "    AND done=false"
+                            " WHERE tiny=FALSE"
+                            "    AND done=FALSE"
                             "    AND wire_deadline<=$1"
                             "    AND refund_deadline<$1"
                             " ORDER BY wire_deadline ASC"
@@ -1063,20 +1063,20 @@ postgres_prepare (PGconn *db_conn)
                             " WHERE"
                             " merchant_pub=$1 AND"
                             " h_wire=$2 AND"
-                            " done=false"
+                            " done=FALSE"
                             " ORDER BY wire_deadline ASC"
                             " LIMIT " 
TALER_EXCHANGEDB_MATCHING_DEPOSITS_LIMIT_STR ";",
                             2),
     /* Used in #postgres_mark_deposit_tiny() */
     GNUNET_PQ_make_prepare ("mark_deposit_tiny",
                             "UPDATE deposits"
-                            " SET tiny=true"
+                            " SET tiny=TRUE"
                             " WHERE deposit_serial_id=$1",
                             1),
     /* Used in #postgres_mark_deposit_done() */
     GNUNET_PQ_make_prepare ("mark_deposit_done",
                             "UPDATE deposits"
-                            " SET done=true"
+                            " SET done=TRUE"
                             " WHERE deposit_serial_id=$1;",
                             1),
     /* Used in #postgres_test_deposit_done() */
@@ -1100,6 +1100,7 @@ postgres_prepare (PGconn *db_conn)
                             ",denom.fee_deposit_curr"
                             ",timestamp"
                             ",refund_deadline"
+                            ",wire_deadline"
                             ",merchant_pub"
                             ",h_contract_terms"
                             ",h_wire"
@@ -1313,8 +1314,8 @@ postgres_prepare (PGconn *db_conn)
                            ",tiny"
                            ",done"
                            " FROM deposits"
-                           " WHERE wire_deadline <= $1"
-                           " AND wire_deadline > $2" 
+                           " WHERE wire_deadline >= $1"
+                           " AND wire_deadline < $2"
                            " AND NOT (EXISTS (SELECT 1"
                            "            FROM refunds"
                            "            WHERE (refunds.coin_pub = 
deposits.coin_pub))"
@@ -3833,6 +3834,8 @@ add_coin_deposit (void *cls,
                                             &deposit->timestamp),
        GNUNET_PQ_result_spec_absolute_time ("refund_deadline",
                                             &deposit->refund_deadline),
+       GNUNET_PQ_result_spec_absolute_time ("wire_deadline",
+                                            &deposit->wire_deadline),
        GNUNET_PQ_result_spec_auto_from_type ("merchant_pub",
                                              &deposit->merchant_pub),
        GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms",
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index 537f33c..f04eaf1 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -1417,6 +1417,57 @@ payback_cb (void *cls,
 
 
 /**
+ * Function called on deposits that are past their due date
+ * and have not yet seen a wire transfer.
+ *
+ * @param cls closure a `struct TALER_EXCHANGEDB_Deposit *`
+ * @param rowid deposit table row of the coin's deposit
+ * @param coin_pub public key of the coin
+ * @param amount value of the deposit, including fee
+ * @param wire where should the funds be wired
+ * @param deadline what was the requested wire transfer deadline
+ * @param tiny did the exchange defer this transfer because it is too small?
+ * @param done did the exchange claim that it made a transfer?
+ */
+static void
+wire_missing_cb (void *cls,
+                 uint64_t rowid,
+                 const struct TALER_CoinSpendPublicKeyP *coin_pub,
+                 const struct TALER_Amount *amount,
+                 const json_t *wire,
+                 struct GNUNET_TIME_Absolute deadline,
+                 /* bool? */ int tiny,
+                 /* bool? */ int done)
+{
+  struct TALER_EXCHANGEDB_Deposit *deposit = cls;
+  struct GNUNET_HashCode h_wire;
+
+  if (NULL != wire)
+    GNUNET_assert (GNUNET_OK ==
+                   TALER_JSON_hash (wire,
+                                    &h_wire));
+  else
+    memset (&h_wire,
+            0,
+            sizeof (h_wire));
+  if ( (GNUNET_NO != tiny) ||
+       (GNUNET_NO != done) ||
+       (0 != TALER_amount_cmp (amount,
+                               &deposit->amount_with_fee)) ||
+       (0 != memcmp (coin_pub,
+                     &deposit->coin.coin_pub,
+                     sizeof (struct TALER_CoinSpendPublicKeyP))) ||
+       (0 != memcmp (&h_wire,
+                     &deposit->h_wire,
+                     sizeof (struct GNUNET_HashCode))) )
+  {
+    GNUNET_break (0);
+    result = 66;
+  }
+}
+
+
+/**
  * Main function that will be run by the scheduler.
  *
  * @param cls closure with config
@@ -1646,6 +1697,7 @@ run (void *cls)
   deposit.coin.denom_pub = dkp->pub;
   deposit.coin.denom_sig = cbc.sig;
   deadline = GNUNET_TIME_absolute_get ();
+  (void) GNUNET_TIME_round_abs (&deadline);
   FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
           plugin->insert_payback_request (plugin->cls,
                                           session,
@@ -1788,6 +1840,9 @@ run (void *cls)
   deposit.receiver_wire_account = wire;
   deposit.amount_with_fee = value;
   deposit.deposit_fee = fee_deposit;
+
+  deposit.refund_deadline = deadline;
+  deposit.wire_deadline = deadline;
   result = 8;
   FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
           plugin->insert_deposit (plugin->cls,
@@ -1797,6 +1852,23 @@ run (void *cls)
           plugin->have_deposit (plugin->cls,
                                 session,
                                 &deposit));
+  {
+    struct GNUNET_TIME_Absolute start_range;
+    struct GNUNET_TIME_Absolute end_range;
+
+    start_range = GNUNET_TIME_absolute_subtract (deadline,
+                                                 GNUNET_TIME_UNIT_SECONDS);
+    end_range = GNUNET_TIME_absolute_add (deadline,
+                                          GNUNET_TIME_UNIT_SECONDS);
+    FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+            plugin->select_deposits_missing_wire (plugin->cls,
+                                                  session,
+                                                  start_range,
+                                                  end_range,
+                                                  &wire_missing_cb,
+                                                  &deposit));
+    FAILIF (8 != result);
+  }
   auditor_row_cnt = 0;
   FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
           plugin->select_deposits_above_serial_id (plugin->cls,
diff --git a/src/include/taler_auditordb_plugin.h 
b/src/include/taler_auditordb_plugin.h
index 2d7d460..80974cc 100644
--- a/src/include/taler_auditordb_plugin.h
+++ b/src/include/taler_auditordb_plugin.h
@@ -121,6 +121,12 @@ struct TALER_AUDITORDB_WireProgressPoint
    * last_wire_out_serial_id serial ID of the last wire_out the wire auditor 
processed
    */
   uint64_t last_wire_out_serial_id;
+
+  /**
+   * Time until which we have confirmed that all wire transactions
+   * that the exchange should do, have indeed been done.
+   */
+  struct GNUNET_TIME_Absolute last_timestamp;
 };
 
 
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h
index 9e9352f..d5024e6 100644
--- a/src/include/taler_crypto_lib.h
+++ b/src/include/taler_crypto_lib.h
@@ -396,7 +396,83 @@ int
 TALER_test_coin_valid (const struct TALER_CoinPublicInfo *coin_public_info);
 
 
-/* ****************** Refresh crypto primitives ************* */
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * Header for serializations of coin-specific information about the
+ * fresh coins we generate.  These are the secrets that arise during
+ * planchet generation, which is the first stage of creating a new
+ * coin.
+ */
+struct TALER_PlanchetSecretsP
+{
+
+  /**
+   * Private key of the coin.
+   */
+  struct TALER_CoinSpendPrivateKeyP coin_priv;
+
+  /**
+   * The blinding key.
+   */
+  struct TALER_DenominationBlindingKeyP blinding_key;
+
+};
+
+GNUNET_NETWORK_STRUCT_END
+
+
+/**
+ * Details about a planchet that the customer wants to obtain
+ * a withdrawal authorization.  This is the information that
+ * will need to be sent to the exchange to obtain the blind
+ * signature required to turn a planchet into a coin.
+ */
+struct TALER_PlanchetDetail
+{
+  /**
+   * Hash of the denomination public key.
+   */
+  struct GNUNET_HashCode denom_pub_hash;
+
+  /**
+   * Hash of the coin's public key.  Kept around so we do not need to
+   * compute it again.  Can be recomputed by hashing the public key
+   * of @a coin_priv if storage is at a premium.
+   */
+  struct GNUNET_HashCode c_hash;
+
+  /**
+   * Blinded coin (see GNUNET_CRYPTO_rsa_blind()).  Note: is malloc()'ed!
+   */
+  char *coin_ev;
+
+  /**
+   * Number of bytes in @a coin_ev.
+   */
+  size_t coin_ev_size;
+};
+
+
+/**
+ * Information about a (fresh) coin, returned from the API when we
+ * finished creating a coin.  Note that @e sig needs to be freed
+ * using the appropriate code.
+ */
+struct TALER_FreshCoin
+{
+
+  /**
+   * The exchange's signature over the coin's public key.
+   */
+  struct TALER_DenominationSignature sig;
+
+  /**
+   * The coin's private key.
+   */
+  struct TALER_CoinSpendPrivateKeyP coin_priv;
+
+};
 
 
 GNUNET_NETWORK_STRUCT_BEGIN
@@ -426,6 +502,7 @@ struct TALER_TransferSecretP
  */
 #define TALER_WIRE_TRANSFER_IDENTIFIER_LEN_STR "32"
 
+
 /**
  * Raw value of a wire transfer subjects, without the checksum.
  */
@@ -472,6 +549,68 @@ struct TALER_WireTransferIdentifierP
 
 GNUNET_NETWORK_STRUCT_END
 
+
+/**
+ * Setup information for a fresh coin, deriving the coin private key
+ * and the blinding factor from the @a secret_seed with a KDF salted
+ * by the @a coin_num_salt.
+ *
+ * @param secret_seed seed to use for KDF to derive coin keys
+ * @param coin_num_salt number of the coin to include in KDF
+ * @param[out] fc value to initialize
+ */
+void
+TALER_planchet_setup_refresh (const struct TALER_TransferSecretP *secret_seed,
+                              unsigned int coin_num_salt,
+                              struct TALER_PlanchetSecretsP *fc);
+
+
+/**
+ * Setup information for a fresh coin.
+ *
+ * @param[out] ps value to initialize
+ */
+void
+TALER_planchet_setup_random (struct TALER_PlanchetSecretsP *ps);
+
+
+/**
+ * Prepare a planchet for tipping.  Creates and blinds a coin.
+ *
+ * @param dk denomination key for the coin to be created
+ * @param ps secret planchet internals (for #TALER_planchet_to_coin)
+ * @param[out] pd set to the planchet detail for TALER_MERCHANT_tip_pickup() 
and
+ *               other withdraw operations
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_planchet_prepare (const struct TALER_DenominationPublicKey *dk,
+                        const struct TALER_PlanchetSecretsP *ps,
+                        struct TALER_PlanchetDetail *pd);
+
+
+/**
+ * Obtain a coin from the planchet's secrets and the blind signature
+ * of the exchange.
+ *
+ * @param dk denomination key, must match what was given to 
#TALER_planchet_prepare()
+ * @param blind_sig blind signature from the exchange
+ * @param ps secrets from #TALER_planchet_prepare()
+ * @param c_hash hash of the coin's public key for verification of the 
signature
+ * @param[out] coin set to the details of the fresh coin
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_planchet_to_coin (const struct TALER_DenominationPublicKey *dk,
+                        const struct GNUNET_CRYPTO_RsaSignature *blind_sig,
+                        const struct TALER_PlanchetSecretsP *ps,
+                        const struct GNUNET_HashCode *c_hash,
+                        struct TALER_FreshCoin *coin);
+
+
+/* ****************** Refresh crypto primitives ************* */
+
+
 /**
  * Given the coin and the transfer private keys, compute the
  * transfer secret.  (Technically, we only need one of the two
@@ -503,7 +642,6 @@ TALER_link_reveal_transfer_secret (const struct 
TALER_TransferPrivateKeyP *trans
                                    struct TALER_TransferSecretP 
*transfer_secret);
 
 
-
 /**
  * Decrypt the shared @a secret from the information in the
  * @a trans_priv and @a coin_pub.
@@ -518,40 +656,4 @@ TALER_link_recover_transfer_secret (const struct 
TALER_TransferPublicKeyP *trans
                                     struct TALER_TransferSecretP 
*transfer_secret);
 
 
-/**
- * Header for serializations of coin-specific information about the
- * fresh coins we generate during a melt.
- */
-struct TALER_FreshCoinP
-{
-
-  /**
-   * Private key of the coin.
-   */
-  struct TALER_CoinSpendPrivateKeyP coin_priv;
-
-  /**
-   * The blinding key.
-   */
-  struct TALER_DenominationBlindingKeyP blinding_key;
-
-};
-
-
-/**
- * Setup information for a fresh coin, deriving the coin private key
- * and the blinding factor from the @a secret_seed with a KDF salted
- * by the @a coin_num_salt.
- *
- * @param secret_seed seed to use for KDF to derive coin keys
- * @param coin_num_salt number of the coin to include in KDF
- * @param[out] fc value to initialize
- */
-void
-TALER_setup_fresh_coin (const struct TALER_TransferSecretP *secret_seed,
-                        unsigned int coin_num_salt,
-                        struct TALER_FreshCoinP *fc);
-
-
-
 #endif
diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h
index 5a95635..acc7228 100644
--- a/src/include/taler_error_codes.h
+++ b/src/include/taler_error_codes.h
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2016 Inria
+  Copyright (C) 2016, 2017 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
@@ -58,6 +58,16 @@ enum TALER_ErrorCode
    */
   TALER_EC_EXCHANGE_BAD_CONFIGURATION = 4,
 
+  /**
+   * Internal assertion error.
+   */
+  TALER_EC_INTERNAL_INVARIANT_FAILURE = 5,
+
+  /**
+   * Operation timed out.
+   */
+  TALER_EC_TIMEOUT = 6,
+
   /* ********** generic error codes ************* */
 
   /**
@@ -1336,6 +1346,141 @@ enum TALER_ErrorCode
    */
    TALER_EC_PAY_DB_STORE_PAYMENTS_ERROR = 2605,
 
+  /**
+   * The backend does not know the instance that was supposed to support
+   * the tip.  Likely to be a configuration error. Returned with an
+   * HTTP status code of "NOT FOUND".
+   */
+  TALER_EC_TIP_AUTHORIZE_INSTANCE_UNKNOWN = 2700,
+
+  /**
+   * The backend knows the instance that was supposed to support the
+   * tip, but it was not configured for tipping (i.e. has no exchange
+   * associated with it).  Likely to be a configuration
+   * error. Returned with an HTTP status code of "NOT FOUND".
+   */
+  TALER_EC_TIP_AUTHORIZE_INSTANCE_DOES_NOT_TIP = 2701,
+
+  /**
+   * The reserve that was used to fund the tips has expired.
+   * Returned with an HTTP status code of "not found".
+   */
+  TALER_EC_TIP_AUTHORIZE_RESERVE_EXPIRED = 2702,
+
+  /**
+   * The reserve that was used to fund the tips was not found in the DB.
+   * Returned with an HTTP status code of "not found".
+   */
+  TALER_EC_TIP_AUTHORIZE_RESERVE_UNKNOWN = 2703,
+
+  /**
+   * The backend knows the instance that was supposed to support the
+   * tip, and it was configured for tipping. However, the funds
+   * remaining are insufficient to cover the tip, and the merchant
+   * should top up the reserve.
+   * Returned with an HTTP status code of "PRECONDITION FAILED".
+   */
+  TALER_EC_TIP_AUTHORIZE_INSUFFICIENT_FUNDS = 2704,
+
+  /**
+   * The backend had trouble accessing the database to persist
+   * information about the tip authorization.
+   * Returned with an HTTP status code of internal error.
+   */
+  TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR = 2705,
+
+  /**
+   * The backend had trouble accessing the database to persist
+   * information about the tip authorization.
+   * The problem might be fixable by repeating the transaction.
+   */
+  TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR = 2706,
+
+  /**
+   * The reserve that was used to fund the tips was never enabled.
+   * Returned with an HTTP status code of "not found".
+   */
+  TALER_EC_TIP_AUTHORIZE_RESERVE_NOT_ENABLED = 2707,
+
+  /**
+   * The backend had trouble accessing the database to persist
+   * information about enabling tips.
+   * Returned with an HTTP status code of internal error.
+   */
+  TALER_EC_TIP_ENABLE_DB_TRANSACTION_ERROR = 2750,
+
+  /**
+   * The tip ID is unknown.  This could happen if the tip has
+   * expired.  Returned with an HTTP status code of "not found".
+   */
+  TALER_EC_TIP_PICKUP_TIP_ID_UNKNOWN = 2800,
+
+  /**
+   * The amount requested exceeds the remaining tipping balance for this tip 
ID.
+   * Returned with an HTTP status code of "service unavailable".
+   */
+  TALER_EC_TIP_PICKUP_NO_FUNDS = 2801,
+
+  /**
+   * We encountered a DB error, repeating the request may work.
+   */
+  TALER_EC_TIP_PICKUP_DB_ERROR_SOFT = 2802,
+
+  /**
+   * We encountered a DB error, repeating the request will not help.
+   * This is an internal server error.
+   */
+  TALER_EC_TIP_PICKUP_DB_ERROR_HARD = 2803,
+
+  /**
+   * The same pickup ID was already used for picking up a different
+   * amount. This points to a very strange internal error as the
+   * pickup ID is derived from the denomination key which is tied
+   * to a particular amount. Hence this should also be an internal
+   * server error.
+   */
+  TALER_EC_TIP_PICKUP_AMOUNT_CHANGED = 2804,
+
+  /**
+   * We failed to contact the exchange to obtain the denomination
+   * keys.  Returned with a response code "failed dependency" (424).
+   */
+  TALER_EC_TIP_PICKUP_EXCHANGE_DOWN = 2805,
+
+  /**
+   * We contacted the exchange to obtain any denomination
+   * keys, but got no valid keys.
+   * Returned with a response code "failed dependency" (424).
+   */
+  TALER_EC_TIP_PICKUP_EXCHANGE_LACKED_KEYS = 2806,
+
+  /**
+   * We contacted the exchange to obtain at least one of
+   * the denomination keys specified in the request.
+   * Returned with a response code "not found" (404).
+   */
+  TALER_EC_TIP_PICKUP_EXCHANGE_LACKED_KEY = 2807,
+
+  /**
+   * We encountered an arithmetic issue totaling up the
+   * amount to withdraw. Returned with a response code
+   * of "bad request".
+   */
+  TALER_EC_TIP_PICKUP_EXCHANGE_AMOUNT_OVERFLOW = 2808,
+
+  /**
+   * The number of planchets specified exceeded the
+   * limit. Returned with a response code
+   * of "bad request".
+   */
+  TALER_EC_TIP_PICKUP_EXCHANGE_TOO_MANY_PLANCHETS = 2809,
+
+  /**
+   * The tip id is unknown.  This could happen if the
+   * tip id is wrong or the tip authorization expired.
+   */
+  TALER_EC_TIP_QUERY_TIP_ID_UNKNOWN = 2810,
+
 
   /* ********** /test API error codes ************* */
 
diff --git a/src/include/taler_exchange_service.h 
b/src/include/taler_exchange_service.h
index 814078a..fadcbf8 100644
--- a/src/include/taler_exchange_service.h
+++ b/src/include/taler_exchange_service.h
@@ -966,19 +966,19 @@ typedef void
 
 
 /**
- * Withdraw a coin from the exchange using a /reserve/withdraw request.  This
- * API is typically used by a wallet.  Note that to ensure that no
- * money is lost in case of hardware failures, the caller must have
- * committed (most of) the arguments to disk before calling, and be
- * ready to repeat the request with the same arguments in case of
- * failures.
+ * Withdraw a coin from the exchange using a /reserve/withdraw
+ * request.  This API is typically used by a wallet to withdraw from a
+ * reserve.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
  *
  * @param exchange the exchange handle; the exchange must be ready to operate
  * @param pk kind of coin to create
  * @param reserve_priv private key of the reserve to withdraw from
- * @param coin_priv where to fetch the coin's private key,
- *        caller must have committed this value to disk before the call (with 
@a pk)
- * @param blinding_key where to fetch the coin's blinding key
+ * @param ps secrets of the planchet
  *        caller must have committed this value to disk before the call (with 
@a pk)
  * @param res_cb the callback to call when the final result for this request 
is available
  * @param res_cb_cls closure for @a res_cb
@@ -990,13 +990,44 @@ struct TALER_EXCHANGE_ReserveWithdrawHandle *
 TALER_EXCHANGE_reserve_withdraw (struct TALER_EXCHANGE_Handle *exchange,
                                  const struct TALER_EXCHANGE_DenomPublicKey 
*pk,
                                  const struct TALER_ReservePrivateKeyP 
*reserve_priv,
-                                 const struct TALER_CoinSpendPrivateKeyP 
*coin_priv,
-                                 const struct TALER_DenominationBlindingKeyP 
*blinding_key,
+                                 const struct TALER_PlanchetSecretsP *ps,
                                  TALER_EXCHANGE_ReserveWithdrawResultCallback 
res_cb,
                                  void *res_cb_cls);
 
 
 /**
+ * Withdraw a coin from the exchange using a /reserve/withdraw
+ * request.  This API is typically used by a wallet to withdraw a tip
+ * where the reserve's signature was created by the merchant already.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
+ *
+ * @param exchange the exchange handle; the exchange must be ready to operate
+ * @param pk kind of coin to create
+ * @param reserve_sig signature from the reserve authorizing the withdrawal
+ * @param reserve_pub public key of the reserve to withdraw from
+ * @param ps secrets of the planchet
+ *        caller must have committed this value to disk before the call (with 
@a pk)
+ * @param res_cb the callback to call when the final result for this request 
is available
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
+ *         if the inputs are invalid (i.e. denomination key not with this 
exchange).
+ *         In this case, the callback is not called.
+ */
+struct TALER_EXCHANGE_ReserveWithdrawHandle *
+TALER_EXCHANGE_reserve_withdraw2 (struct TALER_EXCHANGE_Handle *exchange,
+                                  const struct TALER_EXCHANGE_DenomPublicKey 
*pk,
+                                  const struct TALER_ReserveSignatureP 
*reserve_sig,
+                                  const struct TALER_ReservePublicKeyP 
*reserve_pub,
+                                  const struct TALER_PlanchetSecretsP *ps,
+                                  TALER_EXCHANGE_ReserveWithdrawResultCallback 
res_cb,
+                                  void *res_cb_cls);
+
+
+/**
  * Cancel a withdraw status request.  This function cannot be used
  * on a request handle if a response is already served for it.
  *
@@ -1540,8 +1571,7 @@ typedef void
  * @param exchange the exchange handle; the exchange must be ready to operate
  * @param pk kind of coin to pay back
  * @param denom_sig signature over the coin by the exchange using @a pk
- * @param coin_priv the coin's private key,
- * @param blinding_key where to fetch the coin's blinding key
+ * @param ps secret internals of the original planchet
  * @param payback_cb the callback to call when the final result for this 
request is available
  * @param payback_cb_cls closure for @a payback_cb
  * @return NULL
@@ -1552,8 +1582,7 @@ struct TALER_EXCHANGE_PaybackHandle *
 TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle *exchange,
                         const struct TALER_EXCHANGE_DenomPublicKey *pk,
                         const struct TALER_DenominationSignature *denom_sig,
-                        const struct TALER_CoinSpendPrivateKeyP *coin_priv,
-                        const struct TALER_DenominationBlindingKeyP 
*blinding_key,
+                        const struct TALER_PlanchetSecretsP *ps,
                         TALER_EXCHANGE_PaybackResultCallback payback_cb,
                         void *payback_cb_cls);
 
diff --git a/src/include/taler_json_lib.h b/src/include/taler_json_lib.h
index 248de9c..6d019ec 100644
--- a/src/include/taler_json_lib.h
+++ b/src/include/taler_json_lib.h
@@ -48,6 +48,16 @@ TALER_JSON_from_amount (const struct TALER_Amount *amount);
 
 
 /**
+ * Convert a TALER amount to a JSON object.
+ *
+ * @param amount the amount
+ * @return a json object describing the amount
+ */
+json_t *
+TALER_JSON_from_amount_nbo (const struct TALER_AmountNBO *amount);
+
+
+/**
  * Provide specification to parse given JSON object to an amount.
  *
  * @param name name of the amount field in the JSON
diff --git a/src/include/taler_util.h b/src/include/taler_util.h
index 34e07a3..84d4f5d 100644
--- a/src/include/taler_util.h
+++ b/src/include/taler_util.h
@@ -134,6 +134,4 @@ const struct GNUNET_OS_ProjectData *
 TALER_project_data_default (void);
 
 
-
-
 #endif
diff --git a/src/include/taler_wire_plugin.h b/src/include/taler_wire_plugin.h
index 969af35..6e355ba 100644
--- a/src/include/taler_wire_plugin.h
+++ b/src/include/taler_wire_plugin.h
@@ -59,13 +59,17 @@ struct TALER_WIRE_TransferDetails
   struct GNUNET_TIME_Absolute execution_date;
 
   /**
-   * Reserve public key that was encoded in the wire transfer subject.
-   * FIXME (#5077): this is incorrect for *outgoing* wire transfers.
-   * Maybe use `struct TALER_WireTransferIdentifierRawP` here instead?
-   * OTOH, we might want to make this even more generic in case of
-   * invalid transfers, so that we can capture those as well!
+   * Binary data that was encoded in the wire transfer subject, if
+   * it decoded properly.  Otherwise all-zeros and @e wtid_s is set.
    */
-  struct TALER_ReservePublicKeyP reserve_pub;
+  struct TALER_WireTransferIdentifierRawP wtid;
+
+  /**
+   * Wire transfer identifer as a string.  Set to NULL if the
+   * identifier was properly Base32 encoded and this @e wtid could be
+   * set instead.
+   */
+  char *wtid_s;
 
   /**
    * The other account that was involved
@@ -94,6 +98,18 @@ typedef int
 
 
 /**
+ * Callbacks of this type are used to serve the result of asking
+ * the bank to reject a wire transfer.
+ *
+ * @param cls closure
+ * @param ec status of the operation, #TALER_EC_NONE on success
+ */
+typedef void
+(*TALER_WIRE_RejectTransferCallback) (void *cls,
+                                      enum TALER_ErrorCode ec);
+
+
+/**
  * Handle returned for cancelling a preparation step.
  */
 struct TALER_WIRE_PrepareHandle;
@@ -308,12 +324,55 @@ struct TALER_WIRE_Plugin
   /**
    * Cancel going over the account's history.
    *
+   * @param cls plugins' closure
    * @param whh operation to cancel
    */
   void
   (*get_history_cancel) (void *cls,
                         struct TALER_WIRE_HistoryHandle *whh);
 
+
+  /**
+   * Reject an incoming wire transfer that was obtained from the
+   * history. This function can be used to transfer funds back to
+   * the sender if the WTID was malformed (i.e. due to a typo).
+   *
+   * Calling `reject_transfer` twice on the same wire transfer should
+   * be idempotent, i.e. not cause the funds to be wired back twice.
+   * Furthermore, the transfer should henceforth be removed from the
+   * results returned by @e get_history.
+   *
+   * @param cls plugin's closure
+   * @param start_off offset of the wire transfer in plugin-specific format
+   * @param start_off_len number of bytes in @a start_off
+   * @param rej_cb function to call with the result of the operation
+   * @param rej_cb_cls closure for @a rej_cb
+   * @return handle to cancel the operation
+   */
+  struct TALER_WIRE_RejectHandle *
+  (*reject_transfer)(void *cls,
+                     const void *start_off,
+                     size_t start_off_len,
+                     TALER_WIRE_RejectTransferCallback rej_cb,
+                     void *rej_cb_cls);
+
+  /**
+   * Cancel ongoing reject operation.  Note that the rejection may still
+   * proceed. Basically, if this function is called, the rejection may
+   * have happened or not.  This function is usually used during shutdown
+   * or system upgrades.  At a later point, the application must call
+   * @e reject_transfer again for this wire transfer, unless the
+   * @e get_history shows that the wire transfer no longer exists.
+   *
+   * @param cls plugins' closure
+   * @param rh operation to cancel
+   * @return closure of the callback of the operation
+   */
+  void *
+  (*reject_transfer_cancel)(void *cls,
+                            struct TALER_WIRE_RejectHandle *rh);
+
+
 };
 
 
diff --git a/src/json/json_helper.c b/src/json/json_helper.c
index fec637b..4f966c6 100644
--- a/src/json/json_helper.c
+++ b/src/json/json_helper.c
@@ -57,6 +57,24 @@ TALER_JSON_from_amount (const struct TALER_Amount *amount)
 }
 
 
+
+/**
+ * Convert a TALER amount to a JSON object.
+ *
+ * @param amount the amount
+ * @return a json object describing the amount
+ */
+json_t *
+TALER_JSON_from_amount_nbo (const struct TALER_AmountNBO *amount)
+{
+  struct TALER_Amount a;
+
+  TALER_amount_ntoh (&a,
+                     amount);
+  return TALER_JSON_from_amount (&a);
+}
+
+
 /**
  * Parse given JSON object to Amount
  *
diff --git a/src/util/amount.c b/src/util/amount.c
index 33ba9a2..7765c74 100644
--- a/src/util/amount.c
+++ b/src/util/amount.c
@@ -29,6 +29,25 @@
 #endif
 #include <gcrypt.h>
 
+/**
+ * Maximum legal 'value' for an amount, based on IEEE double (for JavaScript 
compatibility).
+ */
+#define MAX_AMOUNT_VALUE (1LLU << 52)
+
+
+/**
+ * Set @a a to "invalid".
+ *
+ * @param a amount to set to invalid
+ */
+static void
+invalidate (struct TALER_Amount *a)
+{
+  memset (a,
+          0,
+          sizeof (struct TALER_Amount));
+}
+
 
 /**
  * Parse money amount description, in the format "A:B.C".
@@ -48,9 +67,7 @@ TALER_string_to_amount (const char *str,
   const char *colon;
   const char *value;
 
-  memset (denom,
-          0,
-          sizeof (struct TALER_Amount));
+  invalidate (denom);
   /* skip leading whitespace */
   while (isspace( (unsigned char) str[0]))
     str++;
@@ -139,6 +156,12 @@ TALER_string_to_amount (const char *str,
     b /= 10;
     i++;
   }
+  if (denom->value > MAX_AMOUNT_VALUE)
+  {
+    /* too large to be legal */
+    invalidate (denom);
+    return GNUNET_SYSERR;
+  }
   return GNUNET_OK;
 
  fail:
@@ -238,20 +261,6 @@ TALER_amount_get_zero (const char *cur,
 
 
 /**
- * Set @a a to "invalid".
- *
- * @param a amount to set to invalid
- */
-static void
-invalidate (struct TALER_Amount *a)
-{
-  memset (a,
-          0,
-          sizeof (struct TALER_Amount));
-}
-
-
-/**
  * Test if the given amount is valid.
  *
  * @param amount amount to check
@@ -472,6 +481,12 @@ TALER_amount_add (struct TALER_Amount *sum,
     invalidate (sum);
     return GNUNET_SYSERR;
   }
+  if (res.value > MAX_AMOUNT_VALUE)
+  {
+    /* too large to be legal */
+    invalidate (sum);
+    return GNUNET_SYSERR;
+  }
   res.fraction = n1.fraction + n2.fraction;
   if (GNUNET_SYSERR ==
       TALER_amount_normalize (&res))
diff --git a/src/util/crypto.c b/src/util/crypto.c
index ce5bfac..efc7485 100644
--- a/src/util/crypto.c
+++ b/src/util/crypto.c
@@ -171,23 +171,49 @@ TALER_link_recover_transfer_secret (const struct 
TALER_TransferPublicKeyP *trans
 
 
 /**
+ * Set the bits in the private EdDSA key so that they match
+ * the specification.
+ *
+ * @param[in,out] pk private key to patch
+ */
+static void
+patch_private_key (struct GNUNET_CRYPTO_EddsaPrivateKey *pk)
+{
+  uint8_t *p = (uint8_t *) pk;
+
+  /* Taken from like 170-172 of libgcrypt/cipher/ecc.c
+   * We note that libgcrypt stores the private key in the reverse order
+   * from many Ed25519 implementatons. */
+  p[0] &= 0x7f;  /* Clear bit 255. */
+  p[0] |= 0x40;  /* Set bit 254.   */
+  p[31] &= 0xf8; /* Clear bits 2..0 so that d mod 8 == 0  */
+
+  /* FIXME: Run GNUNET_CRYPTO_ecdhe_key_create several times and inspect
+   * the output to verify that the same bits are set and cleared.
+   * Is it worth also adding a test case that runs gcry_pk_testkey on
+   * this key after first parsing it into libgcrypt's s-expression mess
+   * ala decode_private_eddsa_key from gnunet/src/util/crypto_ecc.c?
+   * It'd run check_secret_key but not test_keys from libgcrypt/cipher/ecc.c */
+}
+
+
+/**
  * Setup information for a fresh coin.
  *
  * @param secret_seed seed to use for KDF to derive coin keys
  * @param coin_num_salt number of the coin to include in KDF
- * @param[out] fc value to initialize
+ * @param[out] ps value to initialize
  */
 void
-TALER_setup_fresh_coin (const struct TALER_TransferSecretP *secret_seed,
-                        unsigned int coin_num_salt,
-                        struct TALER_FreshCoinP *fc)
+TALER_planchet_setup_refresh (const struct TALER_TransferSecretP *secret_seed,
+                              unsigned int coin_num_salt,
+                              struct TALER_PlanchetSecretsP *ps)
 {
   uint32_t be_salt = htonl (coin_num_salt);
-  uint8_t *p;
 
   GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CRYPTO_kdf (fc,
-                                    sizeof (*fc),
+                 GNUNET_CRYPTO_kdf (ps,
+                                    sizeof (*ps),
                                     &be_salt,
                                     sizeof (be_salt),
                                     secret_seed,
@@ -195,24 +221,97 @@ TALER_setup_fresh_coin (const struct 
TALER_TransferSecretP *secret_seed,
                                     "taler-coin-derivation",
                                     strlen ("taler-coin-derivation"),
                                     NULL, 0));
+  patch_private_key (&ps->coin_priv.eddsa_priv);
+}
 
-  /* Taken from like 170-172 of libgcrypt/cipher/ecc.c
-   * We note that libgcrypt stores the private key in the reverse order
-   * from many Ed25519 implementatons. */
-  p = (uint8_t *) &(fc->coin_priv);
-  p[0] &= 0x7f;  /* Clear bit 255. */
-  p[0] |= 0x40;  /* Set bit 254.   */
-  p[31] &= 0xf8; /* Clear bits 2..0 so that d mod 8 == 0  */
 
-  /* FIXME: Run GNUNET_CRYPTO_ecdhe_key_create several times and inspect
-   * the output to verify that the same bits are set and cleared.
-   * Is it worth also adding a test case that runs gcry_pk_testkey on
-   * this key after first parsing it into libgcrypt's s-expression mess
-   * ala decode_private_eddsa_key from gnunet/src/util/crypto_ecc.c?
-   * It'd run check_secret_key but not test_keys from libgcrypt/cipher/ecc.c */
+/**
+ * Setup information for a fresh coin.
+ *
+ * @param[out] ps value to initialize
+ */
+void
+TALER_planchet_setup_random (struct TALER_PlanchetSecretsP *ps)
+{
+  GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
+                              ps,
+                              sizeof (*ps));
+  patch_private_key (&ps->coin_priv.eddsa_priv);
+}
+
+
+/**
+ * Prepare a planchet for tipping.  Creates and blinds a coin.
+ *
+ * @param dk denomination key for the coin to be created
+ * @param ps secret planchet internals (for #TALER_planchet_to_coin)
+ * @param[out] pd set to the planchet detail for TALER_MERCHANT_tip_pickup() 
and
+ *               other withdraw operations
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_planchet_prepare (const struct TALER_DenominationPublicKey *dk,
+                        const struct TALER_PlanchetSecretsP *ps,
+                        struct TALER_PlanchetDetail *pd)
+{
+  struct TALER_CoinSpendPublicKeyP coin_pub;
+
+  GNUNET_CRYPTO_eddsa_key_get_public (&ps->coin_priv.eddsa_priv,
+                                      &coin_pub.eddsa_pub);
+  GNUNET_CRYPTO_hash (&coin_pub.eddsa_pub,
+                      sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey),
+                      &pd->c_hash);
+  if (GNUNET_YES !=
+      GNUNET_CRYPTO_rsa_blind (&pd->c_hash,
+                               &ps->blinding_key.bks,
+                               dk->rsa_public_key,
+                               &pd->coin_ev,
+                               &pd->coin_ev_size))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  GNUNET_CRYPTO_rsa_public_key_hash (dk->rsa_public_key,
+                                     &pd->denom_pub_hash);
+  return GNUNET_OK;
 }
 
 
+/**
+ * Obtain a coin from the planchet's secrets and the blind signature
+ * of the exchange.
+ *
+ * @param dk denomination key, must match what was given to 
#TALER_planchet_prepare()
+ * @param blind_sig blind signature from the exchange
+ * @param ps secrets from #TALER_planchet_prepare()
+ * @param c_hash hash of the coin's public key for verification of the 
signature
+ * @param[out] coin set to the details of the fresh coin
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_planchet_to_coin (const struct TALER_DenominationPublicKey *dk,
+                        const struct GNUNET_CRYPTO_RsaSignature *blind_sig,
+                        const struct TALER_PlanchetSecretsP *ps,
+                        const struct GNUNET_HashCode *c_hash,
+                        struct TALER_FreshCoin *coin)
+{
+  struct GNUNET_CRYPTO_RsaSignature *sig;
 
+  sig = GNUNET_CRYPTO_rsa_unblind (blind_sig,
+                                   &ps->blinding_key.bks,
+                                   dk->rsa_public_key);
+  if (GNUNET_OK !=
+      GNUNET_CRYPTO_rsa_verify (c_hash,
+                                sig,
+                                dk->rsa_public_key))
+  {
+    GNUNET_break_op (0);
+    GNUNET_CRYPTO_rsa_signature_free (sig);
+    return GNUNET_SYSERR;
+  }
+  coin->sig.rsa_signature = sig;
+  coin->coin_priv = ps->coin_priv;
+  return GNUNET_OK;
+}
 
 /* end of crypto.c */
diff --git a/src/util/test_crypto.c b/src/util/test_crypto.c
index f28ae80..4713b3a 100644
--- a/src/util/test_crypto.c
+++ b/src/util/test_crypto.c
@@ -40,8 +40,8 @@ test_high_level ()
   struct TALER_TransferPublicKeyP trans_pub;
   struct TALER_TransferSecretP secret;
   struct TALER_TransferSecretP secret2;
-  struct TALER_FreshCoinP fc1;
-  struct TALER_FreshCoinP fc2;
+  struct TALER_PlanchetSecretsP fc1;
+  struct TALER_PlanchetSecretsP fc2;
 
   pk = GNUNET_CRYPTO_eddsa_key_create ();
   coin_priv.eddsa_priv = *pk;
@@ -70,16 +70,57 @@ test_high_level ()
                 memcmp (&secret,
                         &secret2,
                         sizeof (secret)));
-  TALER_setup_fresh_coin (&secret,
-                          0,
-                          &fc1);
-  TALER_setup_fresh_coin (&secret,
-                          1,
-                          &fc2);
+  TALER_planchet_setup_refresh (&secret,
+                                0,
+                                &fc1);
+  TALER_planchet_setup_refresh (&secret,
+                                1,
+                                &fc2);
   GNUNET_assert (0 !=
                  memcmp (&fc1,
                          &fc2,
-                         sizeof (struct TALER_FreshCoinP)));
+                         sizeof (struct TALER_PlanchetSecretsP)));
+  return 0;
+}
+
+
+/**
+ * Test the basic planchet functionality of creating a fresh planchet
+ * and extracting the respective signature.
+ *
+ * @return 0 on success
+ */
+static int
+test_planchets ()
+{
+  struct TALER_PlanchetSecretsP ps;
+  struct TALER_DenominationPrivateKey dk_priv;
+  struct TALER_DenominationPublicKey dk_pub;
+  struct TALER_PlanchetDetail pd;
+  struct GNUNET_CRYPTO_RsaSignature *blind_sig;
+  struct TALER_FreshCoin coin;
+
+  dk_priv.rsa_private_key = GNUNET_CRYPTO_rsa_private_key_create (1024);
+  dk_pub.rsa_public_key = GNUNET_CRYPTO_rsa_private_key_get_public 
(dk_priv.rsa_private_key);
+  TALER_planchet_setup_random (&ps);
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_planchet_prepare (&dk_pub,
+                                         &ps,
+                                         &pd));
+  blind_sig = GNUNET_CRYPTO_rsa_sign_blinded (dk_priv.rsa_private_key,
+                                              pd.coin_ev,
+                                              pd.coin_ev_size);
+  GNUNET_assert (NULL != blind_sig);
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_planchet_to_coin (&dk_pub,
+                                         blind_sig,
+                                         &ps,
+                                         &pd.c_hash,
+                                         &coin));
+  GNUNET_CRYPTO_rsa_signature_free (blind_sig);
+  GNUNET_CRYPTO_rsa_signature_free (coin.sig.rsa_signature);
+  GNUNET_CRYPTO_rsa_private_key_free (dk_priv.rsa_private_key);
+  GNUNET_CRYPTO_rsa_public_key_free (dk_pub.rsa_public_key);
   return 0;
 }
 
@@ -90,6 +131,8 @@ main(int argc,
 {
   if (0 != test_high_level ())
     return 1;
+  if (0 != test_planchets ())
+    return 1;
   return 0;
 }
 
diff --git a/src/wire/Makefile.am b/src/wire/Makefile.am
index f8fb9d0..5f65146 100644
--- a/src/wire/Makefile.am
+++ b/src/wire/Makefile.am
@@ -75,7 +75,7 @@ libtalerwire_la_LIBADD = \
   -lgnunetutil \
   $(XLIB)
 libtalerwire_la_LDFLAGS = \
-  -version-info 0:0:0 \
+  -version-info 1:0:0 \
   -export-dynamic -no-undefined
 
 
diff --git a/src/wire/plugin_wire_sepa.c b/src/wire/plugin_wire_sepa.c
index 5de3472..416acac 100644
--- a/src/wire/plugin_wire_sepa.c
+++ b/src/wire/plugin_wire_sepa.c
@@ -791,6 +791,107 @@ sepa_get_history_cancel (void *cls,
 }
 
 
+
+/**
+ * Context for a rejection operation.
+ */
+struct TALER_WIRE_RejectHandle
+{
+  /**
+   * Function to call with the result.
+   */
+  TALER_WIRE_RejectTransferCallback rej_cb;
+
+  /**
+   * Closure for @e rej_cb.
+   */
+  void *rej_cb_cls;
+
+  /**
+   * Handle to task for timeout of operation.
+   */
+  struct GNUNET_SCHEDULER_Task *timeout_task;
+};
+
+
+/**
+ * Rejection operation failed with timeout, notify callback
+ * and clean up.
+ *
+ * @param cls closure with `struct TALER_WIRE_RejectHandle`
+ */
+static void
+timeout_reject (void *cls)
+{
+  struct TALER_WIRE_RejectHandle *rh = cls;
+
+  rh->timeout_task = NULL;
+  rh->rej_cb (rh->rej_cb_cls,
+              TALER_EC_NOT_IMPLEMENTED /* in the future: TALER_EC_TIMEOUT */);
+  GNUNET_free (rh);
+}
+
+
+/**
+ * Reject an incoming wire transfer that was obtained from the
+ * history. This function can be used to transfer funds back to
+ * the sender if the WTID was malformed (i.e. due to a typo).
+ *
+ * Calling `reject_transfer` twice on the same wire transfer should
+ * be idempotent, i.e. not cause the funds to be wired back twice.
+ * Furthermore, the transfer should henceforth be removed from the
+ * results returned by @e get_history.
+ *
+ * @param cls plugin's closure
+ * @param start_off offset of the wire transfer in plugin-specific format
+ * @param start_off_len number of bytes in @a start_off
+ * @param rej_cb function to call with the result of the operation
+ * @param rej_cb_cls closure for @a rej_cb
+ * @return handle to cancel the operation
+ */
+static struct TALER_WIRE_RejectHandle *
+sepa_reject_transfer (void *cls,
+                      const void *start_off,
+                      size_t start_off_len,
+                      TALER_WIRE_RejectTransferCallback rej_cb,
+                      void *rej_cb_cls)
+{
+  struct TALER_WIRE_RejectHandle *rh;
+
+  GNUNET_break (0); /* not implemented, just a stub! */
+  rh = GNUNET_new (struct TALER_WIRE_RejectHandle);
+  rh->rej_cb = rej_cb;
+  rh->rej_cb_cls = rej_cb_cls;
+  rh->timeout_task = GNUNET_SCHEDULER_add_now (&timeout_reject,
+                                               rh);
+  return rh;
+}
+
+
+/**
+ * Cancel ongoing reject operation.  Note that the rejection may still
+ * proceed. Basically, if this function is called, the rejection may
+ * have happened or not.  This function is usually used during shutdown
+ * or system upgrades.  At a later point, the application must call
+ * @e reject_transfer again for this wire transfer, unless the
+ * @e get_history shows that the wire transfer no longer exists.
+ *
+ * @param cls plugins' closure
+ * @param rh operation to cancel
+ * @return closure of the callback of the operation
+ */
+static void *
+sepa_reject_transfer_cancel (void *cls,
+                             struct TALER_WIRE_RejectHandle *rh)
+{
+  void *ret = rh->rej_cb_cls;
+
+  GNUNET_SCHEDULER_cancel (rh->timeout_task);
+  GNUNET_free (rh);
+  return ret;
+}
+
+
 /**
  * Initialize sepa-wire subsystem.
  *
@@ -832,6 +933,8 @@ libtaler_plugin_wire_sepa_init (void *cls)
   plugin->execute_wire_transfer_cancel = &sepa_execute_wire_transfer_cancel;
   plugin->get_history = &sepa_get_history;
   plugin->get_history_cancel = &sepa_get_history_cancel;
+  plugin->reject_transfer = &sepa_reject_transfer;
+  plugin->reject_transfer_cancel = &sepa_reject_transfer_cancel;
   return plugin;
 }
 
diff --git a/src/wire/plugin_wire_test.c b/src/wire/plugin_wire_test.c
index c41bd7e..1a7443b 100644
--- a/src/wire/plugin_wire_test.c
+++ b/src/wire/plugin_wire_test.c
@@ -820,60 +820,72 @@ bhist_cb (void *cls,
   uint64_t bserial_id = GNUNET_htonll (serial_id);
   struct TALER_WIRE_TransferDetails wd;
 
-  if (MHD_HTTP_OK == http_status)
-  {
-    char *subject;
-    char *space;
-
-    wd.amount = details->amount;
-    wd.execution_date = details->execution_date;
-    subject = GNUNET_strdup (details->wire_transfer_subject);
-    space = strchr (subject, (int) ' ');
-    if (NULL != space)
-    {
-      /* Space separates the actual wire transfer subject from the
-         exchange base URL (if present, expected only for outgoing
-         transactions).  So we cut the string off at the space. */
-      *space = '\0';
-    }
-    /* NOTE: For a real bank, the subject should include a checksum! */
-    if (GNUNET_OK !=
-        GNUNET_STRINGS_string_to_data (subject,
-                                       strlen (subject),
-                                       &wd.reserve_pub,
-                                       sizeof (wd.reserve_pub)))
+  switch (http_status) {
+  case MHD_HTTP_OK:
     {
-      GNUNET_break (0);
+      char *subject;
+      char *space;
+
+      wd.amount = details->amount;
+      wd.execution_date = details->execution_date;
+      subject = GNUNET_strdup (details->wire_transfer_subject);
+      space = strchr (subject, (int) ' ');
+      if (NULL != space)
+      {
+        /* Space separates the actual wire transfer subject from the
+           exchange base URL (if present, expected only for outgoing
+           transactions).  So we cut the string off at the space. */
+        *space = '\0';
+      }
+      /* NOTE: For a real bank, the subject should include a checksum! */
+      if (GNUNET_OK !=
+          GNUNET_STRINGS_string_to_data (subject,
+                                         strlen (subject),
+                                         &wd.wtid,
+                                         sizeof (wd.wtid)))
+      {
+        /* Ill-formed wire subject, set binary version to all zeros
+           and pass as a string, this time including the part after
+           the space. */
+        memset (&wd.wtid,
+                0,
+                sizeof (wd.wtid));
+        wd.wtid_s = details->wire_transfer_subject;
+      }
       GNUNET_free (subject);
-      /* NOTE: for a "real" bank, we would want to trigger logic to undo the
-         wire transfer. However, for the "demo" bank, it should currently
-         be "impossible" to do wire transfers with invalid subjects, and
-         equally we thus don't need to undo them (and there is no API to do
-         that nicely either right now). So we don't handle this case for now. 
*/
-      return;
+      wd.account_details = details->account_details;
+
+      if ( (NULL != whh->hres_cb) &&
+           (GNUNET_OK !=
+            whh->hres_cb (whh->hres_cb_cls,
+                          dir,
+                          &bserial_id,
+                          sizeof (bserial_id),
+                          &wd)) )
+        whh->hres_cb = NULL;
+      break;
     }
-    GNUNET_free (subject);
-    wd.account_details = details->account_details;
-
-    if ( (NULL != whh->hres_cb) &&
-        (GNUNET_OK !=
-         whh->hres_cb (whh->hres_cb_cls,
-                       dir,
-                       &bserial_id,
-                       sizeof (bserial_id),
-                       &wd)) )
-      whh->hres_cb = NULL;
-  }
-  else
-  {
+  case MHD_HTTP_NO_CONTENT:
+    if (NULL != whh->hres_cb)
+      (void) whh->hres_cb (whh->hres_cb_cls,
+                           TALER_BANK_DIRECTION_NONE,
+                           NULL,
+                           0,
+                           NULL);
+    GNUNET_free (whh);
+    break;
+  default:
+    /* FIXME: consider modifying API to pass more specific error code(s)
+       back to the application. */
+    GNUNET_break (0);
     if (NULL != whh->hres_cb)
       (void) whh->hres_cb (whh->hres_cb_cls,
                            TALER_BANK_DIRECTION_NONE,
                            NULL,
                            0,
                            NULL);
-    whh->hh = NULL;
     GNUNET_free (whh);
+    break;
   }
 }
 
@@ -956,6 +968,7 @@ test_get_history (void *cls,
     GNUNET_free (whh);
     return NULL;
   }
+
   return whh;
 }
 
@@ -976,6 +989,106 @@ test_get_history_cancel (void *cls,
 
 
 /**
+ * Context for a rejection operation.
+ */
+struct TALER_WIRE_RejectHandle
+{
+  /**
+   * Function to call with the result.
+   */
+  TALER_WIRE_RejectTransferCallback rej_cb;
+
+  /**
+   * Closure for @e rej_cb.
+   */
+  void *rej_cb_cls;
+
+  /**
+   * Handle to task for timeout of operation.
+   */
+  struct GNUNET_SCHEDULER_Task *timeout_task;
+};
+
+
+/**
+ * Rejection operation failed with timeout, notify callback
+ * and clean up.
+ *
+ * @param cls closure with `struct TALER_WIRE_RejectHandle`
+ */
+static void
+timeout_reject (void *cls)
+{
+  struct TALER_WIRE_RejectHandle *rh = cls;
+
+  rh->timeout_task = NULL;
+  rh->rej_cb (rh->rej_cb_cls,
+              TALER_EC_NOT_IMPLEMENTED /* in the future: TALER_EC_TIMEOUT */);
+  GNUNET_free (rh);
+}
+
+
+/**
+ * Reject an incoming wire transfer that was obtained from the
+ * history. This function can be used to transfer funds back to
+ * the sender if the WTID was malformed (i.e. due to a typo).
+ *
+ * Calling `reject_transfer` twice on the same wire transfer should
+ * be idempotent, i.e. not cause the funds to be wired back twice.
+ * Furthermore, the transfer should henceforth be removed from the
+ * results returned by @e get_history.
+ *
+ * @param cls plugin's closure
+ * @param start_off offset of the wire transfer in plugin-specific format
+ * @param start_off_len number of bytes in @a start_off
+ * @param rej_cb function to call with the result of the operation
+ * @param rej_cb_cls closure for @a rej_cb
+ * @return handle to cancel the operation
+ */
+static struct TALER_WIRE_RejectHandle *
+test_reject_transfer (void *cls,
+                      const void *start_off,
+                      size_t start_off_len,
+                      TALER_WIRE_RejectTransferCallback rej_cb,
+                      void *rej_cb_cls)
+{
+  struct TALER_WIRE_RejectHandle *rh;
+
+  GNUNET_break (0); /* not implemented, just a stub! */
+  rh = GNUNET_new (struct TALER_WIRE_RejectHandle);
+  rh->rej_cb = rej_cb;
+  rh->rej_cb_cls = rej_cb_cls;
+  rh->timeout_task = GNUNET_SCHEDULER_add_now (&timeout_reject,
+                                               rh);
+  return rh;
+}
+
+
+/**
+ * Cancel ongoing reject operation.  Note that the rejection may still
+ * proceed. Basically, if this function is called, the rejection may
+ * have happened or not.  This function is usually used during shutdown
+ * or system upgrades.  At a later point, the application must call
+ * @e reject_transfer again for this wire transfer, unless the
+ * @e get_history shows that the wire transfer no longer exists.
+ *
+ * @param cls plugins' closure
+ * @param rh operation to cancel
+ * @return closure of the callback of the operation
+ */
+static void *
+test_reject_transfer_cancel (void *cls,
+                             struct TALER_WIRE_RejectHandle *rh)
+{
+  void *ret = rh->rej_cb_cls;
+
+  GNUNET_SCHEDULER_cancel (rh->timeout_task);
+  GNUNET_free (rh);
+  return ret;
+}
+
+
+/**
  * Initialize test-wire subsystem.
  *
  * @param cls a configuration instance
@@ -1087,6 +1200,8 @@ libtaler_plugin_wire_test_init (void *cls)
   plugin->execute_wire_transfer_cancel = &test_execute_wire_transfer_cancel;
   plugin->get_history = &test_get_history;
   plugin->get_history_cancel = &test_get_history_cancel;
+  plugin->reject_transfer = &test_reject_transfer;
+  plugin->reject_transfer_cancel = &test_reject_transfer_cancel;
   return plugin;
 }
 
diff --git a/src/wire/test_wire_plugin_transactions_test.c 
b/src/wire/test_wire_plugin_transactions_test.c
index ce31e99..26331b5 100644
--- a/src/wire/test_wire_plugin_transactions_test.c
+++ b/src/wire/test_wire_plugin_transactions_test.c
@@ -211,9 +211,8 @@ history_result_cb (void *cls,
     return GNUNET_SYSERR;
   }
   if (0 != memcmp (&wtid,
-                   &details->reserve_pub,
-                   GNUNET_MIN (sizeof (struct TALER_ReservePublicKeyP),
-                               sizeof (wtid))))
+                   &details->wtid,
+                   sizeof (struct TALER_WireTransferIdentifierRawP)))
   {
     GNUNET_break (0);
     global_ret = GNUNET_SYSERR;

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

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