mirror of
https://github.com/d0zingcat/ore.git
synced 2026-06-03 15:11:20 +00:00
min bid
This commit is contained in:
@@ -13,9 +13,8 @@ pub struct Config {
|
|||||||
// The last boost timestamp.
|
// The last boost timestamp.
|
||||||
pub last_boost: i64,
|
pub last_boost: i64,
|
||||||
|
|
||||||
// The duration in slots for which the sniper fee is applied.
|
// The minimum amount of SOL that can be prospect.
|
||||||
#[deprecated(since = "1.0.0", note = "Unused")]
|
pub min_prospect_amount: u64,
|
||||||
pub sniper_fee_duration: u64,
|
|
||||||
|
|
||||||
// The address that receives fees.
|
// The address that receives fees.
|
||||||
pub fee_collector: Pubkey,
|
pub fee_collector: Pubkey,
|
||||||
|
|||||||
@@ -309,9 +309,8 @@ async fn log_config(rpc: &RpcClient) -> Result<(), anyhow::Error> {
|
|||||||
println!("Config");
|
println!("Config");
|
||||||
println!(" admin: {}", config.admin);
|
println!(" admin: {}", config.admin);
|
||||||
println!(" last_boost: {}", config.last_boost);
|
println!(" last_boost: {}", config.last_boost);
|
||||||
println!(" sniper_fee_duration: {}", config.sniper_fee_duration);
|
println!(" min_prospect_amount: {}", config.min_prospect_amount);
|
||||||
println!(" fee_collector: {}", config.fee_collector);
|
println!(" fee_collector: {}", config.fee_collector);
|
||||||
println!(" fee_rate: {}", config.fee_rate);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ pub fn process_prospect(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramRes
|
|||||||
return Err(ProgramError::InvalidAccountData);
|
return Err(ProgramError::InvalidAccountData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check minimum amount.
|
||||||
|
if amount < config.min_prospect_amount {
|
||||||
|
return Err(ProgramError::InvalidAccountData);
|
||||||
|
}
|
||||||
|
|
||||||
// Create miner.
|
// Create miner.
|
||||||
let miner = if miner_info.data_is_empty() {
|
let miner = if miner_info.data_is_empty() {
|
||||||
create_program_account::<Miner>(
|
create_program_account::<Miner>(
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ use steel::*;
|
|||||||
pub fn process_reset(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult {
|
pub fn process_reset(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult {
|
||||||
// Load accounts.
|
// Load accounts.
|
||||||
let clock = Clock::get()?;
|
let clock = Clock::get()?;
|
||||||
let (required_accounts, miner_accounts) = accounts.split_at(10);
|
let (required_accounts, miner_accounts) = accounts.split_at(11);
|
||||||
let [signer_info, board_info, mint_info, square_info, treasury_info, treasury_tokens_info, system_program, token_program, ore_program, slot_hashes_sysvar] =
|
let [signer_info, board_info, config_info, mint_info, square_info, treasury_info, treasury_tokens_info, system_program, token_program, ore_program, slot_hashes_sysvar] =
|
||||||
required_accounts
|
required_accounts
|
||||||
else {
|
else {
|
||||||
return Err(ProgramError::NotEnoughAccountKeys);
|
return Err(ProgramError::NotEnoughAccountKeys);
|
||||||
@@ -17,6 +17,7 @@ pub fn process_reset(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResul
|
|||||||
.as_account_mut::<Board>(&ore_api::ID)?
|
.as_account_mut::<Board>(&ore_api::ID)?
|
||||||
.assert_mut(|b| b.slot_hash == [0; 32])?
|
.assert_mut(|b| b.slot_hash == [0; 32])?
|
||||||
.assert_mut(|b| clock.slot >= b.end_slot)?;
|
.assert_mut(|b| clock.slot >= b.end_slot)?;
|
||||||
|
let config = config_info.as_account_mut::<Config>(&ore_api::ID)?;
|
||||||
let mint = mint_info.has_address(&MINT_ADDRESS)?.as_mint()?;
|
let mint = mint_info.has_address(&MINT_ADDRESS)?.as_mint()?;
|
||||||
let square = square_info.as_account_mut::<Square>(&ore_api::ID)?;
|
let square = square_info.as_account_mut::<Square>(&ore_api::ID)?;
|
||||||
let treasury = treasury_info.as_account_mut::<Treasury>(&ore_api::ID)?;
|
let treasury = treasury_info.as_account_mut::<Treasury>(&ore_api::ID)?;
|
||||||
@@ -142,6 +143,24 @@ pub fn process_reset(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResul
|
|||||||
// Update board.
|
// Update board.
|
||||||
board.total_winnings = winnings;
|
board.total_winnings = winnings;
|
||||||
|
|
||||||
|
// Update min prospect amount.
|
||||||
|
let capacity: u64 = 16 * 25;
|
||||||
|
let limit = capacity / 4;
|
||||||
|
let mut availability = 0;
|
||||||
|
for i in 0..25 {
|
||||||
|
availability += 16 - square.count[i];
|
||||||
|
}
|
||||||
|
if availability == 0 {
|
||||||
|
// If board is full, double the minimum prospect amount.
|
||||||
|
config.min_prospect_amount *= 2;
|
||||||
|
} else if availability < limit {
|
||||||
|
// If board is more than 75% full, reduce minimum prospect amount linearly.
|
||||||
|
let pct = (availability * 100) / capacity;
|
||||||
|
let chg = (25u64.saturating_sub(pct) * 100) / 75;
|
||||||
|
let dif = (config.min_prospect_amount * chg) / 100;
|
||||||
|
config.min_prospect_amount = config.min_prospect_amount.saturating_sub(dif);
|
||||||
|
}
|
||||||
|
|
||||||
// Emit event.
|
// Emit event.
|
||||||
program_log(
|
program_log(
|
||||||
&[board_info.clone(), ore_program.clone()],
|
&[board_info.clone(), ore_program.clone()],
|
||||||
@@ -197,3 +216,28 @@ fn get_winning_square(slot_hash: &[u8]) -> usize {
|
|||||||
// Returns a value in the range [0, 24] inclusive
|
// Returns a value in the range [0, 24] inclusive
|
||||||
(r % 25) as usize
|
(r % 25) as usize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn test_get_winning_square() {
|
||||||
|
let capacity = 400u64;
|
||||||
|
let current = 1000u64;
|
||||||
|
let limit = capacity / 4;
|
||||||
|
for occupancy in 0..=capacity {
|
||||||
|
let available = capacity.saturating_sub(occupancy);
|
||||||
|
if available == 0 {
|
||||||
|
println!("[{}/{}] New: {}", occupancy, capacity, current * 2);
|
||||||
|
} else if available < limit {
|
||||||
|
let pct = (available * 100) / capacity;
|
||||||
|
let chg = (25u64.saturating_sub(pct) * 100) / 75;
|
||||||
|
let dif = (current * chg) / 100;
|
||||||
|
let new = current.saturating_sub(dif);
|
||||||
|
println!("[{}/{}] New: {}", occupancy, capacity, new);
|
||||||
|
} else {
|
||||||
|
println!("[{}/{}] New: {}", occupancy, capacity, current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// assert!(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user