diff --git a/0.12/blog/2018/index.html b/0.12/blog/2018/index.html
index ec652219d466b16f0bddd72effff6d57baa2f1d4..65e2fc3c085ae387783672f9e20bd623bbe820bc 100644
--- a/0.12/blog/2018/index.html
+++ b/0.12/blog/2018/index.html
@@ -1572,10 +1572,7 @@
   <div class="md-post__content md-typeset">
     <h2 id="silkaj-v050-release-lets-certify"><a class="toclink" href="../silkaj-v050-release-lets-certify/">Silkaj v0.5.0 release: Let’s certify!</a></h2>
 <p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p>
-<center>
-![](../../images/silkaj_logo.png){ width="200" }
-</center>
-
+<p><img alt="" src="../../images/silkaj_logo.png" width="200" /></p>
 <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>
 
     
diff --git a/0.12/blog/2019/index.html b/0.12/blog/2019/index.html
index 840bc7c1d0018795d690612c273ffe57707cf9ba..d417e4e29dec7bd45390f3b3a3f671f063f22297 100644
--- a/0.12/blog/2019/index.html
+++ b/0.12/blog/2019/index.html
@@ -1596,7 +1596,7 @@
           
           <li class="md-meta__item">
             
-              6 min read
+              7 min read
             
           </li>
         
diff --git a/0.12/blog/page/4/index.html b/0.12/blog/page/4/index.html
index 68a25af413e241135cab2ef8c2ef6fb899168401..1f227d4c2db7a1befa8ee1e19ef6a1a0314d35c2 100644
--- a/0.12/blog/page/4/index.html
+++ b/0.12/blog/page/4/index.html
@@ -1522,7 +1522,7 @@
           
           <li class="md-meta__item">
             
-              6 min read
+              7 min read
             
           </li>
         
@@ -1677,10 +1677,7 @@
   <div class="md-post__content md-typeset">
     <h2 id="silkaj-v050-release-lets-certify"><a class="toclink" href="../../silkaj-v050-release-lets-certify/">Silkaj v0.5.0 release: Let’s certify!</a></h2>
 <p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p>
-<center>
-![](../../images/silkaj_logo.png){ width="200" }
-</center>
-
+<p><img alt="" src="../../../images/silkaj_logo.png" width="200" /></p>
 <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>
 
     
diff --git a/0.12/blog/release/index.html b/0.12/blog/release/index.html
index 19eac1ec6fc73f25dce471ee54abda1d0a2caea0..2667d0e779fd57a0938b072d29fb228e97252d9f 100644
--- a/0.12/blog/release/index.html
+++ b/0.12/blog/release/index.html
@@ -1698,7 +1698,7 @@ The most important of them are highlighted in this article, if you are looking f
           
           <li class="md-meta__item">
             
-              6 min read
+              7 min read
             
           </li>
         
diff --git a/0.12/blog/release/page/2/index.html b/0.12/blog/release/page/2/index.html
index 228edb2a0810ffde5f4603ad01ace5e2ff343946..d67fd808361234a245ed15d376f3d577295c75b5 100644
--- a/0.12/blog/release/page/2/index.html
+++ b/0.12/blog/release/page/2/index.html
@@ -1588,10 +1588,7 @@
   <div class="md-post__content md-typeset">
     <h2 id="silkaj-v050-release-lets-certify"><a class="toclink" href="../../../silkaj-v050-release-lets-certify/">Silkaj v0.5.0 release: Let’s certify!</a></h2>
 <p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p>
-<center>
-![](../../images/silkaj_logo.png){ width="200" }
-</center>
-
+<p><img alt="" src="../../../../images/silkaj_logo.png" width="200" /></p>
 <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>
 
     
diff --git a/0.12/blog/silkaj-v050-release-lets-certify/index.html b/0.12/blog/silkaj-v050-release-lets-certify/index.html
index aa7e7c7bcd6a132795404826ded6ff877588e4c9..6ea88cbbfca377649e917c70b89f3b4bd470ac4b 100644
--- a/0.12/blog/silkaj-v050-release-lets-certify/index.html
+++ b/0.12/blog/silkaj-v050-release-lets-certify/index.html
@@ -1490,10 +1490,7 @@
 
 <h1 id="silkaj-v050-release-lets-certify">Silkaj v0.5.0 release: Let’s certify!<a class="headerlink" href="#silkaj-v050-release-lets-certify" title="Permanent link">&para;</a></h1>
 <p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p>
-<center>
-![](../../images/silkaj_logo.png){ width="200" }
-</center>
-
+<p><img alt="" src="../../images/silkaj_logo.png" width="200" /></p>
 <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>
 <!-- more -->
 
diff --git a/0.12/blog/silkaj-v060-release-lets-install/index.html b/0.12/blog/silkaj-v060-release-lets-install/index.html
index 467367fe4fa50111b762b6b0170126df3686d000..01aaa56916da0cab6695a503c36376e3e02eb229 100644
--- a/0.12/blog/silkaj-v060-release-lets-install/index.html
+++ b/0.12/blog/silkaj-v060-release-lets-install/index.html
@@ -1738,10 +1738,7 @@ Python 3.7 has been set as the current version in Pipenv development environment
 </span><span id="__span-4-18"><a id="__codelineno-4-18" name="__codelineno-4-18" href="#__codelineno-4-18"></a>            @@@@@@@@@@@@@@@
 </span></code></pre></div>
 <h2 id="logo">Logo<a class="headerlink" href="#logo" title="Permanent link">&para;</a></h2>
-<center>
-![](../../images/silkaj_logo.png){ width="200" }
-</center>
-
+<p><img alt="" src="../../images/silkaj_logo.png" width="200" /></p>
 <p>Silkaj’s logo, designed by Attilax, is now <a href="https://gannonce.duniter.org/#/announce/d82696ce-03f5-4e13-9316-20c94f00f76d">fully funded</a>!</p>
 <h2 id="thanks">Thanks<a class="headerlink" href="#thanks" title="Permanent link">&para;</a></h2>
 <p>Special thanks to Moul, Cebash, cgeek, and Attilax.</p>
diff --git a/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html b/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html
index f4fe4279850e31e144a162859fe2bc034a310eed..bb9dbe77415bee132b2127133a79db280fecec0b 100644
--- a/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html
+++ b/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html
@@ -1500,7 +1500,7 @@
                           <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 20a8 8 0 0 0 8-8 8 8 0 0 0-8-8 8 8 0 0 0-8 8 8 8 0 0 0 8 8m0-18a10 10 0 0 1 10 10 10 10 0 0 1-10 10C6.47 22 2 17.5 2 12A10 10 0 0 1 12 2m.5 5v5.25l4.5 2.67-.75 1.23L11 13V7z"/></svg>
                           <span class="md-ellipsis">
                             
-                              6 min read
+                              7 min read
                             
                           </span>
                         </div>
@@ -1531,18 +1531,12 @@
 <!-- more -->
 
 <h2 id="duniterpy-migration">DuniterPy migration<a class="headerlink" href="#duniterpy-migration" title="Permanent link">&para;</a></h2>
-<center>
-![](../../images/duniterpy_logo.png){ width="150" }
-</center>
-
+<p><img alt="" src="../../images/duniterpy_logo.png" width="150" /></p>
 <p><a href="https://git.duniter.org/clients/python/duniterpy">DuniterPy</a> is a Python library which implements methods to request from and send information to the Duniter nodes. It also has authentication methods to sign documents such as transactions and certifications. DuniterPy was initially written for the Sakia client. Silkaj and Sakia are now sharing the same common code. The migration to DuniterPy was tough, but it was worth it: It will allow the implementation of new features in future versions.</p>
 <p>There were many challenges: keeping the same functionalities, making Silkaj’s code asynchronous, and replacing the authentication and the network code by the ones implemented in DuniterPy. One struggling issue was that the <a href="https://git.duniter.org/clients/python/silkaj/issues/178">intermediaries transactions were no longer working</a>, because, the equality method of the transaction output source was not implemented, as they used to be stored in a string and are now stored into an <code>OutputSource</code> object. So, the equality had to be implemented.</p>
 <p>Check-out <a href="https://forum.duniter.org/t/duniterpy-evolution-de-la-bibliotheque-python/5127">DuniterPy versions from v0.50.0 to v0.54.1</a> to follow the evolution of DuniterPy. These versions were specially made for Silkaj. In the future, following functionalities are planned: sending identity, membership, and revocation documents, the usage of authentication methods implemented in DuniterPy, and the usage of the planned GVA API.</p>
 <h2 id="click-migration">Click migration<a class="headerlink" href="#click-migration" title="Permanent link">&para;</a></h2>
-<center>
-[![](../../images/click_logo.png){ width="200" }](https://click.palletsprojects.com/)
-</center>
-
+<p><a href="https://click.palletsprojects.com/"><img alt="" src="../../images/click_logo.png" width="200" /></a></p>
 <p>Since Debian Buster freeze was going to happen very soon and <a href="https://github.com/chrissimpkins/commandlines"><code>commandlines</code></a> library wasn’t packaged into Debian, the migration to <a href="https://click.palletsprojects.com/">Click</a> “<em>Command Line Interface Creation Kit</em>” had to be done quickly. I decided to migrate to this really nice library, since it is much more maintained, comes with a better code, and is less buggy. Here you can see the new command line interface:</p>
 <div class="language-text no-copy highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>Usage: silkaj [OPTIONS] COMMAND [ARGS]...
 </span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>
@@ -1645,10 +1639,7 @@
 </span><span id="__span-2-49"><a id="__codelineno-2-49" name="__codelineno-2-49" href="#__codelineno-2-49"></a>+---------------------+------------------------+------------+--------------+-----------------------+
 </span></code></pre></div>
 <h2 id="debian-and-ubuntu-package">Debian and Ubuntu package<a class="headerlink" href="#debian-and-ubuntu-package" title="Permanent link">&para;</a></h2>
-<center>
-[![](../../images/debian_logo.svg){ width="100" }](https://packages.debian.org/buster/silkaj)
-</center>
-
+<p><a href="https://packages.debian.org/buster/silkaj"><img alt="" src="../../images/debian_logo.svg" width="100" /></a></p>
 <p>Silkaj v0.6.5 was packaged for Debian Buster v10, which is planned te be released on July 6th 2019. This package greatly benefits all Debian-based distributions. Moreover, Silkaj was also added into Ubuntu 19.04 repository, which was published on March 2019. For more details check-out <a href="https://repology.org/project/silkaj/versions">where Silkaj was included into the Debian-based distributions</a>. Silkaj v0.6.5 now comes with Click migration, auto-completion, and bug fixes, however it does not include DuniterPy migration and v0.7.0 features.</p>
 <p>You can install Silkaj with following command:</p>
 <div class="language-text highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>sudo apt install silkaj
diff --git a/0.12/blog/silkaj-v080-release/index.html b/0.12/blog/silkaj-v080-release/index.html
index 28b3066274502b6b8de1b337b1ddd4abbece196d..d9ae2fa1f42875916064ce22257a1353b3d32d80 100644
--- a/0.12/blog/silkaj-v080-release/index.html
+++ b/0.12/blog/silkaj-v080-release/index.html
@@ -1709,10 +1709,7 @@ Cf <a href="https://forum.duniter.org/t/duniter-utilise-une-ancienne-version-bug
 </span></code></pre></div>
 <h2 id="7-development-environment">7. Development Environment<a class="headerlink" href="#7-development-environment" title="Permanent link">&para;</a></h2>
 <h3 id="a-poetry">A. Poetry<a class="headerlink" href="#a-poetry" title="Permanent link">&para;</a></h3>
-<center>
-![Poetry logo](../../images/poetry-logo.svg){: style="height:120px;width:120px"}
-</center>
-
+<p><img alt="Poetry logo" src="../../images/poetry-logo.svg" style="height:120px;width:120px" /></p>
 <p>We migrated the packaging and the dependency management tool from Pipenv to Poetry since Pipenv has been quite problematic recently and is also more suitable for larger projects.</p>
 <p>In comparison, <a href="https://python-poetry.org/">Poetry</a> is a well thought and stable tool which has been released by the end of 2019. In the former development environment, we had to define the dependencies twice in the <code>requirements.txt</code>, <code>setup.{py,cfg}</code>, <code>Pipenv</code> files. Poetry, however, supports the <code>pyproject.toml</code> file standardized by the Python project and is able to define the dependencies at once.</p>
 <p>If you would like to install Silkaj for development purposes, please follow <a href="../../contributing/install_poetry/">this tutorial</a>. You may also interested by checking the newly introduced contribution process documentation <code>CONTRIBUTING.md</code>.</p>
diff --git a/0.12/contributing/documentation/index.html b/0.12/contributing/documentation/index.html
index ef92a0613157a6cba21090ddc87e2410693c0631..33dc5ece20219782d7faba3670f763a914127e89 100644
--- a/0.12/contributing/documentation/index.html
+++ b/0.12/contributing/documentation/index.html
@@ -1481,15 +1481,13 @@
 
 
 <h1 id="documentation-contribution">Documentation contribution<a class="headerlink" href="#documentation-contribution" title="Permanent link">&para;</a></h1>
-<center>
-![MkDocs Material icon](../images/mkdocs-material-favicon.png)
-</center>
-
+<p><img alt="MkDocs Material icon" src="../../images/mkdocs-material-favicon.png" /></p>
 <p>The project documentation website is based on <a href="https://www.mkdocs.org/">MkDocs framework</a> and on following theme and plugins:</p>
 <ul>
 <li><a href="https://squidfunk.github.io/mkdocs-material/">Mkdocs Material</a>: theme and framework</li>
 <li><a href="https://github.com/jimporter/mike">Mike</a>: to publish multiple versions</li>
 <li><a href="https://github.com/pawamoy/mkdocs-coverage">MkDocs Coverage</a>: to integrate coverage report iframe into MkDocs</li>
+<li><a href="https://github.com/mkdocs/mkdocs-click">MkDocs Click</a>: generate documentation for Click command line applications</li>
 <li><a href="https://pypi.org/project/mkdocs-gitlab-plugin/">MkDocs GitLab plugin</a>: to display links to GitLab references items: used in the changelog page</li>
 </ul>
 <p>Please refer to their respective documentation.</p>
diff --git a/0.12/contributing/index.html b/0.12/contributing/index.html
index a2050a831720e83f9c8310657f73b8825fc39426..a2148e7a740fdb8cdfff12235c85447b7c32e58b 100644
--- a/0.12/contributing/index.html
+++ b/0.12/contributing/index.html
@@ -1828,10 +1828,7 @@ Dependencies will be installed in it in order to have Silkaj running and to have
 <li>maintainance branches, to maintain a stable version while developing future version with breaking changes. For instance: <code>release/0.12</code></li>
 </ul>
 <h2 id="developing-with-duniterpy">Developing with DuniterPy<a class="headerlink" href="#developing-with-duniterpy" title="Permanent link">&para;</a></h2>
-<center>
-[![DuniterPy logo](../images/duniterpy_logo.png){: style="height:150px;width:150px"}](https://git.duniter.org/clients/python/duniterpy)
-</center>
-
+<p><a href="https://git.duniter.org/clients/python/duniterpy"><img alt="DuniterPy logo" src="../images/duniterpy_logo.png" style="height:150px;width:150px" /></a></p>
 <p><a href="https://git.duniter.org/clients/python/duniterpy">DuniterPy</a> is a Python library for Duniter v1 clients.
 It implements a client with multiple APIs, the handling for document signing.
 As it is coupled with Silkaj, it is oftenly needed to develop in both repositories.</p>
@@ -1859,10 +1856,7 @@ Please read their documentations on how to use them the best possible.</p>
 <li><a href="https://github.com/foutaise/texttable/#documentation">texttable</a></li>
 </ul>
 <h2 id="pre-commit-hooks">Pre-commit hooks<a class="headerlink" href="#pre-commit-hooks" title="Permanent link">&para;</a></h2>
-<center>
-[![Pre-commit logo](../images/pre-commit_logo.svg){: style="height:150px;width:150px"}](https://pre-commit.com/)
-</center>
-
+<p><a href="https://pre-commit.com/"><img alt="Pre-commit logo" src="../images/pre-commit_logo.svg" style="height:150px;width:150px" /></a></p>
 <p>We are using <a href="https://pre-commit.com/"><code>pre-commit</code></a> tool to perform checks on staged changes before committing.
 We are using it for <code>black</code> formatting, <code>mypy</code> static typing, <code>gitlab-ci</code> linting.
 We are also using <code>ruff</code> which replaces <code>isort</code> imports sorting, <code>pylint</code> code linting, <code>autoflake</code>, and <code>pyupgrade</code></p>
@@ -1897,10 +1891,7 @@ With Bash, in <code>$HOME/.bashrc</code> add the following:</p>
 </span></code></pre></div>
 <p>Check out <a href="https://git.duniter.org/clients/python/duniterpy/-/issues/169">duniterpy#169</a> for more details.</p>
 <h2 id="tests">Tests<a class="headerlink" href="#tests" title="Permanent link">&para;</a></h2>
-<center>
-[![Pytest logo](../images/pytest_logo.svg){: style="height:150px;width:150px"}](https://pytest.org)
-</center>
-
+<p><a href="https://pytest.org"><img alt="Pytest logo" src="../images/pytest_logo.svg" style="height:150px;width:150px" /></a></p>
 <p>We are using <a href="https://pytest.org">Pytest</a> as a tests framework. For more information on how Silkaj implements them check the <a href="testing/">testing documentation</a>.</p>
 <p>Tests are stored into <code>unit</code> and <code>integration</code> folders depending on their types, then using a similar tree as the source code.</p>
 <p>To run the tests, from within <code>silkaj</code> repository, run:</p>
@@ -1932,10 +1923,7 @@ With Bash, in <code>$HOME/.bashrc</code> add the following:</p>
 <p>Follow <a href="https://github.com/Lucas-C/pre-commit-hooks#removing-old-license-and-replacing-it-with-a-new-one">this documentation</a>
 Only difference is to update the year in <code>license_header.txt</code> rather than <code>LICENSE.txt</code>.</p>
 <h2 id="pypi-and-pypi-test-distributions">PyPI and PyPI test distributions<a class="headerlink" href="#pypi-and-pypi-test-distributions" title="Permanent link">&para;</a></h2>
-<center>
-[![PyPI logo](../images/pypi_logo.svg){: style="height:150px;width:150px"}](https://pypi.org/project/silkaj)
-</center>
-
+<p><a href="https://pypi.org/project/silkaj"><img alt="PyPI logo" src="../images/pypi_logo.svg" style="height:150px;width:150px" /></a></p>
 <p>Silkaj is distributed to PyPI, the Python Package Index, for further <code>pip</code> installation.
 Silkaj can be published to <a href="https://pypi.org/project/silkaj">PyPI</a> or to <a href="https://test.pypi.org/project/silkaj/">PyPI test</a> for testing purposes.
 Publishing to PyPI or PyPI test can be directly done from the continuous delivery or from Poetry it-self.
@@ -1955,9 +1943,7 @@ Only the project maintainers have the rights to push tags.</p>
 </span></code></pre></div>
 <p>The <code>--extra-index-url</code> is used to retrieve dependencies packages from the official PyPI not to get issues with missing or testing dependencies comming from PyPI test repositories.</p>
 <h2 id="continuous-integration-and-delivery">Continuous integration and delivery<a class="headerlink" href="#continuous-integration-and-delivery" title="Permanent link">&para;</a></h2>
-<center>
-![GitLab logo](../images/GitLab_icon.svg){: style="height:100px;width:100px"}
-</center>
+<p><img alt="GitLab logo" src="../images/GitLab_icon.svg" style="height:100px;width:100px" /></p>
 <h3 id="own-built-docker-images">Own built Docker images<a class="headerlink" href="#own-built-docker-images" title="Permanent link">&para;</a></h3>
 <p>Silkaj pipeline is running images built on top of official Python images based on latest Debian with Poetry installed on top them.</p>
 <p>They can be found in <a href="https://git.duniter.org/docker/python3/poetry">this repository</a>.</p>
diff --git a/0.12/contributing/install_poetry/index.html b/0.12/contributing/install_poetry/index.html
index 517891384cf52bc240be967bfc384ce851f02c17..8df4225236c57c19d63e4b2975505b2ec7864da3 100644
--- a/0.12/contributing/install_poetry/index.html
+++ b/0.12/contributing/install_poetry/index.html
@@ -1494,10 +1494,7 @@
 
   <h1>Poetry installation</h1>
 
-<center>
-![Poetry logo](../images/poetry-logo.svg){: style="height:120px;width:120px"}
-</center>
-
+<p><img alt="Poetry logo" src="../../images/poetry-logo.svg" style="height:120px;width:120px" /></p>
 <h2 id="install-silkaj-in-a-development-environement-with-poetry">Install Silkaj in a development environement with Poetry<a class="headerlink" href="#install-silkaj-in-a-development-environement-with-poetry" title="Permanent link">&para;</a></h2>
 <h3 id="install-libsodium">Install libsodium<a class="headerlink" href="#install-libsodium" title="Permanent link">&para;</a></h3>
 <div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Debian</label><label for="__tabbed_1_2">Fedora</label></div>
diff --git a/0.12/coverage/class_index.html b/0.12/coverage/class_index.html
index 8ad8bb9d0875be724ecfe93a69c3b92ff6b15803..53f7a28cfa78df789215abfa6ee1737214baf13b 100644
--- a/0.12/coverage/class_index.html
+++ b/0.12/coverage/class_index.html
@@ -55,7 +55,7 @@
         </h2>
         <p class="text">
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </header>
@@ -211,10 +211,10 @@
             <tr class="region">
                 <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html">silkaj/money/history.py</a></td>
                 <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
-                <td>151</td>
-                <td>25</td>
+                <td>153</td>
+                <td>26</td>
                 <td>0</td>
-                <td class="right" data-ratio="126 151">83%</td>
+                <td class="right" data-ratio="127 153">83%</td>
             </tr>
             <tr class="region">
                 <td class="name left"><a href="z_8394fdfe5cf191f4_tools_py.html">silkaj/money/tools.py</a></td>
@@ -357,10 +357,10 @@
             <tr class="total">
                 <td class="name left">Total</td>
                 <td class="name left">&nbsp;</td>
-                <td>1750</td>
-                <td>393</td>
+                <td>1752</td>
+                <td>394</td>
                 <td>0</td>
-                <td class="right" data-ratio="1357 1750">78%</td>
+                <td class="right" data-ratio="1358 1752">78%</td>
             </tr>
         </tfoot>
     </table>
@@ -372,7 +372,7 @@
     <div class="content">
         <p>
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
     <aside class="hidden">
diff --git a/0.12/coverage/covindex.html b/0.12/coverage/covindex.html
index 2c261cb5790665631bcc506631c2a449a484877e..da1e3a9aef90a406e6686b52a5c89817955affed 100644
--- a/0.12/coverage/covindex.html
+++ b/0.12/coverage/covindex.html
@@ -54,7 +54,7 @@
         </h2>
         <p class="text">
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </header>
@@ -177,10 +177,10 @@
             </tr>
             <tr class="region">
                 <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html">silkaj/money/history.py</a></td>
-                <td>151</td>
-                <td>25</td>
+                <td>153</td>
+                <td>26</td>
                 <td>0</td>
-                <td class="right" data-ratio="126 151">83%</td>
+                <td class="right" data-ratio="127 153">83%</td>
             </tr>
             <tr class="region">
                 <td class="name left"><a href="z_8394fdfe5cf191f4_tools_py.html">silkaj/money/tools.py</a></td>
@@ -291,10 +291,10 @@
         <tfoot>
             <tr class="total">
                 <td class="name left">Total</td>
-                <td>1750</td>
-                <td>393</td>
+                <td>1752</td>
+                <td>394</td>
                 <td>0</td>
-                <td class="right" data-ratio="1357 1750">78%</td>
+                <td class="right" data-ratio="1358 1752">78%</td>
             </tr>
         </tfoot>
     </table>
@@ -306,7 +306,7 @@
     <div class="content">
         <p>
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
     <aside class="hidden">
diff --git a/0.12/coverage/function_index.html b/0.12/coverage/function_index.html
index c50a98d8010eba89b08ad992d0e27e0e31ece1d1..beabb5d7f7e337f48a2fe0f829edcb2725398c98 100644
--- a/0.12/coverage/function_index.html
+++ b/0.12/coverage/function_index.html
@@ -55,7 +55,7 @@
         </h2>
         <p class="text">
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </header>
@@ -507,102 +507,102 @@
             <tr class="region">
                 <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t54">silkaj/money/history.py</a></td>
                 <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t54"><data value='transaction_history'>transaction_history</data></a></td>
-                <td>22</td>
-                <td>5</td>
+                <td>24</td>
+                <td>6</td>
                 <td>0</td>
-                <td class="right" data-ratio="17 22">77%</td>
+                <td class="right" data-ratio="18 24">75%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t103">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t103"><data value='generate_header'>generate_header</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t105">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t105"><data value='generate_header'>generate_header</data></a></td>
                 <td>8</td>
                 <td>8</td>
                 <td>0</td>
                 <td class="right" data-ratio="0 8">0%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t115">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t115"><data value='get_transactions_history'>get_transactions_history</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t117">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t117"><data value='get_transactions_history'>get_transactions_history</data></a></td>
                 <td>6</td>
                 <td>6</td>
                 <td>0</td>
                 <td class="right" data-ratio="0 6">0%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t134">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t134"><data value='remove_duplicate_txs'>remove_duplicate_txs</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t136">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t136"><data value='remove_duplicate_txs'>remove_duplicate_txs</data></a></td>
                 <td>3</td>
                 <td>1</td>
                 <td>0</td>
                 <td class="right" data-ratio="2 3">67%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t146">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t146"><data value='generate_txs_list'>generate_txs_list</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t148">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t148"><data value='generate_txs_list'>generate_txs_list</data></a></td>
                 <td>6</td>
                 <td>0</td>
                 <td>0</td>
                 <td class="right" data-ratio="6 6">100%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t180">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t180"><data value='parse_received_tx'>parse_received_tx</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t182">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t182"><data value='parse_received_tx'>parse_received_tx</data></a></td>
                 <td>16</td>
                 <td>0</td>
                 <td>0</td>
                 <td class="right" data-ratio="16 16">100%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t218">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t218"><data value='parse_sent_tx'>parse_sent_tx</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t220">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t220"><data value='parse_sent_tx'>parse_sent_tx</data></a></td>
                 <td>27</td>
                 <td>3</td>
                 <td>0</td>
                 <td class="right" data-ratio="24 27">89%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t275">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t275"><data value='tx_amount'>tx_amount</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t277">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t277"><data value='tx_amount'>tx_amount</data></a></td>
                 <td>7</td>
                 <td>0</td>
                 <td>0</td>
                 <td class="right" data-ratio="7 7">100%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t292">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t292"><data value='received_func'>received_func</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t294">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t294"><data value='received_func'>received_func</data></a></td>
                 <td>3</td>
                 <td>0</td>
                 <td>0</td>
                 <td class="right" data-ratio="3 3">100%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t298">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t298"><data value='sent_func'>sent_func</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t300">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t300"><data value='sent_func'>sent_func</data></a></td>
                 <td>3</td>
                 <td>1</td>
                 <td>0</td>
                 <td class="right" data-ratio="2 3">67%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t304">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t304"><data value='output_available'>output_available</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t306">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t306"><data value='output_available'>output_available</data></a></td>
                 <td>3</td>
                 <td>1</td>
                 <td>0</td>
                 <td class="right" data-ratio="2 3">67%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t315">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t315"><data value='assign_idty_from_pubkey'>assign_idty_from_pubkey</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t317">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t317"><data value='assign_idty_from_pubkey'>assign_idty_from_pubkey</data></a></td>
                 <td>6</td>
                 <td>0</td>
                 <td>0</td>
                 <td class="right" data-ratio="6 6">100%</td>
             </tr>
             <tr class="region">
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t324">silkaj/money/history.py</a></td>
-                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t324"><data value='prefix'>prefix</data></a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t326">silkaj/money/history.py</a></td>
+                <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t326"><data value='prefix'>prefix</data></a></td>
                 <td>5</td>
                 <td>0</td>
                 <td>0</td>
@@ -1445,10 +1445,10 @@
             <tr class="total">
                 <td class="name left">Total</td>
                 <td class="name left">&nbsp;</td>
-                <td>1750</td>
-                <td>393</td>
+                <td>1752</td>
+                <td>394</td>
                 <td>0</td>
-                <td class="right" data-ratio="1357 1750">78%</td>
+                <td class="right" data-ratio="1358 1752">78%</td>
             </tr>
         </tfoot>
     </table>
@@ -1460,7 +1460,7 @@
     <div class="content">
         <p>
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
     <aside class="hidden">
diff --git a/0.12/coverage/status.json b/0.12/coverage/status.json
index 45d0d951b8843eb7e99c192d8d5a7a63d908b858..3cd5e2b19b537a49c45263343d9206bd382acd38 100644
--- a/0.12/coverage/status.json
+++ b/0.12/coverage/status.json
@@ -1 +1 @@
-{"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.8.0","globals":"09a5a067fe739e9a21f8edc86d2fef52","files":{"z_c69109531bf836fe___init___py":{"hash":"e1ebb3130da6d01118bec14616bf318c","index":{"url":"z_c69109531bf836fe___init___py.html","file":"silkaj/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":1,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_about_py":{"hash":"f3d8da0b3d9ba23275c52a9c8b4974be","index":{"url":"z_c69109531bf836fe_about_py.html","file":"silkaj/about.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_account_storage_py":{"hash":"408bd5e4422863a1b875a27417c034ae","index":{"url":"z_c69109531bf836fe_account_storage_py.html","file":"silkaj/account_storage.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":2,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_auth_py":{"hash":"ffb0bd722225d78e249d50372997128b","index":{"url":"z_c69109531bf836fe_auth_py.html","file":"silkaj/auth.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":102,"n_excluded":0,"n_missing":58,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e7a021a3963ba4f1___init___py.html","file":"silkaj/blockchain/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_blocks_py":{"hash":"2f65ebe5a7ce38d04f841c298465314a","index":{"url":"z_e7a021a3963ba4f1_blocks_py.html","file":"silkaj/blockchain/blocks.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":79,"n_excluded":0,"n_missing":63,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_difficulty_py":{"hash":"d7988a80a4d953650d6e860416a715e7","index":{"url":"z_e7a021a3963ba4f1_difficulty_py.html","file":"silkaj/blockchain/difficulty.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":38,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_information_py":{"hash":"1b342ea7f517da1f1eca0c75c47fd901","index":{"url":"z_e7a021a3963ba4f1_information_py.html","file":"silkaj/blockchain/information.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":13,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_tools_py":{"hash":"7bb8b67193fc892454a2bb4e5ed7b062","index":{"url":"z_e7a021a3963ba4f1_tools_py.html","file":"silkaj/blockchain/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":14,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_checksum_py":{"hash":"4bbe99b69d93327879c5935ab5bdb07e","index":{"url":"z_c69109531bf836fe_checksum_py.html","file":"silkaj/checksum.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_cli_py":{"hash":"30cc6d984d42d8fbef5377a30cdff8b9","index":{"url":"z_c69109531bf836fe_cli_py.html","file":"silkaj/cli.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":76,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_constants_py":{"hash":"d274968b263e4832e9b0cb17e988299e","index":{"url":"z_c69109531bf836fe_constants_py.html","file":"silkaj/constants.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_g1_monetary_license_py":{"hash":"1a5c6c58554c40219293f18efb38d002","index":{"url":"z_c69109531bf836fe_g1_monetary_license_py.html","file":"silkaj/g1_monetary_license.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":36,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_8394fdfe5cf191f4___init___py.html","file":"silkaj/money/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_balance_py":{"hash":"8549a8cff5ce0a39fab225fae4e0adc9","index":{"url":"z_8394fdfe5cf191f4_balance_py.html","file":"silkaj/money/balance.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":70,"n_excluded":0,"n_missing":10,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_history_py":{"hash":"dae6840ddc49b0a632dcb3676126e8da","index":{"url":"z_8394fdfe5cf191f4_history_py.html","file":"silkaj/money/history.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":151,"n_excluded":0,"n_missing":25,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_tools_py":{"hash":"8c50326d97645d6ad1db8cbc7989794e","index":{"url":"z_8394fdfe5cf191f4_tools_py.html","file":"silkaj/money/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":57,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_transfer_py":{"hash":"9945f199a8c665558f2255e190a12bb1","index":{"url":"z_8394fdfe5cf191f4_transfer_py.html","file":"silkaj/money/transfer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":210,"n_excluded":0,"n_missing":15,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_network_py":{"hash":"e3e4627471da7e97e91a2f9375554318","index":{"url":"z_c69109531bf836fe_network_py.html","file":"silkaj/network.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":49,"n_excluded":0,"n_missing":8,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_public_key_py":{"hash":"b1202dec83c7cb60234dc9c0e86a2bf6","index":{"url":"z_c69109531bf836fe_public_key_py.html","file":"silkaj/public_key.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":37,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tools_py":{"hash":"9e02ebcd02c7f42544622d7bb8c06e4b","index":{"url":"z_c69109531bf836fe_tools_py.html","file":"silkaj/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":38,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tui_py":{"hash":"229835e32a372eb34c4a21bacc40b0d8","index":{"url":"z_c69109531bf836fe_tui_py.html","file":"silkaj/tui.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e099210adb7d42f0___init___py.html","file":"silkaj/wot/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_certify_py":{"hash":"763119f6ed5826466a51f4de5a5c43d5","index":{"url":"z_e099210adb7d42f0_certify_py.html","file":"silkaj/wot/certify.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":55,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_exclusions_py":{"hash":"029b74f26a5fdb9198238c753278992d","index":{"url":"z_e099210adb7d42f0_exclusions_py.html","file":"silkaj/wot/exclusions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":155,"n_excluded":0,"n_missing":97,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_idty_tools_py":{"hash":"0a2be96c4e4aa1e72457d0da8deaa6d9","index":{"url":"z_e099210adb7d42f0_idty_tools_py.html","file":"silkaj/wot/idty_tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_lookup_py":{"hash":"cb0545138606e4562b5d9271e1bc4351","index":{"url":"z_e099210adb7d42f0_lookup_py.html","file":"silkaj/wot/lookup.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":3,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_membership_py":{"hash":"459f1a520d9adec5000774cd0a6fb9a6","index":{"url":"z_e099210adb7d42f0_membership_py.html","file":"silkaj/wot/membership.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":67,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_revocation_py":{"hash":"b49eb09d004148fcbc0caaea4a3ad878","index":{"url":"z_e099210adb7d42f0_revocation_py.html","file":"silkaj/wot/revocation.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":111,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_status_py":{"hash":"a96e8abf636bd9f25e32b985161442de","index":{"url":"z_e099210adb7d42f0_status_py.html","file":"silkaj/wot/status.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":72,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_tools_py":{"hash":"37af6e48a695216fca3461556b399b7e","index":{"url":"z_e099210adb7d42f0_tools_py.html","file":"silkaj/wot/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":59,"n_excluded":0,"n_missing":9,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}}
\ No newline at end of file
+{"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.8.0","globals":"09a5a067fe739e9a21f8edc86d2fef52","files":{"z_c69109531bf836fe___init___py":{"hash":"e1ebb3130da6d01118bec14616bf318c","index":{"url":"z_c69109531bf836fe___init___py.html","file":"silkaj/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":1,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_about_py":{"hash":"f3d8da0b3d9ba23275c52a9c8b4974be","index":{"url":"z_c69109531bf836fe_about_py.html","file":"silkaj/about.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_account_storage_py":{"hash":"408bd5e4422863a1b875a27417c034ae","index":{"url":"z_c69109531bf836fe_account_storage_py.html","file":"silkaj/account_storage.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":2,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_auth_py":{"hash":"ffb0bd722225d78e249d50372997128b","index":{"url":"z_c69109531bf836fe_auth_py.html","file":"silkaj/auth.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":102,"n_excluded":0,"n_missing":58,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e7a021a3963ba4f1___init___py.html","file":"silkaj/blockchain/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_blocks_py":{"hash":"2f65ebe5a7ce38d04f841c298465314a","index":{"url":"z_e7a021a3963ba4f1_blocks_py.html","file":"silkaj/blockchain/blocks.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":79,"n_excluded":0,"n_missing":63,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_difficulty_py":{"hash":"d7988a80a4d953650d6e860416a715e7","index":{"url":"z_e7a021a3963ba4f1_difficulty_py.html","file":"silkaj/blockchain/difficulty.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":38,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_information_py":{"hash":"1b342ea7f517da1f1eca0c75c47fd901","index":{"url":"z_e7a021a3963ba4f1_information_py.html","file":"silkaj/blockchain/information.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":13,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_tools_py":{"hash":"7bb8b67193fc892454a2bb4e5ed7b062","index":{"url":"z_e7a021a3963ba4f1_tools_py.html","file":"silkaj/blockchain/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":14,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_checksum_py":{"hash":"4bbe99b69d93327879c5935ab5bdb07e","index":{"url":"z_c69109531bf836fe_checksum_py.html","file":"silkaj/checksum.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_cli_py":{"hash":"30cc6d984d42d8fbef5377a30cdff8b9","index":{"url":"z_c69109531bf836fe_cli_py.html","file":"silkaj/cli.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":76,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_constants_py":{"hash":"d274968b263e4832e9b0cb17e988299e","index":{"url":"z_c69109531bf836fe_constants_py.html","file":"silkaj/constants.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_g1_monetary_license_py":{"hash":"1a5c6c58554c40219293f18efb38d002","index":{"url":"z_c69109531bf836fe_g1_monetary_license_py.html","file":"silkaj/g1_monetary_license.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":36,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_8394fdfe5cf191f4___init___py.html","file":"silkaj/money/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_balance_py":{"hash":"8549a8cff5ce0a39fab225fae4e0adc9","index":{"url":"z_8394fdfe5cf191f4_balance_py.html","file":"silkaj/money/balance.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":70,"n_excluded":0,"n_missing":10,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_history_py":{"hash":"93bed8dfb1d6979cb3eb5712d2173b9e","index":{"url":"z_8394fdfe5cf191f4_history_py.html","file":"silkaj/money/history.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":153,"n_excluded":0,"n_missing":26,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_tools_py":{"hash":"8c50326d97645d6ad1db8cbc7989794e","index":{"url":"z_8394fdfe5cf191f4_tools_py.html","file":"silkaj/money/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":57,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_transfer_py":{"hash":"9945f199a8c665558f2255e190a12bb1","index":{"url":"z_8394fdfe5cf191f4_transfer_py.html","file":"silkaj/money/transfer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":210,"n_excluded":0,"n_missing":15,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_network_py":{"hash":"e3e4627471da7e97e91a2f9375554318","index":{"url":"z_c69109531bf836fe_network_py.html","file":"silkaj/network.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":49,"n_excluded":0,"n_missing":8,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_public_key_py":{"hash":"b1202dec83c7cb60234dc9c0e86a2bf6","index":{"url":"z_c69109531bf836fe_public_key_py.html","file":"silkaj/public_key.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":37,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tools_py":{"hash":"9e02ebcd02c7f42544622d7bb8c06e4b","index":{"url":"z_c69109531bf836fe_tools_py.html","file":"silkaj/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":38,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tui_py":{"hash":"229835e32a372eb34c4a21bacc40b0d8","index":{"url":"z_c69109531bf836fe_tui_py.html","file":"silkaj/tui.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e099210adb7d42f0___init___py.html","file":"silkaj/wot/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_certify_py":{"hash":"763119f6ed5826466a51f4de5a5c43d5","index":{"url":"z_e099210adb7d42f0_certify_py.html","file":"silkaj/wot/certify.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":55,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_exclusions_py":{"hash":"029b74f26a5fdb9198238c753278992d","index":{"url":"z_e099210adb7d42f0_exclusions_py.html","file":"silkaj/wot/exclusions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":155,"n_excluded":0,"n_missing":97,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_idty_tools_py":{"hash":"0a2be96c4e4aa1e72457d0da8deaa6d9","index":{"url":"z_e099210adb7d42f0_idty_tools_py.html","file":"silkaj/wot/idty_tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_lookup_py":{"hash":"cb0545138606e4562b5d9271e1bc4351","index":{"url":"z_e099210adb7d42f0_lookup_py.html","file":"silkaj/wot/lookup.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":3,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_membership_py":{"hash":"459f1a520d9adec5000774cd0a6fb9a6","index":{"url":"z_e099210adb7d42f0_membership_py.html","file":"silkaj/wot/membership.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":67,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_revocation_py":{"hash":"b49eb09d004148fcbc0caaea4a3ad878","index":{"url":"z_e099210adb7d42f0_revocation_py.html","file":"silkaj/wot/revocation.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":111,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_status_py":{"hash":"a96e8abf636bd9f25e32b985161442de","index":{"url":"z_e099210adb7d42f0_status_py.html","file":"silkaj/wot/status.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":72,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_tools_py":{"hash":"37af6e48a695216fca3461556b399b7e","index":{"url":"z_e099210adb7d42f0_tools_py.html","file":"silkaj/wot/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":59,"n_excluded":0,"n_missing":9,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}}
\ No newline at end of file
diff --git a/0.12/coverage/z_8394fdfe5cf191f4___init___py.html b/0.12/coverage/z_8394fdfe5cf191f4___init___py.html
index 0f80134ee5bb59516559cea7b71a61c7ab435bb2..6a546d17f68044df3622a78f2f154ab2136d906c 100644
--- a/0.12/coverage/z_8394fdfe5cf191f4___init___py.html
+++ b/0.12/coverage/z_8394fdfe5cf191f4___init___py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_balance_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -103,7 +103,7 @@
             <a class="nav" href="z_8394fdfe5cf191f4_balance_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html b/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html
index 32f17e5cc189d6221362f758e2ccc9d93f1bba93..cb31c24c8e54e3c1b3b136dd4acad2d8989a015a 100644
--- a/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html
+++ b/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_history_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -224,7 +224,7 @@
             <a class="nav" href="z_8394fdfe5cf191f4_history_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_8394fdfe5cf191f4_history_py.html b/0.12/coverage/z_8394fdfe5cf191f4_history_py.html
index 71484388488d7179d1af1d4cf54a1cd3f79ec4fc..3ecc39d00285c399f9eb13884acfd4822feb6612 100644
--- a/0.12/coverage/z_8394fdfe5cf191f4_history_py.html
+++ b/0.12/coverage/z_8394fdfe5cf191f4_history_py.html
@@ -54,9 +54,9 @@
             </div>
         </aside>
         <h2>
-            <span class="text">151 statements &nbsp;</span>
-            <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">126<span class="text"> run</span></button>
-            <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">25<span class="text"> missing</span></button>
+            <span class="text">153 statements &nbsp;</span>
+            <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">127<span class="text"> run</span></button>
+            <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">26<span class="text"> missing</span></button>
             <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
         </h2>
         <p class="text">
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -170,262 +170,264 @@
     <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t">        <span class="str">"Reference"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
     <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t">    <span class="op">]</span>&nbsp;</span><span class="r"></span></p>
     <p class="run"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t">    <span class="key">if</span> <span class="nam">csv_file</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t">        <span class="nam">txs_list</span><span class="op">.</span><span class="nam">insert</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="nam">table_headers</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t">        <span class="key">with</span> <span class="nam">csv_file</span><span class="op">.</span><span class="nam">open</span><span class="op">(</span><span class="str">"w"</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">"utf-8"</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t">            <span class="nam">writer</span> <span class="op">=</span> <span class="nam">csv</span><span class="op">.</span><span class="nam">writer</span><span class="op">(</span><span class="nam">f</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t">            <span class="nam">writer</span><span class="op">.</span><span class="nam">writerows</span><span class="op">(</span><span class="nam">txs_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">        <span class="nam">click</span><span class="op">.</span><span class="nam">echo</span><span class="op">(</span><span class="fst">f"</span><span class="op">{</span><span class="nam">csv_file</span><span class="op">}</span><span class="fst"> file successfully saved!</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">    <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t">        <span class="nam">table</span> <span class="op">=</span> <span class="nam">Table</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t">        <span class="nam">table</span><span class="op">.</span><span class="nam">fill_rows</span><span class="op">(</span><span class="nam">txs_list</span><span class="op">,</span> <span class="nam">table_headers</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t">        <span class="nam">header</span> <span class="op">=</span> <span class="nam">generate_header</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">currency_symbol</span><span class="op">,</span> <span class="nam">ud_value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t">        <span class="nam">click</span><span class="op">.</span><span class="nam">echo_via_pager</span><span class="op">(</span><span class="nam">header</span> <span class="op">+</span> <span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"><span class="key">def</span> <span class="nam">generate_header</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">currency_symbol</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t">    <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">        <span class="nam">idty</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identity_of</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t">    <span class="key">except</span> <span class="nam">HTTPError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t">        <span class="nam">idty</span> <span class="op">=</span> <span class="op">{</span><span class="str">"uid"</span><span class="op">:</span> <span class="str">""</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t">    <span class="nam">balance</span> <span class="op">=</span> <span class="nam">mt</span><span class="op">.</span><span class="nam">get_amount_from_pubkey</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t">    <span class="nam">balance_ud</span> <span class="op">=</span> <span class="nam">round</span><span class="op">(</span><span class="nam">balance</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">    <span class="nam">date</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t">    <span class="key">return</span> <span class="fst">f"</span><span class="fst">Transactions history from: </span><span class="op">{</span><span class="nam">idty</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> </span><span class="op">{</span><span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span><span class="op">}</span><span class="fst">\n\</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"><span class="fst">Current balance: </span><span class="op">{</span><span class="nam">balance</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">}</span><span class="fst"> </span><span class="op">{</span><span class="nam">currency_symbol</span><span class="op">}</span><span class="fst">, </span><span class="op">{</span><span class="nam">balance_ud</span><span class="op">}</span><span class="fst"> UD </span><span class="op">{</span><span class="nam">currency_symbol</span><span class="op">}</span><span class="fst"> on </span><span class="op">{</span><span class="nam">date</span><span class="op">}</span><span class="fst">\n</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"><span class="key">def</span> <span class="nam">get_transactions_history</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t">    <span class="nam">client</span><span class="op">:</span> <span class="nam">Client</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t">    <span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t">    <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"><span class="str">    Get transaction history</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"><span class="str">    Store txs in Transaction object</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t">    <span class="nam">tx_history</span> <span class="op">=</span> <span class="nam">client</span><span class="op">(</span><span class="nam">history</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t">    <span class="nam">currency</span> <span class="op">=</span> <span class="nam">tx_history</span><span class="op">[</span><span class="str">"currency"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t">    <span class="key">for</span> <span class="nam">received</span> <span class="key">in</span> <span class="nam">tx_history</span><span class="op">[</span><span class="str">"history"</span><span class="op">]</span><span class="op">[</span><span class="str">"received"</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t">        <span class="nam">received_txs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">Transaction</span><span class="op">.</span><span class="nam">from_bma_history</span><span class="op">(</span><span class="nam">received</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t">    <span class="key">for</span> <span class="nam">sent</span> <span class="key">in</span> <span class="nam">tx_history</span><span class="op">[</span><span class="str">"history"</span><span class="op">]</span><span class="op">[</span><span class="str">"sent"</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t">        <span class="nam">sent_txs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">Transaction</span><span class="op">.</span><span class="nam">from_bma_history</span><span class="op">(</span><span class="nam">sent</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"><span class="key">def</span> <span class="nam">remove_duplicate_txs</span><span class="op">(</span><span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"><span class="str">    Remove duplicate transactions from history</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"><span class="str">    Remove received tx which contains output back return</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"><span class="str">    that we don't want to displayed</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"><span class="str">    A copy of received_txs is necessary to remove elements</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t">    <span class="key">for</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">list</span><span class="op">(</span><span class="nam">received_txs</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t">        <span class="key">if</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t">            <span class="nam">received_txs</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"><span class="key">def</span> <span class="nam">generate_txs_list</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t">    <span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t">    <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t">    <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t">    <span class="nam">currency_symbol</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t">    <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t">    <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"><span class="str">    Generate information in a list of lists for texttable</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"><span class="str">    Merge received and sent txs</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"><span class="str">    Sort txs temporarily</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t">    <span class="nam">received_txs_list</span><span class="op">,</span> <span class="nam">sent_txs_list</span> <span class="op">=</span> <span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t">        <span class="op">[</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t">        <span class="op">[</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t">    <span class="op">)</span>  <span class="com"># type: list[Transaction], list[Transaction]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t">    <span class="nam">parse_received_tx</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t">        <span class="nam">received_txs_list</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t">        <span class="nam">received_txs</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t">        <span class="nam">pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t">        <span class="nam">ud_value</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t">        <span class="nam">uids</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t">        <span class="nam">full_pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t">    <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t">    <span class="nam">parse_sent_tx</span><span class="op">(</span><span class="nam">sent_txs_list</span><span class="op">,</span> <span class="nam">sent_txs</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="nam">uids</span><span class="op">,</span> <span class="nam">full_pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t">    <span class="nam">txs_list</span> <span class="op">=</span> <span class="nam">received_txs_list</span> <span class="op">+</span> <span class="nam">sent_txs_list</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t">    <span class="nam">txs_list</span><span class="op">.</span><span class="nam">sort</span><span class="op">(</span><span class="nam">key</span><span class="op">=</span><span class="nam">itemgetter</span><span class="op">(</span><span class="num">0</span><span class="op">)</span><span class="op">,</span> <span class="nam">reverse</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t">    <span class="key">return</span> <span class="nam">txs_list</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"><span class="key">def</span> <span class="nam">parse_received_tx</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t">    <span class="nam">received_txs_table</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t">    <span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t">    <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t">    <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t">    <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"><span class="str">    Extract issuers` pubkeys</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"><span class="str">    Get identities from pubkeys</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"><span class="str">    Convert time into human format</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"><span class="str">    Assign identities</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"><span class="str">    Get amounts and assign amounts and amounts_ud</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"><span class="str">    Append reference/comment</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t">    <span class="nam">issuers</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t">    <span class="key">for</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">received_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t">        <span class="key">for</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">received_tx</span><span class="op">.</span><span class="nam">issuers</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t">            <span class="nam">issuers</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">issuer</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t">    <span class="nam">identities</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identities_from_pubkeys</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">uids</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t">    <span class="key">for</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">received_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t">        <span class="nam">tx_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t">        <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">issuers</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t">            <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="key">None</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t">                <span class="nam">issuer</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t">                <span class="nam">identities</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t">                <span class="nam">full_pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t">            <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t">        <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">received_func</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t">        <span class="nam">received_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"><span class="key">def</span> <span class="nam">parse_sent_tx</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t">    <span class="nam">sent_txs_table</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t">    <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t">    <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t">    <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t">    <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"><span class="str">    Extract recipients` pubkeys from outputs</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"><span class="str">    Get identities from pubkeys</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="str">    Convert time into human format</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"><span class="str">    Store "Total" and total amounts according to the number of outputs</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"><span class="str">    If not output back return:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"><span class="str">    Assign amounts, amounts_ud, identities, and comment</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t">    <span class="nam">pubkeys</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t">    <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t">        <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t">        <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">outputs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t">            <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t">                <span class="nam">pubkeys</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t">    <span class="nam">identities</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identities_from_pubkeys</span><span class="op">(</span><span class="nam">pubkeys</span><span class="op">,</span> <span class="nam">uids</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t">    <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t">        <span class="nam">tx_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t">        <span class="nam">total_amount</span><span class="op">,</span> <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t">            <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">"Total"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t">            <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t">            <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t">        <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t">            <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t">            <span class="nam">amounts</span> <span class="op">=</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t">            <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t">        <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t">            <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t">                <span class="nam">amounts</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t">                    <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t">                <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t">                <span class="nam">amounts_ud</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t">                    <span class="nam">round</span><span class="op">(</span><span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t">                <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t">                <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="num">0</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t">                    <span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t">                    <span class="nam">identities</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t">                    <span class="nam">full_pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t">                <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts_ud</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t">        <span class="nam">sent_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t"><span class="key">def</span> <span class="nam">tx_amount</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t">    <span class="nam">tx</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t">    <span class="nam">function</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">tuple</span><span class="op">[</span><span class="nam">int</span><span class="op">,</span> <span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t"><span class="str">    Determine transaction amount from output sources</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t">    <span class="nam">amount</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t">    <span class="nam">outputs</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t">    <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">tx</span><span class="op">.</span><span class="nam">outputs</span><span class="op">:</span>  <span class="com"># type: ignore[attr-defined]</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t">        <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t">            <span class="nam">outputs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t">        <span class="nam">amount</span> <span class="op">+=</span> <span class="nam">function</span><span class="op">(</span><span class="nam">output</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t">    <span class="key">return</span> <span class="nam">amount</span><span class="op">,</span> <span class="nam">outputs</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t"><span class="key">def</span> <span class="nam">received_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t">    <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">eq</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t">        <span class="key">return</span> <span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t">    <span class="key">return</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t297" href="#t297">297</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t298" href="#t298">298</a></span><span class="t"><span class="key">def</span> <span class="nam">sent_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t299" href="#t299">299</a></span><span class="t">    <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t300" href="#t300">300</a></span><span class="t">        <span class="key">return</span> <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t301" href="#t301">301</a></span><span class="t">    <span class="key">return</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t302" href="#t302">302</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t303" href="#t303">303</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t304" href="#t304">304</a></span><span class="t"><span class="key">def</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">condition</span><span class="op">:</span> <span class="nam">Condition</span><span class="op">,</span> <span class="nam">comparison</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span> <span class="nam">value</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t305" href="#t305">305</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t306" href="#t306">306</a></span><span class="t"><span class="str">    Check if output source is available</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t307" href="#t307">307</a></span><span class="t"><span class="str">    Currently only handle simple SIG condition</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t308" href="#t308">308</a></span><span class="t"><span class="str">    XHX, CLTV, CSV should be handled when present in the blockchain</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t309" href="#t309">309</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t310" href="#t310">310</a></span><span class="t">    <span class="key">if</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">,</span> <span class="str">"pubkey"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t311" href="#t311">311</a></span><span class="t">        <span class="key">return</span> <span class="nam">comparison</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="mis show_mis"><span class="n"><a id="t312" href="#t312">312</a></span><span class="t">    <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t313" href="#t313">313</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t314" href="#t314">314</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t315" href="#t315">315</a></span><span class="t"><span class="key">def</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">identities</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t316" href="#t316">316</a></span><span class="t">    <span class="nam">idty</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t317" href="#t317">317</a></span><span class="t">    <span class="key">for</span> <span class="nam">identity</span> <span class="key">in</span> <span class="nam">identities</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t318" href="#t318">318</a></span><span class="t">        <span class="key">if</span> <span class="nam">pubkey</span> <span class="op">==</span> <span class="nam">identity</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t319" href="#t319">319</a></span><span class="t">            <span class="nam">pubkey_mod</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t320" href="#t320">320</a></span><span class="t">            <span class="nam">idty</span> <span class="op">=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> - </span><span class="op">{</span><span class="nam">pubkey_mod</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t321" href="#t321">321</a></span><span class="t">    <span class="key">return</span> <span class="nam">idty</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t322" href="#t322">322</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t323" href="#t323">323</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t324" href="#t324">324</a></span><span class="t"><span class="key">def</span> <span class="nam">prefix</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t325" href="#t325">325</a></span><span class="t">    <span class="nam">tx_addresses</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t326" href="#t326">326</a></span><span class="t">    <span class="nam">outputs</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t327" href="#t327">327</a></span><span class="t">    <span class="nam">occurence</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t328" href="#t328">328</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t329" href="#t329">329</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t330" href="#t330">330</a></span><span class="t"><span class="str">    Pretty print with texttable</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t331" href="#t331">331</a></span><span class="t"><span class="str">    Break line when several values in a cell</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t332" href="#t332">332</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t333" href="#t333">333</a></span><span class="t"><span class="str">    Received tx case, 'outputs' is not defined, then add a breakline</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t334" href="#t334">334</a></span><span class="t"><span class="str">    between the pubkeys except for the first occurence for multi-sig support</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t335" href="#t335">335</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t336" href="#t336">336</a></span><span class="t"><span class="str">    Sent tx case, handle "Total" line in case of multi-output txs</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t337" href="#t337">337</a></span><span class="t"><span class="str">    In case of multiple outputs, there is a "Total" on the top,</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t338" href="#t338">338</a></span><span class="t"><span class="str">    where there must be a breakline</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t339" href="#t339">339</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t340" href="#t340">340</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t341" href="#t341">341</a></span><span class="t">    <span class="key">if</span> <span class="key">not</span> <span class="nam">outputs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t342" href="#t342">342</a></span><span class="t">        <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">occurence</span> <span class="op">></span> <span class="num">0</span> <span class="key">else</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
-    <p class="pln"><span class="n"><a id="t343" href="#t343">343</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t344" href="#t344">344</a></span><span class="t">    <span class="key">if</span> <span class="nam">tx_addresses</span> <span class="op">==</span> <span class="str">"Total"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t345" href="#t345">345</a></span><span class="t">        <span class="key">return</span> <span class="str">"\n"</span>&nbsp;</span><span class="r"></span></p>
-    <p class="run"><span class="n"><a id="t346" href="#t346">346</a></span><span class="t">    <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span> <span class="key">else</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t">        <span class="key">if</span> <span class="nam">csv_file</span><span class="op">.</span><span class="nam">is_file</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t">            <span class="nam">click</span><span class="op">.</span><span class="nam">confirm</span><span class="op">(</span><span class="fst">f"</span><span class="op">{</span><span class="nam">csv_file</span><span class="op">}</span><span class="fst"> exists, would you like to erase it?</span><span class="fst">"</span><span class="op">,</span> <span class="nam">abort</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t">        <span class="nam">txs_list</span><span class="op">.</span><span class="nam">insert</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="nam">table_headers</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t">        <span class="key">with</span> <span class="nam">csv_file</span><span class="op">.</span><span class="nam">open</span><span class="op">(</span><span class="str">"w"</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">"utf-8"</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">            <span class="nam">writer</span> <span class="op">=</span> <span class="nam">csv</span><span class="op">.</span><span class="nam">writer</span><span class="op">(</span><span class="nam">f</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">            <span class="nam">writer</span><span class="op">.</span><span class="nam">writerows</span><span class="op">(</span><span class="nam">txs_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t">        <span class="nam">click</span><span class="op">.</span><span class="nam">echo</span><span class="op">(</span><span class="fst">f"</span><span class="op">{</span><span class="nam">csv_file</span><span class="op">}</span><span class="fst"> file successfully saved!</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t">    <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t">        <span class="nam">table</span> <span class="op">=</span> <span class="nam">Table</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t">        <span class="nam">table</span><span class="op">.</span><span class="nam">fill_rows</span><span class="op">(</span><span class="nam">txs_list</span><span class="op">,</span> <span class="nam">table_headers</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t">        <span class="nam">header</span> <span class="op">=</span> <span class="nam">generate_header</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">currency_symbol</span><span class="op">,</span> <span class="nam">ud_value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t">        <span class="nam">click</span><span class="op">.</span><span class="nam">echo_via_pager</span><span class="op">(</span><span class="nam">header</span> <span class="op">+</span> <span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"><span class="key">def</span> <span class="nam">generate_header</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">currency_symbol</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t">    <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t">        <span class="nam">idty</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identity_of</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t">    <span class="key">except</span> <span class="nam">HTTPError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t">        <span class="nam">idty</span> <span class="op">=</span> <span class="op">{</span><span class="str">"uid"</span><span class="op">:</span> <span class="str">""</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">    <span class="nam">balance</span> <span class="op">=</span> <span class="nam">mt</span><span class="op">.</span><span class="nam">get_amount_from_pubkey</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t">    <span class="nam">balance_ud</span> <span class="op">=</span> <span class="nam">round</span><span class="op">(</span><span class="nam">balance</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">    <span class="nam">date</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t">    <span class="key">return</span> <span class="fst">f"</span><span class="fst">Transactions history from: </span><span class="op">{</span><span class="nam">idty</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> </span><span class="op">{</span><span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span><span class="op">}</span><span class="fst">\n\</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"><span class="fst">Current balance: </span><span class="op">{</span><span class="nam">balance</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">}</span><span class="fst"> </span><span class="op">{</span><span class="nam">currency_symbol</span><span class="op">}</span><span class="fst">, </span><span class="op">{</span><span class="nam">balance_ud</span><span class="op">}</span><span class="fst"> UD </span><span class="op">{</span><span class="nam">currency_symbol</span><span class="op">}</span><span class="fst"> on </span><span class="op">{</span><span class="nam">date</span><span class="op">}</span><span class="fst">\n</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"><span class="key">def</span> <span class="nam">get_transactions_history</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t">    <span class="nam">client</span><span class="op">:</span> <span class="nam">Client</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t">    <span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t">    <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"><span class="str">    Get transaction history</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"><span class="str">    Store txs in Transaction object</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">    <span class="nam">tx_history</span> <span class="op">=</span> <span class="nam">client</span><span class="op">(</span><span class="nam">history</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t">    <span class="nam">currency</span> <span class="op">=</span> <span class="nam">tx_history</span><span class="op">[</span><span class="str">"currency"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t">    <span class="key">for</span> <span class="nam">received</span> <span class="key">in</span> <span class="nam">tx_history</span><span class="op">[</span><span class="str">"history"</span><span class="op">]</span><span class="op">[</span><span class="str">"received"</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t">        <span class="nam">received_txs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">Transaction</span><span class="op">.</span><span class="nam">from_bma_history</span><span class="op">(</span><span class="nam">received</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t">    <span class="key">for</span> <span class="nam">sent</span> <span class="key">in</span> <span class="nam">tx_history</span><span class="op">[</span><span class="str">"history"</span><span class="op">]</span><span class="op">[</span><span class="str">"sent"</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t">        <span class="nam">sent_txs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">Transaction</span><span class="op">.</span><span class="nam">from_bma_history</span><span class="op">(</span><span class="nam">sent</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"><span class="key">def</span> <span class="nam">remove_duplicate_txs</span><span class="op">(</span><span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"><span class="str">    Remove duplicate transactions from history</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"><span class="str">    Remove received tx which contains output back return</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"><span class="str">    that we don't want to displayed</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"><span class="str">    A copy of received_txs is necessary to remove elements</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t">    <span class="key">for</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">list</span><span class="op">(</span><span class="nam">received_txs</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t">        <span class="key">if</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t">            <span class="nam">received_txs</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"><span class="key">def</span> <span class="nam">generate_txs_list</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t">    <span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t">    <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t">    <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t">    <span class="nam">currency_symbol</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t">    <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t">    <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"><span class="str">    Generate information in a list of lists for texttable</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"><span class="str">    Merge received and sent txs</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"><span class="str">    Sort txs temporarily</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t">    <span class="nam">received_txs_list</span><span class="op">,</span> <span class="nam">sent_txs_list</span> <span class="op">=</span> <span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t">        <span class="op">[</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t">        <span class="op">[</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t">    <span class="op">)</span>  <span class="com"># type: list[Transaction], list[Transaction]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t">    <span class="nam">parse_received_tx</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t">        <span class="nam">received_txs_list</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t">        <span class="nam">received_txs</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t">        <span class="nam">pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t">        <span class="nam">ud_value</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t">        <span class="nam">uids</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t">        <span class="nam">full_pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t">    <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t">    <span class="nam">parse_sent_tx</span><span class="op">(</span><span class="nam">sent_txs_list</span><span class="op">,</span> <span class="nam">sent_txs</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="nam">uids</span><span class="op">,</span> <span class="nam">full_pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t">    <span class="nam">txs_list</span> <span class="op">=</span> <span class="nam">received_txs_list</span> <span class="op">+</span> <span class="nam">sent_txs_list</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t">    <span class="nam">txs_list</span><span class="op">.</span><span class="nam">sort</span><span class="op">(</span><span class="nam">key</span><span class="op">=</span><span class="nam">itemgetter</span><span class="op">(</span><span class="num">0</span><span class="op">)</span><span class="op">,</span> <span class="nam">reverse</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t">    <span class="key">return</span> <span class="nam">txs_list</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"><span class="key">def</span> <span class="nam">parse_received_tx</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t">    <span class="nam">received_txs_table</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t">    <span class="nam">received_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t">    <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t">    <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t">    <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"><span class="str">    Extract issuers` pubkeys</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"><span class="str">    Get identities from pubkeys</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"><span class="str">    Convert time into human format</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"><span class="str">    Assign identities</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"><span class="str">    Get amounts and assign amounts and amounts_ud</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"><span class="str">    Append reference/comment</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t">    <span class="nam">issuers</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t">    <span class="key">for</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">received_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t">        <span class="key">for</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">received_tx</span><span class="op">.</span><span class="nam">issuers</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t">            <span class="nam">issuers</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">issuer</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t">    <span class="nam">identities</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identities_from_pubkeys</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">uids</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t">    <span class="key">for</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">received_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t">        <span class="nam">tx_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t">        <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">issuers</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t">            <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="key">None</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t">                <span class="nam">issuer</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t">                <span class="nam">identities</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t">                <span class="nam">full_pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t">            <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t">        <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">received_func</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t">        <span class="nam">received_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"><span class="key">def</span> <span class="nam">parse_sent_tx</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t">    <span class="nam">sent_txs_table</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t">    <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t">    <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t">    <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t">    <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="str">    Extract recipients` pubkeys from outputs</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"><span class="str">    Get identities from pubkeys</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"><span class="str">    Convert time into human format</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"><span class="str">    Store "Total" and total amounts according to the number of outputs</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"><span class="str">    If not output back return:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"><span class="str">    Assign amounts, amounts_ud, identities, and comment</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t">    <span class="nam">pubkeys</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t">    <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t">        <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t">        <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">outputs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t">            <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t">                <span class="nam">pubkeys</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t">    <span class="nam">identities</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identities_from_pubkeys</span><span class="op">(</span><span class="nam">pubkeys</span><span class="op">,</span> <span class="nam">uids</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t">    <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t">        <span class="nam">tx_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t">        <span class="nam">total_amount</span><span class="op">,</span> <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t">            <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">"Total"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t">            <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t">            <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t">        <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t">            <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t">            <span class="nam">amounts</span> <span class="op">=</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t">            <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t">        <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t">            <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t">                <span class="nam">amounts</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t">                    <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t">                <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t">                <span class="nam">amounts_ud</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t">                    <span class="nam">round</span><span class="op">(</span><span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t">                <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t">                <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="num">0</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t">                    <span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t">                    <span class="nam">identities</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t">                    <span class="nam">full_pubkey</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t">                <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts_ud</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t">        <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t">        <span class="nam">sent_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t"><span class="key">def</span> <span class="nam">tx_amount</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t">    <span class="nam">tx</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t">    <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t">    <span class="nam">function</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">tuple</span><span class="op">[</span><span class="nam">int</span><span class="op">,</span> <span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t"><span class="str">    Determine transaction amount from output sources</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t">    <span class="nam">amount</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t">    <span class="nam">outputs</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t">    <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">tx</span><span class="op">.</span><span class="nam">outputs</span><span class="op">:</span>  <span class="com"># type: ignore[attr-defined]</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t">        <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t">            <span class="nam">outputs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t">        <span class="nam">amount</span> <span class="op">+=</span> <span class="nam">function</span><span class="op">(</span><span class="nam">output</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t">    <span class="key">return</span> <span class="nam">amount</span><span class="op">,</span> <span class="nam">outputs</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t"><span class="key">def</span> <span class="nam">received_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t">    <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">eq</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t">        <span class="key">return</span> <span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t297" href="#t297">297</a></span><span class="t">    <span class="key">return</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t298" href="#t298">298</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t299" href="#t299">299</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t300" href="#t300">300</a></span><span class="t"><span class="key">def</span> <span class="nam">sent_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t301" href="#t301">301</a></span><span class="t">    <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t302" href="#t302">302</a></span><span class="t">        <span class="key">return</span> <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t303" href="#t303">303</a></span><span class="t">    <span class="key">return</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t304" href="#t304">304</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t305" href="#t305">305</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t306" href="#t306">306</a></span><span class="t"><span class="key">def</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">condition</span><span class="op">:</span> <span class="nam">Condition</span><span class="op">,</span> <span class="nam">comparison</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span> <span class="nam">value</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t307" href="#t307">307</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t308" href="#t308">308</a></span><span class="t"><span class="str">    Check if output source is available</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t309" href="#t309">309</a></span><span class="t"><span class="str">    Currently only handle simple SIG condition</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t310" href="#t310">310</a></span><span class="t"><span class="str">    XHX, CLTV, CSV should be handled when present in the blockchain</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t311" href="#t311">311</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t312" href="#t312">312</a></span><span class="t">    <span class="key">if</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">,</span> <span class="str">"pubkey"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t313" href="#t313">313</a></span><span class="t">        <span class="key">return</span> <span class="nam">comparison</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="mis show_mis"><span class="n"><a id="t314" href="#t314">314</a></span><span class="t">    <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t315" href="#t315">315</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t316" href="#t316">316</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t317" href="#t317">317</a></span><span class="t"><span class="key">def</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">identities</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t318" href="#t318">318</a></span><span class="t">    <span class="nam">idty</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t319" href="#t319">319</a></span><span class="t">    <span class="key">for</span> <span class="nam">identity</span> <span class="key">in</span> <span class="nam">identities</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t320" href="#t320">320</a></span><span class="t">        <span class="key">if</span> <span class="nam">pubkey</span> <span class="op">==</span> <span class="nam">identity</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t321" href="#t321">321</a></span><span class="t">            <span class="nam">pubkey_mod</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t322" href="#t322">322</a></span><span class="t">            <span class="nam">idty</span> <span class="op">=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> - </span><span class="op">{</span><span class="nam">pubkey_mod</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t323" href="#t323">323</a></span><span class="t">    <span class="key">return</span> <span class="nam">idty</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t324" href="#t324">324</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t325" href="#t325">325</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t326" href="#t326">326</a></span><span class="t"><span class="key">def</span> <span class="nam">prefix</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t327" href="#t327">327</a></span><span class="t">    <span class="nam">tx_addresses</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t328" href="#t328">328</a></span><span class="t">    <span class="nam">outputs</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t329" href="#t329">329</a></span><span class="t">    <span class="nam">occurence</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t330" href="#t330">330</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t331" href="#t331">331</a></span><span class="t">    <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t332" href="#t332">332</a></span><span class="t"><span class="str">    Pretty print with texttable</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t333" href="#t333">333</a></span><span class="t"><span class="str">    Break line when several values in a cell</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t334" href="#t334">334</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t335" href="#t335">335</a></span><span class="t"><span class="str">    Received tx case, 'outputs' is not defined, then add a breakline</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t336" href="#t336">336</a></span><span class="t"><span class="str">    between the pubkeys except for the first occurence for multi-sig support</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t337" href="#t337">337</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t338" href="#t338">338</a></span><span class="t"><span class="str">    Sent tx case, handle "Total" line in case of multi-output txs</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t339" href="#t339">339</a></span><span class="t"><span class="str">    In case of multiple outputs, there is a "Total" on the top,</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t340" href="#t340">340</a></span><span class="t"><span class="str">    where there must be a breakline</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t341" href="#t341">341</a></span><span class="t"><span class="str">    """</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t342" href="#t342">342</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t343" href="#t343">343</a></span><span class="t">    <span class="key">if</span> <span class="key">not</span> <span class="nam">outputs</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t344" href="#t344">344</a></span><span class="t">        <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">occurence</span> <span class="op">></span> <span class="num">0</span> <span class="key">else</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
+    <p class="pln"><span class="n"><a id="t345" href="#t345">345</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t346" href="#t346">346</a></span><span class="t">    <span class="key">if</span> <span class="nam">tx_addresses</span> <span class="op">==</span> <span class="str">"Total"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t347" href="#t347">347</a></span><span class="t">        <span class="key">return</span> <span class="str">"\n"</span>&nbsp;</span><span class="r"></span></p>
+    <p class="run"><span class="n"><a id="t348" href="#t348">348</a></span><span class="t">    <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span> <span class="key">else</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
 </main>
 <footer>
     <div class="content">
@@ -435,7 +437,7 @@
             <a class="nav" href="z_8394fdfe5cf191f4_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html b/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html
index 7d8814ec4aaab7ca3e33aaad7699c9239205b238..88ef6e7b4d760eb74e79cc0644a59c621bdaeaa1 100644
--- a/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html
+++ b/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_transfer_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -222,7 +222,7 @@
             <a class="nav" href="z_8394fdfe5cf191f4_transfer_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html b/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html
index 1113a067645015a20012d4d0f3ea81b5aeeb1afd..0e30fb6163c4b1d62ac06927dfac5a3eec613a49 100644
--- a/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html
+++ b/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_network_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -690,7 +690,7 @@
             <a class="nav" href="z_c69109531bf836fe_network_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe___init___py.html b/0.12/coverage/z_c69109531bf836fe___init___py.html
index 82003df7aed3a0cfa886e7964d7255b31a790853..c9832b01addcb7f9311afae97808d4cf13b8caca 100644
--- a/0.12/coverage/z_c69109531bf836fe___init___py.html
+++ b/0.12/coverage/z_c69109531bf836fe___init___py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_about_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -105,7 +105,7 @@
             <a class="nav" href="z_c69109531bf836fe_about_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_about_py.html b/0.12/coverage/z_c69109531bf836fe_about_py.html
index 6359e49053c0be54a6ff76fb410e4e36f57eefbd..27c4fb5c7de9f450ec424846d1e045f595882d34 100644
--- a/0.12/coverage/z_c69109531bf836fe_about_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_about_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_account_storage_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -135,7 +135,7 @@
             <a class="nav" href="z_c69109531bf836fe_account_storage_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_account_storage_py.html b/0.12/coverage/z_c69109531bf836fe_account_storage_py.html
index af220c6fb0af0ca7cae4a7d307cafdaadb6abd09..1007811a15038dad5aac1b2552bd1a8404497d8d 100644
--- a/0.12/coverage/z_c69109531bf836fe_account_storage_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_account_storage_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_auth_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -143,7 +143,7 @@
             <a class="nav" href="z_c69109531bf836fe_auth_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_auth_py.html b/0.12/coverage/z_c69109531bf836fe_auth_py.html
index 3014cf20373f6b4132a1b6217853512bd51669ce..76a34da679c1d9aacdc794aadd933a5c3f6b7fbe 100644
--- a/0.12/coverage/z_c69109531bf836fe_auth_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_auth_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1___init___py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -320,7 +320,7 @@
             <a class="nav" href="z_e7a021a3963ba4f1___init___py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_checksum_py.html b/0.12/coverage/z_c69109531bf836fe_checksum_py.html
index 7755ab267c8867e9b1814ce075d96d321d929cce..037285dd60d43def06f73729766b91851900c2fd 100644
--- a/0.12/coverage/z_c69109531bf836fe_checksum_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_checksum_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_cli_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -141,7 +141,7 @@
             <a class="nav" href="z_c69109531bf836fe_cli_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_cli_py.html b/0.12/coverage/z_c69109531bf836fe_cli_py.html
index c941e33cdb0590e6590b3c2a6c131b9520076d8c..5dcc16c4ab9ad81c268ddef592dc44f0dc61ca50 100644
--- a/0.12/coverage/z_c69109531bf836fe_cli_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_cli_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_constants_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -269,7 +269,7 @@
             <a class="nav" href="z_c69109531bf836fe_constants_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_constants_py.html b/0.12/coverage/z_c69109531bf836fe_constants_py.html
index 89679a5e80a8821cb90527f1e386924aaa1c2d06..19a50e8873988b272f214f91fe0656e89ac00db2 100644
--- a/0.12/coverage/z_c69109531bf836fe_constants_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_constants_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_g1_monetary_license_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -137,7 +137,7 @@
             <a class="nav" href="z_c69109531bf836fe_g1_monetary_license_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html b/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html
index 2d038e64c295db609a639b989e2a43ed4a0d077e..605268cd098661ae86e61bb3e36741cba6a905f2 100644
--- a/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4___init___py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -170,7 +170,7 @@
             <a class="nav" href="z_8394fdfe5cf191f4___init___py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_network_py.html b/0.12/coverage/z_c69109531bf836fe_network_py.html
index aa9d11c0e6143ca644c30170bec7e022ce2cf38a..13cbedc3c69f9b9b4d25ad2e4f678717eb69f43e 100644
--- a/0.12/coverage/z_c69109531bf836fe_network_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_network_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_public_key_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -184,7 +184,7 @@
             <a class="nav" href="z_c69109531bf836fe_public_key_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_public_key_py.html b/0.12/coverage/z_c69109531bf836fe_public_key_py.html
index 127643218572a593aa8a917c53a849047f1e91ee..b5eaf5e77b1dde5c379bb8b718319438b06c7ee1 100644
--- a/0.12/coverage/z_c69109531bf836fe_public_key_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_public_key_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -184,7 +184,7 @@
             <a class="nav" href="z_c69109531bf836fe_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_tools_py.html b/0.12/coverage/z_c69109531bf836fe_tools_py.html
index 748f1edee6a1db0462ec67d0f8e686453b3da78e..df6a65ab92c27b467218f55834491e5f0773a4dc 100644
--- a/0.12/coverage/z_c69109531bf836fe_tools_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_tools_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_tui_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -163,7 +163,7 @@
             <a class="nav" href="z_c69109531bf836fe_tui_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_c69109531bf836fe_tui_py.html b/0.12/coverage/z_c69109531bf836fe_tui_py.html
index e5a3e9ed007d66991b892c12c366b792fd38bca4..b0773fec6562eff75b4e38818be471a304f5c08d 100644
--- a/0.12/coverage/z_c69109531bf836fe_tui_py.html
+++ b/0.12/coverage/z_c69109531bf836fe_tui_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0___init___py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -189,7 +189,7 @@
             <a class="nav" href="z_e099210adb7d42f0___init___py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0___init___py.html b/0.12/coverage/z_e099210adb7d42f0___init___py.html
index 885e12327b81b00a6c423a581dfff351e24582cb..1afd2794d6a589ec36d95bdda464927191149c89 100644
--- a/0.12/coverage/z_e099210adb7d42f0___init___py.html
+++ b/0.12/coverage/z_e099210adb7d42f0___init___py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_certify_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -103,7 +103,7 @@
             <a class="nav" href="z_e099210adb7d42f0_certify_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_certify_py.html b/0.12/coverage/z_e099210adb7d42f0_certify_py.html
index c78b38a99b9da40ecde77a46ca8886a73c602709..10df61e44167f1f261205b8fc683a63afd45182e 100644
--- a/0.12/coverage/z_e099210adb7d42f0_certify_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_certify_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_exclusions_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -265,7 +265,7 @@
             <a class="nav" href="z_e099210adb7d42f0_exclusions_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html b/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html
index ebd9d7986ee87ece240f4b01367aba47605dbd65..6fb78187d3cbf4756e71a03e5da294da9034f7cd 100644
--- a/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_idty_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -372,7 +372,7 @@
             <a class="nav" href="z_e099210adb7d42f0_idty_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html b/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html
index 9d921914ec38a1c9a44e3c7e31f8323aff86d124..c332b0d851aa0963ea8521e640bfd350ac85d5c9 100644
--- a/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_lookup_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -218,7 +218,7 @@
             <a class="nav" href="z_e099210adb7d42f0_lookup_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_lookup_py.html b/0.12/coverage/z_e099210adb7d42f0_lookup_py.html
index 6daa1c1ef463084706a1af4c4650782cfa253ffe..31487f62f2681e24215927e9b1d422404455b2e4 100644
--- a/0.12/coverage/z_e099210adb7d42f0_lookup_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_lookup_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_membership_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -131,7 +131,7 @@
             <a class="nav" href="z_e099210adb7d42f0_membership_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_membership_py.html b/0.12/coverage/z_e099210adb7d42f0_membership_py.html
index 57e11644ca5c03c31ddc390299bf1cb7008546e9..f7613a3e8f378884406db546e53efe384569b3dd 100644
--- a/0.12/coverage/z_e099210adb7d42f0_membership_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_membership_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_revocation_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -262,7 +262,7 @@
             <a class="nav" href="z_e099210adb7d42f0_revocation_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_revocation_py.html b/0.12/coverage/z_e099210adb7d42f0_revocation_py.html
index e9127ca2e3e3555b5507ea9000302afa6b766262..c843ef5899f6025a5e0a32c5aca8c33ceaaa2a1b 100644
--- a/0.12/coverage/z_e099210adb7d42f0_revocation_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_revocation_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_status_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -294,7 +294,7 @@
             <a class="nav" href="z_e099210adb7d42f0_status_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_status_py.html b/0.12/coverage/z_e099210adb7d42f0_status_py.html
index 2c91ecf95ec3b9f38399e2210061cf43a55ef4f3..4cfd93ebbc5ea617512c4e73586aed77fcb4d467 100644
--- a/0.12/coverage/z_e099210adb7d42f0_status_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_status_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -241,7 +241,7 @@
             <a class="nav" href="z_e099210adb7d42f0_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e099210adb7d42f0_tools_py.html b/0.12/coverage/z_e099210adb7d42f0_tools_py.html
index 97643d984c08cf2aa40e77e90e9305dbe965fdc5..242efad1f45e5ffddc7955b7f461f2c9af117277 100644
--- a/0.12/coverage/z_e099210adb7d42f0_tools_py.html
+++ b/0.12/coverage/z_e099210adb7d42f0_tools_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="covindex.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -218,7 +218,7 @@
             <a class="nav" href="covindex.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e7a021a3963ba4f1___init___py.html b/0.12/coverage/z_e7a021a3963ba4f1___init___py.html
index 1660f7d592c8868e7095532fede185a7802ea63a..44df997fc76b02b8849c0917f53c3341927e9bba 100644
--- a/0.12/coverage/z_e7a021a3963ba4f1___init___py.html
+++ b/0.12/coverage/z_e7a021a3963ba4f1___init___py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_blocks_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -103,7 +103,7 @@
             <a class="nav" href="z_e7a021a3963ba4f1_blocks_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html b/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html
index ea58a5ed8eae350e77c33d731a98d30dbdf1d186..1affba186a8cb2d086ff4c2648e590b3a6210943 100644
--- a/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html
+++ b/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_difficulty_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -205,7 +205,7 @@
             <a class="nav" href="z_e7a021a3963ba4f1_difficulty_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html b/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html
index 3dc0a6008b774c890a8b9ae6d23d4775d0782e10..523deb874a99971090feae3db0fce4f866187e82 100644
--- a/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html
+++ b/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_information_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -177,7 +177,7 @@
             <a class="nav" href="z_e7a021a3963ba4f1_information_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e7a021a3963ba4f1_information_py.html b/0.12/coverage/z_e7a021a3963ba4f1_information_py.html
index bb38375327ce5c57109a071fcfda47a89d811f81..91bce46d06a8f59a7cb6df785657ddd554274497 100644
--- a/0.12/coverage/z_e7a021a3963ba4f1_information_py.html
+++ b/0.12/coverage/z_e7a021a3963ba4f1_information_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -138,7 +138,7 @@
             <a class="nav" href="z_e7a021a3963ba4f1_tools_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html b/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html
index f6f4f269e68dda5561c5a464679ecd5dc8c26554..a8382b40fb6c3eea8ce268a040faa84bd4a7a2fb 100644
--- a/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html
+++ b/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html
@@ -65,7 +65,7 @@
             <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_checksum_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
         <aside class="hidden">
             <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -126,7 +126,7 @@
             <a class="nav" href="z_c69109531bf836fe_checksum_py.html">&#xbb; next</a>
             &nbsp; &nbsp; &nbsp;
             <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>,
-            created at 2025-04-15 11:50 +0000
+            created at 2025-04-16 09:30 +0000
         </p>
     </div>
 </footer>
diff --git a/0.12/search/search_index.json b/0.12/search/search_index.json
index 49bc465f88e85e753328eed74cc070dc40955fe5..6eef74ad9b12b53498078a63714eeb487c41520c 100644
--- a/0.12/search/search_index.json
+++ b/0.12/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome","text":"<p>Welcome to Silkaj documentation</p> <p>Install  Usage </p>"},{"location":"#what-is-silkaj","title":"What is Silkaj?","text":"<p>Silkaj is a command line client for \u011e1 libre currency powered by Duniter software.</p> <ul> <li> <p> Money management</p> <p>Transfer money, check your balance, and history stand.</p> </li> <li> <p> Web-of-Trust management</p> <p>Manage your certifications, membership, and revocation document.</p> </li> <li> <p> Account management</p> <p>With the wallet import format authentication method.</p> </li> <li> <p> CLI interface</p> <p>Silkaj is built around a command line interface design.</p> </li> <li> <p> Low requirements</p> <p>Written with Python, Silkaj is built with low requirements in mind.</p> </li> <li> <p> RTM compatible</p> <p>Silkaj is compatible with the Relative Theory of Money and includes \u011e1 Monetary License.</p> </li> <li> <p> Free software</p> <p>Silkaj is licensed under  GNU\u00a0AGPL v3.</p> </li> </ul>"},{"location":"changelog/","title":"Changelog","text":""},{"location":"changelog/#0.11.2","title":"v0.11.2 November 22, 2023","text":"<ul> <li>#484: Support Python v3.12 on v0.11 release</li> </ul>"},{"location":"changelog/#pre-requisites","title":"Pre-requisites","text":"<ul> <li>disable <code>pylint</code> and <code>pyupgrade</code> hooks</li> <li>switch jobs to <code>3.12</code> image containing <code>pre-commit</code></li> <li>!195, duniterpy#205: Fix <code>gitlab-ci-linter</code> hook</li> </ul>"},{"location":"changelog/#support-python-v312","title":"Support Python v3.12","text":"<ul> <li>!237, #457: Drop Python v3.7 support</li> <li>Bump <code>pendulum</code> to <code>v3.0.0b1</code></li> <li>!238, !250, #448: Add support for Python v3.12</li> </ul>"},{"location":"changelog/#0.11.1","title":"v0.11.1 August 14, 2023","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206<ul> <li>Set tilde requirement, to allow future patch updates</li> </ul> </li> </ul>"},{"location":"changelog/#0.11.0","title":"v0.11.0 November 27, 2022","text":"<p>(Please see the full set of changes for this release also in v0.10.0rc0 note below)</p>"},{"location":"changelog/#cli","title":"CLI","text":"<ul> <li>!229, #430: Rename <code>certification</code> cmd to <code>certify</code> and <code>revocation save</code> to <code>revocation create</code></li> </ul>"},{"location":"changelog/#milestone-v0110","title":"Milestone v0.11.0","text":""},{"location":"changelog/#0.11.0rc0","title":"v0.11.0rc0 November 12, 2022","text":""},{"location":"changelog/#code","title":"Code","text":"<ul> <li>!199, #203: Migrate from <code>tabulate</code> to <code>texttable</code></li> <li>!216, #330: Repository restructuration</li> </ul>"},{"location":"changelog/#network","title":"Network","text":"<ul> <li>!211, #397: Replace singletons with <code>@functools.lru_cache()</code> decorator</li> <li>!220, #438, #411, #3: Add <code>sleep()</code> between <code>identity_of()</code> calls in a loop</li> </ul>"},{"location":"changelog/#cli_1","title":"CLI","text":"<ul> <li>!219, #430: Organize commands into subcommands</li> <li>!218, #436: Rename <code>tx</code> command to <code>transfer</code></li> <li>!223, #449: Get rid of <code>argos</code></li> </ul>"},{"location":"changelog/#dev-env","title":"Dev Env","text":"<ul> <li>!214, #163: Introduce type annotations for static typing with <code>mypy</code></li> <li>!227, #453: Support new <code>mypy</code> v0.990 reports</li> <li>!215, #292: Introduce <code>pylint</code> tool</li> <li>!212, #424: Introduce <code>flake8</code></li> <li>!222, #450: Replace <code>flake8</code> with <code>autoflake</code></li> <li>!210, #428: Introduce <code>pre-commit-hooks</code> and <code>mdformat</code> hooks</li> <li>!226, #451: <code>pre-commit:hooks</code> job doesn\u2019t appear</li> <li>!209, #408: Change workflow by changing from <code>master</code> and default <code>dev</code> branches to a single <code>main</code> branch</li> <li>!224, #441: Separate <code>unit</code> and <code>integration</code> tests</li> <li>!221, #442: Add support for Python v3.11</li> <li>!217, #447: Fix coverage integration into GitLab</li> </ul>"},{"location":"changelog/#documentation","title":"Documentation","text":"<ul> <li>!225, #224: Refactor <code>pip</code> install documentation: remove Windows part</li> <li>!225, #188, #293: Replace <code>pip</code> installation with <code>pipx</code></li> <li>#432: List printqrjune in wrappers list</li> </ul>"},{"location":"changelog/#0.10.0","title":"v0.10.0 April 18, 2022","text":"<p>(Please see the full set of changes for this release also in the v0.10.0rc0 and rc1 notes below)</p>"},{"location":"changelog/#milestone-v0100","title":"Milestone v0.10.0","text":""},{"location":"changelog/#0.10.0rc1","title":"v0.10.0rc1 April 6, 2022","text":"<ul> <li>#426, !207: \u011e1 Monetary License refactoring:<ul> <li>Drop display in a browser</li> <li>Discover available languages</li> <li>Create <code>G1MonetaryLicense</code> class out of existing functions</li> </ul> </li> <li>Add Italian translation of \u011e1 monetary license</li> <li>#421, !204 : <code>wot</code> command can display membership status from an other identity sharing same <code>uid</code>/<code>pubkey</code></li> <li>#422: <code>excluded</code> command displays information of an other identity sharing same uid/pubkey, not the one excluded</li> <li>#216 <code>diffi</code>: Catch WS disconnection exception</li> </ul>"},{"location":"changelog/#0.10.0rc0","title":"v0.10.0rc0 March 21, 2022","text":""},{"location":"changelog/#code_1","title":"Code","text":""},{"location":"changelog/#features","title":"Features","text":"<ul> <li>#89, !170: Manage the revocation document</li> <li>#134, !202: Read transaction recipients and amounts from a file</li> </ul>"},{"location":"changelog/#g1-monetary-license","title":"\u011e1 Monetary license","text":"<ul> <li>#221, !181: Research about \u011e1 monetary license integration and refactor of its handling in Silkaj</li> <li>#308, !181: \u011e1 license display on a workstation: give the choice how to display it</li> <li>#392, !181: \u011e1 monetary license files not included into the Python package</li> <li>!181: subtree updated bringing new translations: Esperanto, Espagnol, and Portuguese</li> </ul>"},{"location":"changelog/#deathreaper","title":"DeathReaper","text":"<ul> <li>#256: Implement <code>excluded</code> command to report excluded identities from the WoT / DeathReaper</li> </ul>"},{"location":"changelog/#network_1","title":"Network","text":"<ul> <li>#373, #396, #410, !182, !194: Drop asynchronous property</li> <li>#390, !182, !196: Implement generic <code>network_tools.send_document()</code></li> <li>#177, !188: Clean no longer used network layer functions<ul> <li>Rename global option from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> </ul> </li> <li>#181, #409, !193: Improve endpoint determination code layer</li> <li>#260: Disconnection bug when sending a document to a local node</li> </ul>"},{"location":"changelog/#other-changes","title":"Other changes","text":"<ul> <li>#407, !182: Support DuniterPy v1.0 Breaking Backward compatible changes in <code>Documents</code> classes</li> <li>#344, !177: Fix import loop issue</li> <li>!177: Generalize <code>pendulum</code> usage</li> <li>#416, !170: Move <code>wot_lookup()</code> exceptions handling in higher level functions</li> </ul>"},{"location":"changelog/#minor-impact-changes","title":"Minor impact changes","text":"<ul> <li>#194, !195: Convert strings to <code>f-strings</code></li> <li>#376, !195: Replace <code>tools.message_exit()</code> with <code>sys.exit()</code></li> <li>#413, !170: Create <code>get_currency()</code> helper</li> <li>#264, !178: Remove unmaintained and commented <code>network</code> command</li> </ul>"},{"location":"changelog/#meta","title":"Meta","text":"<ul> <li>!200: Bump DuniterPy to v1.1.0</li> <li>#332, !200: Drop Python v3.6 support</li> <li>#374, !197: Add support for Python v3.10</li> <li>#401, !184: Bump to click v8.0</li> <li>#364, !187: Introduce insert-license pre-commit hook, Switch <code>#</code> comment instead of <code>\"\"\"</code> docstring for the copyright and license statements</li> <li>#365, !201: Update the copyright date to 2022 in the headers of every source files</li> </ul>"},{"location":"changelog/#documentation_1","title":"Documentation","text":"<ul> <li>#384: Document how to release pre-releases</li> <li>!180: <code>README</code> and <code>CONTRIBUTING</code> enhancements</li> </ul>"},{"location":"changelog/#installationcontinuous-delivery","title":"Installation/Continuous Delivery","text":"<ul> <li>#388, !198: Set up Silkaj Docker images build automation</li> </ul>"},{"location":"changelog/#development-environmentcontinuous-integration","title":"Development Environment/Continuous Integration","text":"<ul> <li>#326, !189: Integrate coverage in GitLab coverage feature</li> <li>#355, !183: Set <code>Py:3.8</code> as default image and move coverage to <code>Py:3.9</code></li> <li>#355, !185: Move the coverage and the badge generations to v3.9 test job</li> <li>#414, !197: Drop Poetry lock file usage</li> <li>!175: <code>pyproject.toml</code> and <code>release.sh</code> clean-ups, Pyinstaller removal</li> </ul>"},{"location":"changelog/#introduce-and-generalize-pre-commit-usage","title":"Introduce and generalize <code>pre-commit</code> usage","text":"<ul> <li>#401, !183: Introduce <code>isort</code> and <code>gitlab-ci-linter</code> <code>pre-commit</code> hooks</li> <li>#403, !192: Introduce <code>pyupgrade</code>, Remove dev dep tools</li> <li>#406, !191: Set up <code>pre-commit</code> hooks CI jobs</li> <li>!179: Bump <code>black</code> to v21.4b2 and allow to install as pre-release</li> <li>!190: Update <code>pre-commit</code> doc. Document CI linter hook usage</li> </ul> <p>Thanks moul, matograine</p>"},{"location":"changelog/#0.9.0","title":"v0.9.0 April 17, 2021","text":""},{"location":"changelog/#milestone-v090","title":"Milestone v0.9.0","text":"<ul> <li>#345, #385, !171: Refactor <code>id</code>/<code>lookup</code> command exclusively using <code>/wot/lookup</code><ul> <li>Display non-member uids when passing a pubkey</li> <li>Use same algorithm as <code>choose_identity()</code> uses</li> <li>Rename <code>id</code> to <code>lookup</code> command</li> </ul> </li> <li>#377, !172: <code>balance</code>: Fix undefined variable in case of 'Total' label</li> </ul> <p>Plus what can be found bellow in v0.9.0rc</p>"},{"location":"changelog/#0.9.0rc","title":"v0.9.0rc March 24, 2021","text":""},{"location":"changelog/#code_2","title":"Code","text":""},{"location":"changelog/#tx","title":"<code>tx</code>","text":"<ul> <li>#281, !129: Handle transaction size limit properly</li> <li>#257, #312, #356: Handle chained transactions/Change txs lost while sending big amount</li> <li>#296, #362, !154, !157: Prevent sending transaction with 0 as amounts</li> <li>#172, !165: Refactor tx confirmation, by using <code>click.confirm()</code></li> </ul>"},{"location":"changelog/#balance","title":"<code>balance</code>","text":"<ul> <li>#300, !164: <code>balance</code>: Display corresponding member identity uid</li> <li>#366, !159: Fix wrong <code>DuniterError</code> exception handling in <code>wot.identity_of</code></li> <li>#377, !166: <code>balance</code>: Document <code>money.show_amount_from_pubkey()</code></li> <li>#342, !151: Don\u2019t allow to pass multiple times the same pubkey to the <code>balance</code> command</li> </ul>"},{"location":"changelog/#others","title":"Others","text":"<ul> <li>#218, !160: <code>history</code>: Add option to display the complete pubkeys</li> <li>#314, !165: Display option for <code>cert</code>, <code>membership</code> commands</li> <li>!165: Make <code>--dry-run</code> option a generic one</li> <li>#378, !165: Create and use generic <code>send_doc_confirmation()</code> in <code>cert</code> and <code>membership</code> commands</li> <li>#176, !149: Get rid of <code>PyNaCl</code> and use <code>base58</code> module</li> <li>#309, !163: <code>wot</code>: Fix legend about received certifications</li> <li>#208: <code>argos</code>: Remove duplicate call to <code>CurrencySymbol</code></li> </ul>"},{"location":"changelog/#tests","title":"Tests","text":"<ul> <li>#213, !130: Write unit tests for the <code>tx</code> command</li> <li>#282, !130: Split <code>patched.py</code> into files</li> <li>#335, !130: Merge the two functions testing <code>transaction_amount()</code></li> <li>#363, !129: Returns balance from <code>patched_get_source()</code></li> <li>#368, !161: Assertions are not tested when testing system exit</li> <li>#362, !156: Change \"moul\" id in tests</li> </ul>"},{"location":"changelog/#meta_1","title":"Meta","text":"<ul> <li>#240, !150: Drop Python 3.5 support</li> <li>#294, !150, docker/python3/poetry!1: Add support and set-up Python 3.9 test job</li> <li>#270: Silkaj v0.8.1 package for Debian Bullseye (v11)</li> <li>#226, !158: Get rid of <code>ipaddress</code> dependency</li> <li>#290, !162: Update <code>pre-commit</code> dev dependency</li> <li>#267: Update the copyright date to 2021 in the headers of every source files</li> <li>!150, !155, !167, Update DuniterPy from v0.58.1 to v0.62.0</li> <li>#313, !148: Be compatible with and handle new features from Poetry v1.1</li> <li>#299, !147: Introduce dev version suffix</li> </ul> <p>Thanks matograine, moul, atrax</p>"},{"location":"changelog/#0.8.1","title":"v0.8.1 November 30, 2020","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine</p>"},{"location":"changelog/#0.8.0","title":"v0.8.0 October 18, 2020","text":""},{"location":"changelog/#milestone-v080","title":"Milestone v0.8.0","text":""},{"location":"changelog/#code_3","title":"Code","text":""},{"location":"changelog/#transaction","title":"Transaction","text":"<ul> <li> <p>#111, !108: Support passing different amounts on multi-recipients tx</p> <ul> <li>Breaking change: Rename <code>--output</code> option to <code>--recipient</code></li> </ul> </li> <li> <p>Add extra small options to ease passing multiple amounts and recipients:</p> <ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code></li> </ul> </li> <li> <p>Add possibility to pass multiple options:</p> <ul> <li>Breaking change: recipients public keys are no longer <code>:</code> separated: <code>-r A -r B</code></li> </ul> </li> <li> <p>#232, !131, !132: Identities not retrieved for tx with several issuers, and to display the tx history</p> </li> <li> <p>#236, !107: Improve the confirmation display</p> </li> <li> <p>!144: Rework confirmation fields titles</p> </li> <li> <p>#235: Make sure only one option is passed to retrieve the amount of the transaction</p> </li> </ul>"},{"location":"changelog/#membership-wot","title":"Membership, WoT","text":"<ul> <li>#88, !140: Add <code>membership</code> command</li> <li>#88, !144: Rework table fields names</li> <li>#140, !140: Ability to pass an <code>uid</code> or a <code>pubkey</code> to <code>wot</code>, and <code>cert</code>, <code>membership</code> commands<ul> <li>Implement identity choice selector</li> </ul> </li> </ul>"},{"location":"changelog/#checksum","title":"Checksum","text":"<ul> <li>#237, !132: Breaking change: Switch back the checksum delimiter from <code>!</code> to <code>:</code></li> <li>#323, !132: Handle pubkey's checksum in the tx code</li> <li>#301, !143: Generalize pubkey checksum display and verifiction, Add <code>chekcsum</code> command</li> <li>#320, !143: Incorrect use of <code>check_public_key()</code> in <code>id</code> command</li> </ul>"},{"location":"changelog/#others_1","title":"Others","text":"<ul> <li>#262, !123: Add new <code>verify</code> command to check blocks\u2019 signatures</li> <li>#264, !133: Disable the broken <code>net</code> command</li> <li>!131: Display <code>powMin</code> in a row in the <code>blocks</code> explorer</li> <li>#210, !115: Close client session in every cases</li> <li>#223: Make Click context optional to be able to call functions from an external module</li> <li>#255, !113: <code>balance</code>: display the content in tables</li> <li>#269, !133: Move <code>convert_time()</code> to <code>tui.py</code></li> <li>#278, !128: Fix PubSec regex</li> <li>#336, !141: <code>history</code>: Pubkeys display issue with multisig txs</li> </ul>"},{"location":"changelog/#dev-env_1","title":"Dev Env","text":""},{"location":"changelog/#poetry-migration","title":"Poetry migration","text":"<ul> <li>#182: Migrate from Pipenv and <code>setup.py</code> to Poetry</li> <li>#249: Install Poetry stable when v1 is released</li> <li>#263, !127: Post migration tasks (black, poetry)</li> <li>#276, !120: Pip installation do not install <code>silkaj</code> executalbe into <code>$HOME/.local/bin</code></li> </ul>"},{"location":"changelog/#cicd-set-up","title":"CI/CD set-up","text":"<ul> <li>#245: Automated containers builds with Poetry installed for Python versions 3.5, 3.6, 3.7, and 3.8</li> <li>#149: CI/CD set up</li> <li>#105: Deploy on PyPI from GitLab CD</li> <li>#146: Add a coverage badge</li> <li>#284, !124: <code>build</code> and <code>tests</code> jobs are not retriggered in case of source code change</li> <li>#286, !126: Use latest Black version from PyPI in the container</li> <li>!131: Use <code>rules</code> instead of <code>only/except</code></li> </ul>"},{"location":"changelog/#tests_1","title":"Tests","text":"<ul> <li>#241: Can not run test with Click utility</li> </ul>"},{"location":"changelog/#dependencies","title":"Dependencies","text":"<ul> <li>#259: <code>attr</code> error while installing with <code>pip</code></li> <li>!121, !131, !142: Update DuniterPy from v0.55.1 to v0.58.0</li> <li>#251, !140: Introduce <code>pendulum</code> date utility</li> <li>Introduce <code>pytest-sugar</code></li> <li>Update PyNaCl to v1.4.0</li> <li>Update Click to v7.1.2</li> <li>#338, !140: Update black to v20</li> </ul>"},{"location":"changelog/#python-versions-support","title":"Python versions support","text":"<p>We added the support for Python 3.8. #240: It is planned that v0.8.x versions are going to be the last releases with Python 3.5 support since its support from the Python project has been dropped September 30th of 2020.</p>"},{"location":"changelog/#documentation_2","title":"Documentation","text":"<ul> <li>#202: Document contribution process in <code>CONTRIBUTING.md</code></li> <li>#182: Document Poetry installation and usage</li> <li>!109: Add Poetry installation on Debian Buster</li> <li>!103: Add pip installation documentation for macOS</li> <li>!131: Add packaging status badge from Repology</li> <li>#244: Add <code>AUTHORS.md</code> listing the contributors</li> <li>#207: Create Silkaj SVG logo</li> </ul>"},{"location":"changelog/#project","title":"Project","text":"<ul> <li>#252, !118: Create a script to update and update the copyright date to 2020</li> <li>#285, !132: Add copyright and license statements in tests source files</li> </ul>"},{"location":"changelog/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"changelog/#0.7.6","title":"v0.7.6 January 24, 2020","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"changelog/#0.7.5","title":"v0.7.5 January 23, 2020","text":"<ul> <li>#276: Publish on PyPI with previous method: <code>wheel</code>, <code>twine</code>, and <code>setup.py</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"changelog/#0.7.4","title":"v0.7.4 January 22, 2020","text":"<ul> <li>#273, !119: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"changelog/#0.7.3","title":"v0.7.3 July 25, 2019","text":"<p>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:</p> <ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate for loop</li> </ul>"},{"location":"changelog/#0.7.2","title":"v0.7.2 June 25, 2019","text":"<ul> <li>#233: fix round passed amount and amoundUD floats \u00d7 by 100</li> </ul>"},{"location":"changelog/#0.7.1","title":"v0.7.1 May 29, 2019","text":"<ul> <li>Fix transaction document generation from DuniterPy</li> </ul>"},{"location":"changelog/#0.7.0","title":"v0.7.0 May 22, 2019","text":""},{"location":"changelog/#milestone-v070","title":"Milestone v0.7.0","text":""},{"location":"changelog/#duniterpy","title":"DuniterPy","text":"<ul> <li>#7, !97: Migrate to DuniterPy</li> <li>#200: Freeze DuniterPy dependency version</li> <li>#206: Set a sleep for async requests</li> <li>#178: Select different sources for intermediaries tx</li> </ul>"},{"location":"changelog/#cli_2","title":"CLI","text":"<ul> <li>#77, !98: Migrate command line tool from commandline to Click</li> <li>#67, #76, #116, #117, #123: fixed by previous issue</li> <li>#167: Rename <code>amount</code> command to <code>balance</code></li> <li>#148: Rename <code>issuers</code> command to <code>blocks</code> which is a more appropriate word to what it does</li> <li>With <code>-p</code> option: when the port of the node is 443, it\u2019s not necessary to specify the port</li> </ul>"},{"location":"changelog/#transaction_1","title":"Transaction","text":"<ul> <li>#22: Display transactions history in a table</li> <li>#184: Rework transaction functions (Part 3)</li> <li>#152: fix <code>--allSources</code> option which was not working</li> <li>#165, !99: Display outputBackChange option in confirmation chart</li> <li>#131: Prevent sending too small amount</li> </ul>"},{"location":"changelog/#certification","title":"Certification","text":"<ul> <li>#170: Change process: only propose license display</li> <li>#198: Display identity\u2019s blockstamp and date into confirmation message</li> </ul>"},{"location":"changelog/#difficulty-level","title":"Difficulty level","text":"<ul> <li>#93: Difficulties fails / use websocket to be informed about new block</li> <li>#190: Display the date when the head block has been generated</li> </ul>"},{"location":"changelog/#balance_1","title":"Balance","text":"<ul> <li>!96, #122: display balance in comparison to the average of money share</li> </ul>"},{"location":"changelog/#blocks","title":"Blocks","text":"<ul> <li>Display the full dates of blocks\u2019 generation and mediantime</li> </ul>"},{"location":"changelog/#wot","title":"WoT","text":"<ul> <li>#141: Crash on membership status</li> <li>Add legend to explain <code>\u2714</code></li> <li>#189: Handle wot requests exceptions</li> <li>#135 :is_member() requests all members to know if an identity is member will explose</li> </ul>"},{"location":"changelog/#authentication","title":"Authentication","text":"<ul> <li>#130: Prevent erasing authfile</li> <li>Use <code>pathlib.Path</code> instead of <code>os.path</code></li> </ul>"},{"location":"changelog/#tests_2","title":"Tests","text":"<ul> <li>!83, #85: Create test structure</li> <li>#225: Install <code>pytest-asyncio</code></li> </ul>"},{"location":"changelog/#other","title":"Other","text":"<ul> <li>#161: Singleton improvement</li> <li>#157, !100: Use <code>for</code> loops</li> <li>#169, !100: type issue</li> <li>#113: Many small improvements</li> </ul>"},{"location":"changelog/#website-doc","title":"Website / Doc","text":"<ul> <li>#82: Update website and readme about new features</li> <li>#136: Link directly the installation documentation on the website</li> <li>#159: Update website</li> <li>#160: Add website repository link in the README</li> <li>List Silkaj wrappers en the README</li> </ul>"},{"location":"changelog/#installation-documentation","title":"Installation documentation","text":"<ul> <li>Add instructions on installing libsodium which is required by pylibscrypt since DuniterPy migration</li> <li>#142: Improve pip installation documentation</li> <li>Improve Pipenv installation documentation</li> <li>!89: Add Docker install procedure, Pip: dependency and PATH tricks</li> <li>#215: Conflict between pyproject.toml and pipenv install</li> </ul>"},{"location":"changelog/#windows","title":"Windows","text":"<ul> <li>#153: Install on Windows, Scrypt issue</li> <li>#154: net: can\u2019t get screen size on Windows</li> <li>!92: Document Windows installation with pip</li> </ul>"},{"location":"changelog/#project_1","title":"Project","text":"<ul> <li>#132: Add a license notice as a header of every source files</li> <li>#158: Add CHANGELOG.md file</li> <li>#186: Fix firsts two tags</li> <li>Pypi: add classifiers</li> </ul>"},{"location":"changelog/#thanks_1","title":"Thanks","text":"<p>Attilax, Bernard, cebash, matograine, vtexier</p>"},{"location":"changelog/#0.6.5","title":"v0.6.5 Debian January 8, 2019","text":"<p>v0.6.5 fork for Debian package without DuniterPy migration but with Click CLI module.</p> <ul> <li>#137: Create Debian package and publish it in Buster</li> <li>#77, !98: Migrate to Click</li> <li>#132: Add a license notice as a header of every source files</li> </ul>"},{"location":"changelog/#thanks_2","title":"Thanks","text":"<p>jonas</p>"},{"location":"changelog/#0.6.1","title":"v0.6.1 December 10, 2018","text":""},{"location":"changelog/#milestone-v061","title":"Milestone v0.6.1","text":"<ul> <li>!90, #151: Fix intermediaries transactions sent to wrong recipient</li> <li>!91, #145: Allow to renew certifications</li> <li>#155: Make <code>clear</code> calls works on Windows</li> <li>#141: Crash on membership status</li> <li>#166: Shell completion</li> </ul>"},{"location":"changelog/#0.6.0","title":"v0.6.0 November 18, 2018","text":""},{"location":"changelog/#milestone-v060","title":"Milestone v0.6.0","text":""},{"location":"changelog/#installation","title":"Installation","text":"<ul> <li>#86: Move from <code>pyenv+pip</code> to Pipenv as the new development environment solution</li> <li>#100, !80: New installation method with <code>pip</code> now set as default</li> <li>#100: Documentation on how to publish on Pypi</li> </ul>"},{"location":"changelog/#authentication_1","title":"Authentication","text":"<ul> <li>#78: Use Scrypt as default authentication method</li> <li>#102: Display a confirmation message after using <code>generate_auth_file</code> command</li> <li>#103: More explicit usage about the authentication file mechanism storage</li> </ul>"},{"location":"changelog/#certification_1","title":"Certification","text":"<ul> <li>#96, !82: Certification fails for non-members identities</li> <li>Prevent certifying ourself</li> <li>Code refactoring: simplification, duplicate code removal</li> </ul>"},{"location":"changelog/#wot_1","title":"Wot","text":"<ul> <li>Display certification stock</li> <li>#73: Display identity status:<ul> <li>Display membership expiration due to membership expiration and certifications expiration</li> </ul> </li> <li>#127: fix: display human readable date for 'revoked on' attribute</li> </ul>"},{"location":"changelog/#transaction_2","title":"Transaction","text":"<ul> <li>#83, !78: Allow multi-output transactions</li> <li>#72: Check the pubkey\u2019s balance is enough before processing the transaction</li> <li>#72: Minors transaction refactoring</li> <li>#101: Round UD value in the confirmation summary</li> <li>#118: Use generic function to get sources</li> <li>#120: Display pubkey\u2019s balance before and after transaction in the confirmation summary</li> <li>#125: Fix wrong amount transferred</li> </ul>"},{"location":"changelog/#new-commands","title":"New commands","text":"<ul> <li>#91: <code>about</code>: displays information about silkaj</li> <li>#95: <code>license</code>: displays \u011e1\u2019s license</li> </ul>"},{"location":"changelog/#g1-test","title":"\u011e1-test","text":"<ul> <li>#87: Add <code>--gtest</code> option to specify official \u011e1-test node</li> <li>#109, !84: Improve gtest usage message</li> <li>#112: Amount: fix authentication option with <code>--gtest</code> option</li> </ul>"},{"location":"changelog/#python-37","title":"Python 3.7","text":"<ul> <li>#98: Test with Python 3.7: silkaj is compatible with Python from version 3.4 to 3.7</li> <li>#98: Set Python 3.7 for Pipenv</li> </ul>"},{"location":"changelog/#network-performances","title":"Network performances","text":"<ul> <li>#42, !85: Thanks to singleton, requests are made once for <code>head_block</code>, blockchain parameters, endpoint, <code>ud_value</code>, and <code>currency_symbol</code> retrieval</li> <li>#32: request the domain first instead of the IP (to handle https certificates) (this avoid <code>network</code> view to crash)</li> <li>#32, !79: Add timeouts on GET and POST requests</li> <li>#128, !88: Fix POST request timeout</li> </ul>"},{"location":"changelog/#black-code-formatting","title":"Black: code formatting","text":"<ul> <li>#94, !76: move from <code>pep8</code> to <code>black</code> code formatting. Set pre-commit hook and CI worker</li> </ul>"},{"location":"changelog/#bug-fixes-and-refactoring","title":"Bug fixes and refactoring","text":"<ul> <li>#121: Move cryptographic related functions into <code>crypto_tools.py</code></li> </ul>"},{"location":"changelog/#logo","title":"Logo","text":"<ul> <li>#92: Silkaj logo publication under GNU APGLv3 after a successful crowdfunding</li> </ul>"},{"location":"changelog/#wrappers","title":"Wrappers","text":"<ul> <li>#107: Document silkaj wrappers usages</li> </ul>"},{"location":"changelog/#forum-post","title":"Forum post","text":""},{"location":"changelog/#0.5.0","title":"v0.5.0 May 22, 2018","text":""},{"location":"changelog/#milestone-v050","title":"Milestone v0.5.0","text":""},{"location":"changelog/#certification_2","title":"Certification","text":"<ul> <li>#61: sending certification document:<ul> <li>check that current identity is member</li> <li>check that the certification has not already been sent</li> <li>prompt \u011e1\u2019s license and ask for acceptance in web browser or in pager (a <code>less</code>-like) if no web browser is available</li> </ul> </li> </ul>"},{"location":"changelog/#wot_2","title":"Wot","text":"<ul> <li>#84: display certifications\u2019 expiration date</li> <li>#81: bugfix, nothing displayed when there is two identities with same id</li> </ul>"},{"location":"changelog/#amount","title":"Amount","text":"<ul> <li>remove necessity to prepend with <code>--pubkey</code> option: <code>silkaj amount pubkey1:pubkey2:pubkey3</code></li> </ul>"},{"location":"changelog/#issuers","title":"Issuers","text":"<ul> <li>display the hash\u2019s ten first characters as \u011e1\u2019s global difficulty has increased</li> <li>display blocks in current window: <code>silkaj issuers 0</code></li> </ul>"},{"location":"changelog/#build","title":"Build","text":"<ul> <li>#6: Automate releases using a script</li> </ul>"},{"location":"changelog/#other_1","title":"Other","text":"<ul> <li>display <code>\u011e1</code> and <code>\u011eTest</code> currencies symbols</li> <li>Aliases commands <code>id</code>: <code>identities</code>, <code>tx</code>: <code>transaction</code>, <code>net</code>: <code>network</code></li> <li><code>import</code> rework to improve loading performances</li> <li>Lots of code reorganization and cleaning</li> </ul>"},{"location":"changelog/#forum-post_1","title":"Forum post","text":""},{"location":"changelog/#0.4.0","title":"v0.4.0 January 28, 2018","text":""},{"location":"changelog/#milestone-v040","title":"Milestone v0.4.0","text":""},{"location":"changelog/#new-wot-command-which-displays-received-and-sent-certification-of-an-identity","title":"New <code>wot</code> command which displays received and sent certification of an identity","text":"<ul> <li>!50, !66</li> </ul>"},{"location":"changelog/#transaction_3","title":"Transaction","text":"<ul> <li>#41: Rework/refactoring of transaction code (part 1)</li> <li>!55: Add check condition for sources</li> <li>!57: Exit if wrong pubkey\u2019s output formats</li> </ul>"},{"location":"changelog/#amount_1","title":"Amount","text":"<ul> <li>#46, !68: Add ability to display the amount of many pubkey with same command</li> <li>Total amount of pubkeys displayed at the end (nice to know how much units you own)</li> </ul>"},{"location":"changelog/#authentication_2","title":"Authentication","text":"<ul> <li>!56: Add \u011eannonce (aka PubSec) file format import</li> <li>#60: Hide salt at scrypt authentication</li> </ul>"},{"location":"changelog/#difficulties","title":"Difficulties","text":"<ul> <li>!58: Reload/refresh in a loop PoW difficulty level</li> <li>Display in same order as Remuniter</li> </ul>"},{"location":"changelog/#id","title":"Id","text":"<ul> <li>#49: Display if pubkey is member</li> <li>#59: Bug fix with <code>id</code> command</li> </ul>"},{"location":"changelog/#build_1","title":"Build","text":"<ul> <li>Build published with sha256 checksum</li> </ul>"},{"location":"changelog/#other_2","title":"Other","text":"<ul> <li>Change default endpoint</li> </ul>"},{"location":"changelog/#thanks_3","title":"Thanks","text":"<p>Thanks to Tortue95, jytou, mmuman, and cuckooland</p>"},{"location":"changelog/#forum-post_2","title":"Forum post","text":""},{"location":"changelog/#0.3.0","title":"v0.3.0 April 17, 2017","text":""},{"location":"changelog/#milestone-v030","title":"Milestone v0.3.0","text":""},{"location":"changelog/#transactions","title":"Transactions","text":"<ul> <li>enhance transaction command:<ul> <li>#27, #30: ask for confirmation</li> <li>!38: new confirmation chart containing transaction informations</li> <li>don\u2019t prompt <code>scrypt</code> parameters. See <code>Auth</code> \u00a7</li> </ul> </li> </ul>"},{"location":"changelog/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>!29: new command <code>id</code> to search identities with pubkey or id</li> </ul>"},{"location":"changelog/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>#23, !40: Pyenv installation tutorial</li> </ul>"},{"location":"changelog/#authentication_3","title":"Authentication","text":"<ul> <li>!45: new authentication method: WIF. For future paper wallet feature</li> <li>#39, #43: Don\u2019t prompt scrypt parameters at authentication. Use default ones</li> </ul>"},{"location":"changelog/#builds","title":"Builds","text":"<ul> <li>#5: with Pyinstaller</li> </ul>"},{"location":"changelog/#other_3","title":"Other","text":"<ul> <li>!33, !37: Ability to sort network view</li> <li>Change license from GNU GPLv3 to GNU AGPLv3</li> <li>!31: Code formatting with <code>pep8</code></li> </ul> <p>Thanks to Tortue95 and jytou</p>"},{"location":"changelog/#forum-post_3","title":"Forum post","text":""},{"location":"changelog/#0.2.0","title":"v0.2.0 March 27, 2017","text":""},{"location":"changelog/#features_1","title":"Features","text":"<ul> <li>Transaction feature</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"changelog/#milestone-v020","title":"Milestone v0.2.0","text":""},{"location":"changelog/#announcement","title":"Announcement","text":"<ul> <li>Diaspora* post</li> </ul> <p>Big thanks to Tortue95, and mmuman.</p>"},{"location":"changelog/#0.1.0","title":"v0.1.0 September 23, 2016","text":""},{"location":"changelog/#public-release","title":"Public release","text":"<ul> <li>Duniter forum post</li> <li>Diaspora* post</li> </ul>"},{"location":"changelog/#milestone-v010","title":"Milestone v0.1.0","text":""},{"location":"changelog/#features_2","title":"Features","text":"<p>Sub-commands:</p> <ul> <li><code>info</code></li> <li><code>difficulties</code></li> <li><code>network</code></li> <li><code>issuers</code></li> </ul> <p>Thanks to c-geek.</p>"},{"location":"install/","title":"Install Silkaj","text":""},{"location":"install/#distribution","title":"Distribution","text":"<p>Installing Silkaj from the package manager of your favorite distribution might not be available or might not come with latest Silkaj version. In order to get latest version install Silkaj with <code>pipx</code> or <code>pip</code> from PyPI which you can find in next sections.</p> <p></p>"},{"location":"install/#unix","title":"Unix","text":"<p>On a Unix system, run in your shell following commands:</p>"},{"location":"install/#install-libsodium","title":"Install libsodium","text":"DebianFedoramacOS <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium-devel\n</code></pre> <pre><code>brew install libsodium\n</code></pre>"},{"location":"install/#install-pipx","title":"Install <code>pipx</code>","text":"<p>Check <code>pipx</code> documentation for an extended installation tutorial.</p> DebianFedoramacOS <pre><code>sudo apt install pipx python3-dev\n</code></pre> <pre><code>sudo dnf install pipx python3-devel\n</code></pre> <pre><code>brew install python3 pipx\n</code></pre>"},{"location":"install/#install-with-pipx","title":"Install with pipx","text":"<p>pipx tool is recommended for Python executables. It isolates libraries into separated virtual environments.</p>"},{"location":"install/#ensure-path","title":"Ensure path","text":"<p>Takes care to add Pipx executables in the <code>PATH</code> of your shell:</p> <pre><code>pipx ensurepath\n</code></pre>"},{"location":"install/#install","title":"Install","text":"<pre><code>pipx install silkaj\n</code></pre>"},{"location":"install/#upgrade","title":"Upgrade","text":"<pre><code>pipx upgrade silkaj\n</code></pre>"},{"location":"install/#uninstall","title":"Uninstall","text":"<pre><code>pipx uninstall silkaj\n</code></pre>"},{"location":"install/#check-silkaj-is-working","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#install-with-pip","title":"Install with pip","text":"<p><code>pipx</code> installation is recommended, but you can proceed with <code>pip</code> if you know what you are doing.</p>"},{"location":"install/#install-pip","title":"Install <code>pip</code>","text":"DebianFedoramacOS <pre><code>sudo apt install python3-pip\n</code></pre> <pre><code>sudo dnf install python3-pip\n</code></pre> <p>Already installed with <code>python3</code></p>"},{"location":"install/#completing-path","title":"Completing <code>PATH</code>","text":"<p>If after Silkaj intallation you get a <code>bash: silkaj: command not found</code> error, you have to extend the <code>PATH</code> with <code>~./local/bin</code>:</p> <pre><code>echo \"export PATH=$PATH:$HOME/.local/bin\" &gt;&gt; $HOME/.bashrc\nsource $HOME/.bashrc\n</code></pre>"},{"location":"install/#install-for-current-user-only","title":"Install for current user only","text":"<pre><code>pip install silkaj --user\n</code></pre>"},{"location":"install/#upgrade_1","title":"Upgrade","text":"<pre><code>pip install silkaj --user --upgrade\n</code></pre>"},{"location":"install/#uninstall-useful-to-see-the-real-paths","title":"Uninstall (useful to see the real paths)","text":"<pre><code>pip uninstall silkaj --user\n</code></pre>"},{"location":"install/#check-silkaj-is-working_1","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#shell-completion","title":"Shell completion","text":"<p>Set up the shell completion by adding following line in your shell configuration depending on your shell:</p> BashZshFish $HOME/.bashrc<pre><code>eval \"$(_SILKAJ_COMPLETE=bash_source silkaj)\"\n</code></pre> $HOME/.zshrc<pre><code>eval \"$(_SILKAJ_COMPLETE=zsh_source silkaj)\"\n</code></pre> $HOME/.config/fish/completions/silkaj.fish<pre><code>_SILKAJ_COMPLETE=fish_source silkaj | source\n</code></pre> <p>For further details checkout Click documentation.</p>"},{"location":"install/#install-to-contribute","title":"Install to contribute","text":"<p>Check out the installation guide with Poetry.</p>"},{"location":"blog/","title":"Blog","text":""},{"location":"blog/silkaj-new-cli-duniter-client/","title":"Silkaj: new CLI Duniter client","text":"<p>I am pleased to announce a new Duniter client! It's a client from CLI (command line interface) written with Python 3.</p> <ul> <li>Diaspora* post</li> <li>Code repository with a tutorial to install it.</li> </ul> <p>This client was started almost two weeks ago and needed to be mature enough before public release.</p>"},{"location":"blog/silkaj-new-cli-duniter-client/#features","title":"Features","text":"<p>You could see the result of one of its best sub command <code>network</code>:</p> <pre><code>./src/silkaj.py network\n\n### 20 peers ups, with 15 members and 5 non-members\n\n|        domain       |      ip4       | port | block |    hash     | gen_time |    uid    |member| pubkey |diffi| version  |\n|---------------------+----------------+------+-------+-------------+----------+-----------+------+--------+-----+----------|\n| cgeek.fr            | 88.174.120.187 |  9330| 41166 | 000027421F\u2026 | 15:59:00 | cgeek     | yes  | HnFcS\u2026 |  77 | 0.31.0b6 |\n| mirror1.cgeek.fr    | 88.174.120.187 |  9331| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | 4jT89\u2026 |     | 0.31.0b6 |\n| mirror2.cgeek.fr    | 88.174.120.187 |  9332| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | AZ2JP\u2026 |     | 0.31.0b6 |\n| \u2026t.duniter.inso.ovh |                |    80| 41166 | 000027421F\u2026 | 15:59:00 | inso      | yes  | 8Fi1V\u2026 | 231 | 0.30.17  |\n| peer.duniter.org    | 51.255.197.83  |  8999| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | BSmby\u2026 |     | 0.30.17  |\n| desktop.moul.re     | 78.227.107.45  | 24723| 41166 | 000027421F\u2026 | 15:59:00 | moul      | yes  | J78bP\u2026 |  77 | 0.31.0b7 |\n| misc.moul.re        | 78.227.107.45  |  8999| 41166 | 000027421F\u2026 | 15:59:00 | moul      | yes  | J78bP\u2026 |  77 | 0.31.0b7 |\n| test-net.duniter.fr | 88.189.14.141  |  9201| 41166 | 000027421F\u2026 | 15:59:00 | kimamila  | yes  | 5ocqz\u2026 | 385 | 0.31.0b3 |\n| raspi3.cgeek.fr     | 88.174.120.187 |  8999| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | G3wQw\u2026 |     | 0.31.0a9 |\n| duniter.vincentux.fr|                |  8999| 41166 | 000027421F\u2026 | 15:59:00 | vincentux | yes  | 9bZEA\u2026 |     | 0.30.17  |\n| remuniter.cgeek.fr  | 88.174.120.187 | 16120| 41166 | 000027421F\u2026 | 15:59:00 | remuniter\u2026| yes  | TENGx\u2026 |     | 0.30.17  |\n|                     | 88.163.42.58   | 34052| 41166 | 000027421F\u2026 | 15:59:00 | cler53    | yes  | 4eDis\u2026 |  77 | 0.30.17  |\n| suchard.si7v.fr     | 163.172.252.3  |  8999| 41166 | 000027421F\u2026 | 15:59:00 | hacky     | yes  | DesHj\u2026 |  77 | 0.31.0a8 |\n|                     | 87.91.122.123  |  9330| 41166 | 000027421F\u2026 | 15:59:00 | mmpio     | yes  | BmDso\u2026 | 154 | 0.31.0b3 |\n| \u2026er.help-web-low.fr | 151.80.40.148  |  8999| 41166 | 000027421F\u2026 | 15:59:00 | pafzedog  | yes  | XeBpJ\u2026 | 154 | 0.30.17  |\n|                     | 87.90.32.15    |  8999| 41166 | 000027421F\u2026 | 15:59:00 | nay4      | yes  | BnSRj\u2026 |  77 | 0.31.0a9 |\n| duniter.modulix.net | 212.47.227.101 |  9330| 41166 | 000027421F\u2026 | 15:59:00 | modulix   | yes  | DeCip\u2026 |     | 0.30.17  |\n|                     | 88.174.120.187 | 33036| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | GNRug\u2026 |     | 0.31.0b7 |\n| duniter.cco.ovh     | 163.172.176.32 |  8999| 41166 | 000027421F\u2026 | 15:59:00 | charles   | yes  | DA4PY\u2026 |  77 | 0.31.0a8 |\n| duniter.ktorn.com   | 107.170.192.122|  8999| 41166 | 000027421F\u2026 | 15:59:00 | ktorn     | yes  | BR5DD\u2026 |  77 | 0.30.17  |\n</code></pre>"},{"location":"blog/v0100/","title":"v0.10.0","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.10.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/v0100/#introduction","title":"Introduction","text":"<p>This release comes with the handling of the complete life cycle of the revocation file, the ability to read transaction amounts and recipients listing from a file, convenient for recurrent transaction. Last but not least, the code handling \u011e1 monetary license has been refactored. The upstream changes have been retrieved and now features the license into six languages.</p> <p>Under the hood, Silkaj codebase has been updated to use DuniterPy v1.0, which comes with breaking backward compatible changes on the <code>Documents</code> classes and the drop of the asynchronous property.</p> <p>As always, this release also comes with an emphasis on the development environment, with <code>pre-commit</code> usage generalization with the introduction of new hooks.</p>"},{"location":"blog/v0100/#revocation","title":"Revocation","text":"<p>The complete lifecycle of the revocation document and its storage in a file is now supported!</p> <p>The <code>revocation</code> command comes with four sub-commands:</p> <pre><code>silkaj revocation --help\nUsage: silkaj revocation [OPTIONS] COMMAND [ARGS]...\n\n  Create, save, verify or publish revocation document. Subcommands optionally\n  take the path to the revocation document.\n\nOptions:\n  -h, --help  Show this message and exit.\n\nCommands:\n  publish  Publish revocation document.\n  revoke   Create and publish revocation document.\n  save     Create and save a revocation document.\n  verify   Verifies that a revocation document is correctly formatted and...\n</code></pre> <p>With these command, you can generate a revocation file, verify its integrity and publish to actually revoke an identity.</p> <p>For the first time we implemented sub-subcommands thanks to Click. In the future, we will implement more commands using this feature, since we now know how to implement it.</p>"},{"location":"blog/v0100/#read-transaction-recipients-and-amounts-from-a-file","title":"Read transaction recipients and amounts from a file","text":"<p>You can now define a file following this format. For instance, a file named <code>recipients.txt</code>:</p> recipients.txt<pre><code>&lt;ABSOLUTE|RELATIVE&gt;\n\n# comment 1\n&lt;amount1&gt; &lt;pubkey1&gt;\n\n# comment 2\n&lt;amount2&gt; &lt;pubkey2&gt;:[&lt;checksum2&gt;]\n</code></pre> <p>It lists the amounts and the recipients\u2019 pubkeys for which the multi-recipients transaction will be issued. The checksum can be append to the pubkey to have its integrity checked.</p> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>It will generate a multi-recipients transaction with the amounts in absolute or relative reference depending of the setted header (<code>ABSOLUTE</code> or <code>RELATIVE</code>).</p>"},{"location":"blog/v0100/#g1-monetary-license","title":"\u1e201 Monetary license","text":"<p>The upstream repository containing the licenses has been updated. This update brings fixes and improvements on the existing languages and brings additional new languages: Esperanto, Espagnol, Italian, and Portuguese</p> <p>The display is now only displaying the embedded license files in the console, since it\u2019s available in six up-to-date languages.</p> <pre><code>silkaj license\nIn which language would you like to display \u011e1 monetary license? (es, en, eo, it, fr, pt) [en]: fr\n</code></pre> <p>The display in the browser has been removed since there were just two websites links to outdated licences in French and English.</p>"},{"location":"blog/v0100/#deathreaper","title":"DeathReaper","text":"<p>If you missed DeathReaper crowdfunding completion, you can check this message or the complete post if you have not been aware of.</p>"},{"location":"blog/v0100/#silkaj-docker-image","title":"Silkaj Docker image","text":"<p>The automated generation of Silkaj Docker images has been implemented in the first place to distribute DeathReaper. This is a new way to install Silkaj and its environment. This is convenient to distribute non-stable releases. You can find the documentation on how to use these images.</p>"},{"location":"blog/v0100/#network","title":"Network","text":"<ul> <li>The asynchronous property has been dropped. The HTTP library usage has been migrated from <code>asyncio</code> to <code>urllib</code></li> <li>The global option to specify a custom endpoint has been renamed from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> <li>Silkaj network layer has been refactored, bringing a more robust code</li> </ul>"},{"location":"blog/v0100/#duniterpy-v10","title":"DuniterPy v1.0","text":"<p>Support have been added to support DuniterPy v1.0 which came with many breaking backward compatible changes in the <code>Documents</code> classes.</p>"},{"location":"blog/v0100/#meta","title":"Meta","text":"<p>This release introduces support for Python v3.10 and drops support for Python v3.6.</p>"},{"location":"blog/v0100/#development-environment","title":"Development Environment","text":"<p><code>pre-commit</code> usage has been generalized with <code>black</code>, <code>isort</code>, <code>pyupgrade</code>, <code>insert-license</code>, and <code>gitlab-ci-linter</code> hooks. These hooks are run as jobs into the CI.</p>"},{"location":"blog/v0100/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v0100/#outlook","title":"Outlook","text":"<p>New <code>pre-commit</code> hooks (<code>pylint</code>, <code>flake8</code>, <code>mypy</code>) will be introduced to have more guardrails in order to ensure that future implementations will allow to reach higher code quality. Then, it\u2019s planned to migrate from <code>tabulate</code> to <code>Texttable</code>, and then restructure the repository. Once these prerequisites have been completed, the emphasis will be put onto migrating to Duniter v2 using Substrate. This means using new APIs: RPC, Subsquid, Using new documents called extrinsincs, and probably other changes.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/","title":"Call for testing Silkaj v0.10.0rc","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.10.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>To install and run Silkaj from a container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0 silkaj info\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#tests","title":"Tests","text":"<p>Please test it globally, and check v0.10.0 milestone short summary which contains the changes which have been implemented during this development cycle. Pay a special attention to the newly introduced revocation command.</p> <p>Manual tests help us making sure everything works fine in different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any revocation or loss of money to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#revocation","title":"Revocation","text":"<p><code>revocation</code> command handle the revocation document in an extended way. Check the sub-commands:</p> <pre><code>silkaj revocation --help\n</code></pre> <p>Make sure you are able to create new identities before proceeding. Create a revocation file with an existing identity. Verify the generated file, and publish it!</p> <pre><code>silkaj --gtest revocation save revocation_test.txt\nsilkaj --gtest revocation verify revocation_test.txt\nsilkaj --gtest revocation publish revocation_test.txt\n</code></pre> <p>Or directly all the previous steps with one command:</p> <pre><code>silkaj --gtest revocation revoke\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#license","title":"License","text":"<p>Check \u011e1 monetary license get displayed correctly in any language and in any configuration: workstation or headless computers.</p> <pre><code>silkaj license\nsilkaj --g1-license-web license\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#network-documents-issuance","title":"Network, documents issuance","text":"<p>Silkaj\u2019s network code layer have been completely rewritten, an other HTTP library is used, the asynchronous propery has been dropped, and the documents classes have been refactored. Try any commands requesting information from the network or try sending any document.</p> <pre><code>silkaj info\nsilkaj -ep &lt;hostname&gt;:&lt;port&gt; membership\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#transaction-recipients-and-amounts-definition-reading-from-a-file","title":"Transaction recipients and amounts definition reading from a file","text":"<p>You can now define <code>recipients.txt</code> file following this format:</p> recipients.txt<pre><code>ABSOLUTE\n\n# moul-test\n10 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\n\n# matograine\n20 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm\n</code></pre> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>Check that everything works fine with <code>RELATIVE</code> reference. You can also check broken file, and see if Silkaj reacts properly to any error in the file format definition.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned for April 16th 2022, which will be released with an announcement listing the new features as well as a detailed changelog.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v0110-release/","title":"Silkaj v0.11.0 release","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.11.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v0110-release/#introduction","title":"Introduction","text":"<p>This release comes with the <code>pipx</code> installation method, a new design of command line interface with commands separated in groups. Last but not least, it contains the migration to <code>Texttable</code> table library, network improvements and fixes, and Python v3.11 support.</p> <p>On the development environment side, the repository has been restructured, the code has been annotated with types, and linted. <code>mypy</code> and <code>pylint</code> pre-commit hooks have been introduced. The tests have been separated into unit and integration tests. <code>main</code> branch is new name of the main branch.</p> <p>This release emphasis was put onto strengthen the development environment as well as improving the structure of Silkaj code base. The goal was to do preparations and cleaning before Substrate migration in order to be fully focus onto it in next development cycle.</p> <p>This release is the latest planned major release with Duniter v1/BMA support and the one planned to end into Debian 12 Bookworm.</p>"},{"location":"blog/silkaj-v0110-release/#pipx-installation-method","title":"<code>pipx</code> installation method","text":"<p><code>pipx</code> have been found to be a recommendable tool over <code>pip</code> to install an end-user Python software when the latter is not available in distributions repositories. In addition to <code>pip</code> features, <code>pipx</code> creates virtual environments, which prevents conflicting dependencies among several installed Python software. A nice feature of <code>pipx</code> is the <code>ensurepath</code> commands which takes care to add the Python executables path into the <code>PATH</code> environment variable, which can be found to be the trickiest part of the installation. Silkaj documentation has been updated to suggest <code>pipx</code> instead of <code>pip</code>.</p> <p>In short, you can install Silkaj via <code>pipx</code> this way:</p> <pre><code>sudo apt install pipx libsodium23\npipx install silkaj\n</code></pre> <p>For a comprehensive documentation, check the installation documentation.</p>"},{"location":"blog/silkaj-v0110-release/#new-cli-design","title":"New CLI\u00a0design","text":"<p>The commands have been grouped into following groups: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. The other commands not related to these topics have been kept at the root of the CLI\u00a0tree.</p> <pre><code>silkaj --help\n  about           Display program information\n  authentication  Generate authentication file\n  blockchain      Blockchain related commands\n  checksum        Generate checksum out of a passed pubkey or an...\n  license         Display \u011e1 monetary license\n  money           Money management related commands\n  wot             Web-of-Trust related commands\n</code></pre> <pre><code>silkaj blockchain --help\n  blocks      Display blocks: default: 0 for current window size\n  difficulty  Display the current Proof of Work difficulty level to...\n  info        Display information about currency\n  verify      Verify blocks\u2019 signatures.\n</code></pre> <pre><code>silkaj money --help\n  balance   Get wallet balance\n  history   Display transaction history\n  transfer  Transfer money\n</code></pre> <pre><code>silkaj wot --help\n  certify     Send certification\n  lookup      User identifier and public key lookup\n  membership  Send and sign membership document: for first emission and...\n  revocation  Create, save, verify or publish revocation document.\n  status      Check received and sent certifications and consult the...\n</code></pre> <p>In this process following commands have been renamed:</p> <pre><code>diffi \u2212&gt; difficulty\ntx \u2212&gt; transfer\ncert \u2212&gt; certify\nrevocation save \u2212&gt; revocation create\nwot \u2212&gt; wot status\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#texttable","title":"Texttable","text":"<p>The code has been migrated from <code>tabulate</code> to <code>Texttable</code> external table libraries. <code>Texttable</code> was introduced and was only used from the <code>history</code> command, where the other commands were using <code>tabulate</code>. Both were used, and we had to make the choice to stick with one and get the opportunity to reduce the dependency list of one item. The migration has been done. You will probably notice differences in the table style and the alignments in the columns.</p> <p>Before, with <code>tabulate</code>:</p> <pre><code>|     uid     |   blocks |   percent |\n|-------------+----------+-----------|\n|    vit2     |       33 |      33.0 |\n|    Pini     |       25 |      25.0 |\n|  moul-test  |       24 |      24.0 |\n| jytou4-test |       10 |      10.0 |\n| jytou5-test |        8 |       8.0 |\n</code></pre> <p>Now, with <code>texttable</code>:</p> <pre><code>\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502     uid     \u2502 blocks \u2502 percent \u2502\n\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\n\u2502 vit2        \u2502     33 \u2502      33 \u2502\n\u2502 Pini        \u2502     26 \u2502      26 \u2502\n\u2502 moul-test   \u2502     23 \u2502      23 \u2502\n\u2502 jytou4-test \u2502     10 \u2502      10 \u2502\n\u2502 jytou5-test \u2502      8 \u2502       8 \u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#network","title":"Network","text":"<p>Breaking network connection is something recurrent on local network with BMA. A hack have been introduced to circumvent this issue with <code>sleep</code> calls between repetitive requests which retrieve user ids from public keys.</p> <p>The singletons have been replaced with <code>@functools.lru_cache()</code> decorator usage. They are both used to reduce the network traffic and therefore speed-up the commands execution. They are basically allowing to reuse the result obtained from the first request in case the same request happen again. In Silkaj, they are used to retrieve the UD value, the currency parameters, and the head block only once. Singletons pattern has been a pain to handle specially within the tests. <code>@functools.lru_cache()</code> fixes that which comes in handy as a boilerplate.</p>"},{"location":"blog/silkaj-v0110-release/#argos","title":"Argos","text":"<p><code>argos</code> command have been removed. This command was displaying basic information similar to the <code>info</code> command but formatted for Argos. Argos is a GNOME Shell extension which displays what has been generated out of a shell command into a GNOME Shell pop-over. This command has been found not to be really used and poorly maintained. It has been decided to be remove in the meantime.</p>"},{"location":"blog/silkaj-v0110-release/#python-311","title":"Python 3.11","text":"<p>This release introduces support for Python v3.11 released on the 24th of October 2022.</p>"},{"location":"blog/silkaj-v0110-release/#repository-restructuration","title":"Repository restructuration","text":"<p>As well as the new CLI\u00a0commands grouping, the runtime and the tests code have been classified into following directories: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. In addition to that, there is now a Python file per command and files for \"helpers\" and tools placed aside.</p>"},{"location":"blog/silkaj-v0110-release/#development-environment","title":"Development Environment","text":"<p>New <code>pre-commit</code> hooks have been introduced: <code>mypy</code>, <code>pylint</code>, <code>autoflake</code>, <code>pre-commit-hooks</code>, and <code>mdformat</code>. Type annotations has been introduced in the whole runtime code. This greatly improves the code quality, specially now that the code is fully typed, and linted. It will be of great help in future developments.</p> <p>The tests have been separated into <code>unit</code> and <code>integration</code> tests directories. This separation makes things clearer. The unit tests are pretty quick to be performed, where the integration tests takes more time since they require network requests. On the CI side, now just one job runs the integration tests in the job generating the coverage. Integration tests were known to fail because of the unstable nature of the network. Now, in case the integration tests fails, it is only necessary to restart one job.</p> <p>The branch workflow changed to a unique <code>main</code> branch which takes over the <code>dev</code> and <code>master</code> branches.</p> <p>The coverage integration into GitLab has been fixed.</p>"},{"location":"blog/silkaj-v0110-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/silkaj-v0110-release/#outlook","title":"Outlook","text":"<p>v0.20.0 is planned to be the next release. It will be fully dedicated to add support for Duniter v2 based on Substrate framework. Duniter v1/BMA support will be dropped from Silkaj v0.2x branch, while v0.1x will still be maintained until we productively switch to Duniter v2. But, no new features will be implemented on v0.1x branch. This development cycle might take some time, so it is expected to get preview releases.</p> <p>v0.20.0 development cycle is planned as follow. The network layer needs to be adapted to use following APIs: Substrate RPC, and Hasura indexer\u2019s using GraphQL. Then, It is planned to migrate current features and commands. Finally, new v2 related features will be implemented.</p> <p>In this development cycle, parallel developments might occur, such as setting up the new website or the configuration support implementation in Silkaj.</p> <p>We are looking forward for a better future with the migration of Duniter on Substrate framework.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/","title":"Call for testing Silkaj v0.11.0rc0","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.11.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> <p>It is planned to be the latest release with Duniter v1/BMA support and the release to enter Debian 12 Bookworm.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <p>Install <code>pipx</code> from the installation documentation:</p> <pre><code>sudo apt install pipx\npipx install --pip-args \"\\--pre\" silkaj\n</code></pre> <p>To install and run Silkaj from the container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0 silkaj\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#tests","title":"Tests","text":"<p>Please check v0.11.0 milestone short summary as well as the changelog containing the changes which did happen during this development cycle.</p> <p>Structural changes were made, so please check Silkaj is still working in its entirety. Manual tests help us making sure everything works fine in different cases. Make sure you test it on \u011e1-Test network to avoid a revocation or any money loss to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pipx-installation","title":"Pipx installation","text":"<p>Test that the newly introduced <code>pipx</code> method installation documentation works fine in your case, with your particular Unix system. Tell us how can the documentation be improved, if a non-obvious step for you is missing or if a necessary package isn't listed for Silkaj to work on your system.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#new-cli-design","title":"New CLI\u202fdesign","text":"<p>Silkaj commands have been reorganized into following groups: <code>blockchain</code>, <code>money</code>, <code>wot</code>. Some commands not related to these contexts have been kept in the top-level group. Tell us if the new CLI design with sub-sub-commands compared to the previous one with all the commands at the top-level instead fits best, is less convenient, is following a more structured logic.</p> <pre><code>Commands:\n  about           Display program information\n  authentication  Generate authentication file\n  blockchain      Blockchain related commands\n  checksum        Generate checksum out of a passed pubkey or an...\n  license         Display \u011e1 monetary license\n  money           Money management related commands\n  wot             Web-of-Trust related commands\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#table-generation","title":"Table generation","text":"<p>The underlying table generation library has been changed. Tell us if the tables are displaying content correctly, or if any improvement can be done, or if a regression got introduced.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned on November 26th 2022, which will be released with a detailed announcement explaining the changes.</p> <p>Silkaj team</p>"},{"location":"blog/v0111/","title":"V0.11.1","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206</li> </ul>"},{"location":"blog/v0112/","title":"V0.11.2","text":"<ul> <li>Add support for Python v3.12 and drop support for Python v3.7</li> </ul>"},{"location":"blog/silkaj-v020-release/","title":"Silkaj v0.2.0 release","text":"<p>This release introduce the <code>transaction</code> feature, the <code>amount</code> command to check out the balance of a wallet, and the initial authentication support.</p>"},{"location":"blog/silkaj-v020-release/#new-money-management-commands","title":"New money management commands","text":"<ul> <li><code>transaction</code> command with its main options: <code>--amountDU</code>, <code>--amount</code>, <code>--output</code>, <code>--comment</code></li> <li><code>amount</code> command to display account balance</li> </ul>"},{"location":"blog/silkaj-v020-release/#authentication","title":"Authentication","text":"<ul> <li><code>generate_auth_file</code> command to generate seed authentication file</li> <li>authentication methods implementation: scrypt, seed, seed authentication file with <code>--auth-scrypt</code>, <code>--auth-seed</code>, <code>--auth-file</code> options</li> </ul>"},{"location":"blog/silkaj-v020-release/#under-the-hood","title":"Under the hood","text":"<ul> <li>function to post request onto BMA API</li> <li>function to sign document</li> <li>function to check public key format and checksum</li> </ul>"},{"location":"blog/silkaj-v020-release/#others","title":"Others","text":"<ul> <li>In tables, the columns were randomly ordered. The columns in the table are now ordered thanks to <code>OrderedDict</code>.</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"blog/silkaj-v020-release/#thanks","title":"Thanks","text":"<p>A huge thanks to Tortue who brought a huge contribution to this release. Thanks mmuman.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/","title":"Silkaj v0.3.0 release: Let's send money!","text":"<p>This release comes with user experience enhancements on the <code>transaction</code> command and the authentication in general. A new <code>id</code> command allows to look-up for identities. Efforts were put into improving the installation process.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/#transactions","title":"Transactions","text":"<p><code>transaction</code> command enhancements:</p> <ul> <li>ask for confirmation: #27, !30.</li> <li>confirmation table containing transaction informations: !38</li> <li>don't prompt <code>scrypt</code> parameters. See <code>Authentication</code> \u00a7 below.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>new command <code>id</code> to search identities with pubkey or id: !29.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>pyenv installation tutorial: #23, !40.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#authentication","title":"Authentication","text":"<ul> <li>new authentication method: WIF. For future paper wallet feature: !45</li> <li>Don't prompt scrypt parameters at authentication. Use default ones: #39, !43</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#builds","title":"Builds","text":"<ul> <li>with Pyinstaller: #5.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#other","title":"Other","text":"<ul> <li>Ability to sort the table of <code>network</code> command: !33, !37.</li> <li>Change license from GNU GPLv3 to AGPLv3.</li> <li>Code formatting with <code>pep8</code>: !31.</li> </ul> <p>Thanks Tortue and jytou.</p>"},{"location":"blog/silkaj-v040-release/","title":"Silkaj v0.4.0 release","text":"<p>A new <code>wot</code> command allows to display received and sent certifictaions of an identity. Additionnal user experience enhancements have been added to the transaction feature. It is now possible to check the balance of multiple public keys and get a sum of the balances.</p>"},{"location":"blog/silkaj-v040-release/#new-wot-command-to-display-received-and-sent-certifications","title":"New <code>wot</code> command to display received and sent certifications","text":"<p>You can now explore the Web-of-Trust by displaying in a table the received and sent certifications of an identity.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block 0-E3B0C44298FC1\u2026\nreceived 23 and sent 27 certifications:\n|    received    |       sent       |\n|----------------+------------------|\n|     Alfybe     |     gerard94     |\n|   cuckooland   |   jeanferreira   |\n|      Loda      |      elois       |\n|  jeanferreira  |      Galuel      |\n| BenoitLavenier |      smyds       |\n|     smyds      | CaizohanFerreira |\n|   gpsqueeek    |    gpsqueeek     |\n|    fbuland     |       inso       |\n|    gerard94    |       vit        |\n|     SebasC     |      Thatoo      |\n|     Thatoo     |     William      |\n|      inso      |    cuckooland    |\n|    Paulart     |     greyzlii     |\n|   vincentux    |   mathieuBize    |\n|    greyzlii    |      cgeek       |\n|   Mententon    |    PierreYves    |\n|   PierreYves   |     mmu_man      |\n|     paidge     |   OlivierAuber   |\n|     cgeek      |      paidge      |\n|    Nicolas     |      Alfybe      |\n|   jeangraine   |     1000i100     |\n|    pafzedog    |       dig        |\n|     Zheny      |  BenoitLavenier  |\n|                |    MystraSam     |\n|                |    jeangraine    |\n|                |      Zheny       |\n|                |     roodinux     |\n</code></pre>"},{"location":"blog/silkaj-v040-release/#transaction-command-provides-a-better-ux","title":"Transaction command provides a better UX","text":"<p>The <code>transaction</code> command will beforehand check that the comment and recipient\u2019s public key are in right format before it actually prompt for the authentication.</p>"},{"location":"blog/silkaj-v040-release/#balance-of-multiple-public-keys","title":"Balance of multiple public keys","text":"<p>With the <code>amount</code> command, you can now pass multiple public keys <code>:</code> separated. The balance will be displayed for each of them, and a sum will be displayed at the end.</p> <pre><code>silkaj amount --pubkeys GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\nRequested default node: &lt;g1.duniter.org:443&gt;\nTotal amount of: GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\n----------------------------------------------------------------\nTotal Relative     = 206.23 UD g1\nTotal Quantitative = 2064.41 g1\n\nTotal amount of: fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\n----------------------------------------------------------------\nTotal Relative     = 89.72 UD g1\nTotal Quantitative = 898.08 g1\n\nTotal amount of: Total\n----------------------------------------------------------------\nTotal Relative     = 295.95 UD g1\nTotal Quantitative = 2962.49 g1\n</code></pre>"},{"location":"blog/silkaj-v040-release/#installation","title":"Installation","text":"<ul> <li>Installation documentation</li> </ul>"},{"location":"blog/silkaj-v040-release/#certification-feature","title":"Certification feature","text":"<ul> <li>Crowdfunding</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/","title":"Silkaj v0.5.0 release: Let\u2019s certify!","text":"<p>For the eleventh Libre Currency Meeting (RML), I am pleased to announce Silkaj v0.5.0 release.</p>  ![](../../images/silkaj_logo.png){ width=\"200\" }  <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#certification-feature","title":"Certification feature","text":"<p>Now, you can certify other identities (send certification document to the network):</p> <pre><code>silkaj cert jytou --auth-scrypt -p g1-test.duniter.org:443\nIn which language would you like to display \u011e1 license [en/fr]? fr\nDo you approve \u011e1 license [yes/no]? yes\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nUsing default values. Scrypt parameters not specified or wrong format\nScrypt parameters used: N: 4096, r: 16, p: 1\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert   \u2502 From                                         \u2502 \u2013&gt; \u2502 To                                           \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID     \u2502 moul-test                                    \u2502 \u2013&gt; \u2502 jytou                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502 \u2013&gt; \u2502 2pyPsXM8UCB88jP2NRM4rUHxb63qm89JMEWbpoRrhyDK \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this certification? [yes/no]: yes\nCertification successfully sent.\n</code></pre> <p>Certification command will display \u011e1\u2019s license in your web browser or in your terminal within a <code>less</code> in case you are running a headless computer.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#wot-command-now-displays-expiration-dates-of-certifications","title":"<code>wot</code> command now displays expiration dates of certifications","text":"<p>The table listing the received and sent certifications of an identity, now displays the expirations dates of the certifications.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block [#0](https://git.duniter.org/clients/python/silkaj/issues/0)-E3B0C44298FC1\u2026\nreceived 24 and sent 27 certifications:\n|  received_expire  |    received    |       sent       |  sent_expire  |\n|-------------------+----------------+------------------+---------------|\n|    2019-03-09     |   cuckooland   |      cgeek       |  2019-03-09   |\n|    2019-03-09     |    Paulart     |      elois       |  2019-03-09   |\n|    2019-03-09     |   vincentux    |   mathieuBize    |  2019-03-09   |\n|    2019-03-09     | BenoitLavenier |     gerard94     |  2019-03-09   |\n|    2019-03-09     |      Loda      |      smyds       |  2019-03-09   |\n|    2019-03-09     |     smyds      | CaizohanFerreira |  2019-03-09   |\n|    2019-03-09     |   gpsqueeek    |    gpsqueeek     |  2019-03-09   |\n|    2019-03-09     |    fbuland     |       inso       |  2019-03-09   |\n|    2019-03-09     |  jeanferreira  |       vit        |  2019-03-09   |\n|    2019-03-09     |    gerard94    |      Thatoo      |  2019-03-09   |\n|    2019-03-09     |     SebasC     |    cuckooland    |  2019-03-09   |\n|    2019-03-09     |     Thatoo     |     William      |  2019-03-09   |\n|    2019-03-09     |      inso      |     greyzlii     |  2019-03-09   |\n|    2019-03-09     |     Alfybe     |      Galuel      |  2019-03-09   |\n|    2019-03-12     |    greyzlii    |   jeanferreira   |  2019-03-09   |\n|    2019-03-18     |   Mententon    |    PierreYves    |  2019-03-09   |\n|    2019-04-02     |   PierreYves   |     mmu_man      |  2019-03-09   |\n|    2019-04-03     |     paidge     |   OlivierAuber   |  2019-03-13   |\n|    2019-05-24     |     cgeek      |      paidge      |  2019-03-13   |\n|    2019-06-10     |    Nicolas     |      Alfybe      |  2019-03-19   |\n|    2019-07-04     |   jeangraine   |     1000i100     |  2019-03-26   |\n|    2019-07-23     |    pafzedog    |       dig        |  2019-03-31   |\n|    2019-08-07     |     Zheny      |  BenoitLavenier  |  2019-04-22   |\n|    2020-03-17     | HugoTrentesaux |    MystraSam     |  2019-06-16   |\n|                   |                |    jeangraine    |  2019-06-22   |\n|                   |                |      Zheny       |  2019-06-25   |\n|                   |                |     roodinux     |  2019-07-01   |\n</code></pre>"},{"location":"blog/silkaj-v050-release-lets-certify/#logo","title":"Logo","text":"<p>Silkaj now has a logo thanks to Attilax. You can find it in this repository. I choose the black and white one. Here is a crowdfunding to free the logo.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#repository-migration-to-gitlab","title":"Repository migration to GitLab","text":"<p>I migrated the repository to our GitLab instance and archived the GitHub repository:</p> <ul> <li>https://git.duniter.org/clients/python/silkaj</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#website","title":"Website","text":"<p>Silkaj's website has been published among other websites on our GitLab instance. New revisions will be automatically published thanks to GitLab Pages. Here you can find the repository: https://git.duniter.org/websites/silkaj_website/</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#future","title":"Future","text":"<p>You can have a look at the next v0.6.0 milestone to have an idea of what could be included into next Silkaj development cycle.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#helps","title":"Helps","text":"<p>This whole work has been done voluntarily aside a dept-salary\u2019s paid job. If you like what have been achieve, please contribute, by giving libre units to its only and main developer or to Duniter\u2019s developers to improve our little world.</p>"},{"location":"blog/silkaj-v060-release-lets-install/","title":"Silkaj v0.6.0 release: Let\u2019s install","text":"<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the twelfth Libre Currency Meeting.</p> <p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#user-installation-eased-via-pypipip","title":"User installation eased via PyPI/pip","text":"<p>Installing Silkaj has been a burning issue: Only Fedora users could install Silkaj with the Pyinstaller binary, since that\u2019s where I was building it. The others, would have had to install a development environment with <code>pyenv</code> and the Python dependencies in order to make it work.</p> <p>Thanks to Cebash\u2019s work. Now, we are able to install Silkaj with <code>pip</code>, the Python package manager, which retrieves the package from Python Package Indexer (PyPI):</p> <pre><code>pip3 install silkaj --user\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#development-environment-with-pipenv","title":"Development environment with Pipenv","text":"<p>We switched from <code>pyenv+pip</code> to Pipenv because Pipenv offers a better development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#transaction","title":"Transaction","text":""},{"location":"blog/silkaj-v060-release-lets-install/#multi-recipients-transaction","title":"Multi-recipients transaction","text":"<p>Thanks to cgeek, Silkaj is the first client, besides Remuniter, able to send multi-recipients transaction. This means, that we will be able to transfer money to several recipients within a single transaction. To do so, we have to pass recipients\u2019 public keys separated with a colon <code>:</code> operator, as follow:</p> <pre><code>silkaj tx --auth-file --amount 2 --gtest --output \\\nDpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC:7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 pubkey\u2019s amount before tx \u2502 15375.33 \u011eTest                               \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (unit)          \u2502 4.0 \u011eTest                                    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (relative)      \u2502 0.0104 UD \u011eTest                              \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 pubkey\u2019s amount after tx  \u2502 15371.33 \u011eTest                               \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (pubkey)             \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (id)                 \u2502 moul-test                                    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey)               \u2502 DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id)                   \u2502 vit                                          \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey)               \u2502 7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id)                   \u2502 cuckooland                                   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 comment                   \u2502                                              \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]: yes\nGenerate Transaction:\n   - From:    5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n   - To:      DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC\n   - To:      7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n   - Amount:  4.0\nTransaction successfully sent.\n</code></pre> <p>Notes:</p> <ul> <li>Each pubkey will receive the same amount of money. The amount per recipients can not be specified yet.</li> <li>The purpose of this feature is to remunerate Duniter developers.</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#display-confirmation-panel","title":"Display confirmation panel","text":"<p>Before the transaction is actually sent, the balance before and after the transaction is displayed in the summary table. Check the example above.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#two-wrappers","title":"Two wrappers","text":"<ul> <li>Multi-recipients transfers and automation</li> <li>Transaction generator written in Shell</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#wot-view-improvements","title":"WoT view improvements","text":"<ul> <li>Display of the certifications stock</li> <li>Membership expiration due to the membership expiration or due the fact that the threshold of minimal number of certifications is about to be crossed by certifications expirations</li> <li>Identity status</li> </ul> <pre><code>moul-test (5B8iM\u2026) from block 167750-0000A51F\u2026\nreceived 8 and sent 15/100 certifications:\n|  received_expire  |      received       |       sent        |  sent_expire  |\n|-------------------+---------------------+-------------------+---------------|\n|    2018-11-21     |      esprit \u2714       |     MeluaTest     |  2018-11-19   |\n|    2018-12-15     |      GAS2000 \u2714      |      esprit       |  2018-11-21   |\n|    2018-12-19     | matograine-G1Test \u2714 |      GAS2000      |  2018-12-10   |\n|    2018-12-20     |   scanlegentil \u2714    |       guwop       |  2018-12-10   |\n|    2019-01-29     |        vit \u2714        | matograine-G1Test |  2019-02-04   |\n|    2019-02-07     |       Elois \u2714       |       Elois       |  2019-02-07   |\n|    2019-02-15     |    cuckooland \u2714     |    Vincentest     |  2019-02-07   |\n|    2019-02-16     |     piaaf31GT \u2714     |    cuckooland     |  2019-02-07   |\n|                   |                     |        vit        |  2019-02-07   |\n|                   |                     |   scanlegentil    |  2019-02-07   |\n|                   |                     |       cgeek       |  2019-02-07   |\n|                   |                     |     isawien45     |  2019-02-07   |\n|                   |                     |     aguy-dev      |  2019-02-07   |\n|                   |                     |     piaaf31GT     |  2019-02-14   |\n|                   |                     |     kimamila      |  2019-02-15   |\n\nMembership expiration due to certification expirations: 2018-12-20\nmember: True\nMembership document expiration: 2018-12-31\nSentry: True\noutdistanced: False\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#scrypt-authentication-by-default","title":"Scrypt authentication by default","text":"<p>Previously, the authentication method had to be specified. Now, when no authentication method is specified, two inputs will be prompted in order to authenticate with the scrypt method. You can still specify other authentication methods, with following options:</p> <pre><code>Authentication:\n for amount, transaction, certification, and generate_auth_file commands\n - Scrypt is the default authentication method with 4096,16,1 as default values\n    you can specify others values specifying following parameters: -n &lt;N&gt; -r &lt;r&gt; -p &lt;p&gt;\n - Seed: --auth-seed\n - File: --auth-file [--file=&lt;path file&gt;], './authfile' will be taken if there is no path specified\n - WIF: --auth-wif\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#gtest","title":"\u011etest","text":"<p>A new <code>--gtest</code> option has been added to ease the connection to \u011e1-test currency network for testing purposes. It uses the official node: https://g1-test.duniter.org.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#network-performances","title":"Network performances","text":"<p>With this update, Silkaj is retrieving information only once. Before, data was retrieved every time it was needed. Now, once the information has been fetched, it is kept into the memory and reused.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#python-37-support","title":"Python 3.7 support","text":"<p>Silkaj has been tested with Python 3.7. Results show that there has been no issues. Python 3.7 has been set as the current version in Pipenv development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#new-commands","title":"New commands","text":""},{"location":"blog/silkaj-v060-release-lets-install/#license","title":"License","text":"<p>Originally built for the certification feature, the <code>license</code> command allows the consultation of the \u011e1\u2019s license at any time given.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#about","title":"About","text":"<p>A new command displays information about Silkaj:</p> <pre><code>silkaj about\n             @@@@@@@@@@@@@\n         @@@     @         @@@\n      @@@   @@       @@@@@@   @@.            silkaj 0.6.0\n     @@  @@@       @@@@@@@@@@@  @@,\n   @@  @@@       &amp;@@@@@@@@@@@@@  @@@         Powerfull and lightweight command line client\n  @@  @@@       @@@@@@@@@#   @@@@ @@(\n  @@ @@@@      @@@@@@@@@      @@@  @@        Built in Python for Duniter\u2019s currencies: \u011e1 and \u011e1-Test\n @@  @@@      @@@@@@@@ @       @@@  @@\n @@  @@@      @@@@@@ @@@@       @@  @@       Authors: moul, tortue, jytou, cebash, cgeek\n @@  @@@@      @@@ @@@@@@@      @@  @@\n  @@ @@@@*       @@@@@@@@@      @# @@        Website: https://silkaj.duniter.org\n  @@  @@@@@    @@@@@@@@@@       @ ,@@\n   @@  @@@@@ @@@@@@@@@@        @ ,@@         Repository: https://git.duniter.org/clients/python/silkaj\n    @@@  @@@@@@@@@@@@        @  @@*\n      @@@  @@@@@@@@        @  @@@            License: GNU AGPLv3\n        @@@@   @@          @@@,\n            @@@@@@@@@@@@@@@\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#logo","title":"Logo","text":"![](../../images/silkaj_logo.png){ width=\"200\" }  <p>Silkaj\u2019s logo, designed by Attilax, is now fully funded!</p>"},{"location":"blog/silkaj-v060-release-lets-install/#thanks","title":"Thanks","text":"<p>Special thanks to Moul, Cebash, cgeek, and Attilax.</p> <p>Thanks to vit, Inso, vincentux, and jardin.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#future-development-cycles","title":"Future development cycles","text":"<ul> <li> <p>v0.7.0 will be focused on refactoring Silkaj in order to be ported to DuniterPy usage, a more robust API implementation. This mean sharing a common code with Sakia.</p> </li> <li> <p>v0.8.0 will add new features based on DuniterPy such as new authentication methods as well as being allowed to send the remaining Web-of-Trust documents: identity publication, membership publication and renewal, and revocation.</p> </li> <li> <p>v0.9.0 Let\u2019s see what come to this milestone.</p> </li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievements, please contribute by reporting bugs, contributing to the code or giving Duniter\u2019s developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v061-release/","title":"Silkaj v0.6.1 release","text":"<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p>"},{"location":"blog/silkaj-v061-release/#bug-fix-in-intermediaries-transactions","title":"Bug fix in intermediaries transactions","text":"<p>When sending a transaction with a big amount, there is a limit of forty sources per transaction allowed by \u011e1 protocol. In order to reach a big amount of money with only forty sources, the clients proceed beforehand to change operations to merge more money into fewer sources. Since the multi-recipients feature, a regression was introduced, the intermediaries transaction\u2019s recipient were wrong and sent to the recipient of the transaction. This release fixes it!</p>"},{"location":"blog/silkaj-v061-release/#certification-renewal","title":"Certification renewal","text":"<p>Duniter v1.7 now allows to renew certification before their expiration.</p> <p>This protocol modification is now live on the \u011e1-Test currency since December 2018 in order to check that everything is working fine. You can already renew certifications on the \u011e1-Test currency.</p> <p>This protocol modification will be published on the \u011e1 currency when ready.</p> <p>Before processing the certification, Silkaj will check if the certification can be renewed. In the case of \u011e1, you will be able to renew the certification two months after the previous one. And, on the \u011e1-test, after twelve and half a day.</p>"},{"location":"blog/silkaj-v061-release/#tests-on-windows","title":"Tests on Windows","text":"<p>Silkaj have been installed for the first time on the Windows platform via <code>pip</code>. It works! There is still fixes needed in order to have Silkaj to work properly.</p>"},{"location":"blog/silkaj-v061-release/#thanks","title":"Thanks","text":"<p>Thanks to Moul, Galuel, and Bernard.</p>"},{"location":"blog/silkaj-v061-release/#upgrade","title":"Upgrade","text":"<pre><code>pip3 install silkaj --user --upgrade\n</code></pre> <ul> <li>Install with <code>pip</code> documentation for more details.</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/","title":"Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website","text":"<p>Six months after the previous major release, I am pleased to announce the release of Silkaj v0.7.0 for the thirteenth Free Currency Meeting.</p> <p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> <p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#duniterpy-migration","title":"DuniterPy migration","text":"![](../../images/duniterpy_logo.png){ width=\"150\" }  <p>DuniterPy is a Python library which implements methods to request from and send information to the Duniter nodes. It also has authentication methods to sign documents such as transactions and certifications. DuniterPy was initially written for the Sakia client. Silkaj and Sakia are now sharing the same common code. The migration to DuniterPy was tough, but it was worth it: It will allow the implementation of new features in future versions.</p> <p>There were many challenges: keeping the same functionalities, making Silkaj\u2019s code asynchronous, and replacing the authentication and the network code by the ones implemented in DuniterPy. One struggling issue was that the intermediaries transactions were no longer working, because, the equality method of the transaction output source was not implemented, as they used to be stored in a string and are now stored into an <code>OutputSource</code> object. So, the equality had to be implemented.</p> <p>Check-out DuniterPy versions from v0.50.0 to v0.54.1 to follow the evolution of DuniterPy. These versions were specially made for Silkaj. In the future, following functionalities are planned: sending identity, membership, and revocation documents, the usage of authentication methods implemented in DuniterPy, and the usage of the planned GVA API.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#click-migration","title":"Click migration","text":"[![](../../images/click_logo.png){ width=\"200\" }](https://click.palletsprojects.com/)  <p>Since Debian Buster freeze was going to happen very soon and <code>commandlines</code> library wasn\u2019t packaged into Debian, the migration to Click \u201cCommand Line Interface Creation Kit\u201d had to be done quickly. I decided to migrate to this really nice library, since it is much more maintained, comes with a better code, and is less buggy. Here you can see the new command line interface:</p> <pre><code>Usage: silkaj [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n  -h, --help               Show this message and exit.\n  -v, --version            Show the version and exit.\n  -p, --peer TEXT          Default endpoint will reach \u011e1 currency with\n                           `https://g1.duniter.org` endpoint. Custom endpoint\n                           can be specified with `-p` option followed by\n                           &lt;domain&gt;:&lt;port&gt;\n  -gt, --gtest             \u011eTest: `https://g1-test.duniter.org` endpoint\n  --auth-scrypt, --scrypt  Scrypt authentication: default method\n  --nrp TEXT               Scrypt parameters: defaults N,r,p: \"4096,16,1\"\n  -af, --auth-file         Authentication file. Defaults to: './authfile'\n--file TEXT              Path file specification with '--auth-file'\n                           [default: authfile]\n  --auth-seed, --seed      Seed hexadecimal authentication\n  --auth-wif, --wif        WIF and EWIF authentication methods\n\nCommands:\n  about     Display program information\n  argos     Display currency information formatted for Argos or BitBar\n  authfile  Generate authentication file\n  balance   Get wallet balance\n  blocks    Display blocks: default: 0 for current window size\n  cert      Send certification\n  diffi     Display the current Proof of Work difficulty level to generate...\n  history   Display transaction history\n  id        Find corresponding identity or pubkey from pubkey or identity\n  info      Display information about currency\n  license   Display \u011e1 license\n  net       Display network view\n  tx        Send transaction\n  wot       Check received and sent certifications and consult the...\n</code></pre> <p>The command line interface has changed. General parameters (options and arguments) should be placed in between the command and the sub-command. Specific parameters should be placed after the sub-command.</p> <pre><code>silkaj --gtest --auth-file tx --amount 5 --output &lt;pubkey&gt;\n</code></pre> <p>For instance, in previous command <code>--gtest</code> and <code>--auth-file</code> are general parameters, where <code>--amount</code> and <code>--output</code> are specific parameters separated by <code>tx</code> sub-command.</p> <p>You can display general parameters with <code>silkaj --help</code> and specific parameters with <code>silkaj tx --help</code> for instance.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#cli-changes","title":"CLI changes","text":"<ul> <li><code>issuers</code>, <code>amount</code>, and <code>generate_auth_file</code> commands have been respectively renamed to <code>blocks</code>, <code>balance</code>, and <code>authfile</code>.</li> <li>The long sub-commands <code>certification</code>, <code>transaction</code>, <code>network</code>, <code>identities</code> have been removed. Now the small ones have to be used: <code>cert</code>, <code>tx</code>, <code>net</code>, <code>id</code>.</li> <li><code>blocks</code> defaults to <code>0</code> which stands for the current windows size and now has a limit of 5.000 blocks as set by BMA.</li> <li><code>balance</code>: public keys separator does no longer use colons <code>:</code>, it uses spaces instead.</li> <li>Additionally, there are the new smaller authentication options: <code>--scrypt</code>, <code>-af</code>, <code>--seed</code>, <code>--wif</code>, without the <code>--auth</code> prefix.</li> </ul> <p>You might discover other breaking changes. For more details regarding these changes check out this list.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#transaction-history","title":"Transaction history","text":"<p>It is now possible to display the transactions history of a wallet:</p> <pre><code>silkaj history GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP --uids\n\nTransactions history from: moul GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\nCurrent balance: 17296.86 \u011e1, 1717.66 UD \u011e1 on the 2019-05-12 13:32:30\n+---------------------+------------------------+------------+--------------+-----------------------+\n|        Date         |   Issuers/Recipients   | Amounts \u011e1 | Amounts UD\u011e1 |        Comment        |\n+=====================+========================+============+==============+=======================+\n| 2019-04-23 21:31:27 | CvrMiUhAJpNyX5sdAy     | 100.700    | 10           | Silkaj sur Ubuntu c   |\n|                     |                        |            |              | est une tres belle    |\n|                     |                        |            |              | surprise. Merci !     |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-22 18:59:34 | HugoTrentesaux -       | 100.700    | 10           | Merci pour Duniter    |\n|                     | 55oM6F9ZE2MGi          |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 14:35:15 | ArthurLutz -           | 200        | 19.861       | pour les paquets      |\n|                     | 4C4jsvxmFQBoH          |            |              | yunohost !            |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 10:40:11 | SonqoZEfZXHDBxi4Kx     | 30.210     | 3            | [G1SMS] VIREMENT 300  |\n|                     |                        |            |              | LOVE (30.21 G1)       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 08:04:58 | fbuland -              | 200        | 19.861       | merci resolution bug  |\n|                     | 4bD7J3uA5pH2N          |            |              |                       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-13 16:37:20 | Vivakvo -              | 100.700    | 10           | Merci pour Duniter    |\n|                     | 4wUdA1dx1NCZU          |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-12 08:59:04 | C4pUj26pVgPVPLEZ96     | 50         | 4.965        | Bravo pour le bug     |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 16:48:04 | 73ArdqtsQScypV35H4     | 100.700    | 10           | Merci pour Duniter    |\n|                     |                        |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:58:06 | Lucas - HY2nJUyxpzyrw  | 100.700    | 10           | Merci pour Duniter    |\n|                     |                        |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:10:25 | BenoitLavenier -       | 100.700    | 10           | Merci pour Duniter    |\n|                     | 38MEAZN68Pz1D          |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 14:11:00 | 4sfQWXBBy811CCDV6J     | 100.700    | 10           | 1.7.16                |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 22:59:00 | elois - D9D2zaJoWYWve  | 100        | 9.930        | merci pour le debug   |\n|                     |                        |            |              | de duniter et du      |\n|                     |                        |            |              | process de release    |\n|                     |                        |            |              | aussi                 |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 21:51:41 | Matograine -           | 100.700    | 10           | V1.7.16               |\n|                     | CmFKubyqbmJWb          |            |              |                       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 01:18:44 | cgeek - 2ny7YAdmzReQx  | 1007       | 100          | Duniter v1.7.16       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#debian-and-ubuntu-package","title":"Debian and Ubuntu package","text":"[![](../../images/debian_logo.svg){ width=\"100\" }](https://packages.debian.org/buster/silkaj)  <p>Silkaj v0.6.5 was packaged for Debian Buster v10, which is planned te be released on July 6th 2019. This package greatly benefits all Debian-based distributions. Moreover, Silkaj was also added into Ubuntu 19.04 repository, which was published on March 2019. For more details check-out where Silkaj was included into the Debian-based distributions. Silkaj v0.6.5 now comes with Click migration, auto-completion, and bug fixes, however it does not include DuniterPy migration and v0.7.0 features.</p> <p>You can install Silkaj with following command:</p> <pre><code>sudo apt install silkaj\n</code></pre> <p>This work have been made possible thanks to jonas, a Debian developer.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#proof-of-work-difficulty-level","title":"Proof-of-Work difficulty level","text":"<p>Since we are using DuniterPy which includes WebSocket management, this latter can be used to improve the network connection. Previously, Silkaj was sending queries every five seconds to check if a new block was added to the blockchain. Now, Silkaj gets a notification every time a new block is appended to the blockchain. This improvement dramatically reduces traffic network.</p> <p>To better monitor the network, the header was improved and now displays current block\u2019s number and its date of generation:</p> <pre><code>Current block: n\u00b0219981, generated on the 2019-05-12 14:36:35\nGeneration of next block n\u00b0219982 possible by at least 31/44 members\nCommon Proof-of-Work difficulty level: 89, hash starting with `00000[0-6]*`\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#new-website","title":"New website","text":"<p>At the beginning of the project, a simple website was made. Since then, Silkaj evolved and have brought new features which should be reflected on the website.</p> <p>More content was added to the website, which now has three pages: a main one, one for the features and the other one for the installation.</p> <p>Attilax worked to give the website a new black style, to make it looks like a terminal. He also translated it in French which makes the website available in two languages.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#thanks","title":"Thanks","text":"<p>Attilax, Bernard, cebash, jonas, matograine, vit</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#install-and-upgrade","title":"Install and upgrade","text":"<ul> <li>Install and upgrade documentation</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#future-development-cycles","title":"Future development cycles","text":"<p>Future releases will add new features based on DuniterPy such as new authentication methods as well as being able to send WoT documents: identity publication, membership publication and renewal, and revocation. It is also planned to use features brought by Click usage, to set-up a CI/CD pipeline, and locking the code with tests.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievement, please contribute by reporting bugs, contributing to the code or giving to Duniter developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#share-on-social-networks","title":"Share on social networks","text":"<ul> <li>Mastodon</li> </ul>"},{"location":"blog/v071/","title":"V0.7.1","text":"<ul> <li>Bug fix transaction generation</li> </ul>"},{"location":"blog/v072/","title":"V0.7.2","text":"<ul> <li>Fix result of the multiplication of the amount passed as float for the transaction command</li> </ul>"},{"location":"blog/v073/","title":"V0.7.3","text":"<ul> <li>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:<ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate <code>for</code> loop</li> </ul> </li> </ul>"},{"location":"blog/v074/","title":"V0.7.4","text":"<ul> <li>#273: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"blog/v075/","title":"V0.7.5","text":"<ul> <li>#276: Publish on PyPI with the previous method: <code>setup.py</code>, <code>wheel</code>, and <code>twine</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"blog/v076/","title":"V0.7.6","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"blog/silkaj-v080-release/","title":"Silkaj v0.8.0 release","text":""},{"location":"blog/silkaj-v080-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.8.0. A new team member joined us at the beginning of this development cycle: Matograine. We highly appreciate his commitment, his improvements of the transaction code and his work on the checksum. This release comes along with a number of new features and improvements. The most important of them are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> <p>Version 0.8.0 was done in 145 commits, and features seven major improvements:</p> <ol> <li><code>membership</code>: We developed a command to allow users to send membership documents.</li> <li>Identity choice: We can now manually choose the desired identity among other identities.</li> <li>Multi-recipients transactions: Users can simultaneously send a different amount of \u011e1 to different recipients.</li> <li>Display improvements for <code>tx</code> and <code>balance</code>: For a better overview, we modified the <code>tx</code> table and added a <code>balance</code> table.</li> <li>Public key checksum display and verification: For security purposes, Silkaj displays and verifies the checksum.</li> <li><code>verify</code>: We set up a command to check whether a block is valid.</li> <li>Dev Env: We set up a solid development environment for Poetry, CI/CD, and Tests.</li> </ol> <ul> <li>A. Poetry: We migrated to Poetry.</li> <li>B. CI/CD: We set up a pipeline to run automatic jobs.</li> <li>C. Tests: We started to write tests.</li> </ul>"},{"location":"blog/silkaj-v080-release/#1-membership","title":"1. Membership","text":"<p>After the transaction and the certification commands, the much awaited <code>membership</code> command is now available.</p> <p>Users can send their first membership request to be a certified member of the \u011e1 community. As certified members have to renew their membership each year, this command allows to send the renewal application in question. It displays the expiration date of the current membership and indicates the identification blockstamp of the user. In the event a user forgets that they have already sent a membership request, a pop up displays if there is a pending membership request in the mempool.</p> <pre><code>silkaj membership\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nYou will be asked to approve \u011e1 license. Would you like to display it? [y/N]: n\nDo you approve \u011e1 license? [y/N]: y\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership              \u2502 in 3 weeks                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Number of pending membership(s) in the mempool     \u2502 1                                                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending membership documents will expire           \u2502 in 1 year                                         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID)                              \u2502 moul                                              \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key                                         \u2502 GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:J1k  \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity                                     \u2502 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B93\u2026 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published                                 \u2502 March 8, 2017                                     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership                  \u2502 in 1 year                                         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 months                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending a membership document for this identity? [y/N]:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#2-identity-choice","title":"2. Identity choice","text":"<p>When using the commands <code>wot</code>, <code>cert</code>, and <code>membership</code>, Silkaj used to select the first identity on the list. As this can lead to fishing, we added a new feature to pick the identity of your choice. Now, you can use the <code>uid</code> and the <code>pubkey</code> to certify an identity and study its status in the Web of Trust. Please note that identities can have the same user identifier and the same public key.</p> <pre><code>silkaj -gt wot moul\n|   id | uid       | pubkey                                           | timestamp             |\n|------+-----------+--------------------------------------------------+-----------------------|\n|   00 | moul1     | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s  | 614118-00000EE8DFC0F\u2026 |\n|   01 | moul2     | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s  | 614227-00000ED689406\u2026 |\n|   10 | moul1     | 3rp7ahDGeXqffBQTnENiXEFXYS7BRjYmS33NbgfCuDc8:DFQ | 614227-00000ED689406\u2026 |\n|   20 | moul-test | 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK | 167750-0000A51FF952B\u2026 |\nWhich identity would you like to select (id)?:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#3-transactions-multi-recipients-different-amounts-of-g1","title":"3. Transactions: multi-recipients &amp; different amounts of \u011e1","text":"<p>Thanks to Matograine, users can now send different amounts of \u011e1 to multiple recipients in the same document. Working on this feature offered us the opportunity to rethink and clean up the CLI and the code related to the <code>tx</code> command. However, further efforts are required to build a more solid code base foundation. </p> <p>v0.8.0 comes with three breaking changes and four small options:</p> <ul> <li><code>--output</code> was renamed to <code>--recipient</code></li> <li>recipients public key are splits with the option <code>--recipient</code> instead of a colon character.</li> <li>The public key's checksum separator <code>!</code> is being replaced by the colon.</li> <li>small options have been introduced:<ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code> </li> </ul> </li> </ul> <p>The follow examples illustrates the change operated on the CLI. With the previous version of Silkaj, the following procedure was operated to send one unit to <code>pubkey1</code> and <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --output &lt;pubkey&gt;1!&lt;checksum1&gt;:&lt;pubkey2&gt;!&lt;checksum2&gt;\n</code></pre> <p>With the current version of Silkaj, the following procedures are operated to send one unit to <code>pubkey1</code> and two units to <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --recipient &lt;pubkey1&gt;:&lt;checksum1&gt; --amount 2 --recipient &lt;pubkey2&gt;:&lt;checksum2&gt;\n</code></pre> <p>With small options:</p> <pre><code>silkaj tx -a 1 -r &lt;pubkey1&gt;:&lt;checksum1&gt; -a 2 -r &lt;pubkey2&gt;:&lt;checksum2&gt;\n</code></pre> <p>In the case one amount is passed, the same amount will be send to the passed recipients. The <code>--allSources</code> option is only working with one recipient.</p>"},{"location":"blog/silkaj-v080-release/#4-display-improvements-for-tx-and-balance","title":"4. Display improvements for <code>tx</code> and <code>balance</code>","text":"<p>We merged the relative and absolute amounts into one cell. This applies to the cells: initial balance, total transaction amount, balance after the transaction, and individual amounts.</p> <p>To send a different amount of \u011e1 to multi-recipient proceed following:</p> <pre><code>silkaj tx -d 1 -d 2 \\\n-r CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7 \\\n-r d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm \\\n-c \"Test different amounts to two different recipients\"\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Initial balance (unit|relative)            \u2502 2207757.83 \u011eTest | 145.63 UD \u011eTest                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total transaction amount (unit|relative)   \u2502 45480.0 \u011eTest | 3.0 UD \u011eTest                       \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Balance after transaction (unit|relative)  \u2502 2162277.83 \u011eTest | 142.63 UD \u011eTest                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (pubkey)                              \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (id)                                  \u2502 moul-test                                          \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey)                                \u2502 CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7:8Sj   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id)                                    \u2502 Elois                                              \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative)                     \u2502 15160.0 \u011eTest | 1.0 UD \u011eTest                       \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey)                                \u2502 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id)                                    \u2502 matograine-G1Test                                  \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative)                     \u2502 30320.0 \u011eTest | 2.0 UD \u011eTest                       \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Comment                                    | Test different amounts to two different recipients \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]:\n</code></pre> <p>The balance of a given public key is now displayed in a table. Bellow you can find an example of such a display.</p> <pre><code>silkaj balance 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey                   \u2502 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8:4VT \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Blockchain (unit|relative)          \u2502 94322.48 \u011e1 | 9220.18 UD \u011e1                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending transaction (unit|relative) \u2502 100.0 \u011e1 | 9.78 UD \u011e1                            \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative)        \u2502 94422.48 \u011e1 | 9229.96 UD \u011e1                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N               \u2502 13.35 x M/N                                      \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v080-release/#5-pubic-key-checksum-display-verification-and-checksum-command","title":"5. Pubic key checksum display, verification, and checksum command","text":"<p>For security purposes, Silkaj now displays the checksum associated with the public key, and verifies it when passed to a command. If a public key or an authentication method is passed to the newly introduced <code>checksum</code> command, the later generates the associated checksum to the public key. if a public key and a checksum are passed, Silkaj displays whether the checksum is valid or not.</p>"},{"location":"blog/silkaj-v080-release/#6-verify","title":"6. <code>verify</code>","text":"<p>We introduced the new <code>verify</code> command to check whether the signatures of the blocks of the blockchain are valid since there was a bug in the cryptography library of Duniter. Cf Forum topic and Duniter ticket</p> <p>To verify blocks proceed following:</p> <pre><code>silkaj verify\nProcessing blocks verification  [####################################]  100%\nWithin 0-342803 range, blocks with a wrong signature: 15144 31202 85448 87566 90830 109327 189835 199172 221274 253582\n</code></pre>"},{"location":"blog/silkaj-v080-release/#7-development-environment","title":"7. Development Environment","text":""},{"location":"blog/silkaj-v080-release/#a-poetry","title":"A. Poetry","text":"![Poetry logo](../../images/poetry-logo.svg){: style=\"height:120px;width:120px\"}  <p>We migrated the packaging and the dependency management tool from Pipenv to Poetry since Pipenv has been quite problematic recently and is also more suitable for larger projects.</p> <p>In comparison, Poetry is a well thought and stable tool which has been released by the end of 2019. In the former development environment, we had to define the dependencies twice in the <code>requirements.txt</code>, <code>setup.{py,cfg}</code>, <code>Pipenv</code> files. Poetry, however, supports the <code>pyproject.toml</code> file standardized by the Python project and is able to define the dependencies at once.</p> <p>If you would like to install Silkaj for development purposes, please follow this tutorial. You may also interested by checking the newly introduced contribution process documentation <code>CONTRIBUTING.md</code>.</p>"},{"location":"blog/silkaj-v080-release/#b-automatic-container-generation","title":"B. Automatic container generation","text":"<p>We set up an automated pipeline to generate containers for all supported Python versions: 3.5, 3.6, 3.7, and 3.8. These containers are based on official Python containers, which use Debian Buster Slim. On top of that, Poetry, <code>libsodium</code>, and other development tools are installed to continually check and test Silkaj in its pipeline. Since DuniterPy uses the same containers, it also profits from this automated container generation.</p>"},{"location":"blog/silkaj-v080-release/#c-cicd-pipelines","title":"C. CI/CD pipelines","text":"<p>Based on the containers set out above, a continuous integration and delivery pipeline has been set up to automatically run:</p> <ul> <li>Checks: format, build,</li> <li>Tests on all supported Python versions,</li> <li>Release publication automation on PyPI and PyPI test.</li> </ul> <p></p>"},{"location":"blog/silkaj-v080-release/#7-tests","title":"7. Tests","text":"<p>We started to write tests to ensure that all features of Silkaj are still functional when changing the code. However, in order to have all Silkaj commands fully tested, further efforts are required. During this development cycle, the test coverage raised from 37% to 69% and Silkaj is now covered by more than hundred tests.</p>"},{"location":"blog/silkaj-v080-release/#outlook","title":"Outlook","text":"<p>Silkaj is compatible with a range of Python versions. Currently, it can be used with Python 3.5, 3.6, 3.7, and 3.8. v0.8.x will be the last releases with Python 3.5 support. In v0.9.0, we will support Python 3.6, 3.7, 3.8, and 3.9.</p> <p>Since there is a deadline for packaging Silkaj and DuniterPy into Debian Bullseye (v11), we are putting all our efforts into the upcoming packaging. As for the coming version, DeathReaper, the <code>excluded</code> command, for which the crowdfunding has been completed, and the newly revamped <code>info</code> command will be stabilized and automatic tests will be written.</p> <p>ManUtopiK revamped Silkaj website in which you can look up all the presentations, the major features and documentations related to Silkaj. We are working on integrating the website into the project.</p> <p>For further details check out the presentations of the RML14. The oral presentations are in French and the slides in English:</p> <ul> <li>Moul's: How to contribute to Silkaj</li> <li>Matograine's: Envoyer des transactions exotiques avec Silkaj</li> </ul>"},{"location":"blog/silkaj-v080-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v081/","title":"V0.8.1","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine for your first release \\o/</p>"},{"location":"blog/v090rc/","title":"V0.9.0rc","text":""},{"location":"blog/v090rc/#call-for-testing-silkaj-v090rc","title":"Call for testing Silkaj v0.9.0rc","text":"<p>Hello everyone!</p> <p>We are pleased to publish a release candidate of Silkaj v0.9.0, and we would be happy to receive feedback before releasing it as a stable version.</p> <p>To install this pre-release version from PyPI, use this command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>Please test it globally, and check the changelog which contains the changes which happen during this development cycle. Pay a special attention to the transaction part where a part of the algorithm changed. There are new options on following commands:</p> <pre><code>silkaj history --full-pubkey\nsilkaj --dry-run cert\nsilkaj --dry-run/--display membership\n</code></pre> <p>Dry-run and display options are defined as general options, and only defined for this three cases for this release.</p>"},{"location":"blog/v090rc/#tests","title":"Tests","text":"<p>Manual tests help us making sure everything works fine for different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any loss of money.</p>"},{"location":"blog/v090rc/#tx","title":"<code>tx</code>","text":"<ul> <li>send a TX to a unique recipient</li> <li>send a TX to multiple recipients<ul> <li>with one amount</li> <li>with multiple amounts</li> </ul> </li> <li>send a TX to 92 recipients (can be 92 times the same)</li> <li>send a TX to 93 recipients (should fail)</li> </ul>"},{"location":"blog/v090rc/#membership","title":"<code>membership</code>","text":"<ul> <li>renew membership with <code>--dry-run</code> global option</li> <li>renew membership with <code>--display</code> global option</li> <li>renew membership without these two options</li> </ul>"},{"location":"blog/v090rc/#cert","title":"<code>cert</code>","text":"<ul> <li>send a certification with <code>--display</code> global option</li> <li>cert all identities you can on GTest network (thanks for keeping it alive ;-) )</li> <li>cert pubkey <code>4KEA63RCFF7AXUePPg5Q7JX9RtzXjywai1iKmE7LcoEC:DRz</code> on \u011e1-Test -&gt; you should be suggested two identities</li> <li>cert identity <code>ggg_ggg_2</code> on \u011e1-Test -&gt; you should NOT be proposed many identities</li> </ul>"},{"location":"blog/v090rc/#history","title":"<code>history</code>","text":"<ul> <li>check you history</li> <li>check you history and display userIDs</li> <li>check you history and display pubkeys in full-length</li> <li>check you history and display userIDs and pubkeys in full-length</li> </ul>"},{"location":"blog/v090rc/#wot","title":"<code>wot</code>","text":"<ul> <li>check your WoT infos are correct with <code>wot</code> command</li> </ul>"},{"location":"blog/v090rc/#checksum","title":"<code>checksum</code>","text":"<ul> <li>use <code>checksum</code> command to compute a checksum for one of your public keys.</li> <li>verify it with Silkaj</li> <li>verify it with Cesium</li> <li>try to change a character in the public key (with the checksum), then verify that it is wrong.</li> </ul>"},{"location":"blog/v090rc/#auth","title":"auth","text":"<ul> <li>create an authfile for a \u011e1-Test account</li> <li>send txs or certs using the authfile</li> </ul>"},{"location":"blog/v090rc/#other","title":"Other","text":"<p>Feel free to play!</p> <p>The release is planned for the 17th April of 2021, which will contain a detailed announcement of the changes and the new features.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v090-release/","title":"Silkaj v0.9.0 release","text":""},{"location":"blog/silkaj-v090-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.9.0. The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v090-release/#transaction","title":"Transaction","text":"<p>Silkaj is now properly handling the transaction document size limit. The 100 lines limit length of the transaction document in the compact format is now properly fulfilled by computing the length of the generated document.</p> <p>An important bug has been fixed regarding intermediaries transactions: When spending lots of sources (i.e. huge amounts from member wallets), many useless intermediaries transactions were sent and displayed. Intermediaries transactions are now correctly handled.</p> <p>Unit tests have been written on the <code>tx</code> command, which comforts us into developing new features.</p>"},{"location":"blog/silkaj-v090-release/#refactored-idlookup-command","title":"Refactored <code>id</code>/<code>lookup</code> command","text":"<p>The <code>id</code> command has been completely refactored. It now offers comprehensive results when looking for an identity by specifying a user identifier or a public key. Now the non-member user identifier are displayed. The command now uses same algorithm as <code>choose_identity()</code> which relies exclusively on <code>/wot/lookup</code> BMA's path. The command has been renamed to <code>lookup</code> to represent more closely what it does. This command renaming will also allow to introduce the future <code>identity</code> command.</p> <pre><code>silkaj lookup titi\nPublic keys or user id found matching 'titi':\n\n\u2192 4qJZFRfArLaUMEXDhsd69unsKynEFNLFazAVij4HNsBa:F4z \u2194 laetitia97421\n\u2192 4LCdTC9QsmqbFSHAhyaqGdDCVPr8Ywu2DZ8hDCzkdx4n:8ta \u2194 Amandinelaetitia\n\u2192 CehfxBHrowP6tXouR73GS52QhGAoNMtabooKbCvT7f3j:6cG \u2194 Laetiti974\n\u2192 FtZdA1HzHcDG6utoEgg6R5jjXfEne2ftS2UzvXajKurp:6Sm \u2194 Laetitia\n\u2192 EUn8uLJxgc3fVXJ1fBA74re4iD4Ws8Nk2xHytX1wLMfK:AQ2 \u2194 LaetitiaCarivenc\n\u2192 HqHZt9J1U7MwC3RF1bSjPgxACsTypfNjUThYFMZZfK6X:Dk1 \u2194 LaetitiaHOFF\n\u2192 5Vcm1zkHKoAMo9yy7Lk2HDX2Yn54agavtEUdrcFNmqkP:8mU \u2194 laetitiajanot\n\u2192 BfncGdTeq8qvhPZnBaM8T76SHM9xfx78ASRNZtGp64rZ:7tP \u2194 titi\n\u2192 BWKuSHYojjwzAXZZxSFTf5XVWneUMZqoWGUJEfWaFRL9:21F \u2194 titi43\n\u2192 49nWdTQqDT8qpazzPeP6NH92NwppG7YEh6PFYC2VecNA:Ba6 \u2194 titix\n</code></pre>"},{"location":"blog/silkaj-v090-release/#new-full-pubkey-option-on-the-history-command","title":"New <code>--full-pubkey</code> option on the <code>history</code> command","text":"<p>The <code>history</code> command adds a new option to display the whole public keys <code>--full-pubkey</code>:</p> <pre><code>silkaj -gt history 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH --full-pubkey\n\nTransactions history from: moul-test 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\nCurrent balance: 9012407.83 \u011eTest, 161.34 UD \u011eTest on the 2021-04-09 15:16:42\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n|        Date         |      Issuers/Recipients      | Amounts \u011eTest | Amounts UD\u011eTest |           Comment           |\n+=====================+==============================+===============+=================+=============================+\n| 2021-03-29 20:42:33 |                              |               |                 | Change operation            |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -193320       | -3.460          |                             |\n|                     | DjqoHyhGDFr5amh:45s          |               |                 |                             |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -338310       | -6.060          |                             |\n|                     | DjqoHyhGDFr5amh:45s          |               |                 |                             |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n</code></pre>"},{"location":"blog/silkaj-v090-release/#balance-command-is-now-displaying-corresponding-member-identity-user-identifier","title":"<code>balance</code> command is now displaying corresponding member identity user identifier","text":"<pre><code>silkaj -gt balance 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey            \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User identifier              \u2502 moul-test                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative) \u2502 8634537.83 \u011eTest | 162.21 UD \u011eTest               \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N        \u2502 1.05 x M/N                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v090-release/#display-option-on-cert-membership-commands","title":"Display option on <code>cert</code>, <code>membership</code> commands","text":"<p>This general option allows to display the generated document aside of the confirmation prompt before sending the document. It can be used for debugging, safety, or curiosity purposes. This option has only been implemented on the <code>cert</code> and the <code>membership</code> commands for now. The option should be available in next releases for the three others send-documents commands.</p> <pre><code>silkaj --gtest --auth-file --display cert KapisTest\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert   \u2502 Issuer                                           \u2502 \u2013&gt; \u2502 Recipient: Published: #block-hash date           \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID     \u2502 moul-test                                        \u2502 \u2013&gt; \u2502 KapisTest: [#673782](https://git.duniter.org/clients/python/silkaj/issues/673782)-00001519\u2026 2020-12-11 11:37:42 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502 \u2013&gt; \u2502 HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c:GZp \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Valid  \u2502 2021-04-09                                       \u2502 \u2014&gt; \u2502 2021-09-02                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Certification\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nIdtyIssuer: HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c\nIdtyUniqueID: KapisTest\nIdtyTimestamp: 673782-00001519FCBA6DDEFEE65B31ECD145B065F4404F870AAB272419EFA62BF5A677\nIdtySignature: 1KX/Iuv7FuXsxhTwYU/RIO9L0F3I+lGvBLYXRexIoCz35H+yb2Wf3nEXA2XXCPl5aVxcxvreOW2HF43r7ezcDA==\nCertTimestamp: 735968-00003F6B07F64573F6FABC510C1CEABEE8358426176BE7F190827A856873C517\n\nDo you confirm sending this certification? [y/N]: y\nCertification successfully sent.\n</code></pre> <pre><code>silkaj --gtest --auth-file --display membership\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership              \u2502 in 2 months                                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID)                              \u2502 moul-test                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key                                         \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity                                     \u2502 167750-0000A51FF952B76AAA594A46CA0C8156A56988\u2026   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published                                 \u2502 April 20, 2018                                   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership                  \u2502 in 2 months                                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 weeks                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Membership\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nBlock: 735967-00028030F3E2AB38D7EACA997065F58E16F0497EE86BFA23B2DA222EEE80C23C\nMembership: IN\nUserID: moul-test\nCertTS: 167750-0000A51FF952B76AAA594A46CA0C8156A56988D2B2B57BE18ECB4F3CFC25CEC2\nphOKWXHxfPBgkTE+Mui8Fiqb7QSlhPrKalDOzhyUwwLySV/EE2Z/b+vZNfByTn7sFYaHWPck5dsbzJQ6M+fBBA==\n\nDo you confirm sending this membership document for this identity? [y/N]: y\nMembership successfully sent\n</code></pre>"},{"location":"blog/silkaj-v090-release/#dry-run-option-is-becoming-a-generic-option","title":"Dry Run option is becoming a generic option","text":"<p>Before:</p> <pre><code>silkaj membership --dry-run\n</code></pre> <p>Now:</p> <pre><code>silkaj --dry-run membership\n</code></pre> <p>Note: This option is currently only implemented in the <code>membership</code> command.</p> <p>Note: The difference between the <code>--display</code> and the <code>--dry-run</code> options are that the dry run option by-passes the license, and the confirmation approvals. For safety reasons, the <code>--dry-run</code> option doesn't allow, at the end, to send the document on the network. On contrary, the <code>--display</code> option allows to send the document to the network.</p>"},{"location":"blog/silkaj-v090-release/#python-support","title":"Python support","text":"<p>Support for Python 3.5 has been dropped and support for Python 3.9 has been added.</p>"},{"location":"blog/silkaj-v090-release/#silkaj-v081-in-debian-bullseye","title":"Silkaj v0.8.1 in Debian Bullseye","text":"<p>If you are a user of Debian or its derivatives, you will be able to find Silkaj v0.8.1 available into Debian Bullseye (v11) which is about to be released. Silkaj package has been updated from v0.6.5 to v0.8.1 and DuniterPy v0.60.1 entered Debian repository for the first time.</p>"},{"location":"blog/silkaj-v090-release/#outlook","title":"Outlook","text":"<p>In the next developments, we are planning to work on DeathReaper, the implementations of the <code>revoke</code> and the <code>identity</code> commands. The removal of the asynchronous property, the migration from <code>tabulate</code> to <code>Texttable</code>, and the migration from BMA to GVA.</p>"},{"location":"blog/silkaj-v090-release/#thanks","title":"Thanks","text":"<p>matograine, moul, jonas, atrax</p>"},{"location":"contributing/","title":"Contributing","text":""},{"location":"contributing/#goals","title":"Goals","text":"<p>Part of the Duniter project running the \u011e1 currency, Silkaj project is aiming at creating a generic tool to manage the main account and wallets, to administrate and to monitor the currency.</p>"},{"location":"contributing/#install-the-development-environment","title":"Install the development environment","text":"<p>We are using Poetry as a development environment solution. Start by installing Poetry. This will install a sandboxed Python environment. Dependencies will be installed in it in order to have Silkaj running and to have pre-installed developement tools.</p>"},{"location":"contributing/#workflow","title":"Workflow","text":"<ul> <li>We use branches for merge requests</li> <li>We prefer fast-forward and rebase method than having merge commits created. This in order to have a clean history.</li> </ul>"},{"location":"contributing/#branches","title":"Branches","text":"<ul> <li><code>main</code>: development and stable branch</li> <li>maintainance branches, to maintain a stable version while developing future version with breaking changes. For instance: <code>release/0.12</code></li> </ul>"},{"location":"contributing/#developing-with-duniterpy","title":"Developing with DuniterPy","text":"[![DuniterPy logo](../images/duniterpy_logo.png){: style=\"height:150px;width:150px\"}](https://git.duniter.org/clients/python/duniterpy)  <p>DuniterPy is a Python library for Duniter v1 clients. It implements a client with multiple APIs, the handling for document signing. As it is coupled with Silkaj, it is oftenly needed to develop in both repositories.</p>"},{"location":"contributing/#how-to-use-duniterpy-as-editable-with-poetry","title":"How to use DuniterPy as editable with Poetry","text":"<p>Clone DuniterPy locally alongside of <code>silkaj</code> repository:</p> <pre><code>silkaj&gt; cd ..\ngit clone https://git.duniter.org/clients/python/duniterpy\n</code></pre> <p>Use DuniterPy as a path dependency:</p> <pre><code>poetry add ../duniterpy\n</code></pre>"},{"location":"contributing/#developing-with-modules","title":"Developing with modules","text":"<p>Silkaj is using Python modules which shape kind of a framework. Please read their documentations on how to use them the best possible.</p> <ul> <li>DuniterPy: Autogenerated documentation.<ul> <li>Feel free to contribute upstream to share the code with other Python programs</li> </ul> </li> <li>Click<ul> <li>Rich-Click</li> </ul> </li> <li>Arrow</li> <li>texttable</li> </ul>"},{"location":"contributing/#pre-commit-hooks","title":"Pre-commit hooks","text":"[![Pre-commit logo](../images/pre-commit_logo.svg){: style=\"height:150px;width:150px\"}](https://pre-commit.com/)  <p>We are using <code>pre-commit</code> tool to perform checks on staged changes before committing. We are using it for <code>black</code> formatting, <code>mypy</code> static typing, <code>gitlab-ci</code> linting. We are also using <code>ruff</code> which replaces <code>isort</code> imports sorting, <code>pylint</code> code linting, <code>autoflake</code>, and <code>pyupgrade</code></p> <p>Install <code>pre-commit</code> from your distribution. In case it is an outdated version, install it with <code>pipx</code>:</p> <pre><code>sudo apt install pre-commit\npipx install pre-commit\n</code></pre> <p>To install the <code>git-hooks</code>, from within Silkaj repository, run:</p> <pre><code>pre-commit install\n</code></pre> <p>Then each time you commit changes, the hooks will perform verifications.</p> <p>In case you want to commit while the hooks are failing, run the following to skip the hooks:</p> <pre><code>git commit -m \"msg\" --no-verify/-n\n</code></pre> <p>To manually run one of the tool above, run (eg for <code>ruff-format</code>):</p> <pre><code>pre-commit run --all-files ruff-format\n</code></pre> <p>To run all checks on all files:</p> <pre><code>pre-commit run -a\n</code></pre>"},{"location":"contributing/#authorization-for-gitlab-ci-linter-hook","title":"Authorization for GitLab CI linter hook","text":"<p><code>pre-commit run -a (gitlab-ci-linter)</code> is failing due to authorization required for CI lint API accesses. When running this command, just ignore this failed hook. In case you want to commit a <code>.gitlab-ci.yml</code> edition, this hook will prevent the commit creation. You can skip the hooks as mentionned above. This is fine for occasional <code>.gitlab-ci.yml</code> editions. In case you would like to edit this file more often and have it checked, ask a maintainer to provide you with <code>GITLAB_PRIVATE_TOKEN</code> environment variable that can be set into a shell configuration. With Bash, in <code>$HOME/.bashrc</code> add the following:</p> <pre><code>export GITLAB_PRIVATE_TOKEN=\"\"\n</code></pre> <p>With Fish, in <code>$HOME/.config/fish/config.fish</code> add the following:</p> <pre><code>set -xg GITLAB_PRIVATE_TOKEN \"\"\n</code></pre> <p>Check out duniterpy#169 for more details.</p>"},{"location":"contributing/#tests","title":"Tests","text":"[![Pytest logo](../images/pytest_logo.svg){: style=\"height:150px;width:150px\"}](https://pytest.org)  <p>We are using Pytest as a tests framework. For more information on how Silkaj implements them check the testing documentation.</p> <p>Tests are stored into <code>unit</code> and <code>integration</code> folders depending on their types, then using a similar tree as the source code.</p> <p>To run the tests, from within <code>silkaj</code> repository, run:</p> <pre><code>poetry run pytest\n</code></pre>"},{"location":"contributing/#how-to-test-a-single-file","title":"How to test a single file","text":"<p>Specifiy the path of the test:</p> <pre><code>poetry run pytest tests/unit/test_network.py\n</code></pre>"},{"location":"contributing/#version-bump","title":"Version bump","text":"<p>We are using the Semantic Versioning.</p> <p>To create a release, we use following script which will bump the version in different files, and will make a commit and a tag out of it.</p> <pre><code>./release.sh 0.20.0\n</code></pre> <p>Then, a <code>git push --tags</code> is necessary to publish the tag.</p>"},{"location":"contributing/#how-to-release-a-pre-release-on-pypi","title":"How to release a pre-release on PyPI","text":"<p>Append <code>[{a|b|rc}N]</code> to the version, it will be automatically detected as pre-release by PyPI. i.e.: <code>v0.20.0rc0</code>.</p> <ul> <li>install a pre-release from PyPI:</li> </ul> <pre><code>pip install silkaj --user --upgrade --pre\n</code></pre> <ul> <li>install <code>silkaj</code> from PyPI test and the dependencies (i.e. DuniterPy) from PyPI (have been removed from the documentation):</li> </ul> <pre><code>pip install silkaj --user --upgrade -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/\n</code></pre>"},{"location":"contributing/#update-copyright-year","title":"Update copyright year","text":"<p>Follow this documentation Only difference is to update the year in <code>license_header.txt</code> rather than <code>LICENSE.txt</code>.</p>"},{"location":"contributing/#pypi-and-pypi-test-distributions","title":"PyPI and PyPI test distributions","text":"[![PyPI logo](../images/pypi_logo.svg){: style=\"height:150px;width:150px\"}](https://pypi.org/project/silkaj)  <p>Silkaj is distributed to PyPI, the Python Package Index, for further <code>pip</code> installation. Silkaj can be published to PyPI or to PyPI test for testing purposes. Publishing to PyPI or PyPI test can be directly done from the continuous delivery or from Poetry it-self. The CD jobs appear on a tag and have to be triggered manually. Only the project maintainers have the rights to push tags.</p>"},{"location":"contributing/#pypi","title":"PyPI","text":"<p>Publishing to PyPI from Poetry:</p> <pre><code>poetry publish --build\n</code></pre>"},{"location":"contributing/#pypi-test","title":"PyPI test","text":"<p>Publishing to PyPI test from Poetry:</p> <pre><code>poetry config repositories.pypi_test https://test.pypi.org/legacy/\npoetry publish --build --repository pypi_test\n</code></pre> <p>To install this package:</p> <pre><code>pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.python.org/simple/ silkaj\n</code></pre> <p>The <code>--extra-index-url</code> is used to retrieve dependencies packages from the official PyPI not to get issues with missing or testing dependencies comming from PyPI test repositories.</p>"},{"location":"contributing/#continuous-integration-and-delivery","title":"Continuous integration and delivery","text":"![GitLab logo](../images/GitLab_icon.svg){: style=\"height:100px;width:100px\"}"},{"location":"contributing/#own-built-docker-images","title":"Own built Docker images","text":"<p>Silkaj pipeline is running images built on top of official Python images based on latest Debian with Poetry installed on top them.</p> <p>They can be found in this repository.</p>"},{"location":"contributing/#pipeline-and-its-jobs","title":"Pipeline and its jobs","text":"<ul> <li>Checks:<ul> <li>pre-commit hooks</li> <li>Build</li> </ul> </li> <li>Tests on supported Python versions:<ul> <li>Installation</li> <li>Pytest on Python supported versions</li> </ul> </li> <li>Package<ul> <li>PyPI stable</li> <li>PyPI test</li> <li>Docker pip</li> <li>Docker poetry</li> </ul> </li> <li>Website/project documentation commited to be deployed via GitLab Pages</li> </ul>"},{"location":"contributing/#g1-monetary-license-update","title":"\u011e1 monetary license update","text":"<p>To modify the \u011e1 monetary license files, please change them on its repository, since it\u2019s integrated in silkaj repository as a <code>git subtree</code>.</p> <p>\u011e1 monetary license is included in Silkaj repository as a <code>git subtree</code>. To update the licence files, add the license repository as a remote then pull:</p> <pre><code>git remote add g1_monetary_license https://git.duniter.org/documents/g1_monetary_license.git\ngit subtree pull --prefix g1_monetary_license g1_monetary_license master\n</code></pre> <p>Depending on your distribution, you might need to install <code>git-subtree</code>.</p>"},{"location":"contributing/container_usage/","title":"Container usage","text":"<p>There are two kind of containers. The one built with <code>pip</code> for user purposes, and the one built with Poetry for developer purposes.</p> <p>We recommand using <code>podman</code> instead of <code>docker</code> command for not having to run the command as <code>root</code>.</p> <p>In case you use <code>docker</code>, you can add your user into the <code>docker</code> group, so you can manipulate <code>docker</code> executable without <code>root</code> permissions.</p>"},{"location":"contributing/container_usage/#user","title":"User","text":"<p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <p>Run Silkaj from outside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory is where Silkaj sources are installed in Python <code>site-packages</code>. This is fine for doing small editions. For bigger editions, it is adviced to use a development environment with Poetry.</p>"},{"location":"contributing/container_usage/#developer","title":"Developer","text":"<p><code>git</code> is installed, so it can be used as a development environment.</p> <p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <p>Run Silkaj from ouside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory contains Silkaj sources. Set up the repository to have it ready for developments:</p> <pre><code>git checkout dev\ngit remote set-url origin https://git@git.duniter.org/clients/python/silkaj.git\n</code></pre> <pre><code>git config --global user.email \"you@example.com\"\ngit config --global user.name \"Your Name\"\n</code></pre>"},{"location":"contributing/documentation/","title":"Documentation contribution","text":"![MkDocs Material icon](../images/mkdocs-material-favicon.png)  <p>The project documentation website is based on MkDocs framework and on following theme and plugins:</p> <ul> <li>Mkdocs Material: theme and framework</li> <li>Mike: to publish multiple versions</li> <li>MkDocs Coverage: to integrate coverage report iframe into MkDocs</li> <li>MkDocs GitLab plugin: to display links to GitLab references items: used in the changelog page</li> </ul> <p>Please refer to their respective documentation.</p>"},{"location":"contributing/documentation/#set-up","title":"Set up","text":"<p>Install the optional <code>docs</code> group:</p> <pre><code>poetry install --with docs\n</code></pre>"},{"location":"contributing/documentation/#mkdocs","title":"MkDocs","text":"<p>Run the website in development mode:</p> <pre><code>poetry run mkdocs deploy\n</code></pre> <p>Open localhost:8000 in your web browser.</p> <p>The preview will be live-updated once you change the documentation.</p>"},{"location":"contributing/documentation/#mike","title":"Mike","text":"<p>Running following command will serve what\u2019s on <code>pages</code> branch:</p> <pre><code>poetry run mike serve\n</code></pre> <p>This preview won\u2019t be live-updated with your latest changes as it would be with <code>mkdocs serve</code>. This is because Mike simply serves what\u2019s built on <code>pages</code> branch.</p>"},{"location":"contributing/documentation/#changing-the-content","title":"Changing the content","text":"<p>Into <code>docs</code> folder, you can find the Markdown source files which can be edited. <code>mkdocs.yml</code> file lists the website structure.</p>"},{"location":"contributing/documentation/#deployment-workflow","title":"Deployment workflow","text":"<p>Only on <code>main</code> branch, a <code>website</code> job will be triggered containing the documentation build for a specific version. It creates a commit which is added to <code>pages</code> branch with <code>poetry run mike deploy $version</code> command. Then the commit is pushed on the git repository remote from the job with an access token. The coverage report is integrated in the website build. The artefact is retrieved from the coverage job with <code>needs:</code> keyword.</p> <p>From <code>pages</code> branch, an other pipeline is triggered, publishing the documentation website to silkaj.duniter.org for all versions via GitLab Pages.</p>"},{"location":"contributing/documentation/#access-token","title":"Access token","text":"<p>A <code>git push</code> is performed from the job to the remote repository via the authorisation provided via an access token set in CI/CD variables. The access token has to be renew every year, since this is the maximum lifespan we can set for an access token at its creation. The access token has to be created on a project basis with <code>repository_write</code> checked and with Developer role.</p>"},{"location":"contributing/install_poetry/","title":"Poetry installation","text":"![Poetry logo](../images/poetry-logo.svg){: style=\"height:120px;width:120px\"}"},{"location":"contributing/install_poetry/#install-silkaj-in-a-development-environement-with-poetry","title":"Install Silkaj in a development environement with Poetry","text":""},{"location":"contributing/install_poetry/#install-libsodium","title":"Install libsodium","text":"DebianFedora <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium\n</code></pre>"},{"location":"contributing/install_poetry/#install-poetry","title":"Install Poetry","text":"<ul> <li>Installation documentation</li> </ul> <pre><code>pipx install poetry\n</code></pre>"},{"location":"contributing/install_poetry/#install-dependencies-and-the-python-virtual-environment","title":"Install dependencies and the Python virtual environment","text":"<pre><code># Over HTTPS\ngit clone https://git.duniter.org/clients/python/silkaj.git\n\n# Over SSH\ngit clone git@git.duniter.org:clients/python/silkaj.git\n\ncd silkaj\n\n# Installs the runtime and development dependencies\npoetry install\n</code></pre>"},{"location":"contributing/install_poetry/#run-silkaj","title":"Run Silkaj","text":"<p>Within <code>silkaj</code> repository run Silkaj:</p> <pre><code>poetry run silkaj\n</code></pre>"},{"location":"contributing/install_poetry/#poetry-shell","title":"Poetry shell","text":"<p>You can access tools <code>pytest</code> from within the development environment with <code>poetry run</code> or by entering the shell:</p> <pre><code>silkaj&gt; poetry run pytest\n</code></pre> <pre><code>silkaj&gt; poetry shell\n(silkaj-58dUTebQ-py3.12) silkaj&gt; pytest\n</code></pre>"},{"location":"contributing/install_poetry/#make-silkaj-accessible-from-everywhere","title":"Make Silkaj accessible from everywhere","text":"<p>Add following alias to your shell configuration:</p> <pre><code>alias silkaj=\"cd /path/to/silkaj &amp;&amp; poetry run silkaj\"\n</code></pre>"},{"location":"contributing/packaging/","title":"Packaging","text":"<p>Silkaj is packaged in official Debian repositories. Packaging details can be found in its repository on Debian forge.</p>"},{"location":"contributing/packaging/#dependencies","title":"Dependencies","text":"<p>DuniterPy might be the only dependency not already into distributions.</p>"},{"location":"contributing/packaging/#manual-pages","title":"Manual pages","text":"<p>To generate manual pages: #179</p> <ul> <li><code>click-man</code></li> </ul>"},{"location":"contributing/packaging/#shell-completion","title":"Shell completion","text":"<p>Shell completion might be set-up as described in the installation documentation.</p>"},{"location":"contributing/testing/","title":"Testing","text":""},{"location":"contributing/testing/#test-and-coverage","title":"Test and coverage","text":""},{"location":"contributing/testing/#install-tests-dependencies","title":"Install tests dependencies","text":"<pre><code>poetry install\n</code></pre>"},{"location":"contributing/testing/#runing-tests","title":"Runing tests:","text":"<p>Simply run:</p> <pre><code>poetry run pytest\n</code></pre> <p>To have a coverage report:</p> <pre><code>poetry run pytest --cov silkaj --cov-report html --cov-report xml --cov-report term\n</code></pre> <p>See pytest documentation for more information</p>"},{"location":"contributing/testing/#writing-tests","title":"Writing tests","text":"<p>There should be three kinds of test:</p> <ul> <li>end to end test: uses the real data and the real blockchain. Obviously don't presume the data value as it can change. These test are written in <code>tests/integration/test_end_to_end.py</code>.</li> <li>integration test: mock some of the input and/or output classes and shouldn't use the actual blockchain, you should use this when mocking a class (used by your code) is too complicated.</li> <li>unit test: for functions that don't need mock or mock can me done easily (you should prefer this to integration tests). Are written in <code>tests/unit/test_*package*.py</code></li> </ul> <p>You should try to write an end to end test first, then if your coverage too bad add some unit tests. If it's still too bad, write an integration test.</p> <p>A better strategy (TDD) is to write first the End to end test. When it fails, before writing the code, you should implement the unit tests. When this one fails too, you can write your code to make your test pass. It's better but takes longer and the code is tested at least twice. So the previous strategy is a better compromise</p>"},{"location":"contributing/testing/#tips","title":"Tips","text":"<p>Test an Exception is raised: https://docs.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions</p> <p>Test a function with several values: You can use <code>@pytest.mark.parametrize</code> as done in <code>tests/unit/money/test_transfer.py</code></p> <p>To mock a user input:</p> <pre><code>from unittest.mock import patch\n\nfrom silkaj.cert import certification_confirmation\n\n\n# this will add a mock_input parameter that will be used whenever the code tries to get input from user\n@patch('builtins.input')\ndef test_certification_confirmation(mock_input):\n    id_to_certify = {\"pubkey\": \"pubkeyid to certify\"}\n    main_id_to_certify = {\"uid\": \"id to certify\"}\n\n    # the input will return \"yes\" to the tested function (certification_confirmation)\n    mock_input.return_value = \"yes\"\n\n    # ensure the tested function returns something\n    assert certification_confirmation(\n        \"certifier id\",\n        \"certifier pubkey\",\n        id_to_certify,\n        main_id_to_certify)\n\n    # ensure that input is called once\n    mock_input.assert_called_once()\n</code></pre>"},{"location":"usage/","title":"Usage","text":"<ul> <li>Command-line interface reference</li> <li>Account storage</li> <li>Multi-recipients transfers and automation</li> <li>DeathReaper</li> </ul>"},{"location":"usage/account_storage/","title":"Account storage","text":"<p>Silkaj features the account storage to store and read security-wise important documents from a location on your local computer. It is used to store and read authentication and revocation files with Silkaj. It is recommended to use the storage instead of storing and reading these files anywhere on your system.</p> <p>They are stored into <code>$XDG_DATA_HOME/silkaj</code>, aka <code>$HOME/.local/share/silkaj/$currency/$account_name</code> as:</p> <ul> <li><code>revocation.txt</code></li> <li><code>authentication_file_ed25519.dewif</code> for v1 WIF and EWIF formats based on the approved RFC n\u00b013.</li> <li><code>authentication_file_sr25519.json</code> for v2 encrypted json format</li> </ul> <p>The account name is a local name given to a wallet. It does not necessarily need to be the same identity nickname/alias stored into the blockchain. No verification what so ever is performed to check any correspondence between the local name stored into Silkaj account storage and the one stored on the blockchain or the indexer.</p>"},{"location":"usage/account_storage/#per-currency-storage","title":"Per currency storage","text":"<p>The storage is organized per currencies. Depending on the specified endpoint with the endpoint options (<code>--endpoint</code>, <code>--gtest</code>) the currency will be determined. Based on the latter, it will stored into <code>g1</code> or <code>g1-test</code> directory.</p>"},{"location":"usage/account_storage/#authentication","title":"Authentication","text":""},{"location":"usage/account_storage/#import","title":"Import","text":"<p>Import your authentication file into the storage. In case you want to use an other authentication method than the default Scrypt method, use one of the authentication options which can be find in <code>silkaj authentication --help</code> usage.</p> <p>Next command will store the authentication file in <code>$HOME/.local/share/silkaj/g1/test/authentication_file_ed25519.dewif</code></p> <pre><code>silkaj --account test authentication &lt;authentication option&gt;\n</code></pre> <p>Note: <code>g1</code> and <code>test</code> folders comes respectively from the default \u011e1 endpoint and <code>test</code> from the account passed.</p>"},{"location":"usage/account_storage/#reading","title":"Reading","text":"<p>Commands using authentication such as <code>money transfer</code>, <code>wot certify</code>, <code>wot membership</code>, and <code>money balance</code> will read the authentication file from the account storage. With the general <code>--account</code> option, it will use the authentication file created in previous step.</p> <pre><code>silkaj --account test money transfer\n</code></pre>"},{"location":"usage/account_storage/#revocation","title":"Revocation","text":""},{"location":"usage/account_storage/#inputoutput","title":"Input/Output","text":"<p>The general <code>--account</code> option (placed between <code>silkaj</code> and the sub-command) is used to read the authentication file and to write the revocation file in the same directory.</p> <pre><code>silkaj --account test authentication\n</code></pre>"},{"location":"usage/account_storage/#creation","title":"Creation","text":"<pre><code>silkaj --gtest --account john wot revocation create\n</code></pre> <p>Will be stored into <code>$HOME/.local/share/silkaj/g1-test/john/revocation.txt</code></p>"},{"location":"usage/account_storage/#reading_1","title":"Reading","text":"<p>The revocation document can be read with <code>wot revocation publish</code> and <code>verify</code> commands as follow:</p> <pre><code>silkaj --gtest --account john wot revocation verify\n</code></pre> <p>Here we are reading the revocation file generated in previous step.</p>"},{"location":"usage/cli/","title":"Command-line interface reference","text":"<p>This page provides documentation of Silkaj command line interface.</p>"},{"location":"usage/cli/#silkaj","title":"silkaj","text":"<p>Usage:</p> <pre><code>silkaj [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>-h</code>, <code>--help</code> boolean Show this message and exit. <code>False</code> <code>-v</code>, <code>--version</code> boolean Show the version and exit. <code>False</code> <code>--endpoint</code>, <code>-ep</code> text Without specifying this option, the default endpoint reaches \u011e1 currency on its official endpoint: https://g1.duniter.org. --endpoint allows to specify a custom endpoint following <code>&lt;host&gt;:&lt;port&gt;/&lt;path&gt;</code> format. <code>port</code> and <code>path</code> are optional. In case no port is specified, it defaults to 443. NOTE: This argument is mutually exclusive with arguments: [gtest]. None <code>--gtest</code>, <code>-gt</code> boolean Uses official \u011eTest currency endpoint: https://g1-test.duniter.org NOTE: This argument is mutually exclusive with arguments: [endpoint]. <code>False</code> <code>--account</code>, <code>-a</code> text Account name used in storage <code>$HOME/.local/share/silkaj/$currency/$account_name</code> for authentication and revocation. None <code>--password</code>, <code>-p</code> text EWIF authentication password. If you use this option, prefix the command with a space so the password is not saved in your shell history. In case of an encrypted file, password input will be prompted. None <code>--display</code>, <code>-d</code> boolean Display the generated document before sending it <code>False</code> <code>--dry-run</code>, <code>-n</code> boolean By-pass the licence and confirmation. Do not send the document, but display it instead <code>False</code> <p>Subcommands</p> <ul> <li>about: Display program information</li> <li>authentication: Generate and store authentication file</li> <li>blockchain: Blockchain related commands</li> <li>checksum: Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</li> <li>license: Display \u011e1 monetary license</li> <li>money: Money management related commands</li> <li>wot: Web-of-Trust related commands</li> </ul>"},{"location":"usage/cli/#silkaj-about","title":"silkaj about","text":"<p>Display program information</p> <p>Usage:</p> <pre><code>silkaj about [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-authentication","title":"silkaj authentication","text":"<p>Generate and store authentication file</p> <p>Usage:</p> <pre><code>silkaj authentication [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--auth-scrypt</code>, <code>--scrypt</code> boolean Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_file, auth_wif]. <code>False</code> <code>--nrp</code> text Scrypt parameters: defaults N,r,p: \"4096,16,1\" None <code>--auth-file</code>, <code>-af</code> file Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_scrypt, auth_wif]. None <code>--auth-seed</code>, <code>--seed</code> boolean Seed hexadecimal authentication NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_wif]. <code>False</code> <code>--auth-wif</code>, <code>--wif</code> boolean WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_scrypt, auth_file]. <code>False</code> <code>--password</code>, <code>-p</code> text EWIF encryption password for the destination file. If no password argument is passed, WIF format will be used. If you use this option prefix the command with a space so the password does not get saved in your shell history. Password input will be suggested via a prompt. None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain","title":"silkaj blockchain","text":"<p>Blockchain related commands</p> <p>Usage:</p> <pre><code>silkaj blockchain [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>blocks: Display blocks: default: 0 for current window size</li> <li>difficulty: Display current Proof-of-Work difficulty level to generate next block</li> <li>info: Currency information</li> </ul>"},{"location":"usage/cli/#silkaj-blockchain-blocks","title":"silkaj blockchain blocks","text":"<p>Display blocks: default: 0 for current window size</p> <p>Usage:</p> <pre><code>silkaj blockchain blocks [OPTIONS] [NUMBER]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--detailed</code>, <code>-d</code> boolean Force detailed view. Compact view happen over 30 blocks <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-difficulty","title":"silkaj blockchain difficulty","text":"<p>Display current Proof-of-Work difficulty level to generate next block</p> <p>Usage:</p> <pre><code>silkaj blockchain difficulty [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-info","title":"silkaj blockchain info","text":"<p>Currency information</p> <p>Usage:</p> <pre><code>silkaj blockchain info [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-checksum","title":"silkaj checksum","text":"<p>Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</p> <p>Usage:</p> <pre><code>silkaj checksum [OPTIONS] [PUBKEY_CHECKSUM]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-license","title":"silkaj license","text":"<p>Display \u011e1 monetary license</p> <p>Usage:</p> <pre><code>silkaj license [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money","title":"silkaj money","text":"<p>Money management related commands</p> <p>Usage:</p> <pre><code>silkaj money [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>balance: Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</li> <li>history: History of wallet money movements</li> <li>transfer: Transfer money</li> </ul>"},{"location":"usage/cli/#silkaj-money-balance","title":"silkaj money balance","text":"<p>Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</p> <p>Usage:</p> <pre><code>silkaj money balance [OPTIONS] [PUBKEYS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-history","title":"silkaj money history","text":"<p>History of wallet money movements</p> <p>Usage:</p> <pre><code>silkaj money history [OPTIONS] PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--uids</code>, <code>-u</code> boolean Display identities username <code>False</code> <code>--full-pubkey</code>, <code>-f</code> boolean Display full-length public keys <code>False</code> <code>--csv-file</code>, <code>--csv</code> file Write in specified file name in CSV (Comma-separated values) format the history of money movements None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-transfer","title":"silkaj money transfer","text":"<p>Transfer money</p> <p>Usage:</p> <pre><code>silkaj money transfer [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--amount</code>, <code>-a</code> float range (<code>0.01</code> and above) Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amountsud]. None <code>--amountUD</code>, <code>-d</code> float range (<code>1e-06</code> and above) Relative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amounts]. None <code>--allSources</code> boolean Send all sources to one recipient. NOTE: This argument is mutually exclusive with arguments: [file_path, amounts, amountsud]. <code>False</code> <code>--recipient</code>, <code>-r</code> text Public key(s)' recipients + optional checksum: <code>&lt;pubkey&gt;[:checksum]</code>. Sending to multiple recipients is possible. With one amount specified, all recipients will receive the same amount. With one amount specified per recipient, recipient 1 will recieve amount 1, and so on. NOTE: This argument is mutually exclusive with arguments: [file_path]. None <code>--file</code>, <code>-f</code> file File's path containing a list of amounts in absolute or relative reference and recipients' pubkeys NOTE: This argument is mutually exclusive with arguments: [allsources, amounts, recipients, amountsUD]. None <code>--reference</code>, <code>-ref</code> text Transfer reference `` <code>--outputBackChange</code> text Pubkey recipient to send the rest of the transaction: <code>&lt;pubkey[:checksum]&gt;</code> None <code>--yes</code>, <code>-y</code> boolean Assume yes. Do not prompt confirmation <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot","title":"silkaj wot","text":"<p>Web-of-Trust related commands</p> <p>Usage:</p> <pre><code>silkaj wot [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>certify: Certify identity</li> <li>lookup: Username identifier and public key lookup</li> <li>membership: Send or renew membership.</li> <li>revocation: Manage revocation document commands.</li> <li>status: Check received and sent certifications and consult the membership status of any given identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-certify","title":"silkaj wot certify","text":"<p>Certify identity</p> <p>Usage:</p> <pre><code>silkaj wot certify [OPTIONS] UID_PUBKEY_TO_CERTIFY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-lookup","title":"silkaj wot lookup","text":"<p>Username identifier and public key lookup</p> <p>Usage:</p> <pre><code>silkaj wot lookup [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-membership","title":"silkaj wot membership","text":"<p>Send or renew membership.</p> <p>Usage:</p> <pre><code>silkaj wot membership [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation","title":"silkaj wot revocation","text":"<p>Manage revocation document commands.</p> <p>Usage:</p> <pre><code>silkaj wot revocation [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>create: Create and save revocation document</li> <li>publish: Publish previously created revocation document. Identity will be immediately revoked.</li> <li>revoke: Create and publish revocation document. Will immediately revoke the identity.</li> <li>verify: Verifies that the revocation document is correctly formatted and matches an existing identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-revocation-create","title":"silkaj wot revocation create","text":"<p>Create and save revocation document</p> <p>Usage:</p> <pre><code>silkaj wot revocation create [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-publish","title":"silkaj wot revocation publish","text":"<p>Publish previously created revocation document. Identity will be immediately revoked.</p> <p>Usage:</p> <pre><code>silkaj wot revocation publish [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-revoke","title":"silkaj wot revocation revoke","text":"<p>Create and publish revocation document. Will immediately revoke the identity.</p> <p>Usage:</p> <pre><code>silkaj wot revocation revoke [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-verify","title":"silkaj wot revocation verify","text":"<p>Verifies that the revocation document is correctly formatted and matches an existing identity</p> <p>Usage:</p> <pre><code>silkaj wot revocation verify [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-status","title":"silkaj wot status","text":"<p>Check received and sent certifications and consult the membership status of any given identity</p> <p>Usage:</p> <pre><code>silkaj wot status [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/deathreaper/","title":"DeathReaper","text":"![DeathReaper logo](../images/deathreaper_logo.svg)  <p>DeathReaper is a service reporting Web of Trust exclusions on Discourse forums. Images are created containing Silkaj + DeathReaper. These images are operated on DeathReaper repository with pipeline schedules.</p>"},{"location":"usage/deathreaper/#installation","title":"Installation","text":"<p>When installing Silkaj, you have to specify the optional extra <code>deathreaper</code> distribution in order to get DeathReaper\u2019s dependency <code>pydiscourse</code> installed. It will therefore \"activate\" the feature, and <code>silkaj wot exclusions</code> command will become available.</p> <pre><code>pipx install silkaj[deathreaper]\n</code></pre> <p>With Poetry development environment:</p> <pre><code>poetry install --extras deathreaper\n</code></pre>"},{"location":"usage/deathreaper/#usage","title":"Usage","text":"<p>DeathReaper was first released in Silkaj codebase with version 0.12.0. Make sure <code>exclusions</code> command is present under <code>silkaj wot</code>, otherwise something probably went wrong with the installation. Then run <code>silkaj wot exclusions --help</code> to check how to use it.</p> <p>By default it will report the exclusions for the last day, from 24 hours in the past till now. You can specify an other duration with <code>silkaj wot exclusions 0.5</code> for the last 12 hours, half a day, for example.</p> <p>By default the report will be displayed in the terminal. To have the report published on a Discourse forum, you have to pass following options <code>--api-id</code> <code>--*-api-key</code>, <code>--publish</code>. Further code changes have to be done in order to support additional Discourse forums.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/","title":"Multi-recipients transfers and automation","text":"<p>We want to transfer money to multiple recipients and to automate that process.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#create-a-recipients-file","title":"Create a recipients file","text":"<p>Create a file (i.e.: <code>recipients.txt</code>) containing the list of the recipients public keys you want to send money to.</p> recipients.txt<pre><code>&lt;ABSOLUTE|RELATIVE&gt;\n\n# comment 1\n&lt;amount1&gt; &lt;pubkey1&gt;\n\n# comment 2\n&lt;amount2&gt; &lt;pubkey2&gt;:[&lt;checksum2&gt;]\n</code></pre> <p>The file content should be prefixed with <code>RELATIVE</code> or <code>ABSOLUTE</code> so the amounts will be expressed in UD \u011e1 or \u011e1.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#set-up-the-authentication","title":"Set up the authentication","text":"<ul> <li>Check authentication documentation on how to handle the authentication.</li> </ul>"},{"location":"usage/multi-recipients_transfers_and_automation/#transfer","title":"Transfer","text":"<p>Finally, you just have to run following command:</p> <pre><code>silkaj -a &lt;account_name&gt; money transfer --file recipients.txt\n</code></pre>"},{"location":"usage/multi-recipients_transfers_and_automation/#automation","title":"Automation","text":"<p>In case you want to automate a transfer on a regural basis, on the first day of the month in this example, you can set a <code>crontab</code> on your machine (preferably a machine running 7/24):</p> <pre><code>0 0 1 * * silkaj -a &lt;account_name&gt; money transfer --file recipients.txt --yes\n</code></pre> <p>Pass <code>--yes</code> option so no confirmation gets prompted. In case a password is set on the authentication, pass as well the <code>--password &lt;password&gt;</code> general option.</p>"},{"location":"coverage/","title":"Coverage report","text":""},{"location":"blog/2023/","title":"2023","text":""},{"location":"blog/2022/","title":"2022","text":""},{"location":"blog/2021/","title":"2021","text":""},{"location":"blog/2020/","title":"2020","text":""},{"location":"blog/2019/","title":"2019","text":""},{"location":"blog/2018/","title":"2018","text":""},{"location":"blog/2017/","title":"2017","text":""},{"location":"blog/2016/","title":"2016","text":""},{"location":"blog/minor/","title":"minor","text":""},{"location":"blog/release/","title":"release","text":""},{"location":"blog/rc/","title":"rc","text":""},{"location":"blog/page/2/","title":"Blog","text":""},{"location":"blog/page/3/","title":"Blog","text":""},{"location":"blog/page/4/","title":"Blog","text":""},{"location":"blog/page/5/","title":"Blog","text":""},{"location":"blog/minor/page/2/","title":"minor","text":""},{"location":"blog/release/page/2/","title":"release","text":""},{"location":"blog/release/page/3/","title":"release","text":""}]}
\ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome","text":"<p>Welcome to Silkaj documentation</p> <p>Install  Usage </p>"},{"location":"#what-is-silkaj","title":"What is Silkaj?","text":"<p>Silkaj is a command line client for \u011e1 libre currency powered by Duniter software.</p> <ul> <li> <p> Money management</p> <p>Transfer money, check your balance, and history stand.</p> </li> <li> <p> Web-of-Trust management</p> <p>Manage your certifications, membership, and revocation document.</p> </li> <li> <p> Account management</p> <p>With the wallet import format authentication method.</p> </li> <li> <p> CLI interface</p> <p>Silkaj is built around a command line interface design.</p> </li> <li> <p> Low requirements</p> <p>Written with Python, Silkaj is built with low requirements in mind.</p> </li> <li> <p> RTM compatible</p> <p>Silkaj is compatible with the Relative Theory of Money and includes \u011e1 Monetary License.</p> </li> <li> <p> Free software</p> <p>Silkaj is licensed under  GNU\u00a0AGPL v3.</p> </li> </ul>"},{"location":"changelog/","title":"Changelog","text":""},{"location":"changelog/#0.11.2","title":"v0.11.2 November 22, 2023","text":"<ul> <li>#484: Support Python v3.12 on v0.11 release</li> </ul>"},{"location":"changelog/#pre-requisites","title":"Pre-requisites","text":"<ul> <li>disable <code>pylint</code> and <code>pyupgrade</code> hooks</li> <li>switch jobs to <code>3.12</code> image containing <code>pre-commit</code></li> <li>!195, duniterpy#205: Fix <code>gitlab-ci-linter</code> hook</li> </ul>"},{"location":"changelog/#support-python-v312","title":"Support Python v3.12","text":"<ul> <li>!237, #457: Drop Python v3.7 support</li> <li>Bump <code>pendulum</code> to <code>v3.0.0b1</code></li> <li>!238, !250, #448: Add support for Python v3.12</li> </ul>"},{"location":"changelog/#0.11.1","title":"v0.11.1 August 14, 2023","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206<ul> <li>Set tilde requirement, to allow future patch updates</li> </ul> </li> </ul>"},{"location":"changelog/#0.11.0","title":"v0.11.0 November 27, 2022","text":"<p>(Please see the full set of changes for this release also in v0.10.0rc0 note below)</p>"},{"location":"changelog/#cli","title":"CLI","text":"<ul> <li>!229, #430: Rename <code>certification</code> cmd to <code>certify</code> and <code>revocation save</code> to <code>revocation create</code></li> </ul>"},{"location":"changelog/#milestone-v0110","title":"Milestone v0.11.0","text":""},{"location":"changelog/#0.11.0rc0","title":"v0.11.0rc0 November 12, 2022","text":""},{"location":"changelog/#code","title":"Code","text":"<ul> <li>!199, #203: Migrate from <code>tabulate</code> to <code>texttable</code></li> <li>!216, #330: Repository restructuration</li> </ul>"},{"location":"changelog/#network","title":"Network","text":"<ul> <li>!211, #397: Replace singletons with <code>@functools.lru_cache()</code> decorator</li> <li>!220, #438, #411, #3: Add <code>sleep()</code> between <code>identity_of()</code> calls in a loop</li> </ul>"},{"location":"changelog/#cli_1","title":"CLI","text":"<ul> <li>!219, #430: Organize commands into subcommands</li> <li>!218, #436: Rename <code>tx</code> command to <code>transfer</code></li> <li>!223, #449: Get rid of <code>argos</code></li> </ul>"},{"location":"changelog/#dev-env","title":"Dev Env","text":"<ul> <li>!214, #163: Introduce type annotations for static typing with <code>mypy</code></li> <li>!227, #453: Support new <code>mypy</code> v0.990 reports</li> <li>!215, #292: Introduce <code>pylint</code> tool</li> <li>!212, #424: Introduce <code>flake8</code></li> <li>!222, #450: Replace <code>flake8</code> with <code>autoflake</code></li> <li>!210, #428: Introduce <code>pre-commit-hooks</code> and <code>mdformat</code> hooks</li> <li>!226, #451: <code>pre-commit:hooks</code> job doesn\u2019t appear</li> <li>!209, #408: Change workflow by changing from <code>master</code> and default <code>dev</code> branches to a single <code>main</code> branch</li> <li>!224, #441: Separate <code>unit</code> and <code>integration</code> tests</li> <li>!221, #442: Add support for Python v3.11</li> <li>!217, #447: Fix coverage integration into GitLab</li> </ul>"},{"location":"changelog/#documentation","title":"Documentation","text":"<ul> <li>!225, #224: Refactor <code>pip</code> install documentation: remove Windows part</li> <li>!225, #188, #293: Replace <code>pip</code> installation with <code>pipx</code></li> <li>#432: List printqrjune in wrappers list</li> </ul>"},{"location":"changelog/#0.10.0","title":"v0.10.0 April 18, 2022","text":"<p>(Please see the full set of changes for this release also in the v0.10.0rc0 and rc1 notes below)</p>"},{"location":"changelog/#milestone-v0100","title":"Milestone v0.10.0","text":""},{"location":"changelog/#0.10.0rc1","title":"v0.10.0rc1 April 6, 2022","text":"<ul> <li>#426, !207: \u011e1 Monetary License refactoring:<ul> <li>Drop display in a browser</li> <li>Discover available languages</li> <li>Create <code>G1MonetaryLicense</code> class out of existing functions</li> </ul> </li> <li>Add Italian translation of \u011e1 monetary license</li> <li>#421, !204 : <code>wot</code> command can display membership status from an other identity sharing same <code>uid</code>/<code>pubkey</code></li> <li>#422: <code>excluded</code> command displays information of an other identity sharing same uid/pubkey, not the one excluded</li> <li>#216 <code>diffi</code>: Catch WS disconnection exception</li> </ul>"},{"location":"changelog/#0.10.0rc0","title":"v0.10.0rc0 March 21, 2022","text":""},{"location":"changelog/#code_1","title":"Code","text":""},{"location":"changelog/#features","title":"Features","text":"<ul> <li>#89, !170: Manage the revocation document</li> <li>#134, !202: Read transaction recipients and amounts from a file</li> </ul>"},{"location":"changelog/#g1-monetary-license","title":"\u011e1 Monetary license","text":"<ul> <li>#221, !181: Research about \u011e1 monetary license integration and refactor of its handling in Silkaj</li> <li>#308, !181: \u011e1 license display on a workstation: give the choice how to display it</li> <li>#392, !181: \u011e1 monetary license files not included into the Python package</li> <li>!181: subtree updated bringing new translations: Esperanto, Espagnol, and Portuguese</li> </ul>"},{"location":"changelog/#deathreaper","title":"DeathReaper","text":"<ul> <li>#256: Implement <code>excluded</code> command to report excluded identities from the WoT / DeathReaper</li> </ul>"},{"location":"changelog/#network_1","title":"Network","text":"<ul> <li>#373, #396, #410, !182, !194: Drop asynchronous property</li> <li>#390, !182, !196: Implement generic <code>network_tools.send_document()</code></li> <li>#177, !188: Clean no longer used network layer functions<ul> <li>Rename global option from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> </ul> </li> <li>#181, #409, !193: Improve endpoint determination code layer</li> <li>#260: Disconnection bug when sending a document to a local node</li> </ul>"},{"location":"changelog/#other-changes","title":"Other changes","text":"<ul> <li>#407, !182: Support DuniterPy v1.0 Breaking Backward compatible changes in <code>Documents</code> classes</li> <li>#344, !177: Fix import loop issue</li> <li>!177: Generalize <code>pendulum</code> usage</li> <li>#416, !170: Move <code>wot_lookup()</code> exceptions handling in higher level functions</li> </ul>"},{"location":"changelog/#minor-impact-changes","title":"Minor impact changes","text":"<ul> <li>#194, !195: Convert strings to <code>f-strings</code></li> <li>#376, !195: Replace <code>tools.message_exit()</code> with <code>sys.exit()</code></li> <li>#413, !170: Create <code>get_currency()</code> helper</li> <li>#264, !178: Remove unmaintained and commented <code>network</code> command</li> </ul>"},{"location":"changelog/#meta","title":"Meta","text":"<ul> <li>!200: Bump DuniterPy to v1.1.0</li> <li>#332, !200: Drop Python v3.6 support</li> <li>#374, !197: Add support for Python v3.10</li> <li>#401, !184: Bump to click v8.0</li> <li>#364, !187: Introduce insert-license pre-commit hook, Switch <code>#</code> comment instead of <code>\"\"\"</code> docstring for the copyright and license statements</li> <li>#365, !201: Update the copyright date to 2022 in the headers of every source files</li> </ul>"},{"location":"changelog/#documentation_1","title":"Documentation","text":"<ul> <li>#384: Document how to release pre-releases</li> <li>!180: <code>README</code> and <code>CONTRIBUTING</code> enhancements</li> </ul>"},{"location":"changelog/#installationcontinuous-delivery","title":"Installation/Continuous Delivery","text":"<ul> <li>#388, !198: Set up Silkaj Docker images build automation</li> </ul>"},{"location":"changelog/#development-environmentcontinuous-integration","title":"Development Environment/Continuous Integration","text":"<ul> <li>#326, !189: Integrate coverage in GitLab coverage feature</li> <li>#355, !183: Set <code>Py:3.8</code> as default image and move coverage to <code>Py:3.9</code></li> <li>#355, !185: Move the coverage and the badge generations to v3.9 test job</li> <li>#414, !197: Drop Poetry lock file usage</li> <li>!175: <code>pyproject.toml</code> and <code>release.sh</code> clean-ups, Pyinstaller removal</li> </ul>"},{"location":"changelog/#introduce-and-generalize-pre-commit-usage","title":"Introduce and generalize <code>pre-commit</code> usage","text":"<ul> <li>#401, !183: Introduce <code>isort</code> and <code>gitlab-ci-linter</code> <code>pre-commit</code> hooks</li> <li>#403, !192: Introduce <code>pyupgrade</code>, Remove dev dep tools</li> <li>#406, !191: Set up <code>pre-commit</code> hooks CI jobs</li> <li>!179: Bump <code>black</code> to v21.4b2 and allow to install as pre-release</li> <li>!190: Update <code>pre-commit</code> doc. Document CI linter hook usage</li> </ul> <p>Thanks moul, matograine</p>"},{"location":"changelog/#0.9.0","title":"v0.9.0 April 17, 2021","text":""},{"location":"changelog/#milestone-v090","title":"Milestone v0.9.0","text":"<ul> <li>#345, #385, !171: Refactor <code>id</code>/<code>lookup</code> command exclusively using <code>/wot/lookup</code><ul> <li>Display non-member uids when passing a pubkey</li> <li>Use same algorithm as <code>choose_identity()</code> uses</li> <li>Rename <code>id</code> to <code>lookup</code> command</li> </ul> </li> <li>#377, !172: <code>balance</code>: Fix undefined variable in case of 'Total' label</li> </ul> <p>Plus what can be found bellow in v0.9.0rc</p>"},{"location":"changelog/#0.9.0rc","title":"v0.9.0rc March 24, 2021","text":""},{"location":"changelog/#code_2","title":"Code","text":""},{"location":"changelog/#tx","title":"<code>tx</code>","text":"<ul> <li>#281, !129: Handle transaction size limit properly</li> <li>#257, #312, #356: Handle chained transactions/Change txs lost while sending big amount</li> <li>#296, #362, !154, !157: Prevent sending transaction with 0 as amounts</li> <li>#172, !165: Refactor tx confirmation, by using <code>click.confirm()</code></li> </ul>"},{"location":"changelog/#balance","title":"<code>balance</code>","text":"<ul> <li>#300, !164: <code>balance</code>: Display corresponding member identity uid</li> <li>#366, !159: Fix wrong <code>DuniterError</code> exception handling in <code>wot.identity_of</code></li> <li>#377, !166: <code>balance</code>: Document <code>money.show_amount_from_pubkey()</code></li> <li>#342, !151: Don\u2019t allow to pass multiple times the same pubkey to the <code>balance</code> command</li> </ul>"},{"location":"changelog/#others","title":"Others","text":"<ul> <li>#218, !160: <code>history</code>: Add option to display the complete pubkeys</li> <li>#314, !165: Display option for <code>cert</code>, <code>membership</code> commands</li> <li>!165: Make <code>--dry-run</code> option a generic one</li> <li>#378, !165: Create and use generic <code>send_doc_confirmation()</code> in <code>cert</code> and <code>membership</code> commands</li> <li>#176, !149: Get rid of <code>PyNaCl</code> and use <code>base58</code> module</li> <li>#309, !163: <code>wot</code>: Fix legend about received certifications</li> <li>#208: <code>argos</code>: Remove duplicate call to <code>CurrencySymbol</code></li> </ul>"},{"location":"changelog/#tests","title":"Tests","text":"<ul> <li>#213, !130: Write unit tests for the <code>tx</code> command</li> <li>#282, !130: Split <code>patched.py</code> into files</li> <li>#335, !130: Merge the two functions testing <code>transaction_amount()</code></li> <li>#363, !129: Returns balance from <code>patched_get_source()</code></li> <li>#368, !161: Assertions are not tested when testing system exit</li> <li>#362, !156: Change \"moul\" id in tests</li> </ul>"},{"location":"changelog/#meta_1","title":"Meta","text":"<ul> <li>#240, !150: Drop Python 3.5 support</li> <li>#294, !150, docker/python3/poetry!1: Add support and set-up Python 3.9 test job</li> <li>#270: Silkaj v0.8.1 package for Debian Bullseye (v11)</li> <li>#226, !158: Get rid of <code>ipaddress</code> dependency</li> <li>#290, !162: Update <code>pre-commit</code> dev dependency</li> <li>#267: Update the copyright date to 2021 in the headers of every source files</li> <li>!150, !155, !167, Update DuniterPy from v0.58.1 to v0.62.0</li> <li>#313, !148: Be compatible with and handle new features from Poetry v1.1</li> <li>#299, !147: Introduce dev version suffix</li> </ul> <p>Thanks matograine, moul, atrax</p>"},{"location":"changelog/#0.8.1","title":"v0.8.1 November 30, 2020","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine</p>"},{"location":"changelog/#0.8.0","title":"v0.8.0 October 18, 2020","text":""},{"location":"changelog/#milestone-v080","title":"Milestone v0.8.0","text":""},{"location":"changelog/#code_3","title":"Code","text":""},{"location":"changelog/#transaction","title":"Transaction","text":"<ul> <li> <p>#111, !108: Support passing different amounts on multi-recipients tx</p> <ul> <li>Breaking change: Rename <code>--output</code> option to <code>--recipient</code></li> </ul> </li> <li> <p>Add extra small options to ease passing multiple amounts and recipients:</p> <ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code></li> </ul> </li> <li> <p>Add possibility to pass multiple options:</p> <ul> <li>Breaking change: recipients public keys are no longer <code>:</code> separated: <code>-r A -r B</code></li> </ul> </li> <li> <p>#232, !131, !132: Identities not retrieved for tx with several issuers, and to display the tx history</p> </li> <li> <p>#236, !107: Improve the confirmation display</p> </li> <li> <p>!144: Rework confirmation fields titles</p> </li> <li> <p>#235: Make sure only one option is passed to retrieve the amount of the transaction</p> </li> </ul>"},{"location":"changelog/#membership-wot","title":"Membership, WoT","text":"<ul> <li>#88, !140: Add <code>membership</code> command</li> <li>#88, !144: Rework table fields names</li> <li>#140, !140: Ability to pass an <code>uid</code> or a <code>pubkey</code> to <code>wot</code>, and <code>cert</code>, <code>membership</code> commands<ul> <li>Implement identity choice selector</li> </ul> </li> </ul>"},{"location":"changelog/#checksum","title":"Checksum","text":"<ul> <li>#237, !132: Breaking change: Switch back the checksum delimiter from <code>!</code> to <code>:</code></li> <li>#323, !132: Handle pubkey's checksum in the tx code</li> <li>#301, !143: Generalize pubkey checksum display and verifiction, Add <code>chekcsum</code> command</li> <li>#320, !143: Incorrect use of <code>check_public_key()</code> in <code>id</code> command</li> </ul>"},{"location":"changelog/#others_1","title":"Others","text":"<ul> <li>#262, !123: Add new <code>verify</code> command to check blocks\u2019 signatures</li> <li>#264, !133: Disable the broken <code>net</code> command</li> <li>!131: Display <code>powMin</code> in a row in the <code>blocks</code> explorer</li> <li>#210, !115: Close client session in every cases</li> <li>#223: Make Click context optional to be able to call functions from an external module</li> <li>#255, !113: <code>balance</code>: display the content in tables</li> <li>#269, !133: Move <code>convert_time()</code> to <code>tui.py</code></li> <li>#278, !128: Fix PubSec regex</li> <li>#336, !141: <code>history</code>: Pubkeys display issue with multisig txs</li> </ul>"},{"location":"changelog/#dev-env_1","title":"Dev Env","text":""},{"location":"changelog/#poetry-migration","title":"Poetry migration","text":"<ul> <li>#182: Migrate from Pipenv and <code>setup.py</code> to Poetry</li> <li>#249: Install Poetry stable when v1 is released</li> <li>#263, !127: Post migration tasks (black, poetry)</li> <li>#276, !120: Pip installation do not install <code>silkaj</code> executalbe into <code>$HOME/.local/bin</code></li> </ul>"},{"location":"changelog/#cicd-set-up","title":"CI/CD set-up","text":"<ul> <li>#245: Automated containers builds with Poetry installed for Python versions 3.5, 3.6, 3.7, and 3.8</li> <li>#149: CI/CD set up</li> <li>#105: Deploy on PyPI from GitLab CD</li> <li>#146: Add a coverage badge</li> <li>#284, !124: <code>build</code> and <code>tests</code> jobs are not retriggered in case of source code change</li> <li>#286, !126: Use latest Black version from PyPI in the container</li> <li>!131: Use <code>rules</code> instead of <code>only/except</code></li> </ul>"},{"location":"changelog/#tests_1","title":"Tests","text":"<ul> <li>#241: Can not run test with Click utility</li> </ul>"},{"location":"changelog/#dependencies","title":"Dependencies","text":"<ul> <li>#259: <code>attr</code> error while installing with <code>pip</code></li> <li>!121, !131, !142: Update DuniterPy from v0.55.1 to v0.58.0</li> <li>#251, !140: Introduce <code>pendulum</code> date utility</li> <li>Introduce <code>pytest-sugar</code></li> <li>Update PyNaCl to v1.4.0</li> <li>Update Click to v7.1.2</li> <li>#338, !140: Update black to v20</li> </ul>"},{"location":"changelog/#python-versions-support","title":"Python versions support","text":"<p>We added the support for Python 3.8. #240: It is planned that v0.8.x versions are going to be the last releases with Python 3.5 support since its support from the Python project has been dropped September 30th of 2020.</p>"},{"location":"changelog/#documentation_2","title":"Documentation","text":"<ul> <li>#202: Document contribution process in <code>CONTRIBUTING.md</code></li> <li>#182: Document Poetry installation and usage</li> <li>!109: Add Poetry installation on Debian Buster</li> <li>!103: Add pip installation documentation for macOS</li> <li>!131: Add packaging status badge from Repology</li> <li>#244: Add <code>AUTHORS.md</code> listing the contributors</li> <li>#207: Create Silkaj SVG logo</li> </ul>"},{"location":"changelog/#project","title":"Project","text":"<ul> <li>#252, !118: Create a script to update and update the copyright date to 2020</li> <li>#285, !132: Add copyright and license statements in tests source files</li> </ul>"},{"location":"changelog/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"changelog/#0.7.6","title":"v0.7.6 January 24, 2020","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"changelog/#0.7.5","title":"v0.7.5 January 23, 2020","text":"<ul> <li>#276: Publish on PyPI with previous method: <code>wheel</code>, <code>twine</code>, and <code>setup.py</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"changelog/#0.7.4","title":"v0.7.4 January 22, 2020","text":"<ul> <li>#273, !119: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"changelog/#0.7.3","title":"v0.7.3 July 25, 2019","text":"<p>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:</p> <ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate for loop</li> </ul>"},{"location":"changelog/#0.7.2","title":"v0.7.2 June 25, 2019","text":"<ul> <li>#233: fix round passed amount and amoundUD floats \u00d7 by 100</li> </ul>"},{"location":"changelog/#0.7.1","title":"v0.7.1 May 29, 2019","text":"<ul> <li>Fix transaction document generation from DuniterPy</li> </ul>"},{"location":"changelog/#0.7.0","title":"v0.7.0 May 22, 2019","text":""},{"location":"changelog/#milestone-v070","title":"Milestone v0.7.0","text":""},{"location":"changelog/#duniterpy","title":"DuniterPy","text":"<ul> <li>#7, !97: Migrate to DuniterPy</li> <li>#200: Freeze DuniterPy dependency version</li> <li>#206: Set a sleep for async requests</li> <li>#178: Select different sources for intermediaries tx</li> </ul>"},{"location":"changelog/#cli_2","title":"CLI","text":"<ul> <li>#77, !98: Migrate command line tool from commandline to Click</li> <li>#67, #76, #116, #117, #123: fixed by previous issue</li> <li>#167: Rename <code>amount</code> command to <code>balance</code></li> <li>#148: Rename <code>issuers</code> command to <code>blocks</code> which is a more appropriate word to what it does</li> <li>With <code>-p</code> option: when the port of the node is 443, it\u2019s not necessary to specify the port</li> </ul>"},{"location":"changelog/#transaction_1","title":"Transaction","text":"<ul> <li>#22: Display transactions history in a table</li> <li>#184: Rework transaction functions (Part 3)</li> <li>#152: fix <code>--allSources</code> option which was not working</li> <li>#165, !99: Display outputBackChange option in confirmation chart</li> <li>#131: Prevent sending too small amount</li> </ul>"},{"location":"changelog/#certification","title":"Certification","text":"<ul> <li>#170: Change process: only propose license display</li> <li>#198: Display identity\u2019s blockstamp and date into confirmation message</li> </ul>"},{"location":"changelog/#difficulty-level","title":"Difficulty level","text":"<ul> <li>#93: Difficulties fails / use websocket to be informed about new block</li> <li>#190: Display the date when the head block has been generated</li> </ul>"},{"location":"changelog/#balance_1","title":"Balance","text":"<ul> <li>!96, #122: display balance in comparison to the average of money share</li> </ul>"},{"location":"changelog/#blocks","title":"Blocks","text":"<ul> <li>Display the full dates of blocks\u2019 generation and mediantime</li> </ul>"},{"location":"changelog/#wot","title":"WoT","text":"<ul> <li>#141: Crash on membership status</li> <li>Add legend to explain <code>\u2714</code></li> <li>#189: Handle wot requests exceptions</li> <li>#135 :is_member() requests all members to know if an identity is member will explose</li> </ul>"},{"location":"changelog/#authentication","title":"Authentication","text":"<ul> <li>#130: Prevent erasing authfile</li> <li>Use <code>pathlib.Path</code> instead of <code>os.path</code></li> </ul>"},{"location":"changelog/#tests_2","title":"Tests","text":"<ul> <li>!83, #85: Create test structure</li> <li>#225: Install <code>pytest-asyncio</code></li> </ul>"},{"location":"changelog/#other","title":"Other","text":"<ul> <li>#161: Singleton improvement</li> <li>#157, !100: Use <code>for</code> loops</li> <li>#169, !100: type issue</li> <li>#113: Many small improvements</li> </ul>"},{"location":"changelog/#website-doc","title":"Website / Doc","text":"<ul> <li>#82: Update website and readme about new features</li> <li>#136: Link directly the installation documentation on the website</li> <li>#159: Update website</li> <li>#160: Add website repository link in the README</li> <li>List Silkaj wrappers en the README</li> </ul>"},{"location":"changelog/#installation-documentation","title":"Installation documentation","text":"<ul> <li>Add instructions on installing libsodium which is required by pylibscrypt since DuniterPy migration</li> <li>#142: Improve pip installation documentation</li> <li>Improve Pipenv installation documentation</li> <li>!89: Add Docker install procedure, Pip: dependency and PATH tricks</li> <li>#215: Conflict between pyproject.toml and pipenv install</li> </ul>"},{"location":"changelog/#windows","title":"Windows","text":"<ul> <li>#153: Install on Windows, Scrypt issue</li> <li>#154: net: can\u2019t get screen size on Windows</li> <li>!92: Document Windows installation with pip</li> </ul>"},{"location":"changelog/#project_1","title":"Project","text":"<ul> <li>#132: Add a license notice as a header of every source files</li> <li>#158: Add CHANGELOG.md file</li> <li>#186: Fix firsts two tags</li> <li>Pypi: add classifiers</li> </ul>"},{"location":"changelog/#thanks_1","title":"Thanks","text":"<p>Attilax, Bernard, cebash, matograine, vtexier</p>"},{"location":"changelog/#0.6.5","title":"v0.6.5 Debian January 8, 2019","text":"<p>v0.6.5 fork for Debian package without DuniterPy migration but with Click CLI module.</p> <ul> <li>#137: Create Debian package and publish it in Buster</li> <li>#77, !98: Migrate to Click</li> <li>#132: Add a license notice as a header of every source files</li> </ul>"},{"location":"changelog/#thanks_2","title":"Thanks","text":"<p>jonas</p>"},{"location":"changelog/#0.6.1","title":"v0.6.1 December 10, 2018","text":""},{"location":"changelog/#milestone-v061","title":"Milestone v0.6.1","text":"<ul> <li>!90, #151: Fix intermediaries transactions sent to wrong recipient</li> <li>!91, #145: Allow to renew certifications</li> <li>#155: Make <code>clear</code> calls works on Windows</li> <li>#141: Crash on membership status</li> <li>#166: Shell completion</li> </ul>"},{"location":"changelog/#0.6.0","title":"v0.6.0 November 18, 2018","text":""},{"location":"changelog/#milestone-v060","title":"Milestone v0.6.0","text":""},{"location":"changelog/#installation","title":"Installation","text":"<ul> <li>#86: Move from <code>pyenv+pip</code> to Pipenv as the new development environment solution</li> <li>#100, !80: New installation method with <code>pip</code> now set as default</li> <li>#100: Documentation on how to publish on Pypi</li> </ul>"},{"location":"changelog/#authentication_1","title":"Authentication","text":"<ul> <li>#78: Use Scrypt as default authentication method</li> <li>#102: Display a confirmation message after using <code>generate_auth_file</code> command</li> <li>#103: More explicit usage about the authentication file mechanism storage</li> </ul>"},{"location":"changelog/#certification_1","title":"Certification","text":"<ul> <li>#96, !82: Certification fails for non-members identities</li> <li>Prevent certifying ourself</li> <li>Code refactoring: simplification, duplicate code removal</li> </ul>"},{"location":"changelog/#wot_1","title":"Wot","text":"<ul> <li>Display certification stock</li> <li>#73: Display identity status:<ul> <li>Display membership expiration due to membership expiration and certifications expiration</li> </ul> </li> <li>#127: fix: display human readable date for 'revoked on' attribute</li> </ul>"},{"location":"changelog/#transaction_2","title":"Transaction","text":"<ul> <li>#83, !78: Allow multi-output transactions</li> <li>#72: Check the pubkey\u2019s balance is enough before processing the transaction</li> <li>#72: Minors transaction refactoring</li> <li>#101: Round UD value in the confirmation summary</li> <li>#118: Use generic function to get sources</li> <li>#120: Display pubkey\u2019s balance before and after transaction in the confirmation summary</li> <li>#125: Fix wrong amount transferred</li> </ul>"},{"location":"changelog/#new-commands","title":"New commands","text":"<ul> <li>#91: <code>about</code>: displays information about silkaj</li> <li>#95: <code>license</code>: displays \u011e1\u2019s license</li> </ul>"},{"location":"changelog/#g1-test","title":"\u011e1-test","text":"<ul> <li>#87: Add <code>--gtest</code> option to specify official \u011e1-test node</li> <li>#109, !84: Improve gtest usage message</li> <li>#112: Amount: fix authentication option with <code>--gtest</code> option</li> </ul>"},{"location":"changelog/#python-37","title":"Python 3.7","text":"<ul> <li>#98: Test with Python 3.7: silkaj is compatible with Python from version 3.4 to 3.7</li> <li>#98: Set Python 3.7 for Pipenv</li> </ul>"},{"location":"changelog/#network-performances","title":"Network performances","text":"<ul> <li>#42, !85: Thanks to singleton, requests are made once for <code>head_block</code>, blockchain parameters, endpoint, <code>ud_value</code>, and <code>currency_symbol</code> retrieval</li> <li>#32: request the domain first instead of the IP (to handle https certificates) (this avoid <code>network</code> view to crash)</li> <li>#32, !79: Add timeouts on GET and POST requests</li> <li>#128, !88: Fix POST request timeout</li> </ul>"},{"location":"changelog/#black-code-formatting","title":"Black: code formatting","text":"<ul> <li>#94, !76: move from <code>pep8</code> to <code>black</code> code formatting. Set pre-commit hook and CI worker</li> </ul>"},{"location":"changelog/#bug-fixes-and-refactoring","title":"Bug fixes and refactoring","text":"<ul> <li>#121: Move cryptographic related functions into <code>crypto_tools.py</code></li> </ul>"},{"location":"changelog/#logo","title":"Logo","text":"<ul> <li>#92: Silkaj logo publication under GNU APGLv3 after a successful crowdfunding</li> </ul>"},{"location":"changelog/#wrappers","title":"Wrappers","text":"<ul> <li>#107: Document silkaj wrappers usages</li> </ul>"},{"location":"changelog/#forum-post","title":"Forum post","text":""},{"location":"changelog/#0.5.0","title":"v0.5.0 May 22, 2018","text":""},{"location":"changelog/#milestone-v050","title":"Milestone v0.5.0","text":""},{"location":"changelog/#certification_2","title":"Certification","text":"<ul> <li>#61: sending certification document:<ul> <li>check that current identity is member</li> <li>check that the certification has not already been sent</li> <li>prompt \u011e1\u2019s license and ask for acceptance in web browser or in pager (a <code>less</code>-like) if no web browser is available</li> </ul> </li> </ul>"},{"location":"changelog/#wot_2","title":"Wot","text":"<ul> <li>#84: display certifications\u2019 expiration date</li> <li>#81: bugfix, nothing displayed when there is two identities with same id</li> </ul>"},{"location":"changelog/#amount","title":"Amount","text":"<ul> <li>remove necessity to prepend with <code>--pubkey</code> option: <code>silkaj amount pubkey1:pubkey2:pubkey3</code></li> </ul>"},{"location":"changelog/#issuers","title":"Issuers","text":"<ul> <li>display the hash\u2019s ten first characters as \u011e1\u2019s global difficulty has increased</li> <li>display blocks in current window: <code>silkaj issuers 0</code></li> </ul>"},{"location":"changelog/#build","title":"Build","text":"<ul> <li>#6: Automate releases using a script</li> </ul>"},{"location":"changelog/#other_1","title":"Other","text":"<ul> <li>display <code>\u011e1</code> and <code>\u011eTest</code> currencies symbols</li> <li>Aliases commands <code>id</code>: <code>identities</code>, <code>tx</code>: <code>transaction</code>, <code>net</code>: <code>network</code></li> <li><code>import</code> rework to improve loading performances</li> <li>Lots of code reorganization and cleaning</li> </ul>"},{"location":"changelog/#forum-post_1","title":"Forum post","text":""},{"location":"changelog/#0.4.0","title":"v0.4.0 January 28, 2018","text":""},{"location":"changelog/#milestone-v040","title":"Milestone v0.4.0","text":""},{"location":"changelog/#new-wot-command-which-displays-received-and-sent-certification-of-an-identity","title":"New <code>wot</code> command which displays received and sent certification of an identity","text":"<ul> <li>!50, !66</li> </ul>"},{"location":"changelog/#transaction_3","title":"Transaction","text":"<ul> <li>#41: Rework/refactoring of transaction code (part 1)</li> <li>!55: Add check condition for sources</li> <li>!57: Exit if wrong pubkey\u2019s output formats</li> </ul>"},{"location":"changelog/#amount_1","title":"Amount","text":"<ul> <li>#46, !68: Add ability to display the amount of many pubkey with same command</li> <li>Total amount of pubkeys displayed at the end (nice to know how much units you own)</li> </ul>"},{"location":"changelog/#authentication_2","title":"Authentication","text":"<ul> <li>!56: Add \u011eannonce (aka PubSec) file format import</li> <li>#60: Hide salt at scrypt authentication</li> </ul>"},{"location":"changelog/#difficulties","title":"Difficulties","text":"<ul> <li>!58: Reload/refresh in a loop PoW difficulty level</li> <li>Display in same order as Remuniter</li> </ul>"},{"location":"changelog/#id","title":"Id","text":"<ul> <li>#49: Display if pubkey is member</li> <li>#59: Bug fix with <code>id</code> command</li> </ul>"},{"location":"changelog/#build_1","title":"Build","text":"<ul> <li>Build published with sha256 checksum</li> </ul>"},{"location":"changelog/#other_2","title":"Other","text":"<ul> <li>Change default endpoint</li> </ul>"},{"location":"changelog/#thanks_3","title":"Thanks","text":"<p>Thanks to Tortue95, jytou, mmuman, and cuckooland</p>"},{"location":"changelog/#forum-post_2","title":"Forum post","text":""},{"location":"changelog/#0.3.0","title":"v0.3.0 April 17, 2017","text":""},{"location":"changelog/#milestone-v030","title":"Milestone v0.3.0","text":""},{"location":"changelog/#transactions","title":"Transactions","text":"<ul> <li>enhance transaction command:<ul> <li>#27, #30: ask for confirmation</li> <li>!38: new confirmation chart containing transaction informations</li> <li>don\u2019t prompt <code>scrypt</code> parameters. See <code>Auth</code> \u00a7</li> </ul> </li> </ul>"},{"location":"changelog/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>!29: new command <code>id</code> to search identities with pubkey or id</li> </ul>"},{"location":"changelog/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>#23, !40: Pyenv installation tutorial</li> </ul>"},{"location":"changelog/#authentication_3","title":"Authentication","text":"<ul> <li>!45: new authentication method: WIF. For future paper wallet feature</li> <li>#39, #43: Don\u2019t prompt scrypt parameters at authentication. Use default ones</li> </ul>"},{"location":"changelog/#builds","title":"Builds","text":"<ul> <li>#5: with Pyinstaller</li> </ul>"},{"location":"changelog/#other_3","title":"Other","text":"<ul> <li>!33, !37: Ability to sort network view</li> <li>Change license from GNU GPLv3 to GNU AGPLv3</li> <li>!31: Code formatting with <code>pep8</code></li> </ul> <p>Thanks to Tortue95 and jytou</p>"},{"location":"changelog/#forum-post_3","title":"Forum post","text":""},{"location":"changelog/#0.2.0","title":"v0.2.0 March 27, 2017","text":""},{"location":"changelog/#features_1","title":"Features","text":"<ul> <li>Transaction feature</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"changelog/#milestone-v020","title":"Milestone v0.2.0","text":""},{"location":"changelog/#announcement","title":"Announcement","text":"<ul> <li>Diaspora* post</li> </ul> <p>Big thanks to Tortue95, and mmuman.</p>"},{"location":"changelog/#0.1.0","title":"v0.1.0 September 23, 2016","text":""},{"location":"changelog/#public-release","title":"Public release","text":"<ul> <li>Duniter forum post</li> <li>Diaspora* post</li> </ul>"},{"location":"changelog/#milestone-v010","title":"Milestone v0.1.0","text":""},{"location":"changelog/#features_2","title":"Features","text":"<p>Sub-commands:</p> <ul> <li><code>info</code></li> <li><code>difficulties</code></li> <li><code>network</code></li> <li><code>issuers</code></li> </ul> <p>Thanks to c-geek.</p>"},{"location":"install/","title":"Install Silkaj","text":""},{"location":"install/#distribution","title":"Distribution","text":"<p>Installing Silkaj from the package manager of your favorite distribution might not be available or might not come with latest Silkaj version. In order to get latest version install Silkaj with <code>pipx</code> or <code>pip</code> from PyPI which you can find in next sections.</p> <p></p>"},{"location":"install/#unix","title":"Unix","text":"<p>On a Unix system, run in your shell following commands:</p>"},{"location":"install/#install-libsodium","title":"Install libsodium","text":"DebianFedoramacOS <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium-devel\n</code></pre> <pre><code>brew install libsodium\n</code></pre>"},{"location":"install/#install-pipx","title":"Install <code>pipx</code>","text":"<p>Check <code>pipx</code> documentation for an extended installation tutorial.</p> DebianFedoramacOS <pre><code>sudo apt install pipx python3-dev\n</code></pre> <pre><code>sudo dnf install pipx python3-devel\n</code></pre> <pre><code>brew install python3 pipx\n</code></pre>"},{"location":"install/#install-with-pipx","title":"Install with pipx","text":"<p>pipx tool is recommended for Python executables. It isolates libraries into separated virtual environments.</p>"},{"location":"install/#ensure-path","title":"Ensure path","text":"<p>Takes care to add Pipx executables in the <code>PATH</code> of your shell:</p> <pre><code>pipx ensurepath\n</code></pre>"},{"location":"install/#install","title":"Install","text":"<pre><code>pipx install silkaj\n</code></pre>"},{"location":"install/#upgrade","title":"Upgrade","text":"<pre><code>pipx upgrade silkaj\n</code></pre>"},{"location":"install/#uninstall","title":"Uninstall","text":"<pre><code>pipx uninstall silkaj\n</code></pre>"},{"location":"install/#check-silkaj-is-working","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#install-with-pip","title":"Install with pip","text":"<p><code>pipx</code> installation is recommended, but you can proceed with <code>pip</code> if you know what you are doing.</p>"},{"location":"install/#install-pip","title":"Install <code>pip</code>","text":"DebianFedoramacOS <pre><code>sudo apt install python3-pip\n</code></pre> <pre><code>sudo dnf install python3-pip\n</code></pre> <p>Already installed with <code>python3</code></p>"},{"location":"install/#completing-path","title":"Completing <code>PATH</code>","text":"<p>If after Silkaj intallation you get a <code>bash: silkaj: command not found</code> error, you have to extend the <code>PATH</code> with <code>~./local/bin</code>:</p> <pre><code>echo \"export PATH=$PATH:$HOME/.local/bin\" &gt;&gt; $HOME/.bashrc\nsource $HOME/.bashrc\n</code></pre>"},{"location":"install/#install-for-current-user-only","title":"Install for current user only","text":"<pre><code>pip install silkaj --user\n</code></pre>"},{"location":"install/#upgrade_1","title":"Upgrade","text":"<pre><code>pip install silkaj --user --upgrade\n</code></pre>"},{"location":"install/#uninstall-useful-to-see-the-real-paths","title":"Uninstall (useful to see the real paths)","text":"<pre><code>pip uninstall silkaj --user\n</code></pre>"},{"location":"install/#check-silkaj-is-working_1","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#shell-completion","title":"Shell completion","text":"<p>Set up the shell completion by adding following line in your shell configuration depending on your shell:</p> BashZshFish $HOME/.bashrc<pre><code>eval \"$(_SILKAJ_COMPLETE=bash_source silkaj)\"\n</code></pre> $HOME/.zshrc<pre><code>eval \"$(_SILKAJ_COMPLETE=zsh_source silkaj)\"\n</code></pre> $HOME/.config/fish/completions/silkaj.fish<pre><code>_SILKAJ_COMPLETE=fish_source silkaj | source\n</code></pre> <p>For further details checkout Click documentation.</p>"},{"location":"install/#install-to-contribute","title":"Install to contribute","text":"<p>Check out the installation guide with Poetry.</p>"},{"location":"blog/","title":"Blog","text":""},{"location":"blog/silkaj-new-cli-duniter-client/","title":"Silkaj: new CLI Duniter client","text":"<p>I am pleased to announce a new Duniter client! It's a client from CLI (command line interface) written with Python 3.</p> <ul> <li>Diaspora* post</li> <li>Code repository with a tutorial to install it.</li> </ul> <p>This client was started almost two weeks ago and needed to be mature enough before public release.</p>"},{"location":"blog/silkaj-new-cli-duniter-client/#features","title":"Features","text":"<p>You could see the result of one of its best sub command <code>network</code>:</p> <pre><code>./src/silkaj.py network\n\n### 20 peers ups, with 15 members and 5 non-members\n\n|        domain       |      ip4       | port | block |    hash     | gen_time |    uid    |member| pubkey |diffi| version  |\n|---------------------+----------------+------+-------+-------------+----------+-----------+------+--------+-----+----------|\n| cgeek.fr            | 88.174.120.187 |  9330| 41166 | 000027421F\u2026 | 15:59:00 | cgeek     | yes  | HnFcS\u2026 |  77 | 0.31.0b6 |\n| mirror1.cgeek.fr    | 88.174.120.187 |  9331| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | 4jT89\u2026 |     | 0.31.0b6 |\n| mirror2.cgeek.fr    | 88.174.120.187 |  9332| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | AZ2JP\u2026 |     | 0.31.0b6 |\n| \u2026t.duniter.inso.ovh |                |    80| 41166 | 000027421F\u2026 | 15:59:00 | inso      | yes  | 8Fi1V\u2026 | 231 | 0.30.17  |\n| peer.duniter.org    | 51.255.197.83  |  8999| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | BSmby\u2026 |     | 0.30.17  |\n| desktop.moul.re     | 78.227.107.45  | 24723| 41166 | 000027421F\u2026 | 15:59:00 | moul      | yes  | J78bP\u2026 |  77 | 0.31.0b7 |\n| misc.moul.re        | 78.227.107.45  |  8999| 41166 | 000027421F\u2026 | 15:59:00 | moul      | yes  | J78bP\u2026 |  77 | 0.31.0b7 |\n| test-net.duniter.fr | 88.189.14.141  |  9201| 41166 | 000027421F\u2026 | 15:59:00 | kimamila  | yes  | 5ocqz\u2026 | 385 | 0.31.0b3 |\n| raspi3.cgeek.fr     | 88.174.120.187 |  8999| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | G3wQw\u2026 |     | 0.31.0a9 |\n| duniter.vincentux.fr|                |  8999| 41166 | 000027421F\u2026 | 15:59:00 | vincentux | yes  | 9bZEA\u2026 |     | 0.30.17  |\n| remuniter.cgeek.fr  | 88.174.120.187 | 16120| 41166 | 000027421F\u2026 | 15:59:00 | remuniter\u2026| yes  | TENGx\u2026 |     | 0.30.17  |\n|                     | 88.163.42.58   | 34052| 41166 | 000027421F\u2026 | 15:59:00 | cler53    | yes  | 4eDis\u2026 |  77 | 0.30.17  |\n| suchard.si7v.fr     | 163.172.252.3  |  8999| 41166 | 000027421F\u2026 | 15:59:00 | hacky     | yes  | DesHj\u2026 |  77 | 0.31.0a8 |\n|                     | 87.91.122.123  |  9330| 41166 | 000027421F\u2026 | 15:59:00 | mmpio     | yes  | BmDso\u2026 | 154 | 0.31.0b3 |\n| \u2026er.help-web-low.fr | 151.80.40.148  |  8999| 41166 | 000027421F\u2026 | 15:59:00 | pafzedog  | yes  | XeBpJ\u2026 | 154 | 0.30.17  |\n|                     | 87.90.32.15    |  8999| 41166 | 000027421F\u2026 | 15:59:00 | nay4      | yes  | BnSRj\u2026 |  77 | 0.31.0a9 |\n| duniter.modulix.net | 212.47.227.101 |  9330| 41166 | 000027421F\u2026 | 15:59:00 | modulix   | yes  | DeCip\u2026 |     | 0.30.17  |\n|                     | 88.174.120.187 | 33036| 41166 | 000027421F\u2026 | 15:59:00 |           | no   | GNRug\u2026 |     | 0.31.0b7 |\n| duniter.cco.ovh     | 163.172.176.32 |  8999| 41166 | 000027421F\u2026 | 15:59:00 | charles   | yes  | DA4PY\u2026 |  77 | 0.31.0a8 |\n| duniter.ktorn.com   | 107.170.192.122|  8999| 41166 | 000027421F\u2026 | 15:59:00 | ktorn     | yes  | BR5DD\u2026 |  77 | 0.30.17  |\n</code></pre>"},{"location":"blog/v0100/","title":"v0.10.0","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.10.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/v0100/#introduction","title":"Introduction","text":"<p>This release comes with the handling of the complete life cycle of the revocation file, the ability to read transaction amounts and recipients listing from a file, convenient for recurrent transaction. Last but not least, the code handling \u011e1 monetary license has been refactored. The upstream changes have been retrieved and now features the license into six languages.</p> <p>Under the hood, Silkaj codebase has been updated to use DuniterPy v1.0, which comes with breaking backward compatible changes on the <code>Documents</code> classes and the drop of the asynchronous property.</p> <p>As always, this release also comes with an emphasis on the development environment, with <code>pre-commit</code> usage generalization with the introduction of new hooks.</p>"},{"location":"blog/v0100/#revocation","title":"Revocation","text":"<p>The complete lifecycle of the revocation document and its storage in a file is now supported!</p> <p>The <code>revocation</code> command comes with four sub-commands:</p> <pre><code>silkaj revocation --help\nUsage: silkaj revocation [OPTIONS] COMMAND [ARGS]...\n\n  Create, save, verify or publish revocation document. Subcommands optionally\n  take the path to the revocation document.\n\nOptions:\n  -h, --help  Show this message and exit.\n\nCommands:\n  publish  Publish revocation document.\n  revoke   Create and publish revocation document.\n  save     Create and save a revocation document.\n  verify   Verifies that a revocation document is correctly formatted and...\n</code></pre> <p>With these command, you can generate a revocation file, verify its integrity and publish to actually revoke an identity.</p> <p>For the first time we implemented sub-subcommands thanks to Click. In the future, we will implement more commands using this feature, since we now know how to implement it.</p>"},{"location":"blog/v0100/#read-transaction-recipients-and-amounts-from-a-file","title":"Read transaction recipients and amounts from a file","text":"<p>You can now define a file following this format. For instance, a file named <code>recipients.txt</code>:</p> recipients.txt<pre><code>&lt;ABSOLUTE|RELATIVE&gt;\n\n# comment 1\n&lt;amount1&gt; &lt;pubkey1&gt;\n\n# comment 2\n&lt;amount2&gt; &lt;pubkey2&gt;:[&lt;checksum2&gt;]\n</code></pre> <p>It lists the amounts and the recipients\u2019 pubkeys for which the multi-recipients transaction will be issued. The checksum can be append to the pubkey to have its integrity checked.</p> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>It will generate a multi-recipients transaction with the amounts in absolute or relative reference depending of the setted header (<code>ABSOLUTE</code> or <code>RELATIVE</code>).</p>"},{"location":"blog/v0100/#g1-monetary-license","title":"\u1e201 Monetary license","text":"<p>The upstream repository containing the licenses has been updated. This update brings fixes and improvements on the existing languages and brings additional new languages: Esperanto, Espagnol, Italian, and Portuguese</p> <p>The display is now only displaying the embedded license files in the console, since it\u2019s available in six up-to-date languages.</p> <pre><code>silkaj license\nIn which language would you like to display \u011e1 monetary license? (es, en, eo, it, fr, pt) [en]: fr\n</code></pre> <p>The display in the browser has been removed since there were just two websites links to outdated licences in French and English.</p>"},{"location":"blog/v0100/#deathreaper","title":"DeathReaper","text":"<p>If you missed DeathReaper crowdfunding completion, you can check this message or the complete post if you have not been aware of.</p>"},{"location":"blog/v0100/#silkaj-docker-image","title":"Silkaj Docker image","text":"<p>The automated generation of Silkaj Docker images has been implemented in the first place to distribute DeathReaper. This is a new way to install Silkaj and its environment. This is convenient to distribute non-stable releases. You can find the documentation on how to use these images.</p>"},{"location":"blog/v0100/#network","title":"Network","text":"<ul> <li>The asynchronous property has been dropped. The HTTP library usage has been migrated from <code>asyncio</code> to <code>urllib</code></li> <li>The global option to specify a custom endpoint has been renamed from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> <li>Silkaj network layer has been refactored, bringing a more robust code</li> </ul>"},{"location":"blog/v0100/#duniterpy-v10","title":"DuniterPy v1.0","text":"<p>Support have been added to support DuniterPy v1.0 which came with many breaking backward compatible changes in the <code>Documents</code> classes.</p>"},{"location":"blog/v0100/#meta","title":"Meta","text":"<p>This release introduces support for Python v3.10 and drops support for Python v3.6.</p>"},{"location":"blog/v0100/#development-environment","title":"Development Environment","text":"<p><code>pre-commit</code> usage has been generalized with <code>black</code>, <code>isort</code>, <code>pyupgrade</code>, <code>insert-license</code>, and <code>gitlab-ci-linter</code> hooks. These hooks are run as jobs into the CI.</p>"},{"location":"blog/v0100/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v0100/#outlook","title":"Outlook","text":"<p>New <code>pre-commit</code> hooks (<code>pylint</code>, <code>flake8</code>, <code>mypy</code>) will be introduced to have more guardrails in order to ensure that future implementations will allow to reach higher code quality. Then, it\u2019s planned to migrate from <code>tabulate</code> to <code>Texttable</code>, and then restructure the repository. Once these prerequisites have been completed, the emphasis will be put onto migrating to Duniter v2 using Substrate. This means using new APIs: RPC, Subsquid, Using new documents called extrinsincs, and probably other changes.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/","title":"Call for testing Silkaj v0.10.0rc","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.10.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>To install and run Silkaj from a container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0 silkaj info\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#tests","title":"Tests","text":"<p>Please test it globally, and check v0.10.0 milestone short summary which contains the changes which have been implemented during this development cycle. Pay a special attention to the newly introduced revocation command.</p> <p>Manual tests help us making sure everything works fine in different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any revocation or loss of money to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#revocation","title":"Revocation","text":"<p><code>revocation</code> command handle the revocation document in an extended way. Check the sub-commands:</p> <pre><code>silkaj revocation --help\n</code></pre> <p>Make sure you are able to create new identities before proceeding. Create a revocation file with an existing identity. Verify the generated file, and publish it!</p> <pre><code>silkaj --gtest revocation save revocation_test.txt\nsilkaj --gtest revocation verify revocation_test.txt\nsilkaj --gtest revocation publish revocation_test.txt\n</code></pre> <p>Or directly all the previous steps with one command:</p> <pre><code>silkaj --gtest revocation revoke\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#license","title":"License","text":"<p>Check \u011e1 monetary license get displayed correctly in any language and in any configuration: workstation or headless computers.</p> <pre><code>silkaj license\nsilkaj --g1-license-web license\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#network-documents-issuance","title":"Network, documents issuance","text":"<p>Silkaj\u2019s network code layer have been completely rewritten, an other HTTP library is used, the asynchronous propery has been dropped, and the documents classes have been refactored. Try any commands requesting information from the network or try sending any document.</p> <pre><code>silkaj info\nsilkaj -ep &lt;hostname&gt;:&lt;port&gt; membership\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#transaction-recipients-and-amounts-definition-reading-from-a-file","title":"Transaction recipients and amounts definition reading from a file","text":"<p>You can now define <code>recipients.txt</code> file following this format:</p> recipients.txt<pre><code>ABSOLUTE\n\n# moul-test\n10 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\n\n# matograine\n20 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm\n</code></pre> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>Check that everything works fine with <code>RELATIVE</code> reference. You can also check broken file, and see if Silkaj reacts properly to any error in the file format definition.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned for April 16th 2022, which will be released with an announcement listing the new features as well as a detailed changelog.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v0110-release/","title":"Silkaj v0.11.0 release","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.11.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v0110-release/#introduction","title":"Introduction","text":"<p>This release comes with the <code>pipx</code> installation method, a new design of command line interface with commands separated in groups. Last but not least, it contains the migration to <code>Texttable</code> table library, network improvements and fixes, and Python v3.11 support.</p> <p>On the development environment side, the repository has been restructured, the code has been annotated with types, and linted. <code>mypy</code> and <code>pylint</code> pre-commit hooks have been introduced. The tests have been separated into unit and integration tests. <code>main</code> branch is new name of the main branch.</p> <p>This release emphasis was put onto strengthen the development environment as well as improving the structure of Silkaj code base. The goal was to do preparations and cleaning before Substrate migration in order to be fully focus onto it in next development cycle.</p> <p>This release is the latest planned major release with Duniter v1/BMA support and the one planned to end into Debian 12 Bookworm.</p>"},{"location":"blog/silkaj-v0110-release/#pipx-installation-method","title":"<code>pipx</code> installation method","text":"<p><code>pipx</code> have been found to be a recommendable tool over <code>pip</code> to install an end-user Python software when the latter is not available in distributions repositories. In addition to <code>pip</code> features, <code>pipx</code> creates virtual environments, which prevents conflicting dependencies among several installed Python software. A nice feature of <code>pipx</code> is the <code>ensurepath</code> commands which takes care to add the Python executables path into the <code>PATH</code> environment variable, which can be found to be the trickiest part of the installation. Silkaj documentation has been updated to suggest <code>pipx</code> instead of <code>pip</code>.</p> <p>In short, you can install Silkaj via <code>pipx</code> this way:</p> <pre><code>sudo apt install pipx libsodium23\npipx install silkaj\n</code></pre> <p>For a comprehensive documentation, check the installation documentation.</p>"},{"location":"blog/silkaj-v0110-release/#new-cli-design","title":"New CLI\u00a0design","text":"<p>The commands have been grouped into following groups: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. The other commands not related to these topics have been kept at the root of the CLI\u00a0tree.</p> <pre><code>silkaj --help\n  about           Display program information\n  authentication  Generate authentication file\n  blockchain      Blockchain related commands\n  checksum        Generate checksum out of a passed pubkey or an...\n  license         Display \u011e1 monetary license\n  money           Money management related commands\n  wot             Web-of-Trust related commands\n</code></pre> <pre><code>silkaj blockchain --help\n  blocks      Display blocks: default: 0 for current window size\n  difficulty  Display the current Proof of Work difficulty level to...\n  info        Display information about currency\n  verify      Verify blocks\u2019 signatures.\n</code></pre> <pre><code>silkaj money --help\n  balance   Get wallet balance\n  history   Display transaction history\n  transfer  Transfer money\n</code></pre> <pre><code>silkaj wot --help\n  certify     Send certification\n  lookup      User identifier and public key lookup\n  membership  Send and sign membership document: for first emission and...\n  revocation  Create, save, verify or publish revocation document.\n  status      Check received and sent certifications and consult the...\n</code></pre> <p>In this process following commands have been renamed:</p> <pre><code>diffi \u2212&gt; difficulty\ntx \u2212&gt; transfer\ncert \u2212&gt; certify\nrevocation save \u2212&gt; revocation create\nwot \u2212&gt; wot status\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#texttable","title":"Texttable","text":"<p>The code has been migrated from <code>tabulate</code> to <code>Texttable</code> external table libraries. <code>Texttable</code> was introduced and was only used from the <code>history</code> command, where the other commands were using <code>tabulate</code>. Both were used, and we had to make the choice to stick with one and get the opportunity to reduce the dependency list of one item. The migration has been done. You will probably notice differences in the table style and the alignments in the columns.</p> <p>Before, with <code>tabulate</code>:</p> <pre><code>|     uid     |   blocks |   percent |\n|-------------+----------+-----------|\n|    vit2     |       33 |      33.0 |\n|    Pini     |       25 |      25.0 |\n|  moul-test  |       24 |      24.0 |\n| jytou4-test |       10 |      10.0 |\n| jytou5-test |        8 |       8.0 |\n</code></pre> <p>Now, with <code>texttable</code>:</p> <pre><code>\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502     uid     \u2502 blocks \u2502 percent \u2502\n\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\n\u2502 vit2        \u2502     33 \u2502      33 \u2502\n\u2502 Pini        \u2502     26 \u2502      26 \u2502\n\u2502 moul-test   \u2502     23 \u2502      23 \u2502\n\u2502 jytou4-test \u2502     10 \u2502      10 \u2502\n\u2502 jytou5-test \u2502      8 \u2502       8 \u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#network","title":"Network","text":"<p>Breaking network connection is something recurrent on local network with BMA. A hack have been introduced to circumvent this issue with <code>sleep</code> calls between repetitive requests which retrieve user ids from public keys.</p> <p>The singletons have been replaced with <code>@functools.lru_cache()</code> decorator usage. They are both used to reduce the network traffic and therefore speed-up the commands execution. They are basically allowing to reuse the result obtained from the first request in case the same request happen again. In Silkaj, they are used to retrieve the UD value, the currency parameters, and the head block only once. Singletons pattern has been a pain to handle specially within the tests. <code>@functools.lru_cache()</code> fixes that which comes in handy as a boilerplate.</p>"},{"location":"blog/silkaj-v0110-release/#argos","title":"Argos","text":"<p><code>argos</code> command have been removed. This command was displaying basic information similar to the <code>info</code> command but formatted for Argos. Argos is a GNOME Shell extension which displays what has been generated out of a shell command into a GNOME Shell pop-over. This command has been found not to be really used and poorly maintained. It has been decided to be remove in the meantime.</p>"},{"location":"blog/silkaj-v0110-release/#python-311","title":"Python 3.11","text":"<p>This release introduces support for Python v3.11 released on the 24th of October 2022.</p>"},{"location":"blog/silkaj-v0110-release/#repository-restructuration","title":"Repository restructuration","text":"<p>As well as the new CLI\u00a0commands grouping, the runtime and the tests code have been classified into following directories: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. In addition to that, there is now a Python file per command and files for \"helpers\" and tools placed aside.</p>"},{"location":"blog/silkaj-v0110-release/#development-environment","title":"Development Environment","text":"<p>New <code>pre-commit</code> hooks have been introduced: <code>mypy</code>, <code>pylint</code>, <code>autoflake</code>, <code>pre-commit-hooks</code>, and <code>mdformat</code>. Type annotations has been introduced in the whole runtime code. This greatly improves the code quality, specially now that the code is fully typed, and linted. It will be of great help in future developments.</p> <p>The tests have been separated into <code>unit</code> and <code>integration</code> tests directories. This separation makes things clearer. The unit tests are pretty quick to be performed, where the integration tests takes more time since they require network requests. On the CI side, now just one job runs the integration tests in the job generating the coverage. Integration tests were known to fail because of the unstable nature of the network. Now, in case the integration tests fails, it is only necessary to restart one job.</p> <p>The branch workflow changed to a unique <code>main</code> branch which takes over the <code>dev</code> and <code>master</code> branches.</p> <p>The coverage integration into GitLab has been fixed.</p>"},{"location":"blog/silkaj-v0110-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/silkaj-v0110-release/#outlook","title":"Outlook","text":"<p>v0.20.0 is planned to be the next release. It will be fully dedicated to add support for Duniter v2 based on Substrate framework. Duniter v1/BMA support will be dropped from Silkaj v0.2x branch, while v0.1x will still be maintained until we productively switch to Duniter v2. But, no new features will be implemented on v0.1x branch. This development cycle might take some time, so it is expected to get preview releases.</p> <p>v0.20.0 development cycle is planned as follow. The network layer needs to be adapted to use following APIs: Substrate RPC, and Hasura indexer\u2019s using GraphQL. Then, It is planned to migrate current features and commands. Finally, new v2 related features will be implemented.</p> <p>In this development cycle, parallel developments might occur, such as setting up the new website or the configuration support implementation in Silkaj.</p> <p>We are looking forward for a better future with the migration of Duniter on Substrate framework.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/","title":"Call for testing Silkaj v0.11.0rc0","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.11.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> <p>It is planned to be the latest release with Duniter v1/BMA support and the release to enter Debian 12 Bookworm.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <p>Install <code>pipx</code> from the installation documentation:</p> <pre><code>sudo apt install pipx\npipx install --pip-args \"\\--pre\" silkaj\n</code></pre> <p>To install and run Silkaj from the container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0 silkaj\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#tests","title":"Tests","text":"<p>Please check v0.11.0 milestone short summary as well as the changelog containing the changes which did happen during this development cycle.</p> <p>Structural changes were made, so please check Silkaj is still working in its entirety. Manual tests help us making sure everything works fine in different cases. Make sure you test it on \u011e1-Test network to avoid a revocation or any money loss to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pipx-installation","title":"Pipx installation","text":"<p>Test that the newly introduced <code>pipx</code> method installation documentation works fine in your case, with your particular Unix system. Tell us how can the documentation be improved, if a non-obvious step for you is missing or if a necessary package isn't listed for Silkaj to work on your system.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#new-cli-design","title":"New CLI\u202fdesign","text":"<p>Silkaj commands have been reorganized into following groups: <code>blockchain</code>, <code>money</code>, <code>wot</code>. Some commands not related to these contexts have been kept in the top-level group. Tell us if the new CLI design with sub-sub-commands compared to the previous one with all the commands at the top-level instead fits best, is less convenient, is following a more structured logic.</p> <pre><code>Commands:\n  about           Display program information\n  authentication  Generate authentication file\n  blockchain      Blockchain related commands\n  checksum        Generate checksum out of a passed pubkey or an...\n  license         Display \u011e1 monetary license\n  money           Money management related commands\n  wot             Web-of-Trust related commands\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#table-generation","title":"Table generation","text":"<p>The underlying table generation library has been changed. Tell us if the tables are displaying content correctly, or if any improvement can be done, or if a regression got introduced.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned on November 26th 2022, which will be released with a detailed announcement explaining the changes.</p> <p>Silkaj team</p>"},{"location":"blog/v0111/","title":"V0.11.1","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206</li> </ul>"},{"location":"blog/v0112/","title":"V0.11.2","text":"<ul> <li>Add support for Python v3.12 and drop support for Python v3.7</li> </ul>"},{"location":"blog/silkaj-v020-release/","title":"Silkaj v0.2.0 release","text":"<p>This release introduce the <code>transaction</code> feature, the <code>amount</code> command to check out the balance of a wallet, and the initial authentication support.</p>"},{"location":"blog/silkaj-v020-release/#new-money-management-commands","title":"New money management commands","text":"<ul> <li><code>transaction</code> command with its main options: <code>--amountDU</code>, <code>--amount</code>, <code>--output</code>, <code>--comment</code></li> <li><code>amount</code> command to display account balance</li> </ul>"},{"location":"blog/silkaj-v020-release/#authentication","title":"Authentication","text":"<ul> <li><code>generate_auth_file</code> command to generate seed authentication file</li> <li>authentication methods implementation: scrypt, seed, seed authentication file with <code>--auth-scrypt</code>, <code>--auth-seed</code>, <code>--auth-file</code> options</li> </ul>"},{"location":"blog/silkaj-v020-release/#under-the-hood","title":"Under the hood","text":"<ul> <li>function to post request onto BMA API</li> <li>function to sign document</li> <li>function to check public key format and checksum</li> </ul>"},{"location":"blog/silkaj-v020-release/#others","title":"Others","text":"<ul> <li>In tables, the columns were randomly ordered. The columns in the table are now ordered thanks to <code>OrderedDict</code>.</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"blog/silkaj-v020-release/#thanks","title":"Thanks","text":"<p>A huge thanks to Tortue who brought a huge contribution to this release. Thanks mmuman.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/","title":"Silkaj v0.3.0 release: Let's send money!","text":"<p>This release comes with user experience enhancements on the <code>transaction</code> command and the authentication in general. A new <code>id</code> command allows to look-up for identities. Efforts were put into improving the installation process.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/#transactions","title":"Transactions","text":"<p><code>transaction</code> command enhancements:</p> <ul> <li>ask for confirmation: #27, !30.</li> <li>confirmation table containing transaction informations: !38</li> <li>don't prompt <code>scrypt</code> parameters. See <code>Authentication</code> \u00a7 below.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>new command <code>id</code> to search identities with pubkey or id: !29.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>pyenv installation tutorial: #23, !40.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#authentication","title":"Authentication","text":"<ul> <li>new authentication method: WIF. For future paper wallet feature: !45</li> <li>Don't prompt scrypt parameters at authentication. Use default ones: #39, !43</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#builds","title":"Builds","text":"<ul> <li>with Pyinstaller: #5.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#other","title":"Other","text":"<ul> <li>Ability to sort the table of <code>network</code> command: !33, !37.</li> <li>Change license from GNU GPLv3 to AGPLv3.</li> <li>Code formatting with <code>pep8</code>: !31.</li> </ul> <p>Thanks Tortue and jytou.</p>"},{"location":"blog/silkaj-v040-release/","title":"Silkaj v0.4.0 release","text":"<p>A new <code>wot</code> command allows to display received and sent certifictaions of an identity. Additionnal user experience enhancements have been added to the transaction feature. It is now possible to check the balance of multiple public keys and get a sum of the balances.</p>"},{"location":"blog/silkaj-v040-release/#new-wot-command-to-display-received-and-sent-certifications","title":"New <code>wot</code> command to display received and sent certifications","text":"<p>You can now explore the Web-of-Trust by displaying in a table the received and sent certifications of an identity.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block 0-E3B0C44298FC1\u2026\nreceived 23 and sent 27 certifications:\n|    received    |       sent       |\n|----------------+------------------|\n|     Alfybe     |     gerard94     |\n|   cuckooland   |   jeanferreira   |\n|      Loda      |      elois       |\n|  jeanferreira  |      Galuel      |\n| BenoitLavenier |      smyds       |\n|     smyds      | CaizohanFerreira |\n|   gpsqueeek    |    gpsqueeek     |\n|    fbuland     |       inso       |\n|    gerard94    |       vit        |\n|     SebasC     |      Thatoo      |\n|     Thatoo     |     William      |\n|      inso      |    cuckooland    |\n|    Paulart     |     greyzlii     |\n|   vincentux    |   mathieuBize    |\n|    greyzlii    |      cgeek       |\n|   Mententon    |    PierreYves    |\n|   PierreYves   |     mmu_man      |\n|     paidge     |   OlivierAuber   |\n|     cgeek      |      paidge      |\n|    Nicolas     |      Alfybe      |\n|   jeangraine   |     1000i100     |\n|    pafzedog    |       dig        |\n|     Zheny      |  BenoitLavenier  |\n|                |    MystraSam     |\n|                |    jeangraine    |\n|                |      Zheny       |\n|                |     roodinux     |\n</code></pre>"},{"location":"blog/silkaj-v040-release/#transaction-command-provides-a-better-ux","title":"Transaction command provides a better UX","text":"<p>The <code>transaction</code> command will beforehand check that the comment and recipient\u2019s public key are in right format before it actually prompt for the authentication.</p>"},{"location":"blog/silkaj-v040-release/#balance-of-multiple-public-keys","title":"Balance of multiple public keys","text":"<p>With the <code>amount</code> command, you can now pass multiple public keys <code>:</code> separated. The balance will be displayed for each of them, and a sum will be displayed at the end.</p> <pre><code>silkaj amount --pubkeys GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\nRequested default node: &lt;g1.duniter.org:443&gt;\nTotal amount of: GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\n----------------------------------------------------------------\nTotal Relative     = 206.23 UD g1\nTotal Quantitative = 2064.41 g1\n\nTotal amount of: fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\n----------------------------------------------------------------\nTotal Relative     = 89.72 UD g1\nTotal Quantitative = 898.08 g1\n\nTotal amount of: Total\n----------------------------------------------------------------\nTotal Relative     = 295.95 UD g1\nTotal Quantitative = 2962.49 g1\n</code></pre>"},{"location":"blog/silkaj-v040-release/#installation","title":"Installation","text":"<ul> <li>Installation documentation</li> </ul>"},{"location":"blog/silkaj-v040-release/#certification-feature","title":"Certification feature","text":"<ul> <li>Crowdfunding</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/","title":"Silkaj v0.5.0 release: Let\u2019s certify!","text":"<p>For the eleventh Libre Currency Meeting (RML), I am pleased to announce Silkaj v0.5.0 release.</p> <p></p> <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#certification-feature","title":"Certification feature","text":"<p>Now, you can certify other identities (send certification document to the network):</p> <pre><code>silkaj cert jytou --auth-scrypt -p g1-test.duniter.org:443\nIn which language would you like to display \u011e1 license [en/fr]? fr\nDo you approve \u011e1 license [yes/no]? yes\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nUsing default values. Scrypt parameters not specified or wrong format\nScrypt parameters used: N: 4096, r: 16, p: 1\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert   \u2502 From                                         \u2502 \u2013&gt; \u2502 To                                           \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID     \u2502 moul-test                                    \u2502 \u2013&gt; \u2502 jytou                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502 \u2013&gt; \u2502 2pyPsXM8UCB88jP2NRM4rUHxb63qm89JMEWbpoRrhyDK \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this certification? [yes/no]: yes\nCertification successfully sent.\n</code></pre> <p>Certification command will display \u011e1\u2019s license in your web browser or in your terminal within a <code>less</code> in case you are running a headless computer.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#wot-command-now-displays-expiration-dates-of-certifications","title":"<code>wot</code> command now displays expiration dates of certifications","text":"<p>The table listing the received and sent certifications of an identity, now displays the expirations dates of the certifications.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block [#0](https://git.duniter.org/clients/python/silkaj/issues/0)-E3B0C44298FC1\u2026\nreceived 24 and sent 27 certifications:\n|  received_expire  |    received    |       sent       |  sent_expire  |\n|-------------------+----------------+------------------+---------------|\n|    2019-03-09     |   cuckooland   |      cgeek       |  2019-03-09   |\n|    2019-03-09     |    Paulart     |      elois       |  2019-03-09   |\n|    2019-03-09     |   vincentux    |   mathieuBize    |  2019-03-09   |\n|    2019-03-09     | BenoitLavenier |     gerard94     |  2019-03-09   |\n|    2019-03-09     |      Loda      |      smyds       |  2019-03-09   |\n|    2019-03-09     |     smyds      | CaizohanFerreira |  2019-03-09   |\n|    2019-03-09     |   gpsqueeek    |    gpsqueeek     |  2019-03-09   |\n|    2019-03-09     |    fbuland     |       inso       |  2019-03-09   |\n|    2019-03-09     |  jeanferreira  |       vit        |  2019-03-09   |\n|    2019-03-09     |    gerard94    |      Thatoo      |  2019-03-09   |\n|    2019-03-09     |     SebasC     |    cuckooland    |  2019-03-09   |\n|    2019-03-09     |     Thatoo     |     William      |  2019-03-09   |\n|    2019-03-09     |      inso      |     greyzlii     |  2019-03-09   |\n|    2019-03-09     |     Alfybe     |      Galuel      |  2019-03-09   |\n|    2019-03-12     |    greyzlii    |   jeanferreira   |  2019-03-09   |\n|    2019-03-18     |   Mententon    |    PierreYves    |  2019-03-09   |\n|    2019-04-02     |   PierreYves   |     mmu_man      |  2019-03-09   |\n|    2019-04-03     |     paidge     |   OlivierAuber   |  2019-03-13   |\n|    2019-05-24     |     cgeek      |      paidge      |  2019-03-13   |\n|    2019-06-10     |    Nicolas     |      Alfybe      |  2019-03-19   |\n|    2019-07-04     |   jeangraine   |     1000i100     |  2019-03-26   |\n|    2019-07-23     |    pafzedog    |       dig        |  2019-03-31   |\n|    2019-08-07     |     Zheny      |  BenoitLavenier  |  2019-04-22   |\n|    2020-03-17     | HugoTrentesaux |    MystraSam     |  2019-06-16   |\n|                   |                |    jeangraine    |  2019-06-22   |\n|                   |                |      Zheny       |  2019-06-25   |\n|                   |                |     roodinux     |  2019-07-01   |\n</code></pre>"},{"location":"blog/silkaj-v050-release-lets-certify/#logo","title":"Logo","text":"<p>Silkaj now has a logo thanks to Attilax. You can find it in this repository. I choose the black and white one. Here is a crowdfunding to free the logo.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#repository-migration-to-gitlab","title":"Repository migration to GitLab","text":"<p>I migrated the repository to our GitLab instance and archived the GitHub repository:</p> <ul> <li>https://git.duniter.org/clients/python/silkaj</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#website","title":"Website","text":"<p>Silkaj's website has been published among other websites on our GitLab instance. New revisions will be automatically published thanks to GitLab Pages. Here you can find the repository: https://git.duniter.org/websites/silkaj_website/</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#future","title":"Future","text":"<p>You can have a look at the next v0.6.0 milestone to have an idea of what could be included into next Silkaj development cycle.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#helps","title":"Helps","text":"<p>This whole work has been done voluntarily aside a dept-salary\u2019s paid job. If you like what have been achieve, please contribute, by giving libre units to its only and main developer or to Duniter\u2019s developers to improve our little world.</p>"},{"location":"blog/silkaj-v060-release-lets-install/","title":"Silkaj v0.6.0 release: Let\u2019s install","text":"<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the twelfth Libre Currency Meeting.</p> <p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#user-installation-eased-via-pypipip","title":"User installation eased via PyPI/pip","text":"<p>Installing Silkaj has been a burning issue: Only Fedora users could install Silkaj with the Pyinstaller binary, since that\u2019s where I was building it. The others, would have had to install a development environment with <code>pyenv</code> and the Python dependencies in order to make it work.</p> <p>Thanks to Cebash\u2019s work. Now, we are able to install Silkaj with <code>pip</code>, the Python package manager, which retrieves the package from Python Package Indexer (PyPI):</p> <pre><code>pip3 install silkaj --user\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#development-environment-with-pipenv","title":"Development environment with Pipenv","text":"<p>We switched from <code>pyenv+pip</code> to Pipenv because Pipenv offers a better development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#transaction","title":"Transaction","text":""},{"location":"blog/silkaj-v060-release-lets-install/#multi-recipients-transaction","title":"Multi-recipients transaction","text":"<p>Thanks to cgeek, Silkaj is the first client, besides Remuniter, able to send multi-recipients transaction. This means, that we will be able to transfer money to several recipients within a single transaction. To do so, we have to pass recipients\u2019 public keys separated with a colon <code>:</code> operator, as follow:</p> <pre><code>silkaj tx --auth-file --amount 2 --gtest --output \\\nDpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC:7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 pubkey\u2019s amount before tx \u2502 15375.33 \u011eTest                               \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (unit)          \u2502 4.0 \u011eTest                                    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (relative)      \u2502 0.0104 UD \u011eTest                              \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 pubkey\u2019s amount after tx  \u2502 15371.33 \u011eTest                               \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (pubkey)             \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (id)                 \u2502 moul-test                                    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey)               \u2502 DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id)                   \u2502 vit                                          \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey)               \u2502 7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id)                   \u2502 cuckooland                                   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 comment                   \u2502                                              \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]: yes\nGenerate Transaction:\n   - From:    5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n   - To:      DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC\n   - To:      7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n   - Amount:  4.0\nTransaction successfully sent.\n</code></pre> <p>Notes:</p> <ul> <li>Each pubkey will receive the same amount of money. The amount per recipients can not be specified yet.</li> <li>The purpose of this feature is to remunerate Duniter developers.</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#display-confirmation-panel","title":"Display confirmation panel","text":"<p>Before the transaction is actually sent, the balance before and after the transaction is displayed in the summary table. Check the example above.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#two-wrappers","title":"Two wrappers","text":"<ul> <li>Multi-recipients transfers and automation</li> <li>Transaction generator written in Shell</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#wot-view-improvements","title":"WoT view improvements","text":"<ul> <li>Display of the certifications stock</li> <li>Membership expiration due to the membership expiration or due the fact that the threshold of minimal number of certifications is about to be crossed by certifications expirations</li> <li>Identity status</li> </ul> <pre><code>moul-test (5B8iM\u2026) from block 167750-0000A51F\u2026\nreceived 8 and sent 15/100 certifications:\n|  received_expire  |      received       |       sent        |  sent_expire  |\n|-------------------+---------------------+-------------------+---------------|\n|    2018-11-21     |      esprit \u2714       |     MeluaTest     |  2018-11-19   |\n|    2018-12-15     |      GAS2000 \u2714      |      esprit       |  2018-11-21   |\n|    2018-12-19     | matograine-G1Test \u2714 |      GAS2000      |  2018-12-10   |\n|    2018-12-20     |   scanlegentil \u2714    |       guwop       |  2018-12-10   |\n|    2019-01-29     |        vit \u2714        | matograine-G1Test |  2019-02-04   |\n|    2019-02-07     |       Elois \u2714       |       Elois       |  2019-02-07   |\n|    2019-02-15     |    cuckooland \u2714     |    Vincentest     |  2019-02-07   |\n|    2019-02-16     |     piaaf31GT \u2714     |    cuckooland     |  2019-02-07   |\n|                   |                     |        vit        |  2019-02-07   |\n|                   |                     |   scanlegentil    |  2019-02-07   |\n|                   |                     |       cgeek       |  2019-02-07   |\n|                   |                     |     isawien45     |  2019-02-07   |\n|                   |                     |     aguy-dev      |  2019-02-07   |\n|                   |                     |     piaaf31GT     |  2019-02-14   |\n|                   |                     |     kimamila      |  2019-02-15   |\n\nMembership expiration due to certification expirations: 2018-12-20\nmember: True\nMembership document expiration: 2018-12-31\nSentry: True\noutdistanced: False\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#scrypt-authentication-by-default","title":"Scrypt authentication by default","text":"<p>Previously, the authentication method had to be specified. Now, when no authentication method is specified, two inputs will be prompted in order to authenticate with the scrypt method. You can still specify other authentication methods, with following options:</p> <pre><code>Authentication:\n for amount, transaction, certification, and generate_auth_file commands\n - Scrypt is the default authentication method with 4096,16,1 as default values\n    you can specify others values specifying following parameters: -n &lt;N&gt; -r &lt;r&gt; -p &lt;p&gt;\n - Seed: --auth-seed\n - File: --auth-file [--file=&lt;path file&gt;], './authfile' will be taken if there is no path specified\n - WIF: --auth-wif\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#gtest","title":"\u011etest","text":"<p>A new <code>--gtest</code> option has been added to ease the connection to \u011e1-test currency network for testing purposes. It uses the official node: https://g1-test.duniter.org.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#network-performances","title":"Network performances","text":"<p>With this update, Silkaj is retrieving information only once. Before, data was retrieved every time it was needed. Now, once the information has been fetched, it is kept into the memory and reused.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#python-37-support","title":"Python 3.7 support","text":"<p>Silkaj has been tested with Python 3.7. Results show that there has been no issues. Python 3.7 has been set as the current version in Pipenv development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#new-commands","title":"New commands","text":""},{"location":"blog/silkaj-v060-release-lets-install/#license","title":"License","text":"<p>Originally built for the certification feature, the <code>license</code> command allows the consultation of the \u011e1\u2019s license at any time given.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#about","title":"About","text":"<p>A new command displays information about Silkaj:</p> <pre><code>silkaj about\n             @@@@@@@@@@@@@\n         @@@     @         @@@\n      @@@   @@       @@@@@@   @@.            silkaj 0.6.0\n     @@  @@@       @@@@@@@@@@@  @@,\n   @@  @@@       &amp;@@@@@@@@@@@@@  @@@         Powerfull and lightweight command line client\n  @@  @@@       @@@@@@@@@#   @@@@ @@(\n  @@ @@@@      @@@@@@@@@      @@@  @@        Built in Python for Duniter\u2019s currencies: \u011e1 and \u011e1-Test\n @@  @@@      @@@@@@@@ @       @@@  @@\n @@  @@@      @@@@@@ @@@@       @@  @@       Authors: moul, tortue, jytou, cebash, cgeek\n @@  @@@@      @@@ @@@@@@@      @@  @@\n  @@ @@@@*       @@@@@@@@@      @# @@        Website: https://silkaj.duniter.org\n  @@  @@@@@    @@@@@@@@@@       @ ,@@\n   @@  @@@@@ @@@@@@@@@@        @ ,@@         Repository: https://git.duniter.org/clients/python/silkaj\n    @@@  @@@@@@@@@@@@        @  @@*\n      @@@  @@@@@@@@        @  @@@            License: GNU AGPLv3\n        @@@@   @@          @@@,\n            @@@@@@@@@@@@@@@\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#logo","title":"Logo","text":"<p>Silkaj\u2019s logo, designed by Attilax, is now fully funded!</p>"},{"location":"blog/silkaj-v060-release-lets-install/#thanks","title":"Thanks","text":"<p>Special thanks to Moul, Cebash, cgeek, and Attilax.</p> <p>Thanks to vit, Inso, vincentux, and jardin.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#future-development-cycles","title":"Future development cycles","text":"<ul> <li> <p>v0.7.0 will be focused on refactoring Silkaj in order to be ported to DuniterPy usage, a more robust API implementation. This mean sharing a common code with Sakia.</p> </li> <li> <p>v0.8.0 will add new features based on DuniterPy such as new authentication methods as well as being allowed to send the remaining Web-of-Trust documents: identity publication, membership publication and renewal, and revocation.</p> </li> <li> <p>v0.9.0 Let\u2019s see what come to this milestone.</p> </li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievements, please contribute by reporting bugs, contributing to the code or giving Duniter\u2019s developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v061-release/","title":"Silkaj v0.6.1 release","text":"<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p>"},{"location":"blog/silkaj-v061-release/#bug-fix-in-intermediaries-transactions","title":"Bug fix in intermediaries transactions","text":"<p>When sending a transaction with a big amount, there is a limit of forty sources per transaction allowed by \u011e1 protocol. In order to reach a big amount of money with only forty sources, the clients proceed beforehand to change operations to merge more money into fewer sources. Since the multi-recipients feature, a regression was introduced, the intermediaries transaction\u2019s recipient were wrong and sent to the recipient of the transaction. This release fixes it!</p>"},{"location":"blog/silkaj-v061-release/#certification-renewal","title":"Certification renewal","text":"<p>Duniter v1.7 now allows to renew certification before their expiration.</p> <p>This protocol modification is now live on the \u011e1-Test currency since December 2018 in order to check that everything is working fine. You can already renew certifications on the \u011e1-Test currency.</p> <p>This protocol modification will be published on the \u011e1 currency when ready.</p> <p>Before processing the certification, Silkaj will check if the certification can be renewed. In the case of \u011e1, you will be able to renew the certification two months after the previous one. And, on the \u011e1-test, after twelve and half a day.</p>"},{"location":"blog/silkaj-v061-release/#tests-on-windows","title":"Tests on Windows","text":"<p>Silkaj have been installed for the first time on the Windows platform via <code>pip</code>. It works! There is still fixes needed in order to have Silkaj to work properly.</p>"},{"location":"blog/silkaj-v061-release/#thanks","title":"Thanks","text":"<p>Thanks to Moul, Galuel, and Bernard.</p>"},{"location":"blog/silkaj-v061-release/#upgrade","title":"Upgrade","text":"<pre><code>pip3 install silkaj --user --upgrade\n</code></pre> <ul> <li>Install with <code>pip</code> documentation for more details.</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/","title":"Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website","text":"<p>Six months after the previous major release, I am pleased to announce the release of Silkaj v0.7.0 for the thirteenth Free Currency Meeting.</p> <p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> <p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#duniterpy-migration","title":"DuniterPy migration","text":"<p>DuniterPy is a Python library which implements methods to request from and send information to the Duniter nodes. It also has authentication methods to sign documents such as transactions and certifications. DuniterPy was initially written for the Sakia client. Silkaj and Sakia are now sharing the same common code. The migration to DuniterPy was tough, but it was worth it: It will allow the implementation of new features in future versions.</p> <p>There were many challenges: keeping the same functionalities, making Silkaj\u2019s code asynchronous, and replacing the authentication and the network code by the ones implemented in DuniterPy. One struggling issue was that the intermediaries transactions were no longer working, because, the equality method of the transaction output source was not implemented, as they used to be stored in a string and are now stored into an <code>OutputSource</code> object. So, the equality had to be implemented.</p> <p>Check-out DuniterPy versions from v0.50.0 to v0.54.1 to follow the evolution of DuniterPy. These versions were specially made for Silkaj. In the future, following functionalities are planned: sending identity, membership, and revocation documents, the usage of authentication methods implemented in DuniterPy, and the usage of the planned GVA API.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#click-migration","title":"Click migration","text":"<p>Since Debian Buster freeze was going to happen very soon and <code>commandlines</code> library wasn\u2019t packaged into Debian, the migration to Click \u201cCommand Line Interface Creation Kit\u201d had to be done quickly. I decided to migrate to this really nice library, since it is much more maintained, comes with a better code, and is less buggy. Here you can see the new command line interface:</p> <pre><code>Usage: silkaj [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n  -h, --help               Show this message and exit.\n  -v, --version            Show the version and exit.\n  -p, --peer TEXT          Default endpoint will reach \u011e1 currency with\n                           `https://g1.duniter.org` endpoint. Custom endpoint\n                           can be specified with `-p` option followed by\n                           &lt;domain&gt;:&lt;port&gt;\n  -gt, --gtest             \u011eTest: `https://g1-test.duniter.org` endpoint\n  --auth-scrypt, --scrypt  Scrypt authentication: default method\n  --nrp TEXT               Scrypt parameters: defaults N,r,p: \"4096,16,1\"\n  -af, --auth-file         Authentication file. Defaults to: './authfile'\n--file TEXT              Path file specification with '--auth-file'\n                           [default: authfile]\n  --auth-seed, --seed      Seed hexadecimal authentication\n  --auth-wif, --wif        WIF and EWIF authentication methods\n\nCommands:\n  about     Display program information\n  argos     Display currency information formatted for Argos or BitBar\n  authfile  Generate authentication file\n  balance   Get wallet balance\n  blocks    Display blocks: default: 0 for current window size\n  cert      Send certification\n  diffi     Display the current Proof of Work difficulty level to generate...\n  history   Display transaction history\n  id        Find corresponding identity or pubkey from pubkey or identity\n  info      Display information about currency\n  license   Display \u011e1 license\n  net       Display network view\n  tx        Send transaction\n  wot       Check received and sent certifications and consult the...\n</code></pre> <p>The command line interface has changed. General parameters (options and arguments) should be placed in between the command and the sub-command. Specific parameters should be placed after the sub-command.</p> <pre><code>silkaj --gtest --auth-file tx --amount 5 --output &lt;pubkey&gt;\n</code></pre> <p>For instance, in previous command <code>--gtest</code> and <code>--auth-file</code> are general parameters, where <code>--amount</code> and <code>--output</code> are specific parameters separated by <code>tx</code> sub-command.</p> <p>You can display general parameters with <code>silkaj --help</code> and specific parameters with <code>silkaj tx --help</code> for instance.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#cli-changes","title":"CLI changes","text":"<ul> <li><code>issuers</code>, <code>amount</code>, and <code>generate_auth_file</code> commands have been respectively renamed to <code>blocks</code>, <code>balance</code>, and <code>authfile</code>.</li> <li>The long sub-commands <code>certification</code>, <code>transaction</code>, <code>network</code>, <code>identities</code> have been removed. Now the small ones have to be used: <code>cert</code>, <code>tx</code>, <code>net</code>, <code>id</code>.</li> <li><code>blocks</code> defaults to <code>0</code> which stands for the current windows size and now has a limit of 5.000 blocks as set by BMA.</li> <li><code>balance</code>: public keys separator does no longer use colons <code>:</code>, it uses spaces instead.</li> <li>Additionally, there are the new smaller authentication options: <code>--scrypt</code>, <code>-af</code>, <code>--seed</code>, <code>--wif</code>, without the <code>--auth</code> prefix.</li> </ul> <p>You might discover other breaking changes. For more details regarding these changes check out this list.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#transaction-history","title":"Transaction history","text":"<p>It is now possible to display the transactions history of a wallet:</p> <pre><code>silkaj history GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP --uids\n\nTransactions history from: moul GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\nCurrent balance: 17296.86 \u011e1, 1717.66 UD \u011e1 on the 2019-05-12 13:32:30\n+---------------------+------------------------+------------+--------------+-----------------------+\n|        Date         |   Issuers/Recipients   | Amounts \u011e1 | Amounts UD\u011e1 |        Comment        |\n+=====================+========================+============+==============+=======================+\n| 2019-04-23 21:31:27 | CvrMiUhAJpNyX5sdAy     | 100.700    | 10           | Silkaj sur Ubuntu c   |\n|                     |                        |            |              | est une tres belle    |\n|                     |                        |            |              | surprise. Merci !     |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-22 18:59:34 | HugoTrentesaux -       | 100.700    | 10           | Merci pour Duniter    |\n|                     | 55oM6F9ZE2MGi          |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 14:35:15 | ArthurLutz -           | 200        | 19.861       | pour les paquets      |\n|                     | 4C4jsvxmFQBoH          |            |              | yunohost !            |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 10:40:11 | SonqoZEfZXHDBxi4Kx     | 30.210     | 3            | [G1SMS] VIREMENT 300  |\n|                     |                        |            |              | LOVE (30.21 G1)       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 08:04:58 | fbuland -              | 200        | 19.861       | merci resolution bug  |\n|                     | 4bD7J3uA5pH2N          |            |              |                       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-13 16:37:20 | Vivakvo -              | 100.700    | 10           | Merci pour Duniter    |\n|                     | 4wUdA1dx1NCZU          |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-12 08:59:04 | C4pUj26pVgPVPLEZ96     | 50         | 4.965        | Bravo pour le bug     |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 16:48:04 | 73ArdqtsQScypV35H4     | 100.700    | 10           | Merci pour Duniter    |\n|                     |                        |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:58:06 | Lucas - HY2nJUyxpzyrw  | 100.700    | 10           | Merci pour Duniter    |\n|                     |                        |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:10:25 | BenoitLavenier -       | 100.700    | 10           | Merci pour Duniter    |\n|                     | 38MEAZN68Pz1D          |            |              | v1.7.16 !             |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 14:11:00 | 4sfQWXBBy811CCDV6J     | 100.700    | 10           | 1.7.16                |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 22:59:00 | elois - D9D2zaJoWYWve  | 100        | 9.930        | merci pour le debug   |\n|                     |                        |            |              | de duniter et du      |\n|                     |                        |            |              | process de release    |\n|                     |                        |            |              | aussi                 |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 21:51:41 | Matograine -           | 100.700    | 10           | V1.7.16               |\n|                     | CmFKubyqbmJWb          |            |              |                       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 01:18:44 | cgeek - 2ny7YAdmzReQx  | 1007       | 100          | Duniter v1.7.16       |\n+---------------------+------------------------+------------+--------------+-----------------------+\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#debian-and-ubuntu-package","title":"Debian and Ubuntu package","text":"<p>Silkaj v0.6.5 was packaged for Debian Buster v10, which is planned te be released on July 6th 2019. This package greatly benefits all Debian-based distributions. Moreover, Silkaj was also added into Ubuntu 19.04 repository, which was published on March 2019. For more details check-out where Silkaj was included into the Debian-based distributions. Silkaj v0.6.5 now comes with Click migration, auto-completion, and bug fixes, however it does not include DuniterPy migration and v0.7.0 features.</p> <p>You can install Silkaj with following command:</p> <pre><code>sudo apt install silkaj\n</code></pre> <p>This work have been made possible thanks to jonas, a Debian developer.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#proof-of-work-difficulty-level","title":"Proof-of-Work difficulty level","text":"<p>Since we are using DuniterPy which includes WebSocket management, this latter can be used to improve the network connection. Previously, Silkaj was sending queries every five seconds to check if a new block was added to the blockchain. Now, Silkaj gets a notification every time a new block is appended to the blockchain. This improvement dramatically reduces traffic network.</p> <p>To better monitor the network, the header was improved and now displays current block\u2019s number and its date of generation:</p> <pre><code>Current block: n\u00b0219981, generated on the 2019-05-12 14:36:35\nGeneration of next block n\u00b0219982 possible by at least 31/44 members\nCommon Proof-of-Work difficulty level: 89, hash starting with `00000[0-6]*`\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#new-website","title":"New website","text":"<p>At the beginning of the project, a simple website was made. Since then, Silkaj evolved and have brought new features which should be reflected on the website.</p> <p>More content was added to the website, which now has three pages: a main one, one for the features and the other one for the installation.</p> <p>Attilax worked to give the website a new black style, to make it looks like a terminal. He also translated it in French which makes the website available in two languages.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#thanks","title":"Thanks","text":"<p>Attilax, Bernard, cebash, jonas, matograine, vit</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#install-and-upgrade","title":"Install and upgrade","text":"<ul> <li>Install and upgrade documentation</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#future-development-cycles","title":"Future development cycles","text":"<p>Future releases will add new features based on DuniterPy such as new authentication methods as well as being able to send WoT documents: identity publication, membership publication and renewal, and revocation. It is also planned to use features brought by Click usage, to set-up a CI/CD pipeline, and locking the code with tests.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievement, please contribute by reporting bugs, contributing to the code or giving to Duniter developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#share-on-social-networks","title":"Share on social networks","text":"<ul> <li>Mastodon</li> </ul>"},{"location":"blog/v071/","title":"V0.7.1","text":"<ul> <li>Bug fix transaction generation</li> </ul>"},{"location":"blog/v072/","title":"V0.7.2","text":"<ul> <li>Fix result of the multiplication of the amount passed as float for the transaction command</li> </ul>"},{"location":"blog/v073/","title":"V0.7.3","text":"<ul> <li>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:<ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate <code>for</code> loop</li> </ul> </li> </ul>"},{"location":"blog/v074/","title":"V0.7.4","text":"<ul> <li>#273: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"blog/v075/","title":"V0.7.5","text":"<ul> <li>#276: Publish on PyPI with the previous method: <code>setup.py</code>, <code>wheel</code>, and <code>twine</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"blog/v076/","title":"V0.7.6","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"blog/silkaj-v080-release/","title":"Silkaj v0.8.0 release","text":""},{"location":"blog/silkaj-v080-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.8.0. A new team member joined us at the beginning of this development cycle: Matograine. We highly appreciate his commitment, his improvements of the transaction code and his work on the checksum. This release comes along with a number of new features and improvements. The most important of them are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> <p>Version 0.8.0 was done in 145 commits, and features seven major improvements:</p> <ol> <li><code>membership</code>: We developed a command to allow users to send membership documents.</li> <li>Identity choice: We can now manually choose the desired identity among other identities.</li> <li>Multi-recipients transactions: Users can simultaneously send a different amount of \u011e1 to different recipients.</li> <li>Display improvements for <code>tx</code> and <code>balance</code>: For a better overview, we modified the <code>tx</code> table and added a <code>balance</code> table.</li> <li>Public key checksum display and verification: For security purposes, Silkaj displays and verifies the checksum.</li> <li><code>verify</code>: We set up a command to check whether a block is valid.</li> <li>Dev Env: We set up a solid development environment for Poetry, CI/CD, and Tests.</li> </ol> <ul> <li>A. Poetry: We migrated to Poetry.</li> <li>B. CI/CD: We set up a pipeline to run automatic jobs.</li> <li>C. Tests: We started to write tests.</li> </ul>"},{"location":"blog/silkaj-v080-release/#1-membership","title":"1. Membership","text":"<p>After the transaction and the certification commands, the much awaited <code>membership</code> command is now available.</p> <p>Users can send their first membership request to be a certified member of the \u011e1 community. As certified members have to renew their membership each year, this command allows to send the renewal application in question. It displays the expiration date of the current membership and indicates the identification blockstamp of the user. In the event a user forgets that they have already sent a membership request, a pop up displays if there is a pending membership request in the mempool.</p> <pre><code>silkaj membership\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nYou will be asked to approve \u011e1 license. Would you like to display it? [y/N]: n\nDo you approve \u011e1 license? [y/N]: y\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership              \u2502 in 3 weeks                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Number of pending membership(s) in the mempool     \u2502 1                                                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending membership documents will expire           \u2502 in 1 year                                         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID)                              \u2502 moul                                              \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key                                         \u2502 GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:J1k  \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity                                     \u2502 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B93\u2026 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published                                 \u2502 March 8, 2017                                     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership                  \u2502 in 1 year                                         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 months                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending a membership document for this identity? [y/N]:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#2-identity-choice","title":"2. Identity choice","text":"<p>When using the commands <code>wot</code>, <code>cert</code>, and <code>membership</code>, Silkaj used to select the first identity on the list. As this can lead to fishing, we added a new feature to pick the identity of your choice. Now, you can use the <code>uid</code> and the <code>pubkey</code> to certify an identity and study its status in the Web of Trust. Please note that identities can have the same user identifier and the same public key.</p> <pre><code>silkaj -gt wot moul\n|   id | uid       | pubkey                                           | timestamp             |\n|------+-----------+--------------------------------------------------+-----------------------|\n|   00 | moul1     | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s  | 614118-00000EE8DFC0F\u2026 |\n|   01 | moul2     | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s  | 614227-00000ED689406\u2026 |\n|   10 | moul1     | 3rp7ahDGeXqffBQTnENiXEFXYS7BRjYmS33NbgfCuDc8:DFQ | 614227-00000ED689406\u2026 |\n|   20 | moul-test | 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK | 167750-0000A51FF952B\u2026 |\nWhich identity would you like to select (id)?:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#3-transactions-multi-recipients-different-amounts-of-g1","title":"3. Transactions: multi-recipients &amp; different amounts of \u011e1","text":"<p>Thanks to Matograine, users can now send different amounts of \u011e1 to multiple recipients in the same document. Working on this feature offered us the opportunity to rethink and clean up the CLI and the code related to the <code>tx</code> command. However, further efforts are required to build a more solid code base foundation. </p> <p>v0.8.0 comes with three breaking changes and four small options:</p> <ul> <li><code>--output</code> was renamed to <code>--recipient</code></li> <li>recipients public key are splits with the option <code>--recipient</code> instead of a colon character.</li> <li>The public key's checksum separator <code>!</code> is being replaced by the colon.</li> <li>small options have been introduced:<ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code> </li> </ul> </li> </ul> <p>The follow examples illustrates the change operated on the CLI. With the previous version of Silkaj, the following procedure was operated to send one unit to <code>pubkey1</code> and <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --output &lt;pubkey&gt;1!&lt;checksum1&gt;:&lt;pubkey2&gt;!&lt;checksum2&gt;\n</code></pre> <p>With the current version of Silkaj, the following procedures are operated to send one unit to <code>pubkey1</code> and two units to <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --recipient &lt;pubkey1&gt;:&lt;checksum1&gt; --amount 2 --recipient &lt;pubkey2&gt;:&lt;checksum2&gt;\n</code></pre> <p>With small options:</p> <pre><code>silkaj tx -a 1 -r &lt;pubkey1&gt;:&lt;checksum1&gt; -a 2 -r &lt;pubkey2&gt;:&lt;checksum2&gt;\n</code></pre> <p>In the case one amount is passed, the same amount will be send to the passed recipients. The <code>--allSources</code> option is only working with one recipient.</p>"},{"location":"blog/silkaj-v080-release/#4-display-improvements-for-tx-and-balance","title":"4. Display improvements for <code>tx</code> and <code>balance</code>","text":"<p>We merged the relative and absolute amounts into one cell. This applies to the cells: initial balance, total transaction amount, balance after the transaction, and individual amounts.</p> <p>To send a different amount of \u011e1 to multi-recipient proceed following:</p> <pre><code>silkaj tx -d 1 -d 2 \\\n-r CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7 \\\n-r d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm \\\n-c \"Test different amounts to two different recipients\"\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Initial balance (unit|relative)            \u2502 2207757.83 \u011eTest | 145.63 UD \u011eTest                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total transaction amount (unit|relative)   \u2502 45480.0 \u011eTest | 3.0 UD \u011eTest                       \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Balance after transaction (unit|relative)  \u2502 2162277.83 \u011eTest | 142.63 UD \u011eTest                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (pubkey)                              \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (id)                                  \u2502 moul-test                                          \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey)                                \u2502 CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7:8Sj   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id)                                    \u2502 Elois                                              \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative)                     \u2502 15160.0 \u011eTest | 1.0 UD \u011eTest                       \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey)                                \u2502 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id)                                    \u2502 matograine-G1Test                                  \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative)                     \u2502 30320.0 \u011eTest | 2.0 UD \u011eTest                       \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Comment                                    | Test different amounts to two different recipients \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]:\n</code></pre> <p>The balance of a given public key is now displayed in a table. Bellow you can find an example of such a display.</p> <pre><code>silkaj balance 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey                   \u2502 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8:4VT \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Blockchain (unit|relative)          \u2502 94322.48 \u011e1 | 9220.18 UD \u011e1                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending transaction (unit|relative) \u2502 100.0 \u011e1 | 9.78 UD \u011e1                            \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative)        \u2502 94422.48 \u011e1 | 9229.96 UD \u011e1                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N               \u2502 13.35 x M/N                                      \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v080-release/#5-pubic-key-checksum-display-verification-and-checksum-command","title":"5. Pubic key checksum display, verification, and checksum command","text":"<p>For security purposes, Silkaj now displays the checksum associated with the public key, and verifies it when passed to a command. If a public key or an authentication method is passed to the newly introduced <code>checksum</code> command, the later generates the associated checksum to the public key. if a public key and a checksum are passed, Silkaj displays whether the checksum is valid or not.</p>"},{"location":"blog/silkaj-v080-release/#6-verify","title":"6. <code>verify</code>","text":"<p>We introduced the new <code>verify</code> command to check whether the signatures of the blocks of the blockchain are valid since there was a bug in the cryptography library of Duniter. Cf Forum topic and Duniter ticket</p> <p>To verify blocks proceed following:</p> <pre><code>silkaj verify\nProcessing blocks verification  [####################################]  100%\nWithin 0-342803 range, blocks with a wrong signature: 15144 31202 85448 87566 90830 109327 189835 199172 221274 253582\n</code></pre>"},{"location":"blog/silkaj-v080-release/#7-development-environment","title":"7. Development Environment","text":""},{"location":"blog/silkaj-v080-release/#a-poetry","title":"A. Poetry","text":"<p>We migrated the packaging and the dependency management tool from Pipenv to Poetry since Pipenv has been quite problematic recently and is also more suitable for larger projects.</p> <p>In comparison, Poetry is a well thought and stable tool which has been released by the end of 2019. In the former development environment, we had to define the dependencies twice in the <code>requirements.txt</code>, <code>setup.{py,cfg}</code>, <code>Pipenv</code> files. Poetry, however, supports the <code>pyproject.toml</code> file standardized by the Python project and is able to define the dependencies at once.</p> <p>If you would like to install Silkaj for development purposes, please follow this tutorial. You may also interested by checking the newly introduced contribution process documentation <code>CONTRIBUTING.md</code>.</p>"},{"location":"blog/silkaj-v080-release/#b-automatic-container-generation","title":"B. Automatic container generation","text":"<p>We set up an automated pipeline to generate containers for all supported Python versions: 3.5, 3.6, 3.7, and 3.8. These containers are based on official Python containers, which use Debian Buster Slim. On top of that, Poetry, <code>libsodium</code>, and other development tools are installed to continually check and test Silkaj in its pipeline. Since DuniterPy uses the same containers, it also profits from this automated container generation.</p>"},{"location":"blog/silkaj-v080-release/#c-cicd-pipelines","title":"C. CI/CD pipelines","text":"<p>Based on the containers set out above, a continuous integration and delivery pipeline has been set up to automatically run:</p> <ul> <li>Checks: format, build,</li> <li>Tests on all supported Python versions,</li> <li>Release publication automation on PyPI and PyPI test.</li> </ul> <p></p>"},{"location":"blog/silkaj-v080-release/#7-tests","title":"7. Tests","text":"<p>We started to write tests to ensure that all features of Silkaj are still functional when changing the code. However, in order to have all Silkaj commands fully tested, further efforts are required. During this development cycle, the test coverage raised from 37% to 69% and Silkaj is now covered by more than hundred tests.</p>"},{"location":"blog/silkaj-v080-release/#outlook","title":"Outlook","text":"<p>Silkaj is compatible with a range of Python versions. Currently, it can be used with Python 3.5, 3.6, 3.7, and 3.8. v0.8.x will be the last releases with Python 3.5 support. In v0.9.0, we will support Python 3.6, 3.7, 3.8, and 3.9.</p> <p>Since there is a deadline for packaging Silkaj and DuniterPy into Debian Bullseye (v11), we are putting all our efforts into the upcoming packaging. As for the coming version, DeathReaper, the <code>excluded</code> command, for which the crowdfunding has been completed, and the newly revamped <code>info</code> command will be stabilized and automatic tests will be written.</p> <p>ManUtopiK revamped Silkaj website in which you can look up all the presentations, the major features and documentations related to Silkaj. We are working on integrating the website into the project.</p> <p>For further details check out the presentations of the RML14. The oral presentations are in French and the slides in English:</p> <ul> <li>Moul's: How to contribute to Silkaj</li> <li>Matograine's: Envoyer des transactions exotiques avec Silkaj</li> </ul>"},{"location":"blog/silkaj-v080-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v081/","title":"V0.8.1","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine for your first release \\o/</p>"},{"location":"blog/v090rc/","title":"V0.9.0rc","text":""},{"location":"blog/v090rc/#call-for-testing-silkaj-v090rc","title":"Call for testing Silkaj v0.9.0rc","text":"<p>Hello everyone!</p> <p>We are pleased to publish a release candidate of Silkaj v0.9.0, and we would be happy to receive feedback before releasing it as a stable version.</p> <p>To install this pre-release version from PyPI, use this command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>Please test it globally, and check the changelog which contains the changes which happen during this development cycle. Pay a special attention to the transaction part where a part of the algorithm changed. There are new options on following commands:</p> <pre><code>silkaj history --full-pubkey\nsilkaj --dry-run cert\nsilkaj --dry-run/--display membership\n</code></pre> <p>Dry-run and display options are defined as general options, and only defined for this three cases for this release.</p>"},{"location":"blog/v090rc/#tests","title":"Tests","text":"<p>Manual tests help us making sure everything works fine for different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any loss of money.</p>"},{"location":"blog/v090rc/#tx","title":"<code>tx</code>","text":"<ul> <li>send a TX to a unique recipient</li> <li>send a TX to multiple recipients<ul> <li>with one amount</li> <li>with multiple amounts</li> </ul> </li> <li>send a TX to 92 recipients (can be 92 times the same)</li> <li>send a TX to 93 recipients (should fail)</li> </ul>"},{"location":"blog/v090rc/#membership","title":"<code>membership</code>","text":"<ul> <li>renew membership with <code>--dry-run</code> global option</li> <li>renew membership with <code>--display</code> global option</li> <li>renew membership without these two options</li> </ul>"},{"location":"blog/v090rc/#cert","title":"<code>cert</code>","text":"<ul> <li>send a certification with <code>--display</code> global option</li> <li>cert all identities you can on GTest network (thanks for keeping it alive ;-) )</li> <li>cert pubkey <code>4KEA63RCFF7AXUePPg5Q7JX9RtzXjywai1iKmE7LcoEC:DRz</code> on \u011e1-Test -&gt; you should be suggested two identities</li> <li>cert identity <code>ggg_ggg_2</code> on \u011e1-Test -&gt; you should NOT be proposed many identities</li> </ul>"},{"location":"blog/v090rc/#history","title":"<code>history</code>","text":"<ul> <li>check you history</li> <li>check you history and display userIDs</li> <li>check you history and display pubkeys in full-length</li> <li>check you history and display userIDs and pubkeys in full-length</li> </ul>"},{"location":"blog/v090rc/#wot","title":"<code>wot</code>","text":"<ul> <li>check your WoT infos are correct with <code>wot</code> command</li> </ul>"},{"location":"blog/v090rc/#checksum","title":"<code>checksum</code>","text":"<ul> <li>use <code>checksum</code> command to compute a checksum for one of your public keys.</li> <li>verify it with Silkaj</li> <li>verify it with Cesium</li> <li>try to change a character in the public key (with the checksum), then verify that it is wrong.</li> </ul>"},{"location":"blog/v090rc/#auth","title":"auth","text":"<ul> <li>create an authfile for a \u011e1-Test account</li> <li>send txs or certs using the authfile</li> </ul>"},{"location":"blog/v090rc/#other","title":"Other","text":"<p>Feel free to play!</p> <p>The release is planned for the 17th April of 2021, which will contain a detailed announcement of the changes and the new features.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v090-release/","title":"Silkaj v0.9.0 release","text":""},{"location":"blog/silkaj-v090-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.9.0. The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v090-release/#transaction","title":"Transaction","text":"<p>Silkaj is now properly handling the transaction document size limit. The 100 lines limit length of the transaction document in the compact format is now properly fulfilled by computing the length of the generated document.</p> <p>An important bug has been fixed regarding intermediaries transactions: When spending lots of sources (i.e. huge amounts from member wallets), many useless intermediaries transactions were sent and displayed. Intermediaries transactions are now correctly handled.</p> <p>Unit tests have been written on the <code>tx</code> command, which comforts us into developing new features.</p>"},{"location":"blog/silkaj-v090-release/#refactored-idlookup-command","title":"Refactored <code>id</code>/<code>lookup</code> command","text":"<p>The <code>id</code> command has been completely refactored. It now offers comprehensive results when looking for an identity by specifying a user identifier or a public key. Now the non-member user identifier are displayed. The command now uses same algorithm as <code>choose_identity()</code> which relies exclusively on <code>/wot/lookup</code> BMA's path. The command has been renamed to <code>lookup</code> to represent more closely what it does. This command renaming will also allow to introduce the future <code>identity</code> command.</p> <pre><code>silkaj lookup titi\nPublic keys or user id found matching 'titi':\n\n\u2192 4qJZFRfArLaUMEXDhsd69unsKynEFNLFazAVij4HNsBa:F4z \u2194 laetitia97421\n\u2192 4LCdTC9QsmqbFSHAhyaqGdDCVPr8Ywu2DZ8hDCzkdx4n:8ta \u2194 Amandinelaetitia\n\u2192 CehfxBHrowP6tXouR73GS52QhGAoNMtabooKbCvT7f3j:6cG \u2194 Laetiti974\n\u2192 FtZdA1HzHcDG6utoEgg6R5jjXfEne2ftS2UzvXajKurp:6Sm \u2194 Laetitia\n\u2192 EUn8uLJxgc3fVXJ1fBA74re4iD4Ws8Nk2xHytX1wLMfK:AQ2 \u2194 LaetitiaCarivenc\n\u2192 HqHZt9J1U7MwC3RF1bSjPgxACsTypfNjUThYFMZZfK6X:Dk1 \u2194 LaetitiaHOFF\n\u2192 5Vcm1zkHKoAMo9yy7Lk2HDX2Yn54agavtEUdrcFNmqkP:8mU \u2194 laetitiajanot\n\u2192 BfncGdTeq8qvhPZnBaM8T76SHM9xfx78ASRNZtGp64rZ:7tP \u2194 titi\n\u2192 BWKuSHYojjwzAXZZxSFTf5XVWneUMZqoWGUJEfWaFRL9:21F \u2194 titi43\n\u2192 49nWdTQqDT8qpazzPeP6NH92NwppG7YEh6PFYC2VecNA:Ba6 \u2194 titix\n</code></pre>"},{"location":"blog/silkaj-v090-release/#new-full-pubkey-option-on-the-history-command","title":"New <code>--full-pubkey</code> option on the <code>history</code> command","text":"<p>The <code>history</code> command adds a new option to display the whole public keys <code>--full-pubkey</code>:</p> <pre><code>silkaj -gt history 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH --full-pubkey\n\nTransactions history from: moul-test 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\nCurrent balance: 9012407.83 \u011eTest, 161.34 UD \u011eTest on the 2021-04-09 15:16:42\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n|        Date         |      Issuers/Recipients      | Amounts \u011eTest | Amounts UD\u011eTest |           Comment           |\n+=====================+==============================+===============+=================+=============================+\n| 2021-03-29 20:42:33 |                              |               |                 | Change operation            |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -193320       | -3.460          |                             |\n|                     | DjqoHyhGDFr5amh:45s          |               |                 |                             |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -338310       | -6.060          |                             |\n|                     | DjqoHyhGDFr5amh:45s          |               |                 |                             |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n</code></pre>"},{"location":"blog/silkaj-v090-release/#balance-command-is-now-displaying-corresponding-member-identity-user-identifier","title":"<code>balance</code> command is now displaying corresponding member identity user identifier","text":"<pre><code>silkaj -gt balance 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey            \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User identifier              \u2502 moul-test                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative) \u2502 8634537.83 \u011eTest | 162.21 UD \u011eTest               \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N        \u2502 1.05 x M/N                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v090-release/#display-option-on-cert-membership-commands","title":"Display option on <code>cert</code>, <code>membership</code> commands","text":"<p>This general option allows to display the generated document aside of the confirmation prompt before sending the document. It can be used for debugging, safety, or curiosity purposes. This option has only been implemented on the <code>cert</code> and the <code>membership</code> commands for now. The option should be available in next releases for the three others send-documents commands.</p> <pre><code>silkaj --gtest --auth-file --display cert KapisTest\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert   \u2502 Issuer                                           \u2502 \u2013&gt; \u2502 Recipient: Published: #block-hash date           \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID     \u2502 moul-test                                        \u2502 \u2013&gt; \u2502 KapisTest: [#673782](https://git.duniter.org/clients/python/silkaj/issues/673782)-00001519\u2026 2020-12-11 11:37:42 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502 \u2013&gt; \u2502 HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c:GZp \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Valid  \u2502 2021-04-09                                       \u2502 \u2014&gt; \u2502 2021-09-02                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Certification\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nIdtyIssuer: HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c\nIdtyUniqueID: KapisTest\nIdtyTimestamp: 673782-00001519FCBA6DDEFEE65B31ECD145B065F4404F870AAB272419EFA62BF5A677\nIdtySignature: 1KX/Iuv7FuXsxhTwYU/RIO9L0F3I+lGvBLYXRexIoCz35H+yb2Wf3nEXA2XXCPl5aVxcxvreOW2HF43r7ezcDA==\nCertTimestamp: 735968-00003F6B07F64573F6FABC510C1CEABEE8358426176BE7F190827A856873C517\n\nDo you confirm sending this certification? [y/N]: y\nCertification successfully sent.\n</code></pre> <pre><code>silkaj --gtest --auth-file --display membership\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership              \u2502 in 2 months                                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID)                              \u2502 moul-test                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key                                         \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity                                     \u2502 167750-0000A51FF952B76AAA594A46CA0C8156A56988\u2026   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published                                 \u2502 April 20, 2018                                   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership                  \u2502 in 2 months                                      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 weeks                                       \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Membership\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nBlock: 735967-00028030F3E2AB38D7EACA997065F58E16F0497EE86BFA23B2DA222EEE80C23C\nMembership: IN\nUserID: moul-test\nCertTS: 167750-0000A51FF952B76AAA594A46CA0C8156A56988D2B2B57BE18ECB4F3CFC25CEC2\nphOKWXHxfPBgkTE+Mui8Fiqb7QSlhPrKalDOzhyUwwLySV/EE2Z/b+vZNfByTn7sFYaHWPck5dsbzJQ6M+fBBA==\n\nDo you confirm sending this membership document for this identity? [y/N]: y\nMembership successfully sent\n</code></pre>"},{"location":"blog/silkaj-v090-release/#dry-run-option-is-becoming-a-generic-option","title":"Dry Run option is becoming a generic option","text":"<p>Before:</p> <pre><code>silkaj membership --dry-run\n</code></pre> <p>Now:</p> <pre><code>silkaj --dry-run membership\n</code></pre> <p>Note: This option is currently only implemented in the <code>membership</code> command.</p> <p>Note: The difference between the <code>--display</code> and the <code>--dry-run</code> options are that the dry run option by-passes the license, and the confirmation approvals. For safety reasons, the <code>--dry-run</code> option doesn't allow, at the end, to send the document on the network. On contrary, the <code>--display</code> option allows to send the document to the network.</p>"},{"location":"blog/silkaj-v090-release/#python-support","title":"Python support","text":"<p>Support for Python 3.5 has been dropped and support for Python 3.9 has been added.</p>"},{"location":"blog/silkaj-v090-release/#silkaj-v081-in-debian-bullseye","title":"Silkaj v0.8.1 in Debian Bullseye","text":"<p>If you are a user of Debian or its derivatives, you will be able to find Silkaj v0.8.1 available into Debian Bullseye (v11) which is about to be released. Silkaj package has been updated from v0.6.5 to v0.8.1 and DuniterPy v0.60.1 entered Debian repository for the first time.</p>"},{"location":"blog/silkaj-v090-release/#outlook","title":"Outlook","text":"<p>In the next developments, we are planning to work on DeathReaper, the implementations of the <code>revoke</code> and the <code>identity</code> commands. The removal of the asynchronous property, the migration from <code>tabulate</code> to <code>Texttable</code>, and the migration from BMA to GVA.</p>"},{"location":"blog/silkaj-v090-release/#thanks","title":"Thanks","text":"<p>matograine, moul, jonas, atrax</p>"},{"location":"contributing/","title":"Contributing","text":""},{"location":"contributing/#goals","title":"Goals","text":"<p>Part of the Duniter project running the \u011e1 currency, Silkaj project is aiming at creating a generic tool to manage the main account and wallets, to administrate and to monitor the currency.</p>"},{"location":"contributing/#install-the-development-environment","title":"Install the development environment","text":"<p>We are using Poetry as a development environment solution. Start by installing Poetry. This will install a sandboxed Python environment. Dependencies will be installed in it in order to have Silkaj running and to have pre-installed developement tools.</p>"},{"location":"contributing/#workflow","title":"Workflow","text":"<ul> <li>We use branches for merge requests</li> <li>We prefer fast-forward and rebase method than having merge commits created. This in order to have a clean history.</li> </ul>"},{"location":"contributing/#branches","title":"Branches","text":"<ul> <li><code>main</code>: development and stable branch</li> <li>maintainance branches, to maintain a stable version while developing future version with breaking changes. For instance: <code>release/0.12</code></li> </ul>"},{"location":"contributing/#developing-with-duniterpy","title":"Developing with DuniterPy","text":"<p>DuniterPy is a Python library for Duniter v1 clients. It implements a client with multiple APIs, the handling for document signing. As it is coupled with Silkaj, it is oftenly needed to develop in both repositories.</p>"},{"location":"contributing/#how-to-use-duniterpy-as-editable-with-poetry","title":"How to use DuniterPy as editable with Poetry","text":"<p>Clone DuniterPy locally alongside of <code>silkaj</code> repository:</p> <pre><code>silkaj&gt; cd ..\ngit clone https://git.duniter.org/clients/python/duniterpy\n</code></pre> <p>Use DuniterPy as a path dependency:</p> <pre><code>poetry add ../duniterpy\n</code></pre>"},{"location":"contributing/#developing-with-modules","title":"Developing with modules","text":"<p>Silkaj is using Python modules which shape kind of a framework. Please read their documentations on how to use them the best possible.</p> <ul> <li>DuniterPy: Autogenerated documentation.<ul> <li>Feel free to contribute upstream to share the code with other Python programs</li> </ul> </li> <li>Click<ul> <li>Rich-Click</li> </ul> </li> <li>Arrow</li> <li>texttable</li> </ul>"},{"location":"contributing/#pre-commit-hooks","title":"Pre-commit hooks","text":"<p>We are using <code>pre-commit</code> tool to perform checks on staged changes before committing. We are using it for <code>black</code> formatting, <code>mypy</code> static typing, <code>gitlab-ci</code> linting. We are also using <code>ruff</code> which replaces <code>isort</code> imports sorting, <code>pylint</code> code linting, <code>autoflake</code>, and <code>pyupgrade</code></p> <p>Install <code>pre-commit</code> from your distribution. In case it is an outdated version, install it with <code>pipx</code>:</p> <pre><code>sudo apt install pre-commit\npipx install pre-commit\n</code></pre> <p>To install the <code>git-hooks</code>, from within Silkaj repository, run:</p> <pre><code>pre-commit install\n</code></pre> <p>Then each time you commit changes, the hooks will perform verifications.</p> <p>In case you want to commit while the hooks are failing, run the following to skip the hooks:</p> <pre><code>git commit -m \"msg\" --no-verify/-n\n</code></pre> <p>To manually run one of the tool above, run (eg for <code>ruff-format</code>):</p> <pre><code>pre-commit run --all-files ruff-format\n</code></pre> <p>To run all checks on all files:</p> <pre><code>pre-commit run -a\n</code></pre>"},{"location":"contributing/#authorization-for-gitlab-ci-linter-hook","title":"Authorization for GitLab CI linter hook","text":"<p><code>pre-commit run -a (gitlab-ci-linter)</code> is failing due to authorization required for CI lint API accesses. When running this command, just ignore this failed hook. In case you want to commit a <code>.gitlab-ci.yml</code> edition, this hook will prevent the commit creation. You can skip the hooks as mentionned above. This is fine for occasional <code>.gitlab-ci.yml</code> editions. In case you would like to edit this file more often and have it checked, ask a maintainer to provide you with <code>GITLAB_PRIVATE_TOKEN</code> environment variable that can be set into a shell configuration. With Bash, in <code>$HOME/.bashrc</code> add the following:</p> <pre><code>export GITLAB_PRIVATE_TOKEN=\"\"\n</code></pre> <p>With Fish, in <code>$HOME/.config/fish/config.fish</code> add the following:</p> <pre><code>set -xg GITLAB_PRIVATE_TOKEN \"\"\n</code></pre> <p>Check out duniterpy#169 for more details.</p>"},{"location":"contributing/#tests","title":"Tests","text":"<p>We are using Pytest as a tests framework. For more information on how Silkaj implements them check the testing documentation.</p> <p>Tests are stored into <code>unit</code> and <code>integration</code> folders depending on their types, then using a similar tree as the source code.</p> <p>To run the tests, from within <code>silkaj</code> repository, run:</p> <pre><code>poetry run pytest\n</code></pre>"},{"location":"contributing/#how-to-test-a-single-file","title":"How to test a single file","text":"<p>Specifiy the path of the test:</p> <pre><code>poetry run pytest tests/unit/test_network.py\n</code></pre>"},{"location":"contributing/#version-bump","title":"Version bump","text":"<p>We are using the Semantic Versioning.</p> <p>To create a release, we use following script which will bump the version in different files, and will make a commit and a tag out of it.</p> <pre><code>./release.sh 0.20.0\n</code></pre> <p>Then, a <code>git push --tags</code> is necessary to publish the tag.</p>"},{"location":"contributing/#how-to-release-a-pre-release-on-pypi","title":"How to release a pre-release on PyPI","text":"<p>Append <code>[{a|b|rc}N]</code> to the version, it will be automatically detected as pre-release by PyPI. i.e.: <code>v0.20.0rc0</code>.</p> <ul> <li>install a pre-release from PyPI:</li> </ul> <pre><code>pip install silkaj --user --upgrade --pre\n</code></pre> <ul> <li>install <code>silkaj</code> from PyPI test and the dependencies (i.e. DuniterPy) from PyPI (have been removed from the documentation):</li> </ul> <pre><code>pip install silkaj --user --upgrade -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/\n</code></pre>"},{"location":"contributing/#update-copyright-year","title":"Update copyright year","text":"<p>Follow this documentation Only difference is to update the year in <code>license_header.txt</code> rather than <code>LICENSE.txt</code>.</p>"},{"location":"contributing/#pypi-and-pypi-test-distributions","title":"PyPI and PyPI test distributions","text":"<p>Silkaj is distributed to PyPI, the Python Package Index, for further <code>pip</code> installation. Silkaj can be published to PyPI or to PyPI test for testing purposes. Publishing to PyPI or PyPI test can be directly done from the continuous delivery or from Poetry it-self. The CD jobs appear on a tag and have to be triggered manually. Only the project maintainers have the rights to push tags.</p>"},{"location":"contributing/#pypi","title":"PyPI","text":"<p>Publishing to PyPI from Poetry:</p> <pre><code>poetry publish --build\n</code></pre>"},{"location":"contributing/#pypi-test","title":"PyPI test","text":"<p>Publishing to PyPI test from Poetry:</p> <pre><code>poetry config repositories.pypi_test https://test.pypi.org/legacy/\npoetry publish --build --repository pypi_test\n</code></pre> <p>To install this package:</p> <pre><code>pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.python.org/simple/ silkaj\n</code></pre> <p>The <code>--extra-index-url</code> is used to retrieve dependencies packages from the official PyPI not to get issues with missing or testing dependencies comming from PyPI test repositories.</p>"},{"location":"contributing/#continuous-integration-and-delivery","title":"Continuous integration and delivery","text":""},{"location":"contributing/#own-built-docker-images","title":"Own built Docker images","text":"<p>Silkaj pipeline is running images built on top of official Python images based on latest Debian with Poetry installed on top them.</p> <p>They can be found in this repository.</p>"},{"location":"contributing/#pipeline-and-its-jobs","title":"Pipeline and its jobs","text":"<ul> <li>Checks:<ul> <li>pre-commit hooks</li> <li>Build</li> </ul> </li> <li>Tests on supported Python versions:<ul> <li>Installation</li> <li>Pytest on Python supported versions</li> </ul> </li> <li>Package<ul> <li>PyPI stable</li> <li>PyPI test</li> <li>Docker pip</li> <li>Docker poetry</li> </ul> </li> <li>Website/project documentation commited to be deployed via GitLab Pages</li> </ul>"},{"location":"contributing/#g1-monetary-license-update","title":"\u011e1 monetary license update","text":"<p>To modify the \u011e1 monetary license files, please change them on its repository, since it\u2019s integrated in silkaj repository as a <code>git subtree</code>.</p> <p>\u011e1 monetary license is included in Silkaj repository as a <code>git subtree</code>. To update the licence files, add the license repository as a remote then pull:</p> <pre><code>git remote add g1_monetary_license https://git.duniter.org/documents/g1_monetary_license.git\ngit subtree pull --prefix g1_monetary_license g1_monetary_license master\n</code></pre> <p>Depending on your distribution, you might need to install <code>git-subtree</code>.</p>"},{"location":"contributing/container_usage/","title":"Container usage","text":"<p>There are two kind of containers. The one built with <code>pip</code> for user purposes, and the one built with Poetry for developer purposes.</p> <p>We recommand using <code>podman</code> instead of <code>docker</code> command for not having to run the command as <code>root</code>.</p> <p>In case you use <code>docker</code>, you can add your user into the <code>docker</code> group, so you can manipulate <code>docker</code> executable without <code>root</code> permissions.</p>"},{"location":"contributing/container_usage/#user","title":"User","text":"<p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <p>Run Silkaj from outside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory is where Silkaj sources are installed in Python <code>site-packages</code>. This is fine for doing small editions. For bigger editions, it is adviced to use a development environment with Poetry.</p>"},{"location":"contributing/container_usage/#developer","title":"Developer","text":"<p><code>git</code> is installed, so it can be used as a development environment.</p> <p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <p>Run Silkaj from ouside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory contains Silkaj sources. Set up the repository to have it ready for developments:</p> <pre><code>git checkout dev\ngit remote set-url origin https://git@git.duniter.org/clients/python/silkaj.git\n</code></pre> <pre><code>git config --global user.email \"you@example.com\"\ngit config --global user.name \"Your Name\"\n</code></pre>"},{"location":"contributing/documentation/","title":"Documentation contribution","text":"<p>The project documentation website is based on MkDocs framework and on following theme and plugins:</p> <ul> <li>Mkdocs Material: theme and framework</li> <li>Mike: to publish multiple versions</li> <li>MkDocs Coverage: to integrate coverage report iframe into MkDocs</li> <li>MkDocs Click: generate documentation for Click command line applications</li> <li>MkDocs GitLab plugin: to display links to GitLab references items: used in the changelog page</li> </ul> <p>Please refer to their respective documentation.</p>"},{"location":"contributing/documentation/#set-up","title":"Set up","text":"<p>Install the optional <code>docs</code> group:</p> <pre><code>poetry install --with docs\n</code></pre>"},{"location":"contributing/documentation/#mkdocs","title":"MkDocs","text":"<p>Run the website in development mode:</p> <pre><code>poetry run mkdocs deploy\n</code></pre> <p>Open localhost:8000 in your web browser.</p> <p>The preview will be live-updated once you change the documentation.</p>"},{"location":"contributing/documentation/#mike","title":"Mike","text":"<p>Running following command will serve what\u2019s on <code>pages</code> branch:</p> <pre><code>poetry run mike serve\n</code></pre> <p>This preview won\u2019t be live-updated with your latest changes as it would be with <code>mkdocs serve</code>. This is because Mike simply serves what\u2019s built on <code>pages</code> branch.</p>"},{"location":"contributing/documentation/#changing-the-content","title":"Changing the content","text":"<p>Into <code>docs</code> folder, you can find the Markdown source files which can be edited. <code>mkdocs.yml</code> file lists the website structure.</p>"},{"location":"contributing/documentation/#deployment-workflow","title":"Deployment workflow","text":"<p>Only on <code>main</code> branch, a <code>website</code> job will be triggered containing the documentation build for a specific version. It creates a commit which is added to <code>pages</code> branch with <code>poetry run mike deploy $version</code> command. Then the commit is pushed on the git repository remote from the job with an access token. The coverage report is integrated in the website build. The artefact is retrieved from the coverage job with <code>needs:</code> keyword.</p> <p>From <code>pages</code> branch, an other pipeline is triggered, publishing the documentation website to silkaj.duniter.org for all versions via GitLab Pages.</p>"},{"location":"contributing/documentation/#access-token","title":"Access token","text":"<p>A <code>git push</code> is performed from the job to the remote repository via the authorisation provided via an access token set in CI/CD variables. The access token has to be renew every year, since this is the maximum lifespan we can set for an access token at its creation. The access token has to be created on a project basis with <code>repository_write</code> checked and with Developer role.</p>"},{"location":"contributing/install_poetry/","title":"Poetry installation","text":""},{"location":"contributing/install_poetry/#install-silkaj-in-a-development-environement-with-poetry","title":"Install Silkaj in a development environement with Poetry","text":""},{"location":"contributing/install_poetry/#install-libsodium","title":"Install libsodium","text":"DebianFedora <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium\n</code></pre>"},{"location":"contributing/install_poetry/#install-poetry","title":"Install Poetry","text":"<ul> <li>Installation documentation</li> </ul> <pre><code>pipx install poetry\n</code></pre>"},{"location":"contributing/install_poetry/#install-dependencies-and-the-python-virtual-environment","title":"Install dependencies and the Python virtual environment","text":"<pre><code># Over HTTPS\ngit clone https://git.duniter.org/clients/python/silkaj.git\n\n# Over SSH\ngit clone git@git.duniter.org:clients/python/silkaj.git\n\ncd silkaj\n\n# Installs the runtime and development dependencies\npoetry install\n</code></pre>"},{"location":"contributing/install_poetry/#run-silkaj","title":"Run Silkaj","text":"<p>Within <code>silkaj</code> repository run Silkaj:</p> <pre><code>poetry run silkaj\n</code></pre>"},{"location":"contributing/install_poetry/#poetry-shell","title":"Poetry shell","text":"<p>You can access tools <code>pytest</code> from within the development environment with <code>poetry run</code> or by entering the shell:</p> <pre><code>silkaj&gt; poetry run pytest\n</code></pre> <pre><code>silkaj&gt; poetry shell\n(silkaj-58dUTebQ-py3.12) silkaj&gt; pytest\n</code></pre>"},{"location":"contributing/install_poetry/#make-silkaj-accessible-from-everywhere","title":"Make Silkaj accessible from everywhere","text":"<p>Add following alias to your shell configuration:</p> <pre><code>alias silkaj=\"cd /path/to/silkaj &amp;&amp; poetry run silkaj\"\n</code></pre>"},{"location":"contributing/packaging/","title":"Packaging","text":"<p>Silkaj is packaged in official Debian repositories. Packaging details can be found in its repository on Debian forge.</p>"},{"location":"contributing/packaging/#dependencies","title":"Dependencies","text":"<p>DuniterPy might be the only dependency not already into distributions.</p>"},{"location":"contributing/packaging/#manual-pages","title":"Manual pages","text":"<p>To generate manual pages: #179</p> <ul> <li><code>click-man</code></li> </ul>"},{"location":"contributing/packaging/#shell-completion","title":"Shell completion","text":"<p>Shell completion might be set-up as described in the installation documentation.</p>"},{"location":"contributing/testing/","title":"Testing","text":""},{"location":"contributing/testing/#test-and-coverage","title":"Test and coverage","text":""},{"location":"contributing/testing/#install-tests-dependencies","title":"Install tests dependencies","text":"<pre><code>poetry install\n</code></pre>"},{"location":"contributing/testing/#runing-tests","title":"Runing tests:","text":"<p>Simply run:</p> <pre><code>poetry run pytest\n</code></pre> <p>To have a coverage report:</p> <pre><code>poetry run pytest --cov silkaj --cov-report html --cov-report xml --cov-report term\n</code></pre> <p>See pytest documentation for more information</p>"},{"location":"contributing/testing/#writing-tests","title":"Writing tests","text":"<p>There should be three kinds of test:</p> <ul> <li>end to end test: uses the real data and the real blockchain. Obviously don't presume the data value as it can change. These test are written in <code>tests/integration/test_end_to_end.py</code>.</li> <li>integration test: mock some of the input and/or output classes and shouldn't use the actual blockchain, you should use this when mocking a class (used by your code) is too complicated.</li> <li>unit test: for functions that don't need mock or mock can me done easily (you should prefer this to integration tests). Are written in <code>tests/unit/test_*package*.py</code></li> </ul> <p>You should try to write an end to end test first, then if your coverage too bad add some unit tests. If it's still too bad, write an integration test.</p> <p>A better strategy (TDD) is to write first the End to end test. When it fails, before writing the code, you should implement the unit tests. When this one fails too, you can write your code to make your test pass. It's better but takes longer and the code is tested at least twice. So the previous strategy is a better compromise</p>"},{"location":"contributing/testing/#tips","title":"Tips","text":"<p>Test an Exception is raised: https://docs.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions</p> <p>Test a function with several values: You can use <code>@pytest.mark.parametrize</code> as done in <code>tests/unit/money/test_transfer.py</code></p> <p>To mock a user input:</p> <pre><code>from unittest.mock import patch\n\nfrom silkaj.cert import certification_confirmation\n\n\n# this will add a mock_input parameter that will be used whenever the code tries to get input from user\n@patch('builtins.input')\ndef test_certification_confirmation(mock_input):\n    id_to_certify = {\"pubkey\": \"pubkeyid to certify\"}\n    main_id_to_certify = {\"uid\": \"id to certify\"}\n\n    # the input will return \"yes\" to the tested function (certification_confirmation)\n    mock_input.return_value = \"yes\"\n\n    # ensure the tested function returns something\n    assert certification_confirmation(\n        \"certifier id\",\n        \"certifier pubkey\",\n        id_to_certify,\n        main_id_to_certify)\n\n    # ensure that input is called once\n    mock_input.assert_called_once()\n</code></pre>"},{"location":"usage/","title":"Usage","text":"<ul> <li>Command-line interface reference</li> <li>Account storage</li> <li>Multi-recipients transfers and automation</li> <li>DeathReaper</li> </ul>"},{"location":"usage/account_storage/","title":"Account storage","text":"<p>Silkaj features the account storage to store and read security-wise important documents from a location on your local computer. It is used to store and read authentication and revocation files with Silkaj. It is recommended to use the storage instead of storing and reading these files anywhere on your system.</p> <p>They are stored into <code>$XDG_DATA_HOME/silkaj</code>, aka <code>$HOME/.local/share/silkaj/$currency/$account_name</code> as:</p> <ul> <li><code>revocation.txt</code></li> <li><code>authentication_file_ed25519.dewif</code> for v1 WIF and EWIF formats based on the approved RFC n\u00b013.</li> <li><code>authentication_file_sr25519.json</code> for v2 encrypted json format</li> </ul> <p>The account name is a local name given to a wallet. It does not necessarily need to be the same identity nickname/alias stored into the blockchain. No verification what so ever is performed to check any correspondence between the local name stored into Silkaj account storage and the one stored on the blockchain or the indexer.</p>"},{"location":"usage/account_storage/#per-currency-storage","title":"Per currency storage","text":"<p>The storage is organized per currencies. Depending on the specified endpoint with the endpoint options (<code>--endpoint</code>, <code>--gtest</code>) the currency will be determined. Based on the latter, it will stored into <code>g1</code> or <code>g1-test</code> directory.</p>"},{"location":"usage/account_storage/#authentication","title":"Authentication","text":""},{"location":"usage/account_storage/#import","title":"Import","text":"<p>Import your authentication file into the storage. In case you want to use an other authentication method than the default Scrypt method, use one of the authentication options which can be find in <code>silkaj authentication --help</code> usage.</p> <p>Next command will store the authentication file in <code>$HOME/.local/share/silkaj/g1/test/authentication_file_ed25519.dewif</code></p> <pre><code>silkaj --account test authentication &lt;authentication option&gt;\n</code></pre> <p>Note: <code>g1</code> and <code>test</code> folders comes respectively from the default \u011e1 endpoint and <code>test</code> from the account passed.</p>"},{"location":"usage/account_storage/#reading","title":"Reading","text":"<p>Commands using authentication such as <code>money transfer</code>, <code>wot certify</code>, <code>wot membership</code>, and <code>money balance</code> will read the authentication file from the account storage. With the general <code>--account</code> option, it will use the authentication file created in previous step.</p> <pre><code>silkaj --account test money transfer\n</code></pre>"},{"location":"usage/account_storage/#revocation","title":"Revocation","text":""},{"location":"usage/account_storage/#inputoutput","title":"Input/Output","text":"<p>The general <code>--account</code> option (placed between <code>silkaj</code> and the sub-command) is used to read the authentication file and to write the revocation file in the same directory.</p> <pre><code>silkaj --account test authentication\n</code></pre>"},{"location":"usage/account_storage/#creation","title":"Creation","text":"<pre><code>silkaj --gtest --account john wot revocation create\n</code></pre> <p>Will be stored into <code>$HOME/.local/share/silkaj/g1-test/john/revocation.txt</code></p>"},{"location":"usage/account_storage/#reading_1","title":"Reading","text":"<p>The revocation document can be read with <code>wot revocation publish</code> and <code>verify</code> commands as follow:</p> <pre><code>silkaj --gtest --account john wot revocation verify\n</code></pre> <p>Here we are reading the revocation file generated in previous step.</p>"},{"location":"usage/cli/","title":"Command-line interface reference","text":"<p>This page provides documentation of Silkaj command line interface.</p>"},{"location":"usage/cli/#silkaj","title":"silkaj","text":"<p>Usage:</p> <pre><code>silkaj [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>-h</code>, <code>--help</code> boolean Show this message and exit. <code>False</code> <code>-v</code>, <code>--version</code> boolean Show the version and exit. <code>False</code> <code>--endpoint</code>, <code>-ep</code> text Without specifying this option, the default endpoint reaches \u011e1 currency on its official endpoint: https://g1.duniter.org. --endpoint allows to specify a custom endpoint following <code>&lt;host&gt;:&lt;port&gt;/&lt;path&gt;</code> format. <code>port</code> and <code>path</code> are optional. In case no port is specified, it defaults to 443. NOTE: This argument is mutually exclusive with arguments: [gtest]. None <code>--gtest</code>, <code>-gt</code> boolean Uses official \u011eTest currency endpoint: https://g1-test.duniter.org NOTE: This argument is mutually exclusive with arguments: [endpoint]. <code>False</code> <code>--account</code>, <code>-a</code> text Account name used in storage <code>$HOME/.local/share/silkaj/$currency/$account_name</code> for authentication and revocation. None <code>--password</code>, <code>-p</code> text EWIF authentication password. If you use this option, prefix the command with a space so the password is not saved in your shell history. In case of an encrypted file, password input will be prompted. None <code>--display</code>, <code>-d</code> boolean Display the generated document before sending it <code>False</code> <code>--dry-run</code>, <code>-n</code> boolean By-pass the licence and confirmation. Do not send the document, but display it instead <code>False</code> <p>Subcommands</p> <ul> <li>about: Display program information</li> <li>authentication: Generate and store authentication file</li> <li>blockchain: Blockchain related commands</li> <li>checksum: Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</li> <li>license: Display \u011e1 monetary license</li> <li>money: Money management related commands</li> <li>wot: Web-of-Trust related commands</li> </ul>"},{"location":"usage/cli/#silkaj-about","title":"silkaj about","text":"<p>Display program information</p> <p>Usage:</p> <pre><code>silkaj about [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-authentication","title":"silkaj authentication","text":"<p>Generate and store authentication file</p> <p>Usage:</p> <pre><code>silkaj authentication [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--auth-scrypt</code>, <code>--scrypt</code> boolean Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_file, auth_wif, auth_seed]. <code>False</code> <code>--nrp</code> text Scrypt parameters: defaults N,r,p: \"4096,16,1\" None <code>--auth-file</code>, <code>-af</code> file Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_wif, auth_seed]. None <code>--auth-seed</code>, <code>--seed</code> boolean Seed hexadecimal authentication NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_wif]. <code>False</code> <code>--auth-wif</code>, <code>--wif</code> boolean WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_seed]. <code>False</code> <code>--password</code>, <code>-p</code> text EWIF encryption password for the destination file. If no password argument is passed, WIF format will be used. If you use this option prefix the command with a space so the password does not get saved in your shell history. Password input will be suggested via a prompt. None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain","title":"silkaj blockchain","text":"<p>Blockchain related commands</p> <p>Usage:</p> <pre><code>silkaj blockchain [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>blocks: Display blocks: default: 0 for current window size</li> <li>difficulty: Display current Proof-of-Work difficulty level to generate next block</li> <li>info: Currency information</li> </ul>"},{"location":"usage/cli/#silkaj-blockchain-blocks","title":"silkaj blockchain blocks","text":"<p>Display blocks: default: 0 for current window size</p> <p>Usage:</p> <pre><code>silkaj blockchain blocks [OPTIONS] [NUMBER]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--detailed</code>, <code>-d</code> boolean Force detailed view. Compact view happen over 30 blocks <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-difficulty","title":"silkaj blockchain difficulty","text":"<p>Display current Proof-of-Work difficulty level to generate next block</p> <p>Usage:</p> <pre><code>silkaj blockchain difficulty [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-info","title":"silkaj blockchain info","text":"<p>Currency information</p> <p>Usage:</p> <pre><code>silkaj blockchain info [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-checksum","title":"silkaj checksum","text":"<p>Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</p> <p>Usage:</p> <pre><code>silkaj checksum [OPTIONS] [PUBKEY_CHECKSUM]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-license","title":"silkaj license","text":"<p>Display \u011e1 monetary license</p> <p>Usage:</p> <pre><code>silkaj license [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money","title":"silkaj money","text":"<p>Money management related commands</p> <p>Usage:</p> <pre><code>silkaj money [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>balance: Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</li> <li>history: History of wallet money movements</li> <li>transfer: Transfer money</li> </ul>"},{"location":"usage/cli/#silkaj-money-balance","title":"silkaj money balance","text":"<p>Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</p> <p>Usage:</p> <pre><code>silkaj money balance [OPTIONS] [PUBKEYS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-history","title":"silkaj money history","text":"<p>History of wallet money movements</p> <p>Usage:</p> <pre><code>silkaj money history [OPTIONS] PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--uids</code>, <code>-u</code> boolean Display identities username <code>False</code> <code>--full-pubkey</code>, <code>-f</code> boolean Display full-length public keys <code>False</code> <code>--csv-file</code>, <code>--csv</code> file Write in specified file name in CSV (Comma-separated values) format the history of money movements None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-transfer","title":"silkaj money transfer","text":"<p>Transfer money</p> <p>Usage:</p> <pre><code>silkaj money transfer [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--amount</code>, <code>-a</code> float range (<code>0.01</code> and above) Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [amountsud, allsources, file_path]. None <code>--amountUD</code>, <code>-d</code> float range (<code>1e-06</code> and above) Relative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amounts]. None <code>--allSources</code> boolean Send all sources to one recipient. NOTE: This argument is mutually exclusive with arguments: [file_path, amountsud, amounts]. <code>False</code> <code>--recipient</code>, <code>-r</code> text Public key(s)' recipients + optional checksum: <code>&lt;pubkey&gt;[:checksum]</code>. Sending to multiple recipients is possible. With one amount specified, all recipients will receive the same amount. With one amount specified per recipient, recipient 1 will recieve amount 1, and so on. NOTE: This argument is mutually exclusive with arguments: [file_path]. None <code>--file</code>, <code>-f</code> file File's path containing a list of amounts in absolute or relative reference and recipients' pubkeys NOTE: This argument is mutually exclusive with arguments: [amountsUD, recipients, allsources, amounts]. None <code>--reference</code>, <code>-ref</code> text Transfer reference `` <code>--outputBackChange</code> text Pubkey recipient to send the rest of the transaction: <code>&lt;pubkey[:checksum]&gt;</code> None <code>--yes</code>, <code>-y</code> boolean Assume yes. Do not prompt confirmation <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot","title":"silkaj wot","text":"<p>Web-of-Trust related commands</p> <p>Usage:</p> <pre><code>silkaj wot [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>certify: Certify identity</li> <li>lookup: Username identifier and public key lookup</li> <li>membership: Send or renew membership.</li> <li>revocation: Manage revocation document commands.</li> <li>status: Check received and sent certifications and consult the membership status of any given identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-certify","title":"silkaj wot certify","text":"<p>Certify identity</p> <p>Usage:</p> <pre><code>silkaj wot certify [OPTIONS] UID_PUBKEY_TO_CERTIFY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-lookup","title":"silkaj wot lookup","text":"<p>Username identifier and public key lookup</p> <p>Usage:</p> <pre><code>silkaj wot lookup [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-membership","title":"silkaj wot membership","text":"<p>Send or renew membership.</p> <p>Usage:</p> <pre><code>silkaj wot membership [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation","title":"silkaj wot revocation","text":"<p>Manage revocation document commands.</p> <p>Usage:</p> <pre><code>silkaj wot revocation [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>create: Create and save revocation document</li> <li>publish: Publish previously created revocation document. Identity will be immediately revoked.</li> <li>revoke: Create and publish revocation document. Will immediately revoke the identity.</li> <li>verify: Verifies that the revocation document is correctly formatted and matches an existing identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-revocation-create","title":"silkaj wot revocation create","text":"<p>Create and save revocation document</p> <p>Usage:</p> <pre><code>silkaj wot revocation create [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-publish","title":"silkaj wot revocation publish","text":"<p>Publish previously created revocation document. Identity will be immediately revoked.</p> <p>Usage:</p> <pre><code>silkaj wot revocation publish [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-revoke","title":"silkaj wot revocation revoke","text":"<p>Create and publish revocation document. Will immediately revoke the identity.</p> <p>Usage:</p> <pre><code>silkaj wot revocation revoke [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-verify","title":"silkaj wot revocation verify","text":"<p>Verifies that the revocation document is correctly formatted and matches an existing identity</p> <p>Usage:</p> <pre><code>silkaj wot revocation verify [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-status","title":"silkaj wot status","text":"<p>Check received and sent certifications and consult the membership status of any given identity</p> <p>Usage:</p> <pre><code>silkaj wot status [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/deathreaper/","title":"DeathReaper","text":"<p>DeathReaper is a service reporting Web of Trust exclusions on Discourse forums. Images are created containing Silkaj + DeathReaper. These images are operated on DeathReaper repository with pipeline schedules.</p>"},{"location":"usage/deathreaper/#installation","title":"Installation","text":"<p>When installing Silkaj, you have to specify the optional extra <code>deathreaper</code> distribution in order to get DeathReaper\u2019s dependency <code>pydiscourse</code> installed. It will therefore \"activate\" the feature, and <code>silkaj wot exclusions</code> command will become available.</p> <pre><code>pipx install silkaj[deathreaper]\n</code></pre> <p>With Poetry development environment:</p> <pre><code>poetry install --extras deathreaper\n</code></pre>"},{"location":"usage/deathreaper/#usage","title":"Usage","text":"<p>DeathReaper was first released in Silkaj codebase with version 0.12.0. Make sure <code>exclusions</code> command is present under <code>silkaj wot</code>, otherwise something probably went wrong with the installation. Then run <code>silkaj wot exclusions --help</code> to check how to use it.</p> <p>By default it will report the exclusions for the last day, from 24 hours in the past till now. You can specify an other duration with <code>silkaj wot exclusions 0.5</code> for the last 12 hours, half a day, for example.</p> <p>By default the report will be displayed in the terminal. To have the report published on a Discourse forum, you have to pass following options <code>--api-id</code> <code>--*-api-key</code>, <code>--publish</code>. Further code changes have to be done in order to support additional Discourse forums.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/","title":"Multi-recipients transfers and automation","text":"<p>We want to transfer money to multiple recipients and to automate that process.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#create-a-recipients-file","title":"Create a recipients file","text":"<p>Create a file (i.e.: <code>recipients.txt</code>) containing the list of the recipients public keys you want to send money to.</p> recipients.txt<pre><code>&lt;ABSOLUTE|RELATIVE&gt;\n\n# comment 1\n&lt;amount1&gt; &lt;pubkey1&gt;\n\n# comment 2\n&lt;amount2&gt; &lt;pubkey2&gt;:[&lt;checksum2&gt;]\n</code></pre> <p>The file content should be prefixed with <code>RELATIVE</code> or <code>ABSOLUTE</code> so the amounts will be expressed in UD \u011e1 or \u011e1.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#set-up-the-authentication","title":"Set up the authentication","text":"<ul> <li>Check authentication documentation on how to handle the authentication.</li> </ul>"},{"location":"usage/multi-recipients_transfers_and_automation/#transfer","title":"Transfer","text":"<p>Finally, you just have to run following command:</p> <pre><code>silkaj -a &lt;account_name&gt; money transfer --file recipients.txt\n</code></pre>"},{"location":"usage/multi-recipients_transfers_and_automation/#automation","title":"Automation","text":"<p>In case you want to automate a transfer on a regural basis, on the first day of the month in this example, you can set a <code>crontab</code> on your machine (preferably a machine running 7/24):</p> <pre><code>0 0 1 * * silkaj -a &lt;account_name&gt; money transfer --file recipients.txt --yes\n</code></pre> <p>Pass <code>--yes</code> option so no confirmation gets prompted. In case a password is set on the authentication, pass as well the <code>--password &lt;password&gt;</code> general option.</p>"},{"location":"coverage/","title":"Coverage report","text":""},{"location":"blog/2023/","title":"2023","text":""},{"location":"blog/2022/","title":"2022","text":""},{"location":"blog/2021/","title":"2021","text":""},{"location":"blog/2020/","title":"2020","text":""},{"location":"blog/2019/","title":"2019","text":""},{"location":"blog/2018/","title":"2018","text":""},{"location":"blog/2017/","title":"2017","text":""},{"location":"blog/2016/","title":"2016","text":""},{"location":"blog/minor/","title":"minor","text":""},{"location":"blog/release/","title":"release","text":""},{"location":"blog/rc/","title":"rc","text":""},{"location":"blog/page/2/","title":"Blog","text":""},{"location":"blog/page/3/","title":"Blog","text":""},{"location":"blog/page/4/","title":"Blog","text":""},{"location":"blog/page/5/","title":"Blog","text":""},{"location":"blog/minor/page/2/","title":"minor","text":""},{"location":"blog/release/page/2/","title":"release","text":""},{"location":"blog/release/page/3/","title":"release","text":""}]}
\ No newline at end of file
diff --git a/0.12/sitemap.xml b/0.12/sitemap.xml
index 3d88d9f4227952eac44a36a58af5e67279b9fffe..61ff46ce1c0ae9a134e2cb0620f264da7e13747d 100644
--- a/0.12/sitemap.xml
+++ b/0.12/sitemap.xml
@@ -2,234 +2,234 @@
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
     <url>
          <loc>https://silkaj.duniter.org/0.12/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/changelog/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/install/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-new-cli-duniter-client/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v0100/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/call-for-testing-silkaj-v0100rc/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v0110-release/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/call-for-testing-silkaj-v0110rc0/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v0111/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v0112/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v020-release/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v030-release-lets-send-money/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v040-release/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v050-release-lets-certify/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v060-release-lets-install/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v061-release/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v071/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v072/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v073/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v074/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v075/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v076/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v080-release/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v081/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/v090rc/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v090-release/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/contributing/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/contributing/container_usage/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/contributing/documentation/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/contributing/install_poetry/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/contributing/packaging/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/contributing/testing/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/usage/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/usage/account_storage/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/usage/cli/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/usage/deathreaper/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/usage/multi-recipients_transfers_and_automation/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/coverage/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2023/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2022/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2021/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2020/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2019/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2018/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2017/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/2016/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/minor/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/release/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/rc/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/page/2/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/page/3/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/page/4/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/page/5/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/minor/page/2/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/release/page/2/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
     <url>
          <loc>https://silkaj.duniter.org/0.12/blog/release/page/3/</loc>
-         <lastmod>2025-04-15</lastmod>
+         <lastmod>2025-04-16</lastmod>
     </url>
 </urlset>
\ No newline at end of file
diff --git a/0.12/sitemap.xml.gz b/0.12/sitemap.xml.gz
index 37dc2115d2fe7620fbec17fa1ed3b548986f0fde..af5856401a37435d80008dbe8f3db79bc846480a 100644
Binary files a/0.12/sitemap.xml.gz and b/0.12/sitemap.xml.gz differ
diff --git a/0.12/usage/cli/index.html b/0.12/usage/cli/index.html
index 87107853dc3643e5f7b2406143af3ae382997188..8e3d5e6144a4843ae2dc3309dc2842dcd5768264 100644
--- a/0.12/usage/cli/index.html
+++ b/0.12/usage/cli/index.html
@@ -1954,7 +1954,7 @@
 <tr>
 <td><code>--auth-scrypt</code>, <code>--scrypt</code></td>
 <td>boolean</td>
-<td>Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_file, auth_wif].</td>
+<td>Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_file, auth_wif, auth_seed].</td>
 <td><code>False</code></td>
 </tr>
 <tr>
@@ -1966,7 +1966,7 @@
 <tr>
 <td><code>--auth-file</code>, <code>-af</code></td>
 <td>file</td>
-<td>Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_scrypt, auth_wif].</td>
+<td>Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_wif, auth_seed].</td>
 <td>None</td>
 </tr>
 <tr>
@@ -1978,7 +1978,7 @@
 <tr>
 <td><code>--auth-wif</code>, <code>--wif</code></td>
 <td>boolean</td>
-<td>WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_scrypt, auth_file].</td>
+<td>WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_seed].</td>
 <td><code>False</code></td>
 </tr>
 <tr>
@@ -2266,7 +2266,7 @@
 <tr>
 <td><code>--amount</code>, <code>-a</code></td>
 <td>float range (<code>0.01</code> and above)</td>
-<td>Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amountsud].</td>
+<td>Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [amountsud, allsources, file_path].</td>
 <td>None</td>
 </tr>
 <tr>
@@ -2278,7 +2278,7 @@
 <tr>
 <td><code>--allSources</code></td>
 <td>boolean</td>
-<td>Send all sources to one recipient. NOTE: This argument is mutually exclusive with arguments: [file_path, amounts, amountsud].</td>
+<td>Send all sources to one recipient. NOTE: This argument is mutually exclusive with arguments: [file_path, amountsud, amounts].</td>
 <td><code>False</code></td>
 </tr>
 <tr>
@@ -2290,7 +2290,7 @@
 <tr>
 <td><code>--file</code>, <code>-f</code></td>
 <td>file</td>
-<td>File's path containing a list of amounts in absolute or relative reference and recipients' pubkeys NOTE: This argument is mutually exclusive with arguments: [allsources, amounts, recipients, amountsUD].</td>
+<td>File's path containing a list of amounts in absolute or relative reference and recipients' pubkeys NOTE: This argument is mutually exclusive with arguments: [amountsUD, recipients, allsources, amounts].</td>
 <td>None</td>
 </tr>
 <tr>
diff --git a/0.12/usage/deathreaper/index.html b/0.12/usage/deathreaper/index.html
index 2e4859f38c38e94507992f3ab7a1a24e99a92eba..cad87b06c63629d8257689630042d94551e339dd 100644
--- a/0.12/usage/deathreaper/index.html
+++ b/0.12/usage/deathreaper/index.html
@@ -1397,10 +1397,7 @@
 
 
 <h1 id="deathreaper">DeathReaper<a class="headerlink" href="#deathreaper" title="Permanent link">&para;</a></h1>
-<center>
-![DeathReaper logo](../images/deathreaper_logo.svg)
-</center>
-
+<p><img alt="DeathReaper logo" src="../../images/deathreaper_logo.svg" /></p>
 <p>DeathReaper is a service reporting Web of Trust exclusions on <a href="https://www.discourse.org/">Discourse forums</a>.
 Images are created containing Silkaj + DeathReaper.
 These images are operated on <a href="https://git.duniter.org/clients/python/deathreaper">DeathReaper repository</a> with pipeline schedules.</p>