forge_script_sequence/
transaction.rs

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