anvil_zksync_core/formatter/transaction/
view.rs

1use std::fmt::{Display, Write};
2
3use anvil_zksync_common::utils::cost::format_gwei;
4use colored::Colorize as _;
5use hex::ToHex;
6use zksync_types::{Address, ExecuteTransactionCommon, Transaction};
7
8use crate::formatter::{util::indenting_writer::IndentingWriter, PrettyFmt};
9
10#[derive(Debug)]
11pub struct PrettyTransaction<'a>(pub &'a Transaction);
12#[derive(Debug)]
13pub struct PrettyTransactionEstimationView<'a>(pub &'a Transaction);
14
15impl PrettyFmt for PrettyTransaction<'_> {
16    fn pretty_fmt(&self, w: &mut impl Write) -> std::fmt::Result {
17        let tx = self.0;
18        writeln!(w)?;
19        writeln!(w, " {}", "Transaction details:".cyan())?;
20        writeln!(w, "   Transaction Type: {:?}", tx.tx_format())?;
21        {
22            let mut w = IndentingWriter::new(w, None);
23            w.indent();
24            if let Some(nonce) = tx.nonce() {
25                writeln!(w, "Nonce: {nonce}")?;
26            }
27            if let Some(contract_address) = tx.recipient_account() {
28                writeln!(w, "To: {contract_address:?}")?;
29            }
30            writeln!(w, "From: {:?}", tx.initiator_account())?;
31            if let ExecuteTransactionCommon::L2(l2_tx) = &tx.common_data {
32                if let Some(input_data) = &l2_tx.input {
33                    let hex_data: String = input_data.data.encode_hex();
34                    writeln!(w, "Input Data: 0x{hex_data}")?;
35                    writeln!(w, "Hash: {:?}", tx.hash())?;
36                }
37            }
38            writeln!(w, "gas limit: {}", tx.gas_limit())?;
39            writeln!(w, "Gas Price: {}", format_gwei(tx.max_fee_per_gas()))?;
40            writeln!(
41                w,
42                "Gas Per Pubdata Limit: {}",
43                tx.gas_per_pubdata_byte_limit()
44            )?;
45
46            // Log paymaster details if available.
47            if let ExecuteTransactionCommon::L2(l2_tx) = &tx.common_data {
48                let paymaster_address = l2_tx.paymaster_params.paymaster;
49                let paymaster_input = &l2_tx.paymaster_params.paymaster_input;
50                if paymaster_address != Address::zero() || !paymaster_input.is_empty() {
51                    writeln!(w, "{}", "Paymaster details:".cyan())?;
52                    writeln!(w, "Paymaster Address: {paymaster_address:?}")?;
53                    let paymaster_input_str = if paymaster_input.is_empty() {
54                        "None".to_string()
55                    } else {
56                        paymaster_input.encode_hex()
57                    };
58                    writeln!(w, "Paymaster Input: 0x{paymaster_input_str}")?;
59                }
60            }
61        }
62        Ok(())
63    }
64}
65
66impl Display for PrettyTransaction<'_> {
67    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
68        self.pretty_fmt(f)
69    }
70}
71
72impl PrettyFmt for PrettyTransactionEstimationView<'_> {
73    fn pretty_fmt(&self, w: &mut impl Write) -> std::fmt::Result {
74        let tx = self.0;
75        writeln!(w)?;
76        writeln!(w, "{}", "Transaction details:".cyan())?;
77        {
78            let mut w = IndentingWriter::new(w, None);
79            w.indent();
80            writeln!(w, "Transaction Type: {:?}", tx.tx_format())?;
81            if let Some(nonce) = tx.nonce() {
82                writeln!(w, "Nonce: {nonce}")?;
83            }
84            if let Some(contract_address) = tx.recipient_account() {
85                writeln!(w, "To: {contract_address:?}")?;
86            }
87            writeln!(w, "From: {:?}", tx.initiator_account())?;
88            if let ExecuteTransactionCommon::L2(l2_tx) = &tx.common_data {
89                if let Some(input_data) = &l2_tx.input {
90                    let hex_data: String = input_data.data.encode_hex();
91                    writeln!(w, "Input Data: 0x{hex_data}")?;
92                    writeln!(w, "Hash: {:?}", tx.hash())?;
93                }
94            }
95
96            // Log paymaster details if available.
97            if let ExecuteTransactionCommon::L2(l2_tx) = &tx.common_data {
98                let paymaster_address = l2_tx.paymaster_params.paymaster;
99                let paymaster_input = &l2_tx.paymaster_params.paymaster_input;
100                if paymaster_address != Address::zero() || !paymaster_input.is_empty() {
101                    writeln!(w, "{}", "Paymaster details:".cyan())?;
102                    writeln!(w, "Paymaster Address: {paymaster_address:?}")?;
103                    let paymaster_input_str = if paymaster_input.is_empty() {
104                        "None".to_string()
105                    } else {
106                        paymaster_input.encode_hex()
107                    };
108                    writeln!(w, "Paymaster Input: 0x{paymaster_input_str}")?;
109                }
110            }
111        }
112        Ok(())
113    }
114}
115
116impl Display for PrettyTransactionEstimationView<'_> {
117    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
118        self.pretty_fmt(f)
119    }
120}