sui_adapter_latest/static_programmable_transactions/
mod.rs1#![deny(clippy::arithmetic_side_effects)]
5#![deny(clippy::indexing_slicing)]
6#![deny(clippy::cast_possible_truncation)]
7
8use crate::{
9 data_store::{
10 cached_package_store::CachedPackageStore,
11 transaction_package_store::TransactionPackageStore,
12 },
13 execution_mode::ExecutionMode,
14 execution_value::ExecutionState,
15 gas_charger::GasCharger,
16 static_programmable_transactions::{
17 env::Env, linkage::analysis::LinkageAnalyzer, metering::translation_meter,
18 },
19};
20use move_trace_format::format::MoveTraceBuilder;
21use move_vm_runtime::runtime::MoveRuntime;
22use std::{cell::RefCell, rc::Rc, sync::Arc};
23use sui_protocol_config::ProtocolConfig;
24use sui_types::{
25 base_types::TxContext, error::ExecutionError, execution::ResultWithTimings,
26 execution_status::ExecutionErrorKind, metrics::LimitsMetrics, storage::BackingPackageStore,
27 transaction::ProgrammableTransaction,
28};
29
30pub mod env;
31pub mod execution;
32pub mod linkage;
33pub mod loading;
34pub mod metering;
35pub mod spanned;
36pub mod typing;
37
38pub fn execute<Mode: ExecutionMode>(
39 protocol_config: &ProtocolConfig,
40 metrics: Arc<LimitsMetrics>,
41 vm: &MoveRuntime,
42 state_view: &mut dyn ExecutionState,
43 package_store: &dyn BackingPackageStore,
44 tx_context: Rc<RefCell<TxContext>>,
45 gas_charger: &mut GasCharger,
46 withdrawal_compatibility_inputs: Option<Vec<bool>>,
48 txn: ProgrammableTransaction,
49 trace_builder_opt: &mut Option<MoveTraceBuilder>,
50) -> ResultWithTimings<Mode::ExecutionResults, ExecutionError> {
51 let gas_payment = gas_charger.gas_payment_amount();
52 let package_store = CachedPackageStore::new(vm, TransactionPackageStore::new(package_store));
53 let linkage_analysis =
54 LinkageAnalyzer::new::<Mode>(protocol_config).map_err(|e| (e, vec![]))?;
55 let ptb_type_linkage = linkage_analysis
56 .compute_input_type_resolution_linkage(&txn, &package_store, state_view)
57 .and_then(|linkage| linkage.linkage_context())
58 .map_err(|e| (e, vec![]))?;
59 let resolution_vm = vm
60 .make_vm(&package_store.package_store, ptb_type_linkage)
61 .map_err(|e| {
62 (
63 ExecutionError::new_with_source(ExecutionErrorKind::InvalidLinkage, e),
64 vec![],
65 )
66 })?;
67
68 let mut env = Env::new(
69 protocol_config,
70 vm,
71 state_view,
72 &package_store,
73 &linkage_analysis,
74 &resolution_vm,
75 );
76 let mut translation_meter =
77 translation_meter::TranslationMeter::new(protocol_config, gas_charger);
78
79 let txn = {
80 let tx_context_ref = tx_context.borrow();
81 loading::translate::transaction::<Mode>(
82 &mut translation_meter,
83 &env,
84 &tx_context_ref,
85 withdrawal_compatibility_inputs,
86 gas_payment,
87 txn,
88 )
89 .map_err(|e| (e, vec![]))?
90 };
91 let txn = typing::translate_and_verify::<Mode>(&mut translation_meter, &env, txn)
92 .map_err(|e| (e, vec![]))?;
93 execution::interpreter::execute::<Mode>(
94 &mut env,
95 metrics,
96 tx_context,
97 gas_charger,
98 txn,
99 trace_builder_opt,
100 )
101}