Skip to content

Commit d914320

Browse files
committed
feat: add sudo call to disable emissions for a subnet
Closes #2287 This PR adds a new sudo call `sudo_set_emissions_disabled` that allows root to disable or enable emissions for a specific subnet. Changes: - Add EmissionsDisabled storage item in subtensor pallet - Add EmissionsDisabledSet event - Add getter/setter functions for EmissionsDisabled - Add sudo_set_emissions_disabled call in admin-utils pallet (call_index 84) - Update get_subnets_to_emit_to to filter out subnets with emissions disabled - Add cleanup for EmissionsDisabled in remove_network - Add benchmark for the new extrinsic - Add tests for the new functionality
1 parent 675111c commit d914320

File tree

9 files changed

+147
-0
lines changed

9 files changed

+147
-0
lines changed

pallets/admin-utils/src/benchmarking.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,5 +645,17 @@ mod benchmarks {
645645
); /* sudo_set_min_non_immune_uids() */
646646
}
647647

648+
#[benchmark]
649+
fn sudo_set_emissions_disabled() {
650+
pallet_subtensor::Pallet::<T>::set_admin_freeze_window(0);
651+
pallet_subtensor::Pallet::<T>::init_new_network(
652+
1u16.into(), /*netuid*/
653+
1u16, /*tempo*/
654+
);
655+
656+
#[extrinsic_call]
657+
_(RawOrigin::Root, 1u16.into()/*netuid*/, true/*disabled*/)/*sudo_set_emissions_disabled*/;
658+
}
659+
648660
//impl_benchmark_test_suite!(AdminUtils, crate::mock::new_test_ext(), crate::mock::Test);
649661
}

pallets/admin-utils/src/lib.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2240,6 +2240,34 @@ pub mod pallet {
22402240
pallet_subtensor::Pallet::<T>::set_min_non_immune_uids(netuid, min);
22412241
Ok(())
22422242
}
2243+
2244+
/// Enables or disables emissions for a specific subnet.
2245+
/// It is only callable by the root account (sudo).
2246+
/// When emissions are disabled, the subnet will not receive any TAO emissions.
2247+
#[pallet::call_index(85)]
2248+
#[pallet::weight((
2249+
Weight::from_parts(7_343_000, 0)
2250+
.saturating_add(<T as frame_system::Config>::DbWeight::get().reads(1))
2251+
.saturating_add(<T as frame_system::Config>::DbWeight::get().writes(1)),
2252+
DispatchClass::Operational,
2253+
Pays::Yes
2254+
))]
2255+
pub fn sudo_set_emissions_disabled(
2256+
origin: OriginFor<T>,
2257+
netuid: NetUid,
2258+
disabled: bool,
2259+
) -> DispatchResult {
2260+
ensure_root(origin)?;
2261+
ensure!(
2262+
pallet_subtensor::Pallet::<T>::if_subnet_exist(netuid),
2263+
Error::<T>::SubnetDoesNotExist
2264+
);
2265+
pallet_subtensor::Pallet::<T>::set_emissions_disabled(netuid, disabled);
2266+
log::debug!(
2267+
"sudo_set_emissions_disabled( netuid: {netuid:?}, disabled: {disabled:?} ) "
2268+
);
2269+
Ok(())
2270+
}
22432271
}
22442272
}
22452273

pallets/admin-utils/src/tests/mod.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2887,3 +2887,59 @@ fn test_sudo_set_min_non_immune_uids() {
28872887
assert_eq!(SubtensorModule::get_min_non_immune_uids(netuid), to_be_set);
28882888
});
28892889
}
2890+
2891+
#[test]
2892+
fn test_sudo_set_emissions_disabled() {
2893+
new_test_ext().execute_with(|| {
2894+
let netuid = NetUid::from(1);
2895+
add_network(netuid, 10);
2896+
2897+
// Check default value is false (emissions enabled)
2898+
let init_value: bool = SubtensorModule::get_emissions_disabled(netuid);
2899+
assert!(!init_value);
2900+
2901+
// Non-root cannot call
2902+
assert_eq!(
2903+
AdminUtils::sudo_set_emissions_disabled(
2904+
<<Test as Config>::RuntimeOrigin>::signed(U256::from(1)),
2905+
netuid,
2906+
true
2907+
),
2908+
Err(DispatchError::BadOrigin)
2909+
);
2910+
assert_eq!(SubtensorModule::get_emissions_disabled(netuid), init_value);
2911+
2912+
// Root can disable emissions
2913+
assert_ok!(AdminUtils::sudo_set_emissions_disabled(
2914+
<<Test as Config>::RuntimeOrigin>::root(),
2915+
netuid,
2916+
true
2917+
));
2918+
assert!(SubtensorModule::get_emissions_disabled(netuid));
2919+
2920+
// Root can re-enable emissions
2921+
assert_ok!(AdminUtils::sudo_set_emissions_disabled(
2922+
<<Test as Config>::RuntimeOrigin>::root(),
2923+
netuid,
2924+
false
2925+
));
2926+
assert!(!SubtensorModule::get_emissions_disabled(netuid));
2927+
});
2928+
}
2929+
2930+
#[test]
2931+
fn test_sudo_set_emissions_disabled_subnet_not_exist() {
2932+
new_test_ext().execute_with(|| {
2933+
let netuid = NetUid::from(99);
2934+
2935+
// Subnet does not exist
2936+
assert_err!(
2937+
AdminUtils::sudo_set_emissions_disabled(
2938+
<<Test as Config>::RuntimeOrigin>::root(),
2939+
netuid,
2940+
true
2941+
),
2942+
Error::<Test>::SubnetDoesNotExist
2943+
);
2944+
});
2945+
}

