diff --git a/Cargo.lock b/Cargo.lock
index 5500a07cb7ae51126fd941bcf28183cf418ebaec..5908de9086cfdc2b2aa58acbf873b2fc9ef8c49a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -694,23 +694,25 @@ checksum = "4bb454f0228b18c7f4c3b0ebbee346ed9c52e7443b0999cd543ff3571205701d"
 
 [[package]]
 name = "dubp"
-version = "0.54.1"
+version = "0.55.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5dca084e135ee5ea38d64e5e665cac6fc23570a66ed22ce5021b5d14c4f9443"
+checksum = "c30ebc00a1c88df81a8f15d35fb785a934bafb81bdb53e0a50a77531b79d01ff"
 dependencies = [
  "dubp-block",
  "dubp-common",
  "dubp-documents",
  "dubp-documents-parser",
  "dubp-wallet",
+ "duniter-bda-types",
+ "duniter-peer",
  "dup-crypto",
 ]
 
 [[package]]
 name = "dubp-block"
-version = "0.54.1"
+version = "0.55.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fa8e2b1d9728832dd4696f9eff1348085d162d5f98fe025e9c9a2caeffd9c89"
+checksum = "3608ef622ea82856b2dfdef0bb8c1da7ef25e125279aa4f3b672d24729ef2b18"
 dependencies = [
  "dubp-documents",
  "dubp-documents-parser",
@@ -723,9 +725,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-common"
-version = "0.54.1"
+version = "0.55.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49a12c0842c7c4e61e75755476b782d09e282275cab187376b3cc0da405b6afb"
+checksum = "196cce73d8ae0cff80bdd9d8d95f6f33f6af0103aeaac1e87fa70e12748c79d7"
 dependencies = [
  "dup-crypto",
  "serde",
@@ -736,9 +738,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents"
-version = "0.54.1"
+version = "0.55.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "450f2b268c979264ef098f00532faf0015d281d9c8ebabf227f57ecc35d0076c"
+checksum = "78bb43886be2293ecae9abc5a709869a8a828a2ddc471c478e407aa450e436ea"
 dependencies = [
  "beef",
  "dubp-wallet",
@@ -750,9 +752,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents-parser"
-version = "0.54.1"
+version = "0.55.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "067bba5a1e34566871128b7157642a643264e4aeaba1db5034634ef6461f797b"
+checksum = "8dcc86531972ec0c17cafa069691f40ea5e2bd3060592bbf257b661d4d885116"
 dependencies = [
  "dubp-documents",
  "json-pest-parser",
@@ -764,9 +766,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-wallet"
-version = "0.54.1"
+version = "0.55.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7552a1c1cca8498dc9266fdb6b10ee98ef841e363a1e3c0cd319ead3fa2aeef4"
+checksum = "081ac73321da67f2de891cc26126f539ea336d84abb16e8fe47592b1adaf3fe2"
 dependencies = [
  "byteorder",
  "dubp-common",
@@ -779,7 +781,7 @@ dependencies = [
 [[package]]
 name = "dubp-wot"
 version = "0.11.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "log",
  "once_cell",
@@ -791,7 +793,7 @@ dependencies = [
 [[package]]
 name = "duniter-bc-reader"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "anyhow",
  "dubp",
@@ -800,7 +802,7 @@ dependencies = [
 ]
 
 [[package]]
-name = "duniter-bca"
+name = "duniter-bda"
 version = "0.1.0"
 dependencies = [
  "anyhow",
@@ -809,7 +811,6 @@ dependencies = [
  "async_io_stream",
  "bincode",
  "dubp",
- "duniter-bca-types",
  "duniter-core",
  "duniter-gva-db",
  "duniter-gva-dbs-reader",
@@ -823,12 +824,15 @@ dependencies = [
 ]
 
 [[package]]
-name = "duniter-bca-types"
-version = "0.1.0"
+name = "duniter-bda-types"
+version = "0.55.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7f80e789db68f1831ca51ed27f9568c3e1750b9cd95d97a3b6096e492024f7a"
 dependencies = [
  "arrayvec 0.7.0",
  "bincode",
- "dubp",
+ "dubp-documents",
+ "duniter-peer",
  "serde",
  "smallvec",
  "thiserror",
@@ -837,7 +841,7 @@ dependencies = [
 [[package]]
 name = "duniter-conf"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "anyhow",
  "dubp",
@@ -851,8 +855,9 @@ dependencies = [
 [[package]]
 name = "duniter-core"
 version = "1.8.1"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
+ "dubp",
  "dubp-wot",
  "duniter-bc-reader",
  "duniter-conf",
@@ -865,7 +870,7 @@ dependencies = [
 [[package]]
 name = "duniter-dbs"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "arrayvec 0.7.0",
  "bincode",
@@ -888,7 +893,7 @@ dependencies = [
 [[package]]
 name = "duniter-dbs-write-ops"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "chrono",
  "dubp",
@@ -903,7 +908,7 @@ dependencies = [
 [[package]]
 name = "duniter-global"
 version = "1.8.1"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "async-rwlock",
  "dubp",
@@ -925,7 +930,7 @@ dependencies = [
  "async-trait",
  "bytes 1.0.1",
  "dubp",
- "duniter-bca",
+ "duniter-bda",
  "duniter-core",
  "duniter-gva-conf",
  "duniter-gva-db",
@@ -983,12 +988,12 @@ dependencies = [
  "anyhow",
  "arrayvec 0.7.0",
  "dubp",
- "duniter-bca-types",
  "duniter-core",
  "duniter-gva-db",
  "flate2",
  "maplit",
  "mockall",
+ "rand 0.8.3",
  "resiter",
  "smallvec",
  "unwrap",
@@ -1003,7 +1008,6 @@ dependencies = [
  "async-graphql",
  "async-trait",
  "dubp",
- "duniter-bca-types",
  "duniter-core",
  "duniter-gva-db",
  "duniter-gva-dbs-reader",
@@ -1042,7 +1046,7 @@ dependencies = [
 [[package]]
 name = "duniter-mempools"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "dubp",
  "duniter-bc-reader",
@@ -1055,7 +1059,7 @@ dependencies = [
 [[package]]
 name = "duniter-module"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "anyhow",
  "async-mutex",
@@ -1072,22 +1076,34 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "duniter-peer"
+version = "0.55.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2ece2a69df5cc4ef0a3460b8e5159ae4d8c6acd3b57ddae1e9c5b6b083a647c"
+dependencies = [
+ "beef",
+ "dubp-common",
+ "log",
+ "serde",
+ "serde_json",
+ "smallvec",
+ "thiserror",
+]
+
 [[package]]
 name = "dup-crypto"
-version = "0.54.1"
+version = "0.55.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4b9746489f2564086fffce1cc67de3b867a098eaf4dbcce15dc85f85542c9c"
+checksum = "e9fbff8a0a8449f195a9d41f89043a54eb0d0d3b6f97ae2ef32de5378aa4ffc7"
 dependencies = [
- "arrayvec 0.5.2",
  "base64",
  "blake3",
  "bs58",
  "byteorder",
  "cryptoxide",
- "ed25519-bip32",
  "getrandom 0.2.2",
  "hex",
- "once_cell",
  "ring",
  "serde",
  "thiserror",
@@ -1095,15 +1111,6 @@ dependencies = [
  "zeroize",
 ]
 
-[[package]]
-name = "ed25519-bip32"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8827180a2b511141fbe49141e50b31a8d542465e0fb572f81f36feea2addfe92"
-dependencies = [
- "cryptoxide",
-]
-
 [[package]]
 name = "either"
 version = "1.6.1"
@@ -1639,7 +1646,7 @@ dependencies = [
 [[package]]
 name = "kv_typed"
 version = "0.1.0"
-source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef"
+source = "git+https://git.duniter.org/nodes/rust/duniter-core#5f6d6b1a4a6f3da9e87f511b3967dc19fe5c4076"
 dependencies = [
  "byteorder",
  "cfg-if 0.1.10",
diff --git a/Cargo.toml b/Cargo.toml
index 333a51cdb0e7c8d618f4f13e7f896a8341d908ad..a1fe609450db44f1f3fa740fecb3dede829c52ab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,8 +13,8 @@ async-graphql = { version = "2.8", features = ["log"] }
 async-mutex = "1.4.0"
 async-trait = "0.1.41"
 bytes = "1.0"
-dubp = { version = "0.54.1", features = ["duniter"] }
-duniter-bca = { path = "./bca" }
+dubp = { version = "0.55.1", features = ["duniter"] }
+duniter-bda = { path = "./bda" }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core" }
 duniter-gva-conf = { path = "./conf" }
 duniter-gva-db = { path = "./db" }
@@ -43,7 +43,7 @@ unwrap = "1.2.1"
 
 [workspace]
 members = [
-    "bca",
+    "bda",
     "conf",
     "db",
     "dbs-reader",
diff --git a/bca/types/Cargo.toml b/bca/types/Cargo.toml
deleted file mode 100644
index a15139866e71f974137977ec29a44ac84a2d4684..0000000000000000000000000000000000000000
--- a/bca/types/Cargo.toml
+++ /dev/null
@@ -1,20 +0,0 @@
-[package]
-name = "duniter-bca-types"
-version = "0.1.0"
-authors = ["librelois <elois@duniter.org>"]
-license = "AGPL-3.0"
-edition = "2018"
-
-[dependencies]
-arrayvec = { version = "0.7", features = ["serde"] }
-bincode = "1.3"
-dubp = { version = "0.54.1" }
-serde = { version = "1.0.105", features = ["derive"] }
-smallvec = { version = "1.4.0", features = ["serde"] }
-thiserror = "1.0.20"
-
-[features]
-default = ["duniter"]
-
-client = ["dubp/client"]
-duniter = ["dubp/duniter"]
diff --git a/bca/types/src/amount.rs b/bca/types/src/amount.rs
deleted file mode 100644
index 1682a314190882c11e68425c33c087b509a0e49a..0000000000000000000000000000000000000000
--- a/bca/types/src/amount.rs
+++ /dev/null
@@ -1,46 +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::*;
-
-#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
-pub enum Amount {
-    Cents(SourceAmount),
-    Uds(f64),
-}
-
-impl Default for Amount {
-    fn default() -> Self {
-        Self::Cents(SourceAmount::ZERO)
-    }
-}
-
-impl Amount {
-    pub fn to_cents(self, ud_amount: SourceAmount) -> SourceAmount {
-        match self {
-            Amount::Cents(sa) => sa,
-            Amount::Uds(f64_) => {
-                if !f64_.is_finite() || f64_ <= 0f64 {
-                    SourceAmount::ZERO
-                } else {
-                    SourceAmount::new(
-                        f64::round(ud_amount.amount() as f64 * f64_) as i64,
-                        ud_amount.base(),
-                    )
-                }
-            }
-        }
-    }
-}
diff --git a/bca/types/src/identity.rs b/bca/types/src/identity.rs
deleted file mode 100644
index e2302a9bfa7d9520b4a5b41831ff987276776ed8..0000000000000000000000000000000000000000
--- a/bca/types/src/identity.rs
+++ /dev/null
@@ -1,22 +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::*;
-
-#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
-pub struct Identity {
-    pub is_member: bool,
-    pub username: String,
-}
diff --git a/bca/types/src/lib.rs b/bca/types/src/lib.rs
deleted file mode 100644
index 0b9beda15276d82f8f0e3e0c7512828161bd7318..0000000000000000000000000000000000000000
--- a/bca/types/src/lib.rs
+++ /dev/null
@@ -1,144 +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/>.
-
-#![deny(
-    clippy::unwrap_used,
-    missing_copy_implementations,
-    trivial_casts,
-    trivial_numeric_casts,
-    unstable_features,
-    unused_import_braces
-)]
-
-pub mod amount;
-pub mod identity;
-pub mod prepare_payment;
-pub mod rejected_tx;
-pub mod utxo;
-
-use crate::amount::Amount;
-use crate::identity::Identity;
-use crate::prepare_payment::{PrepareSimplePayment, PrepareSimplePaymentResp};
-use crate::utxo::Utxo;
-
-use arrayvec::ArrayVec;
-use bincode::Options as _;
-use dubp::crypto::keys::ed25519::{PublicKey, Signature};
-use dubp::wallet::prelude::*;
-use dubp::{common::prelude::Blockstamp, crypto::hashs::Hash};
-use serde::{Deserialize, Serialize};
-use smallvec::SmallVec;
-use thiserror::Error;
-
-// Constants
-
-pub const MAX_FIRST_UTXOS: usize = 40;
-
-// Request
-
-#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
-pub enum BcaReq {
-    V0(BcaReqV0),
-    _V1,
-}
-
-#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
-pub struct BcaReqV0 {
-    pub req_id: usize,
-    pub req_type: BcaReqTypeV0,
-}
-
-#[allow(clippy::large_enum_variant)]
-#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
-pub enum BcaReqTypeV0 {
-    BalancesOfPubkeys(ArrayVec<PublicKey, 16>),
-    FirstUtxosOfPubkeys {
-        amount_target_opt: Option<Amount>,
-        pubkeys: ArrayVec<PublicKey, 16>,
-    },
-    LastBlockstampOutOfForkWindow,
-    MembersCount,
-    PrepareSimplePayment(PrepareSimplePayment),
-    ProofServerPubkey {
-        challenge: [u8; 16],
-    },
-    Ping,
-    SendTxs(Txs),
-    Identities(ArrayVec<PublicKey, 16>),
-    CurrentUd,
-    BalancesOfScripts(ArrayVec<WalletScriptV10, 16>),
-}
-
-// Request types helpers
-
-pub type Txs = SmallVec<[dubp::documents::transaction::TransactionDocumentV10; 1]>;
-
-// Response
-
-#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
-pub enum BcaResp {
-    V0(BcaRespV0),
-    UnsupportedVersion,
-}
-
-#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
-pub struct BcaRespV0 {
-    pub req_id: usize,
-    pub resp_type: BcaRespTypeV0,
-}
-
-#[allow(clippy::large_enum_variant)]
-#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
-pub enum BcaRespTypeV0 {
-    Error(String),
-    Balances(ArrayVec<Option<SourceAmount>, 16>),
-    FirstUtxosOfPubkeys(Vec<ArrayVec<Utxo, MAX_FIRST_UTXOS>>),
-    ProofServerPubkey {
-        challenge: [u8; 16],
-        server_pubkey: PublicKey,
-        sig: Signature,
-    },
-    LastBlockstampOutOfForkWindow(Blockstamp),
-    MembersCount(u64),
-    PrepareSimplePayment(PrepareSimplePaymentResp),
-    Pong,
-    RejectedTxs(Vec<rejected_tx::RejectedTx>),
-    Identities(ArrayVec<Option<Identity>, 16>),
-    CurrentUd(SourceAmount),
-}
-
-// Result and error
-
-pub type BcaResult = Result<BcaResp, BcaReqExecError>;
-
-#[derive(Clone, Debug, Deserialize, Error, PartialEq, Eq, Serialize)]
-pub enum BcaReqExecError {
-    #[error("task cancelled")]
-    Cancelled,
-    #[error("Invalid request: {0}")]
-    InvalidReq(String),
-    #[error("task panicked")]
-    Panic,
-    #[error("Unknown error")]
-    Unknown,
-}
-
-// Bincode configuration
-
-pub fn bincode_opts() -> impl bincode::Options {
-    bincode::options()
-        .with_limit(u32::max_value() as u64)
-        .allow_trailing_bytes()
-}
diff --git a/bca/types/src/prepare_payment.rs b/bca/types/src/prepare_payment.rs
deleted file mode 100644
index 2de5d621a5fb521be8a9304a9789602d6755523d..0000000000000000000000000000000000000000
--- a/bca/types/src/prepare_payment.rs
+++ /dev/null
@@ -1,32 +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 dubp::documents::transaction::TransactionInputV10;
-
-#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
-pub struct PrepareSimplePayment {
-    pub issuer: PublicKey,
-    pub amount: Amount,
-}
-
-#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
-pub struct PrepareSimplePaymentResp {
-    pub current_block_number: u32,
-    pub current_block_hash: Hash,
-    pub current_ud: SourceAmount,
-    pub inputs: Vec<TransactionInputV10>,
-    pub inputs_sum: SourceAmount,
-}
diff --git a/bca/types/src/utxo.rs b/bca/types/src/utxo.rs
deleted file mode 100644
index d7716a808926b6f4fd449d5310ffdb60fb4d4fbb..0000000000000000000000000000000000000000
--- a/bca/types/src/utxo.rs
+++ /dev/null
@@ -1,23 +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::*;
-
-#[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, Eq, Serialize)]
-pub struct Utxo {
-    pub amount: SourceAmount,
-    pub tx_hash: Hash,
-    pub output_index: u8,
-}
diff --git a/bca/Cargo.toml b/bda/Cargo.toml
similarity index 87%
rename from bca/Cargo.toml
rename to bda/Cargo.toml
index 0d98bfad36df17f3952a3ec30307387c13ab37c8..bd7864ee7ea235dff92c32b888f689631cc7ee1b 100644
--- a/bca/Cargo.toml
+++ b/bda/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "duniter-bca"
+name = "duniter-bda"
 version = "0.1.0"
 authors = ["librelois <elois@duniter.org>"]
 license = "AGPL-3.0"
@@ -11,8 +11,7 @@ arrayvec = { version = "0.7", features = ["serde"] }
 async-bincode = "0.6.1"
 async_io_stream = { version = "0.3.1", features = [ "tokio_io"] }
 bincode = "1.3"
-dubp = { version = "0.54.1", features = ["duniter"] }
-duniter-bca-types = { path = "types", features = ["duniter"] }
+dubp = { version = "0.55.1", features = ["duniter"] }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core" }
 duniter-gva-db = { path = "../db" }
 duniter-gva-dbs-reader = { path = "../dbs-reader" }
diff --git a/bca/src/exec_req_type.rs b/bda/src/exec_req_type.rs
similarity index 82%
rename from bca/src/exec_req_type.rs
rename to bda/src/exec_req_type.rs
index fc60c1b94d52dadb7eb465d0ba534681c0d1c3e1..b33cef205b843c0b7ae5b5c101d507c3fc4b87cf 100644
--- a/bca/src/exec_req_type.rs
+++ b/bda/src/exec_req_type.rs
@@ -17,6 +17,7 @@ mod balances;
 mod current_ud;
 mod last_blockstamp_out_of_fork_window;
 mod members_count;
+mod peers;
 mod prepare_simple_payment;
 mod send_txs;
 mod utxos;
@@ -38,42 +39,42 @@ where
 }
 
 pub(super) async fn execute_req_type(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
     req_type: BcaReqTypeV0,
     _is_whitelisted: bool,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
     match req_type {
         BcaReqTypeV0::BalancesOfPubkeys(pubkeys) => {
-            balances::exec_req_balances_of_pubkeys(bca_executor, pubkeys).await
+            balances::exec_req_balances_of_pubkeys(bda_executor, pubkeys).await
         }
         BcaReqTypeV0::FirstUtxosOfPubkeys {
             amount_target_opt,
             pubkeys,
-        } => utxos::exec_req_first_utxos_of_pubkeys(bca_executor, amount_target_opt, pubkeys).await,
+        } => utxos::exec_req_first_utxos_of_pubkeys(bda_executor, amount_target_opt, pubkeys).await,
         BcaReqTypeV0::LastBlockstampOutOfForkWindow => {
             last_blockstamp_out_of_fork_window::exec_req_last_blockstamp_out_of_fork_window(
-                bca_executor,
+                bda_executor,
             )
             .await
         }
-        BcaReqTypeV0::MembersCount => members_count::exec_req_members_count(bca_executor).await,
+        BcaReqTypeV0::MembersCount => members_count::exec_req_members_count(bda_executor).await,
         BcaReqTypeV0::PrepareSimplePayment(params) => {
-            prepare_simple_payment::exec_req_prepare_simple_payment(bca_executor, params).await
+            prepare_simple_payment::exec_req_prepare_simple_payment(bda_executor, params).await
         }
         BcaReqTypeV0::ProofServerPubkey { challenge } => Ok(BcaRespTypeV0::ProofServerPubkey {
             challenge,
-            server_pubkey: bca_executor.self_keypair.public_key(),
-            sig: bca_executor
+            server_pubkey: bda_executor.self_keypair.public_key(),
+            sig: bda_executor
                 .self_keypair
                 .generate_signator()
                 .sign(&challenge),
         }),
         BcaReqTypeV0::Ping => Ok(BcaRespTypeV0::Pong),
-        BcaReqTypeV0::SendTxs(txs) => send_txs::send_txs(bca_executor, txs).await,
+        BcaReqTypeV0::SendTxs(txs) => send_txs::send_txs(bda_executor, txs).await,
         BcaReqTypeV0::Identities(pubkeys) => {
-            let dbs_reader = bca_executor.dbs_reader();
+            let dbs_reader = bda_executor.dbs_reader();
             Ok(BcaRespTypeV0::Identities(
-                bca_executor
+                bda_executor
                     .dbs_pool
                     .execute(move |dbs| {
                         pubkeys
@@ -91,9 +92,10 @@ pub(super) async fn execute_req_type(
                     .await??,
             ))
         }
-        BcaReqTypeV0::CurrentUd => current_ud::exec_req_current_ud(bca_executor).await,
+        BcaReqTypeV0::CurrentUd => current_ud::exec_req_current_ud(bda_executor).await,
         BcaReqTypeV0::BalancesOfScripts(scripts) => {
-            balances::exec_req_balances_of_scripts(bca_executor, scripts).await
+            balances::exec_req_balances_of_scripts(bda_executor, scripts).await
         }
+        BcaReqTypeV0::PeersV10 { n } => peers::exec_req_peers_v1(bda_executor, n).await,
     }
 }
diff --git a/bca/src/exec_req_type/balances.rs b/bda/src/exec_req_type/balances.rs
similarity index 91%
rename from bca/src/exec_req_type/balances.rs
rename to bda/src/exec_req_type/balances.rs
index 05b1fabdbcc4a5f48f1cc747748ab5ffa901f222..5b6ee11486dda2c380faddb08ed558d7a393d064 100644
--- a/bca/src/exec_req_type/balances.rs
+++ b/bda/src/exec_req_type/balances.rs
@@ -17,12 +17,12 @@ use crate::*;
 use dubp::{crypto::keys::ed25519::PublicKey, wallet::prelude::WalletScriptV10};
 
 pub(super) async fn exec_req_balances_of_pubkeys(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
     pubkeys: ArrayVec<PublicKey, 16>,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
-    let dbs_reader = bca_executor.dbs_reader();
+    let dbs_reader = bda_executor.dbs_reader();
     Ok(BcaRespTypeV0::Balances(
-        bca_executor
+        bda_executor
             .dbs_pool
             .execute(move |_| {
                 pubkeys
@@ -39,12 +39,12 @@ pub(super) async fn exec_req_balances_of_pubkeys(
 }
 
 pub(super) async fn exec_req_balances_of_scripts(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
     scripts: ArrayVec<WalletScriptV10, 16>,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
-    let dbs_reader = bca_executor.dbs_reader();
+    let dbs_reader = bda_executor.dbs_reader();
     Ok(BcaRespTypeV0::Balances(
-        bca_executor
+        bda_executor
             .dbs_pool
             .execute(move |_| {
                 scripts
diff --git a/bca/src/exec_req_type/current_ud.rs b/bda/src/exec_req_type/current_ud.rs
similarity index 93%
rename from bca/src/exec_req_type/current_ud.rs
rename to bda/src/exec_req_type/current_ud.rs
index 02823dbbaf3d8a6b07cc623198c03511389bf5c9..c7d77e45630240f6efd4fd4a73ef797fba6a6d9f 100644
--- a/bca/src/exec_req_type/current_ud.rs
+++ b/bda/src/exec_req_type/current_ud.rs
@@ -16,9 +16,9 @@
 use crate::*;
 
 pub(super) async fn exec_req_current_ud(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
-    if let Some(current_ud) = bca_executor
+    if let Some(current_ud) = bda_executor
         .cm_accessor
         .get_current_meta(|cm| cm.current_ud)
         .await
diff --git a/bca/src/exec_req_type/last_blockstamp_out_of_fork_window.rs b/bda/src/exec_req_type/last_blockstamp_out_of_fork_window.rs
similarity index 88%
rename from bca/src/exec_req_type/last_blockstamp_out_of_fork_window.rs
rename to bda/src/exec_req_type/last_blockstamp_out_of_fork_window.rs
index 41529563e624d149e869d0f5abf85d903cbde4fc..d071cb8400052d56738e781865d8fdce2d1daf3f 100644
--- a/bca/src/exec_req_type/last_blockstamp_out_of_fork_window.rs
+++ b/bda/src/exec_req_type/last_blockstamp_out_of_fork_window.rs
@@ -17,15 +17,15 @@ use crate::*;
 use dubp::common::prelude::*;
 
 pub(super) async fn exec_req_last_blockstamp_out_of_fork_window(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
-    if let Some(current_block_number) = bca_executor
+    if let Some(current_block_number) = bda_executor
         .cm_accessor
         .get_current_meta(|cm| cm.current_block_meta.number)
         .await
     {
-        let dbs_reader = bca_executor.dbs_reader();
-        bca_executor
+        let dbs_reader = bda_executor.dbs_reader();
+        bda_executor
             .dbs_pool
             .execute(move |dbs| {
                 let block_ref_number = if current_block_number < 101 {
@@ -63,10 +63,10 @@ mod tests {
             .times(1)
             .returning(|_| None);
         let dbs_reader = MockDbsReader::new();
-        let bca_executor =
-            create_bca_executor(cm_mock, dbs_reader).expect("fail to create bca executor");
+        let bda_executor =
+            create_bda_executor(cm_mock, dbs_reader).expect("fail to create bca executor");
 
-        let resp_res = exec_req_last_blockstamp_out_of_fork_window(&bca_executor).await;
+        let resp_res = exec_req_last_blockstamp_out_of_fork_window(&bda_executor).await;
 
         assert_eq!(resp_res, Err(ExecReqTypeError("no blockchain".into())));
     }
@@ -84,10 +84,10 @@ mod tests {
             .times(1)
             .returning(|_, _| Ok(Some(BlockMetaV2::default())));
 
-        let bca_executor =
-            create_bca_executor(cm_mock, dbs_reader).expect("fail to create bca executor");
+        let bda_executor =
+            create_bda_executor(cm_mock, dbs_reader).expect("fail to create bca executor");
 
-        let resp = exec_req_last_blockstamp_out_of_fork_window(&bca_executor).await?;
+        let resp = exec_req_last_blockstamp_out_of_fork_window(&bda_executor).await?;
 
         assert_eq!(
             resp,
diff --git a/bca/src/exec_req_type/members_count.rs b/bda/src/exec_req_type/members_count.rs
similarity index 86%
rename from bca/src/exec_req_type/members_count.rs
rename to bda/src/exec_req_type/members_count.rs
index 71b85c6e3cadfc6fd22f3d9d90ec04c161d8c8ed..0353934d4a01cd52112305085640b532a3416a75 100644
--- a/bca/src/exec_req_type/members_count.rs
+++ b/bda/src/exec_req_type/members_count.rs
@@ -16,9 +16,9 @@
 use crate::*;
 
 pub(super) async fn exec_req_members_count(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
-    if let Some(members_count) = bca_executor
+    if let Some(members_count) = bda_executor
         .cm_accessor
         .get_current_meta(|cm| cm.current_block_meta.members_count)
         .await
@@ -42,10 +42,10 @@ mod tests {
             .times(1)
             .returning(|f| Some(f(&CurrentMeta::default())));
         let dbs_reader = MockDbsReader::new();
-        let bca_executor =
-            create_bca_executor(cm_mock, dbs_reader).expect("fail to create bca executor");
+        let bda_executor =
+            create_bda_executor(cm_mock, dbs_reader).expect("fail to create bca executor");
 
-        let resp_res = exec_req_members_count(&bca_executor).await;
+        let resp_res = exec_req_members_count(&bda_executor).await;
 
         assert_eq!(resp_res, Ok(BcaRespTypeV0::MembersCount(0)));
     }
diff --git a/bca/types/src/rejected_tx.rs b/bda/src/exec_req_type/peers.rs
similarity index 61%
rename from bca/types/src/rejected_tx.rs
rename to bda/src/exec_req_type/peers.rs
index 14b06e52b76e39ed5830541a422329093151535c..91535a62a7079cd49502948d5918a0c5fcac0e90 100644
--- a/bca/types/src/rejected_tx.rs
+++ b/bda/src/exec_req_type/peers.rs
@@ -15,16 +15,19 @@
 
 use crate::*;
 
-#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
-pub struct RejectedTx {
-    pub tx_index: u16,
-    pub reason: RejectedTxReason,
-}
+pub(super) async fn exec_req_peers_v1(
+    bda_executor: &BdaExecutor,
+    n: usize,
+) -> Result<BcaRespTypeV0, ExecReqTypeError> {
+    let dbs_reader = bda_executor.dbs_reader();
 
-#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
-pub enum RejectedTxReason {
-    DbError(String),
-    InvalidTx(String),
-    MempoolFull,
-    TxAlreadyWritten,
+    Ok(BcaRespTypeV0::PeersV10(
+        bda_executor
+            .dbs_pool
+            .execute(move |shared_dbs| dbs_reader.get_some_peers(&shared_dbs.dunp_db, n))
+            .await??
+            .into_iter()
+            .map(|peer_db| peer_db.peer)
+            .collect(),
+    ))
 }
diff --git a/bca/src/exec_req_type/prepare_simple_payment.rs b/bda/src/exec_req_type/prepare_simple_payment.rs
similarity index 90%
rename from bca/src/exec_req_type/prepare_simple_payment.rs
rename to bda/src/exec_req_type/prepare_simple_payment.rs
index a23a77650570d2ec5fcf652ff0ea00acf6519c44..7a5130a714dfe8e6c34f7cf7cdeb40c15a3186be 100644
--- a/bca/src/exec_req_type/prepare_simple_payment.rs
+++ b/bda/src/exec_req_type/prepare_simple_payment.rs
@@ -14,20 +14,20 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
+use dubp::bda_types::prepare_payment::{PrepareSimplePayment, PrepareSimplePaymentResp};
 use dubp::wallet::prelude::*;
-use duniter_bca_types::prepare_payment::{PrepareSimplePayment, PrepareSimplePaymentResp};
 
 pub(super) async fn exec_req_prepare_simple_payment(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
     params: PrepareSimplePayment,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
     let issuer = params.issuer;
 
-    if let Some(current_meta) = bca_executor.cm_accessor.get_current_meta(|cm| *cm).await {
+    if let Some(current_meta) = bda_executor.cm_accessor.get_current_meta(|cm| *cm).await {
         let current_block_meta = current_meta.current_block_meta;
         let current_ud = current_meta.current_ud;
-        let dbs_reader = bca_executor.dbs_reader();
-        let (amount, block_ref_number, block_ref_hash, (inputs, inputs_sum)) = bca_executor
+        let dbs_reader = bda_executor.dbs_reader();
+        let (amount, block_ref_number, block_ref_hash, (inputs, inputs_sum)) = bda_executor
             .dbs_pool
             .execute(move |dbs| {
                 let mut amount = params.amount.to_cents(current_ud);
@@ -95,11 +95,11 @@ mod tests {
             .times(1)
             .returning(|_| None);
         let dbs_reader = MockDbsReader::new();
-        let bca_executor =
-            create_bca_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
+        let bda_executor =
+            create_bda_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
 
         let resp_res = exec_req_prepare_simple_payment(
-            &bca_executor,
+            &bda_executor,
             PrepareSimplePayment {
                 issuer: PublicKey::default(),
                 amount: Amount::Cents(SourceAmount::new(42, 0)),
@@ -122,11 +122,11 @@ mod tests {
             .expect_block()
             .times(1)
             .returning(|_, _| Ok(Some(BlockMetaV2::default())));
-        let bca_executor =
-            create_bca_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
+        let bda_executor =
+            create_bda_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
 
         let resp_res = exec_req_prepare_simple_payment(
-            &bca_executor,
+            &bda_executor,
             PrepareSimplePayment {
                 issuer: PublicKey::default(),
                 amount: Amount::Cents(SourceAmount::new(42, 1)),
@@ -153,11 +153,11 @@ mod tests {
             .expect_find_inputs::<TxsMpV2Db<FileBackend>>()
             .times(1)
             .returning(|_, _, _, _, _| Ok((vec![], SourceAmount::default())));
-        let bca_executor =
-            create_bca_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
+        let bda_executor =
+            create_bda_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
 
         let resp_res = exec_req_prepare_simple_payment(
-            &bca_executor,
+            &bda_executor,
             PrepareSimplePayment {
                 issuer: PublicKey::default(),
                 amount: Amount::Cents(SourceAmount::new(42, 0)),
@@ -195,11 +195,11 @@ mod tests {
             .expect_find_inputs::<TxsMpV2Db<FileBackend>>()
             .times(1)
             .returning(move |_, _, _, _, _| Ok((vec![input], SourceAmount::with_base0(57))));
-        let bca_executor =
-            create_bca_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
+        let bda_executor =
+            create_bda_executor(mock_cm, dbs_reader).expect("fail to create bca executor");
 
         let resp = exec_req_prepare_simple_payment(
-            &bca_executor,
+            &bda_executor,
             PrepareSimplePayment {
                 issuer: PublicKey::default(),
                 amount: Amount::Cents(SourceAmount::new(42, 0)),
diff --git a/bca/src/exec_req_type/send_txs.rs b/bda/src/exec_req_type/send_txs.rs
similarity index 89%
rename from bca/src/exec_req_type/send_txs.rs
rename to bda/src/exec_req_type/send_txs.rs
index bb1ede18352b99476d87c264381f66209aff81d1..73aae212dd6da85b3353703e9954dbf3a0c4a95c 100644
--- a/bca/src/exec_req_type/send_txs.rs
+++ b/bda/src/exec_req_type/send_txs.rs
@@ -14,20 +14,20 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-use dubp::{crypto::keys::KeyPair, documents::transaction::TransactionDocumentTrait};
-use duniter_bca_types::{
+use dubp::bda_types::{
     rejected_tx::{RejectedTx, RejectedTxReason},
     Txs,
 };
+use dubp::{crypto::keys::KeyPair, documents::transaction::TransactionDocumentTrait};
 
 pub(super) async fn send_txs(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
     txs: Txs,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
-    let expected_currency = bca_executor.currency.clone();
+    let expected_currency = bda_executor.currency.clone();
 
-    let server_pubkey = bca_executor.self_keypair.public_key();
-    let txs_mempool = bca_executor.txs_mempool;
+    let server_pubkey = bda_executor.self_keypair.public_key();
+    let txs_mempool = bda_executor.txs_mempool;
 
     let mut rejected_txs = Vec::new();
     for (i, tx) in txs.into_iter().enumerate() {
@@ -36,7 +36,7 @@ pub(super) async fn send_txs(
                 tx_index: i as u16,
                 reason: RejectedTxReason::InvalidTx(e.to_string()),
             });
-        } else if let Err(rejected_tx) = bca_executor
+        } else if let Err(rejected_tx) = bda_executor
             .dbs_pool
             .execute(move |dbs| {
                 txs_mempool
diff --git a/bca/src/exec_req_type/utxos.rs b/bda/src/exec_req_type/utxos.rs
similarity index 91%
rename from bca/src/exec_req_type/utxos.rs
rename to bda/src/exec_req_type/utxos.rs
index 6187464ce40c828d13cdf3ad9c3f1592b68d484f..9c3678f393b06bba96ab6aa85ae3718849e8beb5 100644
--- a/bca/src/exec_req_type/utxos.rs
+++ b/bda/src/exec_req_type/utxos.rs
@@ -17,23 +17,23 @@ use crate::*;
 use dubp::{crypto::keys::ed25519::PublicKey, wallet::prelude::WalletScriptV10};
 
 pub(super) async fn exec_req_first_utxos_of_pubkeys(
-    bca_executor: &BcaExecutor,
+    bda_executor: &BdaExecutor,
     amount_target_opt: Option<Amount>,
     pubkeys: ArrayVec<PublicKey, 16>,
 ) -> Result<BcaRespTypeV0, ExecReqTypeError> {
-    if let Some(current_ud) = bca_executor
+    if let Some(current_ud) = bda_executor
         .cm_accessor
         .get_current_meta(|cm| cm.current_ud)
         .await
     {
-        let dbs_reader = bca_executor.dbs_reader();
+        let dbs_reader = bda_executor.dbs_reader();
         let scripts: ArrayVec<WalletScriptV10, 16> = pubkeys
             .into_iter()
             .map(WalletScriptV10::single_sig)
             .collect();
         if let Some(amount_target) = amount_target_opt {
             Ok(BcaRespTypeV0::FirstUtxosOfPubkeys(
-                bca_executor
+                bda_executor
                     .dbs_pool
                     .execute(move |_| {
                         Ok::<_, ExecReqTypeError>(dbs_reader.first_scripts_utxos(
@@ -46,7 +46,7 @@ pub(super) async fn exec_req_first_utxos_of_pubkeys(
             ))
         } else {
             Ok(BcaRespTypeV0::FirstUtxosOfPubkeys(
-                bca_executor
+                bda_executor
                     .dbs_pool
                     .execute(move |_| dbs_reader.first_scripts_utxos(None, 40, &scripts))
                     .await??,
diff --git a/bca/src/lib.rs b/bda/src/lib.rs
similarity index 94%
rename from bca/src/lib.rs
rename to bda/src/lib.rs
index d07777961fecb6ae28b0d018294962d85f11833c..fd964a91b64d1e5bc9c966bd6aeb289356451846 100644
--- a/bca/src/lib.rs
+++ b/bda/src/lib.rs
@@ -35,11 +35,11 @@ use arrayvec::ArrayVec;
 use async_bincode::AsyncBincodeReader;
 use async_io_stream::IoStream;
 use bincode::Options as _;
-use dubp::crypto::keys::{ed25519::Ed25519KeyPair, Signator};
-use duniter_bca_types::{
+use dubp::bda_types::{
     amount::Amount, bincode_opts, identity::Identity, BcaReq, BcaReqExecError, BcaReqTypeV0,
     BcaResp, BcaRespTypeV0, BcaRespV0,
 };
+use dubp::crypto::keys::{ed25519::Ed25519KeyPair, Signator};
 pub use duniter_core::dbs::kv_typed::prelude::*;
 use duniter_core::dbs::{FileBackend, SharedDbs};
 #[cfg(not(test))]
@@ -56,9 +56,9 @@ use crate::tests::DbsReaderImpl;
 #[cfg(not(test))]
 use duniter_gva_dbs_reader::DbsReaderImpl;
 
-static BCA_EXECUTOR: OnceCell<BcaExecutor> = OnceCell::new();
+static BDA_EXECUTOR: OnceCell<BdaExecutor> = OnceCell::new();
 
-pub fn set_bca_executor(
+pub fn set_bda_executor(
     currency: String,
     cm_accessor: AsyncAccessor,
     dbs_pool: fast_threadpool::ThreadPoolAsyncHandler<SharedDbs<FileBackend>>,
@@ -67,8 +67,8 @@ pub fn set_bca_executor(
     software_version: &'static str,
     txs_mempool: duniter_core::mempools::TxsMempool,
 ) {
-    BCA_EXECUTOR
-        .set(BcaExecutor {
+    BDA_EXECUTOR
+        .set(BdaExecutor {
             currency,
             cm_accessor,
             dbs_pool,
@@ -77,7 +77,7 @@ pub fn set_bca_executor(
             software_version,
             txs_mempool,
         })
-        .unwrap_or_else(|_| panic!("BCA_EXECUTOR already set !"))
+        .unwrap_or_else(|_| panic!("bda_executor already set !"))
 }
 
 #[cfg(not(test))]
@@ -87,7 +87,7 @@ where
     S: 'static + TryStream<Ok = B, Error = std::io::Error> + Send + Unpin,
 {
     unsafe {
-        BCA_EXECUTOR
+        BDA_EXECUTOR
             .get_unchecked()
             .execute(query_body_stream, is_whitelisted)
             .await
@@ -95,7 +95,7 @@ where
 }
 
 #[derive(Clone)]
-struct BcaExecutor {
+struct BdaExecutor {
     cm_accessor: AsyncAccessor,
     currency: String,
     dbs_pool: fast_threadpool::ThreadPoolAsyncHandler<SharedDbs<FileBackend>>,
@@ -105,7 +105,7 @@ struct BcaExecutor {
     txs_mempool: duniter_core::mempools::TxsMempool,
 }
 use uninit::extension_traits::VecCapacity;
-impl BcaExecutor {
+impl BdaExecutor {
     pub async fn execute<B, S>(&self, query_body_stream: S, is_whitelisted: bool) -> Vec<u8>
     where
         B: AsRef<[u8]>,
@@ -214,7 +214,7 @@ impl BcaExecutor {
 }
 
 #[cfg(not(test))]
-impl BcaExecutor {
+impl BdaExecutor {
     #[inline(always)]
     pub fn dbs_reader(&self) -> DbsReaderImpl {
         self.dbs_reader
@@ -224,6 +224,7 @@ impl BcaExecutor {
 #[cfg(test)]
 mod tests {
     use super::*;
+    pub use dubp::bda_types::BcaReqV0;
     pub use dubp::{
         block::prelude::*,
         crypto::{
@@ -233,7 +234,6 @@ mod tests {
         documents::transaction::TransactionInputV10,
         wallet::prelude::*,
     };
-    pub use duniter_bca_types::BcaReqV0;
     pub use duniter_core::dbs::databases::bc_v2::{BcV2DbReadable, BcV2DbRo};
     pub use duniter_core::dbs::databases::cm_v1::{CmV1Db, CmV1DbReadable};
     pub use duniter_core::dbs::databases::txs_mp_v2::{TxsMpV2Db, TxsMpV2DbReadable};
@@ -245,21 +245,21 @@ mod tests {
     pub type AsyncAccessor = duniter_core::dbs::kv_typed::prelude::Arc<MockAsyncAccessor>;
     pub type DbsReaderImpl = duniter_core::dbs::kv_typed::prelude::Arc<MockDbsReader>;
 
-    impl BcaExecutor {
+    impl BdaExecutor {
         #[inline(always)]
         pub fn dbs_reader(&self) -> DbsReaderImpl {
             self.dbs_reader.clone()
         }
     }
 
-    pub(crate) fn create_bca_executor(
+    pub(crate) fn create_bda_executor(
         mock_cm: MockAsyncAccessor,
         mock_dbs_reader: MockDbsReader,
-    ) -> KvResult<BcaExecutor> {
+    ) -> KvResult<BdaExecutor> {
         let dbs = SharedDbs::mem()?;
         let threadpool =
             fast_threadpool::ThreadPool::start(fast_threadpool::ThreadPoolConfig::low(), dbs);
-        Ok(BcaExecutor {
+        Ok(BdaExecutor {
             cm_accessor: duniter_core::dbs::kv_typed::prelude::Arc::new(mock_cm),
             currency: "g1".to_owned(),
             dbs_pool: threadpool.into_async_handler(),
@@ -299,11 +299,11 @@ mod tests {
             .expect_get_current_meta::<u64>()
             .times(1)
             .returning(|f| Some(f(&CurrentMeta::default())));
-        let bca_executor = create_bca_executor(mock_cm, MockDbsReader::new())
+        let bda_executor = create_bda_executor(mock_cm, MockDbsReader::new())
             .expect("fail to create bca executor");
 
         //println!("bytes={:?}", bytes);
-        let bytes_res = bca_executor.execute(io_stream(bytes), false).await;
+        let bytes_res = bda_executor.execute(io_stream(bytes), false).await;
         //println!("bytes_res={:?}", bytes_res);
         let bca_res: Vec<Result<BcaResp, BcaReqExecError>> =
             AsyncBincodeReader::<_, Result<BcaResp, BcaReqExecError>>::from(&bytes_res[..])
@@ -337,11 +337,11 @@ mod tests {
         //println!("bytes_for_bincode={:?}", &bytes[4..]);
         assert_eq!(req, bincode_opts().deserialize(&bytes[4..])?);
 
-        let bca_executor = create_bca_executor(MockAsyncAccessor::new(), MockDbsReader::new())
+        let bda_executor = create_bda_executor(MockAsyncAccessor::new(), MockDbsReader::new())
             .expect("fail to create bca executor");
 
         //println!("bytes={:?}", bytes);
-        let bytes_res = bca_executor.execute(io_stream(bytes), false).await;
+        let bytes_res = bda_executor.execute(io_stream(bytes), false).await;
         //println!("bytes_res={:?}", bytes_res);
         let bca_res: Vec<Result<BcaResp, BcaReqExecError>> =
             AsyncBincodeReader::<_, Result<BcaResp, BcaReqExecError>>::from(&bytes_res[..])
@@ -382,11 +382,11 @@ mod tests {
             .expect_get_current_meta::<u64>()
             .times(1)
             .returning(|f| Some(f(&CurrentMeta::default())));
-        let bca_executor = create_bca_executor(mock_cm, MockDbsReader::new())
+        let bda_executor = create_bda_executor(mock_cm, MockDbsReader::new())
             .expect("fail to create bca executor");
 
         //println!("bytes={:?}", bytes);
-        let bytes_res = bca_executor.execute(io_stream(bytes), false).await;
+        let bytes_res = bda_executor.execute(io_stream(bytes), false).await;
         //println!("bytes_res={:?}", bytes_res);
         let bca_res: Vec<Result<BcaResp, BcaReqExecError>> =
             AsyncBincodeReader::<_, Result<BcaResp, BcaReqExecError>>::from(&bytes_res[..])
diff --git a/db/Cargo.toml b/db/Cargo.toml
index 24e4e92373553a30744727f5722c8fb880735d83..8458834c9c66006bbab515ddf8a8e5807737c36a 100644
--- a/db/Cargo.toml
+++ b/db/Cargo.toml
@@ -14,7 +14,7 @@ path = "src/lib.rs"
 bincode = "1.3"
 chrono = { version = "0.4.15", optional = true }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core" }
-dubp = { version = "0.54.1", features = ["duniter"] }
+dubp = { version = "0.55.1", features = ["duniter"] }
 parking_lot = "0.11.0"
 paste = "1.0.2"
 serde = { version = "1.0.105", features = ["derive"] }
diff --git a/dbs-reader/Cargo.toml b/dbs-reader/Cargo.toml
index 791231e2be6253d6e129e2e7f8c172465697e210..7e1d13023623e52ff602db6bf1f16a47f0403d91 100644
--- a/dbs-reader/Cargo.toml
+++ b/dbs-reader/Cargo.toml
@@ -17,13 +17,13 @@ mock = ["mockall"]
 [dependencies]
 anyhow = "1.0.34"
 arrayvec = { version = "0.7", features = ["serde"] }
-duniter-bca-types = { path = "../bca/types" }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core" }
 duniter-gva-db = { path = "../db" }
-dubp = { version = "0.54.1", features = ["duniter"] }
+dubp = { version = "0.55.1", features = ["duniter"] }
 flate2 = { version = "1.0", features = ["zlib-ng-compat"], default-features = false }
 mockall = { version = "0.9.1", optional = true }
 resiter = "0.4.0"
+rand = "0.8"
 
 [dev-dependencies]
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["mem"] }
diff --git a/dbs-reader/src/lib.rs b/dbs-reader/src/lib.rs
index ba6d79ec3eb1eeaddd7c8d34c3f4d05807102735..05737371595ee03eeec398f7ae0b9faf8753052a 100644
--- a/dbs-reader/src/lib.rs
+++ b/dbs-reader/src/lib.rs
@@ -34,15 +34,15 @@ pub mod uds_of_pubkey;
 pub mod utxos;
 
 pub use crate::pagination::{PageInfo, PagedData};
-pub use duniter_bca_types::MAX_FIRST_UTXOS;
+pub use dubp::bda_types::MAX_FIRST_UTXOS;
 
 use crate::pagination::{has_next_page, has_previous_page};
 use arrayvec::ArrayVec;
+use dubp::bda_types::utxo::Utxo;
 use dubp::common::crypto::keys::ed25519::PublicKey;
 use dubp::documents::transaction::TransactionDocumentV10;
 use dubp::{block::DubpBlockV10, common::crypto::hashs::Hash};
 use dubp::{common::prelude::BlockNumber, wallet::prelude::*};
-use duniter_bca_types::utxo::Utxo;
 use duniter_core::dbs::{databases::network_v1::NetworkV1DbReadable, FileBackend};
 use duniter_core::dbs::{
     databases::{
@@ -56,6 +56,7 @@ use duniter_core::dbs::{
     kv_typed::prelude::*, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, UtxoIdDbV2,
 };
 use duniter_gva_db::{GvaIdtyDbV1, GvaTxDbV1, GvaUtxoIdDbV1, GvaV1DbReadable, GvaV1DbRo};
+use rand::seq::SliceRandom;
 use resiter::filter::Filter;
 use resiter::filter_map::FilterMap;
 use resiter::flatten::Flatten;
@@ -134,6 +135,11 @@ pub trait DbsReader {
         bc_db: &BcDb,
         current_block_meta: &BlockMetaV2,
     ) -> anyhow::Result<Vec<BlockMetaV2>>;
+    fn get_some_peers<DB: 'static + NetworkV1DbReadable>(
+        &self,
+        dunp_db: &DB,
+        n: usize,
+    ) -> KvResult<Vec<duniter_core::dbs::PeerCardDbV1>>;
     fn get_txs_history_bc_received(
         &self,
         from: Option<u64>,
@@ -281,6 +287,14 @@ impl DbsReader for DbsReaderImpl {
         self.get_current_frame_(bc_db, current_block_meta)
     }
 
+    fn get_some_peers<DB: 'static + NetworkV1DbReadable>(
+        &self,
+        dunp_db: &DB,
+        n: usize,
+    ) -> KvResult<Vec<duniter_core::dbs::PeerCardDbV1>> {
+        self.get_some_peers_(dunp_db, n)
+    }
+
     fn get_txs_history_bc_received(
         &self,
         from: Option<u64>,
diff --git a/dbs-reader/src/network.rs b/dbs-reader/src/network.rs
index b144c7e91dba378f614ced0101e37bf32096e656..fc0aab728251bdc7dcbeb11a6501353398124aa5 100644
--- a/dbs-reader/src/network.rs
+++ b/dbs-reader/src/network.rs
@@ -31,8 +31,8 @@ impl DbsReaderImpl {
         }
         network_db.peers_old().iter(.., |it| {
             it.values()
-                .map_ok(|peer| {
-                    peer.endpoints.into_iter().filter(|endpoint| {
+                .map_ok(|peer_db| {
+                    peer_db.peer.endpoints.into_iter().filter(|endpoint| {
                         api_list
                             .iter()
                             .any(|api| endpoint.starts_with(api.as_str()))
@@ -42,6 +42,24 @@ impl DbsReaderImpl {
                 .collect::<Result<Vec<String>, _>>()
         })
     }
+    pub(super) fn get_some_peers_<DB: NetworkV1DbReadable>(
+        &self,
+        dunp_db: &DB,
+        n: usize,
+    ) -> KvResult<Vec<PeerCardDbV1>> {
+        let peers: Vec<PeerCardDbV1> = dunp_db
+            .peers_old()
+            .iter(.., |it| it.values().collect::<KvResult<_>>())?;
+
+        if n == 0 {
+            Ok(peers)
+        } else {
+            Ok(peers
+                .choose_multiple(&mut rand::thread_rng(), n)
+                .cloned()
+                .collect())
+        }
+    }
     pub(super) fn peers_and_heads_<DB: NetworkV1DbReadable>(
         &self,
         dunp_db: &DB,
@@ -49,11 +67,12 @@ impl DbsReaderImpl {
         Ok(dunp_db.peers_old().iter(.., |it| {
             it.values()
                 .filter_map(|peer_res| {
-                    if let Ok(peer) = peer_res {
-                        let k_min = duniter_core::dbs::DunpNodeIdV1Db::new(0, peer.pubkey);
-                        let k_max = duniter_core::dbs::DunpNodeIdV1Db::new(u32::MAX, peer.pubkey);
+                    if let Ok(peer_db) = peer_res {
+                        let k_min = duniter_core::dbs::DunpNodeIdV1Db::new(0, peer_db.peer.pubkey);
+                        let k_max =
+                            duniter_core::dbs::DunpNodeIdV1Db::new(u32::MAX, peer_db.peer.pubkey);
                         Some((
-                            peer,
+                            peer_db,
                             dunp_db.heads_old().iter(k_min..k_max, |it| {
                                 it.values().filter_map(|head| head.ok()).collect()
                             }),
@@ -70,9 +89,10 @@ impl DbsReaderImpl {
 #[cfg(test)]
 mod tests {
     use super::*;
-    use dubp::crypto::keys::PublicKey as _;
+    use dubp::{crypto::keys::PublicKey as _, peer::PeerV10};
     use duniter_core::dbs::databases::network_v1::NetworkV1DbWritable;
     use duniter_core::dbs::PeerCardDbV1;
+    use smallvec::smallvec;
 
     #[test]
     fn test_empty_endpoints() -> KvResult<()> {
@@ -105,7 +125,10 @@ mod tests {
         let db_reader = DbsReaderImpl::mem();
         let pk = PublicKey::default();
         let peer = PeerCardDbV1 {
-            endpoints: vec![dummy_endpoint.to_owned()],
+            peer: PeerV10 {
+                endpoints: smallvec![dummy_endpoint.to_owned()],
+                ..Default::default()
+            },
             ..Default::default()
         };
 
@@ -130,7 +153,10 @@ mod tests {
         let db_reader = DbsReaderImpl::mem();
         let pk = PublicKey::default();
         let peer = PeerCardDbV1 {
-            endpoints: vec![dummy_endpoint.to_owned()],
+            peer: PeerV10 {
+                endpoints: smallvec![dummy_endpoint.to_owned()],
+                ..Default::default()
+            },
             ..Default::default()
         };
 
@@ -156,7 +182,10 @@ mod tests {
         dunp_db.peers_old_write().upsert(
             PubKeyKeyV2(pubkey),
             PeerCardDbV1 {
-                pubkey,
+                peer: PeerV10 {
+                    pubkey,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
         )?;
@@ -177,7 +206,10 @@ mod tests {
             db_reader.peers_and_heads(&dunp_db)?,
             vec![(
                 PeerCardDbV1 {
-                    pubkey,
+                    peer: PeerV10 {
+                        pubkey,
+                        ..Default::default()
+                    },
                     ..Default::default()
                 },
                 vec![
diff --git a/gql/Cargo.toml b/gql/Cargo.toml
index 68a1401c5b931714bbdb38956a2ce42bac566a2f..d8e30d64d79ab9e165fdbfbafb6107b0e9ade4c4 100644
--- a/gql/Cargo.toml
+++ b/gql/Cargo.toml
@@ -10,8 +10,7 @@ anyhow = "1.0.33"
 arrayvec = { version = "0.7", features = ["serde"] }
 async-graphql = { version = "2.8", features = ["log"] }
 async-trait = "0.1.41"
-dubp = { version = "0.54.1", features = ["duniter"] }
-duniter-bca-types = { path = "../bca/types" }
+dubp = { version = "0.55.1", features = ["duniter"] }
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core" }
 duniter-gva-db = { path = "../db" }
 duniter-gva-dbs-reader = { path = "../dbs-reader" }
diff --git a/gql/src/entities/network.rs b/gql/src/entities/network.rs
index 094821c9a9dd0567661ff7769f91dfae70d0d609..7f532a7cae683e4a50a117f552fc6012681a5c32 100644
--- a/gql/src/entities/network.rs
+++ b/gql/src/entities/network.rs
@@ -28,16 +28,16 @@ pub struct PeerCardGva {
     pub member: bool,
 }
 impl From<duniter_core::dbs::PeerCardDbV1> for PeerCardGva {
-    fn from(peer: duniter_core::dbs::PeerCardDbV1) -> Self {
+    fn from(peer_db: duniter_core::dbs::PeerCardDbV1) -> Self {
         Self {
-            version: peer.version,
-            currency: peer.currency,
-            pubkey: peer.pubkey.to_base58(),
-            blockstamp: peer.blockstamp.to_string(),
-            endpoints: peer.endpoints,
-            status: if peer.status { "UP" } else { "DOWN" }.to_owned(),
-            signature: peer.signature.to_base64(),
-            member: peer.member,
+            version: 10,
+            currency: peer_db.peer.currency,
+            pubkey: peer_db.peer.pubkey.to_base58(),
+            blockstamp: peer_db.peer.blockstamp.to_string(),
+            endpoints: peer_db.peer.endpoints.to_vec(),
+            status: if peer_db.status { "UP" } else { "DOWN" }.to_owned(),
+            signature: peer_db.peer.signature.to_base64(),
+            member: peer_db.member,
         }
     }
 }
diff --git a/gql/src/lib.rs b/gql/src/lib.rs
index edb2e4537f7d95b948220b4c576b020135acfae6..6948264e2b4d747c21bb8e7f89f7b9472838c570 100644
--- a/gql/src/lib.rs
+++ b/gql/src/lib.rs
@@ -54,6 +54,7 @@ use crate::tests::AsyncAccessor;
 use crate::tests::DbsReaderImpl;
 use async_graphql::connection::{Connection, Edge, EmptyFields};
 use async_graphql::validators::{IntGreaterThan, IntRange, ListMaxLength, ListMinLength};
+use dubp::bda_types::MAX_FIRST_UTXOS;
 use dubp::common::crypto::keys::{ed25519::PublicKey, PublicKey as _};
 use dubp::common::prelude::*;
 use dubp::crypto::hashs::Hash;
@@ -61,7 +62,6 @@ use dubp::documents::prelude::*;
 use dubp::documents::transaction::{TransactionDocumentTrait, TransactionDocumentV10};
 use dubp::documents_parser::prelude::*;
 use dubp::wallet::prelude::*;
-use duniter_bca_types::MAX_FIRST_UTXOS;
 use duniter_core::dbs::databases::txs_mp_v2::TxsMpV2DbReadable;
 use duniter_core::dbs::prelude::*;
 use duniter_core::dbs::{kv_typed::prelude::*, FileBackend};
diff --git a/indexer/Cargo.toml b/indexer/Cargo.toml
index 6b15dbc3984d8bbe7a03116dbbf762a263b7e595..f6bc0f7822be0fe3e8913d738f010330a102ec6e 100644
--- a/indexer/Cargo.toml
+++ b/indexer/Cargo.toml
@@ -17,7 +17,7 @@ bincode = "1.3"
 duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core" }
 duniter-gva-db = { path = "../db" }
 duniter-gva-dbs-reader = { path = "../dbs-reader" }
-dubp = { version = "0.54.1", features = ["duniter"] }
+dubp = { version = "0.55.1", features = ["duniter"] }
 flate2 = { version = "1.0", features = ["zlib-ng-compat"], default-features = false }
 log = "0.4"
 once_cell = "1.7"
diff --git a/src/lib.rs b/src/lib.rs
index 3d57c50ad608d97ce5d7150b79033a2cb8303e87..f6d1b27610ce3ebacfb19a2fe0327e3d85756cac 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -243,9 +243,9 @@ impl GvaModule {
     ) {
         log::info!("GvaServer::start: conf={:?}", conf);
 
-        // Create BcaExecutor and GvaSchema
+        // Create BdaExecutor and GvaSchema
         let self_pubkey = self_keypair.public_key();
-        duniter_bca::set_bca_executor(
+        duniter_bda::set_bda_executor(
             currency.clone(),
             AsyncAccessor::new(),
             dbs_pool.clone(),
diff --git a/src/warp_.rs b/src/warp_.rs
index 92ddd61aea229e688e7dd0f4e88fbb7d7df8deb8..bcde9d59aac1b096159fe69586e27723286b2bd9 100644
--- a/src/warp_.rs
+++ b/src/warp_.rs
@@ -228,7 +228,7 @@ async fn process_bincode_batch_queries(
     is_whitelisted: bool,
 ) -> Result<ServerResponse, warp::Rejection> {
     Ok(ServerResponse::Bincode(
-        duniter_bca::execute(body_reader, is_whitelisted).await,
+        duniter_bda::execute(body_reader, is_whitelisted).await,
     ))
 }