stratus/eth/primitives/
execution_conflict.rsuse display_json::DebugAsJson;
use nonempty::NonEmpty;
use crate::eth::primitives::Address;
use crate::eth::primitives::Nonce;
use crate::eth::primitives::SlotIndex;
use crate::eth::primitives::SlotValue;
use crate::eth::primitives::Wei;
#[derive(DebugAsJson, serde::Serialize)]
pub struct ExecutionConflicts(pub NonEmpty<ExecutionConflict>);
#[derive(Debug, Default)]
pub struct ExecutionConflictsBuilder(Vec<ExecutionConflict>);
impl ExecutionConflictsBuilder {
pub fn add_nonce(&mut self, address: Address, expected: Nonce, actual: Nonce) {
self.0.push(ExecutionConflict::Nonce { address, expected, actual });
}
pub fn add_balance(&mut self, address: Address, expected: Wei, actual: Wei) {
self.0.push(ExecutionConflict::Balance { address, expected, actual });
}
pub fn add_slot(&mut self, address: Address, slot: SlotIndex, expected: SlotValue, actual: SlotValue) {
self.0.push(ExecutionConflict::Slot {
address,
slot,
expected,
actual,
});
}
pub fn build(self) -> Option<ExecutionConflicts> {
NonEmpty::from_vec(self.0).map(ExecutionConflicts)
}
}
#[derive(DebugAsJson, serde::Serialize)]
#[cfg_attr(test, derive(serde::Deserialize, fake::Dummy, PartialEq))]
pub enum ExecutionConflict {
Nonce { address: Address, expected: Nonce, actual: Nonce },
Balance { address: Address, expected: Wei, actual: Wei },
Slot {
address: Address,
slot: SlotIndex,
expected: SlotValue,
actual: SlotValue,
},
}