From 48036efa84d4864e138bbbf872acf58aaf882a0c Mon Sep 17 00:00:00 2001 From: Evgeny Svirsky Date: Mon, 22 Jun 2026 12:07:46 +0200 Subject: [PATCH 1/6] Follow-up for dynamic tempo - removing deprecated activity cutoff --- chain-extensions/src/mock.rs | 2 - contract-tests/src/contracts/subnet.ts | 14 ++--- contract-tests/src/subtensor.ts | 12 ++--- .../test/staking.precompile.reward.test.ts | 5 +- eco-tests/src/mock.rs | 2 - eco-tests/src/tests_taocom_indexer.rs | 2 +- pallets/admin-utils/src/benchmarking.rs | 13 ----- pallets/admin-utils/src/lib.rs | 42 --------------- pallets/admin-utils/src/tests/mock.rs | 2 - pallets/admin-utils/src/tests/mod.rs | 33 ------------ pallets/admin-utils/src/weights.rs | 39 -------------- pallets/subtensor/src/coinbase/root.rs | 1 - pallets/subtensor/src/lib.rs | 21 -------- pallets/subtensor/src/macros/config.rs | 3 -- pallets/subtensor/src/macros/errors.rs | 2 - pallets/subtensor/src/macros/events.rs | 2 - pallets/subtensor/src/macros/hooks.rs | 2 + .../migrations/migrate_delete_subnet_21.rs | 1 - .../src/migrations/migrate_delete_subnet_3.rs | 1 - .../src/migrations/migrate_dynamic_tempo.rs | 23 +++++++- .../migrate_remove_activity_cutoff.rs | 15 ++++++ pallets/subtensor/src/migrations/mod.rs | 1 + pallets/subtensor/src/subnets/subnet.rs | 7 ++- pallets/subtensor/src/tests/children.rs | 2 +- pallets/subtensor/src/tests/coinbase.rs | 6 +-- pallets/subtensor/src/tests/epoch.rs | 2 +- pallets/subtensor/src/tests/epoch_logs.rs | 5 +- pallets/subtensor/src/tests/locks.rs | 2 +- pallets/subtensor/src/tests/mechanism.rs | 4 +- pallets/subtensor/src/tests/migration.rs | 46 +++++++++++++++- pallets/subtensor/src/tests/mock.rs | 2 - pallets/subtensor/src/tests/mock_high_ed.rs | 2 - pallets/subtensor/src/tests/networks.rs | 4 +- pallets/subtensor/src/tests/staking.rs | 2 +- pallets/subtensor/src/utils/misc.rs | 8 --- pallets/transaction-fee/src/tests/mock.rs | 2 - precompiles/src/mock.rs | 2 - precompiles/src/solidity/subnet.abi | 37 ------------- precompiles/src/solidity/subnet.sol | 7 --- precompiles/src/subnet.rs | 53 ------------------- runtime/src/lib.rs | 4 +- 41 files changed, 122 insertions(+), 313 deletions(-) create mode 100644 pallets/subtensor/src/migrations/migrate_remove_activity_cutoff.rs diff --git a/chain-extensions/src/mock.rs b/chain-extensions/src/mock.rs index db25a9df68..709f5a5ebc 100644 --- a/chain-extensions/src/mock.rs +++ b/chain-extensions/src/mock.rs @@ -322,7 +322,6 @@ parameter_types! { pub const InitialMaxAllowedValidators: u16 = 100; pub const InitialIssuance: u64 = 0; pub const InitialDifficulty: u64 = 10000; - pub const InitialActivityCutoff: u16 = 5000; pub const InitialAdjustmentInterval: u16 = 100; pub const InitialAdjustmentAlpha: u64 = 0; // no weight to previous value. pub const InitialMaxRegistrationsPerBlock: u16 = 3; @@ -380,7 +379,6 @@ impl pallet_subtensor::Config for Test { type InitialValidatorPruneLen = InitialValidatorPruneLen; type InitialScalingLawPower = InitialScalingLawPower; type InitialImmunityPeriod = InitialImmunityPeriod; - type InitialActivityCutoff = InitialActivityCutoff; type InitialMaxRegistrationsPerBlock = InitialMaxRegistrationsPerBlock; type InitialPruningScore = InitialPruningScore; type InitialBondsMovingAverage = InitialBondsMovingAverage; diff --git a/contract-tests/src/contracts/subnet.ts b/contract-tests/src/contracts/subnet.ts index dd058dafe4..4e26275884 100644 --- a/contract-tests/src/contracts/subnet.ts +++ b/contract-tests/src/contracts/subnet.ts @@ -375,12 +375,12 @@ export const ISubnetABI = [ type: "uint16", }, { - internalType: "uint16", - name: "activityCutoff", - type: "uint16", + internalType: "uint32", + name: "factorMilli", + type: "uint32", }, ], - name: "setActivityCutoff", + name: "setActivityCutoffFactor", outputs: [], stateMutability: "payable", type: "function", @@ -393,12 +393,12 @@ export const ISubnetABI = [ type: "uint16", }, ], - name: "getActivityCutoff", + name: "getActivityCutoffFactor", outputs: [ { - internalType: "uint16", + internalType: "uint32", name: "", - type: "uint16", + type: "uint32", }, ], stateMutability: "view", diff --git a/contract-tests/src/subtensor.ts b/contract-tests/src/subtensor.ts index 478148909d..09f5e9e049 100644 --- a/contract-tests/src/subtensor.ts +++ b/contract-tests/src/subtensor.ts @@ -221,22 +221,22 @@ export async function setSubnetOwnerCut(api: TypedApi, subnetOwne assert.equal(subnetOwnerCut, await api.query.SubtensorModule.SubnetOwnerCut.getValue()) } -export async function setActivityCutoff(api: TypedApi, netuid: number, activityCutoff: number) { - const value = await api.query.SubtensorModule.ActivityCutoff.getValue(netuid) - if (value === activityCutoff) { +export async function setActivityCutoffFactor(api: TypedApi, netuid: number, factorMilli: number) { + const value = await api.query.SubtensorModule.ActivityCutoffFactorMilli.getValue(netuid) + if (value === factorMilli) { return; } const alice = getAliceSigner() - const internalCall = api.tx.AdminUtils.sudo_set_activity_cutoff({ + const internalCall = api.tx.SubtensorModule.set_activity_cutoff_factor({ netuid: netuid, - activity_cutoff: activityCutoff + factor_milli: factorMilli }) const tx = api.tx.Sudo.sudo({ call: internalCall.decodedCall }) await waitForTransactionWithRetry(api, tx, alice) - assert.equal(activityCutoff, await api.query.SubtensorModule.ActivityCutoff.getValue(netuid)) + assert.equal(factorMilli, await api.query.SubtensorModule.ActivityCutoffFactorMilli.getValue(netuid)) } export async function setMinDelegateTake(api: TypedApi, minDelegateTake: number) { diff --git a/contract-tests/test/staking.precompile.reward.test.ts b/contract-tests/test/staking.precompile.reward.test.ts index 31e15c6225..44dec5ef91 100644 --- a/contract-tests/test/staking.precompile.reward.test.ts +++ b/contract-tests/test/staking.precompile.reward.test.ts @@ -7,7 +7,7 @@ import { tao } from "../src/balance-math" import { forceSetBalanceToSs58Address, addNewSubnetwork, burnedRegister, setTxRateLimit, setTempo, setWeightsSetRateLimit, setSubnetOwnerCut, - setMinDelegateTake, setActivityCutoff, addStake, setWeight, rootRegister, + setMinDelegateTake, setActivityCutoffFactor, addStake, setWeight, rootRegister, startCall, disableAdminFreezeWindowAndOwnerHyperparamRateLimit, getStake @@ -52,7 +52,8 @@ describe("Test neuron precompile reward", () => { await burnedRegister(api, netuid, convertPublicKeyToSs58(miner.publicKey), coldkey) await burnedRegister(api, netuid, convertPublicKeyToSs58(nominator.publicKey), coldkey) await setSubnetOwnerCut(api, 0) - await setActivityCutoff(api, netuid, 65535) + // 50_000 = MAX_ACTIVITY_CUTOFF_FACTOR_MILLI (50 tempos of blocks); keeps all stake active. + await setActivityCutoffFactor(api, netuid, 50000) await setMinDelegateTake(api, 0) }) diff --git a/eco-tests/src/mock.rs b/eco-tests/src/mock.rs index d605f47a65..5028474517 100644 --- a/eco-tests/src/mock.rs +++ b/eco-tests/src/mock.rs @@ -210,7 +210,6 @@ parameter_types! { pub const InitialMaxAllowedValidators: u16 = 100; pub const InitialIssuance: u64 = 0; pub const InitialDifficulty: u64 = 10000; - pub const InitialActivityCutoff: u16 = 5000; pub const InitialAdjustmentInterval: u16 = 100; pub const InitialAdjustmentAlpha: u64 = 0; // no weight to previous value. pub const InitialMaxRegistrationsPerBlock: u16 = 3; @@ -268,7 +267,6 @@ impl pallet_subtensor::Config for Test { type InitialValidatorPruneLen = InitialValidatorPruneLen; type InitialScalingLawPower = InitialScalingLawPower; type InitialImmunityPeriod = InitialImmunityPeriod; - type InitialActivityCutoff = InitialActivityCutoff; type InitialMaxRegistrationsPerBlock = InitialMaxRegistrationsPerBlock; type InitialPruningScore = InitialPruningScore; type InitialBondsMovingAverage = InitialBondsMovingAverage; diff --git a/eco-tests/src/tests_taocom_indexer.rs b/eco-tests/src/tests_taocom_indexer.rs index d79e05f9b2..010cfec232 100644 --- a/eco-tests/src/tests_taocom_indexer.rs +++ b/eco-tests/src/tests_taocom_indexer.rs @@ -131,7 +131,7 @@ fn indexer_subnet_hyperparams() { let _: u64 = WeightsVersionKey::::get(netuid); let _: u64 = WeightsSetRateLimit::::get(netuid); let _: u16 = AdjustmentInterval::::get(netuid); - let _: u16 = ActivityCutoff::::get(netuid); + let _: u32 = ActivityCutoffFactorMilli::::get(netuid); let _: bool = NetworkRegistrationAllowed::::get(netuid); let _: u16 = TargetRegistrationsPerInterval::::get(netuid); let _: TaoBalance = MinBurn::::get(netuid); diff --git a/pallets/admin-utils/src/benchmarking.rs b/pallets/admin-utils/src/benchmarking.rs index d1a373d791..d48f223c54 100644 --- a/pallets/admin-utils/src/benchmarking.rs +++ b/pallets/admin-utils/src/benchmarking.rs @@ -204,19 +204,6 @@ mod benchmarks { _(RawOrigin::Root, 1u16.into()/*netuid*/, 300u16/*target_registrations*/)/*sudo_set_target_registrations_per_interval*/; } - #[benchmark] - fn sudo_set_activity_cutoff() { - // disable admin freeze window - pallet_subtensor::Pallet::::set_admin_freeze_window(0); - pallet_subtensor::Pallet::::init_new_network( - 1u16.into(), /*netuid*/ - 1u16, /*tempo*/ - ); - - #[extrinsic_call] - _(RawOrigin::Root, 1u16.into()/*netuid*/, 361u16/*activity_cutoff*/)/*sudo_set_activity_cutoff*/; - } - #[benchmark] fn sudo_set_rho() { // disable admin freeze window diff --git a/pallets/admin-utils/src/lib.rs b/pallets/admin-utils/src/lib.rs index 0e63a1f05a..1085a29c13 100644 --- a/pallets/admin-utils/src/lib.rs +++ b/pallets/admin-utils/src/lib.rs @@ -608,48 +608,6 @@ pub mod pallet { Ok(()) } - /// The extrinsic sets the activity cutoff for a subnet. - /// It is only callable by the root account or subnet owner. - /// The extrinsic will call the Subtensor pallet to set the activity cutoff. - // #[deprecated( - // note = "Please use set_activity_cutoff_factor instead. This extrinsic will be removed soon." - // )] - #[pallet::call_index(18)] - #[pallet::weight(::WeightInfo::sudo_set_activity_cutoff())] - pub fn sudo_set_activity_cutoff( - origin: OriginFor, - netuid: NetUid, - activity_cutoff: u16, - ) -> DispatchResult { - let maybe_owner = pallet_subtensor::Pallet::::ensure_sn_owner_or_root_with_limits( - origin, - netuid, - &[Hyperparameter::ActivityCutoff.into()], - )?; - pallet_subtensor::Pallet::::ensure_admin_window_open(netuid)?; - - ensure!( - pallet_subtensor::Pallet::::if_subnet_exist(netuid), - Error::::SubnetDoesNotExist - ); - - ensure!( - activity_cutoff >= pallet_subtensor::MinActivityCutoff::::get(), - pallet_subtensor::Error::::ActivityCutoffTooLow - ); - - pallet_subtensor::Pallet::::set_activity_cutoff(netuid, activity_cutoff); - log::debug!( - "ActivityCutoffSet( netuid: {netuid:?} activity_cutoff: {activity_cutoff:?} ) " - ); - pallet_subtensor::Pallet::::record_owner_rl( - maybe_owner, - netuid, - &[Hyperparameter::ActivityCutoff.into()], - ); - Ok(()) - } - /// The extrinsic sets the network registration allowed for a subnet. /// It is only callable by the root account or subnet owner. /// The extrinsic will call the Subtensor pallet to set the network registration allowed. diff --git a/pallets/admin-utils/src/tests/mock.rs b/pallets/admin-utils/src/tests/mock.rs index e3b658a0a8..c826ba8e2f 100644 --- a/pallets/admin-utils/src/tests/mock.rs +++ b/pallets/admin-utils/src/tests/mock.rs @@ -132,7 +132,6 @@ parameter_types! { pub const InitialMaxAllowedValidators: u16 = 100; pub const InitialIssuance: TaoBalance = TaoBalance::new(0); pub const InitialDifficulty: u64 = 10000; - pub const InitialActivityCutoff: u16 = 5000; pub const InitialAdjustmentInterval: u16 = 100; pub const InitialAdjustmentAlpha: u64 = 0; // no weight to previous value. pub const InitialMaxRegistrationsPerBlock: u16 = 3; @@ -189,7 +188,6 @@ impl pallet_subtensor::Config for Test { type InitialValidatorPruneLen = InitialValidatorPruneLen; type InitialScalingLawPower = InitialScalingLawPower; type InitialImmunityPeriod = InitialImmunityPeriod; - type InitialActivityCutoff = InitialActivityCutoff; type InitialMaxRegistrationsPerBlock = InitialMaxRegistrationsPerBlock; type InitialPruningScore = InitialPruningScore; type InitialBondsMovingAverage = InitialBondsMovingAverage; diff --git a/pallets/admin-utils/src/tests/mod.rs b/pallets/admin-utils/src/tests/mod.rs index 735e784ad8..57886a647b 100644 --- a/pallets/admin-utils/src/tests/mod.rs +++ b/pallets/admin-utils/src/tests/mod.rs @@ -648,39 +648,6 @@ fn test_sudo_set_rho() { }); } -#[test] -fn test_sudo_set_activity_cutoff() { - new_test_ext().execute_with(|| { - let netuid = NetUid::from(1); - let to_be_set: u16 = pallet_subtensor::MinActivityCutoff::::get(); - add_network(netuid, 10); - let init_value: u16 = SubtensorModule::get_activity_cutoff(netuid); - assert_eq!( - AdminUtils::sudo_set_activity_cutoff( - <::RuntimeOrigin>::signed(U256::from(1)), - netuid, - to_be_set - ), - Err(DispatchError::BadOrigin) - ); - assert_eq!( - AdminUtils::sudo_set_activity_cutoff( - <::RuntimeOrigin>::root(), - netuid.next(), - to_be_set - ), - Err(Error::::SubnetDoesNotExist.into()) - ); - assert_eq!(SubtensorModule::get_activity_cutoff(netuid), init_value); - assert_ok!(AdminUtils::sudo_set_activity_cutoff( - <::RuntimeOrigin>::root(), - netuid, - to_be_set - )); - assert_eq!(SubtensorModule::get_activity_cutoff(netuid), to_be_set); - }); -} - #[test] fn test_sudo_set_target_registrations_per_interval() { new_test_ext().execute_with(|| { diff --git a/pallets/admin-utils/src/weights.rs b/pallets/admin-utils/src/weights.rs index c248b2eb57..86cc6015d2 100644 --- a/pallets/admin-utils/src/weights.rs +++ b/pallets/admin-utils/src/weights.rs @@ -50,7 +50,6 @@ pub trait WeightInfo { fn sudo_set_difficulty() -> Weight; fn sudo_set_adjustment_interval() -> Weight; fn sudo_set_target_registrations_per_interval() -> Weight; - fn sudo_set_activity_cutoff() -> Weight; fn sudo_set_rho() -> Weight; fn sudo_set_kappa() -> Weight; fn sudo_set_min_allowed_uids() -> Weight; @@ -321,25 +320,6 @@ impl WeightInfo for SubstrateWeight { /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::MinActivityCutoff` (r:1 w:0) - /// Proof: `SubtensorModule::MinActivityCutoff` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::ActivityCutoff` (r:0 w:1) - /// Proof: `SubtensorModule::ActivityCutoff` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn sudo_set_activity_cutoff() -> Weight { - // Proof Size summary in bytes: - // Measured: `832` - // Estimated: `4297` - // Minimum execution time: 28_202_000 picoseconds. - Weight::from_parts(29_676_000, 4297) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `SubtensorModule::Tempo` (r:1 w:0) - /// Proof: `SubtensorModule::Tempo` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::AdminFreezeWindow` (r:1 w:0) - /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) - /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::Rho` (r:0 w:1) /// Proof: `SubtensorModule::Rho` (`max_values`: None, `max_size`: None, mode: `Measured`) fn sudo_set_rho() -> Weight { @@ -1163,25 +1143,6 @@ impl WeightInfo for () { /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::MinActivityCutoff` (r:1 w:0) - /// Proof: `SubtensorModule::MinActivityCutoff` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::ActivityCutoff` (r:0 w:1) - /// Proof: `SubtensorModule::ActivityCutoff` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn sudo_set_activity_cutoff() -> Weight { - // Proof Size summary in bytes: - // Measured: `832` - // Estimated: `4297` - // Minimum execution time: 28_202_000 picoseconds. - Weight::from_parts(29_676_000, 4297) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `SubtensorModule::Tempo` (r:1 w:0) - /// Proof: `SubtensorModule::Tempo` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::AdminFreezeWindow` (r:1 w:0) - /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) - /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::Rho` (r:0 w:1) /// Proof: `SubtensorModule::Rho` (`max_values`: None, `max_size`: None, mode: `Measured`) fn sudo_set_rho() -> Weight { diff --git a/pallets/subtensor/src/coinbase/root.rs b/pallets/subtensor/src/coinbase/root.rs index d339e0ec83..8e6bc239a5 100644 --- a/pallets/subtensor/src/coinbase/root.rs +++ b/pallets/subtensor/src/coinbase/root.rs @@ -281,7 +281,6 @@ impl Pallet { Difficulty::::remove(netuid); MaxAllowedUids::::remove(netuid); ImmunityPeriod::::remove(netuid); - ActivityCutoff::::remove(netuid); ActivityCutoffFactorMilli::::remove(netuid); LastEpochBlock::::remove(netuid); PendingEpochAt::::remove(netuid); diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index bd0b4ab974..63f320e684 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -799,12 +799,6 @@ pub mod pallet { T::InitialImmunityPeriod::get() } - /// Default activity cutoff. - #[pallet::type_value] - pub fn DefaultActivityCutoff() -> u16 { - T::InitialActivityCutoff::get() - } - /// Default weights version key. #[pallet::type_value] pub fn DefaultWeightsVersionKey() -> u64 { @@ -1057,12 +1051,6 @@ pub mod pallet { U64F64::saturating_from_num(0) } - /// Default value for minimum activity cutoff - #[pallet::type_value] - pub fn DefaultMinActivityCutoff() -> u16 { - 360 - } - /// Default value for setting subnet owner hotkey rate limit #[pallet::type_value] pub fn DefaultSetSNOwnerHotkeyRateLimit() -> u64 { @@ -1111,10 +1099,6 @@ pub mod pallet { true } - #[pallet::storage] - pub type MinActivityCutoff = - StorageValue<_, u16, ValueQuery, DefaultMinActivityCutoff>; - /// Global window (in blocks) at the end of each tempo where admin ops are disallowed #[pallet::storage] pub type AdminFreezeWindow = @@ -2001,11 +1985,6 @@ pub mod pallet { pub type ImmunityPeriod = StorageMap<_, Identity, NetUid, u16, ValueQuery, DefaultImmunityPeriod>; - /// --- MAP ( netuid ) --> activity_cutoff - // #[deprecated(note = "Replaced by `ActivityCutoffFactorMilli` (per-mille of `Tempo`).")] - #[pallet::storage] - pub type ActivityCutoff = - StorageMap<_, Identity, NetUid, u16, ValueQuery, DefaultActivityCutoff>; #[pallet::type_value] /// Default maximum weights limit. pub fn DefaultMaxWeightsLimit() -> u16 { diff --git a/pallets/subtensor/src/macros/config.rs b/pallets/subtensor/src/macros/config.rs index ad372d1e0e..efa5853494 100644 --- a/pallets/subtensor/src/macros/config.rs +++ b/pallets/subtensor/src/macros/config.rs @@ -171,9 +171,6 @@ mod config { /// Immunity Period Constant. #[pallet::constant] type InitialImmunityPeriod: Get; - /// Activity constant. - #[pallet::constant] - type InitialActivityCutoff: Get; /// Initial max registrations per block. #[pallet::constant] type InitialMaxRegistrationsPerBlock: Get; diff --git a/pallets/subtensor/src/macros/errors.rs b/pallets/subtensor/src/macros/errors.rs index 7f5b119d31..1c8e505f47 100644 --- a/pallets/subtensor/src/macros/errors.rs +++ b/pallets/subtensor/src/macros/errors.rs @@ -193,8 +193,6 @@ mod errors { SlippageTooHigh, /// Subnet disallows transfer. TransferDisallowed, - /// Activity cutoff is being set too low. - ActivityCutoffTooLow, /// Call is disabled CallDisabled, /// FirstEmissionBlockNumber is already set. diff --git a/pallets/subtensor/src/macros/events.rs b/pallets/subtensor/src/macros/events.rs index adcd97e0cf..2c7bb2a8e7 100644 --- a/pallets/subtensor/src/macros/events.rs +++ b/pallets/subtensor/src/macros/events.rs @@ -61,8 +61,6 @@ mod events { RegistrationPerIntervalSet(NetUid, u16), /// we set max registrations per block. MaxRegistrationsPerBlockSet(NetUid, u16), - /// an activity cutoff is set for a subnet. - ActivityCutoffSet(NetUid, u16), /// Rho value is set. RhoSet(NetUid, u16), /// steepness of the sigmoid used to compute alpha values. diff --git a/pallets/subtensor/src/macros/hooks.rs b/pallets/subtensor/src/macros/hooks.rs index 6371f30e46..33c690d370 100644 --- a/pallets/subtensor/src/macros/hooks.rs +++ b/pallets/subtensor/src/macros/hooks.rs @@ -172,6 +172,8 @@ mod hooks { .saturating_add(migrations::migrate_reset_tnet_conviction_locks::migrate_reset_tnet_conviction_locks::()) // Seed LastEpochBlock for dynamic-tempo / owner-triggered-epochs feature .saturating_add(migrations::migrate_dynamic_tempo::migrate_dynamic_tempo::()) + // Remove the legacy ActivityCutoff / MinActivityCutoff storage now converted to ActivityCutoffFactorMilli + .saturating_add(migrations::migrate_remove_activity_cutoff::migrate_remove_activity_cutoff::()) // Populate locking reverse map. .saturating_add(migrations::migrate_populate_locking_coldkeys::migrate_populate_locking_coldkeys::()) // Capture the runtime-upgrade block for TAO-in refund cutover. diff --git a/pallets/subtensor/src/migrations/migrate_delete_subnet_21.rs b/pallets/subtensor/src/migrations/migrate_delete_subnet_21.rs index d5dadfc576..c3f9067cf0 100644 --- a/pallets/subtensor/src/migrations/migrate_delete_subnet_21.rs +++ b/pallets/subtensor/src/migrations/migrate_delete_subnet_21.rs @@ -96,7 +96,6 @@ pub fn migrate_delete_subnet_21() -> Weight { Difficulty::::remove(netuid); MaxAllowedUids::::remove(netuid); ImmunityPeriod::::remove(netuid); - ActivityCutoff::::remove(netuid); MinAllowedWeights::::remove(netuid); RegistrationsThisInterval::::remove(netuid); POWRegistrationsThisInterval::::remove(netuid); diff --git a/pallets/subtensor/src/migrations/migrate_delete_subnet_3.rs b/pallets/subtensor/src/migrations/migrate_delete_subnet_3.rs index 600bce38a9..6c13a414e3 100644 --- a/pallets/subtensor/src/migrations/migrate_delete_subnet_3.rs +++ b/pallets/subtensor/src/migrations/migrate_delete_subnet_3.rs @@ -98,7 +98,6 @@ pub fn migrate_delete_subnet_3() -> Weight { Difficulty::::remove(netuid); MaxAllowedUids::::remove(netuid); ImmunityPeriod::::remove(netuid); - ActivityCutoff::::remove(netuid); MinAllowedWeights::::remove(netuid); RegistrationsThisInterval::::remove(netuid); POWRegistrationsThisInterval::::remove(netuid); diff --git a/pallets/subtensor/src/migrations/migrate_dynamic_tempo.rs b/pallets/subtensor/src/migrations/migrate_dynamic_tempo.rs index c359b96c2f..2e57cea01f 100644 --- a/pallets/subtensor/src/migrations/migrate_dynamic_tempo.rs +++ b/pallets/subtensor/src/migrations/migrate_dynamic_tempo.rs @@ -5,6 +5,24 @@ use scale_info::prelude::string::String; use sp_core::H256; use sp_std::collections::vec_deque::VecDeque; +/// Storage alias for the legacy `ActivityCutoff` map (absolute block count). +/// +/// The typed `ActivityCutoff` storage was removed from the pallet once this +/// migration converted its values into `ActivityCutoffFactorMilli`. This migration +/// still needs to read the raw on-chain entries, so it keeps a self-contained +/// alias instead of depending on the pallet definition. `OptionQuery` is used so +/// the alias needs no custom default; the migration substitutes the historical +/// production default (`5_000`) for any subnet missing an entry — in practice +/// every existing subnet had an explicit value materialised on creation. +pub mod legacy { + use super::*; + use frame_support::pallet_prelude::{Identity, OptionQuery}; + use frame_support::storage_alias; + + #[storage_alias] + pub type ActivityCutoff = StorageMap, Identity, NetUid, u16, OptionQuery>; +} + /// One-shot migration for the dynamic-tempo / owner-triggered-epochs feature. /// /// 1. Back-fills `LastEpochBlock[netuid]` for every existing subnet so the first @@ -100,8 +118,9 @@ pub fn migrate_dynamic_tempo() -> Weight { epoch_index_seeded = epoch_index_seeded.saturating_add(1); writes = writes.saturating_add(1); - // Convert legacy absolute `ActivityCutoff` into per-mille `ActivityCutoffFactorMilli` - let old_cutoff = ActivityCutoff::::get(netuid) as u64; + // Convert legacy absolute `ActivityCutoff` into per-mille `ActivityCutoffFactorMilli`. + // Missing entries fall back to the historical production default (5_000 blocks). + let old_cutoff = legacy::ActivityCutoff::::get(netuid).unwrap_or(5_000) as u64; reads = reads.saturating_add(1); let tempo_u64 = tempo as u64; let raw_factor = old_cutoff diff --git a/pallets/subtensor/src/migrations/migrate_remove_activity_cutoff.rs b/pallets/subtensor/src/migrations/migrate_remove_activity_cutoff.rs new file mode 100644 index 0000000000..eb950715aa --- /dev/null +++ b/pallets/subtensor/src/migrations/migrate_remove_activity_cutoff.rs @@ -0,0 +1,15 @@ +use super::*; +use frame_support::weights::Weight; + +pub fn migrate_remove_activity_cutoff() -> Weight { + migrate_storage::( + "migrate_remove_activity_cutoff", + "SubtensorModule", + "ActivityCutoff", + ) + .saturating_add(migrate_storage::( + "migrate_remove_min_activity_cutoff", + "SubtensorModule", + "MinActivityCutoff", + )) +} diff --git a/pallets/subtensor/src/migrations/mod.rs b/pallets/subtensor/src/migrations/mod.rs index e846d325dc..4d8a9743c4 100644 --- a/pallets/subtensor/src/migrations/mod.rs +++ b/pallets/subtensor/src/migrations/mod.rs @@ -40,6 +40,7 @@ pub mod migrate_populate_owned_hotkeys; pub mod migrate_rao; pub mod migrate_rate_limit_keys; pub mod migrate_rate_limiting_last_blocks; +pub mod migrate_remove_activity_cutoff; pub mod migrate_remove_add_stake_burn_rate_limit; pub mod migrate_remove_commitments_rate_limit; pub mod migrate_remove_deprecated_conviction_maps; diff --git a/pallets/subtensor/src/subnets/subnet.rs b/pallets/subtensor/src/subnets/subnet.rs index 5f5fcafd61..8a20512cf1 100644 --- a/pallets/subtensor/src/subnets/subnet.rs +++ b/pallets/subtensor/src/subnets/subnet.rs @@ -333,8 +333,11 @@ impl Pallet { if !ImmunityPeriod::::contains_key(netuid) { ImmunityPeriod::::insert(netuid, ImmunityPeriod::::get(netuid)); } - if !ActivityCutoff::::contains_key(netuid) { - ActivityCutoff::::insert(netuid, ActivityCutoff::::get(netuid)); + if !ActivityCutoffFactorMilli::::contains_key(netuid) { + ActivityCutoffFactorMilli::::insert( + netuid, + ActivityCutoffFactorMilli::::get(netuid), + ); } if !MinAllowedWeights::::contains_key(netuid) { MinAllowedWeights::::insert(netuid, MinAllowedWeights::::get(netuid)); diff --git a/pallets/subtensor/src/tests/children.rs b/pallets/subtensor/src/tests/children.rs index 922fd2c894..00b72b6bd0 100644 --- a/pallets/subtensor/src/tests/children.rs +++ b/pallets/subtensor/src/tests/children.rs @@ -2961,7 +2961,7 @@ fn test_childkey_take_drain() { BlockAtRegistration::::set(netuid, 2, 1); LastUpdate::::set(NetUidStorageIndex::from(netuid), vec![2, 2, 2]); Kappa::::set(netuid, u16::MAX / 5); - ActivityCutoff::::set(netuid, u16::MAX); // makes all stake active + ActivityCutoffFactorMilli::::set(netuid, u32::MAX); // makes all stake active ValidatorPermit::::insert(netuid, vec![true, true, false]); // Run run_coinbase to hit subnet epoch diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index 4f3da7d6bb..810e8e772c 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -3175,7 +3175,7 @@ fn test_mining_emission_distribution_with_no_root_sell() { BlockAtRegistration::::set(netuid, 2, 1); LastUpdate::::set(NetUidStorageIndex::from(netuid), vec![2, 2, 2]); Kappa::::set(netuid, u16::MAX / 5); - ActivityCutoff::::set(netuid, u16::MAX); // makes all stake active + ActivityCutoffFactorMilli::::set(netuid, u32::MAX); // makes all stake active ValidatorPermit::::insert(netuid, vec![true, true, false]); // Run run_coinbase until emissions are drained @@ -3372,7 +3372,7 @@ fn test_mining_emission_distribution_with_root_sell() { BlockAtRegistration::::set(netuid, 2, 1); LastUpdate::::set(NetUidStorageIndex::from(netuid), vec![2, 2, 2]); Kappa::::set(netuid, u16::MAX / 5); - ActivityCutoff::::set(netuid, u16::MAX); // makes all stake active + ActivityCutoffFactorMilli::::set(netuid, u32::MAX); // makes all stake active ValidatorPermit::::insert(netuid, vec![true, true, false]); // Run run_coinbase until emissions are drained @@ -4036,7 +4036,7 @@ fn test_disabling_owner_cut_sends_subnet_emission_to_miners_and_validators() { BlockAtRegistration::::set(netuid, miner_uid, 1); LastUpdate::::set(NetUidStorageIndex::from(netuid), vec![2; uid_count]); Kappa::::set(netuid, u16::MAX / 5); - ActivityCutoff::::set(netuid, u16::MAX); + ActivityCutoffFactorMilli::::set(netuid, u32::MAX); let mut validator_permit = vec![false; uid_count]; validator_permit[validator_uid as usize] = true; ValidatorPermit::::insert(netuid, validator_permit); diff --git a/pallets/subtensor/src/tests/epoch.rs b/pallets/subtensor/src/tests/epoch.rs index b0383521a8..9f40fb18e0 100644 --- a/pallets/subtensor/src/tests/epoch.rs +++ b/pallets/subtensor/src/tests/epoch.rs @@ -1442,7 +1442,7 @@ fn test_active_stake() { assert_eq!(*i, I32F32::from_num(65_535)); // floor(0.5*(2^16-1))/(2^16-1), then max-upscale to 65_535 } } - let activity_cutoff: u64 = SubtensorModule::get_activity_cutoff(netuid) as u64; + let activity_cutoff: u64 = SubtensorModule::get_activity_cutoff_blocks(netuid); run_to_block_no_epoch(netuid, activity_cutoff + 2); // run to block where validator (uid 0, 1) weights become outdated // === Update uid 0 weights diff --git a/pallets/subtensor/src/tests/epoch_logs.rs b/pallets/subtensor/src/tests/epoch_logs.rs index 265add2802..6e8554e674 100644 --- a/pallets/subtensor/src/tests/epoch_logs.rs +++ b/pallets/subtensor/src/tests/epoch_logs.rs @@ -60,7 +60,10 @@ fn setup_epoch(neurons: Vec, mechanism_count: u8) { NetworksAdded::::insert(netuid, true); let network_n = neurons.len() as u16; SubnetworkN::::insert(netuid, network_n); - ActivityCutoff::::insert(netuid, ACTIVITY_CUTOFF); + ActivityCutoffFactorMilli::::insert( + netuid, + (ACTIVITY_CUTOFF as u32).saturating_mul(1_000) / TEMPO as u32, + ); Tempo::::insert(netuid, TEMPO); SubtensorModule::set_weights_set_rate_limit(netuid, 0); MechanismCountCurrent::::insert(netuid, MechId::from(mechanism_count)); diff --git a/pallets/subtensor/src/tests/locks.rs b/pallets/subtensor/src/tests/locks.rs index 4eaf01668c..7a2632a2e6 100644 --- a/pallets/subtensor/src/tests/locks.rs +++ b/pallets/subtensor/src/tests/locks.rs @@ -4058,7 +4058,7 @@ fn test_epoch_distribution_auto_locks_owner_cut() { BlockAtRegistration::::set(netuid, miner_uid, 1); LastUpdate::::set(NetUidStorageIndex::from(netuid), vec![2; uid_count]); Kappa::::set(netuid, u16::MAX / 5); - ActivityCutoff::::set(netuid, u16::MAX); + ActivityCutoffFactorMilli::::set(netuid, u32::MAX); let mut validator_permit = vec![false; uid_count]; validator_permit[validator_uid as usize] = true; ValidatorPermit::::insert(netuid, validator_permit); diff --git a/pallets/subtensor/src/tests/mechanism.rs b/pallets/subtensor/src/tests/mechanism.rs index ef51c7e8d5..324bc5a277 100644 --- a/pallets/subtensor/src/tests/mechanism.rs +++ b/pallets/subtensor/src/tests/mechanism.rs @@ -454,7 +454,7 @@ pub fn mock_epoch_state(netuid: NetUid, ck0: U256, hk0: U256, ck1: U256, hk1: U2 // Make both ACTIVE: recent updates & old registrations. Tempo::::insert(netuid, 1u16); - ActivityCutoff::::insert(netuid, u16::MAX); // large cutoff keeps them active + ActivityCutoffFactorMilli::::insert(netuid, u32::MAX); // large cutoff keeps them active LastUpdate::::insert(idx0, vec![2, 2]); LastUpdate::::insert(idx1, vec![2, 2]); BlockAtRegistration::::insert(netuid, 0, 1u64); // registered long ago @@ -1512,7 +1512,7 @@ fn epoch_mechanism_emergency_mode_distributes_by_stake() { // active + recent updates so they're all active let now = SubtensorModule::get_current_block_as_u64(); - ActivityCutoff::::insert(netuid, 1_000u16); + ActivityCutoffFactorMilli::::insert(netuid, u32::MAX); LastUpdate::::insert(idx, vec![now, now, now, now]); // All staking validators permitted => active_stake = stake diff --git a/pallets/subtensor/src/tests/migration.rs b/pallets/subtensor/src/tests/migration.rs index ec24697522..dda3f88db4 100644 --- a/pallets/subtensor/src/tests/migration.rs +++ b/pallets/subtensor/src/tests/migration.rs @@ -4896,7 +4896,9 @@ fn test_migrate_dynamic_tempo_activity_cutoff_round_trips_production_values() { for (i, &(cutoff, tempo)) in cases.iter().enumerate() { let netuid = NetUid::from((i + 1) as u16); add_network(netuid, tempo, 0); - ActivityCutoff::::insert(netuid, cutoff); + crate::migrations::migrate_dynamic_tempo::legacy::ActivityCutoff::::insert( + netuid, cutoff, + ); } crate::migrations::migrate_dynamic_tempo::migrate_dynamic_tempo::(); @@ -4934,3 +4936,45 @@ fn test_migrate_dynamic_tempo_idempotent() { ); }); } + +#[test] +fn test_migrate_remove_activity_cutoff_wipes_legacy_storage() { + use crate::migrations::migrate_dynamic_tempo::legacy; + new_test_ext(1).execute_with(|| { + // Seed legacy ActivityCutoff entries that linger after dynamic-tempo conversion. + for i in 1u16..=3 { + let netuid = NetUid::from(i); + add_network(netuid, 360, 0); + legacy::ActivityCutoff::::insert(netuid, 5_000u16 + i); + assert!(legacy::ActivityCutoff::::contains_key(netuid)); + } + + crate::migrations::migrate_remove_activity_cutoff::migrate_remove_activity_cutoff::(); + + // Every legacy entry is gone. + for i in 1u16..=3 { + let netuid = NetUid::from(i); + assert!(!legacy::ActivityCutoff::::contains_key(netuid)); + } + // Both sub-migrations are flagged as run. + assert!(HasMigrationRun::::get( + b"migrate_remove_activity_cutoff".to_vec() + )); + assert!(HasMigrationRun::::get( + b"migrate_remove_min_activity_cutoff".to_vec() + )); + }); +} + +#[test] +fn test_migrate_remove_activity_cutoff_idempotent() { + new_test_ext(1).execute_with(|| { + // Running with no legacy data present must not panic and must flag completion. + crate::migrations::migrate_remove_activity_cutoff::migrate_remove_activity_cutoff::(); + assert!(HasMigrationRun::::get( + b"migrate_remove_activity_cutoff".to_vec() + )); + // Second run is a no-op. + crate::migrations::migrate_remove_activity_cutoff::migrate_remove_activity_cutoff::(); + }); +} diff --git a/pallets/subtensor/src/tests/mock.rs b/pallets/subtensor/src/tests/mock.rs index 8a813fac8d..85dd190348 100644 --- a/pallets/subtensor/src/tests/mock.rs +++ b/pallets/subtensor/src/tests/mock.rs @@ -223,7 +223,6 @@ parameter_types! { pub const InitialMaxAllowedValidators: u16 = 100; pub const InitialIssuance: u64 = 0; pub const InitialDifficulty: u64 = 10000; - pub const InitialActivityCutoff: u16 = 5000; pub const InitialAdjustmentInterval: u16 = 100; pub const InitialAdjustmentAlpha: u64 = 0; // no weight to previous value. pub const InitialMaxRegistrationsPerBlock: u16 = 3; @@ -281,7 +280,6 @@ impl crate::Config for Test { type InitialValidatorPruneLen = InitialValidatorPruneLen; type InitialScalingLawPower = InitialScalingLawPower; type InitialImmunityPeriod = InitialImmunityPeriod; - type InitialActivityCutoff = InitialActivityCutoff; type InitialMaxRegistrationsPerBlock = InitialMaxRegistrationsPerBlock; type InitialPruningScore = InitialPruningScore; type InitialBondsMovingAverage = InitialBondsMovingAverage; diff --git a/pallets/subtensor/src/tests/mock_high_ed.rs b/pallets/subtensor/src/tests/mock_high_ed.rs index ac20b4131a..8da814046e 100644 --- a/pallets/subtensor/src/tests/mock_high_ed.rs +++ b/pallets/subtensor/src/tests/mock_high_ed.rs @@ -183,7 +183,6 @@ parameter_types! { pub const InitialMaxAllowedValidators: u16 = 100; pub const InitialIssuance: u64 = 0; pub const InitialDifficulty: u64 = 10000; - pub const InitialActivityCutoff: u16 = 5000; pub const InitialAdjustmentInterval: u16 = 100; pub const InitialAdjustmentAlpha: u64 = 0; // no weight to previous value. pub const InitialMaxRegistrationsPerBlock: u16 = 3; @@ -241,7 +240,6 @@ impl crate::Config for Test { type InitialValidatorPruneLen = InitialValidatorPruneLen; type InitialScalingLawPower = InitialScalingLawPower; type InitialImmunityPeriod = InitialImmunityPeriod; - type InitialActivityCutoff = InitialActivityCutoff; type InitialMaxRegistrationsPerBlock = InitialMaxRegistrationsPerBlock; type InitialPruningScore = InitialPruningScore; type InitialBondsMovingAverage = InitialBondsMovingAverage; diff --git a/pallets/subtensor/src/tests/networks.rs b/pallets/subtensor/src/tests/networks.rs index 4696507e2e..d0772588f6 100644 --- a/pallets/subtensor/src/tests/networks.rs +++ b/pallets/subtensor/src/tests/networks.rs @@ -357,7 +357,7 @@ fn dissolve_clears_all_per_subnet_storages() { MaxAllowedUids::::insert(net, 1u16); ImmunityPeriod::::insert(net, 1u16); - ActivityCutoff::::insert(net, 1u16); + ActivityCutoffFactorMilli::::insert(net, 1_000u32); MinAllowedWeights::::insert(net, 1u16); RegistrationsThisInterval::::insert(net, 1u16); @@ -508,7 +508,7 @@ fn dissolve_clears_all_per_subnet_storages() { assert!(!MaxAllowedUids::::contains_key(net)); assert!(!ImmunityPeriod::::contains_key(net)); - assert!(!ActivityCutoff::::contains_key(net)); + assert!(!ActivityCutoffFactorMilli::::contains_key(net)); assert!(!MinAllowedWeights::::contains_key(net)); assert!(!RegistrationsThisInterval::::contains_key(net)); diff --git a/pallets/subtensor/src/tests/staking.rs b/pallets/subtensor/src/tests/staking.rs index 660b6957d7..1e0a6431e6 100644 --- a/pallets/subtensor/src/tests/staking.rs +++ b/pallets/subtensor/src/tests/staking.rs @@ -2466,7 +2466,7 @@ fn test_mining_emission_distribution_validator_valiminer_miner() { BlockAtRegistration::::set(netuid, 2, 1); LastUpdate::::set(NetUidStorageIndex::from(netuid), vec![2, 2, 2]); Kappa::::set(netuid, u16::MAX / 5); - ActivityCutoff::::set(netuid, u16::MAX); // makes all stake active + ActivityCutoffFactorMilli::::set(netuid, u32::MAX); // makes all stake active ValidatorPermit::::insert(netuid, vec![true, true, false]); // Run run_coinbase until emissions are drained diff --git a/pallets/subtensor/src/utils/misc.rs b/pallets/subtensor/src/utils/misc.rs index 7e62e4c7ec..f4030ad752 100644 --- a/pallets/subtensor/src/utils/misc.rs +++ b/pallets/subtensor/src/utils/misc.rs @@ -601,14 +601,6 @@ impl Pallet { Rho::::insert(netuid, rho); } - pub fn get_activity_cutoff(netuid: NetUid) -> u16 { - ActivityCutoff::::get(netuid) - } - pub fn set_activity_cutoff(netuid: NetUid, activity_cutoff: u16) { - ActivityCutoff::::insert(netuid, activity_cutoff); - Self::deposit_event(Event::ActivityCutoffSet(netuid, activity_cutoff)); - } - /// Effective activity cutoff in blocks, derived from `ActivityCutoffFactorMilli` and `Tempo`. /// `cutoff_blocks = (factor × tempo) / 1000`, clamped to ≥ 1. pub fn get_activity_cutoff_blocks(netuid: NetUid) -> u64 { diff --git a/pallets/transaction-fee/src/tests/mock.rs b/pallets/transaction-fee/src/tests/mock.rs index 7d8508c5c0..a83ca051d5 100644 --- a/pallets/transaction-fee/src/tests/mock.rs +++ b/pallets/transaction-fee/src/tests/mock.rs @@ -202,7 +202,6 @@ parameter_types! { pub const InitialMaxAllowedValidators: u16 = 100; pub const InitialIssuance: TaoBalance = TaoBalance::new(0); pub const InitialDifficulty: u64 = 10000; - pub const InitialActivityCutoff: u16 = 5000; pub const InitialAdjustmentInterval: u16 = 100; pub const InitialAdjustmentAlpha: u64 = 0; // no weight to previous value. pub const InitialMaxRegistrationsPerBlock: u16 = 3; @@ -259,7 +258,6 @@ impl pallet_subtensor::Config for Test { type InitialValidatorPruneLen = InitialValidatorPruneLen; type InitialScalingLawPower = InitialScalingLawPower; type InitialImmunityPeriod = InitialImmunityPeriod; - type InitialActivityCutoff = InitialActivityCutoff; type InitialMaxRegistrationsPerBlock = InitialMaxRegistrationsPerBlock; type InitialPruningScore = InitialPruningScore; type InitialBondsMovingAverage = InitialBondsMovingAverage; diff --git a/precompiles/src/mock.rs b/precompiles/src/mock.rs index ed8e407f88..33ae5defdd 100644 --- a/precompiles/src/mock.rs +++ b/precompiles/src/mock.rs @@ -125,7 +125,6 @@ parameter_types! { pub const InitialMaxAllowedValidators: u16 = 100; pub const InitialIssuance: TaoBalance = TaoBalance::new(0); pub const InitialDifficulty: u64 = 10_000; - pub const InitialActivityCutoff: u16 = 5_000; pub const InitialAdjustmentInterval: u16 = 100; pub const InitialAdjustmentAlpha: u64 = 0; pub const InitialMaxRegistrationsPerBlock: u16 = 3; @@ -423,7 +422,6 @@ impl pallet_subtensor::Config for Runtime { type InitialValidatorPruneLen = InitialValidatorPruneLen; type InitialScalingLawPower = InitialScalingLawPower; type InitialImmunityPeriod = InitialImmunityPeriod; - type InitialActivityCutoff = InitialActivityCutoff; type InitialMaxRegistrationsPerBlock = InitialMaxRegistrationsPerBlock; type InitialPruningScore = InitialPruningScore; type InitialBondsMovingAverage = InitialBondsMovingAverage; diff --git a/precompiles/src/solidity/subnet.abi b/precompiles/src/solidity/subnet.abi index 60e8b49906..961a824804 100644 --- a/precompiles/src/solidity/subnet.abi +++ b/precompiles/src/solidity/subnet.abi @@ -1,23 +1,4 @@ [ - { - "inputs": [ - { - "internalType": "uint16", - "name": "netuid", - "type": "uint16" - } - ], - "name": "getActivityCutoff", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -593,24 +574,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint16", - "name": "netuid", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "activityCutoff", - "type": "uint16" - } - ], - "name": "setActivityCutoff", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, { "inputs": [ { diff --git a/precompiles/src/solidity/subnet.sol b/precompiles/src/solidity/subnet.sol index c454781cb5..c2dc56ea47 100644 --- a/precompiles/src/solidity/subnet.sol +++ b/precompiles/src/solidity/subnet.sol @@ -106,13 +106,6 @@ interface ISubnet { int16 steepness ) external payable; - function getActivityCutoff(uint16 netuid) external view returns (uint16); - - function setActivityCutoff( - uint16 netuid, - uint16 activityCutoff - ) external payable; - function getActivityCutoffFactor( uint16 netuid ) external view returns (uint32); diff --git a/precompiles/src/subnet.rs b/precompiles/src/subnet.rs index 9992bd1cf3..4c1b886bd4 100644 --- a/precompiles/src/subnet.rs +++ b/precompiles/src/subnet.rs @@ -463,33 +463,6 @@ where ) } - #[precompile::public("getActivityCutoff(uint16)")] - #[precompile::view] - fn get_activity_cutoff(handle: &mut impl PrecompileHandle, netuid: u16) -> EvmResult { - handle.record_db_reads::(1)?; - Ok(pallet_subtensor::ActivityCutoff::::get(NetUid::from( - netuid, - ))) - } - - #[precompile::public("setActivityCutoff(uint16,uint16)")] - #[precompile::payable] - fn set_activity_cutoff( - handle: &mut impl PrecompileHandle, - netuid: u16, - activity_cutoff: u16, - ) -> EvmResult<()> { - let call = pallet_admin_utils::Call::::sudo_set_activity_cutoff { - netuid: netuid.into(), - activity_cutoff, - }; - - handle.try_dispatch_runtime_call::( - call, - RawOrigin::Signed(handle.caller_account_id::()), - ) - } - #[precompile::public("getActivityCutoffFactor(uint16)")] #[precompile::view] fn get_activity_cutoff_factor(_: &mut impl PrecompileHandle, netuid: u16) -> EvmResult { @@ -1156,32 +1129,6 @@ mod tests { U256::from(110_u64), ); - let activity_cutoff = pallet_subtensor::MinActivityCutoff::::get() + 1; - precompiles - .prepare_test( - caller, - precompile_addr, - encode_with_selector( - selector_u32("setActivityCutoff(uint16,uint16)"), - (TEST_NETUID_U16, activity_cutoff), - ), - ) - .execute_returns(()); - assert_eq!( - pallet_subtensor::ActivityCutoff::::get(netuid), - activity_cutoff - ); - assert_static_call( - &precompiles, - caller, - precompile_addr, - encode_with_selector( - selector_u32("getActivityCutoff(uint16)"), - (TEST_NETUID_U16,), - ), - U256::from(activity_cutoff), - ); - let factor_milli: u32 = 1_500; precompiles .prepare_test( diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 542e896369..b137c15f1d 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -727,7 +727,7 @@ subtensor_macros::define_proxy_filters! { AdminUtils::sudo_set_min_allowed_weights, AdminUtils::sudo_set_kappa, AdminUtils::sudo_set_rho, - AdminUtils::sudo_set_activity_cutoff, + SubtensorModule::set_activity_cutoff_factor, AdminUtils::sudo_set_network_registration_allowed, AdminUtils::sudo_set_network_pow_registration_allowed, AdminUtils::sudo_set_max_burn, @@ -975,7 +975,6 @@ parameter_types! { pub const SubtensorInitialAdjustmentAlpha: u64 = 0; // no weight to previous value. pub const SubtensorInitialTargetRegistrationsPerInterval: u16 = 2; pub const SubtensorInitialImmunityPeriod: u16 = 4096; - pub const SubtensorInitialActivityCutoff: u16 = 5000; pub const SubtensorInitialMaxRegistrationsPerBlock: u16 = 1; pub const SubtensorInitialPruningScore : u16 = u16::MAX; pub const SubtensorInitialBondsMovingAverage: u64 = 900_000; @@ -1059,7 +1058,6 @@ impl pallet_subtensor::Config for Runtime { type InitialAdjustmentAlpha = SubtensorInitialAdjustmentAlpha; type InitialTargetRegistrationsPerInterval = SubtensorInitialTargetRegistrationsPerInterval; type InitialImmunityPeriod = SubtensorInitialImmunityPeriod; - type InitialActivityCutoff = SubtensorInitialActivityCutoff; type InitialMaxRegistrationsPerBlock = SubtensorInitialMaxRegistrationsPerBlock; type InitialPruningScore = SubtensorInitialPruningScore; type InitialMaxAllowedValidators = SubtensorInitialMaxAllowedValidators; From e9e29f0e275dc022c2d58e823ade0e62103e47e5 Mon Sep 17 00:00:00 2001 From: Evgeny Svirsky Date: Mon, 22 Jun 2026 12:26:12 +0200 Subject: [PATCH 2/6] Hardcode values in the mocks --- chain-extensions/src/mock.rs | 8 ++++---- eco-tests/src/mock.rs | 10 ++++------ pallets/admin-utils/src/tests/mock.rs | 8 ++++---- pallets/subtensor/src/tests/mock.rs | 8 ++++---- pallets/subtensor/src/tests/mock_high_ed.rs | 8 ++++---- pallets/transaction-fee/src/tests/mock.rs | 8 ++++---- precompiles/src/mock.rs | 8 ++++---- 7 files changed, 28 insertions(+), 30 deletions(-) diff --git a/chain-extensions/src/mock.rs b/chain-extensions/src/mock.rs index 709f5a5ebc..8fd2b62bde 100644 --- a/chain-extensions/src/mock.rs +++ b/chain-extensions/src/mock.rs @@ -313,10 +313,10 @@ parameter_types! { pub const InitialMaxBurn: u64 = 1_000_000_000; pub const MinBurnUpperBound: TaoBalance = TaoBalance::new(1_000_000_000); // 1 TAO pub const MaxBurnLowerBound: TaoBalance = TaoBalance::new(100_000_000); // 0.1 TAO - pub const MinTempo: u16 = pallet_subtensor::MIN_TEMPO; - pub const MaxTempo: u16 = pallet_subtensor::MAX_TEMPO; - pub const MinActivityCutoffFactorMilli: u32 = pallet_subtensor::MIN_ACTIVITY_CUTOFF_FACTOR_MILLI; - pub const MaxActivityCutoffFactorMilli: u32 = pallet_subtensor::MAX_ACTIVITY_CUTOFF_FACTOR_MILLI; + pub const MinTempo: u16 = 360; + pub const MaxTempo: u16 = 50_400; + pub const MinActivityCutoffFactorMilli: u32 = 1_000; + pub const MaxActivityCutoffFactorMilli: u32 = 50_000; pub const InitialValidatorPruneLen: u64 = 0; pub const InitialScalingLawPower: u16 = 50; pub const InitialMaxAllowedValidators: u16 = 100; diff --git a/eco-tests/src/mock.rs b/eco-tests/src/mock.rs index 5028474517..c178068b34 100644 --- a/eco-tests/src/mock.rs +++ b/eco-tests/src/mock.rs @@ -199,12 +199,10 @@ parameter_types! { pub const InitialMaxBurn: u64 = 1_000_000_000; pub const MinBurnUpperBound: TaoBalance = TaoBalance::new(1_000_000_000); // 1 TAO pub const MaxBurnLowerBound: TaoBalance = TaoBalance::new(100_000_000); // 0.1 TAO - pub const MinTempo: u16 = pallet_subtensor::MIN_TEMPO; - pub const MaxTempo: u16 = pallet_subtensor::MAX_TEMPO; - pub const MinActivityCutoffFactorMilli: u32 = - pallet_subtensor::MIN_ACTIVITY_CUTOFF_FACTOR_MILLI; - pub const MaxActivityCutoffFactorMilli: u32 = - pallet_subtensor::MAX_ACTIVITY_CUTOFF_FACTOR_MILLI; + pub const MinTempo: u16 = 360; + pub const MaxTempo: u16 = 50_400; + pub const MinActivityCutoffFactorMilli: u32 = 1_000; + pub const MaxActivityCutoffFactorMilli: u32 = 50_000; pub const InitialValidatorPruneLen: u64 = 0; pub const InitialScalingLawPower: u16 = 50; pub const InitialMaxAllowedValidators: u16 = 100; diff --git a/pallets/admin-utils/src/tests/mock.rs b/pallets/admin-utils/src/tests/mock.rs index c826ba8e2f..67c99f7eb6 100644 --- a/pallets/admin-utils/src/tests/mock.rs +++ b/pallets/admin-utils/src/tests/mock.rs @@ -123,10 +123,10 @@ parameter_types! { pub const InitialMaxBurn: TaoBalance = TaoBalance::new(1_000_000_000); pub const MinBurnUpperBound: TaoBalance = TaoBalance::new(1_000_000_000); // 1 TAO pub const MaxBurnLowerBound: TaoBalance = TaoBalance::new(100_000_000); // 0.1 TAO - pub const MinTempo: u16 = pallet_subtensor::MIN_TEMPO; - pub const MaxTempo: u16 = pallet_subtensor::MAX_TEMPO; - pub const MinActivityCutoffFactorMilli: u32 = pallet_subtensor::MIN_ACTIVITY_CUTOFF_FACTOR_MILLI; - pub const MaxActivityCutoffFactorMilli: u32 = pallet_subtensor::MAX_ACTIVITY_CUTOFF_FACTOR_MILLI; + pub const MinTempo: u16 = 360; + pub const MaxTempo: u16 = 50_400; + pub const MinActivityCutoffFactorMilli: u32 = 1_000; + pub const MaxActivityCutoffFactorMilli: u32 = 50_000; pub const InitialValidatorPruneLen: u64 = 0; pub const InitialScalingLawPower: u16 = 50; pub const InitialMaxAllowedValidators: u16 = 100; diff --git a/pallets/subtensor/src/tests/mock.rs b/pallets/subtensor/src/tests/mock.rs index 85dd190348..b67a28bdb1 100644 --- a/pallets/subtensor/src/tests/mock.rs +++ b/pallets/subtensor/src/tests/mock.rs @@ -214,10 +214,10 @@ parameter_types! { pub const InitialMaxBurn: u64 = 1_000_000_000; pub const MinBurnUpperBound: TaoBalance = TaoBalance::new(1_000_000_000); // 1 TAO pub const MaxBurnLowerBound: TaoBalance = TaoBalance::new(100_000_000); // 0.1 TAO - pub const MinTempo: u16 = crate::MIN_TEMPO; - pub const MaxTempo: u16 = crate::MAX_TEMPO; - pub const MinActivityCutoffFactorMilli: u32 = crate::MIN_ACTIVITY_CUTOFF_FACTOR_MILLI; - pub const MaxActivityCutoffFactorMilli: u32 = crate::MAX_ACTIVITY_CUTOFF_FACTOR_MILLI; + pub const MinTempo: u16 = 360; + pub const MaxTempo: u16 = 50_400; + pub const MinActivityCutoffFactorMilli: u32 = 1_000; + pub const MaxActivityCutoffFactorMilli: u32 = 50_000; pub const InitialValidatorPruneLen: u64 = 0; pub const InitialScalingLawPower: u16 = 50; pub const InitialMaxAllowedValidators: u16 = 100; diff --git a/pallets/subtensor/src/tests/mock_high_ed.rs b/pallets/subtensor/src/tests/mock_high_ed.rs index 8da814046e..ddc5ce75b8 100644 --- a/pallets/subtensor/src/tests/mock_high_ed.rs +++ b/pallets/subtensor/src/tests/mock_high_ed.rs @@ -174,10 +174,10 @@ parameter_types! { pub const InitialMaxBurn: u64 = 1_000_000_000; pub const MinBurnUpperBound: TaoBalance = TaoBalance::new(1_000_000_000); // 1 TAO pub const MaxBurnLowerBound: TaoBalance = TaoBalance::new(100_000_000); // 0.1 TAO - pub const MinTempo: u16 = crate::MIN_TEMPO; - pub const MaxTempo: u16 = crate::MAX_TEMPO; - pub const MinActivityCutoffFactorMilli: u32 = crate::MIN_ACTIVITY_CUTOFF_FACTOR_MILLI; - pub const MaxActivityCutoffFactorMilli: u32 = crate::MAX_ACTIVITY_CUTOFF_FACTOR_MILLI; + pub const MinTempo: u16 = 360; + pub const MaxTempo: u16 = 50_400; + pub const MinActivityCutoffFactorMilli: u32 = 1_000; + pub const MaxActivityCutoffFactorMilli: u32 = 50_000; pub const InitialValidatorPruneLen: u64 = 0; pub const InitialScalingLawPower: u16 = 50; pub const InitialMaxAllowedValidators: u16 = 100; diff --git a/pallets/transaction-fee/src/tests/mock.rs b/pallets/transaction-fee/src/tests/mock.rs index a83ca051d5..e6fac5a131 100644 --- a/pallets/transaction-fee/src/tests/mock.rs +++ b/pallets/transaction-fee/src/tests/mock.rs @@ -193,10 +193,10 @@ parameter_types! { pub const InitialMaxBurn: TaoBalance = TaoBalance::new(1_000_000_000); pub const MinBurnUpperBound: TaoBalance = TaoBalance::new(1_000_000_000); // 1 TAO pub const MaxBurnLowerBound: TaoBalance = TaoBalance::new(100_000_000); // 0.1 TAO - pub const MinTempo: u16 = pallet_subtensor::MIN_TEMPO; - pub const MaxTempo: u16 = pallet_subtensor::MAX_TEMPO; - pub const MinActivityCutoffFactorMilli: u32 = pallet_subtensor::MIN_ACTIVITY_CUTOFF_FACTOR_MILLI; - pub const MaxActivityCutoffFactorMilli: u32 = pallet_subtensor::MAX_ACTIVITY_CUTOFF_FACTOR_MILLI; + pub const MinTempo: u16 = 360; + pub const MaxTempo: u16 = 50_400; + pub const MinActivityCutoffFactorMilli: u32 = 1_000; + pub const MaxActivityCutoffFactorMilli: u32 = 50_000; pub const InitialValidatorPruneLen: u64 = 0; pub const InitialScalingLawPower: u16 = 50; pub const InitialMaxAllowedValidators: u16 = 100; diff --git a/precompiles/src/mock.rs b/precompiles/src/mock.rs index 33ae5defdd..89c97eed70 100644 --- a/precompiles/src/mock.rs +++ b/precompiles/src/mock.rs @@ -116,10 +116,10 @@ parameter_types! { pub const InitialMaxBurn: TaoBalance = TaoBalance::new(1_000_000_000); pub const MinBurnUpperBound: TaoBalance = TaoBalance::new(1_000_000_000); pub const MaxBurnLowerBound: TaoBalance = TaoBalance::new(100_000_000); - pub const MinTempo: u16 = pallet_subtensor::MIN_TEMPO; - pub const MaxTempo: u16 = pallet_subtensor::MAX_TEMPO; - pub const MinActivityCutoffFactorMilli: u32 = pallet_subtensor::MIN_ACTIVITY_CUTOFF_FACTOR_MILLI; - pub const MaxActivityCutoffFactorMilli: u32 = pallet_subtensor::MAX_ACTIVITY_CUTOFF_FACTOR_MILLI; + pub const MinTempo: u16 = 360; + pub const MaxTempo: u16 = 50_400; + pub const MinActivityCutoffFactorMilli: u32 = 1_000; + pub const MaxActivityCutoffFactorMilli: u32 = 50_000; pub const InitialValidatorPruneLen: u64 = 0; pub const InitialScalingLawPower: u16 = 50; pub const InitialMaxAllowedValidators: u16 = 100; From 43287c580cb73d8dcf91d1f59ac8d3cad6bc6aae Mon Sep 17 00:00:00 2001 From: Evgeny Svirsky Date: Mon, 22 Jun 2026 12:57:23 +0200 Subject: [PATCH 3/6] fix for the test --- pallets/subtensor/src/tests/epoch.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pallets/subtensor/src/tests/epoch.rs b/pallets/subtensor/src/tests/epoch.rs index 9f40fb18e0..55f8666ce1 100644 --- a/pallets/subtensor/src/tests/epoch.rs +++ b/pallets/subtensor/src/tests/epoch.rs @@ -1442,6 +1442,10 @@ fn test_active_stake() { assert_eq!(*i, I32F32::from_num(65_535)); // floor(0.5*(2^16-1))/(2^16-1), then max-upscale to 65_535 } } + SubtensorModule::set_activity_cutoff_factor_milli( + netuid, + 5_000u32.saturating_mul(1_000) / tempo as u32, + ); let activity_cutoff: u64 = SubtensorModule::get_activity_cutoff_blocks(netuid); run_to_block_no_epoch(netuid, activity_cutoff + 2); // run to block where validator (uid 0, 1) weights become outdated From 1eda8d9c386060071a5b290e7baef5483d674fc7 Mon Sep 17 00:00:00 2001 From: Evgeny Svirsky Date: Wed, 24 Jun 2026 13:40:43 +0200 Subject: [PATCH 4/6] Fix after merge conflict --- pallets/admin-utils/src/weights.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pallets/admin-utils/src/weights.rs b/pallets/admin-utils/src/weights.rs index e236bd8692..6e108e6071 100644 --- a/pallets/admin-utils/src/weights.rs +++ b/pallets/admin-utils/src/weights.rs @@ -93,6 +93,7 @@ pub trait WeightInfo { fn sudo_trim_to_max_allowed_uids() -> Weight; fn sudo_set_min_non_immune_uids() -> Weight; fn sudo_set_max_epochs_per_block() -> Weight; + fn sudo_set_activity_cutoff() -> Weight; } /// Weights for `pallet_admin_utils` using the Substrate node and recommended hardware. From cbca24a2baa650e1bc9ff7dba4b33c357e55c837 Mon Sep 17 00:00:00 2001 From: Evgeny Svirsky Date: Thu, 25 Jun 2026 10:40:36 +0200 Subject: [PATCH 5/6] Cleanup after conflict --- contract-tests/src/contracts/subnet.ts | 0 contract-tests/src/subtensor.ts | 0 .../test/staking.precompile.reward.test.ts | 0 pallets/admin-utils/src/weights.rs | 47 ------------------- 4 files changed, 47 deletions(-) delete mode 100644 contract-tests/src/contracts/subnet.ts delete mode 100644 contract-tests/src/subtensor.ts delete mode 100644 contract-tests/test/staking.precompile.reward.test.ts diff --git a/contract-tests/src/contracts/subnet.ts b/contract-tests/src/contracts/subnet.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/contract-tests/src/subtensor.ts b/contract-tests/src/subtensor.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/contract-tests/test/staking.precompile.reward.test.ts b/contract-tests/test/staking.precompile.reward.test.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pallets/admin-utils/src/weights.rs b/pallets/admin-utils/src/weights.rs index 6e108e6071..46a038d928 100644 --- a/pallets/admin-utils/src/weights.rs +++ b/pallets/admin-utils/src/weights.rs @@ -93,7 +93,6 @@ pub trait WeightInfo { fn sudo_trim_to_max_allowed_uids() -> Weight; fn sudo_set_min_non_immune_uids() -> Weight; fn sudo_set_max_epochs_per_block() -> Weight; - fn sudo_set_activity_cutoff() -> Weight; } /// Weights for `pallet_admin_utils` using the Substrate node and recommended hardware. @@ -361,29 +360,6 @@ impl WeightInfo for SubstrateWeight { /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::MinActivityCutoff` (r:1 w:0) - /// Proof: `SubtensorModule::MinActivityCutoff` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::ActivityCutoff` (r:0 w:1) - /// Proof: `SubtensorModule::ActivityCutoff` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn sudo_set_activity_cutoff() -> Weight { - // Proof Size summary in bytes: - // Measured: `918` - // Estimated: `4383` - // Minimum execution time: 34_023_000 picoseconds. - Weight::from_parts(35_165_000, 4383) - .saturating_add(T::DbWeight::get().reads(6_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `SubtensorModule::Tempo` (r:1 w:0) - /// Proof: `SubtensorModule::Tempo` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::PendingEpochAt` (r:1 w:0) - /// Proof: `SubtensorModule::PendingEpochAt` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::LastEpochBlock` (r:1 w:0) - /// Proof: `SubtensorModule::LastEpochBlock` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::AdminFreezeWindow` (r:1 w:0) - /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) - /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::Rho` (r:0 w:1) /// Proof: `SubtensorModule::Rho` (`max_values`: None, `max_size`: None, mode: `Measured`) fn sudo_set_rho() -> Weight { @@ -1327,29 +1303,6 @@ impl WeightInfo for () { /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::MinActivityCutoff` (r:1 w:0) - /// Proof: `SubtensorModule::MinActivityCutoff` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::ActivityCutoff` (r:0 w:1) - /// Proof: `SubtensorModule::ActivityCutoff` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn sudo_set_activity_cutoff() -> Weight { - // Proof Size summary in bytes: - // Measured: `918` - // Estimated: `4383` - // Minimum execution time: 34_023_000 picoseconds. - Weight::from_parts(35_165_000, 4383) - .saturating_add(RocksDbWeight::get().reads(6_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `SubtensorModule::Tempo` (r:1 w:0) - /// Proof: `SubtensorModule::Tempo` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::PendingEpochAt` (r:1 w:0) - /// Proof: `SubtensorModule::PendingEpochAt` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::LastEpochBlock` (r:1 w:0) - /// Proof: `SubtensorModule::LastEpochBlock` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::AdminFreezeWindow` (r:1 w:0) - /// Proof: `SubtensorModule::AdminFreezeWindow` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `SubtensorModule::NetworksAdded` (r:1 w:0) - /// Proof: `SubtensorModule::NetworksAdded` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `SubtensorModule::Rho` (r:0 w:1) /// Proof: `SubtensorModule::Rho` (`max_values`: None, `max_size`: None, mode: `Measured`) fn sudo_set_rho() -> Weight { From 5381d5ed80de4c9089d7061e018c995b5f359345 Mon Sep 17 00:00:00 2001 From: Evgeny Svirsky Date: Thu, 25 Jun 2026 10:51:29 +0200 Subject: [PATCH 6/6] spec version bump --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 081306410d..c3aacab445 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -234,7 +234,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 423, + spec_version: 424, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1,