From f448e988bbe1697f4bd83561339ce8a675da094f Mon Sep 17 00:00:00 2001
From: Vincent Texier <vit@free.fr>
Date: Sun, 21 Jun 2015 12:06:15 +0200
Subject: [PATCH] New calculation for referentials values and informations tab

Values are based on discrete time t = last UD bloc time
---
 res/i18n/ts/fr_FR.ts                 | 179 ++++++++++++++++-----------
 src/cutecoin/core/account.py         |  21 +---
 src/cutecoin/core/community.py       |  27 +++-
 src/cutecoin/gui/informations_tab.py | 132 ++++++++++++--------
 4 files changed, 216 insertions(+), 143 deletions(-)

diff --git a/res/i18n/ts/fr_FR.ts b/res/i18n/ts/fr_FR.ts
index fdc99c13..9d84768d 100644
--- a/res/i18n/ts/fr_FR.ts
+++ b/res/i18n/ts/fr_FR.ts
@@ -55,37 +55,37 @@
         <translation type="obsolete">du {0}</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/core/account.py" line="103"/>
+        <location filename="../../../src/cutecoin/core/account.py" line="90"/>
         <source>Units</source>
         <translation>Unités</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/core/account.py" line="103"/>
+        <location filename="../../../src/cutecoin/core/account.py" line="90"/>
         <source>UD</source>
         <translation>DU</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/core/account.py" line="103"/>
+        <location filename="../../../src/cutecoin/core/account.py" line="90"/>
         <source>Quant Z-sum</source>
         <translation>Quant. som. 0</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/core/account.py" line="103"/>
+        <location filename="../../../src/cutecoin/core/account.py" line="90"/>
         <source>Relat Z-sum</source>
         <translation>Rel. som. 0</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/core/account.py" line="103"/>
+        <location filename="../../../src/cutecoin/core/account.py" line="90"/>
         <source>UD {0}</source>
         <translation>DU {0}</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/core/account.py" line="103"/>
+        <location filename="../../../src/cutecoin/core/account.py" line="90"/>
         <source>Q0 {0}</source>
         <translation>Q0 {0}</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/core/account.py" line="103"/>
+        <location filename="../../../src/cutecoin/core/account.py" line="90"/>
         <source>R0 {0}</source>
         <translation>R0 {0}</translation>
     </message>
@@ -842,7 +842,7 @@ Revoking your UID can only success if it is not already validated by the network
         <translation></translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="74"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
         <source>
                 &lt;table cellpadding=&quot;5&quot;&gt;
                 &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
@@ -853,7 +853,7 @@ Revoking your UID can only success if it is not already validated by the network
                 &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
                 &lt;/table&gt;
                 </source>
-        <translation>
+        <translation type="obsolete">
                 &lt;table cellpadding=&quot;5&quot;&gt;
                 &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
                 &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
@@ -865,42 +865,42 @@ Revoking your UID can only success if it is not already validated by the network
                 </translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="74"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
         <source>Universal Dividend UD(t) in</source>
         <translation>Dividende Universel DU(t) en</translation>
     </message>
     <message>
         <location filename="../../../src/cutecoin/gui/informations_tab.py" line="74"/>
         <source>Monetary Mass M(t) in</source>
-        <translation>Masse Monétaire M(t) en</translation>
+        <translation type="obsolete">Masse Monétaire M(t) en</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="74"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
         <source>Members N(t)</source>
         <translation>Membres N(t)</translation>
     </message>
     <message>
         <location filename="../../../src/cutecoin/gui/informations_tab.py" line="74"/>
         <source>Monetary Mass per member M(t)/N(t) in</source>
-        <translation>Masse Monétaire par membre M(t)/N(t) en</translation>
+        <translation type="obsolete">Masse Monétaire par membre M(t)/N(t) en</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="72"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
         <source>Actual growth c = UD(t)/[M(t-1)/N(t)]</source>
