diff --git a/crates/aiken/src/cmd/tx/simulate.rs b/crates/aiken/src/cmd/tx/simulate.rs index ae3a3dda..e61ff88c 100644 --- a/crates/aiken/src/cmd/tx/simulate.rs +++ b/crates/aiken/src/cmd/tx/simulate.rs @@ -128,15 +128,16 @@ pub fn exec( cpu: accum.cpu + curr.ex_units.steps as i64, }); + eprintln!("\n"); println!( - "\n{}", + "{}", serde_json::to_string(&total_budget_used) .map_err(|_| fmt::Error) .into_diagnostic()? ); } Err(err) => { - eprintln!("{} {}", " Error".bold().red(), err.red()); + eprintln!("{}", display_tx_error(&err)); process::exit(1); } } @@ -144,3 +145,32 @@ pub fn exec( Ok(()) } + +fn display_tx_error(err: &tx::error::Error) -> String { + let mut msg = format!("{} {}", " Error".bold().red(), err.red()); + match err { + tx::error::Error::RedeemerError { err, .. } => { + msg.push_str(&format!( + "\n{}", + display_tx_error(err) + .lines() + .skip(1) + .collect::>() + .join("\n"), + )); + msg + } + tx::error::Error::Machine(_, _, traces) => { + msg.push_str( + traces + .iter() + .map(|s| format!("\n{} {}", " Trace".bold().yellow(), s.yellow())) + .collect::>() + .join("") + .as_str(), + ); + msg + } + _ => msg, + } +} diff --git a/crates/uplc/src/tx/error.rs b/crates/uplc/src/tx/error.rs index 16679fe0..2192ada2 100644 --- a/crates/uplc/src/tx/error.rs +++ b/crates/uplc/src/tx/error.rs @@ -10,7 +10,7 @@ pub enum Error { FlatDecode(#[from] flat_rs::de::Error), #[error("{0}")] FragmentDecode(#[from] pallas_primitives::Error), - #[error("{}\n\n{:#?}\n\n{}", .0, .1, .2.join("\n"))] + #[error("{}", .0)] Machine(machine::Error, ExBudget, Vec), #[error("Native script can't be executed in phase-two")] NativeScriptPhaseTwo,