ab_contracts_test_utils/
transaction_builder.rs

1use 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    /// Get [`Transaction`] out of owned transaction
21    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    /// Create a transaction for `contract`
40    pub fn new(contract: Address) -> Self {
41        Self {
42            contract,
43            transaction_payload_builder: TransactionPayloadBuilder::default(),
44        }
45    }
46
47    /// Add method call to the transaction.
48    ///
49    /// See [`TransactionPayloadBuilder::with_method_call()`] for details of this API.
50    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}