From 7bc4a7ed1c5d1424c9d9bb1182057019ae837732 Mon Sep 17 00:00:00 2001 From: Hardhat Chad Date: Tue, 30 Jul 2024 04:09:30 +0000 Subject: [PATCH 1/2] liveness penalty halving --- program/src/mine.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/program/src/mine.rs b/program/src/mine.rs index 6de4314..6d1fa03 100644 --- a/program/src/mine.rs +++ b/program/src/mine.rs @@ -117,13 +117,23 @@ pub fn process_mine<'a, 'info>(accounts: &'a [AccountInfo<'info>], data: &[u8]) // Apply liveness penalty. let t_liveness = t_target.saturating_add(TOLERANCE); if t.gt(&t_liveness) { - reward = reward.saturating_sub( - reward - .checked_mul(t.checked_sub(t_liveness).unwrap() as u64) - .unwrap() - .checked_div(ONE_MINUTE as u64) - .unwrap(), - ); + // Halve the reward for every minute late. + let tardiness = t.saturating_sub(t_target) as u64; + let halvings = tardiness.saturating_div(ONE_MINUTE as u64); + if halvings.gt(&0) { + let penalty = reward.saturating_div(2u64.saturating_pow(halvings as u32)); + reward = reward.saturating_sub(penalty); + } + + // Linear decay between minutes + let remainder_secs = tardiness.saturating_sub(halvings.saturating_mul(ONE_MINUTE as u64)); + if remainder_secs.gt(&0) { + let penalty = reward + .saturating_div(2) + .saturating_mul(remainder_secs) + .saturating_div(ONE_MINUTE as u64); + reward = reward.saturating_sub(penalty); + } } // Limit payout amount to whatever is left in the bus From 8b8fb32281ab7de7709052ac5b9304c1bf6806bd Mon Sep 17 00:00:00 2001 From: Hardhat Chad Date: Tue, 30 Jul 2024 17:21:01 +0000 Subject: [PATCH 2/2] cleanup --- program/src/mine.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/program/src/mine.rs b/program/src/mine.rs index 6d1fa03..ece8bfe 100644 --- a/program/src/mine.rs +++ b/program/src/mine.rs @@ -121,13 +121,12 @@ pub fn process_mine<'a, 'info>(accounts: &'a [AccountInfo<'info>], data: &[u8]) let tardiness = t.saturating_sub(t_target) as u64; let halvings = tardiness.saturating_div(ONE_MINUTE as u64); if halvings.gt(&0) { - let penalty = reward.saturating_div(2u64.saturating_pow(halvings as u32)); - reward = reward.saturating_sub(penalty); + reward = reward.saturating_div(2u64.saturating_pow(halvings as u32)); } // Linear decay between minutes let remainder_secs = tardiness.saturating_sub(halvings.saturating_mul(ONE_MINUTE as u64)); - if remainder_secs.gt(&0) { + if remainder_secs.gt(&0) && reward.gt(&0) { let penalty = reward .saturating_div(2) .saturating_mul(remainder_secs)