use miden_protocol::Felt;
use miden_protocol::account::{
AccountCode,
AccountDelta,
AccountId,
AccountVaultDelta,
PartialAccount,
};
use crate::host::storage_delta_tracker::StorageDeltaTracker;
#[derive(Debug, Clone)]
pub struct AccountDeltaTracker {
account_id: AccountId,
storage: StorageDeltaTracker,
vault: AccountVaultDelta,
code: Option<AccountCode>,
nonce_delta: Felt,
}
impl AccountDeltaTracker {
pub fn new(account: &PartialAccount) -> Self {
let code = if account.is_new() {
Some(account.code().clone())
} else {
None
};
Self {
account_id: account.id(),
storage: StorageDeltaTracker::new(account),
vault: AccountVaultDelta::default(),
code,
nonce_delta: Felt::ZERO,
}
}
pub fn was_nonce_incremented(&self) -> bool {
self.nonce_delta != Felt::ZERO
}
pub fn increment_nonce(&mut self) {
self.nonce_delta += Felt::ONE;
}
pub fn vault_delta(&self) -> &AccountVaultDelta {
&self.vault
}
pub fn vault_delta_mut(&mut self) -> &mut AccountVaultDelta {
&mut self.vault
}
pub fn storage(&mut self) -> &mut StorageDeltaTracker {
&mut self.storage
}
pub fn into_delta(self) -> AccountDelta {
let account_id = self.account_id;
let nonce_delta = self.nonce_delta;
let storage_delta = self.storage.into_delta();
let vault_delta = self.vault;
AccountDelta::new(account_id, storage_delta, vault_delta, nonce_delta)
.expect("account delta created in delta tracker should be valid")
.with_code(self.code)
}
}