-        <translation type="obsolete">Croissance actuelle c = DU(t)/[M(t -1)/N(t)]</translation>
+        <translation>Croissance actuelle c = DU(t)/[M(t -1)/N(t)]</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="74"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
         <source>Next UD date and time (t+1)</source>
-        <translation>Prochain DU, date et heure (t+1)</translation>
+        <translation type="unfinished">Date et heure du prochain DU (t+1)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="165"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="191"/>
         <source>No Universal Dividend created yet.</source>
         <translation>Pas de dividende universel créé pour le moment.</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="166"/>
         <source>
                 &lt;table cellpadding=&quot;5&quot;&gt;
                 &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
@@ -911,12 +911,12 @@ Revoking your UID can only success if it is not already validated by the network
         <translation></translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="166"/>
         <source>{:2.0%} / {:} days</source>
         <translation>{:2.0%} / {:} jours</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="166"/>
         <source>Fundamental growth (c) / Delta time (dt)</source>
         <translation>Croissance fondamentale (c) / Delta de temps (dt)</translation>
     </message>
@@ -926,17 +926,17 @@ Revoking your UID can only success if it is not already validated by the network
         <translation type="obsolete">DU(t+1) = MAX { DU(t) ; c * M(t) / N(t) }</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="166"/>
         <source>Universal Dividend (formula)</source>
         <translation>Dividende Universel (formule)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="166"/>
         <source>Universal Dividend (computed)</source>
         <translation>Dividende Universel (calculé)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>
             &lt;table cellpadding=&quot;5&quot;&gt;
             &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:2.0%} / {:} days&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
@@ -963,47 +963,47 @@ Revoking your UID can only success if it is not already validated by the network
             </translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>Fundamental growth (c)</source>
         <translation>Croissance fondamentale (c)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>Initial Universal Dividend UD(0) in</source>
         <translation>Dividende Universel Initial DU(0) en</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>Time period (dt) in days (86400 seconds) between two UD</source>
         <translation>Période de temps (dt) en jours (86400 secondes) entre deux DU</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>Number of blocks used for calculating median time</source>
         <translation>Nombre de blocs utilisés pour calculer le temps median</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>The average time in seconds for writing 1 block (wished time)</source>
         <translation>Le temps moyen en secondes pour écrire un bloc (temps espéré)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>The number of blocks required to evaluate again PoWMin value</source>
         <translation>Le nombre de blocs requis pour évaluer une nouvelle valeur de PoWMin</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>The number of previous blocks to check for personalized difficulty</source>
         <translation>Le nombre de blocs précédents pour vérifier la difficulté personnalisée</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="168"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="194"/>
         <source>The percent of previous issuers to reach for personalized difficulty</source>
         <translation>Le pourcentage d&apos;utilisateurs précédents atteignant la difficulté personnalisée</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="203"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="229"/>
         <source>
             &lt;table cellpadding=&quot;5&quot;&gt;
             &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
@@ -1017,44 +1017,44 @@ Revoking your UID can only success if it is not already validated by the network
         <translation></translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="203"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="229"/>
         <source>Minimum delay between 2 identical certifications (in days)</source>
         <translation>Le délai minimum entre 2 certifications identiques (en jours)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="203"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="229"/>
         <source>Maximum age of a valid signature (in days)</source>
         <translation>Age maximum d&apos;une signature valide (en jours)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="203"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="229"/>
         <source>Minimum quantity of signatures to be part of the WoT</source>
         <translation>Nombre de signatures minimum pour faire partie de la TdC</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="203"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="229"/>
         <source>Minimum quantity of valid made certifications to be part of the WoT for distance rule</source>
         <translation>Quantité minimum de certifications valides pour faire partie de la TdC suivant la règle de distance</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="203"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="229"/>
         <source>Maximum age of a valid membership (in days)</source>
         <translation>Age maximum d&apos;un statut de membre valide (en jours)</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="203"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="229"/>
         <source>Maximum distance between each WoT member and a newcomer</source>
         <translation>Distance maximum entre chaque membre de la TdC et un nouveau venu</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="78"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
         <source>Monetary Mass M(t-1) in</source>
