use fil_actor_miner::pledge_penalty_for_continued_fault;
use fil_actor_miner::power_for_sectors;
use fvm_shared::clock::ChainEpoch;
use fvm_shared::econ::TokenAmount;
use num_traits::Zero;
mod util;
use crate::util::*;
const DEFAULT_SECTOR_EXPIRATION: ChainEpoch = 220;
const PERIOD_OFFSET: ChainEpoch = 100;
#[test]
fn declare_fault_pays_fee_at_window_post() {
let big_rewards = TokenAmount::from_whole(1000);
let mut h = ActorHarness::new(PERIOD_OFFSET);
let mut rt = h.new_runtime();
rt.set_balance(BIG_BALANCE.clone());
h.construct_and_verify(&mut rt);
let all_sectors =
h.commit_and_prove_sectors(&mut rt, 1, DEFAULT_SECTOR_EXPIRATION as u64, vec![], true);
let pwr = power_for_sectors(h.sector_size, &all_sectors);
h.apply_rewards(&mut rt, big_rewards, TokenAmount::zero());
let st = h.get_state(&rt);
let (dl_idx, _) = st.find_sector(&rt.policy, &rt.store, all_sectors[0].sector_number).unwrap();
h.advance_and_submit_posts(&mut rt, &all_sectors);
h.declare_faults(&mut rt, &all_sectors);
let dl = h.get_deadline(&rt, dl_idx);
assert_eq!(pwr, dl.faulty_power);
let mut dl_info = h.deadline(&rt);
while dl_info.index != dl_idx {
dl_info = h.advance_deadline(&mut rt, CronConfig::default());
}
let ongoing_pwr = power_for_sectors(h.sector_size, &all_sectors);
let ongoing_penalty = pledge_penalty_for_continued_fault(
&h.epoch_reward_smooth,
&h.epoch_qa_power_smooth,
&ongoing_pwr.qa,
);
h.advance_deadline(
&mut rt,
CronConfig { continued_faults_penalty: ongoing_penalty, ..Default::default() },
);
h.check_state(&rt);
}