From 3a666b650d72a029c93dac2136e7c262d1c06f5e Mon Sep 17 00:00:00 2001 From: Shamil Gadelshin Date: Wed, 2 Apr 2025 19:12:58 +0400 Subject: [PATCH] Change update_moving_price() function - change the function to use FirstEmissionBlockNumber parameter instead of NetworkRegisteredAt. --- pallets/subtensor/src/staking/stake_utils.rs | 16 +++++++++++----- pallets/subtensor/src/tests/coinbase.rs | 6 +++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pallets/subtensor/src/staking/stake_utils.rs b/pallets/subtensor/src/staking/stake_utils.rs index ae07ad760a..d00c478444 100644 --- a/pallets/subtensor/src/staking/stake_utils.rs +++ b/pallets/subtensor/src/staking/stake_utils.rs @@ -58,9 +58,15 @@ impl Pallet { } } pub fn update_moving_price(netuid: u16) { - let blocks_since_registration = U96F32::saturating_from_num( - Self::get_current_block_as_u64().saturating_sub(NetworkRegisteredAt::::get(netuid)), - ); + let blocks_since_start_call = U96F32::saturating_from_num({ + // We expect FirstEmissionBlockNumber to be set earlier, and we take the block when + // `start_call` was called (first block before FirstEmissionBlockNumber). + let start_call_block = FirstEmissionBlockNumber::::get(netuid) + .unwrap_or_default() + .saturating_sub(1); + + Self::get_current_block_as_u64().saturating_sub(start_call_block) + }); // Use halving time hyperparameter. The meaning of this parameter can be best explained under // the assumption of a constant price and SubnetMovingAlpha == 0.5: It is how many blocks it @@ -68,8 +74,8 @@ impl Pallet { // by half. let halving_time = EMAPriceHalvingBlocks::::get(netuid); let current_ma_unsigned = U96F32::saturating_from_num(SubnetMovingAlpha::::get()); - let alpha: U96F32 = current_ma_unsigned.saturating_mul(blocks_since_registration.safe_div( - blocks_since_registration.saturating_add(U96F32::saturating_from_num(halving_time)), + let alpha: U96F32 = current_ma_unsigned.saturating_mul(blocks_since_start_call.safe_div( + blocks_since_start_call.saturating_add(U96F32::saturating_from_num(halving_time)), )); // Because alpha = b / (b + h), where b and h > 0, alpha < 1, so 1 - alpha > 0. // We can use unsigned type here: U96F32 diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index eaa1997556..1345f36b7d 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -190,7 +190,7 @@ fn test_coinbase_moving_prices() { SubnetAlphaIn::::insert(netuid, 1_000_000); SubnetMechanism::::insert(netuid, 1); SubnetMovingPrice::::insert(netuid, I96F32::from_num(1)); - NetworkRegisteredAt::::insert(netuid, 1); + FirstEmissionBlockNumber::::insert(netuid, 1); // Updating the moving price keeps it the same. assert_eq!( @@ -250,7 +250,7 @@ fn test_update_moving_price_initial() { // Registered recently System::set_block_number(510); - NetworkRegisteredAt::::insert(netuid, 500); + FirstEmissionBlockNumber::::insert(netuid, 500); SubtensorModule::update_moving_price(netuid); @@ -275,7 +275,7 @@ fn test_update_moving_price_after_time() { // Registered long time ago System::set_block_number(144_000_500); - NetworkRegisteredAt::::insert(netuid, 500); + FirstEmissionBlockNumber::::insert(netuid, 500); SubtensorModule::update_moving_price(netuid);