From 453f16d0b5bfae36d9874e69b42bf23df7762536 Mon Sep 17 00:00:00 2001 From: Gengar Date: Sun, 9 Nov 2025 17:55:52 +0200 Subject: [PATCH 1/9] Update data_store.rs --- crates/rust-client/src/store/data_store.rs | 143 ++++++++++++++++++--- 1 file changed, 128 insertions(+), 15 deletions(-) diff --git a/crates/rust-client/src/store/data_store.rs b/crates/rust-client/src/store/data_store.rs index 0cb57d240..43d3a7b60 100644 --- a/crates/rust-client/src/store/data_store.rs +++ b/crates/rust-client/src/store/data_store.rs @@ -14,7 +14,9 @@ use miden_objects::{MastForest, Word}; use miden_tx::{DataStore, DataStoreError, MastForestStore, TransactionMastStore}; use super::{PartialBlockchainFilter, Store}; +use crate::rpc::NodeRpcClient; use crate::store::StoreError; +use crate::transaction::ForeignAccount; use crate::utils::RwLock; // DATA STORE @@ -28,14 +30,34 @@ pub struct ClientDataStore { transaction_mast_store: Arc, /// Cache of foreign account inputs that should be returned to the executor on demand. foreign_account_inputs: RwLock>, + /// Optional RPC client for lazy loading of data not found in local store. + rpc_client: Option>, } impl ClientDataStore { + /// Creates a new `ClientDataStore` with an optional RPC client for lazy loading. + /// + /// If an RPC client is provided, the data store will attempt to fetch missing data + /// (such as note scripts and foreign account data) from the network when not found locally. pub fn new(store: alloc::sync::Arc) -> Self { Self { store, transaction_mast_store: Arc::new(TransactionMastStore::new()), foreign_account_inputs: RwLock::new(BTreeMap::new()), + rpc_client: None, + } + } + + /// Creates a new `ClientDataStore` with an RPC client for lazy loading. + pub fn with_rpc( + store: alloc::sync::Arc, + rpc_client: Arc, + ) -> Self { + Self { + store, + transaction_mast_store: Arc::new(TransactionMastStore::new()), + foreign_account_inputs: RwLock::new(BTreeMap::new()), + rpc_client: Some(rpc_client), } } @@ -158,14 +180,84 @@ impl DataStore for ClientDataStore { foreign_account_id: AccountId, _ref_block: BlockNumber, ) -> Result { - let cache = self.foreign_account_inputs.read(); + // First, check the cache + { + let cache = self.foreign_account_inputs.read(); + if let Some(inputs) = cache.get(&foreign_account_id) { + return Ok(inputs.clone()); + } + } - let inputs = cache - .get(&foreign_account_id) - .cloned() - .ok_or(DataStoreError::AccountNotFound(foreign_account_id))?; + // If not in cache and RPC client is available, try fetching from the network + if let Some(rpc) = &self.rpc_client { + // Try to fetch as a public account with empty storage requirements + // This will work for public accounts, but won't work for private accounts + // (which require PartialAccount to be provided upfront) + if foreign_account_id.is_public() { + let foreign_account = ForeignAccount::Public( + foreign_account_id, + crate::rpc::domain::account::AccountStorageRequirements::default(), + ); + + let known_account_codes = self + .store + .get_foreign_account_code(vec![foreign_account_id]) + .await + .map_err(|err| { + DataStoreError::other(format!("Failed to get foreign account code: {err}")) + })?; + + match rpc + .get_account_proofs( + &[foreign_account].into_iter().collect(), + known_account_codes, + ) + .await + { + Ok((_block_num, account_proofs)) => { + if let Some(account_proof) = account_proofs + .into_iter() + .find(|proof| proof.account_id() == foreign_account_id) + { + let account_inputs: AccountInputs = + account_proof.try_into().map_err(|err| { + DataStoreError::other(format!( + "Failed to convert account proof to AccountInputs: {err}" + )) + })?; + + // Cache the fetched account inputs for future use + { + let mut cache = self.foreign_account_inputs.write(); + cache.insert(foreign_account_id, account_inputs.clone()); + } + + // Update the foreign account code cache + if let Err(err) = self + .store + .upsert_foreign_account_code( + foreign_account_id, + account_inputs.code().clone(), + ) + .await + { + // Log but don't fail - we still have the account inputs to return + let _ = err; + } + + return Ok(account_inputs); + } + }, + Err(rpc_err) => { + return Err(DataStoreError::other(format!( + "Failed to fetch foreign account {foreign_account_id} via RPC: {rpc_err}", + ))); + }, + } + } + } - Ok(inputs) + Err(DataStoreError::AccountNotFound(foreign_account_id)) } fn get_note_script( @@ -173,17 +265,38 @@ impl DataStore for ClientDataStore { script_root: Word, ) -> impl FutureMaybeSend> { let store = self.store.clone(); + let rpc_client = self.rpc_client.clone(); async move { - if let Ok(note_script) = store.get_note_script(script_root).await { - Ok(note_script) - } else { - // If no matching note found, return an error - // TODO: refactor to make RPC call to `GetNoteScriptByRoot` in case notes are not - // found https://github.com/0xMiden/miden-client/issues/1410 - Err(DataStoreError::other( - format!("Note script with root {script_root} not found",), - )) + // First, try to get the note script from the local store + match store.get_note_script(script_root).await { + Ok(note_script) => Ok(note_script), + Err(_) => { + // If not found locally and RPC client is available, try fetching from the network + if let Some(rpc) = rpc_client { + match rpc.get_note_script_by_root(script_root).await { + Ok(note_script) => { + // Cache the fetched script in the local store for future use + if let Err(err) = store + .upsert_note_scripts(core::slice::from_ref(¬e_script)) + .await + { + // Log but don't fail - we still have the script to return + // In a no_std environment, we can't easily log, so we just continue + let _ = err; + } + Ok(note_script) + }, + Err(rpc_err) => Err(DataStoreError::other(format!( + "Note script with root {script_root} not found locally or via RPC: {rpc_err}", + ))), + } + } else { + Err(DataStoreError::other(format!( + "Note script with root {script_root} not found in local store", + ))) + } + }, } } } From 36ef3ece507ef2d2b4d09b7056b0057cf3c12fbe Mon Sep 17 00:00:00 2001 From: Gengar Date: Sun, 9 Nov 2025 17:56:29 +0200 Subject: [PATCH 2/9] Refactor ClientDataStore initialization with RPC --- crates/rust-client/src/transaction/mod.rs | 52 +++++++---------------- 1 file changed, 15 insertions(+), 37 deletions(-) diff --git a/crates/rust-client/src/transaction/mod.rs b/crates/rust-client/src/transaction/mod.rs index 14f4c749e..62d7c44ef 100644 --- a/crates/rust-client/src/transaction/mod.rs +++ b/crates/rust-client/src/transaction/mod.rs @@ -83,12 +83,7 @@ use crate::rpc::domain::account::AccountProof; use crate::store::data_store::ClientDataStore; use crate::store::input_note_states::ExpectedNoteState; use crate::store::{ - InputNoteRecord, - InputNoteState, - NoteFilter, - OutputNoteRecord, - StoreError, - TransactionFilter, + InputNoteRecord, InputNoteState, NoteFilter, OutputNoteRecord, StoreError, TransactionFilter, }; use crate::sync::NoteTagRecord; @@ -97,10 +92,7 @@ pub use prover::TransactionProver; mod record; pub use record::{ - DiscardCause, - TransactionDetails, - TransactionRecord, - TransactionStatus, + DiscardCause, TransactionDetails, TransactionRecord, TransactionStatus, TransactionStatusVariant, }; @@ -109,14 +101,8 @@ pub use store_update::TransactionStoreUpdate; mod request; pub use request::{ - ForeignAccount, - NoteArgs, - PaymentNoteDescription, - SwapTransactionData, - TransactionRequest, - TransactionRequestBuilder, - TransactionRequestError, - TransactionScriptTemplate, + ForeignAccount, NoteArgs, PaymentNoteDescription, SwapTransactionData, TransactionRequest, + TransactionRequestBuilder, TransactionRequestError, TransactionScriptTemplate, }; mod result; @@ -125,25 +111,13 @@ mod result; pub use miden_lib::account::interface::{AccountComponentInterface, AccountInterface}; pub use miden_lib::transaction::TransactionKernel; pub use miden_objects::transaction::{ - ExecutedTransaction, - InputNote, - InputNotes, - OutputNote, - OutputNotes, - ProvenTransaction, - TransactionArgs, - TransactionId, - TransactionInputs, - TransactionScript, - TransactionSummary, + ExecutedTransaction, InputNote, InputNotes, OutputNote, OutputNotes, ProvenTransaction, + TransactionArgs, TransactionId, TransactionInputs, TransactionScript, TransactionSummary, }; pub use miden_objects::vm::{AdviceInputs, AdviceMap}; pub use miden_tx::auth::TransactionAuthenticator; pub use miden_tx::{ - DataStoreError, - LocalTransactionProver, - ProvingOptions, - TransactionExecutorError, + DataStoreError, LocalTransactionProver, ProvingOptions, TransactionExecutorError, TransactionProverError, }; pub use result::TransactionResult; @@ -252,7 +226,7 @@ where let ignore_invalid_notes = transaction_request.ignore_invalid_input_notes(); - let data_store = ClientDataStore::new(self.store.clone()); + let data_store = ClientDataStore::with_rpc(self.store.clone(), self.rpc_api.clone()); data_store.register_foreign_account_inputs(foreign_account_inputs.iter().cloned()); for fpi_account in &foreign_account_inputs { data_store.mast_store().load_account_code(fpi_account.code()); @@ -440,7 +414,7 @@ where let account: Account = account_record.into(); - let data_store = ClientDataStore::new(self.store.clone()); + let data_store = ClientDataStore::with_rpc(self.store.clone(), self.rpc_api.clone()); data_store.register_foreign_account_inputs(foreign_account_inputs.iter().cloned()); @@ -490,7 +464,11 @@ where // New relevant input notes let mut new_input_notes = vec![]; - let note_screener = NoteScreener::new(self.store.clone(), self.authenticator.clone()); + let note_screener = NoteScreener::with_rpc( + self.store.clone(), + self.authenticator.clone(), + self.rpc_api.clone(), + ); for note in notes_from_output(executed_tx.output_notes()) { // TODO: check_relevance() should have the option to take multiple notes @@ -720,7 +698,7 @@ where tx_args: TransactionArgs, ) -> Result, ClientError> { loop { - let data_store = ClientDataStore::new(self.store.clone()); + let data_store = ClientDataStore::with_rpc(self.store.clone(), self.rpc_api.clone()); data_store.mast_store().load_account_code(account.code()); let execution = NoteConsumptionChecker::new(&self.build_executor(&data_store)?) From 5acdc03d15bc1956f24dba3aeeaeafa7aa26c3fb Mon Sep 17 00:00:00 2001 From: Gengar Date: Sun, 9 Nov 2025 17:56:50 +0200 Subject: [PATCH 3/9] Update note_screener.rs --- crates/rust-client/src/note/note_screener.rs | 23 ++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/crates/rust-client/src/note/note_screener.rs b/crates/rust-client/src/note/note_screener.rs index 7dd9171ee..668ad4324 100644 --- a/crates/rust-client/src/note/note_screener.rs +++ b/crates/rust-client/src/note/note_screener.rs @@ -14,6 +14,7 @@ use miden_tx::{NoteCheckerError, NoteConsumptionChecker, TransactionExecutor}; use thiserror::Error; use crate::ClientError; +use crate::rpc::NodeRpcClient; use crate::rpc::domain::note::CommittedNote; use crate::store::data_store::ClientDataStore; use crate::store::{InputNoteRecord, NoteFilter, Store, StoreError}; @@ -56,6 +57,8 @@ pub struct NoteScreener { store: Arc, /// A reference to the transaction authenticator authenticator: Option>, + /// Optional RPC client for lazy loading of data not found in local store. + rpc_client: Option>, } impl NoteScreener @@ -63,7 +66,19 @@ where AUTH: TransactionAuthenticator + Sync, { pub fn new(store: Arc, authenticator: Option>) -> Self { - Self { store, authenticator } + Self { store, authenticator, rpc_client: None } + } + + pub fn with_rpc( + store: Arc, + authenticator: Option>, + rpc_client: Arc, + ) -> Self { + Self { + store, + authenticator, + rpc_client: Some(rpc_client), + } } /// Returns a vector of tuples describing the relevance of the provided note to the @@ -123,7 +138,11 @@ where let tx_args = transaction_request.clone().into_transaction_args(tx_script); - let data_store = ClientDataStore::new(self.store.clone()); + let data_store = if let Some(rpc) = &self.rpc_client { + ClientDataStore::with_rpc(self.store.clone(), rpc.clone()) + } else { + ClientDataStore::new(self.store.clone()) + }; let mut transaction_executor = TransactionExecutor::new(&data_store); if let Some(authenticator) = &self.authenticator { transaction_executor = transaction_executor.with_authenticator(authenticator.as_ref()); From 40a1e38d85b0464f57b4aef5f58f515723124cf6 Mon Sep 17 00:00:00 2001 From: Gengar Date: Sun, 9 Nov 2025 17:57:03 +0200 Subject: [PATCH 4/9] Update mod.rs --- crates/rust-client/src/note/mod.rs | 38 +++++++++++------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/crates/rust-client/src/note/mod.rs b/crates/rust-client/src/note/mod.rs index 1400f3e6d..7c7f1f4d8 100644 --- a/crates/rust-client/src/note/mod.rs +++ b/crates/rust-client/src/note/mod.rs @@ -78,32 +78,14 @@ pub use miden_lib::note::{WellKnownNote, create_p2id_note, create_p2ide_note, cr pub use miden_objects::NoteError; pub use miden_objects::block::BlockNumber; pub use miden_objects::note::{ - Note, - NoteAssets, - NoteDetails, - NoteExecutionHint, - NoteExecutionMode, - NoteFile, - NoteHeader, - NoteId, - NoteInclusionProof, - NoteInputs, - NoteLocation, - NoteMetadata, - NoteRecipient, - NoteScript, - NoteTag, - NoteType, - Nullifier, - PartialNote, + Note, NoteAssets, NoteDetails, NoteExecutionHint, NoteExecutionMode, NoteFile, NoteHeader, + NoteId, NoteInclusionProof, NoteInputs, NoteLocation, NoteMetadata, NoteRecipient, NoteScript, + NoteTag, NoteType, Nullifier, PartialNote, }; pub use miden_objects::transaction::ToInputNoteCommitments; pub use note_screener::{NoteConsumability, NoteRelevance, NoteScreener, NoteScreenerError}; pub use note_update_tracker::{ - InputNoteUpdate, - NoteUpdateTracker, - NoteUpdateType, - OutputNoteUpdate, + InputNoteUpdate, NoteUpdateTracker, NoteUpdateType, OutputNoteUpdate, }; /// Note retrieval methods. impl Client @@ -139,7 +121,11 @@ where ) -> Result)>, ClientError> { let committed_notes = self.store.get_input_notes(NoteFilter::Committed).await?; - let note_screener = NoteScreener::new(self.store.clone(), self.authenticator.clone()); + let note_screener = NoteScreener::with_rpc( + self.store.clone(), + self.authenticator.clone(), + self.rpc_api.clone(), + ); let mut relevant_notes = Vec::new(); for input_note in committed_notes { @@ -169,7 +155,11 @@ where &self, note: InputNoteRecord, ) -> Result, ClientError> { - let note_screener = NoteScreener::new(self.store.clone(), self.authenticator.clone()); + let note_screener = NoteScreener::with_rpc( + self.store.clone(), + self.authenticator.clone(), + self.rpc_api.clone(), + ); note_screener .check_relevance(¬e.clone().try_into()?) .await From a656ce304be1d6dabf598088a89d2cba38f872e2 Mon Sep 17 00:00:00 2001 From: Gengar Date: Sun, 9 Nov 2025 17:57:16 +0200 Subject: [PATCH 5/9] Refactor note_screener creation in sync_state method Refactor note_screener initialization to use with_rpc method. --- crates/rust-client/src/sync/mod.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/rust-client/src/sync/mod.rs b/crates/rust-client/src/sync/mod.rs index 0c95c15b3..9f6fd2133 100644 --- a/crates/rust-client/src/sync/mod.rs +++ b/crates/rust-client/src/sync/mod.rs @@ -82,10 +82,7 @@ pub use state_sync::{NoteUpdateAction, OnNoteReceived, StateSync}; mod state_sync_update; pub use state_sync_update::{ - AccountUpdates, - BlockUpdates, - StateSyncUpdate, - TransactionUpdateTracker, + AccountUpdates, BlockUpdates, StateSyncUpdate, TransactionUpdateTracker, }; /// Client synchronization methods. @@ -123,7 +120,11 @@ where pub async fn sync_state(&mut self) -> Result { _ = self.ensure_genesis_in_place().await?; - let note_screener = NoteScreener::new(self.store.clone(), self.authenticator.clone()); + let note_screener = NoteScreener::with_rpc( + self.store.clone(), + self.authenticator.clone(), + self.rpc_api.clone(), + ); let state_sync = StateSync::new(self.rpc_api.clone(), Arc::new(note_screener), self.tx_graceful_blocks); From c1c5a2270d4eecd87b94c8c04216d46b102eee5b Mon Sep 17 00:00:00 2001 From: Gengar Date: Thu, 18 Dec 2025 23:43:48 +0200 Subject: [PATCH 6/9] Improve error handling for note script retrieval Refactor error handling and logging for fetching note scripts. --- crates/rust-client/src/store/data_store.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/crates/rust-client/src/store/data_store.rs b/crates/rust-client/src/store/data_store.rs index 43d3a7b60..b34362072 100644 --- a/crates/rust-client/src/store/data_store.rs +++ b/crates/rust-client/src/store/data_store.rs @@ -272,23 +272,29 @@ impl DataStore for ClientDataStore { match store.get_note_script(script_root).await { Ok(note_script) => Ok(note_script), Err(_) => { - // If not found locally and RPC client is available, try fetching from the network + // If not found locally and RPC client is available, try fetching from the + // network if let Some(rpc) = rpc_client { match rpc.get_note_script_by_root(script_root).await { Ok(note_script) => { - // Cache the fetched script in the local store for future use - if let Err(err) = store + // Cache the fetched script in the local store for future use. + // Since we know the script wasn't in the local store + // (get_note_script failed), + // upsert should effectively be an insert. If it fails (e.g., due to + // database issues or concurrent + // writes), we continue anyway since caching is just an + // optimization - we still have the valid script to return. + if let Err(_err) = store .upsert_note_scripts(core::slice::from_ref(¬e_script)) .await { - // Log but don't fail - we still have the script to return - // In a no_std environment, we can't easily log, so we just continue - let _ = err; + // In a no_std environment, we can't easily log, so we just + // continue } Ok(note_script) }, Err(rpc_err) => Err(DataStoreError::other(format!( - "Note script with root {script_root} not found locally or via RPC: {rpc_err}", + "Note script with root {script_root} not found via RPC: {rpc_err}", ))), } } else { From 1c1d1687a01ba7f09fe0d49ee3b47543412aa0a6 Mon Sep 17 00:00:00 2001 From: Gengar Date: Thu, 18 Dec 2025 23:44:42 +0200 Subject: [PATCH 7/9] Refactor import statements in mod.rs Reformatted import statements for better readability. --- crates/rust-client/src/note/mod.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/crates/rust-client/src/note/mod.rs b/crates/rust-client/src/note/mod.rs index 7c7f1f4d8..ddbcb1ccd 100644 --- a/crates/rust-client/src/note/mod.rs +++ b/crates/rust-client/src/note/mod.rs @@ -78,14 +78,32 @@ pub use miden_lib::note::{WellKnownNote, create_p2id_note, create_p2ide_note, cr pub use miden_objects::NoteError; pub use miden_objects::block::BlockNumber; pub use miden_objects::note::{ - Note, NoteAssets, NoteDetails, NoteExecutionHint, NoteExecutionMode, NoteFile, NoteHeader, - NoteId, NoteInclusionProof, NoteInputs, NoteLocation, NoteMetadata, NoteRecipient, NoteScript, - NoteTag, NoteType, Nullifier, PartialNote, + Note, + NoteAssets, + NoteDetails, + NoteExecutionHint, + NoteExecutionMode, + NoteFile, + NoteHeader, + NoteId, + NoteInclusionProof, + NoteInputs, + NoteLocation, + NoteMetadata, + NoteRecipient, + NoteScript, + NoteTag, + NoteType, + Nullifier, + PartialNote, }; pub use miden_objects::transaction::ToInputNoteCommitments; pub use note_screener::{NoteConsumability, NoteRelevance, NoteScreener, NoteScreenerError}; pub use note_update_tracker::{ - InputNoteUpdate, NoteUpdateTracker, NoteUpdateType, OutputNoteUpdate, + InputNoteUpdate, + NoteUpdateTracker, + NoteUpdateType, + OutputNoteUpdate, }; /// Note retrieval methods. impl Client From 5684afe46df8bd584812e20c8ceddc8d16633faf Mon Sep 17 00:00:00 2001 From: Gengar Date: Thu, 18 Dec 2025 23:45:07 +0200 Subject: [PATCH 8/9] Reformat imports in mod.rs for clarity --- crates/rust-client/src/sync/mod.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/rust-client/src/sync/mod.rs b/crates/rust-client/src/sync/mod.rs index 9f6fd2133..88298a409 100644 --- a/crates/rust-client/src/sync/mod.rs +++ b/crates/rust-client/src/sync/mod.rs @@ -82,7 +82,10 @@ pub use state_sync::{NoteUpdateAction, OnNoteReceived, StateSync}; mod state_sync_update; pub use state_sync_update::{ - AccountUpdates, BlockUpdates, StateSyncUpdate, TransactionUpdateTracker, + AccountUpdates, + BlockUpdates, + StateSyncUpdate, + TransactionUpdateTracker, }; /// Client synchronization methods. From 76cda47472ed24f4ad09ff2dff9e5db6281b6853 Mon Sep 17 00:00:00 2001 From: Gengar Date: Thu, 18 Dec 2025 23:45:33 +0200 Subject: [PATCH 9/9] Reformat imports in transaction module --- crates/rust-client/src/transaction/mod.rs | 40 +++++++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/crates/rust-client/src/transaction/mod.rs b/crates/rust-client/src/transaction/mod.rs index 62d7c44ef..5dbb324b1 100644 --- a/crates/rust-client/src/transaction/mod.rs +++ b/crates/rust-client/src/transaction/mod.rs @@ -83,7 +83,12 @@ use crate::rpc::domain::account::AccountProof; use crate::store::data_store::ClientDataStore; use crate::store::input_note_states::ExpectedNoteState; use crate::store::{ - InputNoteRecord, InputNoteState, NoteFilter, OutputNoteRecord, StoreError, TransactionFilter, + InputNoteRecord, + InputNoteState, + NoteFilter, + OutputNoteRecord, + StoreError, + TransactionFilter, }; use crate::sync::NoteTagRecord; @@ -92,7 +97,10 @@ pub use prover::TransactionProver; mod record; pub use record::{ - DiscardCause, TransactionDetails, TransactionRecord, TransactionStatus, + DiscardCause, + TransactionDetails, + TransactionRecord, + TransactionStatus, TransactionStatusVariant, }; @@ -101,8 +109,14 @@ pub use store_update::TransactionStoreUpdate; mod request; pub use request::{ - ForeignAccount, NoteArgs, PaymentNoteDescription, SwapTransactionData, TransactionRequest, - TransactionRequestBuilder, TransactionRequestError, TransactionScriptTemplate, + ForeignAccount, + NoteArgs, + PaymentNoteDescription, + SwapTransactionData, + TransactionRequest, + TransactionRequestBuilder, + TransactionRequestError, + TransactionScriptTemplate, }; mod result; @@ -111,13 +125,25 @@ mod result; pub use miden_lib::account::interface::{AccountComponentInterface, AccountInterface}; pub use miden_lib::transaction::TransactionKernel; pub use miden_objects::transaction::{ - ExecutedTransaction, InputNote, InputNotes, OutputNote, OutputNotes, ProvenTransaction, - TransactionArgs, TransactionId, TransactionInputs, TransactionScript, TransactionSummary, + ExecutedTransaction, + InputNote, + InputNotes, + OutputNote, + OutputNotes, + ProvenTransaction, + TransactionArgs, + TransactionId, + TransactionInputs, + TransactionScript, + TransactionSummary, }; pub use miden_objects::vm::{AdviceInputs, AdviceMap}; pub use miden_tx::auth::TransactionAuthenticator; pub use miden_tx::{ - DataStoreError, LocalTransactionProver, ProvingOptions, TransactionExecutorError, + DataStoreError, + LocalTransactionProver, + ProvingOptions, + TransactionExecutorError, TransactionProverError, }; pub use result::TransactionResult;