revm_database/states/
transition_state.rs

1use super::TransitionAccount;
2use primitives::{hash_map::Entry, Address, HashMap};
3use std::vec::Vec;
4
5/// State of accounts in transition between transaction executions.
6#[derive(Clone, Default, Debug, PartialEq, Eq)]
7pub struct TransitionState {
8    /// Block state account with account state
9    pub transitions: HashMap<Address, TransitionAccount>,
10}
11
12impl TransitionState {
13    /// Create new transition state containing one [`TransitionAccount`].
14    pub fn single(address: Address, transition: TransitionAccount) -> Self {
15        let mut transitions = HashMap::default();
16        transitions.insert(address, transition);
17        TransitionState { transitions }
18    }
19
20    /// Take the contents of this [`TransitionState`] and replace it with an
21    /// empty one.
22    ///
23    /// See [core::mem::take].
24    pub fn take(&mut self) -> TransitionState {
25        core::mem::take(self)
26    }
27
28    /// Add transitions to the transition state.
29    ///
30    /// This will insert new [`TransitionAccount`]s, or update existing ones via
31    /// [`update`][TransitionAccount::update].
32    pub fn add_transitions(&mut self, transitions: Vec<(Address, TransitionAccount)>) {
33        for (address, account) in transitions {
34            match self.transitions.entry(address) {
35                Entry::Occupied(entry) => {
36                    let entry = entry.into_mut();
37                    entry.update(account);
38                }
39                Entry::Vacant(entry) => {
40                    entry.insert(account);
41                }
42            }
43        }
44    }
45}