anvil_zksync_core/formatter/transaction/
view.rs1use 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 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 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}