1use std::sync::Arc;
7
8use sui_protocol_config::ProtocolConfig;
9use sui_types::{error::SuiResult, metrics::BytecodeVerifierMetrics};
10
11pub use executor::Executor;
12pub use verifier::Verifier;
13
14pub mod executor;
15pub mod verifier;
16
17mod latest;
18mod v0;
19mod v1;
20mod v2;
21mod v3;
22mod v4;
23
24#[cfg(test)]
25mod tests;
26
27pub fn executor(
28 protocol_config: &ProtocolConfig,
29 silent: bool,
30) -> SuiResult<Arc<dyn Executor + Send + Sync>> {
31 let version = protocol_config.execution_version_as_option().unwrap_or(0);
32 Ok(match version {
33 0 => Arc::new(v0::Executor::new(protocol_config, silent)?),
34
35 1 => Arc::new(v1::Executor::new(protocol_config, silent)?),
36
37 2 => Arc::new(v2::Executor::new(protocol_config, silent)?),
38
39 3 => Arc::new(v3::Executor::new(protocol_config, silent)?),
40
41 4 => Arc::new(v4::Executor::new(protocol_config, silent)?),
42
43 5 => Arc::new(latest::Executor::new(protocol_config, silent)?),
44
45 v => panic!("Unsupported execution version {v}"),
46 })
47}
48
49pub fn verifier<'m>(
50 protocol_config: &ProtocolConfig,
51 signing_limits: Option<(usize, usize, usize)>,
52 metrics: &'m Arc<BytecodeVerifierMetrics>,
53) -> Box<dyn Verifier + 'm> {
54 let version = protocol_config.execution_version_as_option().unwrap_or(0);
55 let config = protocol_config.verifier_config(signing_limits);
56 match version {
57 0 => Box::new(v0::Verifier::new(config, metrics)),
58 1 => Box::new(v1::Verifier::new(config, metrics)),
59 2 => Box::new(v2::Verifier::new(config, metrics)),
60 3 => Box::new(v3::Verifier::new(config, metrics)),
61 4 => Box::new(v4::Verifier::new(config, metrics)),
62 5 => Box::new(latest::Verifier::new(config, metrics)),
63 v => panic!("Unsupported execution version {v}"),
64 }
65}