mirror of
https://github.com/d0zingcat/ore.git
synced 2026-05-15 15:10:19 +00:00
epoch
This commit is contained in:
@@ -1,13 +1,103 @@
|
||||
use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
|
||||
use solana_program::{
|
||||
account_info::{next_account_info, AccountInfo},
|
||||
clock::Clock,
|
||||
entrypoint::ProgramResult,
|
||||
program_error::ProgramError,
|
||||
pubkey::Pubkey,
|
||||
sysvar::Sysvar,
|
||||
};
|
||||
|
||||
use crate::{BUS_EPOCH_REWARDS, SMOOTHING_FACTOR, TARGET_EPOCH_REWARDS};
|
||||
use crate::{
|
||||
loaders::*,
|
||||
state::{Bus, Treasury},
|
||||
BUS, BUS_COUNT, BUS_EPOCH_REWARDS, EPOCH_DURATION, MAX_EPOCH_REWARDS, SMOOTHING_FACTOR,
|
||||
TARGET_EPOCH_REWARDS, TREASURY,
|
||||
};
|
||||
|
||||
pub fn process_epoch<'a, 'info>(
|
||||
_program_id: &Pubkey,
|
||||
accounts: &'a [AccountInfo<'info>],
|
||||
data: &[u8],
|
||||
_data: &[u8],
|
||||
) -> ProgramResult {
|
||||
// TODO
|
||||
let accounts_iter = &mut accounts.iter();
|
||||
|
||||
// Account 1: Signer
|
||||
let _signer = load_signer(next_account_info(accounts_iter)?)?;
|
||||
|
||||
// Accounts 2-9: Busses
|
||||
let busses = vec![
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
load_bus(next_account_info(accounts_iter)?)?,
|
||||
];
|
||||
|
||||
// Account 10: Mint
|
||||
let mint = load_mint(next_account_info(accounts_iter)?)?;
|
||||
|
||||
// Account 11: Treasury
|
||||
let treasury_info = load_treasury(next_account_info(accounts_iter)?)?;
|
||||
|
||||
// Account 12: Treasury tokens
|
||||
let treasury_tokens = load_token_account(
|
||||
next_account_info(accounts_iter)?,
|
||||
treasury_info.key,
|
||||
mint.key,
|
||||
)?;
|
||||
|
||||
// Account 13: Token program
|
||||
let token_program = load_account(next_account_info(accounts_iter)?, spl_token::id())?;
|
||||
|
||||
// Validate epoch has ended
|
||||
let clock = Clock::get().unwrap();
|
||||
let mut treasury_data = treasury_info.data.borrow_mut();
|
||||
let mut treasury = bytemuck::try_from_bytes_mut::<Treasury>(&mut treasury_data).unwrap();
|
||||
let epoch_end_at = treasury.epoch_start_at.saturating_add(EPOCH_DURATION);
|
||||
if !clock.unix_timestamp.ge(&epoch_end_at) {
|
||||
return Err(ProgramError::Custom(1));
|
||||
}
|
||||
|
||||
// Reset busses
|
||||
let mut total_available_rewards = 0u64;
|
||||
for i in 0..BUS_COUNT {
|
||||
let mut bus_data = busses[i].data.borrow_mut();
|
||||
let mut bus = bytemuck::try_from_bytes_mut::<Bus>(&mut bus_data).unwrap();
|
||||
total_available_rewards = total_available_rewards.saturating_add(bus.available_rewards);
|
||||
bus.available_rewards = BUS_EPOCH_REWARDS;
|
||||
}
|
||||
|
||||
// Update the reward rate for the next epoch
|
||||
let total_epoch_rewards = MAX_EPOCH_REWARDS.saturating_sub(total_available_rewards);
|
||||
treasury.reward_rate = calculate_new_reward_rate(treasury.reward_rate, total_epoch_rewards);
|
||||
treasury.epoch_start_at = clock.unix_timestamp;
|
||||
|
||||
// Top up treasury token account
|
||||
let treasury_bump = treasury.bump as u8;
|
||||
drop(treasury_data);
|
||||
solana_program::program::invoke_signed(
|
||||
&spl_token::instruction::mint_to(
|
||||
&spl_token::id(),
|
||||
mint.key,
|
||||
treasury_tokens.key,
|
||||
treasury_info.key,
|
||||
&[treasury_info.key],
|
||||
total_epoch_rewards,
|
||||
)?,
|
||||
&[
|
||||
token_program.clone(),
|
||||
mint.clone(),
|
||||
treasury_tokens.clone(),
|
||||
treasury_info.clone(),
|
||||
],
|
||||
&[&[TREASURY, &[treasury_bump]]],
|
||||
)?;
|
||||
|
||||
// TODO Logs?
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user