forge_script_sequence/
transaction.rs

1use alloy_primitives::{Address, B256, Bytes};
2use foundry_common::TransactionMaybeSigned;
3use revm_inspectors::tracing::types::CallKind;
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, Default, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct AdditionalContract {
9    #[serde(rename = "transactionType")]
10    pub opcode: CallKind,
11    pub contract_name: Option<String>,
12    pub address: Address,
13    pub init_code: Bytes,
14}
15
16#[derive(Clone, Debug, Serialize, Deserialize)]
17#[serde(rename_all = "camelCase")]
18pub struct TransactionWithMetadata {
19    pub hash: Option<B256>,
20    #[serde(rename = "transactionType")]
21    pub opcode: CallKind,
22    #[serde(default = "default_string")]
23    pub contract_name: Option<String>,
24    #[serde(default = "default_address")]
25    pub contract_address: Option<Address>,
26    #[serde(default = "default_string")]
27    pub function: Option<String>,
28    #[serde(default = "default_vec_of_strings")]
29    pub arguments: Option<Vec<String>>,
30    #[serde(skip)]
31    pub rpc: String,
32    pub transaction: TransactionMaybeSigned,
33    pub additional_contracts: Vec<AdditionalContract>,
34    pub is_fixed_gas_limit: bool,
35}
36
37fn default_string() -> Option<String> {
38    Some(String::new())
39}
40
41fn default_address() -> Option<Address> {
42    Some(Address::ZERO)
43}
44
45fn default_vec_of_strings() -> Option<Vec<String>> {
46    Some(vec![])
47}
48
49impl TransactionWithMetadata {
50    pub fn from_tx_request(transaction: TransactionMaybeSigned) -> Self {
51        Self {
52            transaction,
53            hash: Default::default(),
54            opcode: Default::default(),
55            contract_name: Default::default(),
56            contract_address: Default::default(),
57            function: Default::default(),
58            arguments: Default::default(),
59            is_fixed_gas_limit: Default::default(),
60            additional_contracts: Default::default(),
61            rpc: Default::default(),
62        }
63    }
64
65    pub fn tx(&self) -> &TransactionMaybeSigned {
66        &self.transaction
67    }
68
69    pub fn tx_mut(&mut self) -> &mut TransactionMaybeSigned {
70        &mut self.transaction
71    }
72
73    pub fn is_create2(&self) -> bool {
74        self.opcode == CallKind::Create2
75    }
76}