use crate::{
types::BalanceOf, BlocksAuthored, BlocksRewarded, CandidatePool, Config, DelegatorState, InflationConfig, Pallet,
Rewards, TotalCollatorStake,
};
use frame_support::traits::fungible::Inspect;
use sp_runtime::{
traits::{SaturatedConversion, Saturating, Zero},
Perquintill,
};
impl<T: Config> Pallet<T> {
pub fn get_unclaimed_staking_rewards(acc: &T::AccountId) -> BalanceOf<T> {
let count_rewarded = BlocksRewarded::<T>::get(acc);
let rewards = Rewards::<T>::get(acc);
if let Some(delegator_state) = DelegatorState::<T>::get(acc) {
let count_unclaimed = BlocksAuthored::<T>::get(&delegator_state.owner).saturating_sub(count_rewarded);
let stake = delegator_state.amount;
rewards.saturating_add(Self::calc_block_rewards_delegator(
stake,
count_unclaimed.saturated_into(),
))
} else if Self::is_active_candidate(acc).is_some() {
let count_unclaimed = BlocksAuthored::<T>::get(acc).saturating_sub(count_rewarded);
let stake = CandidatePool::<T>::get(acc)
.map(|state| state.stake)
.unwrap_or_else(BalanceOf::<T>::zero);
rewards.saturating_add(Self::calc_block_rewards_collator(
stake,
count_unclaimed.saturated_into(),
))
} else {
rewards
}
}
pub fn get_staking_rates() -> kilt_runtime_api_staking::StakingRates {
let total_issuance = T::Currency::total_issuance();
let total_stake = TotalCollatorStake::<T>::get();
let inflation_config = InflationConfig::<T>::get();
let collator_staking_rate = Perquintill::from_rational(total_stake.collators, total_issuance);
let delegator_staking_rate = Perquintill::from_rational(total_stake.delegators, total_issuance);
let collator_reward_rate = Perquintill::from_rational(
inflation_config.collator.max_rate.deconstruct(),
collator_staking_rate.deconstruct(),
) * inflation_config.collator.reward_rate.annual;
let delegator_reward_rate = Perquintill::from_rational(
inflation_config.delegator.max_rate.deconstruct(),
delegator_staking_rate.deconstruct(),
) * inflation_config.delegator.reward_rate.annual;
kilt_runtime_api_staking::StakingRates {
collator_staking_rate,
collator_reward_rate,
delegator_staking_rate,
delegator_reward_rate,
}
}
}