use rkyv::{Archive, Deserialize, Serialize};
pub const VALIDATOR_SSZ_SIZE: usize = 121;
pub const MIN_VALIDATOR_WITHDRAWABILITY_DELAY: u64 = 256;
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum ValidatorField {
WithdrawalCredentials,
EffectiveBalance,
Slashed,
ActivationEligibilityEpoch,
ActivationEpoch,
ExitEpoch,
WithdrawableEpochSlashed,
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ValidatorPatch {
pub index: u32,
pub field: ValidatorField,
pub value: Vec<u8>,
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ValidatorsDiff {
pub patches: Vec<ValidatorPatch>,
pub appended_validators: Vec<u8>,
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct BalancesDiff {
pub tags: BitTagVec,
pub mode: i64,
pub varint_payload: Vec<u8>,
pub target_values: Vec<u64>,
pub appended_balances: Vec<u64>,
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum ParticipationDiff {
AllZeros(usize),
Sparse {
sparse_indices: Vec<u8>,
new_values: Vec<u8>,
extension: Vec<u8>,
},
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum InactivityDiff {
AllZeros(u32),
Sparse {
indices: Vec<u32>,
new_values: Vec<u64>,
extensions: Vec<u64>,
},
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct RootsDiff {
pub roots: Vec<[u8; 32]>,
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SlashingsDiff {
pub updates: Vec<(u16, u64)>,
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct RandaoDiff {
pub mixes: Vec<[u8; 32]>,
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum Eth1DataVotesDiff {
Append(Vec<u8>),
ResetAndAppend(Vec<u8>),
}
#[derive(Archive, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct FifoQueueDiff {
pub consumed_count: u32,
pub appended_items: Vec<u8>,
}
#[derive(Eq, PartialEq, Debug, Clone, Default, Archive, Deserialize, Serialize)]
pub struct BitTagVec {
pub data: Vec<u8>,
pub len: usize,
}
pub const SET_NO_CHANGE: u8 = 0b00;
pub const SET_TO_ZERO: u8 = 0b10;
pub const SET_TO_DIFF: u8 = 0b11;
pub const SET_TO_TARGET_VALUE: u8 = 0b01;
impl BitTagVec {
pub fn new(len: usize) -> Self {
let bytes = len.div_ceil(4);
Self {
data: vec![0; bytes],
len,
}
}
#[inline]
pub fn set(&mut self, idx: usize, tag: u8) {
let byte = idx / 4;
let shift = (idx % 4) * 2;
self.data[byte] |= (tag & 0b11) << shift;
}
#[inline]
pub fn get(&self, idx: usize) -> u8 {
let byte = idx / 4;
let shift = (idx % 4) * 2;
(self.data[byte] >> shift) & 0b11
}
}