use crate::tokenomics::models::{EconomicEvent, StakingTier};
use crate::AnyaResult;
pub struct RewardsManager {
tiers: Vec<StakingTier>,
base_apy: f64,
total_staked: u64,
}
impl RewardsManager {
pub fn new(base_apy: f64) -> Self {
let default_tiers = vec![
StakingTier {
name: "Bronze".to_string(),
minimum_stake: 100,
reward_multiplier: 1.0,
},
StakingTier {
name: "Silver".to_string(),
minimum_stake: 1000,
reward_multiplier: 1.2,
},
StakingTier {
name: "Gold".to_string(),
minimum_stake: 10000,
reward_multiplier: 1.5,
},
StakingTier {
name: "Platinum".to_string(),
minimum_stake: 100000,
reward_multiplier: 2.0,
},
];
Self {
tiers: default_tiers,
base_apy,
total_staked: 0,
}
}
pub fn calculate_rewards(&self, stake_amount: u64, days: u32) -> AnyaResult<f64> {
let tier = self
.tiers
.iter()
.filter(|t| stake_amount >= t.minimum_stake)
.max_by_key(|t| t.minimum_stake)
.unwrap_or(&self.tiers[0]);
let annual_rate = self.base_apy * tier.reward_multiplier;
let daily_rate = annual_rate / 365.0;
let rewards = (stake_amount as f64) * (daily_rate * days as f64);
Ok(rewards)
}
pub fn record_stake(&mut self, account: &str, amount: u64) -> AnyaResult<EconomicEvent> {
self.total_staked += amount;
let event = EconomicEvent {
timestamp: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs(),
event_type: crate::tokenomics::models::EconomicEventType::Stake,
amount,
account: account.to_string(),
};
Ok(event)
}
pub fn get_total_staked(&self) -> u64 {
self.total_staked
}
}