stratus/eth/primitives/
execution_account_changes.rsuse std::collections::BTreeMap;
use display_json::DebugAsJson;
use super::CodeHash;
use crate::alias::RevmBytecode;
use crate::eth::primitives::Account;
use crate::eth::primitives::Address;
use crate::eth::primitives::ExecutionValueChange;
use crate::eth::primitives::Nonce;
use crate::eth::primitives::Slot;
use crate::eth::primitives::SlotIndex;
use crate::eth::primitives::Wei;
#[derive(DebugAsJson, Clone, PartialEq, Eq, fake::Dummy, serde::Serialize, serde::Deserialize)]
pub struct ExecutionAccountChanges {
pub new_account: bool,
pub address: Address,
pub nonce: ExecutionValueChange<Nonce>,
pub balance: ExecutionValueChange<Wei>,
#[dummy(default)]
pub bytecode: ExecutionValueChange<Option<RevmBytecode>>,
pub code_hash: CodeHash, pub slots: BTreeMap<SlotIndex, ExecutionValueChange<Slot>>,
}
impl ExecutionAccountChanges {
pub fn from_original_values(account: impl Into<Account>) -> Self {
let account: Account = account.into();
Self {
new_account: false,
address: account.address,
nonce: ExecutionValueChange::from_original(account.nonce),
balance: ExecutionValueChange::from_original(account.balance),
bytecode: ExecutionValueChange::from_original(account.bytecode),
slots: BTreeMap::new(),
code_hash: account.code_hash,
}
}
pub fn from_modified_values(account: impl Into<Account>, modified_slots: Vec<Slot>) -> Self {
let account: Account = account.into();
let mut changes = Self {
new_account: true,
address: account.address,
nonce: ExecutionValueChange::from_modified(account.nonce),
balance: ExecutionValueChange::from_modified(account.balance),
bytecode: ExecutionValueChange::from_modified(account.bytecode),
code_hash: account.code_hash,
slots: BTreeMap::new(),
};
for slot in modified_slots {
changes.slots.insert(slot.index, ExecutionValueChange::from_modified(slot));
}
changes
}
pub fn apply_modifications(&mut self, modified_account: Account, modified_slots: Vec<Slot>) {
let is_nonce_modified = match self.nonce.take_original_ref() {
Some(original_nonce) => *original_nonce != modified_account.nonce,
None => true,
};
if is_nonce_modified {
self.nonce.set_modified(modified_account.nonce);
}
let is_balance_modified = match self.balance.take_original_ref() {
Some(original_balance) => *original_balance != modified_account.balance,
None => true,
};
if is_balance_modified {
self.balance.set_modified(modified_account.balance);
}
for slot in modified_slots {
match self.slots.get_mut(&slot.index) {
Some(ref mut entry) => {
entry.set_modified(slot);
}
None => {
self.slots.insert(slot.index, ExecutionValueChange::from_modified(slot));
}
};
}
}
pub fn is_account_modified(&self) -> bool {
self.nonce.is_modified() || self.balance.is_modified() || self.bytecode.is_modified()
}
}