1mod default;
4mod threaded;
5
6use std::fmt::Display;
7
8use cid::Cid;
9pub use default::DefaultExecutor;
10use fvm_ipld_encoding::RawBytes;
11use fvm_shared::econ::TokenAmount;
12use fvm_shared::error::ExitCode;
13use fvm_shared::event::StampedEvent;
14use fvm_shared::message::Message;
15use fvm_shared::receipt::Receipt;
16use num_traits::Zero;
17pub use threaded::ThreadedExecutor;
18
19use crate::call_manager::Backtrace;
20use crate::trace::ExecutionTrace;
21use crate::Kernel;
22
23pub trait Executor {
29 type Kernel: Kernel;
33
34 fn execute_message(
39 &mut self,
40 msg: Message,
41 apply_kind: ApplyKind,
42 raw_length: usize,
43 ) -> anyhow::Result<ApplyRet>;
44
45 fn flush(&mut self) -> anyhow::Result<Cid>;
47}
48
49#[derive(Debug, Clone)]
51pub enum ApplyFailure {
52 MessageBacktrace(Backtrace),
54 PreValidation(String),
56}
57
58impl Display for ApplyFailure {
59 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60 match self {
61 ApplyFailure::MessageBacktrace(bt) => {
62 writeln!(f, "message failed with backtrace:")?;
63 write!(f, "{}", bt)?;
64 }
65 ApplyFailure::PreValidation(msg) => {
66 writeln!(f, "pre-validation failed: {}", msg)?;
67 }
68 }
69 Ok(())
70 }
71}
72
73#[derive(Clone, Debug)]
75pub struct ApplyRet {
76 pub msg_receipt: Receipt,
78 pub penalty: TokenAmount,
80 pub miner_tip: TokenAmount,
82
83 pub base_fee_burn: TokenAmount,
85 pub over_estimation_burn: TokenAmount,
86 pub refund: TokenAmount,
87 pub gas_refund: u64,
88 pub gas_burned: u64,
89
90 pub failure_info: Option<ApplyFailure>,
92 pub exec_trace: ExecutionTrace,
94 pub events: Vec<StampedEvent>,
96}
97
98impl ApplyRet {
99 #[inline]
100 pub fn prevalidation_fail(
101 code: ExitCode,
102 message: impl Into<String>,
103 miner_penalty: TokenAmount,
104 ) -> ApplyRet {
105 ApplyRet {
106 msg_receipt: Receipt {
107 exit_code: code,
108 return_data: RawBytes::default(),
109 gas_used: 0,
110 events_root: None,
111 },
112 penalty: miner_penalty,
113 miner_tip: TokenAmount::zero(),
114 base_fee_burn: TokenAmount::zero(),
115 over_estimation_burn: TokenAmount::zero(),
116 refund: TokenAmount::zero(),
117 gas_refund: 0,
118 gas_burned: 0,
119 failure_info: Some(ApplyFailure::PreValidation(message.into())),
120 exec_trace: vec![],
121 events: vec![],
122 }
123 }
124}
125
126#[derive(Eq, PartialEq, Copy, Clone, Debug)]
133pub enum ApplyKind {
134 Explicit,
135 Implicit,
136}