use svmscope::Scope;
fn main() -> svmscope::Result<()> {
let mut args = std::env::args().skip(1);
let sig = args
.next()
.expect("usage: post_mortem <signature> [rpc_url]");
let rpc = args
.next()
.unwrap_or_else(|| "https://api.mainnet-beta.solana.com".into());
let scope = Scope::new(rpc);
let analysis = scope.analyze(&sig)?;
println!(
"on-chain: success={} fee={} CU={:?}",
analysis.overview.success, analysis.overview.fee, analysis.overview.compute_units
);
for ix in &analysis.cpi_tree {
let indent = " ".repeat(ix.stack_height as usize);
println!("{indent}{}", ix.name.as_deref().unwrap_or(&ix.program));
}
let replay = scope.replay(&analysis.signature)?;
let out = replay.run()?;
println!(
"\nreplay: success={} CU={}",
out.result.success, out.result.compute_units
);
if let Some(explain) = &out.explain {
println!("why: {} — {}", explain.title, explain.detail);
}
for diff in &out.diffs {
for f in &diff.fields {
println!(" {}: {} → {}", f.name, f.before, f.after);
}
}
Ok(())
}