diff --git a/Cargo.lock b/Cargo.lock
index 1f53e2c90a5a62e14d1933b46eee29a406fbd848..82a2f51a41cc7cd08ffea96f67c53319a42b9ac5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -319,7 +319,7 @@ checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -715,7 +715,7 @@ dependencies = [
  "js-sys",
  "num-integer",
  "num-traits",
- "time",
+ "time 0.1.45",
  "wasm-bindgen",
  "winapi 0.3.9",
 ]
@@ -802,7 +802,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -815,7 +815,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -855,6 +855,17 @@ dependencies = [
  "unicode-width",
 ]
 
+[[package]]
+name = "colored"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6"
+dependencies = [
+ "is-terminal",
+ "lazy_static",
+ "windows-sys 0.48.0",
+]
+
 [[package]]
 name = "combine"
 version = "3.8.1"
@@ -1218,7 +1229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
 dependencies = [
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1277,7 +1288,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "syn",
+ "syn 1.0.107",
  "synthez",
 ]
 
@@ -1358,7 +1369,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "scratch",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1375,7 +1386,7 @@ checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1399,7 +1410,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "strsim",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1410,7 +1421,7 @@ checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e"
 dependencies = [
  "darling_core",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1436,7 +1447,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db"
 dependencies = [
  "data-encoding",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1473,7 +1484,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1484,7 +1495,7 @@ checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1572,13 +1583,17 @@ dependencies = [
  "dubp-wot",
  "flate2",
  "fnv",
+ "log",
  "num-traits",
  "parity-scale-codec",
  "rayon",
+ "simple_logger",
  "sp-core",
  "sp-distance",
  "sp-runtime",
  "subxt",
+ "time 0.1.45",
+ "time-macros",
  "tokio",
 ]
 
@@ -1763,7 +1778,7 @@ checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1869,7 +1884,7 @@ dependencies = [
  "heck 0.4.1",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -1968,7 +1983,7 @@ checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
  "synstructure",
 ]
 
@@ -2284,7 +2299,7 @@ dependencies = [
  "itertools",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -2296,7 +2311,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -2306,7 +2321,7 @@ source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -2502,7 +2517,7 @@ checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -2791,7 +2806,7 @@ dependencies = [
  "quote",
  "serde",
  "serde_json",
- "syn",
+ "syn 1.0.107",
  "textwrap 0.12.1",
  "thiserror",
  "typed-builder",
@@ -2805,7 +2820,7 @@ checksum = "41973d4c45f7a35af8753ba3457cc99d406d863941fd7f52663cff54a5ab99b3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -2905,7 +2920,7 @@ dependencies = [
  "quote",
  "serde",
  "serde_json",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -2916,7 +2931,7 @@ checksum = "e56b093bfda71de1da99758b036f4cc811fd2511c8a76f75680e9ffbd2bb4251"
 dependencies = [
  "graphql_client_codegen",
  "proc-macro2",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -3360,7 +3375,7 @@ checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -3692,7 +3707,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -4113,7 +4128,7 @@ checksum = "a0eddc4497a8b5a506013c40e8189864f9c3a00db2b25671f428ae9007f3ba32"
 dependencies = [
  "heck 0.4.1",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -4569,7 +4584,7 @@ dependencies = [
  "cfg-if 1.0.0",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -4628,7 +4643,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
  "synstructure",
 ]
 
@@ -4678,7 +4693,7 @@ checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -4983,7 +4998,16 @@ checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "num_threads"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
+dependencies = [
+ "libc",
 ]
 
 [[package]]
@@ -5051,7 +5075,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -5295,7 +5319,7 @@ dependencies = [
  "num_enum",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -5740,7 +5764,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -5771,7 +5795,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2"
 dependencies = [
  "proc-macro2",
- "syn",
+ "syn 1.0.107",
  "synstructure",
 ]
 
@@ -5931,7 +5955,7 @@ dependencies = [
  "pest_meta",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -5972,7 +5996,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -6121,7 +6145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78"
 dependencies = [
  "proc-macro2",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -6156,7 +6180,7 @@ dependencies = [
  "proc-macro-error-attr",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
  "version_check",
 ]
 
@@ -6173,9 +6197,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.50"
+version = "1.0.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
+checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
 dependencies = [
  "unicode-ident",
 ]
@@ -6214,7 +6238,7 @@ checksum = "66a455fbcb954c1a7decf3c586e860fd7889cddf4b8e164be736dbac95a953cd"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -6244,7 +6268,7 @@ dependencies = [
  "prost",
  "prost-types",
  "regex",
- "syn",
+ "syn 1.0.107",
  "tempfile",
  "which",
 ]
@@ -6272,7 +6296,7 @@ dependencies = [
  "itertools",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -6313,9 +6337,9 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.23"
+version = "1.0.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
 dependencies = [
  "proc-macro2",
 ]
@@ -6500,7 +6524,7 @@ checksum = "9f9c0c92af03644e4806106281fe2e068ac5bc0ae74a707266d06ea27bccee5f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -6892,7 +6916,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -7794,7 +7818,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -7897,7 +7921,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -7975,7 +7999,7 @@ dependencies = [
  "heck 0.3.3",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -7987,7 +8011,7 @@ dependencies = [
  "heck 0.3.3",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -8079,22 +8103,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
 [[package]]
 name = "serde"
-version = "1.0.152"
+version = "1.0.188"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.152"
+version = "1.0.188"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.31",
 ]
 
 [[package]]
@@ -8238,6 +8262,18 @@ dependencies = [
  "paste",
 ]
 
+[[package]]
+name = "simple_logger"
+version = "4.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2230cd5c29b815c9b699fb610b49a5ed65588f3509d9f0108be3a885da629333"
+dependencies = [
+ "colored",
+ "log",
+ "time 0.3.23",
+ "windows-sys 0.42.0",
+]
+
 [[package]]
 name = "slab"
 version = "0.4.7"
@@ -8335,7 +8371,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -8576,7 +8612,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "sp-core-hashing",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -8595,7 +8631,7 @@ source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -8811,7 +8847,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9007,7 +9043,7 @@ dependencies = [
  "parity-scale-codec",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9107,7 +9143,7 @@ dependencies = [
  "memchr",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9148,7 +9184,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9285,7 +9321,7 @@ dependencies = [
  "quote",
  "scale-info",
  "subxt-metadata",
- "syn",
+ "syn 1.0.107",
  "tokio",
 ]
 
@@ -9297,7 +9333,7 @@ dependencies = [
  "darling",
  "proc-macro-error",
  "subxt-codegen",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9322,6 +9358,17 @@ dependencies = [
  "unicode-ident",
 ]
 
+[[package]]
+name = "syn"
+version = "2.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
 [[package]]
 name = "synstructure"
 version = "0.12.6"
@@ -9330,7 +9377,7 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
  "unicode-xid",
 ]
 
@@ -9340,7 +9387,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "033178d0acccffc5490021657006e6a8dd586ee9dc6f7c24e7608b125e568cb1"
 dependencies = [
- "syn",
+ "syn 1.0.107",
  "synthez-codegen",
  "synthez-core",
 ]
@@ -9351,7 +9398,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "69263462a40e46960f070618e20094ce69e783a41f86e54bc75545136afd597a"
 dependencies = [
- "syn",
+ "syn 1.0.107",
  "synthez-core",
 ]
 
@@ -9364,7 +9411,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "sealed 0.3.0",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9477,7 +9524,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9515,6 +9562,35 @@ dependencies = [
  "winapi 0.3.9",
 ]
 
+[[package]]
+name = "time"
+version = "0.3.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446"
+dependencies = [
+ "itoa",
+ "libc",
+ "num_threads",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
+
+[[package]]
+name = "time-macros"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4"
+dependencies = [
+ "time-core",
+]
+
 [[package]]
 name = "tiny-bip39"
 version = "0.8.2"
@@ -9577,7 +9653,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9662,7 +9738,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -9853,7 +9929,7 @@ checksum = "f85f4270f4f449a3f2c0cf2aecc8415e388a597aeacc7d55fc749c5c968c8533"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
 ]
 
 [[package]]
@@ -10142,7 +10218,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
  "wasm-bindgen-shared",
 ]
 
@@ -10176,7 +10252,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -10582,6 +10658,15 @@ dependencies = [
  "windows-targets 0.42.1",
 ]
 
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.1",
+]
+
 [[package]]
 name = "windows-targets"
 version = "0.42.1"
@@ -10855,7 +10940,7 @@ checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.107",
  "synstructure",
 ]
 
diff --git a/distance-oracle/Cargo.toml b/distance-oracle/Cargo.toml
index 5f0b626ebd1a9eef6f09ee1e1889a7842b272b81..60240d9f20bb33b4802b57cb25b972a6b2a346fb 100644
--- a/distance-oracle/Cargo.toml
+++ b/distance-oracle/Cargo.toml
@@ -11,11 +11,15 @@ sp-distance = { path = "../primitives/distance" }
 
 codec = { package = "parity-scale-codec", version = "3.1.5" }
 fnv = "1.0.7"
+log = "0.4.17"
 num-traits = "0.2.15"
 rayon = "1.7.0"
+simple_logger = "4.2.0"
 sp-core = { git = "https://github.com/duniter/substrate.git", branch = "duniter-substrate-v0.9.32" }
 sp-runtime = { git = "https://github.com/duniter/substrate.git", branch = "duniter-substrate-v0.9.32" }
 subxt = { git = 'https://github.com/duniter/subxt.git', branch = "duniter-substrate-v0.9.32" }
+time = "<=0.3.23"# required for MSRV
+time-macros = "=0.2.10"
 
 # standalone only
 clap = { version = "4.0", features = ["derive"], optional = true }
diff --git a/distance-oracle/src/api.rs b/distance-oracle/src/api.rs
index 0b007090dffb6a637163b88f1f8bca178ead3a4f..3af39b736d557280609b320c0fbb44c709d9277f 100644
--- a/distance-oracle/src/api.rs
+++ b/distance-oracle/src/api.rs
@@ -35,7 +35,9 @@ pub type EvaluationPool<AccountId, IdtyIndex> = (
 );
 
 pub async fn client(rpc_url: String) -> Client {
-    Client::from_url(rpc_url).await.unwrap()
+    Client::from_url(rpc_url)
+        .await
+        .expect("Cannot create RPC client")
 }
 
 pub async fn parent_hash(client: &Client) -> H256 {
@@ -43,8 +45,8 @@ pub async fn parent_hash(client: &Client) -> H256 {
         .storage()
         .fetch(&runtime::storage().system().parent_hash(), None)
         .await
-        .unwrap()
-        .unwrap()
+        .expect("Cannot fetch parent hash")
+        .expect("Parent hash is None")
 }
 
 pub async fn current_session(client: &Client, parent_hash: H256) -> u32 {
@@ -55,7 +57,7 @@ pub async fn current_session(client: &Client, parent_hash: H256) -> u32 {
             Some(parent_hash),
         )
         .await
-        .unwrap()
+        .expect("Cannot fetch current session")
         .unwrap_or_default()
 }
 
@@ -76,7 +78,7 @@ pub async fn current_pool(
             Some(parent_hash),
         )
         .await
-        .unwrap()
+        .expect("Cannot fetch current pool")
 }
 
 pub async fn evaluation_block(client: &Client, parent_hash: H256) -> H256 {
@@ -87,8 +89,8 @@ pub async fn evaluation_block(client: &Client, parent_hash: H256) -> H256 {
             Some(parent_hash),
         )
         .await
-        .unwrap()
-        .unwrap()
+        .expect("Cannot fetch evaluation block")
+        .expect("No evaluation block")
 }
 
 pub async fn member_iter(client: &Client, evaluation_block: H256) -> MemberIter {
@@ -101,7 +103,7 @@ pub async fn member_iter(client: &Client, evaluation_block: H256) -> MemberIter
                 Some(evaluation_block),
             )
             .await
-            .unwrap(),
+            .expect("Cannot fetch memberships"),
     )
 }
 
@@ -135,7 +137,7 @@ pub async fn cert_iter(client: &Client, evaluation_block: H256) -> CertIter {
                 Some(evaluation_block),
             )
             .await
-            .unwrap(),
+            .expect("Cannot fetch certifications"),
     )
 }
 
diff --git a/distance-oracle/src/lib.rs b/distance-oracle/src/lib.rs
index dc5c78b95fe42250fd8bead1f1832ad332fc5923..d169c4f7a41b92010b967d7f562797fff70f5707 100644
--- a/distance-oracle/src/lib.rs
+++ b/distance-oracle/src/lib.rs
@@ -28,6 +28,7 @@ use api::{AccountId, IdtyIndex};
 
 use codec::Encode;
 use fnv::{FnvHashMap, FnvHashSet};
+use log::{debug, error, warn};
 use rayon::iter::IntoParallelRefIterator;
 use rayon::iter::ParallelIterator;
 use std::io::Write;
@@ -93,8 +94,12 @@ pub async fn run_and_save(client: &api::Client, settings: Settings) {
     let mut evaluation_result_file = std::fs::OpenOptions::new()
         .write(true)
         .create_new(true)
-        .open(evaluation_result_path)
-        .unwrap();
+        .open(&evaluation_result_path)
+        .unwrap_or_else(|e| {
+            panic!(
+                "Cannot open distance evaluation result file `{evaluation_result_path:?}`: {e:?}"
+            )
+        });
     evaluation_result_file
         .write_all(
             &sp_distance::ComputationResult {
@@ -102,11 +107,25 @@ pub async fn run_and_save(client: &api::Client, settings: Settings) {
             }
             .encode(),
         )
-        .unwrap();
+        .unwrap_or_else(|e| {
+            panic!(
+                "Cannot write distance evaluation result to file `{evaluation_result_path:?}`: {e:?}"
+            )
+        });
 
     // Remove old results
     let mut files_to_remove = Vec::new();
-    for entry in settings.evaluation_result_dir.read_dir().unwrap().flatten() {
+    for entry in settings
+        .evaluation_result_dir
+        .read_dir()
+        .unwrap_or_else(|e| {
+            panic!(
+                "Cannot read distance evaluation result directory `{0:?}`: {e:?}",
+                settings.evaluation_result_dir
+            )
+        })
+        .flatten()
+    {
         if let Ok(entry_name) = entry.file_name().into_string() {
             if let Ok(entry_session) = entry_name.parse::<isize>() {
                 if current_session as isize - entry_session > 3 {
@@ -116,13 +135,12 @@ pub async fn run_and_save(client: &api::Client, settings: Settings) {
         }
     }
     files_to_remove.into_iter().for_each(|f| {
-        std::fs::remove_file(&f).unwrap_or_else(move |e| {
-            eprintln!("Warning: Cannot remove old result file `{f:?}`: {e:?}")
-        });
+        std::fs::remove_file(&f)
+            .unwrap_or_else(move |e| warn!("Cannot remove old result file `{f:?}`: {e:?}"));
     });
 }
 
-/// Returns `(evaluation, current_session, evaluation_result_path)`
+/// Returns `Option<(evaluation, current_session, evaluation_result_path)>`
 pub async fn run(
     client: &api::Client,
     settings: &Settings,
@@ -135,13 +153,13 @@ pub async fn run(
     // Fetch the pending identities
     let Some(evaluation_pool) = api::current_pool(client, parent_hash, current_session).await
          else {
-            println!("Pool does not exist");
+            debug!("Nothing to do: Pool does not exist");
             return None
         };
 
     // Stop if nothing to evaluate
     if evaluation_pool.0 .0.is_empty() {
-        println!("Pool is empty");
+        debug!("Nothing to do: Pool is empty");
         return None;
     }
 
@@ -152,11 +170,16 @@ pub async fn run(
     if handle_fs {
         // Stop if already evaluated
         if evaluation_result_path.try_exists().unwrap() {
-            println!("File already exists");
+            debug!("Nothing to do: File already exists");
             return None;
         }
 
-        std::fs::create_dir_all(&settings.evaluation_result_dir).unwrap();
+        std::fs::create_dir_all(&settings.evaluation_result_dir).unwrap_or_else(|e| {
+            error!(
+                "Cannot create distance evaluation result directory `{0:?}`: {e:?}",
+                settings.evaluation_result_dir
+            );
+        });
     }
 
     let evaluation_block = api::evaluation_block(client, parent_hash).await;
@@ -177,7 +200,11 @@ pub async fn run(
     let mut received_certs = FnvHashMap::<IdtyIndex, Vec<IdtyIndex>>::default();
 
     let mut certs_iter = api::cert_iter(client, evaluation_block).await;
-    while let Some((receiver, issuers)) = certs_iter.next().await.unwrap() {
+    while let Some((receiver, issuers)) = certs_iter
+        .next()
+        .await
+        .expect("Cannot fetch next certification")
+    {
         if (issuers.len() as u32) < min_certs_for_referee {
             // This member is not referee
             members.remove(&receiver);
@@ -256,7 +283,7 @@ fn distance_rule_recursive(
     }
 }
 
-/// Returns `(nb_accessible_referees, nb_referees)`
+/// Returns the fraction `nb_accessible_referees / nb_referees`
 fn distance_rule(
     received_certs: &FnvHashMap<IdtyIndex, Vec<IdtyIndex>>,
     referees: &FnvHashMap<IdtyIndex, u32>,
diff --git a/distance-oracle/src/main.rs b/distance-oracle/src/main.rs
index 9d1c62340a0b9f13f5c81031970a089f826e2cf0..d60668e87fa145b1da53fcf60d5f38a007eaf8cd 100644
--- a/distance-oracle/src/main.rs
+++ b/distance-oracle/src/main.rs
@@ -25,12 +25,20 @@ struct Cli {
     max_depth: u32,
     #[clap(short = 'u', long, default_value = "ws://127.0.0.1:9944")]
     rpc_url: String,
+    /// Log level (off, error, warn, info, debug, trace)
+    #[clap(short = 'l', long, default_value = "info")]
+    log: log::LevelFilter,
 }
 
 #[tokio::main]
 async fn main() {
     let cli = Cli::parse();
 
+    simple_logger::SimpleLogger::new()
+        .with_level(cli.log)
+        .init()
+        .unwrap();
+
     distance_oracle::run_and_save(
         &distance_oracle::api::client(cli.rpc_url.clone()).await,
         distance_oracle::Settings {
diff --git a/pallets/distance/src/lib.rs b/pallets/distance/src/lib.rs
index ee67728832a2967ca5897c584e25b826ac7747da..b9720a57f98fd4b9bcfcb81303d7a94134e7a7df 100644
--- a/pallets/distance/src/lib.rs
+++ b/pallets/distance/src/lib.rs
@@ -74,6 +74,7 @@ pub mod pallet {
 
     // STORAGE //
 
+    /// Identities queued for distance evaluation
     #[pallet::storage]
     #[pallet::getter(fn evaluation_pool_0)]
     pub type EvaluationPool0<T: Config<I>, I: 'static = ()> = StorageValue<
@@ -86,6 +87,7 @@ pub mod pallet {
         >,
         ValueQuery,
     >;
+    /// Identities queued for distance evaluation
     #[pallet::storage]
     #[pallet::getter(fn evaluation_pool_1)]
     pub type EvaluationPool1<T: Config<I>, I: 'static = ()> = StorageValue<
@@ -98,6 +100,7 @@ pub mod pallet {
         >,
         ValueQuery,
     >;
+    /// Identities queued for distance evaluation
     #[pallet::storage]
     #[pallet::getter(fn evaluation_pool_2)]
     pub type EvaluationPool2<T: Config<I>, I: 'static = ()> = StorageValue<
@@ -116,6 +119,7 @@ pub mod pallet {
     pub type EvaluationBlock<T: Config<I>, I: 'static = ()> =
         StorageValue<_, <T as frame_system::Config>::Hash, ValueQuery>;
 
+    /// Distance evaluation status by identity
     #[pallet::storage]
     #[pallet::getter(fn identity_distance_status)]
     pub type IdentityDistanceStatus<T: Config<I>, I: 'static = ()> = StorageMap<
diff --git a/primitives/distance/Cargo.toml b/primitives/distance/Cargo.toml
index f8ff3e5f3cfc1a3ef65422f5553517f6cc13ef6a..6ee9db25137aa63893a43fbea10b8746c40c319f 100644
--- a/primitives/distance/Cargo.toml
+++ b/primitives/distance/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-authors = ['librelois <c@elo.tf>']
+authors = ['tuxmain <tuxmain@zettascript.org>']
 description = 'primitives for pallet distance.'
 edition = "2021"
 homepage = 'https://duniter.org'