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" }