-        <translation type="obsolete">Masse Monétaire M(t-1) en</translation>
+        <translation>Masse Monétaire M(t-1) en</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="78"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
         <source>Monetary Mass per member M(t-1)/N(t) in</source>
-        <translation type="obsolete">Masse Monétaire par membre M(t-1)/N(t) en</translation>
+        <translation>Masse Monétaire par membre M(t-1)/N(t) en</translation>
     </message>
     <message>
         <location filename="../../../src/cutecoin/gui/informations_tab.py" line="127"/>
@@ -1069,7 +1069,7 @@ Revoking your UID can only success if it is not already validated by the network
     <message>
         <location filename="../../../src/cutecoin/gui/informations_tab.py" line="74"/>
         <source>Actual growth c = UD(t)/[M(t-1)/N(t-1)]</source>
-        <translation>Croissance actuelle c = DU(t)/[M(t -1)/N(t-1)]</translation>
+        <translation type="obsolete">Croissance actuelle c = DU(t)/[M(t -1)/N(t-1)]</translation>
     </message>
     <message>
         <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
@@ -1084,18 +1084,53 @@ Revoking your UID can only success if it is not already validated by the network
     <message>
         <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
         <source>UD(t+1) = MAX { UD(t) ; c &amp;#215; M(t) / N(t) }</source>
-        <translation type="unfinished">DU(t+1) = MAX { DU(t) ; c &amp;#215; M(t) / N(t) }</translation>
+        <translation type="obsolete">DU(t+1) = MAX { DU(t) ; c &amp;#215; M(t) / N(t) }</translation>
     </message>
     <message>
-        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="140"/>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="166"/>
         <source>{:} = MAX {{ {:} {:} ; {:2.0%} &amp;#215; {:} {:} / {:} }}</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="166"/>
+        <source>UD(t+1) = MAX { UD(t) ; c &amp;#215; M(t) / N(t+1) }</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
+        <source>
+                &lt;table cellpadding=&quot;5&quot;&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:2.2%} / {:} days&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;/table&gt;
+                </source>
+        <translation>
+                &lt;table cellpadding=&quot;5&quot;&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:2.2%} / {:} jours&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
+                &lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr
+                &lt;/table&gt;
+                </translation>
+    </message>
+    <message>
+        <location filename="../../../src/cutecoin/gui/informations_tab.py" line="121"/>
+        <source>Last UD date and time (t)</source>
+        <translation>Date et heure du dernier DU (t)</translation>
     </message>
 </context>
 <context>
     <name>MainWindow</name>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="148"/>
+        <location filename="../../ui/mainwindow.ui" line="142"/>
         <source>Account</source>
         <translation>Compte</translation>
     </message>
@@ -1110,32 +1145,32 @@ Revoking your UID can only success if it is not already validated by the network
         <translation type="obsolete">Actions</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="88"/>
+        <location filename="../../ui/mainwindow.ui" line="87"/>
         <source>Manage accounts</source>
         <translation>Gérer les comptes</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="93"/>
+        <location filename="../../ui/mainwindow.ui" line="92"/>
         <source>Configure trustable nodes</source>
         <translation>Configurer les noeuds de confiance</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="118"/>
+        <location filename="../../ui/mainwindow.ui" line="117"/>
         <source>Send a message</source>
         <translation>Envoyer un message</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="123"/>
+        <location filename="../../ui/mainwindow.ui" line="122"/>
         <source>Send money</source>
         <translation>Envoyer de l&apos;argent</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="128"/>
+        <location filename="../../ui/mainwindow.ui" line="127"/>
         <source>Remove contact</source>
         <translation>Supprimer un contact</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="138"/>
+        <location filename="../../ui/mainwindow.ui" line="132"/>
         <source>Save</source>
         <translation>Sauvegarder</translation>
     </message>
@@ -1231,19 +1266,19 @@ Revoking your UID can only success if it is not already validated by the network
         <translation>Tout fichier de compte (*.acc)</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="45"/>
+        <location filename="../../ui/mainwindow.ui" line="61"/>
         <source>&amp;Open</source>
         <translation>&amp;Ouvrir</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="63"/>
+        <location filename="../../ui/mainwindow.ui" line="55"/>
         <source>&amp;Contacts</source>
         <translation>&amp;Contacts</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="98"/>
+        <location filename="../../ui/mainwindow.ui" line="97"/>
         <source>&amp;Add a contact</source>
-        <translation type="unfinished">&amp;Ajouter un contact</translation>
+        <translation>&amp;Ajouter un contact</translation>
     </message>
     <message>
         <location filename="../../ui/mainwindow.ui" line="132"/>
@@ -1251,47 +1286,47 @@ Revoking your UID can only success if it is not already validated by the network
         <translation type="obsolete">&amp;Ajouter</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="143"/>
+        <location filename="../../ui/mainwindow.ui" line="137"/>
         <source>&amp;Quit</source>
         <translation>&amp;Quitter</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="153"/>
+        <location filename="../../ui/mainwindow.ui" line="147"/>
         <source>&amp;Transfer money</source>
         <translation>&amp;Transférer de la monnaie</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="158"/>
+        <location filename="../../ui/mainwindow.ui" line="152"/>
         <source>&amp;Configure</source>
         <translation>&amp;Configurer</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="163"/>
+        <location filename="../../ui/mainwindow.ui" line="157"/>
         <source>&amp;Import</source>
         <translation>&amp;Importer</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="168"/>
+        <location filename="../../ui/mainwindow.ui" line="162"/>
         <source>&amp;Export</source>
         <translation>&amp;Exporter</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="173"/>
+        <location filename="../../ui/mainwindow.ui" line="167"/>
         <source>&amp;Certification</source>
         <translation>&amp;Certification</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="178"/>
+        <location filename="../../ui/mainwindow.ui" line="172"/>
         <source>&amp;Set as default</source>
         <translation>&amp;Par défaut</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="183"/>
+        <location filename="../../ui/mainwindow.ui" line="177"/>
         <source>A&amp;bout</source>
         <translation>A &amp;propos</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="188"/>
+        <location filename="../../ui/mainwindow.ui" line="182"/>
         <source>&amp;Preferences</source>
         <translation>&amp;Préférences</translation>
     </message>
@@ -1306,12 +1341,12 @@ Revoking your UID can only success if it is not already validated by the network
         <translation>&amp;Fichier</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="77"/>
+        <location filename="../../ui/mainwindow.ui" line="76"/>
         <source>&amp;Help</source>
         <translation>&amp;Aide</translation>
     </message>
     <message>
-        <location filename="../../ui/mainwindow.ui" line="133"/>
+        <location filename="../../ui/mainwindow.ui" line="187"/>
         <source>&amp;Add account</source>
         <translation>&amp;Ajouter un compte</translation>
     </message>
@@ -2088,17 +2123,17 @@ Veuillez rééssayer plus tard</translation>
         <translation></translation>
     </message>
     <message>
-        <location filename="../../ui/transactions_tab.ui" line="68"/>
+        <location filename="../../ui/transactions_tab.ui" line="100"/>
         <source>Balance:</source>
         <translation>Solde:</translation>
     </message>
     <message>
-        <location filename="../../ui/transactions_tab.ui" line="51"/>
+        <location filename="../../ui/transactions_tab.ui" line="83"/>
         <source>Payment:</source>
         <translation>Paiements:</translation>
     </message>
     <message>
-        <location filename="../../ui/transactions_tab.ui" line="58"/>
+        <location filename="../../ui/transactions_tab.ui" line="90"/>
         <source>Deposit:</source>
         <translation>Dépôts:</translation>
     </message>
diff --git a/src/cutecoin/core/account.py b/src/cutecoin/core/account.py
index 165adb64..7dad16fc 100644
--- a/src/cutecoin/core/account.py
+++ b/src/cutecoin/core/account.py
@@ -41,13 +41,7 @@ def relative(units, community):
     :param cutecoin.core.community.Community community: Community instance
     :return: float
     """
-    # fixme: the value "community.nb_members" is not up to date, luckyly the good value is in "community.get_ud_block()['membersCount']"
-    # calculate ud(t+1)
-    ud = math.ceil(
-        max(community.dividend,
-            community.parameters['c'] * community.monetary_mass / community.get_ud_block()['membersCount'])
-    )
-    relative_value = units / float(ud)
+    relative_value = units / float(community.dividend)
     return relative_value
 
 
@@ -59,7 +53,6 @@ def quantitative_zerosum(units, community):
     :param cutecoin.core.community.Community community: Community instance
     :return: int
     """
-    # fixme: the value "community.nb_members" is not up to date, luckyly the good value is in "community.get_ud_block()['membersCount']"
     average = community.monetary_mass / community.get_ud_block()['membersCount']
     return units - average
 
@@ -72,15 +65,9 @@ def relative_zerosum(units, community):
     :param cutecoin.core.community.Community community: Community instance
     :return: float
     """
-    # fixme: the value "community.nb_members" is not up to date, luckyly the good value is in "community.get_ud_block()['membersCount']"
-    median = community.monetary_mass / community.nb_members
-    # calculate ud(t+1)
-    ud = math.ceil(
-        max(community.dividend,
-            community.parameters['c'] * community.monetary_mass / community.get_ud_block()['membersCount'])
-    )
-    relative_value = units / float(ud)
-    relative_median = median / ud
+    median = community.monetary_mass / community.get_ud_block()['membersCount']
+    relative_value = units / float(community.dividend)
+    relative_median = median / community.dividend
     return relative_value - relative_median
 
 
diff --git a/src/cutecoin/core/community.py b/src/cutecoin/core/community.py
index be5e70ad..9c4c1389 100644
--- a/src/cutecoin/core/community.py
+++ b/src/cutecoin/core/community.py
@@ -5,6 +5,7 @@ Created on 1 févr. 2014
 '''
 
 from PyQt5.QtCore import QObject, pyqtSignal
+import math
 from ucoinpy.api import bma
 from ucoinpy.documents.block import Block
 from ..tools.exceptions import NoPeerAvailable
@@ -232,6 +233,29 @@ class Community(QObject):
         else:
             return 1
 
+    @property
+    def computed_dividend(self):
+        """
+        Get the computed community universal dividend.
+
+        Calculation based on t = last UD block time and on values from the that block :
+
+        UD(computed) = CEIL(MAX(UD(t) ; c * M(t) / N(t)))
+
+        :return: The computed UD or 1 if no UD was generated.
+        """
+        block = self.get_ud_block()
+        if block:
+            return math.ceil(
+                max(
+                    self.dividend,
+                    self.parameters['c'] * block['monetaryMass'] / block['membersCount']
+                )
+            )
+
+        else:
+            return 1
+
     def get_ud_block(self, x=0):
         '''
         Get a block with universal dividend
@@ -240,7 +264,8 @@ class Community(QObject):
         :return: The last block with universal dividend.
         '''
         blocks = self.request(bma.blockchain.UD)['result']['blocks']
-        if len(blocks) > 0:
+        # if ud blocks exist and index requested exists...
+        if len(blocks) > 0 and len(blocks)-(1+x) >= 0:
             block_number = blocks[len(blocks)-(1+x)]
             block = self.request(bma.blockchain.Block,
                                  req_args={'number': block_number})
diff --git a/src/cutecoin/gui/informations_tab.py b/src/cutecoin/gui/informations_tab.py
index d6e36615..4d3797c9 100644
--- a/src/cutecoin/gui/informations_tab.py
+++ b/src/cutecoin/gui/informations_tab.py
@@ -37,38 +37,85 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
 
         #  try to request money variables from last ud block
         try:
-            block = self.community.get_ud_block()
+            block_ud = self.community.get_ud_block()
         except Exception as e:
             logging.debug('community get_ud_block error : ' + str(e))
             return False
         try:
-            block_t_minus_1 = self.community.get_ud_block(1)
+            block_ud_minus_1 = self.community.get_ud_block(1)
         except Exception as e:
             logging.debug('community get_ud_block error : ' + str(e))
             return False
 
-        if block:
-            ud = self.get_referential_diff_value(block['dividend'])
+        if block_ud:
+            ud = self.get_referential_diff_value(block_ud['dividend'])
             # if referential type is quantitative...
             if self.account.ref_type() == 'q':
                 # display int values
                 # use the float type of 64bits, to avoid display a 32bit signed integer...
                 localized_ud = QLocale().toString(float(ud), 'f', 0)
-                localized_mass_per_member = QLocale().toString(
-                    float(self.get_referential_diff_value(block['monetaryMass'] / block['membersCount'])), 'f', 0
+                # display int values
+                localized_ud_plus_1 = QLocale().toString(
+                    float(
+                        self.get_referential_diff_value(
+                            self.community.computed_dividend
+                        )
+                    ),
+                    'f',
+                    0
                 )
-                localized_monetary_mass = QLocale().toString(
-                    float(self.get_referential_diff_value(block['monetaryMass'])), 'f', 0
+                localized_mass = QLocale().toString(
+                    float(self.get_referential_diff_value(block_ud['monetaryMass'])), 'f', 0
                 )
+                if block_ud_minus_1:
+                    localized_mass_minus_1_per_member = QLocale().toString(
+                        float(
+                            self.get_referential_diff_value(
+                                block_ud_minus_1['monetaryMass'] / block_ud['membersCount']
+                            )
+                        ), 'f', 0
+                    )
+                    localized_mass_minus_1 = QLocale().toString(
+                        float(self.get_referential_diff_value(block_ud_minus_1['monetaryMass'])), 'f', 0
+                    )
+                else:
+                    localized_mass_minus_1_per_member = QLocale().toString(
+                        float(0), 'f', 0
+                    )
+                    localized_mass_minus_1 = QLocale().toString(
+                        float(0), 'f', 0
+                    )
             else:
                 # display float values
                 localized_ud = QLocale().toString(ud, 'f', 6)
-                localized_mass_per_member = QLocale().toString(
-                    self.get_referential_diff_value(block['monetaryMass'] / block['membersCount']), 'f', 6
+                # display float values
+                localized_ud_plus_1 = QLocale().toString(
+                    float(
+                        self.get_referential_diff_value(
+                            self.community.computed_dividend
+                        )
+                    ),
+                    'f',
+                    6
                 )
-                localized_monetary_mass = QLocale().toString(
-                    self.get_referential_diff_value(block['monetaryMass']), 'f', 6
+                localized_mass = QLocale().toString(
+                    float(self.get_referential_diff_value(block_ud['monetaryMass'])), 'f', 6
                 )
+                if block_ud_minus_1:
+                    localized_mass_minus_1_per_member = QLocale().toString(
+                        self.get_referential_diff_value(
+                            block_ud_minus_1['monetaryMass'] / block_ud['membersCount']), 'f', 6
+                    )
+                    localized_mass_minus_1 = QLocale().toString(
+                        self.get_referential_diff_value(block_ud_minus_1['monetaryMass']), 'f', 6
+                    )
+                else:
+                    localized_mass_minus_1_per_member = QLocale().toString(
+                        float(0), 'f', 6
+                    )
+                    localized_mass_minus_1 = QLocale().toString(
+                        float(0), 'f', 6
+                    )
 
             # set infos in label
             self.label_general.setText(
@@ -80,25 +127,32 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
                 <tr><td align="right"><b>{:}</b></td><td>{:} {:}</td></tr>
                 <tr><td align="right"><b>{:2.2%} / {:} days</b></td><td>{:}</td></tr>
                 <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
+                <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
                 </table>
                 """).format(
                     localized_ud,
                     self.tr('Universal Dividend UD(t) in'),
                     self.get_referential_diff_name(),
-                    localized_monetary_mass,
-                    self.tr('Monetary Mass M(t) in'),
+                    localized_mass_minus_1,
+                    self.tr('Monetary Mass M(t-1) in'),
                     self.get_referential_diff_name(),
-                    block['membersCount'],
+                    block_ud['membersCount'],
                     self.tr('Members N(t)'),
-                    localized_mass_per_member,
-                    self.tr('Monetary Mass per member M(t)/N(t) in'),
+                    localized_mass_minus_1_per_member,
+                    self.tr('Monetary Mass per member M(t-1)/N(t) in'),
                     self.get_referential_diff_name(),
-                    block['dividend'] / (block_t_minus_1['monetaryMass'] / block_t_minus_1['membersCount']),
+                    block_ud['dividend'] / (block_ud_minus_1['monetaryMass'] / block_ud['membersCount']),
                     params['dt'] / 86400,
-                    self.tr('Actual growth c = UD(t)/[M(t-1)/N(t-1)]'),
+                    self.tr('Actual growth c = UD(t)/[M(t-1)/N(t)]'),
                     QLocale.toString(
                         QLocale(),
-                        QDateTime.fromTime_t(block['medianTime'] + params['dt']),
+                        QDateTime.fromTime_t(block_ud['medianTime']),
+                        QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
+                    ),
+                    self.tr('Last UD date and time (t)'),
+                    QLocale.toString(
+                        QLocale(),
+                        QDateTime.fromTime_t(block_ud['medianTime'] + params['dt']),
                         QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
                     ),
                     self.tr('Next UD date and time (t+1)')
@@ -107,35 +161,7 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
         else:
             self.label_general.setText(self.tr('No Universal Dividend created yet.'))
 
-        if block:
-            # if referential type is quantitative...
-            if self.account.ref_type() == 'q':
-                # display int values
-                localized_ud_t1 = QLocale().toString(
-                    float(
-                        self.get_referential_diff_value(
-                            math.ceil(
-                                max(block['dividend'], params['c'] * block['monetaryMass'] / block['membersCount'])
-                            )
-                        )
-                    ),
-                    'f',
-                    0
-                )
-            else:
-                # display float values
-                localized_ud_t1 = QLocale().toString(
-                    float(
-                        self.get_referential_diff_value(
-                            math.ceil(
-                                max(block['dividend'], params['c'] * block['monetaryMass'] / block['membersCount'])
-                            )
-                        )
-                    ),
-                    'f',
-                    6
-                )
-
+        if block_ud:
             # set infos in label
             self.label_rules.setText(
                 self.tr("""
@@ -147,16 +173,16 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
                 """).format(
                     self.tr('{:2.0%} / {:} days').format(params['c'], params['dt'] / 86400),
                     self.tr('Fundamental growth (c) / Delta time (dt)'),
-                    self.tr('UD(t+1) = MAX { UD(t) ; c &#215; M(t) / N(t) }'),
+                    self.tr('UD(t+1) = MAX { UD(t) ; c &#215; M(t) / N(t+1) }'),
                     self.tr('Universal Dividend (formula)'),
                     self.tr('{:} = MAX {{ {:} {:} ; {:2.0%} &#215; {:} {:} / {:} }}').format(
-                        localized_ud_t1,
+                        localized_ud_plus_1,
                         localized_ud,
                         self.get_referential_diff_name(),
                         params['c'],
-                        localized_monetary_mass,
+                        localized_mass,
                         self.get_referential_diff_name(),
-                        block['membersCount']
+                        block_ud['membersCount']
                     ),
                     self.tr('Universal Dividend (computed)')
                 )
-- 
GitLab