diff --git a/pallets/admin-utils/src/lib.rs b/pallets/admin-utils/src/lib.rs index 4af202132f..89931d22b1 100644 --- a/pallets/admin-utils/src/lib.rs +++ b/pallets/admin-utils/src/lib.rs @@ -1860,7 +1860,7 @@ pub mod pallet { let maybe_owner = pallet_subtensor::Pallet::::ensure_sn_owner_or_root_with_limits( origin, netuid, - &[TransactionType::SubsubnetParameterUpdate], + &[TransactionType::SubsubnetCountUpdate], )?; pallet_subtensor::Pallet::::do_set_subsubnet_count(netuid, subsub_count)?; @@ -1868,7 +1868,7 @@ pub mod pallet { pallet_subtensor::Pallet::::record_owner_rl( maybe_owner, netuid, - &[TransactionType::SubsubnetParameterUpdate], + &[TransactionType::SubsubnetCountUpdate], ); Ok(()) } @@ -1886,7 +1886,7 @@ pub mod pallet { let maybe_owner = pallet_subtensor::Pallet::::ensure_sn_owner_or_root_with_limits( origin, netuid, - &[TransactionType::SubsubnetParameterUpdate], + &[TransactionType::SubsubnetEmission], )?; pallet_subtensor::Pallet::::do_set_emission_split(netuid, maybe_split)?; @@ -1894,7 +1894,7 @@ pub mod pallet { pallet_subtensor::Pallet::::record_owner_rl( maybe_owner, netuid, - &[TransactionType::SubsubnetParameterUpdate], + &[TransactionType::SubsubnetEmission], ); Ok(()) } diff --git a/pallets/admin-utils/src/tests/mod.rs b/pallets/admin-utils/src/tests/mod.rs index 25b1b89607..b4741bbfd9 100644 --- a/pallets/admin-utils/src/tests/mod.rs +++ b/pallets/admin-utils/src/tests/mod.rs @@ -2269,3 +2269,64 @@ fn test_sudo_set_subsubnet_count() { )); }); } + +// cargo test --package pallet-admin-utils --lib -- tests::test_sudo_set_subsubnet_count_and_emissions --exact --show-output +#[test] +fn test_sudo_set_subsubnet_count_and_emissions() { + new_test_ext().execute_with(|| { + let netuid = NetUid::from(1); + let ss_count_ok = SubId::from(2); + + let sn_owner = U256::from(1324); + add_network(netuid, 10); + // Set the Subnet Owner + SubnetOwner::::insert(netuid, sn_owner); + + assert_ok!(AdminUtils::sudo_set_subsubnet_count( + <::RuntimeOrigin>::signed(sn_owner), + netuid, + ss_count_ok + )); + + // Cannot set emission split with wrong number of entries + // With two subsubnets the size of the split vector should be 2, not 3 + assert_noop!( + AdminUtils::sudo_set_subsubnet_emission_split( + <::RuntimeOrigin>::signed(sn_owner), + netuid, + Some(vec![0xFFFF / 5 * 2, 0xFFFF / 5 * 2, 0xFFFF / 5]) + ), + pallet_subtensor::Error::::InvalidValue + ); + + // Cannot set emission split with wrong total of entries + // Split vector entries should sum up to exactly 0xFFFF + assert_noop!( + AdminUtils::sudo_set_subsubnet_emission_split( + <::RuntimeOrigin>::signed(sn_owner), + netuid, + Some(vec![0xFFFF / 5 * 4, 0xFFFF / 5 - 1]) + ), + pallet_subtensor::Error::::InvalidValue + ); + + // Can set good split ok + // We also verify here that it can happen in the same block as setting subsubnet counts + // or soon, without rate limiting + assert_ok!(AdminUtils::sudo_set_subsubnet_emission_split( + <::RuntimeOrigin>::signed(sn_owner), + netuid, + Some(vec![0xFFFF / 5, 0xFFFF / 5 * 4]) + )); + + // Cannot set it again due to rate limits + assert_noop!( + AdminUtils::sudo_set_subsubnet_emission_split( + <::RuntimeOrigin>::signed(sn_owner), + netuid, + Some(vec![0xFFFF / 5 * 4, 0xFFFF / 5]) + ), + pallet_subtensor::Error::::TxRateLimitExceeded + ); + }); +} diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index dd12a9b76b..18dfca8ea9 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1840,7 +1840,12 @@ pub mod pallet { #[pallet::type_value] /// -- ITEM (Rate limit for subsubnet count updates) pub fn SubsubnetCountSetRateLimit() -> u64 { - prod_or_fast!(7_200, 0) + prod_or_fast!(7_200, 1) + } + #[pallet::type_value] + /// -- ITEM (Rate limit for subsubnet emission distribution updates) + pub fn SubsubnetEmissionRateLimit() -> u64 { + prod_or_fast!(7_200, 1) } #[pallet::storage] /// --- MAP ( netuid ) --> Current number of sub-subnets diff --git a/pallets/subtensor/src/subnets/subsubnet.rs b/pallets/subtensor/src/subnets/subsubnet.rs index 904c380463..337bf809fd 100644 --- a/pallets/subtensor/src/subnets/subsubnet.rs +++ b/pallets/subtensor/src/subnets/subsubnet.rs @@ -172,7 +172,7 @@ impl Pallet { // Check that values add up to 65535 let total: u64 = split.iter().map(|s| *s as u64).sum(); - ensure!(total <= u16::MAX as u64, Error::::InvalidValue); + ensure!(total == u16::MAX as u64, Error::::InvalidValue); SubsubnetEmissionSplit::::insert(netuid, split); } else { diff --git a/pallets/subtensor/src/utils/rate_limiting.rs b/pallets/subtensor/src/utils/rate_limiting.rs index e9a8bb7b12..a1f7e6aac6 100644 --- a/pallets/subtensor/src/utils/rate_limiting.rs +++ b/pallets/subtensor/src/utils/rate_limiting.rs @@ -12,7 +12,8 @@ pub enum TransactionType { SetWeightsVersionKey, SetSNOwnerHotkey, OwnerHyperparamUpdate, - SubsubnetParameterUpdate, + SubsubnetCountUpdate, + SubsubnetEmission, } /// Implement conversion from TransactionType to u16 @@ -26,7 +27,8 @@ impl From for u16 { TransactionType::SetWeightsVersionKey => 4, TransactionType::SetSNOwnerHotkey => 5, TransactionType::OwnerHyperparamUpdate => 6, - TransactionType::SubsubnetParameterUpdate => 7, + TransactionType::SubsubnetCountUpdate => 7, + TransactionType::SubsubnetEmission => 8, } } } @@ -41,7 +43,8 @@ impl From for TransactionType { 4 => TransactionType::SetWeightsVersionKey, 5 => TransactionType::SetSNOwnerHotkey, 6 => TransactionType::OwnerHyperparamUpdate, - 7 => TransactionType::SubsubnetParameterUpdate, + 7 => TransactionType::SubsubnetCountUpdate, + 8 => TransactionType::SubsubnetEmission, _ => TransactionType::Unknown, } } @@ -57,7 +60,8 @@ impl Pallet { TransactionType::SetChildkeyTake => TxChildkeyTakeRateLimit::::get(), TransactionType::RegisterNetwork => NetworkRateLimit::::get(), TransactionType::OwnerHyperparamUpdate => OwnerHyperparamRateLimit::::get(), - TransactionType::SubsubnetParameterUpdate => SubsubnetCountSetRateLimit::::get(), + TransactionType::SubsubnetCountUpdate => SubsubnetCountSetRateLimit::::get(), + TransactionType::SubsubnetEmission => SubsubnetEmissionRateLimit::::get(), TransactionType::Unknown => 0, // Default to no limit for unknown types (no limit) _ => 0,