From 625b600321ae1da9a2c604dd36cbc26481472c69 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Mon, 6 Jan 2025 08:28:40 +0200 Subject: [PATCH] Generate test vectors for batched txs. --- crates/sdk/src/lib.rs | 33 ++++++++++++++++++++++++++ crates/sdk/src/signing.rs | 50 +++++++++++++++++++-------------------- examples/generate_txs.rs | 5 ++-- 3 files changed, 61 insertions(+), 27 deletions(-) diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index 73f6907d30..7fbc22ba4b 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -1269,6 +1269,39 @@ pub mod testing { } } + prop_compose! { + /// Generate an arbitrary batched memoed transaction + pub fn arb_memoed_batch_tx()( + mut header in arb_header(0), + wrapper in arb_wrapper_tx(), + txs in collection::vec(arb_memoed_tx(), 0..=5), + ) -> (Tx, Vec) { + header.tx_type = TxType::Wrapper(Box::new(wrapper)); + let mut batched_tx = Tx { header, sections: vec![] }; + let mut tx_datas = vec![]; + for (tx, tx_data) in txs { + let cmt = tx.first_commitments().unwrap().to_owned(); + batched_tx.add_inner_tx(tx, cmt); + tx_datas.push(tx_data); + } + (batched_tx, tx_datas) + } + } + + prop_compose! { + /// Generate an arbitrary signed batched memoed transaction + pub fn arb_signed_batch_tx()(tx in arb_memoed_batch_tx())( + sigs in collection::vec(arb_signature(tx.0.sechashes()), 0..3), + mut tx in Just(tx), + ) -> (Tx, Vec) { + for sig in sigs { + // Add all the generated signature sections + tx.0.add_section(Section::Authorization(sig)); + } + (tx.0, tx.1) + } + } + prop_compose! { /// Generate an arbitrary vote proposal transaction pub fn arb_vote_proposal_tx()( diff --git a/crates/sdk/src/signing.rs b/crates/sdk/src/signing.rs index a43b432968..da2a52e0ae 100644 --- a/crates/sdk/src/signing.rs +++ b/crates/sdk/src/signing.rs @@ -1061,7 +1061,7 @@ pub async fn to_ledger_vector( blob: HEXLOWER.encode(&tx.serialize_to_vec()), index: 0, valid: true, - name: "Custom_0".to_string(), + name: "__".to_string(), ..Default::default() }; @@ -1092,7 +1092,7 @@ pub async fn to_ledger_vector( .map_err(|err| { Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Init_Account_0".to_string(); + tv.name.push_str("Init_Account__"); let extra = tx .get_section(&init_account.vp_code_hash) @@ -1136,7 +1136,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Become_Validator_0".to_string(); + tv.name.push_str("Become_Validator__"); tv.output .extend(vec!["Type : Become Validator".to_string()]); @@ -1209,7 +1209,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Init_Proposal_0".to_string(); + tv.name.push_str("Init_Proposal__"); let extra = tx .get_section(&init_proposal_data.content) @@ -1271,7 +1271,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Vote_Proposal_0".to_string(); + tv.name.push_str("Vote_Proposal__"); tv.output.extend(vec![ format!("Type : Vote Proposal"), @@ -1294,7 +1294,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Reveal_Pubkey_0".to_string(); + tv.name.push_str("Reveal_Pubkey__"); tv.output.extend(vec![ format!("Type : Reveal Pubkey"), @@ -1312,7 +1312,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Update_Account_0".to_string(); + tv.name.push_str("Update_Account__"); tv.output.extend(vec![ format!("Type : Update Account"), format!("Address : {}", update_account.addr), @@ -1377,7 +1377,7 @@ pub async fn to_ledger_vector( .map_err(|err| { Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Transfer_0".to_string(); + tv.name.push_str("Transfer__"); tv.output.push("Type : Transfer".to_string()); // To facilitate lookups of MASP AssetTypes @@ -1412,7 +1412,7 @@ pub async fn to_ledger_vector( if let Ok(transfer) = MsgTransfer::::try_from_slice(data.as_ref()) { - tv.name = "IBC_Transfer_0".to_string(); + tv.name.push_str("IBC_Transfer__"); tv.output.push("Type : IBC Transfer".to_string()); let transfer_token = format!( "{} {}", @@ -1506,7 +1506,7 @@ pub async fn to_ledger_vector( } else if let Ok(transfer) = MsgNftTransfer::::try_from_slice(data.as_ref()) { - tv.name = "IBC_NFT_Transfer_0".to_string(); + tv.name.push_str("IBC_NFT_Transfer__"); tv.output.push("Type : IBC NFT Transfer".to_string()); tv.output.extend(vec![ format!("Source port : {}", transfer.message.port_id_on_a), @@ -1684,7 +1684,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Bond_0".to_string(); + tv.name.push_str("Bond__"); tv.output.push("Type : Bond".to_string()); if let Some(source) = bond.source.as_ref() { @@ -1717,7 +1717,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Unbond_0".to_string(); + tv.name.push_str("Unbond__"); tv.output.push("Type : Unbond".to_string()); if let Some(source) = unbond.source.as_ref() { @@ -1750,7 +1750,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Withdraw_0".to_string(); + tv.name.push_str("Withdraw__"); tv.output.push("Type : Withdraw".to_string()); if let Some(source) = withdraw.source.as_ref() { @@ -1773,7 +1773,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Claim_Rewards_0".to_string(); + tv.name.push_str("Claim_Rewards__"); tv.output.push("Type : Claim Rewards".to_string()); if let Some(source) = claim.source.as_ref() { @@ -1795,7 +1795,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Change_Commission_0".to_string(); + tv.name.push_str("Change_Commission__"); tv.output.extend(vec![ format!("Type : Change commission"), @@ -1816,7 +1816,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Change_MetaData_0".to_string(); + tv.name.push_str("Change_MetaData__"); tv.output.extend(vec!["Type : Change metadata".to_string()]); @@ -1859,7 +1859,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Change_Consensus_Key_0".to_string(); + tv.name.push_str("Change_Consensus_Key__"); tv.output.extend(vec![ format!("Type : Change consensus key"), @@ -1886,7 +1886,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Unjail_Validator_0".to_string(); + tv.name.push_str("Unjail_Validator__"); tv.output.extend(vec![ format!("Type : Unjail Validator"), @@ -1904,7 +1904,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Deactivate_Validator_0".to_string(); + tv.name.push_str("Deactivate_Validator__"); tv.output.extend(vec![ format!("Type : Deactivate Validator"), @@ -1922,7 +1922,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Reactivate_Validator_0".to_string(); + tv.name.push_str("Reactivate_Validator__"); tv.output.extend(vec![ format!("Type : Reactivate Validator"), @@ -1939,7 +1939,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Redelegate_0".to_string(); + tv.name.push_str("Redelegate__"); tv.output.extend(vec![ format!("Type : Redelegate"), @@ -1977,7 +1977,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Update_Steward_Commission_0".to_string(); + tv.name.push_str("Update_Steward_Commission__"); tv.output.extend(vec![ format!("Type : Update Steward Commission"), format!("Steward : {}", update.steward), @@ -2002,7 +2002,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Resign_Steward_0".to_string(); + tv.name.push_str("Resign_Steward__"); tv.output.extend(vec![ format!("Type : Resign Steward"), @@ -2019,7 +2019,7 @@ pub async fn to_ledger_vector( Error::from(EncodingError::Conversion(err.to_string())) })?; - tv.name = "Bridge_Pool_Transfer_0".to_string(); + tv.name.push_str("Bridge_Pool_Transfer__"); tv.output.extend(vec![ format!("Type : Bridge Pool Transfer"), @@ -2044,7 +2044,7 @@ pub async fn to_ledger_vector( format!("Gas Amount : {}", transfer.gas_fee.amount), ]); } else { - tv.name = "Custom_0".to_string(); + tv.name.push_str("Custom__"); tv.output.push("Type : Custom".to_string()); } diff --git a/examples/generate_txs.rs b/examples/generate_txs.rs index 51727d6361..b8987e6c33 100644 --- a/examples/generate_txs.rs +++ b/examples/generate_txs.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use data_encoding::HEXLOWER; use namada_sdk::signing::to_ledger_vector; -use namada_sdk::testing::arb_signed_tx; +use namada_sdk::testing::arb_signed_batch_tx; use namada_sdk::wallet::fs::FsWalletUtils; use proptest::strategy::{Strategy, ValueTree}; use proptest::test_runner::{Reason, TestRunner}; @@ -16,7 +16,8 @@ async fn main() -> Result<(), Reason> { let mut test_vectors = vec![]; let mut serialized_txs = vec![]; for i in 0..1000 { - let (tx, tx_data) = arb_signed_tx().new_tree(&mut runner)?.current(); + let (tx, tx_data) = + arb_signed_batch_tx().new_tree(&mut runner)?.current(); let mut ledger_vector = to_ledger_vector(&wallet, &tx) .await .expect("unable to construct test vector");