ab_contracts_test_utils/
transaction_builder.rs1use ab_contracts_common::Address;
2use ab_contracts_common::env::{Blake3Hash, Gas, Transaction, TransactionHeader, TransactionSlot};
3use ab_contracts_common::method::ExternalArgs;
4use ab_system_contract_simple_wallet_base::payload::TransactionMethodContext;
5use ab_system_contract_simple_wallet_base::payload::builder::{
6 TransactionPayloadBuilder, TransactionPayloadBuilderError,
7};
8use alloc::vec::Vec;
9
10#[derive(Debug, Clone)]
11pub struct OwnedTransaction {
12 pub header: TransactionHeader,
13 pub read_slots: Vec<TransactionSlot>,
14 pub write_slots: Vec<TransactionSlot>,
15 pub payload: Vec<u128>,
16 pub seal: Vec<u8>,
17}
18
19impl OwnedTransaction {
20 pub fn as_ref(&self) -> Transaction<'_> {
22 Transaction {
23 header: &self.header,
24 read_slots: &self.read_slots,
25 write_slots: &self.write_slots,
26 payload: &self.payload,
27 seal: &self.seal,
28 }
29 }
30}
31
32#[derive(Debug)]
33pub struct TransactionBuilder {
34 contract: Address,
35 transaction_payload_builder: TransactionPayloadBuilder,
36}
37
38impl TransactionBuilder {
39 pub fn new(contract: Address) -> Self {
41 Self {
42 contract,
43 transaction_payload_builder: TransactionPayloadBuilder::default(),
44 }
45 }
46
47 pub fn with_method_call<Args>(
51 &mut self,
52 contract: &Address,
53 external_args: &Args,
54 method_context: TransactionMethodContext,
55 input_output_index: &[Option<u8>],
56 ) -> Result<(), TransactionPayloadBuilderError<'static>>
57 where
58 Args: ExternalArgs,
59 {
60 self.transaction_payload_builder.with_method_call(
61 contract,
62 external_args,
63 method_context,
64 input_output_index,
65 )
66 }
67
68 pub fn build(
69 self,
70 read_slots: Vec<TransactionSlot>,
71 write_slots: Vec<TransactionSlot>,
72 ) -> OwnedTransaction {
73 OwnedTransaction {
74 header: TransactionHeader {
75 block_hash: Blake3Hash::default(),
76 gas_limit: Gas::default(),
77 contract: self.contract,
78 },
79 read_slots,
80 write_slots,
81 payload: self.transaction_payload_builder.into_aligned_bytes(),
82 seal: Vec::new(),
83 }
84 }
85}