diff --git a/src/main.rs b/src/main.rs index 2f339ba..9e6d446 100644 --- a/src/main.rs +++ b/src/main.rs @@ -78,6 +78,8 @@ enum Subcommands { StateUpdate(StateUpdate), #[clap(alias = "receipt", about = "Get transaction receipt by hash")] TransactionReceipt(TransactionReceipt), + #[clap(about = "Get transaction trace by hash")] + Trace(TransactionTrace), #[clap(about = "Get Starknet network ID")] ChainId(ChainId), #[clap(about = "Get native gas token (currently ETH) balance")] @@ -166,6 +168,7 @@ async fn run_command(cli: Cli) -> Result<()> { Subcommands::BlockTime(cmd) => cmd.run().await, Subcommands::StateUpdate(cmd) => cmd.run().await, Subcommands::TransactionReceipt(cmd) => cmd.run().await, + Subcommands::Trace(cmd) => cmd.run().await, Subcommands::ChainId(cmd) => cmd.run().await, Subcommands::Balance(cmd) => cmd.run().await, Subcommands::Nonce(cmd) => cmd.run().await, diff --git a/src/subcommands/mod.rs b/src/subcommands/mod.rs index 22ab466..c1b61b6 100644 --- a/src/subcommands/mod.rs +++ b/src/subcommands/mod.rs @@ -81,3 +81,6 @@ pub use invoke::Invoke; mod lab; pub use lab::Lab; + +mod transaction_trace; +pub use transaction_trace::TransactionTrace; diff --git a/src/subcommands/transaction_trace.rs b/src/subcommands/transaction_trace.rs new file mode 100644 index 0000000..5ccd045 --- /dev/null +++ b/src/subcommands/transaction_trace.rs @@ -0,0 +1,34 @@ +use anyhow::Result; +use clap::Parser; +use colored_json::{ColorMode, Output}; +use starknet::{core::types::FieldElement, providers::Provider}; + +use crate::{verbosity::VerbosityArgs, ProviderArgs}; + +#[derive(Debug, Parser)] +pub struct TransactionTrace { + #[clap(flatten)] + provider: ProviderArgs, + #[clap(help = "Transaction hash")] + hash: String, + #[clap(flatten)] + verbosity: VerbosityArgs, +} + +impl TransactionTrace { + pub async fn run(self) -> Result<()> { + self.verbosity.setup_logging(); + + let provider = self.provider.into_provider(); + let transaction_hash: FieldElement = self.hash.parse()?; + + let trace = provider.trace_transaction(transaction_hash).await?; + + let trace_json = serde_json::to_value(trace)?; + let trace_json = + colored_json::to_colored_json(&trace_json, ColorMode::Auto(Output::StdOut))?; + println!("{trace_json}"); + + Ok(()) + } +}