radix_engine/transaction/
preview_executor.rs

1use crate::transaction::TransactionReceipt;
2use crate::transaction::*;
3use crate::vm::VmInitialize;
4use radix_common::network::NetworkDefinition;
5use radix_substate_store_interface::interface::*;
6use radix_transactions::errors::TransactionValidationError;
7use radix_transactions::model::PreviewIntentV1;
8use radix_transactions::validation::*;
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub enum PreviewError {
12    TransactionValidationError(TransactionValidationError),
13}
14
15impl From<TransactionValidationError> for PreviewError {
16    fn from(value: TransactionValidationError) -> Self {
17        Self::TransactionValidationError(value)
18    }
19}
20
21pub fn execute_preview(
22    substate_db: &impl SubstateDatabase,
23    vm_modules: &impl VmInitialize,
24    network: &NetworkDefinition,
25    preview_intent: PreviewIntentV1,
26    with_kernel_trace: bool,
27) -> Result<TransactionReceipt, PreviewError> {
28    let validator = TransactionValidator::new(substate_db, network);
29
30    let mut execution_config = if preview_intent.flags.disable_auth {
31        ExecutionConfig::for_preview_no_auth(network.clone())
32    } else {
33        ExecutionConfig::for_preview(network.clone())
34    };
35    execution_config = execution_config.with_kernel_trace(with_kernel_trace);
36
37    let validated = validator.validate_preview_intent_v1(preview_intent)?;
38
39    Ok(execute_transaction(
40        substate_db,
41        vm_modules,
42        &execution_config,
43        validated.create_executable(),
44    ))
45}