mirror of
https://github.com/d0zingcat/ore.git
synced 2026-05-13 23:16:52 +00:00
refined
This commit is contained in:
@@ -96,7 +96,8 @@ pub fn process_bury(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult
|
||||
let mut shared_amount = 0;
|
||||
if treasury.total_staked > 0 {
|
||||
shared_amount = ONE_ORE / 10_000; // TODO: calculate shared amount
|
||||
treasury.rewards_factor += Numeric::from_fraction(shared_amount, treasury.total_staked);
|
||||
treasury.stake_rewards_factor +=
|
||||
Numeric::from_fraction(shared_amount, treasury.total_staked);
|
||||
}
|
||||
|
||||
sol_log(&format!(
|
||||
|
||||
@@ -4,12 +4,9 @@ use spl_token::amount_to_ui_amount;
|
||||
use steel::*;
|
||||
|
||||
/// Claims a block reward.
|
||||
pub fn process_claim_ore(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
|
||||
// Parse data.
|
||||
let args = ClaimORE::try_from_bytes(data)?;
|
||||
let amount = u64::from_le_bytes(args.amount);
|
||||
|
||||
pub fn process_claim_ore(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult {
|
||||
// Load accounts.
|
||||
let clock = Clock::get()?;
|
||||
let [signer_info, miner_info, mint_info, recipient_info, treasury_info, treasury_tokens_info, system_program, token_program, associated_token_program] =
|
||||
accounts
|
||||
else {
|
||||
@@ -43,7 +40,7 @@ pub fn process_claim_ore(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramRe
|
||||
}
|
||||
|
||||
// Normalize amount.
|
||||
let amount = miner.claim_ore(amount, treasury);
|
||||
let amount = miner.claim_ore(&clock, treasury);
|
||||
|
||||
sol_log(
|
||||
&format!(
|
||||
|
||||
@@ -3,12 +3,9 @@ use solana_program::{log::sol_log, native_token::lamports_to_sol};
|
||||
use steel::*;
|
||||
|
||||
/// Claims a block reward.
|
||||
pub fn process_claim_sol(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
|
||||
// Parse data.
|
||||
let args = ClaimSOL::try_from_bytes(data)?;
|
||||
let amount = u64::from_le_bytes(args.amount);
|
||||
|
||||
pub fn process_claim_sol(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult {
|
||||
// Load accounts.
|
||||
let clock = Clock::get()?;
|
||||
let [signer_info, miner_info, system_program] = accounts else {
|
||||
return Err(ProgramError::NotEnoughAccountKeys);
|
||||
};
|
||||
@@ -19,7 +16,7 @@ pub fn process_claim_sol(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramRe
|
||||
system_program.is_program(&system_program::ID)?;
|
||||
|
||||
// Normalize amount.
|
||||
let amount = miner.claim_sol(amount);
|
||||
let amount = miner.claim_sol(&clock);
|
||||
|
||||
sol_log(&format!("Claiming {} SOL", lamports_to_sol(amount)).as_str());
|
||||
|
||||
|
||||
@@ -23,7 +23,8 @@ pub fn process_deploy(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResul
|
||||
.has_seeds(&[AUTOMATION, &authority_info.key.to_bytes()], &ore_api::ID)?;
|
||||
let board = board_info
|
||||
.as_account_mut::<Board>(&ore_api::ID)?
|
||||
.assert_mut(|b| clock.slot >= b.start_slot && clock.slot < b.end_slot)?;
|
||||
.assert_mut(|b| clock.slot >= b.start_slot && clock.slot < b.end_slot)?
|
||||
.assert_mut(|b| b.round_id < 15115)?;
|
||||
let round = round_info
|
||||
.as_account_mut::<Round>(&ore_api::ID)?
|
||||
.assert_mut(|r| r.id == board.round_id)?;
|
||||
|
||||
@@ -51,7 +51,7 @@ pub fn process_deposit(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResu
|
||||
stake.last_deposit_at = 0;
|
||||
stake.last_withdraw_at = 0;
|
||||
stake.is_seeker = 0;
|
||||
stake.rewards_factor = treasury.rewards_factor;
|
||||
stake.rewards_factor = treasury.stake_rewards_factor;
|
||||
stake.rewards = 0;
|
||||
stake.lifetime_rewards = 0;
|
||||
stake
|
||||
|
||||
@@ -10,6 +10,8 @@ mod close;
|
||||
mod deploy;
|
||||
mod deposit;
|
||||
mod log;
|
||||
mod migrate_miner;
|
||||
mod migrate_treasury;
|
||||
mod reset;
|
||||
mod set_admin;
|
||||
mod set_fee_collector;
|
||||
@@ -29,6 +31,8 @@ use close::*;
|
||||
use deploy::*;
|
||||
use deposit::*;
|
||||
use log::*;
|
||||
use migrate_miner::*;
|
||||
use migrate_treasury::*;
|
||||
use reset::*;
|
||||
use set_admin::*;
|
||||
use set_fee_collector::*;
|
||||
@@ -71,6 +75,8 @@ pub fn process_instruction(
|
||||
|
||||
// Seeker
|
||||
OreInstruction::ClaimSeeker => process_claim_seeker(accounts, data)?,
|
||||
OreInstruction::MigrateTreasury => process_migrate_treasury(accounts, data)?,
|
||||
OreInstruction::MigrateMiner => process_migrate_miner(accounts, data)?,
|
||||
_ => return Err(ProgramError::InvalidInstructionData),
|
||||
}
|
||||
|
||||
|
||||
60
program/src/migrate_miner.rs
Normal file
60
program/src/migrate_miner.rs
Normal file
@@ -0,0 +1,60 @@
|
||||
use ore_api::prelude::*;
|
||||
use solana_program::rent::Rent;
|
||||
use steel::*;
|
||||
|
||||
/// Sets the admin.
|
||||
pub fn process_migrate_miner(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
|
||||
// Load accounts.
|
||||
let [signer_info, config_info, miner_info, system_program] = accounts else {
|
||||
return Err(ProgramError::NotEnoughAccountKeys);
|
||||
};
|
||||
signer_info.is_signer()?;
|
||||
let config = config_info
|
||||
.as_account_mut::<Config>(&ore_api::ID)?
|
||||
.assert_mut_err(
|
||||
|c| c.admin == *signer_info.key,
|
||||
OreError::NotAuthorized.into(),
|
||||
)?;
|
||||
let miner = miner_info.as_account_mut::<MinerOLD>(&ore_api::ID)?;
|
||||
system_program.is_program(&system_program::ID)?;
|
||||
|
||||
// Record old values.
|
||||
let authority = miner.authority;
|
||||
let deployed = miner.deployed;
|
||||
let cumulative = miner.cumulative;
|
||||
let checkpoint_fee = miner.checkpoint_fee;
|
||||
let checkpoint_id = miner.checkpoint_id;
|
||||
let rewards_sol = miner.rewards_sol;
|
||||
let rewards_ore = miner.rewards_ore;
|
||||
let round_id = miner.round_id;
|
||||
let lifetime_rewards_sol = miner.lifetime_rewards_sol;
|
||||
let lifetime_rewards_ore = miner.lifetime_rewards_ore;
|
||||
|
||||
// Realloc miner.
|
||||
let new_size = 8 + std::mem::size_of::<Miner>();
|
||||
let old_size = 8 + std::mem::size_of::<MinerOLD>();
|
||||
let new_rent = Rent::get()?.minimum_balance(new_size);
|
||||
let old_rent = Rent::get()?.minimum_balance(old_size);
|
||||
let additional_rent = new_rent - old_rent;
|
||||
miner_info.realloc(new_size, false)?;
|
||||
miner_info.collect(additional_rent, &signer_info)?;
|
||||
|
||||
// Update miner.
|
||||
let miner = miner_info.as_account_mut::<Miner>(&ore_api::ID)?;
|
||||
miner.authority = authority;
|
||||
miner.deployed = deployed;
|
||||
miner.cumulative = cumulative;
|
||||
miner.checkpoint_fee = checkpoint_fee;
|
||||
miner.checkpoint_id = checkpoint_id;
|
||||
miner.rewards_sol = rewards_sol;
|
||||
miner.rewards_ore = rewards_ore;
|
||||
miner.round_id = round_id;
|
||||
miner.lifetime_rewards_sol = lifetime_rewards_sol;
|
||||
miner.lifetime_rewards_ore = lifetime_rewards_ore;
|
||||
miner.last_claim_ore_at = 0;
|
||||
miner.last_claim_sol_at = 0;
|
||||
miner.rewards_factor = Numeric::ZERO;
|
||||
miner.refined_ore = 0;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
48
program/src/migrate_treasury.rs
Normal file
48
program/src/migrate_treasury.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
use ore_api::prelude::*;
|
||||
use solana_program::rent::Rent;
|
||||
use steel::*;
|
||||
|
||||
/// Sets the admin.
|
||||
pub fn process_migrate_treasury(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
|
||||
// Load accounts.
|
||||
let [signer_info, config_info, treasury_info, system_program] = accounts else {
|
||||
return Err(ProgramError::NotEnoughAccountKeys);
|
||||
};
|
||||
signer_info.is_signer()?;
|
||||
let config = config_info
|
||||
.as_account_mut::<Config>(&ore_api::ID)?
|
||||
.assert_mut_err(
|
||||
|c| c.admin == *signer_info.key,
|
||||
OreError::NotAuthorized.into(),
|
||||
)?;
|
||||
let treasury = treasury_info.as_account_mut::<TreasuryOLD>(&ore_api::ID)?;
|
||||
system_program.is_program(&system_program::ID)?;
|
||||
|
||||
// Record old values.
|
||||
let balance = treasury.balance;
|
||||
let motherlode = treasury.motherlode;
|
||||
let stake_rewards_factor = treasury.stake_rewards_factor;
|
||||
let total_staked = treasury.total_staked;
|
||||
let total_unclaimed = treasury.total_unclaimed;
|
||||
let miner_rewards_factor = treasury.miner_rewards_factor;
|
||||
|
||||
// Realloc treasury.
|
||||
let new_size = 8 + std::mem::size_of::<Treasury>();
|
||||
let old_size = 8 + std::mem::size_of::<TreasuryOLD>();
|
||||
let new_rent = Rent::get()?.minimum_balance(new_size);
|
||||
let old_rent = Rent::get()?.minimum_balance(old_size);
|
||||
let additional_rent = new_rent - old_rent;
|
||||
treasury_info.realloc(new_size, false)?;
|
||||
treasury_info.collect(additional_rent, &signer_info)?;
|
||||
|
||||
// Update treasury.
|
||||
let treasury = treasury_info.as_account_mut::<Treasury>(&ore_api::ID)?;
|
||||
treasury.balance = balance;
|
||||
treasury.motherlode = motherlode;
|
||||
treasury.stake_rewards_factor = stake_rewards_factor;
|
||||
treasury.total_staked = total_staked;
|
||||
treasury.total_unclaimed = total_unclaimed;
|
||||
treasury.miner_rewards_factor = miner_rewards_factor;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user