From a8b8258e12f8e04936bffd82a2e31be7117ec860 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 21 Mar 2020 12:56:16 +0100 Subject: steps towards new split-auditor logic --- contrib/auditor-report.tex.j2 | 326 ++++++++++++++++++++++++++++++------------ contrib/render.py | 14 +- 2 files changed, 247 insertions(+), 93 deletions(-) (limited to 'contrib') diff --git a/contrib/auditor-report.tex.j2 b/contrib/auditor-report.tex.j2 index 28c40f88d..ccb249dd3 100644 --- a/contrib/auditor-report.tex.j2 +++ b/contrib/auditor-report.tex.j2 @@ -64,51 +64,58 @@ 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/}. -The report was generated by the auditor started at -{\bf {{ data.auditor_start_time }} } and concluded at -{\bf {{ data.auditor_end_time }} }. +The report was generated by the auditors at the following times: -In that time, the auditor processed the following table ranges: +\begin{table}[h!] +\begin{center} +\begin{tabular}{l|r|r} + Auditor & Start & End \\ \hline \hline + Aggregation & {{ aggregation.auditor_start_time }} & {{ aggregation.auditor_end_time }} \\ \hline + Coins & {{ coins.auditor_start_time }} & {{ coins.auditor_end_time }} \\ \hline + Deposits & {{ deposits.auditor_start_time }} & {{ deposits.auditor_end_time }} \\ \hline + Reserves & {{ reserves.auditor_start_time }} & {{ reserves.auditor_end_time }} \\ \hline + Wire & {{ wire.wire_auditor_start_time }} & {{ wire.wire_auditor_end_time }} \\ +\end{tabular} +\end{center} +\end{table} + +In that time, the auditors processed the following table ranges: \begin{table}[h!] \begin{center} \begin{tabular}{l|r|r} Table & Start & End \\ \hline \hline - Reserves Incoming & {{ data.start_ppr_reserve_in_serial_id }} - & {{ data.end_ppr_reserve_in_serial_id }} \\ \hline - Reserves Out (withdraw) & {{ data.start_ppr_reserve_out_serial_id }} - & {{ data.end_ppr_reserve_out_serial_id }} \\ \hline - Reserves Recoup & {{ data.start_ppr_reserve_recoup_serial_id }} - & {{ data.end_ppr_reserve_recoup_serial_id }} \\ \hline - Reserves Close & {{ data.start_ppr_reserve_close_serial_id }} - & {{ data.end_ppr_reserve_close_serial_id }} \\ \hline - Aggregation & {{ data.start_ppa_wire_out_serial_id }} - & {{ data.end_ppa_wire_out_serial_id }} \\ \hline - Coin withdraw & {{ data.start_ppc_withdraw_serial_id }} - & {{ data.end_ppc_withdraw_serial_id }} \\ \hline - Coin deposit & {{ data.start_ppc_deposit_serial_id }} - & {{ data.end_ppc_deposit_serial_id }} \\ \hline - Coin melt & {{ data.start_ppc_melt_serial_id }} - & {{ data.end_ppc_melt_serial_id }} \\ \hline - Coin refund & {{ data.start_ppc_refund_serial_id }} - & {{ data.end_ppc_refund_serial_id }} \\ \hline - Coin recoup & {{ data.start_ppc_recoup_serial_id }} - & {{ data.end_ppc_recoup_serial_id }} \\ \hline - Coin recoup refresh & {{ data.start_ppc_recoup_refresh_serial_id }} - & {{ data.end_ppc_recoup_refresh_serial_id }} \\ + Reserves Incoming & {{ reserves.start_ppr_reserve_in_serial_id }} + & {{ reserves.end_ppr_reserve_in_serial_id }} \\ \hline + Reserves Out (withdraw) & {{ reserves.start_ppr_reserve_out_serial_id }} + & {{ reserves.end_ppr_reserve_out_serial_id }} \\ \hline + Reserves Recoup & {{ reserves.start_ppr_reserve_recoup_serial_id }} + & {{ reserves.end_ppr_reserve_recoup_serial_id }} \\ \hline + Reserves Close & {{ reserves.start_ppr_reserve_close_serial_id }} + & {{ reserves.end_ppr_reserve_close_serial_id }} \\ \hline + Aggregation & {{ aggregation.start_ppa_wire_out_serial_id }} + & {{ aggregation.end_ppa_wire_out_serial_id }} \\ \hline + Coin withdraw & {{ coins.start_ppc_withdraw_serial_id }} + & {{ coins.end_ppc_withdraw_serial_id }} \\ \hline + Coin deposit & {{ coins.start_ppc_deposit_serial_id }} + & {{ coins.end_ppc_deposit_serial_id }} \\ \hline + Coin melt & {{ coins.start_ppc_melt_serial_id }} + & {{ coins.end_ppc_melt_serial_id }} \\ \hline + Coin refund & {{ coins.start_ppc_refund_serial_id }} + & {{ coins.end_ppc_refund_serial_id }} \\ \hline + Coin recoup & {{ coins.start_ppc_recoup_serial_id }} + & {{ coins.end_ppc_recoup_serial_id }} \\ \hline + Coin recoup refresh & {{ coins.start_ppc_recoup_refresh_serial_id }} + & {{ coins.end_ppc_recoup_refresh_serial_id }} \\ \end{tabular} \end{center} \caption{Serial number ranges of the tables processed by the audit.} \label{table:auditor_range} \end{table} -The report was generated by the wire auditor started at -{\bf {{ wire.wire_auditor_start_time }} } and concluded at -{\bf {{ wire.wire_auditor_end_time }} }. - {% if wire.account_progress|length() == 0 %} -In that time, the auditor processed NO accounts at all. +In that time, the wire auditor processed NO accounts at all. {% else %} -In that time, the auditor processed the following table ranges: +In that time, the wire auditor processed the following table ranges: \begin{center} \begin{longtable}{l|c|r|r} Account & Table & Start & End \\ \hline @@ -136,19 +143,21 @@ In that time, the auditor processed the following table ranges: \section{Operations} The balance of the escrow account should -be {\bf {{ data.total_escrow_balance }}}. +be {\bf {{ coins.total_escrow_balance }}} (coins) +plus {\bf {{ reserves.total_escrow_balance }}} (reserves). \noindent The active operational risk stands at -{\bf {{ data.total_active_risk }}}. +{\bf {{ coins.total_active_risk }}}. \noindent Loss (actualized risk from recoups) is -{\bf {{ data.total_recoup_loss }}}. +{\bf {{ coins.total_recoup_loss }}}. \noindent Recoups of non-revoked coins are at -{\bf {{ data.total_irregular_recoups }}}. +{\bf {{ coins.total_irregular_recoups }}} (coins) +plus {\bf {{ reserves.total_irregular_recoups }}} (reserves). \section{Income} @@ -160,12 +169,11 @@ This section analyzes the income of the exchange operator from fees. \label{table:revenue} \begin{tabular}{l|r} Category & Amount \\ \hline \hline - Withdraw fees & {{ data.total_withdraw_fee_income }} \\ - Deposit fees & {{ data.total_deposit_fee_income }} \\ - Melt fees & {{ data.total_melt_fee_income }} \\ - Refund fees & {{ data.total_refund_fee_income }} \\ - Aggregation fees & {{ data.total_aggregation_fee_income }} \\ \hline \hline - {\bf Total} & {{ data.income_fee_total }} \\ + Withdraw fees & {{ reserves.total_withdraw_fee_income }} \\ + Deposit fees & {{ coins.total_deposit_fee_income }} \\ + Melt fees & {{ coins.total_melt_fee_income }} \\ + Refund fees & {{ coins.total_refund_fee_income }} \\ + Aggregation fees & {{ aggregation.total_aggregation_fee_income }} \\ \end{tabular} \end{center} \end{table} @@ -297,15 +305,15 @@ and should be answered by revoking the exchange's online siging keys. % TODO: maybe reference PhD thesis on this? The total amount the exchange currently lags behind is -{\bf {{ data.missing_deposit_confirmation_total }} } from a total number of -{\bf {{ data.missing_deposit_confirmation_count }} } deposit confirmations. +{\bf {{ deposits.missing_deposit_confirmation_total }} } from a total number of +{\bf {{ deposits.missing_deposit_confirmation_count }} } deposit confirmations. Note that some lag is perfectly normal. Below, we report {\em all} deposit confirmations that are lagging behind. % Table generation tested by testcase #24 in test-auditor.sh -{% if data.deposit_confirmation_inconsistencies|length() == 0 %} +{% if deposits.deposit_confirmation_inconsistencies|length() == 0 %} {\bf No deposit confirmations that are lagging behind detected.} {% else %} \begin{longtable}{r|r|r} @@ -325,7 +333,7 @@ Below, we report {\em all} deposit confirmations that are lagging behind. \caption{Missing deposit confirmations.} \label{table:missing_dc} \endlastfoot -{% for item in data.deposit_confirmation_inconsistencies %} +{% for item in deposits.deposit_confirmation_inconsistencies %} {{ item.timestamp }} & {{ item.amount }} & {{ item.rowid }} \\ @@ -355,18 +363,18 @@ exposure} is the amount of coins in circulation for a particular denomination and the maximum loss for the exchange from this type of compromise. -{% if (data.emergencies|length() != 0) %} +{% if (coins.emergencies|length() != 0) %} The total risk from emergencies detected by amount is -{\bf {{ data.emergencies_risk_by_amount }} }. +{\bf {{ coins.emergencies_risk_by_amount }} }. The total loss from emergencies detected by amount is -{\bf {{ data.emergencies_loss }} }. +{\bf {{ coins.emergencies_loss }} }. {% endif %} -{% if (data.emergencies_by_count|length() != 0) %} +{% if (coins.emergencies_by_count|length() != 0) %} The total risk from emergencies detected by counting coins is -{\bf {{ data.emergencies_risk_by_count }} } +{\bf {{ coins.emergencies_risk_by_count }} } The total loss from emergencies detected by counting coins could be up to -{\bf {{ data.emergencies_loss_by_count }} }. +{\bf {{ coins.emergencies_loss_by_count }} }. {% endif %} @@ -374,7 +382,7 @@ The total loss from emergencies detected by counting coins could be up to % Table generation tested by testcase #18 in test-auditor.sh -{% if data.emergencies_by_count|length() == 0 %} +{% if coins.emergencies_by_count|length() == 0 %} {\bf No emergencies detected by counting coins.} {% else %} \begin{longtable}{r|c|r|r} @@ -391,7 +399,7 @@ The total loss from emergencies detected by counting coins could be up to \caption{Emergencies by counting coins.} \label{table:emergencies_coin_counting} \endlastfoot -{% for item in data.emergencies_by_count %} +{% for item in coins.emergencies_by_count %} \multicolumn{4}{l}{ {\tt \truncate{0.95\textwidth}{ {{ item.denompub_hash }} } } } \\ \nopagebreak {{ item.value }} & @@ -416,7 +424,7 @@ indicator that the exchange's private signing key was compromised. % Table generation tested by testcases #18, #25 in test-auditor.sh -{% if data.emergencies|length() == 0 %} +{% if coins.emergencies|length() == 0 %} {\bf No emergencies by value detected.} {% else %} \begin{longtable}{r|c|r|r} @@ -433,7 +441,7 @@ indicator that the exchange's private signing key was compromised. \caption{Emergencies by value deposited.} \label{table:emergencies} \endlastfoot -{% for item in data.emergencies %} +{% for item in coins.emergencies %} \multicolumn{4}{l}{ {\tt \truncate{0.95\textwidth}{ {{ item.denompub_hash }} } } } \\ \nopagebreak {{ item.value }} & @@ -504,7 +512,7 @@ compromise resulting in proportional financial losses to the exchange. % Table generation tested by testcase #2 in test-auditor.sh -{% if data.reserve_balance_insufficient_inconsistencies|length() == 0 %} +{% if reserves.reserve_balance_insufficient_inconsistencies|length() == 0 %} {\bf All withdrawals were covered by sufficient reserve funding.} {% else %} \begin{longtable}{p{8.5cm}|r} @@ -517,11 +525,11 @@ compromise resulting in proportional financial losses to the exchange. \endfoot \hline {\bf Total loss} & - {{ data.total_loss_balance_insufficient }} \\ + {{ reserves.total_loss_balance_insufficient }} \\ \caption{Reserves with withdrawals higher than reserve funding.} \label{table:reserve:balance_insufficient} \endlastfoot -{% for item in data.reserve_balance_insufficient_inconsistencies %} +{% for item in reserves.reserve_balance_insufficient_inconsistencies %} {\tt \small {{ item.reserve_pub }} } & {{ item.loss }} \\ \hline @@ -543,7 +551,7 @@ would be reported separately in Section~\ref{sec:wire_check_out}. % Table generation tested by testcase #23 in test-auditor.sh -{% if data.wire_out_inconsistencies|length() == 0 %} +{% if aggregation.wire_out_inconsistencies|length() == 0 %} {\bf All aggregations matched up.} {% else %} \begin{longtable}{r|r|r} @@ -559,12 +567,12 @@ would be reported separately in Section~\ref{sec:wire_check_out}. \endfoot \hline {\bf Total deltas} & - {{ data.total_wire_out_delta_plus}} & - - {{ data.total_wire_out_delta_minus}} \\ + {{ aggregation.total_wire_out_delta_plus}} & + - {{ aggregation.total_wire_out_delta_minus}} \\ \caption{Claimed wire out aggregate totals not matching up.} \label{table:reserve:wire_out_balance_inconsistencies} \endlastfoot -{% for item in data.wire_out_inconsistencies %} +{% for item in aggregation.wire_out_inconsistencies %} \multicolumn{3}{l}{ {\tt \truncate{0.95\textwidth}{ {% if 'payto_uri' in item.destination_account %} {{ item.destination_account.payto_uri }} @@ -589,7 +597,7 @@ any effects on its own balance, those entries are excluded from the total. % Table generation tested by testcase #25 in test-auditor.sh -{% if data.coin_inconsistencies|length() == 0 %} +{% if aggregation.coin_inconsistencies|length() == 0 %} {\bf All coin histories were unproblematic.} {% else %} \begin{longtable}{p{1.8cm}|r|r} @@ -607,12 +615,12 @@ any effects on its own balance, those entries are excluded from the total. \endfoot \hline $\sum$ {\bf Delta (Auditor-Exchange)} & - {{ data.total_coin_delta_plus }} & - - {{ data.total_coin_delta_minus }} \\ + {{ aggregation.total_coin_delta_plus }} & + - {{ aggregation.total_coin_delta_minus }} \\ \caption{Arithmetic inconsistencies of amount calculations involving a coin.} \label{table:amount:arithmetic:coin:inconsistencies} \endlastfoot -{% for item in data.coin_inconsistencies %} +{% for item in aggregation.coin_inconsistencies %} {{ item.operation }} & \multicolumn{2}{l}{ {\tt \small {{ item.coin_pub }} } } \\ \nopagebreak & @@ -637,9 +645,81 @@ the (hash of the) denomination public key for ``recoup-verify'' and ``deposit-verify'' operations, and the master public key for ``recoup-master'' operations. -% Table generation tested by testcase #4/#5/#6/#7/#13 in test-auditor.sh +\subsubsection{For aggregations} + +% Table generation tested by testcase #XX in test-auditor.sh + +{% if aggregation.bad_sig_losses|length() == 0 %} + {\bf All signatures were valid.} +{% else %} + \begin{longtable}{l|r|r} + \multicolumn{3}{l}{ {\bf Public key} }\\ + {\bf Operation type} & Database row & {\bf Loss amount} \\ + \hline \hline +\endfirsthead + \multicolumn{3}{l}{ {\bf Public key} }\\ + {\bf Operation type} & Database row & {\bf Loss amount} \\ \hline \hline +\endhead + \hline \hline + \multicolumn{3}{l}{ {\bf Public key} }\\ + {\bf Operation type} & Database row & {\bf Loss amount} \\ +\endfoot + \hline + \multicolumn{2}{l}{ {\bf Total losses} } & + {\bf {{ aggregation.total_bad_sig_loss}} } \\ + \caption{Losses from operations performed on coins without proper signatures.} + \label{table:bad_signature_losses} +\endlastfoot +{% for item in aggregation.bad_sig_losses %} + \multicolumn{3}{l}{ {\tt \small \truncate{0.9\textwidth}{ {{ item.key_pub }} } } } \\ +\nopagebreak + {{ item.operation }} & + {{ item.row }} & + {{ item.loss }} \\ \hline +{% endfor %} + \end{longtable} +{% endif %} + +\subsubsection{For coins} + +% Table generation tested by testcase #4/#5/#6/#13 in test-auditor.sh + +{% if coins.bad_sig_losses|length() == 0 %} + {\bf All signatures were valid.} +{% else %} + \begin{longtable}{l|r|r} + \multicolumn{3}{l}{ {\bf Public key} }\\ + {\bf Operation type} & Database row & {\bf Loss amount} \\ + \hline \hline +\endfirsthead + \multicolumn{3}{l}{ {\bf Public key} }\\ + {\bf Operation type} & Database row & {\bf Loss amount} \\ \hline \hline +\endhead + \hline \hline + \multicolumn{3}{l}{ {\bf Public key} }\\ + {\bf Operation type} & Database row & {\bf Loss amount} \\ +\endfoot + \hline + \multicolumn{2}{l}{ {\bf Total losses} } & + {\bf {{ coins.total_bad_sig_loss}} } \\ + \caption{Losses from operations performed on coins without proper signatures.} + \label{table:bad_signature_losses} +\endlastfoot +{% for item in coins.bad_sig_losses %} + \multicolumn{3}{l}{ {\tt \small \truncate{0.9\textwidth}{ {{ item.key_pub }} } } } \\ +\nopagebreak + {{ item.operation }} & + {{ item.row }} & + {{ item.loss }} \\ \hline +{% endfor %} + \end{longtable} +{% endif %} + +\subsubsection{For reserves} -{% if data.bad_sig_losses|length() == 0 %} +% Table generation tested by testcase #7 in test-auditor.sh + +{% if reserves.bad_sig_losses|length() == 0 %} {\bf All signatures were valid.} {% else %} \begin{longtable}{l|r|r} @@ -656,11 +736,11 @@ public key for ``recoup-master'' operations. \endfoot \hline \multicolumn{2}{l}{ {\bf Total losses} } & - {\bf {{ data.total_bad_sig_loss}} } \\ + {\bf {{ reserves.total_bad_sig_loss}} } \\ \caption{Losses from operations performed on coins without proper signatures.} \label{table:bad_signature_losses} \endlastfoot -{% for item in data.bad_sig_losses %} +{% for item in reserves.bad_sig_losses %} \multicolumn{3}{l}{ {\tt \small \truncate{0.9\textwidth}{ {{ item.key_pub }} } } } \\ \nopagebreak {{ item.operation }} & @@ -826,7 +906,7 @@ translate into a financial loss (yet). % Table generation tested by testcase #3 in test-auditor.sh -{% if data.reserve_balance_summary_wrong_inconsistencies|length() == 0 %} +{% if reserves.reserve_balance_summary_wrong_inconsistencies|length() == 0 %} {\bf All balances matched up.} {% else %} \begin{longtable}{p{6cm}|r|r} @@ -840,12 +920,12 @@ translate into a financial loss (yet). \hline \hline {\bf Total deltas} & - {{ data.total_balance_summary_delta_plus}} & - - {{ data.total_balance_summary_delta_minus}} \\ + {{ reserves.total_balance_summary_delta_plus}} & + - {{ reserves.total_balance_summary_delta_minus}} \\ \caption{Reserves balances not matching up.} \label{table:reserve:balance_inconsistencies} \endlastfoot -{% for item in data.reserve_balance_summary_wrong_inconsistencies %} +{% for item in reserves.reserve_balance_summary_wrong_inconsistencies %} {\tt \tiny {{ item.reserve_pub }} } & {{ item.auditor }} & {{ item.exchange }} \\ \hline @@ -853,16 +933,16 @@ translate into a financial loss (yet). \end{longtable} {% endif %} -{% if data.reserve_balance_summary_wrong_inconsistencies|length() != 0 %} +{% if reserves.reserve_balance_summary_wrong_inconsistencies|length() != 0 %} This means that there are inconsistencies in the exchange's summary data about reserve balances. \begin{itemize} \item The exchange believes some reserves contain (in total) -{\bf {{ data.total_balance_summary_delta_plus}} } {\em less} than they +{\bf {{ reserves.total_balance_summary_delta_plus}} } {\em less} than they actually contain. A non-zero value here means the exchange may deny legitimate withdrawal requests, denying customers access to their funds. \item The exchange believes some reserves contain (in total) -{\bf {{ data.total_balance_summary_delta_minus}} } {\em more} than they +{\bf {{ reserves.total_balance_summary_delta_minus}} } {\em more} than they actually contain. A non-zero value here means the exchange may allow coins to be withdrawn for which it never received any income, at a loss (for the exchange). \end{itemize} @@ -958,7 +1038,7 @@ with respect to what wire fee it charges at what time. % Table generation tested by testcase #14 in test-auditor.sh -{% if data.wire_fee_time_inconsistencies|length() == 0 %} +{% if aggregation.wire_fee_time_inconsistencies|length() == 0 %} {\bf No wire fee timing issues detected.} {% else %} \begin{longtable}{p{1.5cm}|r|p{6}} @@ -976,7 +1056,7 @@ with respect to what wire fee it charges at what time. \caption{Wire fees with ambiguous timestamps.} \label{table:wire_fee:ambiguity} \endlastfoot -{% for item in data.wire_fee_time_inconsistencies %} +{% for item in aggregation.wire_fee_time_inconsistencies %} {\tt {{ item.type }} } & {{ item.time }} & {{ item.diagnostic }} \\ \hline {% endfor %} \end{longtable} @@ -989,9 +1069,71 @@ with respect to what wire fee it charges at what time. This section describes issues found that do not have a clear financial impact. -% Table generation tested by testcase #13/#15/#25 in test-auditor.sh +\subsubsection{For aggregations} + +% Table generation tested by testcase #15/#25 in test-auditor.sh + +{% if aggregation.row_inconsistencies|length() == 0 %} + {\bf No row inconsistencies found.} +{% else %} + \begin{longtable}{p{2.5cm}|l|p{5cm}} + {\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 \hline + {\bf Table} & {\bf Row} & {\bf Diagnostic} \\ + \caption{Other issues found (by table and row).} + \label{table:misc:aggregation} +\endlastfoot +{% for item in aggregation.row_inconsistencies %} + \verb! {{ item.table }} ! & + {{ item.row }} & + {{ item.diagnostic }} \\ \hline +{% endfor %} + \end{longtable} +{% endif %} + +\subsubsection{For coins} + +% Table generation tested by testcase #13 in test-auditor.sh + +{% if coins.row_inconsistencies|length() == 0 %} + {\bf No row inconsistencies found.} +{% else %} + \begin{longtable}{p{2.5cm}|l|p{5cm}} + {\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 \hline + {\bf Table} & {\bf Row} & {\bf Diagnostic} \\ + \caption{Other issues found (by table and row).} + \label{table:misc:coins} +\endlastfoot +{% for item in coins.row_inconsistencies %} + \verb! {{ item.table }} ! & + {{ item.row }} & + {{ item.diagnostic }} \\ \hline +{% endfor %} + \end{longtable} +{% endif %} + +\subsubsection{For reserves} + +% Table generation tested by testcase #XX in test-auditor.sh -{% if data.row_inconsistencies|length() == 0 %} +{% if reserves.row_inconsistencies|length() == 0 %} {\bf No row inconsistencies found.} {% else %} \begin{longtable}{p{2.5cm}|l|p{5cm}} @@ -1007,9 +1149,9 @@ impact. \hline \hline {\bf Table} & {\bf Row} & {\bf Diagnostic} \\ \caption{Other issues found (by table and row).} - \label{table:misc} + \label{table:misc:reserves} \endlastfoot -{% for item in data.row_inconsistencies %} +{% for item in reserves.row_inconsistencies %} \verb! {{ item.table }} ! & {{ item.row }} & {{ item.diagnostic }} \\ \hline @@ -1032,7 +1174,7 @@ reserve expired. % Table generation tested by testcase #20 in test-auditor.sh -{% if data.reserve_not_closed_inconsistencies|length() == 0 %} +{% if reserves.reserve_not_closed_inconsistencies|length() == 0 %} {\bf All expired reserves were closed.} {% else %} \begin{longtable}{p{4.5cm}|c|r} @@ -1045,11 +1187,11 @@ reserve expired. \endfoot \hline {\bf Sum} & & - {{ data.total_balance_reserve_not_closed}} \\ + {{ reserves.total_balance_reserve_not_closed}} \\ \caption{Reserves not closed on time.} \label{table:reserve:not_closed} \endlastfoot -{% for item in data.reserve_not_closed_inconsistencies %} +{% for item in reserves.reserve_not_closed_inconsistencies %} {\tt \tiny \truncate{4.3cm}{ {{ item.reserve_pub }} } } & {\tiny {{ item.expiration_time }} } & {{ item.balance }} \\ \hline @@ -1067,7 +1209,7 @@ may happen even if the exchange is correct. % Table generation tested by testcase #12 in test-auditor.sh -{% if data.refresh_hanging|length() == 0 %} +{% if coins.refresh_hanging|length() == 0 %} {\bf All melted coins were refreshed.} {% else %} \begin{longtable}{p{6.5cm}|c|r} @@ -1082,11 +1224,11 @@ may happen even if the exchange is correct. \endfoot \hline {\bf Sum} & & - {{ data.total_refresh_hanging}} \\ + {{ coins.total_refresh_hanging}} \\ \caption{Refresh operations hanging.} \label{table:refresh:hanging} \endlastfoot -{% for item in data.refresh_hanging %} +{% for item in coins.refresh_hanging %} \truncate{6.2cm}{ {\tt \small {{ item.coin_pub }} } } & {{ item.row }} & {{ item.amount }} \\ \hline @@ -1104,7 +1246,7 @@ implications. % Table generation tested by testcase #22 in test-auditor.sh -{% if data.denomination_key_validity_withdraw_inconsistencies|length() == 0 %} +{% if reserves.denomination_key_validity_withdraw_inconsistencies|length() == 0 %} {\bf All denomination keys were valid at the time of withdrawals.} {% else %} \begin{longtable}{p{7.5cm}|r} @@ -1124,7 +1266,7 @@ implications. \caption{Execution times not matching denomination key validity period.} \label{table:withdraw:bad_time} \endlastfoot -{% for item in data.denomination_key_validity_withdraw_inconsistencies %} +{% for item in reserves.denomination_key_validity_withdraw_inconsistencies %} {\tt \small \truncate{0.6\textwidth}{ {{ item.reserve_pub }} } } & {{ item.row }} \\ \nopagebreak {\tt \small \truncate{0.6\textwidth}{ {{ item.denompub_h }} } } & {{ item.execution_date }} \\ \hline diff --git a/contrib/render.py b/contrib/render.py index 2290e92f8..cd50f7164 100755 --- a/contrib/render.py +++ b/contrib/render.py @@ -36,6 +36,18 @@ jsonData1 = json.load(jsonFile1) jsonFile2 = open (sys.argv[2], 'r') jsonData2 = json.load(jsonFile2) +jsonFile3 = open (sys.argv[3], 'r') +jsonData3 = json.load(jsonFile3) + +jsonFile4 = open (sys.argv[4], 'r') +jsonData4 = json.load(jsonFile4) + +jsonFile5 = open (sys.argv[5], 'r') +jsonData5 = json.load(jsonFile5) + +jsonFile6 = open (sys.argv[6], 'r') +jsonData6 = json.load(jsonFile6) + jinjaEnv = jinja2.Environment(loader=StdinLoader(), lstrip_blocks=True, trim_blocks=True, @@ -43,4 +55,4 @@ jinjaEnv = jinja2.Environment(loader=StdinLoader(), autoescape=False) tmpl = jinjaEnv.get_template('stdin'); -print(tmpl.render(data = jsonData1, wire = jsonData2)) +print(tmpl.render(data = jsonData1, wire = jsonData2, aggregation = jsonData3, coins = jsonData4, deposits = jsonData5, reserves = jsonData6)) -- cgit v1.2.3