diff --git a/Cargo.lock b/Cargo.lock
index 3083bb0c39c6ee31796f00527f0c7fc96de6750c..f0b0019f2ea788c1c010ae305345e217baf9ded4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1046,9 +1046,9 @@ checksum = "4bb454f0228b18c7f4c3b0ebbee346ed9c52e7443b0999cd543ff3571205701d"
 
 [[package]]
 name = "dubp"
-version = "0.49.0"
+version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b9617091ba0d0a0cc95392655b0b7136fee3b63101d64c0fd0a5c2741983f18"
+checksum = "1669c61ccfe0d3fc7be8fe3175ebd401b9c879f638425f31e92777c73b32ea86"
 dependencies = [
  "dubp-block",
  "dubp-common",
@@ -1060,9 +1060,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-block"
-version = "0.49.0"
+version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53a15b5320e575d8549a549e1950c08a166531d1edf687da4d98fecb00d5bdf7"
+checksum = "c602ecf3e703abf6492b5bb66fbd9ad658f974407a7d7d13651f6a1a26122028"
 dependencies = [
  "dubp-documents",
  "dubp-documents-parser",
@@ -1075,9 +1075,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-common"
-version = "0.49.0"
+version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da764b34a61ecb52fa90dc11f5a44d6bc9599b043d37592b5102b95d993fd677"
+checksum = "515fb09166a50b4543a99c42359fc4afa5a4c7af118c6f9627575c2760f3fef8"
 dependencies = [
  "dup-crypto",
  "serde",
@@ -1088,9 +1088,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents"
-version = "0.49.0"
+version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8810039b6dd6a101109aebc9836ddec58366052803f824c56016889d9444f5cf"
+checksum = "ccc9327c62778ee4fd060c0efbe32c6cfda5e317c4a2eb4ddee8293fbd278904"
 dependencies = [
  "beef",
  "dubp-wallet",
@@ -1102,9 +1102,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents-parser"
-version = "0.49.0"
+version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c791c77a3f9c670666dc41f861481cc80eb1ad193584727adfee792350fd3129"
+checksum = "271ce4a6bebfdfdaefb0e51f57c9bb04976fce5fbe2744dd60c1dcf857c60c20"
 dependencies = [
  "dubp-documents",
  "json-pest-parser",
@@ -1116,9 +1116,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-wallet"
-version = "0.49.0"
+version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ef8e7c5334ddbc7899f83911026ebc324ba7fc7232c7ca5265e611490dbd282"
+checksum = "f6e65a121fa6745038e903ed3d1eb6a97f9658c6c6e2bfbf7e9ffdaf34161d23"
 dependencies = [
  "byteorder",
  "dubp-common",
@@ -1475,9 +1475,9 @@ dependencies = [
 
 [[package]]
 name = "dup-crypto"
-version = "0.49.0"
+version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0be04829b31b18bacf5317001366d807e5fbd02085ee6348508c1299b5bcaf6c"
+checksum = "3032421000ca2cdd372bd72f4c548be7f1386d357abb0936291890064d3072e8"
 dependencies = [
  "aes",
  "arrayvec",
diff --git a/neon/native/Cargo.toml b/neon/native/Cargo.toml
index 95588abc66c2c958aa8aef3650a2e4309c2cd33e..9cd489240631307314b1be99657370ecf607d88c 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.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 dubp-wot = { path = "../../rust-libs/dubp-wot" }
 duniter-server = { path = "../../rust-libs/duniter-server" }
 flate2 = "1.0.16"
diff --git a/rust-bins/duniter-dbex/Cargo.toml b/rust-bins/duniter-dbex/Cargo.toml
index 63f36fe88ffef1570e417a91365998774fe33a4f..6b11cab3696ef4ad8d13940d68b7653be8f9172d 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.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-dbs = { path = "../../rust-libs/duniter-dbs", default-features = false, features = ["explorer", "leveldb_backend", "sled_backend"] }
 duniter-dbs-write-ops = { path = "../../rust-libs/duniter-dbs-write-ops", default-features = false, features = ["explorer", "leveldb_backend", "sled_backend"] }
 duniter-gva-db = { path = "../../rust-libs/modules/gva/db", default-features = false, features = ["explorer", "leveldb_backend"] }
diff --git a/rust-libs/duniter-bc-reader/Cargo.toml b/rust-libs/duniter-bc-reader/Cargo.toml
index de3168e45a4521a3a9b9cc73507a328d830a11c6..705ba8d9c6787330e837ce9e313960b670e29d8f 100644
--- a/rust-libs/duniter-bc-reader/Cargo.toml
+++ b/rust-libs/duniter-bc-reader/Cargo.toml
@@ -14,7 +14,7 @@ path = "src/lib.rs"
 [dependencies]
 anyhow = "1.0.34"
 duniter-dbs = { path = "../duniter-dbs" }
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 resiter = "0.4.0"
 
 [dev-dependencies]
diff --git a/rust-libs/duniter-conf/Cargo.toml b/rust-libs/duniter-conf/Cargo.toml
index 25e4ee29fa62170e2d05b7cf693c301e7e316686..41b0d389c9bcd23f910be899b31bdf390009810b 100644
--- a/rust-libs/duniter-conf/Cargo.toml
+++ b/rust-libs/duniter-conf/Cargo.toml
@@ -6,5 +6,5 @@ license = "AGPL-3.0"
 edition = "2018"
 
 [dependencies]
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 serde = { version = "1.0.105", features = ["derive"] }
diff --git a/rust-libs/duniter-dbs-write-ops/Cargo.toml b/rust-libs/duniter-dbs-write-ops/Cargo.toml
index 190e08b4f48bf00dfab8a74b4ffa58e49b6bc181..f5002147d5140b3bd4289d47670c9cec365a565f 100644
--- a/rust-libs/duniter-dbs-write-ops/Cargo.toml
+++ b/rust-libs/duniter-dbs-write-ops/Cargo.toml
@@ -13,7 +13,7 @@ path = "src/lib.rs"
 
 [dependencies]
 chrono = "0.4.19"
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-dbs = { path = "../duniter-dbs" }
 fast-threadpool = "0.2.3"
 log = "0.4.11"
diff --git a/rust-libs/duniter-dbs/Cargo.toml b/rust-libs/duniter-dbs/Cargo.toml
index f75ee58ed55624c281ad67f48724251b842b0271..4e96552e86819e93ae3bae7977b56d34cf3a0c86 100644
--- a/rust-libs/duniter-dbs/Cargo.toml
+++ b/rust-libs/duniter-dbs/Cargo.toml
@@ -16,7 +16,7 @@ arrayvec = "0.5.1"
 bincode = "1.2.1"
 byteorder = "1.3.4"
 chrono = { version = "0.4.15", optional = true }
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 kv_typed = { path = "../tools/kv_typed", default-features = false }
 log = "0.4.8"
 mockall = { version = "0.9.1", optional = true }
diff --git a/rust-libs/duniter-mempools/Cargo.toml b/rust-libs/duniter-mempools/Cargo.toml
index 26263d7ddccf812505f8961abd13cba9735f2292..0c688c6aa22dd190cf0610b62856a1aecb28c8b9 100644
--- a/rust-libs/duniter-mempools/Cargo.toml
+++ b/rust-libs/duniter-mempools/Cargo.toml
@@ -12,7 +12,7 @@ edition = "2018"
 path = "src/lib.rs"
 
 [dependencies]
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-dbs = { path = "../duniter-dbs" }
 duniter-bc-reader = { path = "../duniter-bc-reader" }
 duniter-dbs-write-ops = { path = "../duniter-dbs-write-ops" }
diff --git a/rust-libs/duniter-module/Cargo.toml b/rust-libs/duniter-module/Cargo.toml
index 4eb55445ca1636aacb5eb50b0de951d3bdd79d9c..480b97660207336018e00423d6e798ecc8fe0b75 100644
--- a/rust-libs/duniter-module/Cargo.toml
+++ b/rust-libs/duniter-module/Cargo.toml
@@ -8,7 +8,7 @@ edition = "2018"
 [dependencies]
 anyhow = "1.0.34"
 async-trait = "0.1.41"
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-conf = { path = "../duniter-conf" }
 duniter-dbs = { path = "../duniter-dbs" }
 duniter-mempools = { path = "../duniter-mempools" }
diff --git a/rust-libs/duniter-server/Cargo.toml b/rust-libs/duniter-server/Cargo.toml
index 446403bc3576b02223ffc1b7f989e8e90852cfb9..bb43f4deba74dd0396effa56a7d5372c6cafcedc 100644
--- a/rust-libs/duniter-server/Cargo.toml
+++ b/rust-libs/duniter-server/Cargo.toml
@@ -8,7 +8,7 @@ edition = "2018"
 [dependencies]
 anyhow = "1.0.34"
 cfg-if = "1.0.0"
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-conf = { path = "../duniter-conf" }
 duniter-dbs = { path = "../duniter-dbs" }
 duniter-bc-reader = { path = "../duniter-bc-reader" }
diff --git a/rust-libs/modules/gva/Cargo.toml b/rust-libs/modules/gva/Cargo.toml
index 1dcfcb9efcc4383bd0996847f9e712b66185dc42..5e74b7db7ba3b9477458d8f868575190171f74da 100644
--- a/rust-libs/modules/gva/Cargo.toml
+++ b/rust-libs/modules/gva/Cargo.toml
@@ -12,7 +12,7 @@ async-graphql = "2.2.0"
 async-mutex = "1.4.0"
 async-trait = "0.1.41"
 bytes = "1.0"
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-bca = { path = "./bca" }
 duniter-conf = { path = "../../duniter-conf" }
 duniter-dbs = { path = "../../duniter-dbs" }
diff --git a/rust-libs/modules/gva/bca/Cargo.toml b/rust-libs/modules/gva/bca/Cargo.toml
index bf9ff0288c998cb6b19f40de1f3fbcfd54f8ab26..4fcf042c14a9c4937743ee10d57c07e22cb1d118 100644
--- a/rust-libs/modules/gva/bca/Cargo.toml
+++ b/rust-libs/modules/gva/bca/Cargo.toml
@@ -10,7 +10,7 @@ anyhow = "1.0.33"
 async-bincode = "0.6.1"
 async_io_stream = { version = "0.3.1", features = [ "tokio_io"] }
 bincode = "1.3"
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-bca-types = { path = "types", features = ["duniter"] }
 duniter-dbs = { path = "../../../duniter-dbs" }
 duniter-gva-db = { path = "../db" }
diff --git a/rust-libs/modules/gva/bca/types/Cargo.toml b/rust-libs/modules/gva/bca/types/Cargo.toml
index 18bbf84e910a454a2ca9f16cd6344ca4fa1e01c0..37df065a5c1b5b2c26441c2bc6d5b2af872acc85 100644
--- a/rust-libs/modules/gva/bca/types/Cargo.toml
+++ b/rust-libs/modules/gva/bca/types/Cargo.toml
@@ -7,7 +7,7 @@ edition = "2018"
 
 [dependencies]
 bincode = "1.3"
-dubp = { version = "0.49.0" }
+dubp = { version = "0.50.0" }
 serde = { version = "1.0.105", features = ["derive"] }
 smallvec = { version = "1.4.0", features = ["serde"] }
 thiserror = "1.0.20"
diff --git a/rust-libs/modules/gva/db/Cargo.toml b/rust-libs/modules/gva/db/Cargo.toml
index 0b4bc191363d70bd62d292fc0b1ee8a470273f1f..6aaca74bdf1f67d9bee5c30dbd98ddf72674be43 100644
--- a/rust-libs/modules/gva/db/Cargo.toml
+++ b/rust-libs/modules/gva/db/Cargo.toml
@@ -14,7 +14,7 @@ path = "src/lib.rs"
 bincode = "1.2.1"
 chrono = { version = "0.4.15", optional = true }
 duniter-dbs = { path = "../../../duniter-dbs" }
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 kv_typed = { path = "../../../tools/kv_typed", default-features = false, features = ["sled_backend"] }
 parking_lot = "0.11.0"
 paste = "1.0.2"
diff --git a/rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs b/rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs
index bba4d469ead51dfe5590fbfad02fab6fbf9cb54e..bb5c767c1e0a12d63a760c97cdff072ea0f121ce 100644
--- a/rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs
+++ b/rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs
@@ -49,6 +49,12 @@ impl WalletHashWithBnV1Db {
 
         u32::from_be_bytes(unsafe { std::mem::transmute(buffer) })
     }
+    pub fn wallet_hash_interval(wallet_hash: Hash) -> (Self, Self) {
+        (
+            Self::new(wallet_hash, BlockNumber(0)),
+            Self::new(wallet_hash, BlockNumber(u32::MAX)),
+        )
+    }
 }
 
 impl Default for WalletHashWithBnV1Db {
diff --git a/rust-libs/modules/gva/dbs-reader/Cargo.toml b/rust-libs/modules/gva/dbs-reader/Cargo.toml
index a7961361647204e12b9395c1168de7318dc6984f..2d5c78ac7641279d1be55c4e55e7dde4771f01de 100644
--- a/rust-libs/modules/gva/dbs-reader/Cargo.toml
+++ b/rust-libs/modules/gva/dbs-reader/Cargo.toml
@@ -19,7 +19,7 @@ anyhow = "1.0.34"
 arrayvec = "0.5.1"
 duniter-dbs = { path = "../../../duniter-dbs" }
 duniter-gva-db = { path = "../db" }
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 mockall = { version = "0.9.1", optional = true }
 resiter = "0.4.0"
 
diff --git a/rust-libs/modules/gva/gql/Cargo.toml b/rust-libs/modules/gva/gql/Cargo.toml
index de7985e6a31cd371f85c21997b54b3139b899e6f..30539cd3583d1c02ec8202e7d38b8dc0d20827de 100644
--- a/rust-libs/modules/gva/gql/Cargo.toml
+++ b/rust-libs/modules/gva/gql/Cargo.toml
@@ -10,7 +10,7 @@ anyhow = "1.0.33"
 arrayvec = "0.5.1"
 async-graphql = "2.2.0"
 async-trait = "0.1.41"
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-conf = { path = "../../../duniter-conf" }
 duniter-dbs = { path = "../../../duniter-dbs" }
 duniter-bc-reader = { path = "../../../duniter-bc-reader" }
diff --git a/rust-libs/modules/gva/gql/src/queries/gen_tx.rs b/rust-libs/modules/gva/gql/src/queries/gen_tx.rs
index 3097dad1a72eb9f9c72ccc5cf3a8ebbbbf74484f..1cd022ffc5b4e078467d2ef428afd5af716fcd09 100644
--- a/rust-libs/modules/gva/gql/src/queries/gen_tx.rs
+++ b/rust-libs/modules/gva/gql/src/queries/gen_tx.rs
@@ -102,8 +102,7 @@ impl GenTxsQuery {
             String,
         >,
         issuer: PubKeyGva,
-        #[graphql(desc = "Recipient address (Ed25519 public key on base 58 representation)")]
-        recipient: PubKeyGva,
+        #[graphql(desc = "Recipient address")] recipient: PkOrScriptGva,
         #[graphql(desc = "Use mempool sources", default = false)] use_mempool_sources: bool,
     ) -> async_graphql::Result<Vec<String>> {
         let comment = comment.unwrap_or_default();
diff --git a/rust-libs/modules/gva/indexer/Cargo.toml b/rust-libs/modules/gva/indexer/Cargo.toml
index 0fea9a3b03ebc7e075a456869cdb6e82e211910d..6161ff4a4e8c903ac5558c610a42eae2fda7763c 100644
--- a/rust-libs/modules/gva/indexer/Cargo.toml
+++ b/rust-libs/modules/gva/indexer/Cargo.toml
@@ -15,7 +15,7 @@ path = "src/lib.rs"
 anyhow = "1.0.34"
 duniter-dbs = { path = "../../../duniter-dbs" }
 duniter-gva-db = { path = "../db" }
-dubp = { version = "0.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 once_cell = "1.5.2"
 resiter = "0.4.0"
 
diff --git a/rust-libs/modules/gva/indexer/src/lib.rs b/rust-libs/modules/gva/indexer/src/lib.rs
index 38a5558cdb57f89f4bace51c206152909ea42fb4..333e1981eb0beca225a5c995773c2aeb7efa6c9b 100644
--- a/rust-libs/modules/gva/indexer/src/lib.rs
+++ b/rust-libs/modules/gva/indexer/src/lib.rs
@@ -243,6 +243,7 @@ mod tests {
         documents::transaction::TransactionDocumentV10Stringified,
         documents_parser::prelude::FromStringObject,
     };
+
     #[test]
     fn test_gva_apply_block() -> anyhow::Result<()> {
         let gva_db = GvaV1Db::<Mem>::open(MemConf::default())?;
@@ -412,6 +413,7 @@ mod tests {
 
         Ok(())
     }
+
     #[test]
     fn test_gva_revert_block() -> anyhow::Result<()> {
         let gva_db = GvaV1Db::<Mem>::open(MemConf::default())?;
@@ -467,7 +469,6 @@ mod tests {
             number: 2,
             version: 10,
             median_time: 5_247,
-            dividend: Some(1000),
             transactions: vec![TransactionDocumentV10Stringified {
                 currency: "test".to_owned(),
                 blockstamp: "0-0000000000000000000000000000000000000000000000000000000000000000".to_owned(),
@@ -476,8 +477,7 @@ mod tests {
                 inputs: vec!["400:0:T:0000000000000000000000000000000000000000000000000000000000000000:1".to_owned()],
                 unlocks: vec![],
                 outputs: vec![
-                    "300:0:SIG(D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx)".to_owned(),
-                    "100:0:SIG(4fHMTFBMo5sTQEc5p1CNWz28S4mnnqdUBmECq1zt4n2m)".to_owned(),
+                    "400:0:SIG(4fHMTFBMo5sTQEc5p1CNWz28S4mnnqdUBmECq1zt4n2m)".to_owned(),
                 ],
                 comment: "".to_owned(),
                 signatures: vec![],
@@ -491,6 +491,62 @@ mod tests {
 
         apply_block(&b2, &gva_db)?;
 
+        let b3 = DubpBlockV10::from_string_object(&DubpBlockV10Stringified {
+            number: 3,
+            version: 10,
+            median_time: 5_249,
+            transactions: vec![TransactionDocumentV10Stringified {
+                currency: "test".to_owned(),
+                blockstamp: "0-0000000000000000000000000000000000000000000000000000000000000000".to_owned(),
+                locktime: 0,
+                issuers: vec!["4fHMTFBMo5sTQEc5p1CNWz28S4mnnqdUBmECq1zt4n2m".to_owned()],
+                inputs: vec!["400:0:T:0101010101010101010101010101010101010101010101010101010101010101:0".to_owned()],
+                unlocks: vec![],
+                outputs: vec![
+                    "400:0:SIG(D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx)".to_owned(),
+                ],
+                comment: "".to_owned(),
+                signatures: vec![],
+                hash: Some("0202020202020202020202020202020202020202020202020202020202020202".to_owned()),
+            }],
+            inner_hash: Some("0000000A65A12DB95B3153BCD05DB4D5C30CC7F0B1292D9FFBC3DE67F72F6040".to_owned()),
+            signature: "7B0hvcfajE2G8nBLp0vLVaQcQdQIyli21Gu8F2l+nimKHRe+fUNi+MWd1e/u29BYZa+RZ1yxhbHIbFzytg7fAA==".to_owned(),
+            hash: Some("0000000000000000000000000000000000000000000000000000000000000000".to_owned()),
+            ..Default::default()
+        })?;
+
+        apply_block(&b3, &gva_db)?;
+
+        revert_block(&b3, &gva_db)?;
+
+        assert_eq!(gva_db.blockchain_time().count()?, 3);
+        assert_eq!(gva_db.blockchain_time().get(&U32BE(2))?, Some(5_247));
+        assert_eq!(gva_db.balances().count()?, 2);
+        assert_eq!(
+            gva_db.balances().get(&WalletConditionsV2(s1.clone()))?,
+            Some(SourceAmountValV2(SourceAmount::ZERO))
+        );
+        assert_eq!(
+            gva_db.balances().get(&WalletConditionsV2(s2.clone()))?,
+            Some(SourceAmountValV2(SourceAmount::with_base0(1_000)))
+        );
+        assert_eq!(gva_db.gva_utxos().count()?, 2);
+        assert_eq!(
+            gva_db
+                .gva_utxos()
+                .iter(.., |it| it.collect::<KvResult<Vec<_>>>())?,
+            vec![
+                (
+                    GvaUtxoIdDbV1::new(s2.clone(), 1, Hash::default(), 0),
+                    SourceAmountValV2(SourceAmount::with_base0(600))
+                ),
+                (
+                    GvaUtxoIdDbV1::new(s2.clone(), 2, Hash([1u8; 32]), 0),
+                    SourceAmountValV2(SourceAmount::with_base0(400))
+                ),
+            ]
+        );
+
         revert_block(&b2, &gva_db)?;
 
         assert_eq!(gva_db.blockchain_time().count()?, 2);
@@ -525,15 +581,12 @@ mod tests {
 
         assert_eq!(gva_db.blockchain_time().count()?, 1);
         assert_eq!(gva_db.blockchain_time().get(&U32BE(0))?, Some(5_243));
-        assert_eq!(gva_db.balances().count()?, 2);
+        assert_eq!(gva_db.balances().count()?, 1);
         assert_eq!(
             gva_db.balances().get(&WalletConditionsV2(s1))?,
             Some(SourceAmountValV2(SourceAmount::with_base0(1000)))
         );
-        assert_eq!(
-            gva_db.balances().get(&WalletConditionsV2(s2))?,
-            Some(SourceAmountValV2(SourceAmount::with_base0(0)))
-        );
+        assert_eq!(gva_db.balances().get(&WalletConditionsV2(s2))?, None);
 
         Ok(())
     }
diff --git a/rust-libs/modules/gva/indexer/src/tx.rs b/rust-libs/modules/gva/indexer/src/tx.rs
index 740d174cac05266612aa13ab9871f8f180e1e911..709ebd5577ac89f27afb480ce0964bb748e2918c 100644
--- a/rust-libs/modules/gva/indexer/src/tx.rs
+++ b/rust-libs/modules/gva/indexer/src/tx.rs
@@ -83,7 +83,15 @@ pub(crate) fn apply_tx<B: Backend>(
             .or_default()
             .insert(tx_hash);
         // Decrease account balance
-        decrease_account_balance::<B>(account_script, &mut gva_db.balances, input.amount)?;
+        decrease_account_balance::<B>(
+            account_script,
+            account_script_hash,
+            &mut gva_db.balances,
+            input.amount,
+            &mut gva_db.gva_identities,
+            false,
+            &mut gva_db.txs_by_recipient,
+        )?;
     }
 
     for (output_index, output) in tx.get_outputs().iter().enumerate() {
@@ -165,12 +173,19 @@ pub(crate) fn revert_tx<B: Backend>(
             )?;
 
             // Remove on col `txs_by_recipient`
-            gva_db
-                .txs_by_recipient
-                .remove(WalletHashWithBnV1Db::new(utxo_script_hash, block_number));
+            let k = WalletHashWithBnV1Db::new(utxo_script_hash, block_number);
+            gva_db.txs_by_recipient.remove(k);
 
             // Decrease account balance
-            decrease_account_balance::<B>(script.clone(), &mut gva_db.balances, output.amount)?;
+            decrease_account_balance::<B>(
+                script.clone(),
+                utxo_script_hash,
+                &mut gva_db.balances,
+                output.amount,
+                &mut gva_db.gva_identities,
+                true,
+                &mut gva_db.txs_by_recipient,
+            )?;
         }
         // Recreate UTXOs consumed by this tx (and update balance)
         for input in tx_db.tx.get_inputs() {
@@ -234,17 +249,44 @@ pub(crate) fn revert_tx<B: Backend>(
 
 fn decrease_account_balance<B: Backend>(
     account_script: WalletScriptV10,
+    account_script_hash: Hash,
     balances: &mut TxColRw<B::Col, BalancesEvent>,
     decrease_amount: SourceAmount,
+    identities: &mut TxColRw<B::Col, GvaIdentitiesEvent>,
+    revert: bool,
+    txs_by_recipients: &mut TxColRw<B::Col, TxsByRecipientEvent>,
 ) -> KvResult<()> {
     if let Some(SourceAmountValV2(balance)) =
         balances.get(WalletConditionsV2::from_ref(&account_script))?
     {
         let new_balance = balance - decrease_amount;
-        balances.upsert(
-            WalletConditionsV2(account_script),
-            SourceAmountValV2(new_balance),
-        );
+        let remove_balance = if revert && new_balance == SourceAmount::ZERO {
+            let (k_min, k_max) = WalletHashWithBnV1Db::wallet_hash_interval(account_script_hash);
+            if txs_by_recipients
+                .iter(k_min..k_max, |it| it.keys().next_res())?
+                .is_some()
+            {
+                false
+            } else if let Some(pubkey) = account_script.as_single_sig() {
+                if let Some(idty) = identities.get(&PubKeyKeyV2(pubkey))? {
+                    idty.first_ud.is_none()
+                } else {
+                    true
+                }
+            } else {
+                true
+            }
+        } else {
+            false
+        };
+        if remove_balance {
+            balances.remove(WalletConditionsV2(account_script));
+        } else {
+            balances.upsert(
+                WalletConditionsV2(account_script),
+                SourceAmountValV2(new_balance),
+            );
+        }
     }
     Ok(())
 }
@@ -458,7 +500,7 @@ mod tests {
             gva_db
                 .balances()
                 .get(WalletConditionsV2::from_ref(&script2))?,
-            Some(SourceAmountValV2(SourceAmount::ZERO))
+            None
         );
         assert_eq!(
             gva_db
diff --git a/rust-libs/tests/duniter-integration-tests/Cargo.toml b/rust-libs/tests/duniter-integration-tests/Cargo.toml
index 1f329bb5771a7d441fce1ff66109bc43cfff39c4..15f7a8353d5fa75831bbcde0f84ee1e1eafa5626 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.49.0", features = ["duniter"] }
+dubp = { version = "0.50.0", features = ["duniter"] }
 duniter-conf = { path = "../../duniter-conf" }
 duniter-dbs = { path = "../../duniter-dbs" }
 duniter-bc-reader = { path = "../../duniter-bc-reader" }