use chia_protocol::Bytes32;
use dig_block::{Checkpoint, CheckpointSubmission, PublicKey, Signature, SignerBitmap};
use crate::constants::{BLOCKS_PER_EPOCH, EPOCH_L1_BLOCKS};
use crate::manager::EpochManager;
use crate::types::epoch_phase::PhaseTransition;
pub fn test_network_id() -> Bytes32 {
Bytes32::new([0x01u8; 32])
}
pub fn test_initial_state_root() -> Bytes32 {
Bytes32::new([0xAAu8; 32])
}
pub const TEST_GENESIS_L1_HEIGHT: u32 = 100;
pub fn test_epoch_manager() -> EpochManager {
EpochManager::new(
test_network_id(),
TEST_GENESIS_L1_HEIGHT,
test_initial_state_root(),
)
}
pub fn advance_through_phases(manager: &EpochManager) -> Vec<PhaseTransition> {
let start = manager.current_epoch_info().start_l1_height;
let epoch_len = EPOCH_L1_BLOCKS;
let checkpoint_start = start + epoch_len / 2;
let finalization_start = start + (epoch_len * 3) / 4;
let complete_start = start + epoch_len;
let mut transitions = Vec::new();
for h in [checkpoint_start, finalization_start, complete_start] {
if let Some(t) = manager.update_phase(h) {
transitions.push(t);
}
}
transitions
}
pub fn mock_checkpoint_submission(
epoch: u64,
stake_percentage: u64,
block_count: u32,
) -> CheckpointSubmission {
let mut cp = Checkpoint::new();
cp.epoch = epoch;
cp.block_count = block_count;
cp.state_root = Bytes32::new([(stake_percentage & 0xFF) as u8; 32]);
let score = stake_percentage * u64::from(block_count);
CheckpointSubmission::new(
cp,
SignerBitmap::new(0),
Signature::default(),
PublicKey::default(),
score,
0,
)
}
pub fn build_n_block_epoch(
manager: &EpochManager,
n: u32,
fee_per_block: u64,
tx_per_block: u64,
) -> (u64, u64) {
assert!(
u64::from(n) <= BLOCKS_PER_EPOCH,
"build_n_block_epoch: n {n} exceeds BLOCKS_PER_EPOCH ({BLOCKS_PER_EPOCH})"
);
for _ in 0..n {
manager
.record_block(fee_per_block, tx_per_block)
.expect("test manager should be in BlockProduction at start");
}
(u64::from(n) * fee_per_block, u64::from(n) * tx_per_block)
}