pallets/subtensor/src/coinbase/root.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ impl<T: Config> Pallet<T> {
314314

315315
// --- 15. Mechanism step / emissions bookkeeping.
316316
FirstEmissionBlockNumber::<T>::remove(netuid);
317+
EmissionsDisabled::<T>::remove(netuid);
317318
PendingValidatorEmission::<T>::remove(netuid);
318319
PendingServerEmission::<T>::remove(netuid);
319320
PendingRootAlphaDivs::<T>::remove(netuid);

pallets/subtensor/src/coinbase/subnet_emissions.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ impl<T: Config> Pallet<T> {
88
pub fn get_subnets_to_emit_to(subnets: &[NetUid]) -> Vec<NetUid> {
99
// Filter out root subnet.
1010
// Filter out subnets with no first emission block number.
11+
// Filter out subnets with emissions disabled.
1112
subnets
1213
.iter()
1314
.filter(|netuid| !netuid.is_root())
1415
.filter(|netuid| FirstEmissionBlockNumber::<T>::get(*netuid).is_some())
1516
.filter(|netuid| SubtokenEnabled::<T>::get(*netuid))
17+
.filter(|netuid| !EmissionsDisabled::<T>::get(*netuid))
1618
.filter(|&netuid| {
1719
// Only emit TAO if the subnetwork allows registration.
1820
Self::get_network_registration_allowed(*netuid)

pallets/subtensor/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,6 +1587,11 @@ pub mod pallet {
15871587
pub type FirstEmissionBlockNumber<T: Config> =
15881588
StorageMap<_, Identity, NetUid, u64, OptionQuery>;
15891589

1590+
/// --- MAP ( netuid ) --> emissions_disabled | Whether emissions are disabled for this subnet
1591+
#[pallet::storage]
1592+
pub type EmissionsDisabled<T: Config> =
1593+
StorageMap<_, Identity, NetUid, bool, ValueQuery, DefaultFalse<T>>;
1594+
15901595
/// --- MAP ( netuid ) --> subnet mechanism
15911596
#[pallet::storage]
15921597
pub type SubnetMechanism<T: Config> =

pallets/subtensor/src/macros/events.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ mod events {
131131
RegistrationAllowed(NetUid, bool),
132132
/// POW registration is allowed/disallowed for a subnet.
133133
PowRegistrationAllowed(NetUid, bool),
134+
/// emissions are enabled/disabled for a subnet.
135+
EmissionsDisabledSet(NetUid, bool),
134136
/// setting tempo on a network
135137
TempoSet(NetUid, u16),
136138
/// setting the RAO recycled for registration.

pallets/subtensor/src/tests/coinbase.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4016,3 +4016,35 @@ fn test_get_subnet_terms_alpha_emissions_cap() {
40164016
assert_eq!(alpha_in.get(&netuid).copied().unwrap(), tao_block_emission);
40174017
});
40184018
}
4019+
4020+
#[test]
4021+
fn test_get_subnets_to_emit_to_filters_emissions_disabled() {
4022+
new_test_ext(1).execute_with(|| {
4023+
let netuid0 = add_dynamic_network(&U256::from(1), &U256::from(2));
4024+
let netuid1 = add_dynamic_network(&U256::from(3), &U256::from(4));
4025+
4026+
// Both subnets should be in the list initially
4027+
let subnets_to_emit_to_0 = SubtensorModule::get_subnets_to_emit_to(&[netuid0, netuid1]);
4028+
assert_eq!(subnets_to_emit_to_0.len(), 2);
4029+
assert!(subnets_to_emit_to_0.contains(&netuid0));
4030+
assert!(subnets_to_emit_to_0.contains(&netuid1));
4031+
4032+
// Disable emissions for netuid0
4033+
EmissionsDisabled::<Test>::insert(netuid0, true);
4034+
4035+
// Check that netuid0 is not in the list
4036+
let subnets_to_emit_to_1 = SubtensorModule::get_subnets_to_emit_to(&[netuid0, netuid1]);
4037+
assert_eq!(subnets_to_emit_to_1.len(), 1);
4038+
assert!(!subnets_to_emit_to_1.contains(&netuid0));
4039+
assert!(subnets_to_emit_to_1.contains(&netuid1));
4040+
4041+
// Re-enable emissions for netuid0
4042+
EmissionsDisabled::<Test>::insert(netuid0, false);
4043+
4044+
// Check that netuid0 is back in the list
4045+
let subnets_to_emit_to_2 = SubtensorModule::get_subnets_to_emit_to(&[netuid0, netuid1]);
4046+
assert_eq!(subnets_to_emit_to_2.len(), 2);
4047+
assert!(subnets_to_emit_to_2.contains(&netuid0));
4048+
assert!(subnets_to_emit_to_2.contains(&netuid1));
4049+
});
4050+
}

pallets/subtensor/src/utils/misc.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,15 @@ impl<T: Config> Pallet<T> {
596596
Self::deposit_event(Event::PowRegistrationAllowed(netuid, registration_allowed));
597597
}
598598

599+
// Emissions Disabled utils
600+
pub fn get_emissions_disabled(netuid: NetUid) -> bool {
601+
EmissionsDisabled::<T>::get(netuid)
602+
}
603+
pub fn set_emissions_disabled(netuid: NetUid, disabled: bool) {
604+
EmissionsDisabled::<T>::insert(netuid, disabled);
605+
Self::deposit_event(Event::EmissionsDisabledSet(netuid, disabled));
606+
}
607+
599608
pub fn get_target_registrations_per_interval(netuid: NetUid) -> u16 {
600609
TargetRegistrationsPerInterval::<T>::get(netuid)
601610
}

0 commit comments

Comments
 (0)