use crate::types::{ArchivedRandaoDiff, RandaoDiff};
pub fn diff_randao(
base_slot: u64,
target_slot: u64,
target_buffer: &[[u8; 32]],
slots_per_epoch: u64,
) -> RandaoDiff {
debug_assert!(
target_slot >= base_slot,
"target_slot must not precede base_slot"
);
let base_epoch = base_slot / slots_per_epoch;
let target_epoch = target_slot / slots_per_epoch;
let capacity = target_buffer.len() as u64;
let mut mixes = Vec::with_capacity((target_epoch - base_epoch + 1) as usize);
for epoch in base_epoch..=target_epoch {
let idx = (epoch % capacity) as usize;
mixes.push(target_buffer[idx]);
}
RandaoDiff { mixes }
}
pub fn apply_randao(
base_slot: u64,
base_buffer: &mut [[u8; 32]],
delta: &ArchivedRandaoDiff,
slots_per_epoch: u64,
) {
let capacity = base_buffer.len() as u64;
let mut current_epoch = base_slot / slots_per_epoch;
for mix in delta.mixes.iter() {
let idx = (current_epoch % capacity) as usize;
base_buffer[idx] = *mix;
current_epoch += 1;
}
}