diff --git a/api/src/event.rs b/api/src/event.rs index 9f83b48..983e356 100644 --- a/api/src/event.rs +++ b/api/src/event.rs @@ -3,9 +3,7 @@ use steel::*; use crate::state::SwapDirection; pub enum OreEvent { - Mine = 1, - Reward = 2, - Swap = 3, + Swap = 1, } #[repr(C)] @@ -60,53 +58,4 @@ impl SwapEvent { } } -#[repr(C)] -#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)] -pub struct RewardEvent { - /// The event discriminator. - pub disc: u64, - - /// The amount of ORE distributed as a reward. - pub amount: u64, - - /// The authority who received the reward. - pub authority: Pubkey, - - /// The block id. - pub block_id: u64, - - /// The type of reward. - pub rewards_type: u64, - - /// The timestamp of the event. - pub ts: i64, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)] -pub struct MineEvent { - /// The event discriminator. - pub disc: u64, - - /// The authority who mined. - pub authority: Pubkey, - - /// The block id. - pub block_id: u64, - - /// The amount of hashes deployed. - pub deployed: u64, - - /// The total amount of hashes deployed in the block. - pub total_deployed: u64, - - /// The amount of hashpower remaining in the permit. - pub remaining_commitment: u64, - - /// The timestamp of the event. - pub ts: i64, -} - event!(SwapEvent); -event!(RewardEvent); -event!(MineEvent); diff --git a/program/src/close.rs b/program/src/close.rs index 0c61a26..e512da3 100644 --- a/program/src/close.rs +++ b/program/src/close.rs @@ -5,7 +5,7 @@ use steel::*; pub fn process_close(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult { // Load accounts. let clock = Clock::get()?; - let [signer_info, block_info, miner_info, miner_rewards_info, mint_info, opener_info, recipient_info, treasury_info, treasury_tokens_info, system_program, token_program, associated_token_program, ore_program] = + let [signer_info, block_info, miner_info, miner_rewards_info, mint_info, opener_info, recipient_info, treasury_info, treasury_tokens_info, system_program, token_program, associated_token_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); @@ -23,7 +23,6 @@ pub fn process_close(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResul system_program.is_program(&system_program::ID)?; token_program.is_program(&spl_token::ID)?; associated_token_program.is_program(&spl_associated_token_account::ID)?; - ore_program.is_program(&ore_api::ID)?; // Load miner rewards. if miner_rewards_info.data_is_empty() { @@ -65,19 +64,5 @@ pub fn process_close(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResul // Close block. block_info.close(opener_info)?; - // Emit event. - // program_log( - // block.id, - // &[block_info.clone(), ore_program.clone()], - // &CloseEvent { - // authority: *signer_info.key, - // id: block.id, - // burned_base: base_burned, - // burned_quote: quote_burned, - // ts: clock.unix_timestamp, - // } - // .to_bytes(), - // )?; - Ok(()) } diff --git a/program/src/log.rs b/program/src/log.rs index ea60d55..f6f11db 100644 --- a/program/src/log.rs +++ b/program/src/log.rs @@ -2,20 +2,16 @@ use ore_api::prelude::*; use steel::*; /// No-op, use instruction data for logging w/o truncation. -pub fn process_log(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult { - // Load data - let block_id_bytes = data[..8].try_into().unwrap(); - let block_id = u64::from_le_bytes(block_id_bytes); - +pub fn process_log(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult { // Load accounts. let [signer_info] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; signer_info .is_signer()? - .has_seeds(&[BLOCK, &block_id.to_le_bytes()], &ore_api::ID)?; + .as_account::(&ore_api::ID)?; - // For data integrity, only a block can log messages. + // For data integrity, only the market can log messages. Ok(()) } diff --git a/program/src/mine.rs b/program/src/mine.rs index d0a7d22..51405ec 100644 --- a/program/src/mine.rs +++ b/program/src/mine.rs @@ -10,7 +10,7 @@ pub fn process_mine(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult // Load accounts. let clock = Clock::get()?; - let [signer_info, authority_info, block_info, miner_info, ore_program] = accounts else { + let [signer_info, authority_info, block_info, miner_info] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; signer_info.is_signer()?; @@ -23,24 +23,16 @@ pub fn process_mine(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult let miner = miner_info .as_account_mut::(&ore_api::ID)? .assert_mut(|m| m.authority == *authority_info.key)? // Account belongs to authority - .assert_mut(|m| m.block_id <= block.id)?; // Only allow miner to submit hashes in forward bias - ore_program.is_program(&ore_api::ID)?; - - // Reset miner hash if mining new block. - if miner.block_id != block.id { - let mut args = [0u8; 104]; - args[..8].copy_from_slice(&block.id.to_le_bytes()); - args[8..40].copy_from_slice(&block.slot_hash); - args[40..72].copy_from_slice(&miner.authority.to_bytes()); - args[72..].copy_from_slice(&miner.seed); - miner.hash = hash(&args); - miner.block_id = block.id; - } + .assert_mut(|m| m.block_id == block.id)? // Only allow miner to submit hashes for their current block + .assert_mut(|m| m.hashpower > nonce)?; // Only allow miner to submit nonces for their hashpower range // Generate secure hash with provided nonce. - let mut seed = [0u8; 40]; - seed[..8].copy_from_slice(&miner.hash.as_ref()); - seed[8..40].copy_from_slice(&nonce.to_le_bytes()); + let mut seed = [0u8; 112]; + seed[..8].copy_from_slice(&block.id.to_le_bytes()); + seed[8..40].copy_from_slice(&block.slot_hash); + seed[40..72].copy_from_slice(&miner.authority.to_bytes()); + seed[72..].copy_from_slice(&miner.seed); + seed[104..].copy_from_slice(&nonce.to_le_bytes()); let h = hash(&seed); // If hash is best hash, update best hash. @@ -49,21 +41,5 @@ pub fn process_mine(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult block.best_hash_miner = miner.authority; } - // Emit event. - // program_log( - // block.id, - // &[block_info.clone(), ore_program.clone()], - // &MineEvent { - // disc: OreEvent::Mine as u64, - // authority: miner.authority, - // block_id: block.id, - // deployed: amount, - // total_deployed: block.total_deployed, - // remaining_commitment: 0, - // ts: clock.unix_timestamp, - // } - // .to_bytes(), - // )?; - Ok(()) } diff --git a/program/src/open.rs b/program/src/open.rs index 2d7fe91..a12c670 100644 --- a/program/src/open.rs +++ b/program/src/open.rs @@ -33,30 +33,13 @@ pub fn process_open(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult let block = block_info.as_account_mut::(&ore_api::ID)?; block.id = id; block.opener = *signer_info.key; - block.reward = 0; block.best_hash = [0; 32]; block.best_hash_miner = Pubkey::default(); - block.start_slot = u64::MAX; // Set by reset - block.end_slot = u64::MAX; // Set by reset - block.slot_hash = [0; 32]; // Set by mine + block.reward = 0; // Set by reset instruction + block.start_slot = u64::MAX; // Set by reset instruction + block.end_slot = u64::MAX; // Set by reset instruction + block.slot_hash = [0; 32]; // Set by reset instruction block.total_hashpower = 0; - // Emit event. - // program_log( - // id, - // &[block_info.clone(), ore_program.clone()], - // &OpenEvent { - // disc: OreEvent::Open as u64, - // id, - // start_slot, - // signer: *signer_info.key, - // reward_config: block.reward, - // // liquidity_base: market.base.liquidity() as u64, - // // liquidity_quote: market.quote.liquidity() as u64, - // ts: clock.unix_timestamp, - // } - // .to_bytes(), - // )?; - Ok(()) } diff --git a/program/src/swap.rs b/program/src/swap.rs index 3d1816b..199f08c 100644 --- a/program/src/swap.rs +++ b/program/src/swap.rs @@ -76,12 +76,19 @@ pub fn process_swap(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult swap_event.authority = *signer_info.key; swap_event.block_id = block.id; + // Reset miner. + if miner.block_id != block.id { + miner.block_id = block.id; + miner.hashpower = 0; + } + // Transfer tokens match direction { SwapDirection::Buy => { // Update hashpower. - block.total_hashpower += swap_event.base_to_transfer; + miner.hashpower += swap_event.base_to_transfer; miner.total_hashpower += swap_event.base_to_transfer; + block.total_hashpower += swap_event.base_to_transfer; // Transfer ORE from signer to market. transfer( @@ -94,8 +101,9 @@ pub fn process_swap(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult } SwapDirection::Sell => { // Update hashpower. - block.total_hashpower -= swap_event.base_to_transfer; + miner.hashpower -= swap_event.base_to_transfer; miner.total_hashpower -= swap_event.base_to_transfer; + block.total_hashpower -= swap_event.base_to_transfer; // Trasnfer ORE from market to signer. transfer_signed(