use std::ops::RangeInclusive;
use miden_protocol::account::AccountId;
use miden_protocol::block::BlockNumber;
use miden_protocol::crypto::merkle::mmr::{Forest, MmrDelta, MmrProof};
use tracing::instrument;
use super::State;
use crate::COMPONENT;
use crate::db::models::queries::StorageMapValuesPage;
use crate::db::{AccountVaultValue, NoteSyncUpdate, NullifierInfo};
use crate::errors::{DatabaseError, NoteSyncError, StateSyncError};
impl State {
pub async fn sync_transactions(
&self,
account_ids: Vec<AccountId>,
block_range: RangeInclusive<BlockNumber>,
) -> Result<(BlockNumber, Vec<crate::db::TransactionRecord>), DatabaseError> {
self.db.select_transactions_records(account_ids, block_range).await
}
#[instrument(level = "debug", target = COMPONENT, skip_all, ret(level = "debug"), err)]
pub async fn sync_chain_mmr(
&self,
block_range: RangeInclusive<BlockNumber>,
) -> Result<MmrDelta, StateSyncError> {
let inner = self.inner.read().await;
let block_from = *block_range.start();
let block_to = *block_range.end();
if block_from == block_to {
return Ok(MmrDelta {
forest: Forest::new(block_from.as_usize()),
data: vec![],
});
}
let from_forest = (block_from + 1).as_usize();
let to_forest = block_to.as_usize();
inner
.blockchain
.as_mmr()
.get_delta(Forest::new(from_forest), Forest::new(to_forest))
.map_err(StateSyncError::FailedToBuildMmrDelta)
}
#[instrument(level = "debug", target = COMPONENT, skip_all, ret(level = "debug"), err)]
pub async fn sync_notes(
&self,
note_tags: Vec<u32>,
block_range: RangeInclusive<BlockNumber>,
) -> Result<(NoteSyncUpdate, MmrProof, BlockNumber), NoteSyncError> {
let inner = self.inner.read().await;
let (note_sync, last_included_block) =
self.db.get_note_sync(block_range, note_tags).await?;
let mmr_proof = inner.blockchain.open(note_sync.block_header.block_num())?;
Ok((note_sync, mmr_proof, last_included_block))
}
pub async fn sync_nullifiers(
&self,
prefix_len: u32,
nullifier_prefixes: Vec<u32>,
block_range: RangeInclusive<BlockNumber>,
) -> Result<(Vec<NullifierInfo>, BlockNumber), DatabaseError> {
self.db
.select_nullifiers_by_prefix(prefix_len, nullifier_prefixes, block_range)
.await
}
pub async fn sync_account_vault(
&self,
account_id: AccountId,
block_range: RangeInclusive<BlockNumber>,
) -> Result<(BlockNumber, Vec<AccountVaultValue>), DatabaseError> {
self.db.get_account_vault_sync(account_id, block_range).await
}
pub async fn sync_account_storage_maps(
&self,
account_id: AccountId,
block_range: RangeInclusive<BlockNumber>,
) -> Result<StorageMapValuesPage, DatabaseError> {
self.db.select_storage_map_sync_values(account_id, block_range).await
}
}