From 102ee19708b44314a10f0fc615bca35525c36025 Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Fri, 21 Jun 2024 12:27:02 -0700 Subject: [PATCH 01/23] initial updates to integrate baseline bug fix --- actors/miner/src/ext.rs | 6 ++++++ actors/miner/src/lib.rs | 24 ++++++++++++++++++++++++ actors/miner/src/monies.rs | 29 ++++++++++++++++++++++++++--- actors/power/src/lib.rs | 8 ++++++++ actors/power/src/state.rs | 4 ++++ 5 files changed, 68 insertions(+), 3 deletions(-) diff --git a/actors/miner/src/ext.rs b/actors/miner/src/ext.rs index 031ccaf63..40420feb3 100644 --- a/actors/miner/src/ext.rs +++ b/actors/miner/src/ext.rs @@ -92,6 +92,7 @@ pub mod power { pub const UPDATE_PLEDGE_TOTAL_METHOD: u64 = 6; pub const SUBMIT_POREP_FOR_BULK_VERIFY_METHOD: u64 = 8; pub const CURRENT_TOTAL_POWER_METHOD: u64 = 9; + pub const MINER_RAMP_PARAMS_METHOD: u64 = 10; // TODO: how to set this value properly?? #[derive(Serialize_tuple, Deserialize_tuple)] pub struct CurrentTotalPowerReturn { @@ -116,6 +117,11 @@ pub mod power { pub quality_adjusted_delta: StoragePower, } + #[derive(Serialize_tuple, Deserialize_tuple)] + pub struct MinerRampParamsReturn { + pub ramp_duration_epochs: u64 + } + pub const MAX_MINER_PROVE_COMMITS_PER_EPOCH: usize = 200; } diff --git a/actors/miner/src/lib.rs b/actors/miner/src/lib.rs index 9cf3dde47..d51e5e166 100644 --- a/actors/miner/src/lib.rs +++ b/actors/miner/src/lib.rs @@ -811,11 +811,13 @@ impl Actor { let rew = request_current_epoch_block_reward(rt)?; let pwr = request_current_total_power(rt)?; let circulating_supply = rt.total_fil_circ_supply(); + let ramp_duration_epochs = request_miner_ramp_params(rt)?.ramp_duration_epochs; let pledge_inputs = NetworkPledgeInputs { network_qap: pwr.quality_adj_power_smoothed, network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, + ramp_duration_epochs: ramp_duration_epochs, }; /* @@ -1908,11 +1910,13 @@ impl Actor { let rew = request_current_epoch_block_reward(rt)?; let pwr = request_current_total_power(rt)?; let circulating_supply = rt.total_fil_circ_supply(); + let ramp_duration_epochs = request_miner_ramp_params(rt)?.ramp_duration_epochs; let pledge_inputs = NetworkPledgeInputs { network_qap: pwr.quality_adj_power_smoothed, network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, + ramp_duration_epochs: ramp_duration_epochs }; activate_new_sector_infos( rt, @@ -3844,11 +3848,13 @@ where let rew = request_current_epoch_block_reward(rt)?; let pow = request_current_total_power(rt)?; let circulating_supply = rt.total_fil_circ_supply(); + let ramp_duration_epochs = request_miner_ramp_params(rt)?.ramp_duration_epochs; let pledge_inputs = NetworkPledgeInputs { network_qap: pow.quality_adj_power_smoothed, network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, + ramp_duration_epochs: ramp_duration_epochs }; let mut power_delta = PowerPair::zero(); let mut pledge_delta = TokenAmount::zero(); @@ -4045,6 +4051,7 @@ fn update_existing_sector_info( &pledge_inputs.epoch_reward, &pledge_inputs.network_qap, &pledge_inputs.circulating_supply, + &pledge_inputs.ramp_duration_epochs, ), ); new_sector_info @@ -4803,6 +4810,21 @@ fn request_current_total_power( ) } +/// Request the ramp duration from the power actor +fn request_miner_ramp_params( + rt: &impl Runtime, +) -> Result { + deserialize_block( + extract_send_result(rt.send_simple( + &STORAGE_POWER_ACTOR_ADDR, + ext::power::MINER_RAMP_PARAMS_METHOD, + Default::default(), + TokenAmount::zero(), + )) + .map_err(|e| e.wrap("failed to check miner ramp params"))?, + ) +} + /// Resolves an address to an ID address and verifies that it is address of an account actor with an associated BLS key. /// The worker must be BLS since the worker key will be used alongside a BLS-VRF. fn resolve_worker_address(rt: &impl Runtime, raw: Address) -> Result { @@ -5166,6 +5188,7 @@ fn activate_new_sector_infos( &pledge_inputs.epoch_reward, &pledge_inputs.network_qap, &pledge_inputs.circulating_supply, + &pledge_inputs.ramp_duration_epochs, ); deposit_to_unlock += pci.pre_commit_deposit.clone(); @@ -5578,6 +5601,7 @@ struct NetworkPledgeInputs { pub network_baseline: StoragePower, pub circulating_supply: TokenAmount, pub epoch_reward: FilterEstimate, + pub ramp_duration_epochs: u64 } // Note: probably better to push this one level down into state diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index 9acefcbbd..924e1dab7 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -75,6 +75,8 @@ pub const TERMINATION_LIFETIME_CAP: ChainEpoch = 140; // Multiplier of whole per-winner rewards for a consensus fault penalty. const CONSENSUS_FAULT_FACTOR: u64 = 5; +const FIXED_POINT_FACTOR: i64 = 1000; // 3 decimal places + /// The projected block reward a sector would earn over some period. /// Also known as "BR(t)". /// BR(t) = ProjectedRewardFraction(t) * SectorQualityAdjustedPower @@ -255,6 +257,7 @@ pub fn initial_pledge_for_power( reward_estimate: &FilterEstimate, network_qa_power_estimate: &FilterEstimate, circulating_supply: &TokenAmount, + epochs_since_ramp_start: i64, ) -> TokenAmount { let ip_base = expected_reward_for_power_clamped_at_atto_fil( reward_estimate, @@ -267,10 +270,30 @@ pub fn initial_pledge_for_power( let lock_target_denom = LOCK_TARGET_FACTOR_DENOM; let pledge_share_num = qa_power; let network_qa_power = network_qa_power_estimate.estimate(); - let pledge_share_denom = cmp::max(cmp::max(&network_qa_power, baseline_power), qa_power); + + // Compute gamma based on current_epoch + let mut gamma = FIXED_POINT_FACTOR; // Initialize as 1000 + if epochs_since_ramp_start > 0 { + if epochs_since_ramp_start as u64 < RAMP_DURATION_EPOCHS { + let reduction = (300 * FIXED_POINT_FACTOR) / RAMP_DURATION_EPOCHS; // 0.3 as fixed-point + gamma -= reduction; + } else { + gamma = 700; // 0.7 as fixed-point + } + } + let additional_ip_num = lock_target_num * pledge_share_num; - let additional_ip_denom = pledge_share_denom * lock_target_denom; - let additional_ip = additional_ip_num.div_floor(&additional_ip_denom); + + let pledge_share_denom_baseline = cmp::max(cmp::max(&network_qa_power, baseline_power), qa_power); + let pledge_share_denom_simple = cmp::max(network_qa_power, qa_power); + + let additional_ip_denom_baseline = pledge_share_denom_baseline * lock_target_denom; + let additional_ip_baseline = additional_ip_num.div_floor(&additional_ip_denom_baseline); + let additional_ip_denom_simple = pledge_share_denom_simple * lock_target_denom; + let additional_ip_simple = additional_ip_num.div_floor(&additional_ip_denom_simple); + + // convex combination of simple and baseline pledge + let additional_ip = (additional_ip_baseline * gamma + additional_ip_simple * (FIXED_POINT_FACTOR - gamma)) / FIXED_POINT_FACTOR; let nominal_pledge = ip_base + TokenAmount::from_atto(additional_ip); let pledge_cap = TokenAmount::from_atto(INITIAL_PLEDGE_MAX_PER_BYTE.atto() * qa_power); diff --git a/actors/power/src/lib.rs b/actors/power/src/lib.rs index 45bc352e2..9504d5b85 100644 --- a/actors/power/src/lib.rs +++ b/actors/power/src/lib.rs @@ -316,6 +316,13 @@ impl Actor { Ok(MinerConsensusCountReturn { miner_consensus_count: st.miner_above_min_power_count }) } + fn ramp_duration(rt: &impl Runtime) -> Result { + rt.validate_immediate_caller_accept_any()?; + let st: State = rt.state()?; + + Ok(st.ramp_duration_epochs) + } + fn process_deferred_cron_events( rt: &impl Runtime, rewret: ThisEpochRewardReturn, @@ -438,5 +445,6 @@ impl ActorCode for Actor { MinerRawPowerExported => miner_raw_power, MinerCountExported => miner_count, MinerConsensusCountExported => miner_consensus_count, + RampDurationExported => ramp_duration, } } diff --git a/actors/power/src/state.rs b/actors/power/src/state.rs index a30fa6760..ebed3d0d5 100644 --- a/actors/power/src/state.rs +++ b/actors/power/src/state.rs @@ -44,6 +44,8 @@ pub const CRON_QUEUE_AMT_BITWIDTH: u32 = 6; pub type ClaimsMap = Map2; pub const CLAIMS_CONFIG: Config = DEFAULT_HAMT_CONFIG; +const RAMP_DURATION_EPOCHS: u64 = 365 * 2880; // 1Y + /// Storage power actor state #[derive(Default, Serialize_tuple, Deserialize_tuple, Clone, Debug)] pub struct State { @@ -68,6 +70,8 @@ pub struct State { /// Number of miners having proven the minimum consensus power. pub miner_above_min_power_count: i64, + pub ramp_duration_epochs: u64, + /// A queue of events to be triggered by cron, indexed by epoch. pub cron_event_queue: Cid, // Multimap, (HAMT[ChainEpoch]AMT[CronEvent] From 6da9f6a5cbd5f65152aa19a60a3d0280672a963f Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Mon, 24 Jun 2024 16:56:17 -0700 Subject: [PATCH 02/23] moving ramp duration to be returned by call to total_power rather than a separate function --- actors/miner/src/ext.rs | 7 +------ actors/miner/src/lib.rs | 24 +++--------------------- actors/power/src/lib.rs | 9 +-------- 3 files changed, 5 insertions(+), 35 deletions(-) diff --git a/actors/miner/src/ext.rs b/actors/miner/src/ext.rs index 40420feb3..f02e99a22 100644 --- a/actors/miner/src/ext.rs +++ b/actors/miner/src/ext.rs @@ -92,7 +92,6 @@ pub mod power { pub const UPDATE_PLEDGE_TOTAL_METHOD: u64 = 6; pub const SUBMIT_POREP_FOR_BULK_VERIFY_METHOD: u64 = 8; pub const CURRENT_TOTAL_POWER_METHOD: u64 = 9; - pub const MINER_RAMP_PARAMS_METHOD: u64 = 10; // TODO: how to set this value properly?? #[derive(Serialize_tuple, Deserialize_tuple)] pub struct CurrentTotalPowerReturn { @@ -102,6 +101,7 @@ pub mod power { pub quality_adj_power: StoragePower, pub pledge_collateral: TokenAmount, pub quality_adj_power_smoothed: FilterEstimate, + pub ramp_duration_epochs: u64 } #[derive(Serialize_tuple, Deserialize_tuple)] pub struct EnrollCronEventParams { @@ -117,11 +117,6 @@ pub mod power { pub quality_adjusted_delta: StoragePower, } - #[derive(Serialize_tuple, Deserialize_tuple)] - pub struct MinerRampParamsReturn { - pub ramp_duration_epochs: u64 - } - pub const MAX_MINER_PROVE_COMMITS_PER_EPOCH: usize = 200; } diff --git a/actors/miner/src/lib.rs b/actors/miner/src/lib.rs index e50b56f93..c16b6903c 100644 --- a/actors/miner/src/lib.rs +++ b/actors/miner/src/lib.rs @@ -811,13 +811,12 @@ impl Actor { let rew = request_current_epoch_block_reward(rt)?; let pwr = request_current_total_power(rt)?; let circulating_supply = rt.total_fil_circ_supply(); - let ramp_duration_epochs = request_miner_ramp_params(rt)?.ramp_duration_epochs; let pledge_inputs = NetworkPledgeInputs { network_qap: pwr.quality_adj_power_smoothed, network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - ramp_duration_epochs: ramp_duration_epochs, + ramp_duration_epochs: pwr.ramp_duration_epochs, }; /* @@ -1910,13 +1909,12 @@ impl Actor { let rew = request_current_epoch_block_reward(rt)?; let pwr = request_current_total_power(rt)?; let circulating_supply = rt.total_fil_circ_supply(); - let ramp_duration_epochs = request_miner_ramp_params(rt)?.ramp_duration_epochs; let pledge_inputs = NetworkPledgeInputs { network_qap: pwr.quality_adj_power_smoothed, network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - ramp_duration_epochs: ramp_duration_epochs + ramp_duration_epochs: pwr.ramp_duration_epochs }; activate_new_sector_infos( rt, @@ -3901,13 +3899,12 @@ where let rew = request_current_epoch_block_reward(rt)?; let pow = request_current_total_power(rt)?; let circulating_supply = rt.total_fil_circ_supply(); - let ramp_duration_epochs = request_miner_ramp_params(rt)?.ramp_duration_epochs; let pledge_inputs = NetworkPledgeInputs { network_qap: pow.quality_adj_power_smoothed, network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - ramp_duration_epochs: ramp_duration_epochs + ramp_duration_epochs: pow.ramp_duration_epochs }; let mut power_delta = PowerPair::zero(); let mut pledge_delta = TokenAmount::zero(); @@ -4863,21 +4860,6 @@ fn request_current_total_power( ) } -/// Request the ramp duration from the power actor -fn request_miner_ramp_params( - rt: &impl Runtime, -) -> Result { - deserialize_block( - extract_send_result(rt.send_simple( - &STORAGE_POWER_ACTOR_ADDR, - ext::power::MINER_RAMP_PARAMS_METHOD, - Default::default(), - TokenAmount::zero(), - )) - .map_err(|e| e.wrap("failed to check miner ramp params"))?, - ) -} - /// Resolves an address to an ID address and verifies that it is address of an account actor with an associated BLS key. /// The worker must be BLS since the worker key will be used alongside a BLS-VRF. fn resolve_worker_address(rt: &impl Runtime, raw: Address) -> Result { diff --git a/actors/power/src/lib.rs b/actors/power/src/lib.rs index 9504d5b85..27db92765 100644 --- a/actors/power/src/lib.rs +++ b/actors/power/src/lib.rs @@ -267,6 +267,7 @@ impl Actor { quality_adj_power: st.this_epoch_quality_adj_power, pledge_collateral: st.this_epoch_pledge_collateral, quality_adj_power_smoothed: st.this_epoch_qa_power_smoothed, + ramp_duration_epochs: st.ramp_duration_epochs, }) } @@ -316,13 +317,6 @@ impl Actor { Ok(MinerConsensusCountReturn { miner_consensus_count: st.miner_above_min_power_count }) } - fn ramp_duration(rt: &impl Runtime) -> Result { - rt.validate_immediate_caller_accept_any()?; - let st: State = rt.state()?; - - Ok(st.ramp_duration_epochs) - } - fn process_deferred_cron_events( rt: &impl Runtime, rewret: ThisEpochRewardReturn, @@ -445,6 +439,5 @@ impl ActorCode for Actor { MinerRawPowerExported => miner_raw_power, MinerCountExported => miner_count, MinerConsensusCountExported => miner_consensus_count, - RampDurationExported => ramp_duration, } } From e76fd96570773d3897880b327b46c87f103f29bd Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Mon, 24 Jun 2024 17:02:09 -0700 Subject: [PATCH 03/23] updated to use correct variable name --- actors/miner/src/ext.rs | 2 +- actors/miner/src/lib.rs | 9 +++++---- actors/power/src/lib.rs | 2 +- actors/power/src/state.rs | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/actors/miner/src/ext.rs b/actors/miner/src/ext.rs index f02e99a22..84c9035eb 100644 --- a/actors/miner/src/ext.rs +++ b/actors/miner/src/ext.rs @@ -101,7 +101,7 @@ pub mod power { pub quality_adj_power: StoragePower, pub pledge_collateral: TokenAmount, pub quality_adj_power_smoothed: FilterEstimate, - pub ramp_duration_epochs: u64 + pub epochs_since_ramp_start: u64 } #[derive(Serialize_tuple, Deserialize_tuple)] pub struct EnrollCronEventParams { diff --git a/actors/miner/src/lib.rs b/actors/miner/src/lib.rs index c16b6903c..d00f1d7b6 100644 --- a/actors/miner/src/lib.rs +++ b/actors/miner/src/lib.rs @@ -816,7 +816,7 @@ impl Actor { network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - ramp_duration_epochs: pwr.ramp_duration_epochs, + epochs_since_ramp_start: pwr.epochs_since_ramp_start, }; /* @@ -1914,7 +1914,7 @@ impl Actor { network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - ramp_duration_epochs: pwr.ramp_duration_epochs + epochs_since_ramp_start: pwr.epochs_since_ramp_start }; activate_new_sector_infos( rt, @@ -1983,6 +1983,7 @@ impl Actor { activate_sectors_deals(rt, &data_activations, compute_commd)?; let successful_activations = batch_return.successes(&precommited_sectors); + // TODO: total_power is not requested here, so how can we get epochs_since_ramp_start ? let pledge_inputs = NetworkPledgeInputs { network_qap: params.quality_adj_power_smoothed, network_baseline: params.reward_baseline_power, @@ -3904,7 +3905,7 @@ where network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - ramp_duration_epochs: pow.ramp_duration_epochs + epochs_since_ramp_start: pwr.epochs_since_ramp_start }; let mut power_delta = PowerPair::zero(); let mut pledge_delta = TokenAmount::zero(); @@ -5636,7 +5637,7 @@ struct NetworkPledgeInputs { pub network_baseline: StoragePower, pub circulating_supply: TokenAmount, pub epoch_reward: FilterEstimate, - pub ramp_duration_epochs: u64 + pub epochs_since_ramp_start: u64 } // Note: probably better to push this one level down into state diff --git a/actors/power/src/lib.rs b/actors/power/src/lib.rs index 27db92765..8a697332c 100644 --- a/actors/power/src/lib.rs +++ b/actors/power/src/lib.rs @@ -267,7 +267,7 @@ impl Actor { quality_adj_power: st.this_epoch_quality_adj_power, pledge_collateral: st.this_epoch_pledge_collateral, quality_adj_power_smoothed: st.this_epoch_qa_power_smoothed, - ramp_duration_epochs: st.ramp_duration_epochs, + epochs_since_ramp_start: st.epochs_since_ramp_start, }) } diff --git a/actors/power/src/state.rs b/actors/power/src/state.rs index ebed3d0d5..79959b8b0 100644 --- a/actors/power/src/state.rs +++ b/actors/power/src/state.rs @@ -70,7 +70,7 @@ pub struct State { /// Number of miners having proven the minimum consensus power. pub miner_above_min_power_count: i64, - pub ramp_duration_epochs: u64, + pub epochs_since_ramp_start: u64, /// A queue of events to be triggered by cron, indexed by epoch. pub cron_event_queue: Cid, // Multimap, (HAMT[ChainEpoch]AMT[CronEvent] From ad45428c2e3a39d39d3d12acb0353621932cbc7f Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Mon, 24 Jun 2024 17:04:33 -0700 Subject: [PATCH 04/23] changing type to i64 so that the ramp can be preplanned --- actors/miner/src/ext.rs | 2 +- actors/miner/src/lib.rs | 2 +- actors/power/src/state.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actors/miner/src/ext.rs b/actors/miner/src/ext.rs index 84c9035eb..7e33f4c1d 100644 --- a/actors/miner/src/ext.rs +++ b/actors/miner/src/ext.rs @@ -101,7 +101,7 @@ pub mod power { pub quality_adj_power: StoragePower, pub pledge_collateral: TokenAmount, pub quality_adj_power_smoothed: FilterEstimate, - pub epochs_since_ramp_start: u64 + pub epochs_since_ramp_start: i64 } #[derive(Serialize_tuple, Deserialize_tuple)] pub struct EnrollCronEventParams { diff --git a/actors/miner/src/lib.rs b/actors/miner/src/lib.rs index d00f1d7b6..da5a19dfe 100644 --- a/actors/miner/src/lib.rs +++ b/actors/miner/src/lib.rs @@ -5637,7 +5637,7 @@ struct NetworkPledgeInputs { pub network_baseline: StoragePower, pub circulating_supply: TokenAmount, pub epoch_reward: FilterEstimate, - pub epochs_since_ramp_start: u64 + pub epochs_since_ramp_start: i64 } // Note: probably better to push this one level down into state diff --git a/actors/power/src/state.rs b/actors/power/src/state.rs index 79959b8b0..2346b5161 100644 --- a/actors/power/src/state.rs +++ b/actors/power/src/state.rs @@ -70,7 +70,7 @@ pub struct State { /// Number of miners having proven the minimum consensus power. pub miner_above_min_power_count: i64, - pub epochs_since_ramp_start: u64, + pub epochs_since_ramp_start: i64, /// A queue of events to be triggered by cron, indexed by epoch. pub cron_event_queue: Cid, // Multimap, (HAMT[ChainEpoch]AMT[CronEvent] From f4f11cd24dad9ef0ba01a5f71e6626e03d57603f Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Tue, 25 Jun 2024 12:00:06 -0700 Subject: [PATCH 05/23] updated state to store epoch at which upgrade will happen, and the duration, and refactored other variables to set the correct inputs for the pledge function --- actors/miner/src/ext.rs | 3 ++- actors/miner/src/lib.rs | 16 +++++++++++----- actors/miner/src/monies.rs | 5 +++-- actors/power/src/state.rs | 5 ++--- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/actors/miner/src/ext.rs b/actors/miner/src/ext.rs index 7e33f4c1d..4b8afaf16 100644 --- a/actors/miner/src/ext.rs +++ b/actors/miner/src/ext.rs @@ -101,7 +101,8 @@ pub mod power { pub quality_adj_power: StoragePower, pub pledge_collateral: TokenAmount, pub quality_adj_power_smoothed: FilterEstimate, - pub epochs_since_ramp_start: i64 + pub epochs_since_ramp_start: i64, + pub ramp_duration_epochs: u64, } #[derive(Serialize_tuple, Deserialize_tuple)] pub struct EnrollCronEventParams { diff --git a/actors/miner/src/lib.rs b/actors/miner/src/lib.rs index da5a19dfe..d05432c27 100644 --- a/actors/miner/src/lib.rs +++ b/actors/miner/src/lib.rs @@ -816,7 +816,8 @@ impl Actor { network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - epochs_since_ramp_start: pwr.epochs_since_ramp_start, + epochs_since_ramp_start: pwr.ramp_start_epoch - rt.curr_epoch(), + ramp_duration_epochs: pwr.ramp_duration_epochs, }; /* @@ -1914,7 +1915,8 @@ impl Actor { network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - epochs_since_ramp_start: pwr.epochs_since_ramp_start + epochs_since_ramp_start: pwr.ramp_start_epoch - rt.curr_epoch(), + ramp_duration_epochs: pwr.ramp_duration_epochs, }; activate_new_sector_infos( rt, @@ -1983,12 +1985,14 @@ impl Actor { activate_sectors_deals(rt, &data_activations, compute_commd)?; let successful_activations = batch_return.successes(&precommited_sectors); - // TODO: total_power is not requested here, so how can we get epochs_since_ramp_start ? + // TODO: total_power is not requested here, so how can we get ramp_start_epoch & ramp_duration_epochs ? let pledge_inputs = NetworkPledgeInputs { network_qap: params.quality_adj_power_smoothed, network_baseline: params.reward_baseline_power, circulating_supply: rt.total_fil_circ_supply(), epoch_reward: params.reward_smoothed, + // TODO: set ramp_start_epoch + // TODO: set ramp_duration_epochs }; activate_new_sector_infos( rt, @@ -3905,7 +3909,8 @@ where network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - epochs_since_ramp_start: pwr.epochs_since_ramp_start + epochs_since_ramp_start: pwr.ramp_start_epoch - rt.curr_epoch(), + ramp_duration_epochs: pwr.ramp_duration_epochs, }; let mut power_delta = PowerPair::zero(); let mut pledge_delta = TokenAmount::zero(); @@ -5637,7 +5642,8 @@ struct NetworkPledgeInputs { pub network_baseline: StoragePower, pub circulating_supply: TokenAmount, pub epoch_reward: FilterEstimate, - pub epochs_since_ramp_start: i64 + pub epochs_since_ramp_start: i64, + pub ramp_duration_epochs: u64, } // Note: probably better to push this one level down into state diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index 924e1dab7..2fa5869ce 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -258,6 +258,7 @@ pub fn initial_pledge_for_power( network_qa_power_estimate: &FilterEstimate, circulating_supply: &TokenAmount, epochs_since_ramp_start: i64, + ramp_duration_epochs: u64 ) -> TokenAmount { let ip_base = expected_reward_for_power_clamped_at_atto_fil( reward_estimate, @@ -274,8 +275,8 @@ pub fn initial_pledge_for_power( // Compute gamma based on current_epoch let mut gamma = FIXED_POINT_FACTOR; // Initialize as 1000 if epochs_since_ramp_start > 0 { - if epochs_since_ramp_start as u64 < RAMP_DURATION_EPOCHS { - let reduction = (300 * FIXED_POINT_FACTOR) / RAMP_DURATION_EPOCHS; // 0.3 as fixed-point + if epochs_since_ramp_start as u64 < ramp_duration_epochs { + let reduction = (300 * FIXED_POINT_FACTOR) / ramp_duration_epochs; // 0.3 as fixed-point gamma -= reduction; } else { gamma = 700; // 0.7 as fixed-point diff --git a/actors/power/src/state.rs b/actors/power/src/state.rs index 2346b5161..81925961b 100644 --- a/actors/power/src/state.rs +++ b/actors/power/src/state.rs @@ -44,8 +44,6 @@ pub const CRON_QUEUE_AMT_BITWIDTH: u32 = 6; pub type ClaimsMap = Map2; pub const CLAIMS_CONFIG: Config = DEFAULT_HAMT_CONFIG; -const RAMP_DURATION_EPOCHS: u64 = 365 * 2880; // 1Y - /// Storage power actor state #[derive(Default, Serialize_tuple, Deserialize_tuple, Clone, Debug)] pub struct State { @@ -70,7 +68,8 @@ pub struct State { /// Number of miners having proven the minimum consensus power. pub miner_above_min_power_count: i64, - pub epochs_since_ramp_start: i64, + pub ramp_start_epoch: i64, + pub ramp_duration_epochs: u64, /// A queue of events to be triggered by cron, indexed by epoch. pub cron_event_queue: Cid, // Multimap, (HAMT[ChainEpoch]AMT[CronEvent] From 63b7ecd1c7cc30115eca0917713ec0c39b4d7da0 Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Wed, 26 Jun 2024 10:56:00 -0700 Subject: [PATCH 06/23] fixed syntax and type errors indicated by running make check --- actors/market/tests/harness.rs | 3 +++ actors/miner/src/ext.rs | 2 +- actors/miner/src/lib.rs | 19 ++++++++++--------- actors/miner/src/monies.rs | 6 +++--- actors/miner/tests/aggregate_prove_commit.rs | 3 +++ ...eposit_and_initial_pledge_positive_test.rs | 4 ++++ actors/miner/tests/util.rs | 7 +++++++ actors/power/src/lib.rs | 3 ++- actors/power/src/types.rs | 2 ++ 9 files changed, 35 insertions(+), 14 deletions(-) diff --git a/actors/market/tests/harness.rs b/actors/market/tests/harness.rs index 1de246da2..421ead8f8 100644 --- a/actors/market/tests/harness.rs +++ b/actors/market/tests/harness.rs @@ -1150,6 +1150,9 @@ pub fn expect_query_network_info(rt: &MockRuntime) { quality_adj_power: power.clone(), pledge_collateral: TokenAmount::default(), quality_adj_power_smoothed: FilterEstimate::new(reward.atto().clone(), BigInt::zero()), + // TODO: flagging that this was set to zero, but this wouldn't be the actual return from the function + ramp_start_epoch: 0, + ramp_duration_epochs: 0, }; let current_reward = ThisEpochRewardReturn { this_epoch_baseline_power: power, diff --git a/actors/miner/src/ext.rs b/actors/miner/src/ext.rs index 4b8afaf16..2f62e4274 100644 --- a/actors/miner/src/ext.rs +++ b/actors/miner/src/ext.rs @@ -101,7 +101,7 @@ pub mod power { pub quality_adj_power: StoragePower, pub pledge_collateral: TokenAmount, pub quality_adj_power_smoothed: FilterEstimate, - pub epochs_since_ramp_start: i64, + pub ramp_start_epoch: i64, pub ramp_duration_epochs: u64, } #[derive(Serialize_tuple, Deserialize_tuple)] diff --git a/actors/miner/src/lib.rs b/actors/miner/src/lib.rs index d05432c27..4589e64f7 100644 --- a/actors/miner/src/lib.rs +++ b/actors/miner/src/lib.rs @@ -816,7 +816,7 @@ impl Actor { network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - epochs_since_ramp_start: pwr.ramp_start_epoch - rt.curr_epoch(), + epochs_since_ramp_start: rt.curr_epoch() - pwr.ramp_start_epoch, ramp_duration_epochs: pwr.ramp_duration_epochs, }; @@ -1915,7 +1915,7 @@ impl Actor { network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - epochs_since_ramp_start: pwr.ramp_start_epoch - rt.curr_epoch(), + epochs_since_ramp_start: rt.curr_epoch() - pwr.ramp_start_epoch, ramp_duration_epochs: pwr.ramp_duration_epochs, }; activate_new_sector_infos( @@ -1985,14 +1985,13 @@ impl Actor { activate_sectors_deals(rt, &data_activations, compute_commd)?; let successful_activations = batch_return.successes(&precommited_sectors); - // TODO: total_power is not requested here, so how can we get ramp_start_epoch & ramp_duration_epochs ? let pledge_inputs = NetworkPledgeInputs { network_qap: params.quality_adj_power_smoothed, network_baseline: params.reward_baseline_power, circulating_supply: rt.total_fil_circ_supply(), epoch_reward: params.reward_smoothed, - // TODO: set ramp_start_epoch - // TODO: set ramp_duration_epochs + epochs_since_ramp_start: 0, + ramp_duration_epochs: 0, }; activate_new_sector_infos( rt, @@ -3909,8 +3908,8 @@ where network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, - epochs_since_ramp_start: pwr.ramp_start_epoch - rt.curr_epoch(), - ramp_duration_epochs: pwr.ramp_duration_epochs, + epochs_since_ramp_start: rt.curr_epoch() - pow.ramp_start_epoch, + ramp_duration_epochs: pow.ramp_duration_epochs, }; let mut power_delta = PowerPair::zero(); let mut pledge_delta = TokenAmount::zero(); @@ -4107,7 +4106,8 @@ fn update_existing_sector_info( &pledge_inputs.epoch_reward, &pledge_inputs.network_qap, &pledge_inputs.circulating_supply, - &pledge_inputs.ramp_duration_epochs, + pledge_inputs.epochs_since_ramp_start, + pledge_inputs.ramp_duration_epochs, ), ); new_sector_info @@ -5229,7 +5229,8 @@ fn activate_new_sector_infos( &pledge_inputs.epoch_reward, &pledge_inputs.network_qap, &pledge_inputs.circulating_supply, - &pledge_inputs.ramp_duration_epochs, + pledge_inputs.epochs_since_ramp_start, + pledge_inputs.ramp_duration_epochs, ); deposit_to_unlock += pci.pre_commit_deposit.clone(); diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index 2fa5869ce..908e4ee37 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -75,7 +75,7 @@ pub const TERMINATION_LIFETIME_CAP: ChainEpoch = 140; // Multiplier of whole per-winner rewards for a consensus fault penalty. const CONSENSUS_FAULT_FACTOR: u64 = 5; -const FIXED_POINT_FACTOR: i64 = 1000; // 3 decimal places +const FIXED_POINT_FACTOR: u64 = 1000; // 3 decimal places /// The projected block reward a sector would earn over some period. /// Also known as "BR(t)". @@ -275,7 +275,7 @@ pub fn initial_pledge_for_power( // Compute gamma based on current_epoch let mut gamma = FIXED_POINT_FACTOR; // Initialize as 1000 if epochs_since_ramp_start > 0 { - if epochs_since_ramp_start as u64 < ramp_duration_epochs { + if (epochs_since_ramp_start as u64) < ramp_duration_epochs { let reduction = (300 * FIXED_POINT_FACTOR) / ramp_duration_epochs; // 0.3 as fixed-point gamma -= reduction; } else { @@ -286,7 +286,7 @@ pub fn initial_pledge_for_power( let additional_ip_num = lock_target_num * pledge_share_num; let pledge_share_denom_baseline = cmp::max(cmp::max(&network_qa_power, baseline_power), qa_power); - let pledge_share_denom_simple = cmp::max(network_qa_power, qa_power); + let pledge_share_denom_simple = cmp::max(&network_qa_power, qa_power); let additional_ip_denom_baseline = pledge_share_denom_baseline * lock_target_denom; let additional_ip_baseline = additional_ip_num.div_floor(&additional_ip_denom_baseline); diff --git a/actors/miner/tests/aggregate_prove_commit.rs b/actors/miner/tests/aggregate_prove_commit.rs index 942eccbc9..d5fba5972 100644 --- a/actors/miner/tests/aggregate_prove_commit.rs +++ b/actors/miner/tests/aggregate_prove_commit.rs @@ -101,6 +101,9 @@ fn valid_precommits_then_aggregate_provecommit() { &actor.epoch_reward_smooth, &actor.epoch_qa_power_smooth, &rt.total_fil_circ_supply(), + // NOTE: zero inputs here preserve the original pledge functionality + 0, + 0, ); let ten_sectors_initial_pledge = BigInt::from(10i32) * expected_initial_pledge.clone(); assert_eq!(ten_sectors_initial_pledge, st.initial_pledge); diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index 15ac23e24..9e9dcdac9 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -38,6 +38,10 @@ fn initial_pledge_clamped_at_one_attofil() { &reward_estimate(), &power_estimate(), &circulating_supply(), + // NOTE: setting this to zero preserves the original pledge definition (before baseline bug fix) + // so these inputs configure the function to return the original pledge + 0, + 0 ); assert_eq!(TokenAmount::from_atto(1), initial_pledge); } diff --git a/actors/miner/tests/util.rs b/actors/miner/tests/util.rs index 7de6fe29c..2f5cc4ae3 100644 --- a/actors/miner/tests/util.rs +++ b/actors/miner/tests/util.rs @@ -731,6 +731,9 @@ impl ActorHarness { quality_adj_power: self.network_qa_power.clone(), pledge_collateral: self.network_pledge.clone(), quality_adj_power_smoothed: self.epoch_qa_power_smooth.clone(), + // TODO: maybe this is where we setup the inputs to test different values of epoch and ramp_start to test update to pledge function + ramp_start_epoch: 0, + ramp_duration_epochs: 0 }; let current_reward = ThisEpochRewardReturn { this_epoch_baseline_power: self.baseline_power.clone(), @@ -2164,6 +2167,10 @@ impl ActorHarness { &self.epoch_reward_smooth, &self.epoch_qa_power_smooth, &rt.total_fil_circ_supply(), + // TODO: zeros preserve original functionality, but we may need to update it here + // to test the new pledge function properly + 0, + 0 ) } diff --git a/actors/power/src/lib.rs b/actors/power/src/lib.rs index 8a697332c..f89944951 100644 --- a/actors/power/src/lib.rs +++ b/actors/power/src/lib.rs @@ -267,7 +267,8 @@ impl Actor { quality_adj_power: st.this_epoch_quality_adj_power, pledge_collateral: st.this_epoch_pledge_collateral, quality_adj_power_smoothed: st.this_epoch_qa_power_smoothed, - epochs_since_ramp_start: st.epochs_since_ramp_start, + ramp_start_epoch: st.ramp_start_epoch, + ramp_duration_epochs: st.ramp_duration_epochs, }) } diff --git a/actors/power/src/types.rs b/actors/power/src/types.rs index 983c64dc2..db5f9e077 100644 --- a/actors/power/src/types.rs +++ b/actors/power/src/types.rs @@ -68,6 +68,8 @@ pub struct CurrentTotalPowerReturn { pub quality_adj_power: StoragePower, pub pledge_collateral: TokenAmount, pub quality_adj_power_smoothed: FilterEstimate, + pub ramp_start_epoch: i64, + pub ramp_duration_epochs: u64, } #[derive(Serialize_tuple, Deserialize_tuple, Debug, Clone, Eq, PartialEq)] From 68255686295efeb9ecfb486db705020cac057161 Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Wed, 26 Jun 2024 11:31:27 -0700 Subject: [PATCH 07/23] fixed make check errors --- actors/miner/src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/actors/miner/src/lib.rs b/actors/miner/src/lib.rs index 53e4cad90..db360ba9a 100644 --- a/actors/miner/src/lib.rs +++ b/actors/miner/src/lib.rs @@ -2103,6 +2103,8 @@ impl Actor { network_baseline: rew.this_epoch_baseline_power, circulating_supply, epoch_reward: rew.this_epoch_reward_smoothed, + epochs_since_ramp_start: rt.curr_epoch() - pwr.ramp_start_epoch, + ramp_duration_epochs: pwr.ramp_duration_epochs, }; let sector_day_reward = expected_reward_for_power( @@ -2125,6 +2127,8 @@ impl Actor { &pledge_inputs.epoch_reward, &pledge_inputs.network_qap, &pledge_inputs.circulating_supply, + pledge_inputs.epochs_since_ramp_start, + pledge_inputs.ramp_duration_epochs, ); let sectors_to_add = valid_sectors From 2d245cab55fb55ee924f05838a3fbfd92c0c595b Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Tue, 2 Jul 2024 08:05:14 -0700 Subject: [PATCH 08/23] fixing rustfmt errors --- .../precommit_deposit_and_initial_pledge_positive_test.rs | 2 +- actors/miner/tests/util.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index 9e9dcdac9..dd2e77e21 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -41,7 +41,7 @@ fn initial_pledge_clamped_at_one_attofil() { // NOTE: setting this to zero preserves the original pledge definition (before baseline bug fix) // so these inputs configure the function to return the original pledge 0, - 0 + 0, ); assert_eq!(TokenAmount::from_atto(1), initial_pledge); } diff --git a/actors/miner/tests/util.rs b/actors/miner/tests/util.rs index c04b78b4b..a9c24f73d 100644 --- a/actors/miner/tests/util.rs +++ b/actors/miner/tests/util.rs @@ -771,7 +771,7 @@ impl ActorHarness { quality_adj_power_smoothed: self.epoch_qa_power_smooth.clone(), // TODO: maybe this is where we setup the inputs to test different values of epoch and ramp_start to test update to pledge function ramp_start_epoch: 0, - ramp_duration_epochs: 0 + ramp_duration_epochs: 0, }; let current_reward = ThisEpochRewardReturn { this_epoch_baseline_power: self.baseline_power.clone(), @@ -2350,7 +2350,7 @@ impl ActorHarness { // TODO: zeros preserve original functionality, but we may need to update it here // to test the new pledge function properly 0, - 0 + 0, ) } From 60d63d3aaac110ad59988a4f473bc604ec435193 Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Tue, 2 Jul 2024 08:07:16 -0700 Subject: [PATCH 09/23] fixing additional rustfmt errors --- actors/miner/src/monies.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index 908e4ee37..90e15351a 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -258,7 +258,7 @@ pub fn initial_pledge_for_power( network_qa_power_estimate: &FilterEstimate, circulating_supply: &TokenAmount, epochs_since_ramp_start: i64, - ramp_duration_epochs: u64 + ramp_duration_epochs: u64, ) -> TokenAmount { let ip_base = expected_reward_for_power_clamped_at_atto_fil( reward_estimate, @@ -285,16 +285,19 @@ pub fn initial_pledge_for_power( let additional_ip_num = lock_target_num * pledge_share_num; - let pledge_share_denom_baseline = cmp::max(cmp::max(&network_qa_power, baseline_power), qa_power); + let pledge_share_denom_baseline = + cmp::max(cmp::max(&network_qa_power, baseline_power), qa_power); let pledge_share_denom_simple = cmp::max(&network_qa_power, qa_power); - + let additional_ip_denom_baseline = pledge_share_denom_baseline * lock_target_denom; let additional_ip_baseline = additional_ip_num.div_floor(&additional_ip_denom_baseline); let additional_ip_denom_simple = pledge_share_denom_simple * lock_target_denom; let additional_ip_simple = additional_ip_num.div_floor(&additional_ip_denom_simple); // convex combination of simple and baseline pledge - let additional_ip = (additional_ip_baseline * gamma + additional_ip_simple * (FIXED_POINT_FACTOR - gamma)) / FIXED_POINT_FACTOR; + let additional_ip = (additional_ip_baseline * gamma + + additional_ip_simple * (FIXED_POINT_FACTOR - gamma)) + / FIXED_POINT_FACTOR; let nominal_pledge = ip_base + TokenAmount::from_atto(additional_ip); let pledge_cap = TokenAmount::from_atto(INITIAL_PLEDGE_MAX_PER_BYTE.atto() * qa_power); From c19558ed2539bb303a105fee80faf1486702c621 Mon Sep 17 00:00:00 2001 From: Kiran Karra Date: Fri, 5 Jul 2024 09:15:45 -0700 Subject: [PATCH 10/23] fixed integration test errors --- actors/market/src/ext.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actors/market/src/ext.rs b/actors/market/src/ext.rs index 987d50682..0be8f9d85 100644 --- a/actors/market/src/ext.rs +++ b/actors/market/src/ext.rs @@ -162,5 +162,7 @@ pub mod power { pub quality_adj_power: StoragePower, pub pledge_collateral: TokenAmount, pub quality_adj_power_smoothed: FilterEstimate, + pub ramp_start_epoch: i64, + pub ramp_duration_epochs: u64, } } From a140b686e9cd004a4d3551a2f2a205d35110dafc Mon Sep 17 00:00:00 2001 From: David Himmelstrup Date: Mon, 9 Sep 2024 14:24:24 +0200 Subject: [PATCH 11/23] write three tests, fix bug in pledge calculation --- actors/miner/src/monies.rs | 19 ++++--- ...eposit_and_initial_pledge_positive_test.rs | 54 +++++++++++++++++++ 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index 90e15351a..b22e66a63 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -272,16 +272,15 @@ pub fn initial_pledge_for_power( let pledge_share_num = qa_power; let network_qa_power = network_qa_power_estimate.estimate(); - // Compute gamma based on current_epoch - let mut gamma = FIXED_POINT_FACTOR; // Initialize as 1000 - if epochs_since_ramp_start > 0 { - if (epochs_since_ramp_start as u64) < ramp_duration_epochs { - let reduction = (300 * FIXED_POINT_FACTOR) / ramp_duration_epochs; // 0.3 as fixed-point - gamma -= reduction; - } else { - gamma = 700; // 0.7 as fixed-point - } - } + // Once FIP-0081 has fully activated, additional pledge will be 70% baseline + // pledge + 30% simple pledge. + const FIP_0081_ACTIVATION_PERMILLE: i64 = 300; + // gamma = 1000 - 300 * (epochs_since_ramp_start / ramp_duration_epochs).max(0).min(1) + let skew = ((epochs_since_ramp_start * FIP_0081_ACTIVATION_PERMILLE) + / ramp_duration_epochs.max(1) as i64) + .max(0) + .min(FIP_0081_ACTIVATION_PERMILLE) as u64; + let gamma = FIXED_POINT_FACTOR - skew; let additional_ip_num = lock_target_num * pledge_share_num; diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index dd2e77e21..0f454ebad 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -46,6 +46,60 @@ fn initial_pledge_clamped_at_one_attofil() { assert_eq!(TokenAmount::from_atto(1), initial_pledge); } +// Pre-ramp where 'baseline power' dominates +#[test] +fn initial_pledge_pre_ramp() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 0, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge + ); +} + +// Post-ramp where 'baseline power' has reduced effect (70%). +#[test] +fn initial_pledge_on_ramp() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 50, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1725).div_floor(10000), + initial_pledge + ); +} + +// Post-ramp where 'baseline power' has reduced effect (70%). +#[test] +fn initial_pledge_post_ramp() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 500, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); +} + #[test] fn precommit_deposit_is_clamped_at_one_attofil() { let precommit_deposit = From 22cc3c8680b96bc666c13d6229ab134a6c5f1b13 Mon Sep 17 00:00:00 2001 From: David Himmelstrup Date: Tue, 10 Sep 2024 14:06:07 +0200 Subject: [PATCH 12/23] remove unnecessary TODO items --- actors/miner/tests/util.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/actors/miner/tests/util.rs b/actors/miner/tests/util.rs index 75b2770bc..93381e4af 100644 --- a/actors/miner/tests/util.rs +++ b/actors/miner/tests/util.rs @@ -769,7 +769,6 @@ impl ActorHarness { quality_adj_power: self.network_qa_power.clone(), pledge_collateral: self.network_pledge.clone(), quality_adj_power_smoothed: self.epoch_qa_power_smooth.clone(), - // TODO: maybe this is where we setup the inputs to test different values of epoch and ramp_start to test update to pledge function ramp_start_epoch: 0, ramp_duration_epochs: 0, }; @@ -2338,8 +2337,6 @@ impl ActorHarness { &self.epoch_reward_smooth, &self.epoch_qa_power_smooth, &rt.total_fil_circ_supply(), - // TODO: zeros preserve original functionality, but we may need to update it here - // to test the new pledge function properly 0, 0, ) From 330ef9da8d4a6c5ef2bcdcc279a70bc53b9428cc Mon Sep 17 00:00:00 2001 From: lemmih Date: Fri, 20 Sep 2024 10:11:55 +0200 Subject: [PATCH 13/23] remote yet another unnecessary TODO item --- actors/market/tests/harness.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/actors/market/tests/harness.rs b/actors/market/tests/harness.rs index 421ead8f8..b4ad54603 100644 --- a/actors/market/tests/harness.rs +++ b/actors/market/tests/harness.rs @@ -1150,7 +1150,6 @@ pub fn expect_query_network_info(rt: &MockRuntime) { quality_adj_power: power.clone(), pledge_collateral: TokenAmount::default(), quality_adj_power_smoothed: FilterEstimate::new(reward.atto().clone(), BigInt::zero()), - // TODO: flagging that this was set to zero, but this wouldn't be the actual return from the function ramp_start_epoch: 0, ramp_duration_epochs: 0, }; From 06ff09cd71de385132df6559501111b7d8b767fa Mon Sep 17 00:00:00 2001 From: lemmih Date: Fri, 20 Sep 2024 10:18:07 +0200 Subject: [PATCH 14/23] document the two new fields in power state --- actors/power/src/state.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/actors/power/src/state.rs b/actors/power/src/state.rs index 81925961b..673b077ea 100644 --- a/actors/power/src/state.rs +++ b/actors/power/src/state.rs @@ -68,7 +68,13 @@ pub struct State { /// Number of miners having proven the minimum consensus power. pub miner_above_min_power_count: i64, + /// FIP0081 changed pledge calculations, moving from ruleset A to ruleset B. + /// This change is spread over several epochs to avoid sharp jumps in pledge + /// amounts. At `ramp_start_epoch`, we use the old ruleset. At + /// `ramp_start_epoch + ramp_duration_epochs`, we use 70% old rules + 30% + /// new rules. See FIP0081 for more details. pub ramp_start_epoch: i64, + /// Number of epochs over which the new pledge calculation is ramped up. pub ramp_duration_epochs: u64, /// A queue of events to be triggered by cron, indexed by epoch. From bceeb2c4335df51bf3992fb501b9be383134c809 Mon Sep 17 00:00:00 2001 From: lemmih Date: Fri, 20 Sep 2024 10:29:16 +0200 Subject: [PATCH 15/23] test pre-ramp, test early on-ramp --- ...eposit_and_initial_pledge_positive_test.rs | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index 0f454ebad..7138e7b4b 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -46,6 +46,24 @@ fn initial_pledge_clamped_at_one_attofil() { assert_eq!(TokenAmount::from_atto(1), initial_pledge); } +// Pre-ramp where 'baseline power' dominates +#[test] +fn initial_pledge_pre_ramp_negative() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + -100, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge + ); +} + // Pre-ramp where 'baseline power' dominates #[test] fn initial_pledge_pre_ramp() { @@ -64,9 +82,9 @@ fn initial_pledge_pre_ramp() { ); } -// Post-ramp where 'baseline power' has reduced effect (70%). +// On-ramp where 'baseline power' (85%). #[test] -fn initial_pledge_on_ramp() { +fn initial_pledge_on_ramp_mid() { let initial_pledge = initial_pledge_for_power( &qa_sector_power(), &StoragePower::from(1u64 << 37), @@ -82,6 +100,24 @@ fn initial_pledge_on_ramp() { ); } +// Post-ramp where 'baseline power' has reduced effect (97%). +#[test] +fn initial_pledge_on_ramp_early() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 10, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), + initial_pledge + ); +} + // Post-ramp where 'baseline power' has reduced effect (70%). #[test] fn initial_pledge_post_ramp() { From 417f9e10aa44a8fefff6b0714d45ef21fd3bddcb Mon Sep 17 00:00:00 2001 From: lemmih Date: Fri, 20 Sep 2024 10:34:31 +0200 Subject: [PATCH 16/23] check first step on ramp --- ...deposit_and_initial_pledge_positive_test.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index 7138e7b4b..fa14e1c36 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -118,6 +118,24 @@ fn initial_pledge_on_ramp_early() { ); } +// Post-ramp, first epoch, pledge should be 97% 'baseline' + 3% simple. +#[test] +fn initial_pledge_on_ramp_step() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 1, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), + initial_pledge + ); +} + // Post-ramp where 'baseline power' has reduced effect (70%). #[test] fn initial_pledge_post_ramp() { From 37c442dd2f3b966ad18cc6c062833f5f985f7939 Mon Sep 17 00:00:00 2001 From: lemmih Date: Fri, 20 Sep 2024 10:46:08 +0200 Subject: [PATCH 17/23] use if-then-else rather than min/max --- actors/miner/src/monies.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index b22e66a63..c82607203 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -275,11 +275,19 @@ pub fn initial_pledge_for_power( // Once FIP-0081 has fully activated, additional pledge will be 70% baseline // pledge + 30% simple pledge. const FIP_0081_ACTIVATION_PERMILLE: i64 = 300; + // Gamma is the share of pledge coming from the baseline formulation, with 1-gamma coming from simple pledge. + // Gamma ranges from 1.0 before the ramp to 0.7 at the end. // gamma = 1000 - 300 * (epochs_since_ramp_start / ramp_duration_epochs).max(0).min(1) - let skew = ((epochs_since_ramp_start * FIP_0081_ACTIVATION_PERMILLE) - / ramp_duration_epochs.max(1) as i64) - .max(0) - .min(FIP_0081_ACTIVATION_PERMILLE) as u64; + let skew = if epochs_since_ramp_start < 0 { + // No skew before ramp start + 0 + } else if ramp_duration_epochs == 0 || epochs_since_ramp_start >= ramp_duration_epochs as i64 { + // 100% skew after ramp end + FIP_0081_ACTIVATION_PERMILLE as u64 + } else { + ((epochs_since_ramp_start * FIP_0081_ACTIVATION_PERMILLE) / ramp_duration_epochs as i64) + as u64 + }; let gamma = FIXED_POINT_FACTOR - skew; let additional_ip_num = lock_target_num * pledge_share_num; From 252a3585d8425d5c2c90cac27d935f3e79743dff Mon Sep 17 00:00:00 2001 From: lemmih Date: Tue, 24 Sep 2024 14:40:27 +0200 Subject: [PATCH 18/23] avoid a division when merging baseline and simple pledges --- actors/miner/src/monies.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index c82607203..33dfa3b87 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -297,14 +297,14 @@ pub fn initial_pledge_for_power( let pledge_share_denom_simple = cmp::max(&network_qa_power, qa_power); let additional_ip_denom_baseline = pledge_share_denom_baseline * lock_target_denom; - let additional_ip_baseline = additional_ip_num.div_floor(&additional_ip_denom_baseline); + let additional_ip_baseline = (gamma * &additional_ip_num) + .div_floor(&(additional_ip_denom_baseline * FIXED_POINT_FACTOR)); let additional_ip_denom_simple = pledge_share_denom_simple * lock_target_denom; - let additional_ip_simple = additional_ip_num.div_floor(&additional_ip_denom_simple); + let additional_ip_simple = ((FIXED_POINT_FACTOR - gamma) * &additional_ip_num) + .div_floor(&(additional_ip_denom_simple * FIXED_POINT_FACTOR)); // convex combination of simple and baseline pledge - let additional_ip = (additional_ip_baseline * gamma - + additional_ip_simple * (FIXED_POINT_FACTOR - gamma)) - / FIXED_POINT_FACTOR; + let additional_ip = additional_ip_baseline + additional_ip_simple; let nominal_pledge = ip_base + TokenAmount::from_atto(additional_ip); let pledge_cap = TokenAmount::from_atto(INITIAL_PLEDGE_MAX_PER_BYTE.atto() * qa_power); From 8c969b457c2a37eb5efa57c52eeedfaf8fa89610 Mon Sep 17 00:00:00 2001 From: lemmih Date: Tue, 24 Sep 2024 15:33:41 +0200 Subject: [PATCH 19/23] validate pledges 1 epoch around FIP0081 activation --- ...eposit_and_initial_pledge_positive_test.rs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index fa14e1c36..00309c506 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -136,6 +136,52 @@ fn initial_pledge_on_ramp_step() { ); } +// Validate pledges 1 epoch before and after ramp start. +#[test] +fn initial_pledge_ramp_edges() { + let initial_pledge_before_ramp = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + -1, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge_before_ramp + ); + + let initial_pledge_at_ramp = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 0, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge_at_ramp + ); + + let initial_pledge_on_ramp = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 1, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), + initial_pledge_on_ramp + ); +} + // Post-ramp where 'baseline power' has reduced effect (70%). #[test] fn initial_pledge_post_ramp() { From e1836c06c46b9801d4e9ead5ebe74fe5b6d694b3 Mon Sep 17 00:00:00 2001 From: lemmih Date: Tue, 24 Sep 2024 15:39:59 +0200 Subject: [PATCH 20/23] rename gamme constant, reword comments --- actors/miner/src/monies.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/actors/miner/src/monies.rs b/actors/miner/src/monies.rs index 33dfa3b87..9fdef8384 100644 --- a/actors/miner/src/monies.rs +++ b/actors/miner/src/monies.rs @@ -75,7 +75,7 @@ pub const TERMINATION_LIFETIME_CAP: ChainEpoch = 140; // Multiplier of whole per-winner rewards for a consensus fault penalty. const CONSENSUS_FAULT_FACTOR: u64 = 5; -const FIXED_POINT_FACTOR: u64 = 1000; // 3 decimal places +const GAMMA_FIXED_POINT_FACTOR: u64 = 1000; // 3 decimal places /// The projected block reward a sector would earn over some period. /// Also known as "BR(t)". @@ -275,8 +275,9 @@ pub fn initial_pledge_for_power( // Once FIP-0081 has fully activated, additional pledge will be 70% baseline // pledge + 30% simple pledge. const FIP_0081_ACTIVATION_PERMILLE: i64 = 300; - // Gamma is the share of pledge coming from the baseline formulation, with 1-gamma coming from simple pledge. - // Gamma ranges from 1.0 before the ramp to 0.7 at the end. + // Gamma/GAMMA_FIXED_POINT_FACTOR is the share of pledge coming from the + // baseline formulation, with 1-(gamma/GAMMA_FIXED_POINT_FACTOR) coming from + // simple pledge. // gamma = 1000 - 300 * (epochs_since_ramp_start / ramp_duration_epochs).max(0).min(1) let skew = if epochs_since_ramp_start < 0 { // No skew before ramp start @@ -288,7 +289,7 @@ pub fn initial_pledge_for_power( ((epochs_since_ramp_start * FIP_0081_ACTIVATION_PERMILLE) / ramp_duration_epochs as i64) as u64 }; - let gamma = FIXED_POINT_FACTOR - skew; + let gamma = GAMMA_FIXED_POINT_FACTOR - skew; let additional_ip_num = lock_target_num * pledge_share_num; @@ -298,10 +299,10 @@ pub fn initial_pledge_for_power( let additional_ip_denom_baseline = pledge_share_denom_baseline * lock_target_denom; let additional_ip_baseline = (gamma * &additional_ip_num) - .div_floor(&(additional_ip_denom_baseline * FIXED_POINT_FACTOR)); + .div_floor(&(additional_ip_denom_baseline * GAMMA_FIXED_POINT_FACTOR)); let additional_ip_denom_simple = pledge_share_denom_simple * lock_target_denom; - let additional_ip_simple = ((FIXED_POINT_FACTOR - gamma) * &additional_ip_num) - .div_floor(&(additional_ip_denom_simple * FIXED_POINT_FACTOR)); + let additional_ip_simple = ((GAMMA_FIXED_POINT_FACTOR - gamma) * &additional_ip_num) + .div_floor(&(additional_ip_denom_simple * GAMMA_FIXED_POINT_FACTOR)); // convex combination of simple and baseline pledge let additional_ip = additional_ip_baseline + additional_ip_simple; From 7f09f470341adb6f479bf73d4925a1a673f26e75 Mon Sep 17 00:00:00 2001 From: lemmih Date: Tue, 24 Sep 2024 15:46:23 +0200 Subject: [PATCH 21/23] test more FIP0081 cases --- ...eposit_and_initial_pledge_positive_test.rs | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index 00309c506..30143b7bd 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -64,6 +64,37 @@ fn initial_pledge_pre_ramp_negative() { ); } +#[test] +fn initial_pledge_zero_ramp_duration() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 0, + 0, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); + + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 10, + 0, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); +} + // Pre-ramp where 'baseline power' dominates #[test] fn initial_pledge_pre_ramp() { @@ -100,6 +131,24 @@ fn initial_pledge_on_ramp_mid() { ); } +// On-ramp where 'baseline power' (85%). +#[test] +fn initial_pledge_after_ramp() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &TokenAmount::from_whole(1), + 150, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); +} + // Post-ramp where 'baseline power' has reduced effect (97%). #[test] fn initial_pledge_on_ramp_early() { From 1611afe29932a3d24020ba2d36ecf7c4307e7c8a Mon Sep 17 00:00:00 2001 From: lemmih Date: Wed, 25 Sep 2024 13:38:47 +0200 Subject: [PATCH 22/23] move tests to separate file --- actors/miner/tests/fip0081_initial_pledge.rs | 232 ++++++++++++++++++ ...eposit_and_initial_pledge_positive_test.rs | 203 --------------- 2 files changed, 232 insertions(+), 203 deletions(-) create mode 100644 actors/miner/tests/fip0081_initial_pledge.rs diff --git a/actors/miner/tests/fip0081_initial_pledge.rs b/actors/miner/tests/fip0081_initial_pledge.rs new file mode 100644 index 000000000..446a3e2be --- /dev/null +++ b/actors/miner/tests/fip0081_initial_pledge.rs @@ -0,0 +1,232 @@ +use fil_actor_miner::initial_pledge_for_power; +use fil_actors_runtime::reward::FilterEstimate; +use fvm_shared::econ::TokenAmount; +use fvm_shared::sector::StoragePower; +use num_traits::zero; + +macro_rules! my_const { + ($name:ident, $ret_type:ty, $value:expr) => { + fn $name() -> $ret_type { + $value + } + }; +} + +my_const!(epoch_target_reward, TokenAmount, zero()); +my_const!(qa_sector_power, StoragePower, StoragePower::from(1u64 << 36)); +my_const!(network_qa_power, StoragePower, StoragePower::from(1u64 << 10)); +my_const!(power_rate_of_change, StoragePower, StoragePower::from(1u64 << 10)); +my_const!( + reward_estimate, + FilterEstimate, + FilterEstimate::new(epoch_target_reward().atto().clone(), zero()) +); +my_const!( + power_estimate, + FilterEstimate, + FilterEstimate::new(network_qa_power(), power_rate_of_change()) +); +my_const!(circulating_supply, TokenAmount, TokenAmount::from_whole(1)); + +// Pre-ramp where 'baseline power' dominates +#[test] +fn initial_pledge_pre_ramp_negative() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + -100, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge + ); +} + +#[test] +fn initial_pledge_zero_ramp_duration() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 0, + 0, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); + + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 10, + 0, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); +} + +// Pre-ramp where 'baseline power' dominates +#[test] +fn initial_pledge_pre_ramp() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 0, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge + ); +} + +// On-ramp where 'baseline power' (85%). +#[test] +fn initial_pledge_on_ramp_mid() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 50, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1725).div_floor(10000), + initial_pledge + ); +} + +// On-ramp where 'baseline power' (85%). +#[test] +fn initial_pledge_after_ramp() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 150, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); +} + +// Post-ramp where 'baseline power' has reduced effect (97%). +#[test] +fn initial_pledge_on_ramp_early() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 10, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), + initial_pledge + ); +} + +// Post-ramp, first epoch, pledge should be 97% 'baseline' + 3% simple. +#[test] +fn initial_pledge_on_ramp_step() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 1, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), + initial_pledge + ); +} + +// Validate pledges 1 epoch before and after ramp start. +#[test] +fn initial_pledge_ramp_edges() { + let initial_pledge_before_ramp = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + -1, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge_before_ramp + ); + + let initial_pledge_at_ramp = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 0, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), + initial_pledge_at_ramp + ); + + let initial_pledge_on_ramp = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 1, + 10, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), + initial_pledge_on_ramp + ); +} + +// Post-ramp where 'baseline power' has reduced effect (70%). +#[test] +fn initial_pledge_post_ramp() { + let initial_pledge = initial_pledge_for_power( + &qa_sector_power(), + &StoragePower::from(1u64 << 37), + &reward_estimate(), + &power_estimate(), + &circulating_supply(), + 500, + 100, + ); + assert_eq!( + TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), + initial_pledge + ); +} diff --git a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs index 30143b7bd..dd2e77e21 100644 --- a/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs +++ b/actors/miner/tests/precommit_deposit_and_initial_pledge_positive_test.rs @@ -46,209 +46,6 @@ fn initial_pledge_clamped_at_one_attofil() { assert_eq!(TokenAmount::from_atto(1), initial_pledge); } -// Pre-ramp where 'baseline power' dominates -#[test] -fn initial_pledge_pre_ramp_negative() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - -100, - 100, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), - initial_pledge - ); -} - -#[test] -fn initial_pledge_zero_ramp_duration() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 0, - 0, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), - initial_pledge - ); - - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 10, - 0, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), - initial_pledge - ); -} - -// Pre-ramp where 'baseline power' dominates -#[test] -fn initial_pledge_pre_ramp() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 0, - 100, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), - initial_pledge - ); -} - -// On-ramp where 'baseline power' (85%). -#[test] -fn initial_pledge_on_ramp_mid() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 50, - 100, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1725).div_floor(10000), - initial_pledge - ); -} - -// On-ramp where 'baseline power' (85%). -#[test] -fn initial_pledge_after_ramp() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 150, - 100, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), - initial_pledge - ); -} - -// Post-ramp where 'baseline power' has reduced effect (97%). -#[test] -fn initial_pledge_on_ramp_early() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 10, - 100, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), - initial_pledge - ); -} - -// Post-ramp, first epoch, pledge should be 97% 'baseline' + 3% simple. -#[test] -fn initial_pledge_on_ramp_step() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 1, - 10, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), - initial_pledge - ); -} - -// Validate pledges 1 epoch before and after ramp start. -#[test] -fn initial_pledge_ramp_edges() { - let initial_pledge_before_ramp = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - -1, - 10, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), - initial_pledge_before_ramp - ); - - let initial_pledge_at_ramp = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 0, - 10, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1500).div_floor(10000), - initial_pledge_at_ramp - ); - - let initial_pledge_on_ramp = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 1, - 10, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1545).div_floor(10000), - initial_pledge_on_ramp - ); -} - -// Post-ramp where 'baseline power' has reduced effect (70%). -#[test] -fn initial_pledge_post_ramp() { - let initial_pledge = initial_pledge_for_power( - &qa_sector_power(), - &StoragePower::from(1u64 << 37), - &reward_estimate(), - &power_estimate(), - &TokenAmount::from_whole(1), - 500, - 100, - ); - assert_eq!( - TokenAmount::from_atto(1) + TokenAmount::from_whole(1950).div_floor(10000), - initial_pledge - ); -} - #[test] fn precommit_deposit_is_clamped_at_one_attofil() { let precommit_deposit = From c5b2658aee21e98de135d4f5329514c66c19fa41 Mon Sep 17 00:00:00 2001 From: lemmih Date: Thu, 26 Sep 2024 12:36:43 +0200 Subject: [PATCH 23/23] correct test comments --- actors/miner/tests/fip0081_initial_pledge.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actors/miner/tests/fip0081_initial_pledge.rs b/actors/miner/tests/fip0081_initial_pledge.rs index 446a3e2be..c4c3d1d44 100644 --- a/actors/miner/tests/fip0081_initial_pledge.rs +++ b/actors/miner/tests/fip0081_initial_pledge.rs @@ -95,7 +95,7 @@ fn initial_pledge_pre_ramp() { ); } -// On-ramp where 'baseline power' (85%). +// On-ramp where 'baseline power' is at 85% and `simple power` is at 15%. #[test] fn initial_pledge_on_ramp_mid() { let initial_pledge = initial_pledge_for_power( @@ -113,7 +113,7 @@ fn initial_pledge_on_ramp_mid() { ); } -// On-ramp where 'baseline power' (85%). +// After-ramp where 'baseline power' is at 70% and `simple power` is at 30%. #[test] fn initial_pledge_after_ramp() { let initial_pledge = initial_pledge_for_power( @@ -131,7 +131,7 @@ fn initial_pledge_after_ramp() { ); } -// Post-ramp where 'baseline power' has reduced effect (97%). +// On-ramp where 'baseline power' has reduced effect (97%). #[test] fn initial_pledge_on_ramp_early() { let initial_pledge = initial_pledge_for_power( @@ -149,7 +149,7 @@ fn initial_pledge_on_ramp_early() { ); } -// Post-ramp, first epoch, pledge should be 97% 'baseline' + 3% simple. +// On-ramp, first epoch, pledge should be 97% 'baseline' + 3% simple. #[test] fn initial_pledge_on_ramp_step() { let initial_pledge = initial_pledge_for_power(