diff --git a/rust-libs/modules/gva/bca/src/exec_req_type/prepare_simple_payment.rs b/rust-libs/modules/gva/bca/src/exec_req_type/prepare_simple_payment.rs index 89bfe33ce9851936468a37f2c7efa9ce5027966c..05a516a93aa31bbaf93fd098f584487166d7ad16 100644 --- a/rust-libs/modules/gva/bca/src/exec_req_type/prepare_simple_payment.rs +++ b/rust-libs/modules/gva/bca/src/exec_req_type/prepare_simple_payment.rs @@ -25,11 +25,21 @@ pub(super) async fn exec_req_prepare_simple_payment( let issuer = params.issuer; let dbs_reader = bca_executor.dbs_reader(); - let (amount, current_block, (inputs, inputs_sum)) = bca_executor + let (amount, block_ref_number, block_ref_hash, (inputs, inputs_sum)) = bca_executor .dbs_pool .execute(move |dbs| { if let Some(current_block) = dbs_reader.get_current_block_meta(&dbs.cm_db)? { + let block_ref_number = if current_block.number < 101 { + 0 + } else { + current_block.number - 101 + }; + let block_ref_hash = dbs_reader + .block(&dbs.bc_db_ro, U32BE(block_ref_number))? + .expect("unreachable") + .hash; let current_base = current_block.unit_base as i64; + if amount.base() > current_base { Err("too long base".into()) } else { @@ -38,7 +48,8 @@ pub(super) async fn exec_req_prepare_simple_payment( } Ok::<_, ExecReqTypeError>(( amount, - current_block, + block_ref_number, + block_ref_hash, dbs_reader.find_inputs( &dbs.bc_db_ro, &dbs.txs_mp_db, @@ -60,8 +71,8 @@ pub(super) async fn exec_req_prepare_simple_payment( Ok(BcaRespTypeV0::PrepareSimplePayment( PrepareSimplePaymentResp { - current_block_number: current_block.number, - current_block_hash: current_block.hash, + current_block_number: block_ref_number, + current_block_hash: block_ref_hash, inputs, inputs_sum, }, @@ -101,6 +112,10 @@ mod tests { .expect_get_current_block_meta::<CmV1Db<MemSingleton>>() .times(1) .returning(|_| Ok(Some(BlockMetaV2::default()))); + dbs_reader + .expect_block() + .times(1) + .returning(|_, _| Ok(Some(BlockMetaV2::default()))); let bca_executor = create_bca_executor(dbs_reader).expect("fail to create bca executor"); let resp_res = exec_req_prepare_simple_payment( @@ -122,6 +137,10 @@ mod tests { .expect_get_current_block_meta::<CmV1Db<MemSingleton>>() .times(1) .returning(|_| Ok(Some(BlockMetaV2::default()))); + dbs_reader + .expect_block() + .times(1) + .returning(|_, _| Ok(Some(BlockMetaV2::default()))); dbs_reader .expect_find_inputs::<BcV2DbRo<FileBackend>, TxsMpV2Db<FileBackend>>() .times(1) @@ -158,6 +177,10 @@ mod tests { .expect_get_current_block_meta::<CmV1Db<MemSingleton>>() .times(1) .returning(|_| Ok(Some(BlockMetaV2::default()))); + dbs_reader + .expect_block() + .times(1) + .returning(|_, _| Ok(Some(BlockMetaV2::default()))); dbs_reader .expect_find_inputs::<BcV2DbRo<FileBackend>, TxsMpV2Db<FileBackend>>() .times(1) diff --git a/rust-libs/modules/gva/bca/src/lib.rs b/rust-libs/modules/gva/bca/src/lib.rs index d031c7b0bd82f2f28b0e7aa42b713395d3a4dff3..56a67384b5ecc1bb74ca3bc661e2799d6e43d092 100644 --- a/rust-libs/modules/gva/bca/src/lib.rs +++ b/rust-libs/modules/gva/bca/src/lib.rs @@ -35,6 +35,7 @@ use dubp::crypto::keys::{ed25519::Ed25519KeyPair, Signator}; use duniter_bca_types::{ bincode_opts, BcaReq, BcaReqExecError, BcaReqTypeV0, BcaResp, BcaRespTypeV0, BcaRespV0, }; +pub use duniter_dbs::kv_typed::prelude::*; use duniter_dbs::{FileBackend, SharedDbs}; use futures::{prelude::stream::FuturesUnordered, StreamExt, TryStream, TryStreamExt}; use once_cell::sync::OnceCell; @@ -222,12 +223,12 @@ mod tests { pub use duniter_dbs::databases::bc_v2::{BcV2DbReadable, BcV2DbRo}; pub use duniter_dbs::databases::cm_v1::{CmV1Db, CmV1DbReadable}; pub use duniter_dbs::databases::txs_mp_v2::{TxsMpV2Db, TxsMpV2DbReadable}; - pub use duniter_dbs::kv_typed::prelude::*; pub use duniter_dbs::BlockMetaV2; pub use futures::TryStreamExt; mockall::mock! { pub DbsReader { + fn block(&self, bc_db: &BcV2DbRo<FileBackend>, number: U32BE) -> KvResult<Option<BlockMetaV2>>; fn find_inputs<BcDb: 'static + BcV2DbReadable, TxsMpDb: 'static + TxsMpV2DbReadable>( &self, bc_db: &BcDb,