use std::collections::HashSet;
use vapory_types::Address;
use common_types::log_entry::LogEntry;
#[derive(Debug, Default)]
pub struct Substate {
pub suicides: HashSet<Address>,
pub touched: HashSet<Address>,
pub logs: Vec<LogEntry>,
pub sstore_clears_refund: i128,
pub contracts_created: Vec<Address>,
}
impl Substate {
pub fn new() -> Self {
Substate::default()
}
pub fn accrue(&mut self, s: Substate) {
self.suicides.extend(s.suicides);
self.touched.extend(s.touched);
self.logs.extend(s.logs);
self.sstore_clears_refund += s.sstore_clears_refund;
self.contracts_created.extend(s.contracts_created);
}
}
#[cfg(test)]
mod tests {
use vapory_types::Address;
use common_types::log_entry::LogEntry;
use super::Substate;
#[test]
fn created() {
let sub_state = Substate::new();
assert_eq!(sub_state.suicides.len(), 0);
}
#[test]
fn accrue() {
let mut sub_state = Substate::new();
sub_state.contracts_created.push(Address::from_low_u64_be(1));
sub_state.logs.push(LogEntry {
address: Address::from_low_u64_be(1),
topics: vec![],
data: vec![]
});
sub_state.sstore_clears_refund = (15000 * 5).into();
sub_state.suicides.insert(Address::from_low_u64_be(10));
let mut sub_state_2 = Substate::new();
sub_state_2.contracts_created.push(Address::from_low_u64_be(2u64));
sub_state_2.logs.push(LogEntry {
address: Address::from_low_u64_be(1),
topics: vec![],
data: vec![]
});
sub_state_2.sstore_clears_refund = (15000 * 7).into();
sub_state.accrue(sub_state_2);
assert_eq!(sub_state.contracts_created.len(), 2);
assert_eq!(sub_state.sstore_clears_refund, (15000 * 12).into());
assert_eq!(sub_state.suicides.len(), 1);
}
}