Skip to main content

neo_devpack_solidity/runtime/storage/storage_impl/manager/
commit.rs

1use super::*;
2
3impl StorageManager {
4    /// Commit pending changes
5    pub fn commit(&mut self, account: &str) -> Result<Vec<StorageChange>, RuntimeError> {
6        if let Some(account_storage) = self.storage.get_mut(account) {
7            let changes: Vec<StorageChange> =
8                account_storage.pending_changes.values().cloned().collect();
9
10            // Apply changes to committed storage
11            for (key, change) in account_storage.pending_changes.drain() {
12                match change.change_type {
13                    StorageChangeType::Create | StorageChangeType::Update => {
14                        if let Some(new_value) = change.new_value {
15                            account_storage.storage.insert(key, new_value);
16                        }
17                    }
18                    StorageChangeType::Delete => {
19                        account_storage.storage.remove(&key);
20                    }
21                    StorageChangeType::NoChange => {
22                        // No change needed
23                    }
24                }
25            }
26
27            Ok(changes)
28        } else {
29            Ok(Vec::new())
30        }
31    }
32
33    /// Rollback pending changes
34    pub fn rollback(&mut self, account: &str) -> Result<(), RuntimeError> {
35        if let Some(account_storage) = self.storage.get_mut(account) {
36            account_storage.pending_changes.clear();
37        }
38        Ok(())
39    }
40
41    /// Get all pending changes for account
42    pub fn get_pending_changes(&self, account: &str) -> Vec<&StorageChange> {
43        self.storage
44            .get(account)
45            .map(|storage| storage.pending_changes.values().collect())
46            .unwrap_or_default()
47    }
48
49    /// Calculate total gas cost for pending changes
50    pub fn calculate_pending_gas_cost(&self, account: &str) -> u64 {
51        self.storage
52            .get(account)
53            .map(|storage| storage.pending_changes.values().map(|c| c.gas_cost).sum())
54            .unwrap_or(0)
55    }
56}