forge_script_sequence/
transaction.rs1use 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}