mirror of
https://github.com/d0zingcat/ore.git
synced 2026-05-13 23:16:52 +00:00
little cleanup
This commit is contained in:
@@ -5,7 +5,7 @@ use thiserror::Error;
|
||||
#[derive(Debug, Error, Clone, Copy, PartialEq, Eq, IntoPrimitive)]
|
||||
#[repr(u32)]
|
||||
pub enum OreError {
|
||||
#[error("The start time has not passed yet")]
|
||||
#[error("The starting time has not passed yet")]
|
||||
NotStarted = 0,
|
||||
#[error("The epoch has ended and needs reset")]
|
||||
NeedsReset = 1,
|
||||
@@ -15,9 +15,9 @@ pub enum OreError {
|
||||
HashInvalid = 3,
|
||||
#[error("The provided hash does not satisfy the difficulty requirement")]
|
||||
DifficultyNotSatisfied = 4,
|
||||
#[error("The bus has insufficient rewards to issue at this time")]
|
||||
#[error("The bus does not have enough rewards to issue at this time")]
|
||||
BusRewardsInsufficient = 5,
|
||||
#[error("The claim amount cannot be larger than the claimable rewards")]
|
||||
#[error("The claim amount cannot be greater than the claimable rewards")]
|
||||
ClaimTooLarge = 6,
|
||||
}
|
||||
|
||||
|
||||
@@ -34,14 +34,14 @@ pub enum OreInstruction {
|
||||
|
||||
#[account(0, name = "ore_program", desc = "Ore program")]
|
||||
#[account(1, name = "signer", desc = "Signer", signer)]
|
||||
#[account(2, name = "proof", desc = "Ore miner proof account", writable)]
|
||||
#[account(2, name = "proof", desc = "Ore proof account", writable)]
|
||||
#[account(3, name = "system_program", desc = "Solana system program")]
|
||||
Register = 1,
|
||||
|
||||
#[account(0, name = "ore_program", desc = "Ore program")]
|
||||
#[account(1, name = "signer", desc = "Signer", signer)]
|
||||
#[account(2, name = "bus", desc = "Ore bus account", writable)]
|
||||
#[account(3, name = "proof", desc = "Ore miner proof account", writable)]
|
||||
#[account(3, name = "proof", desc = "Ore proof account", writable)]
|
||||
#[account(4, name = "treasury", desc = "Ore treasury account")]
|
||||
#[account(5, name = "slot_hashes", desc = "Solana slot hashes sysvar")]
|
||||
Mine = 2,
|
||||
@@ -50,14 +50,14 @@ pub enum OreInstruction {
|
||||
#[account(1, name = "signer", desc = "Signer", signer)]
|
||||
#[account(2, name = "beneficiary", desc = "Beneficiary token account", writable)]
|
||||
#[account(3, name = "mint", desc = "Ore token mint account")]
|
||||
#[account(4, name = "proof", desc = "Ore miner proof account", writable)]
|
||||
#[account(4, name = "proof", desc = "Ore proof account", writable)]
|
||||
#[account(5, name = "treasury", desc = "Ore treasury account", writable)]
|
||||
#[account(6, name = "treasury_tokens", desc = "Ore treasury token account", writable)]
|
||||
#[account(7, name = "token_program", desc = "SPL token program")]
|
||||
Claim = 3,
|
||||
|
||||
#[account(0, name = "ore_program", desc = "Ore program")]
|
||||
#[account(1, name = "admin", desc = "Admin signer", signer)]
|
||||
#[account(1, name = "signer", desc = "Admin signer", signer)]
|
||||
#[account(2, name = "bus_0", desc = "Ore bus account 0", writable)]
|
||||
#[account(3, name = "bus_1", desc = "Ore bus account 1", writable)]
|
||||
#[account(4, name = "bus_2", desc = "Ore bus account 2", writable)]
|
||||
@@ -73,17 +73,19 @@ pub enum OreInstruction {
|
||||
#[account(14, name = "system_program", desc = "Solana system program")]
|
||||
#[account(15, name = "token_program", desc = "SPL token program")]
|
||||
#[account(16, name = "associated_token_program", desc = "SPL associated token program")]
|
||||
#[account(17, name = "mpl_metadata_program", desc = "MPL token metadata program")]
|
||||
#[account(17, name = "mpl_metadata_program", desc = "Metaplex metadata program")]
|
||||
#[account(18, name = "rent", desc = "Solana rent sysvar")]
|
||||
Initialize = 100,
|
||||
|
||||
#[account(0, name = "ore_program", desc = "Ore program")]
|
||||
#[account(1, name = "treasury", desc = "Ore treasury account")]
|
||||
UpdateAdmin = 102,
|
||||
#[account(1, name = "signer", desc = "Admin signer", signer)]
|
||||
#[account(2, name = "treasury", desc = "Ore treasury account")]
|
||||
UpdateAdmin = 101,
|
||||
|
||||
#[account(0, name = "ore_program", desc = "Ore program")]
|
||||
#[account(1, name = "treasury", desc = "Ore treasury account")]
|
||||
UpdateDifficulty = 103,
|
||||
#[account(1, name = "signer", desc = "Admin signer", signer)]
|
||||
#[account(2, name = "treasury", desc = "Ore treasury account")]
|
||||
UpdateDifficulty = 102,
|
||||
}
|
||||
|
||||
impl OreInstruction {
|
||||
|
||||
@@ -16,10 +16,10 @@ use crate::{
|
||||
|
||||
/// Register generates a new hash chain for a prospective miner. Its responsibilities include:
|
||||
/// 1. Initialize a new proof account.
|
||||
/// 2. Generate an initial hash for the miner from the signer's key.
|
||||
/// 2. Generate an initial hash from the signer's key.
|
||||
///
|
||||
/// Safety requirements:
|
||||
/// - Register is a permissionless instruction and can be called by anyone.
|
||||
/// - Register is a permissionless instruction and can be invoked by any singer.
|
||||
/// - Can only succeed if the provided proof acount PDA is valid (associated with the signer).
|
||||
/// - Can only succeed once per signer.
|
||||
/// - The provided system program must be valid.
|
||||
|
||||
@@ -12,21 +12,21 @@ use crate::{
|
||||
TARGET_EPOCH_REWARDS, TREASURY,
|
||||
};
|
||||
|
||||
/// Reset transitions the Ore program from one epoch to the next. Its responsibilities include:
|
||||
/// Reset sets up the Ore program for the next epoch. Its responsibilities include:
|
||||
/// 1. Reset bus account rewards counters.
|
||||
/// 2. Adjust the reward rate to stabilize inflation.
|
||||
/// 3. Top up the treasury token account to backup claims.
|
||||
///
|
||||
/// Safety requirements:
|
||||
/// - Reset is a permissionless crank function and can be invoked by any signer.
|
||||
/// - Reset is a permissionless instruction and can be invoked by any signer.
|
||||
/// - Can only succeed if START_AT has passed.
|
||||
/// - Can only succeed if more 60 seconds or more have passed since the last successful reset.
|
||||
/// - Can only succeed if more tha 60 seconds or more have passed since the last successful reset.
|
||||
/// - The busses, mint, treasury, treasury token account, and token program must all be valid.
|
||||
///
|
||||
/// Discussion:
|
||||
/// - It is important that `reset` can only be invoked once per 60 second period to ensure the supply growth rate
|
||||
/// stays within the guaranteed bounds of 0 ≤ R ≤ 2 ORE/min.
|
||||
/// - The reward rate is dynamically adjusted based on last epoch's actual reward rate (proxy hashpower) to
|
||||
/// - The reward rate is dynamically adjusted based on last epoch's actual reward rate (proxy for hashpower) to
|
||||
/// target an average supply growth rate of 1 ORE/min.
|
||||
pub fn process_reset<'a, 'info>(
|
||||
_program_id: &Pubkey,
|
||||
@@ -116,11 +116,15 @@ pub fn process_reset<'a, 'info>(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// This function calculates what the new reward rate should be based on how many total rewards were mined in the prior epoch.
|
||||
/// The math is largely identitical to that used by the Bitcoin network for updating the difficulty between each epoch.
|
||||
/// This function calculates what the new reward rate should be based on how many total rewards
|
||||
/// were mined in the prior epoch. The math is largely identitical to function used by the Bitcoin
|
||||
/// network to update the difficulty between each epoch.
|
||||
///
|
||||
/// new_rate = current_rate * (target_rewards / actual_rewards)
|
||||
/// The new rate is then smoothed by a constant factor to avoid unexpectedly large fluctuations.
|
||||
/// In Ore's case, the epochs are so short (60 seconds) that the smoothing factor of 2 has been chosen.
|
||||
///
|
||||
/// The new rate is then smoothed by a constant factor to avoid large fluctuations. In Ore's case,
|
||||
/// the epochs are short (60 seconds) so a smoothing factor of 2 has been chosen. That is, the reward rate
|
||||
/// can at most double or halve from one epoch to the next.
|
||||
pub(crate) fn calculate_new_reward_rate(current_rate: u64, epoch_rewards: u64) -> u64 {
|
||||
// Avoid division by zero. Leave the reward rate unchanged, if detected.
|
||||
if epoch_rewards.eq(&0) {
|
||||
|
||||
Reference in New Issue
Block a user