iota_types/
transaction_executor.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use std::collections::BTreeMap;
6
7use crate::{
8    base_types::ObjectID,
9    effects::{TransactionEffects, TransactionEvents},
10    error::{ExecutionError, IotaError},
11    execution::ExecutionResult,
12    object::Object,
13    quorum_driver_types::{
14        ExecuteTransactionRequestV1, ExecuteTransactionResponseV1, QuorumDriverError,
15    },
16    transaction::TransactionData,
17};
18
19/// Trait to define the interface for how the REST service interacts with a a
20/// QuorumDriver or a simulated transaction executor.
21#[async_trait::async_trait]
22pub trait TransactionExecutor: Send + Sync {
23    async fn execute_transaction(
24        &self,
25        request: ExecuteTransactionRequestV1,
26        client_addr: Option<std::net::SocketAddr>,
27    ) -> Result<ExecuteTransactionResponseV1, QuorumDriverError>;
28
29    fn simulate_transaction(
30        &self,
31        transaction: TransactionData,
32        checks: VmChecks,
33    ) -> Result<SimulateTransactionResult, IotaError>;
34}
35
36pub struct SimulateTransactionResult {
37    pub effects: TransactionEffects,
38    pub events: Option<TransactionEvents>,
39    pub input_objects: BTreeMap<ObjectID, Object>,
40    pub output_objects: BTreeMap<ObjectID, Object>,
41    pub execution_result: Result<Vec<ExecutionResult>, ExecutionError>,
42    pub mock_gas_id: Option<ObjectID>,
43}
44
45#[derive(Default, Debug, Copy, Clone)]
46pub enum VmChecks {
47    #[default]
48    Enabled,
49    Disabled,
50}
51
52impl VmChecks {
53    pub fn disabled(self) -> bool {
54        matches!(self, Self::Disabled)
55    }
56
57    pub fn enabled(self) -> bool {
58        matches!(self, Self::Enabled)
59    }
60}