revm/db/states/
transition_state.rs

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