From 663eaa1c0b594a0823f1248c487dc177153eaa76 Mon Sep 17 00:00:00 2001
From: librelois <c@elo.tf>
Date: Thu, 6 May 2021 00:26:12 +0200
Subject: [PATCH] [ref] externalyze gva configuration

---
 Cargo.lock                                    | 341 ++++++++++++++++--
 Cargo.toml                                    |  18 +-
 app/lib/common-libs/programOptions.ts         |   2 -
 app/lib/dal/fileDAL.ts                        |   1 -
 app/lib/dto/ConfDTO.ts                        |  14 -
 doc/use/configure.md                          |  35 +-
 neon/native/Cargo.toml                        |   2 +-
 neon/native/server.d.ts                       |   2 +-
 neon/native/src/server.rs                     |   7 +-
 rust-bins/duniter-cli/src/config.rs           |   4 +-
 rust-bins/duniter-cli/src/duniter_ts_args.rs  |   3 +-
 rust-bins/duniter-cli/src/main.rs             | 102 +++---
 rust-bins/duniter-cli/src/wizard_gva.rs       | 235 ------------
 rust-bins/duniter-dbex/Cargo.toml             |   2 +-
 rust-libs/duniter-server/Cargo.toml           |   4 +-
 rust-libs/duniter-server/src/legacy/dunp.rs   |   6 +-
 rust-libs/duniter-server/src/lib.rs           |  36 +-
 .../duniter-integration-tests/Cargo.toml      |   2 +-
 .../duniter-integration-tests/src/lib.rs      |   3 +-
 19 files changed, 428 insertions(+), 391 deletions(-)
 delete mode 100644 rust-bins/duniter-cli/src/wizard_gva.rs

diff --git a/Cargo.lock b/Cargo.lock
index 02308ce7a..697e79232 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -114,7 +114,7 @@ checksum = "6fd4c2eb837e894909fe13509f2351fa3990c114426e41255936800892ccbe26"
 dependencies = [
  "Inflector",
  "async-graphql-parser",
- "darling",
+ "darling 0.12.4",
  "proc-macro-crate",
  "proc-macro2",
  "quote",
@@ -600,14 +600,38 @@ dependencies = [
  "snafu",
 ]
 
+[[package]]
+name = "darling"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+dependencies = [
+ "darling_core 0.10.2",
+ "darling_macro 0.10.2",
+]
+
 [[package]]
 name = "darling"
 version = "0.12.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c"
 dependencies = [
- "darling_core",
- "darling_macro",
+ "darling_core 0.12.4",
+ "darling_macro 0.12.4",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim 0.9.3",
+ "syn",
 ]
 
 [[package]]
@@ -624,13 +648,66 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "darling_macro"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+dependencies = [
+ "darling_core 0.10.2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "darling_macro"
 version = "0.12.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a"
 dependencies = [
- "darling_core",
+ "darling_core 0.12.4",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57"
+
+[[package]]
+name = "derivative"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_builder"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0"
+dependencies = [
+ "darling 0.10.2",
+ "derive_builder_core",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_builder_core"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef"
+dependencies = [
+ "darling 0.10.2",
+ "proc-macro2",
  "quote",
  "syn",
 ]
@@ -685,6 +762,18 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "dns-lookup"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb4c5ce3a7034c5eb66720bb16e9ac820e01b29032ddc06dd0fe47072acf7454"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "socket2",
+ "winapi",
+]
+
 [[package]]
 name = "doc-comment"
 version = "0.3.3"
@@ -693,9 +782,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
 
 [[package]]
 name = "dubp"
-version = "0.51.1"
+version = "0.53.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "914faa8052c72c8b2f513a44398123379d70a59dfedf0aa8dc7b581ee223fbfc"
+checksum = "a5cee825e59cde21a3622de781d15f74cbea92f01eb1554a8c73818eb61a5998"
 dependencies = [
  "dubp-block",
  "dubp-common",
@@ -707,9 +796,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-block"
-version = "0.51.1"
+version = "0.53.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15cc90473a86c4987ea34211829d491dfb56f7c09ba79ac3d57d9430782d038"
+checksum = "f4b26027dafcf4631bd7d7a2b1b25e54453c475a613b5ef7db4356f51f71c0eb"
 dependencies = [
  "dubp-documents",
  "dubp-documents-parser",
@@ -722,9 +811,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-common"
-version = "0.51.1"
+version = "0.53.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3a5a6cc11940e0a85f492325fec45c557c5f103c92ea445427b4272c1a12395"
+checksum = "2dc000f2a3366c1bd985015f95adb3520e8e0b007ca5f77882eea1ea119d84f4"
 dependencies = [
  "dup-crypto",
  "serde",
@@ -735,9 +824,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents"
-version = "0.51.1"
+version = "0.53.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85d43233426a5a24a5d22e98da2d8f0efab9739a58af15fa27e74a213b2d5bb9"
+checksum = "6e96808a8ced0617ba93ed6fee00d88902f33e2f61a36ec9a841e8972ef5cd3a"
 dependencies = [
  "beef",
  "dubp-wallet",
@@ -749,9 +838,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents-parser"
-version = "0.51.1"
+version = "0.53.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac382364d99af3c235530f9de41a1833d18a16dff8833a7b351e8946d378de18"
+checksum = "a9c60f5c2804a9906777f96a62514c1f9f58abaab4c57f01db4fa7c45624e6fb"
 dependencies = [
  "dubp-documents",
  "json-pest-parser",
@@ -763,9 +852,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-wallet"
-version = "0.51.1"
+version = "0.53.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47cc059e6b139def809f9d0bf776a21f5c2d59fefc20ed30c7aceedfef8de703"
+checksum = "f277bed6bc228981f76f207f4112051656302b5c50c0a858ab138ae2215d49fe"
 dependencies = [
  "byteorder",
  "dubp-common",
@@ -778,7 +867,7 @@ dependencies = [
 [[package]]
 name = "dubp-wot"
 version = "0.11.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "log",
  "rayon",
@@ -788,7 +877,7 @@ dependencies = [
 [[package]]
 name = "duniter-bc-reader"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "anyhow",
  "dubp",
@@ -799,7 +888,7 @@ dependencies = [
 [[package]]
 name = "duniter-bca"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#7c1f8e58872fe2931f780c9b5e6b80caa3f3683a"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
 dependencies = [
  "anyhow",
  "arrayvec",
@@ -822,7 +911,7 @@ dependencies = [
 [[package]]
 name = "duniter-bca-types"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#7c1f8e58872fe2931f780c9b5e6b80caa3f3683a"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
 dependencies = [
  "arrayvec",
  "bincode",
@@ -840,6 +929,8 @@ dependencies = [
  "ctrlc",
  "daemonize-me",
  "dirs",
+ "duniter-core",
+ "duniter-gva-conf",
  "log",
  "logwatcher",
  "nix 0.17.0",
@@ -852,16 +943,20 @@ dependencies = [
 [[package]]
 name = "duniter-conf"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
+ "anyhow",
  "dubp",
+ "envy",
+ "futures-util",
  "serde",
+ "serde_json",
 ]
 
 [[package]]
 name = "duniter-core"
 version = "1.8.1"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "duniter-bc-reader",
  "duniter-conf",
@@ -898,7 +993,7 @@ dependencies = [
 [[package]]
 name = "duniter-dbs"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "arrayvec",
  "bincode",
@@ -909,7 +1004,7 @@ dependencies = [
  "log",
  "parking_lot",
  "paste",
- "rand 0.7.3",
+ "rand 0.8.3",
  "serde",
  "serde_json",
  "smallvec",
@@ -921,7 +1016,7 @@ dependencies = [
 [[package]]
 name = "duniter-dbs-write-ops"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "chrono",
  "dubp",
@@ -936,7 +1031,7 @@ dependencies = [
 [[package]]
 name = "duniter-global"
 version = "1.8.1"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "async-rwlock",
  "dubp",
@@ -949,7 +1044,7 @@ dependencies = [
 [[package]]
 name = "duniter-gva"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#7c1f8e58872fe2931f780c9b5e6b80caa3f3683a"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
 dependencies = [
  "anyhow",
  "arrayvec",
@@ -960,6 +1055,7 @@ dependencies = [
  "dubp",
  "duniter-bca",
  "duniter-core",
+ "duniter-gva-conf",
  "duniter-gva-db",
  "duniter-gva-dbs-reader",
  "duniter-gva-gql",
@@ -976,10 +1072,22 @@ dependencies = [
  "warp",
 ]
 
+[[package]]
+name = "duniter-gva-conf"
+version = "0.1.0"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
+dependencies = [
+ "anyhow",
+ "duniter-core",
+ "read_input",
+ "serde",
+ "structopt",
+]
+
 [[package]]
 name = "duniter-gva-db"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#7c1f8e58872fe2931f780c9b5e6b80caa3f3683a"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
 dependencies = [
  "bincode",
  "chrono",
@@ -996,7 +1104,7 @@ dependencies = [
 [[package]]
 name = "duniter-gva-dbs-reader"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#7c1f8e58872fe2931f780c9b5e6b80caa3f3683a"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
 dependencies = [
  "anyhow",
  "arrayvec",
@@ -1010,7 +1118,7 @@ dependencies = [
 [[package]]
 name = "duniter-gva-gql"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#7c1f8e58872fe2931f780c9b5e6b80caa3f3683a"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
 dependencies = [
  "anyhow",
  "arrayvec",
@@ -1031,7 +1139,7 @@ dependencies = [
 [[package]]
 name = "duniter-gva-indexer"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#7c1f8e58872fe2931f780c9b5e6b80caa3f3683a"
+source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#838d817ab042e2331194b91a36ccad18a829a88a"
 dependencies = [
  "anyhow",
  "dubp",
@@ -1060,7 +1168,7 @@ dependencies = [
 [[package]]
 name = "duniter-mempools"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "dubp",
  "duniter-bc-reader",
@@ -1073,9 +1181,10 @@ dependencies = [
 [[package]]
 name = "duniter-module"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "anyhow",
+ "async-mutex",
  "async-trait",
  "dubp",
  "duniter-conf",
@@ -1083,7 +1192,10 @@ dependencies = [
  "duniter-global",
  "duniter-mempools",
  "fast-threadpool",
+ "futures-util",
  "log",
+ "public-ip",
+ "serde",
 ]
 
 [[package]]
@@ -1124,9 +1236,9 @@ dependencies = [
 
 [[package]]
 name = "dup-crypto"
-version = "0.51.1"
+version = "0.53.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3b8d3e1c65e3ed89db6973e807e9c355c8f9078866402e695a16683f1e226d2"
+checksum = "1c530e25cc0a03ae36229401ca322002931b55fc180e6001bdab20a9087f297c"
 dependencies = [
  "base64",
  "blake3",
@@ -1134,6 +1246,7 @@ dependencies = [
  "byteorder",
  "cryptoxide",
  "getrandom 0.2.2",
+ "hex",
  "ring",
  "serde",
  "thiserror",
@@ -1156,6 +1269,24 @@ dependencies = [
  "cfg-if 1.0.0",
 ]
 
+[[package]]
+name = "endian-type"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
+
+[[package]]
+name = "enum-as-inner"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "envmnt"
 version = "0.8.4"
@@ -1166,6 +1297,15 @@ dependencies = [
  "indexmap",
 ]
 
+[[package]]
+name = "envy"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "error-chain"
 version = "0.12.4"
@@ -1512,6 +1652,12 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
 [[package]]
 name = "http"
 version = "0.2.4"
@@ -1570,6 +1716,21 @@ dependencies = [
  "want",
 ]
 
+[[package]]
+name = "hyper-system-resolver"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12f3e7696766b62825bf735a1df9d8b727525b83ae5427ee955258800858bd73"
+dependencies = [
+ "derivative",
+ "derive_builder",
+ "dns-lookup",
+ "hyper",
+ "tokio",
+ "tower-service",
+ "tracing",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -1615,6 +1776,12 @@ dependencies = [
  "cfg-if 1.0.0",
 ]
 
+[[package]]
+name = "ipnet"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135"
+
 [[package]]
 name = "itertools"
 version = "0.9.0"
@@ -1663,7 +1830,7 @@ dependencies = [
 [[package]]
 name = "kv_typed"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#f9abadd0145d848ba4df2ab545639355c7f20386"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#06f484b17a8336ec908ef423f32cbd0a5a0f16f5"
 dependencies = [
  "byteorder",
  "cfg-if 0.1.10",
@@ -1920,6 +2087,15 @@ version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ab250442c86f1850815b5d268639dff018c0627022bc1940eb2d642ca1ce12f0"
 
+[[package]]
+name = "nibble_vec"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43"
+dependencies = [
+ "smallvec",
+]
+
 [[package]]
 name = "nix"
 version = "0.17.0"
@@ -2225,6 +2401,26 @@ dependencies = [
  "unicode-xid",
 ]
 
+[[package]]
+name = "public-ip"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba5e48e5087711724b4536dfe11a201a20ae91a7f1b08e3e17a1053459e20580"
+dependencies = [
+ "dns-lookup",
+ "futures-core",
+ "futures-util",
+ "http",
+ "hyper",
+ "hyper-system-resolver",
+ "pin-project-lite",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "trust-dns-client",
+ "trust-dns-proto",
+]
+
 [[package]]
 name = "quick-error"
 version = "1.2.3"
@@ -2240,6 +2436,16 @@ dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "radix_trie"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd"
+dependencies = [
+ "endian-type",
+ "nibble_vec",
+]
+
 [[package]]
 name = "rand"
 version = "0.7.3"
@@ -2717,6 +2923,12 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
 
+[[package]]
+name = "strsim"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
+
 [[package]]
 name = "strsim"
 version = "0.10.0"
@@ -2972,9 +3184,21 @@ dependencies = [
  "cfg-if 1.0.0",
  "log",
  "pin-project-lite",
+ "tracing-attributes",
  "tracing-core",
 ]
 
+[[package]]
+name = "tracing-attributes"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "tracing-core"
 version = "0.1.17"
@@ -2984,6 +3208,51 @@ dependencies = [
  "lazy_static",
 ]
 
+[[package]]
+name = "trust-dns-client"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f557e7009d16747a0363f9127588c3c236f279b4caa1177d703221a258dd3f3"
+dependencies = [
+ "cfg-if 1.0.0",
+ "chrono",
+ "data-encoding",
+ "futures-channel",
+ "futures-util",
+ "lazy_static",
+ "log",
+ "radix_trie",
+ "rand 0.8.3",
+ "thiserror",
+ "tokio",
+ "trust-dns-proto",
+]
+
+[[package]]
+name = "trust-dns-proto"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "952a078337565ba39007de99b151770f41039253a31846f0a3d5cd5a4ac8eedf"
+dependencies = [
+ "async-trait",
+ "cfg-if 1.0.0",
+ "data-encoding",
+ "enum-as-inner",
+ "futures-channel",
+ "futures-io",
+ "futures-util",
+ "idna",
+ "ipnet",
+ "lazy_static",
+ "log",
+ "rand 0.8.3",
+ "smallvec",
+ "thiserror",
+ "tinyvec",
+ "tokio",
+ "url",
+]
+
 [[package]]
 name = "try-lock"
 version = "0.2.3"
diff --git a/Cargo.toml b/Cargo.toml
index a73d885fc..03ce6084a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,8 +1,8 @@
 [package]
 authors = ["elois <elois@duniter.org>"]
-description = "Duniter launcher."
+description = "Duniter cli."
 edition = "2018"
-keywords = ["duniter", "launcher"]
+keywords = ["duniter"]
 license = "AGPL-3.0"
 name = "duniter-cli"
 repository = "https://git.duniter.org/nodes/typescript/duniter"
@@ -18,6 +18,8 @@ anyhow = "1.0.32"
 ctrlc = "3.1.6"
 daemonize-me = "0.3.1"
 dirs = "3.0.1"
+duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["bc-writer"] }
+duniter-gva-conf = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva", optional = true }
 log = "0.4.11"
 logwatcher = "0.1.1"
 nix = "0.17.0"
@@ -28,6 +30,11 @@ structopt = "0.3.18"
 [dev-dependencies]
 rusty-hook = "0.11.2"
 
+[features]
+default = ["gva"]
+
+gva = ["duniter-gva-conf"]
+
 [workspace]
 members = [
     "neon/native",
@@ -37,9 +44,14 @@ members = [
     "rust-libs/tests/duniter-integration-tests",
 ]
 
+[patch.'https://git.duniter.org/nodes/rust/duniter-core']
+#duniter-core = { path = "../duniter-core" }
+
+[patch.'https://git.duniter.org/nodes/rust/modules/duniter-gva']
+#duniter-gva = { path = "../duniter-gva" }
+
 [patch.crates-io]
 #dubp = { git = "https://git.duniter.org/libs/dubp-rs-libs" }
-
 #dubp = { path = "../dubp-rs-libs" }
 
 #leveldb_minimal = { path = "../../../../rust/leveldb_minimal" }
diff --git a/app/lib/common-libs/programOptions.ts b/app/lib/common-libs/programOptions.ts
index 6ec4f1bb0..5842b8398 100644
--- a/app/lib/common-libs/programOptions.ts
+++ b/app/lib/common-libs/programOptions.ts
@@ -28,8 +28,6 @@ export interface ProgramOptions {
   loglevel?: string;
   sqlTraces?: boolean;
   memory?: boolean;
-  gva?: boolean;
-  noGva?: boolean;
 }
 
 export const cliprogram: ProgramOptions = {
diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts
index 423c07f66..204cc1b47 100644
--- a/app/lib/dal/fileDAL.ts
+++ b/app/lib/dal/fileDAL.ts
@@ -247,7 +247,6 @@ export class FileDAL implements ServerDAO {
     let rustServerConf = {
       command: commandName,
       currency: currency || "",
-      gva: conf.gva,
       selfKeypair,
       txsMempoolSize:
         conf.txsMempoolSize || constants.SANDBOX_SIZE_TRANSACTIONS,
diff --git a/app/lib/dto/ConfDTO.ts b/app/lib/dto/ConfDTO.ts
index 534234e19..83bc1240d 100644
--- a/app/lib/dto/ConfDTO.ts
+++ b/app/lib/dto/ConfDTO.ts
@@ -180,20 +180,6 @@ export class ConfDTO
     public bmaWithCrawler: boolean,
     public nonWoTPeersLimit: number,
     public proxiesConf: ProxiesConf | undefined,
-    public gva?: {
-      enabled: boolean;
-      ip4?: string;
-      ip6?: string;
-      port?: number;
-      path?: string;
-      subscriptionsPath?: string;
-      remoteHost?: string;
-      remotePort?: number;
-      remotePath?: string;
-      remoteSubscriptionsPath?: string;
-      remoteTls?: boolean;
-      whitelist?: string[];
-    },
     public ws2p?: {
       privateAccess?: boolean;
       publicAccess?: boolean;
diff --git a/doc/use/configure.md b/doc/use/configure.md
index 5c29a8e4b..82db20444 100644
--- a/doc/use/configure.md
+++ b/doc/use/configure.md
@@ -183,28 +183,37 @@ This mode is optional if only because technically it is sometimes difficult or e
 
 ### Configuring GVA
 
-GVA is still disabled by default, to enable it you need to use wizard command:
+GVA is still disabled by default, to enable it you have 2 choices:
 
-`duniter wizard gva`
+- Use command `duniter gva configure`, you will be invited to configure GVA interactively.
+- Set environment variable `DUNITER_GVA_ENABLED="true"`
 
 It is also possible to manually edit `conf.json` file :
 
-| parameter | type | default value |
-|:-:|:-:|:-:|
-| ip4 | IPv4 | `"127.0.0.1"` |
-| ip6 | IPv6 | `"::1"` |
-| port | number |  `30901` |
-| path | string |  `"gva"` |
-| remotePath | string | `"gva"` |
-| subscriptionsPath | string |  `"gva-sub"` |
-| remoteSubscriptionsPath | string | `"gva-sub"` |
-| remoteTls | boolean |  `false` |
-| whitelist | IP[] |  `["127.0.0.1", "::1"]` |
+| parameter | type | mandatory | default value |
+|:-:|:-:|:-:|:-:|
+| enabled | boolean | yes | `true` |
+| ip4 | IPv4 | yes | `"0.0.0.0"` |
+| ip6 | IPv6 | no | `"::"` |
+| port | number | yes | `30901` |
+| path | string | yes | `"gva"` |
+| remoteHost | string | no | - |
+| remotePath | string | no | `"gva"` |
+| subscriptionsPath | string | no |  `"gva-sub"` |
+| remoteSubscriptionsPath | string | no | `"gva-sub"` |
+| remoteTls | boolean | no |  `false` |
+| whitelist | IP[] | no |  `["127.0.0.1", "::1"]` |
 
 GVA server listen to `http://<ip4|ip6>:<port>/<remotePath>`
 
 GVA subscriptions websocket server listen to `ws://<ip4|ip6>:<port>/<remoteSubscriptionsPath>`
 
+Each parameter can be redefined by the environment variable of the parameter name in uppercase prefixed by `DUNITER_GVA_`.
+
+For example, the `remotePath` parameter can be redefined by the `DUNITER_GVA_REMOTE_PATH` environment variable.
+
+Environment variables are only taken into account if all mandatory parameters are defined by environment variables.
+
 ## Synchronize your node
 
 To join the network of a currency you must synchronize with a node already on this network:
diff --git a/neon/native/Cargo.toml b/neon/native/Cargo.toml
index c0de6dee9..9a5eef1bf 100644
--- a/neon/native/Cargo.toml
+++ b/neon/native/Cargo.toml
@@ -17,7 +17,7 @@ neon-build = "0.4.0"
 [dependencies]
 bincode = "1.2.1"
 bs58 = "0.3.0"
-dubp = { version = "0.51.0", features = ["duniter"] }
+dubp = { version = "0.53.1", features = ["duniter"] }
 dubp-wot = { git = "https://git.duniter.org/nodes/rust/duniter-core" }
 duniter-server = { path = "../../rust-libs/duniter-server" }
 flate2 = "1.0.16"
diff --git a/neon/native/server.d.ts b/neon/native/server.d.ts
index c65a605b1..a75d2334e 100644
--- a/neon/native/server.d.ts
+++ b/neon/native/server.d.ts
@@ -35,6 +35,7 @@ export class BlockDTOV10 {
 }
 
 export class GvaConf {
+    enabled: boolean;
     ip4?: string
     ip6?: string
     port?: number
@@ -84,7 +85,6 @@ export class RustDbTx {
 export class RustServerConf {
     command: string | null
     currency: string
-    gva: GvaConf | undefined
     selfKeypair: string | null
     txsMempoolSize: number
 }
diff --git a/neon/native/src/server.rs b/neon/native/src/server.rs
index b159b807e..881b5bc1a 100644
--- a/neon/native/src/server.rs
+++ b/neon/native/src/server.rs
@@ -21,7 +21,7 @@ use dubp::documents::{
 };
 use dubp::documents_parser::prelude::*;
 use dubp::{common::crypto::hashs::Hash, crypto::keys::ed25519::Ed25519KeyPair};
-use duniter_server::{DuniterConf, DuniterMode, DuniterServer, GvaConf};
+use duniter_server::{DuniterCoreConf, DuniterMode, DuniterServer};
 use neon::declare_types;
 use neon::prelude::*;
 use serde::{Deserialize, Serialize};
@@ -39,7 +39,6 @@ declare_types! {
 
             let rust_server_conf_stringified: RustServerConfStringified = neon_serde::from_value(&mut cx, rust_server_conf_js)?;
 
-            let gva_conf = rust_server_conf_stringified.gva;
             let currency = rust_server_conf_stringified.currency;
             let self_key_pair = if let Some(self_keypair_str) = rust_server_conf_stringified.self_keypair {
                 into_neon_res(&mut cx, crate::crypto::keypair_from_expanded_base58_secret_key(&self_keypair_str))?
@@ -47,8 +46,7 @@ declare_types! {
                 Ed25519KeyPair::generate_random().expect("fail to gen random keyypair")
             };
             let txs_mempool_size = rust_server_conf_stringified.txs_mempool_size as usize;
-            let conf = DuniterConf {
-                gva: gva_conf,
+            let conf = DuniterCoreConf {
                 self_key_pair,
                 txs_mempool_size
             };
@@ -475,7 +473,6 @@ pub struct PeerCardStringified {
 #[serde(rename_all = "camelCase")]
 struct RustServerConfStringified {
     currency: String,
-    gva: Option<GvaConf>,
     self_keypair: Option<String>,
     txs_mempool_size: u32,
 }
diff --git a/rust-bins/duniter-cli/src/config.rs b/rust-bins/duniter-cli/src/config.rs
index 25acdd272..40c21bc05 100644
--- a/rust-bins/duniter-cli/src/config.rs
+++ b/rust-bins/duniter-cli/src/config.rs
@@ -34,7 +34,7 @@ impl FromStr for Percent {
 }
 
 #[derive(StructOpt)]
-pub(crate) struct DuniterConfigArgs {
+pub(crate) struct DuniterCoreConfigArgs {
     /// Percent of CPU usage for proof-of-work computation
     #[structopt(long)]
     cpu: Option<Percent>,
@@ -153,7 +153,7 @@ pub(crate) struct DuniterConfigArgs {
     force_tor: bool,
 }
 
-pub(crate) fn gen_args(args: &DuniterConfigArgs, duniter_js_args: &mut Vec<String>) {
+pub(crate) fn gen_args(args: &DuniterCoreConfigArgs, duniter_js_args: &mut Vec<String>) {
     if let Some(Percent(cpu_percent)) = args.cpu {
         duniter_js_args.push("--cpu".into());
         duniter_js_args.push(cpu_percent.to_string());
diff --git a/rust-bins/duniter-cli/src/duniter_ts_args.rs b/rust-bins/duniter-cli/src/duniter_ts_args.rs
index ff76068a9..1c2f8aa37 100644
--- a/rust-bins/duniter-cli/src/duniter_ts_args.rs
+++ b/rust-bins/duniter-cli/src/duniter_ts_args.rs
@@ -76,6 +76,8 @@ pub(crate) fn gen_duniter_ts_args(args: &DuniterArgs, duniter_js_exe: String) ->
             gen_start_args(start_args, &mut duniter_ts_args);
             gen_webstart_args(webstart_args, &mut duniter_ts_args);
         }
+        #[cfg(feature = "gva")]
+        DuniterCommand::Gva(_) => unreachable!(),
         DuniterCommand::Start(ref start_args) => {
             duniter_ts_args.push("direct_start".to_owned());
             gen_start_args(start_args, &mut duniter_ts_args);
@@ -126,7 +128,6 @@ pub(crate) fn gen_duniter_ts_args(args: &DuniterArgs, duniter_js_exe: String) ->
                         duniter_ts_args.push(p.to_string());
                     }
                 }
-                WizardCommand::Gva { .. } => unreachable!(),
             }
         }
         DuniterCommand::WS2P(ref ws2p_command) => {
diff --git a/rust-bins/duniter-cli/src/main.rs b/rust-bins/duniter-cli/src/main.rs
index 53807347b..7554dea88 100644
--- a/rust-bins/duniter-cli/src/main.rs
+++ b/rust-bins/duniter-cli/src/main.rs
@@ -29,10 +29,11 @@ mod config;
 mod daemon;
 mod duniter_ts_args;
 mod sync;
-mod wizard_gva;
 
-use anyhow::{anyhow, Context, Result};
+use anyhow::{anyhow, Result};
 use daemonize_me::Daemon;
+#[cfg(feature = "gva")]
+use duniter_gva_conf::GvaCommand;
 use logwatcher::{LogWatcher, LogWatcherAction};
 use nix::{errno::Errno, sys::signal::Signal, unistd::Pid, Error};
 use std::{
@@ -78,7 +79,10 @@ enum DuniterCommand {
         display_order(0),
         after_help("Some advanced options are hidden for readability.")
     )]
-    Config(Box<config::DuniterConfigArgs>),
+    Config(Box<config::DuniterCoreConfigArgs>),
+    #[cfg(feature = "gva")]
+    #[structopt(display_order(1))]
+    Gva(GvaCommand),
     /// Launch the configuration wizard.
     #[structopt(display_order(1))]
     Wizard(WizardCommand),
@@ -170,8 +174,6 @@ enum WizardCommand {
         #[structopt(short)]
         p: Option<usize>,
     },
-    #[structopt(display_order(1))]
-    Gva,
     #[structopt(display_order(2), alias = "network")]
     Bma,
 }
@@ -214,54 +216,56 @@ fn main() -> Result<()> {
     } else {
         let profile_path = get_profile_path(args.profile.as_deref())?;
 
-        if let DuniterCommand::Wizard(WizardCommand::Gva) = args.command {
-            wizard_gva::wizard_gva(args.profile.as_deref(), profile_path)
-        } else {
-            let current_exe = std::env::current_exe()?;
-            let prod = current_exe == PathBuf::from(DUNITER_EXE_LINK_PATH)
-                || current_exe == PathBuf::from(DUNITER_EXE_PATH);
+        #[cfg(feature = "gva")]
+        if let DuniterCommand::Gva(gva_command) = args.command {
+            return gva_command.command(profile_path);
+        }
 
-            let duniter_ts_args = duniter_ts_args::gen_duniter_ts_args(&args, duniter_js_exe()?);
+        let current_exe = std::env::current_exe()?;
+        let prod = current_exe == PathBuf::from(DUNITER_EXE_LINK_PATH)
+            || current_exe == PathBuf::from(DUNITER_EXE_PATH);
 
-            match args.command {
-                DuniterCommand::Restart => {
-                    daemon::start(prod, &profile_path, &daemon::stop(&profile_path)?)
-                }
-                DuniterCommand::Start(_) | DuniterCommand::Webstart { .. } => {
-                    daemon::start(prod, &profile_path, &duniter_ts_args)
-                }
-                DuniterCommand::Status => daemon::status(&profile_path),
-                DuniterCommand::Stop => {
-                    daemon::stop(&profile_path)?;
-                    Ok(())
+        let duniter_ts_args = duniter_ts_args::gen_duniter_ts_args(&args, duniter_js_exe()?);
+
+        match args.command {
+            DuniterCommand::Restart => {
+                daemon::start(prod, &profile_path, &daemon::stop(&profile_path)?)
+            }
+            DuniterCommand::Start(_) | DuniterCommand::Webstart { .. } => {
+                daemon::start(prod, &profile_path, &duniter_ts_args)
+            }
+            DuniterCommand::Status => daemon::status(&profile_path),
+            DuniterCommand::Stop => {
+                daemon::stop(&profile_path)?;
+                Ok(())
+            }
+            DuniterCommand::Logs => watch_logs(profile_path),
+            _ => {
+                ctrlc::set_handler(move || {
+                    // This empty handler is necessary otherwise the Rust process is stopped immediately
+                    // without waiting for the child process (duniter_js) to finish stopping.
+                })?;
+                let mut duniter_js_command = Command::new(get_node_path()?);
+                if prod {
+                    duniter_js_command.current_dir(DUNITER_JS_CURRENT_DIR);
                 }
-                DuniterCommand::Logs => watch_logs(profile_path),
-                _ => {
-                    ctrlc::set_handler(move || {
-                        // This empty handler is necessary otherwise the Rust process is stopped immediately
-                        // without waiting for the child process (duniter_js) to finish stopping.
-                    })?;
-                    let mut duniter_js_command = Command::new(get_node_path()?);
-                    if prod {
-                        duniter_js_command.current_dir(DUNITER_JS_CURRENT_DIR);
-                    }
-                    //println!("TMP duniter_ts_args={:?}", duniter_ts_args);
-                    let mode = match args.command {
-                        DuniterCommand::DirectStart { .. }
-                        | DuniterCommand::DirectWebstart { .. } => "start",
-                        DuniterCommand::Sync(_) => "sync",
-                        _ => "other",
-                    };
-                    let exit_code_opt = duniter_js_command
-                        .args(duniter_ts_args)
-                        .env("DUNITER_MODE", mode)
-                        .status()?
-                        .code();
-                    if let Some(exit_code) = exit_code_opt {
-                        std::process::exit(exit_code);
-                    } else {
-                        Ok(())
+                //println!("TMP duniter_ts_args={:?}", duniter_ts_args);
+                let mode = match args.command {
+                    DuniterCommand::DirectStart { .. } | DuniterCommand::DirectWebstart { .. } => {
+                        "start"
                     }
+                    DuniterCommand::Sync(_) => "sync",
+                    _ => "other",
+                };
+                let exit_code_opt = duniter_js_command
+                    .args(duniter_ts_args)
+                    .env("DUNITER_MODE", mode)
+                    .status()?
+                    .code();
+                if let Some(exit_code) = exit_code_opt {
+                    std::process::exit(exit_code);
+                } else {
+                    Ok(())
                 }
             }
         }
diff --git a/rust-bins/duniter-cli/src/wizard_gva.rs b/rust-bins/duniter-cli/src/wizard_gva.rs
deleted file mode 100644
index 473ee7702..000000000
--- a/rust-bins/duniter-cli/src/wizard_gva.rs
+++ /dev/null
@@ -1,235 +0,0 @@
-//  Copyright (C) 2020 Éloïs SANCHEZ.
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Affero General Public License as
-// published by the Free Software Foundation, either version 3 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-use crate::*;
-use read_input::prelude::*;
-use std::{
-    collections::HashSet,
-    net::IpAddr,
-    net::{Ipv4Addr, Ipv6Addr},
-    str::FromStr,
-};
-
-/*
-struct GvaConf {
-    host: Option<String>,
-    port: Option<u16>,
-    path: Option<String>,
-    subscriptions_path: Option<String>,
-    remote_host: Option<String>,
-    remote_port: Option<u16>,
-    remote_path: Option<String>,
-    remote_subscriptions_path: Option<String>,
-    remote_tls: Option<bool>,
-}
-*/
-
-pub(crate) fn wizard_gva(profile_name_opt: Option<&str>, profile_path: PathBuf) -> Result<()> {
-    let file_path = profile_path.join("conf.json");
-
-    if !file_path.exists() {
-        if let Some(profile_name) = profile_name_opt {
-            Command::new(duniter_js_exe()?)
-                .args(&["--mdb", profile_name, "config"])
-                .status()?;
-        } else {
-            Command::new(duniter_js_exe()?).arg("config").status()?;
-        }
-    }
-
-    let mut file = File::open(file_path.as_path())?;
-    let mut contents = String::new();
-    file.read_to_string(&mut contents)?;
-
-    let mut conf_json = if contents.is_empty() {
-        serde_json::Value::Object(serde_json::Map::new())
-    } else {
-        serde_json::Value::from_str(&contents)?
-    };
-
-    let conf_json_obj = conf_json
-        .as_object_mut()
-        .ok_or_else(|| anyhow::Error::msg("json conf must be an object"))?;
-
-    // Get existing whitelist
-    let mut whitelist = HashSet::new();
-    if let Some(gva_conf) = conf_json_obj.get("gva") {
-        let gva_conf_obj = gva_conf
-            .as_object()
-            .ok_or_else(|| anyhow::Error::msg("gva conf must be an object"))?;
-        if let Some(whitelist_json) = gva_conf_obj.get("whitelist") {
-            let whitelist_array = whitelist_json
-                .as_array()
-                .ok_or_else(|| anyhow::Error::msg("gva.whitelist must be an array"))?;
-            for ip_json in whitelist_array {
-                if let serde_json::Value::String(ip_str) = ip_json {
-                    whitelist.insert(
-                        IpAddr::from_str(ip_str).context("gva.whitelist contains invalid IP")?,
-                    );
-                }
-            }
-        } else {
-            whitelist.insert(IpAddr::V4(Ipv4Addr::LOCALHOST));
-            whitelist.insert(IpAddr::V6(Ipv6Addr::LOCALHOST));
-        }
-    } else {
-        whitelist.insert(IpAddr::V4(Ipv4Addr::LOCALHOST));
-        whitelist.insert(IpAddr::V6(Ipv6Addr::LOCALHOST));
-    };
-
-    let mut gva_conf = serde_json::Map::new();
-
-    // Enable GVA API?
-    let res = input().msg("Enable GVA API? [Y/n]").default('Y').get();
-    let gva_enabled = res != 'n';
-    gva_conf.insert("enabled".to_owned(), serde_json::Value::Bool(gva_enabled));
-
-    if gva_enabled {
-        // ip4
-        let ip4 = input()
-            .msg("Listen to ip v4 ? [127.0.0.1]")
-            .default(Ipv4Addr::LOCALHOST)
-            .get();
-        gva_conf.insert("ip4".to_owned(), serde_json::Value::String(ip4.to_string()));
-        // ip6
-        let res = input().msg("Listen to ip v6? [Y/n]").default('Y').get();
-        if res != 'n' {
-            let ip6 = input()
-                .msg("Enter ip v6: [::1]")
-                .default(Ipv6Addr::LOCALHOST)
-                .get();
-            gva_conf.insert("ip6".to_owned(), serde_json::Value::String(ip6.to_string()));
-        }
-        // port
-        let port = input()
-            .msg("Listen to port ? [30901]")
-            .default(30901u16)
-            .get();
-        gva_conf.insert(
-            "port".to_owned(),
-            serde_json::Value::Number(serde_json::Number::from(port)),
-        );
-        // path
-        let path = input().msg("Path ? [gva]").default("gva".to_owned()).get();
-        gva_conf.insert("path".to_owned(), serde_json::Value::String(path));
-        // subscriptionsPath
-        let subscriptions_path = input()
-            .msg("Subscriptions path ? [gva-sub]")
-            .default("gva-sub".to_owned())
-            .get();
-        gva_conf.insert(
-            "subscriptionsPath".to_owned(),
-            serde_json::Value::String(subscriptions_path),
-        );
-        // remoteHost
-        let res = input()
-            .msg("Define a remote host? [y/N]")
-            .default('N')
-            .get();
-        if res == 'y' || res == 'Y' {
-            let remote_host = input().msg("Enter remote host:").get();
-            gva_conf.insert(
-                "remoteHost".to_owned(),
-                serde_json::Value::String(remote_host),
-            );
-        }
-        // remotePort
-        let res = input()
-            .msg("Define a remote port? [y/N]")
-            .default('N')
-            .get();
-        if res == 'y' || res == 'Y' {
-            let remote_port = input()
-                .msg("Enter remote port ? [443]")
-                .default(443u16)
-                .get();
-            gva_conf.insert(
-                "remotePort".to_owned(),
-                serde_json::Value::Number(serde_json::Number::from(remote_port)),
-            );
-        }
-        // remotePath
-        let res = input()
-            .msg("Define a remote path? [y/N]")
-            .default('N')
-            .get();
-        if res == 'y' || res == 'Y' {
-            let remote_path = input().msg("Enter remote path:").get();
-            gva_conf.insert(
-                "remotePath".to_owned(),
-                serde_json::Value::String(remote_path),
-            );
-        }
-        // remoteSubscriptionsPath
-        let res = input()
-            .msg("Define a remote subscriptions path? [y/N]")
-            .default('N')
-            .get();
-        if res == 'y' || res == 'Y' {
-            let remote_path = input().msg("Enter remote subscriptions path:").get();
-            gva_conf.insert(
-                "remoteSubscriptionsPath".to_owned(),
-                serde_json::Value::String(remote_path),
-            );
-        }
-        // whitelist
-        let res = input().msg("Update whitelist? [y/N]").default('N').get();
-        if res == 'y' || res == 'Y' {
-            loop {
-                println!("1. See whitelist content.");
-                println!("2. Add an IP to the whitelist.");
-                println!("3. Removing an IP from the whitelist.");
-                println!("4. Quit.");
-                match input().msg("Choose an action: ").default(1).get() {
-                    2usize => {
-                        whitelist.insert(input().msg("Enter a new IP address: ").get());
-                    }
-                    3 => {
-                        whitelist
-                            .remove(&input().msg("Indicate the IP address to be deleted: ").get());
-                    }
-                    4 => break,
-                    _ => {
-                        println!("--------------------------------");
-                        println!("Whitelist content ({} IPs):", whitelist.len());
-                        whitelist.iter().for_each(|ip| println!("{}", ip));
-                        println!("--------------------------------");
-                    }
-                }
-            }
-        }
-        gva_conf.insert(
-            "whitelist".to_owned(),
-            serde_json::Value::Array(
-                whitelist
-                    .into_iter()
-                    .map(|ip| serde_json::Value::String(ip.to_string()))
-                    .collect(),
-            ),
-        );
-    }
-
-    // Insert GVA json conf in global json conf
-    conf_json_obj.insert("gva".to_owned(), serde_json::Value::Object(gva_conf));
-
-    // Write new_conf
-    let new_conf_str = serde_json::to_string_pretty(&conf_json)?;
-    let mut file = File::create(file_path.as_path())?;
-    file.write_all(new_conf_str.as_bytes())?;
-
-    println!("Configuration successfully updated.");
-
-    Ok(())
-}
diff --git a/rust-bins/duniter-dbex/Cargo.toml b/rust-bins/duniter-dbex/Cargo.toml
index b018a8747..cc5f9fdd4 100644
--- a/rust-bins/duniter-dbex/Cargo.toml
+++ b/rust-bins/duniter-dbex/Cargo.toml
@@ -22,7 +22,7 @@ anyhow = "1.0.33"
 arrayvec = "0.5.1"
 comfy-table = "2.1.0"
 dirs = "3.0.1"
-dubp = { version = "0.51.0", features = ["duniter"] }
+dubp = { version = "0.53.1", features = ["duniter"] }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["bc-writer", "explorer", "leveldb_backend"] }
 duniter-gva-db = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva", default-features = false, features = ["explorer", "leveldb_backend"] }
 duniter-gva-indexer = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva" }
diff --git a/rust-libs/duniter-server/Cargo.toml b/rust-libs/duniter-server/Cargo.toml
index 3cfbc9ed7..52fbb64bd 100644
--- a/rust-libs/duniter-server/Cargo.toml
+++ b/rust-libs/duniter-server/Cargo.toml
@@ -8,9 +8,9 @@ edition = "2018"
 [dependencies]
 anyhow = "1.0.34"
 cfg-if = "1.0.0"
-dubp = { version = "0.51.0", features = ["duniter"] }
+dubp = { version = "0.53.1", features = ["duniter"] }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["bc-writer"] }
-duniter-gva = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva", optional = true }
+duniter-gva = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva", optional = true } 
 fast-threadpool = "0.2.3"
 flume = "0.10.0"
 log = "0.4.11"
diff --git a/rust-libs/duniter-server/src/legacy/dunp.rs b/rust-libs/duniter-server/src/legacy/dunp.rs
index 99f54a6fb..ef720fd4e 100644
--- a/rust-libs/duniter-server/src/legacy/dunp.rs
+++ b/rust-libs/duniter-server/src/legacy/dunp.rs
@@ -18,7 +18,7 @@ use crate::*;
 impl DuniterServer {
     pub fn get_self_endpoints(&self) -> anyhow::Result<Vec<Endpoint>> {
         // Do not get rust endpoints on js tests or when gva is disabled
-        if std::env::var_os("DUNITER_JS_TESTS") != Some("yes".into()) && self.conf.gva.is_some() {
+        if std::env::var_os("DUNITER_JS_TESTS") != Some("yes".into()) {
             let (sender, recv) = flume::bounded(1);
             loop {
                 self.global_sender
@@ -105,7 +105,7 @@ mod tests {
 
     #[test]
     fn test_receive_new_heads() -> anyhow::Result<()> {
-        let server = DuniterServer::test(DuniterConf::default(), DuniterMode::Start)?;
+        let server = DuniterServer::test(DuniterCoreConf::default(), DuniterMode::Start)?;
         let dbs = server.get_shared_dbs();
 
         let head = (
@@ -134,7 +134,7 @@ mod tests {
     #[test]
     fn test_save_peer() -> anyhow::Result<()> {
         use duniter_core::dbs::databases::network_v1::NetworkV1DbReadable as _;
-        let server = DuniterServer::test(DuniterConf::default(), DuniterMode::Start)?;
+        let server = DuniterServer::test(DuniterCoreConf::default(), DuniterMode::Start)?;
         let dbs = server.get_shared_dbs();
 
         let peer = PeerCardDbV1 {
diff --git a/rust-libs/duniter-server/src/lib.rs b/rust-libs/duniter-server/src/lib.rs
index 571adbe64..e031a1583 100644
--- a/rust-libs/duniter-server/src/lib.rs
+++ b/rust-libs/duniter-server/src/lib.rs
@@ -25,7 +25,7 @@
 mod fill_cm;
 mod legacy;
 
-pub use duniter_core::conf::{gva_conf::GvaConf, DuniterConf, DuniterMode};
+pub use duniter_core::conf::{DuniterCoreConf, DuniterMode};
 use duniter_core::dbs::databases::network_v1::NetworkV1DbWritable;
 pub use duniter_core::dbs::{
     kv_typed::prelude::KvResult, smallvec, DunpHeadDbV1, DunpNodeIdV1Db, PeerCardDbV1,
@@ -62,7 +62,7 @@ use duniter_core::global as duniter_global;
 use duniter_core::mempools as duniter_mempools;
 cfg_if::cfg_if! {
     if #[cfg(feature = "gva")] {
-        use duniter_core::module::DuniterModule as _;
+        use duniter_core::module::DuniterModule;
         plug_duniter_modules!([GvaModule], TxsHistoryForBma);
     } else {
         plug_duniter_modules!([], TxsHistoryForBma);
@@ -71,7 +71,7 @@ cfg_if::cfg_if! {
 
 pub struct DuniterServer {
     bc_db: BcV2Db<FileBackend>,
-    conf: DuniterConf,
+    conf: DuniterCoreConf,
     current: Option<BlockMetaV2>,
     dbs_pool: fast_threadpool::ThreadPoolSyncHandler<SharedDbs<FileBackend>>,
     global_sender: flume::Sender<GlobalBackGroundTaskMsg>,
@@ -87,7 +87,7 @@ impl DuniterServer {
         self.shared_dbs.clone()
     }
     pub fn start(
-        conf: DuniterConf,
+        conf: DuniterCoreConf,
         currency: String,
         duniter_mode: DuniterMode,
         profile_path_opt: Option<&Path>,
@@ -136,20 +136,18 @@ impl DuniterServer {
                 duniter_core::global::start_global_background_task(global_recv).await;
 
                 // Start duniter modules
-                if conf_clone.gva.is_some() {
-                    log::info!("start duniter modules...");
-                    start_duniter_modules(
-                        &conf_clone,
-                        currency,
-                        threadpool_async_handler,
-                        Mempools { txs: txs_mempool },
-                        duniter_mode,
-                        profile_path_opt_clone,
-                        software_version,
-                    )
-                    .await
-                    .expect("Fail to start duniter modules");
-                }
+                log::info!("start duniter modules...");
+                start_duniter_modules(
+                    &conf_clone,
+                    currency,
+                    threadpool_async_handler,
+                    Mempools { txs: txs_mempool },
+                    duniter_mode,
+                    profile_path_opt_clone,
+                    software_version,
+                )
+                .await
+                .expect("Fail to start duniter modules");
             });
         });
 
@@ -169,7 +167,7 @@ impl DuniterServer {
     }
     #[cfg(test)]
     pub(crate) fn test(
-        conf: DuniterConf,
+        conf: DuniterCoreConf,
         duniter_mode: DuniterMode,
     ) -> anyhow::Result<DuniterServer> {
         DuniterServer::start(
diff --git a/rust-libs/tests/duniter-integration-tests/Cargo.toml b/rust-libs/tests/duniter-integration-tests/Cargo.toml
index e775f0c15..a2d59ced2 100644
--- a/rust-libs/tests/duniter-integration-tests/Cargo.toml
+++ b/rust-libs/tests/duniter-integration-tests/Cargo.toml
@@ -7,7 +7,7 @@ edition = "2018"
 
 [dependencies]
 anyhow = "1.0.34"
-dubp = { version = "0.51.0", features = ["duniter"] }
+dubp = { version = "0.53.1", features = ["duniter"] }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["bc-writer"] }
 duniter-server = { path = "../../duniter-server", features = ["gva"] }
 fast-threadpool = "0.2.3"
diff --git a/rust-libs/tests/duniter-integration-tests/src/lib.rs b/rust-libs/tests/duniter-integration-tests/src/lib.rs
index 231959e42..d45f396a1 100644
--- a/rust-libs/tests/duniter-integration-tests/src/lib.rs
+++ b/rust-libs/tests/duniter-integration-tests/src/lib.rs
@@ -35,8 +35,7 @@ mod tests {
     #[test]
     fn test_txs_history() -> anyhow::Result<()> {
         let server = DuniterServer::start(
-            DuniterConf {
-                gva: None,
+            DuniterCoreConf {
                 self_key_pair: Ed25519KeyPair::generate_random()
                     .expect("fail to gen random keypair"),
                 txs_mempool_size: 200,
-- 
GitLab