Skip to content

Commit e44f1bc

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 8834a7c commit e44f1bc

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
@@ -627,5 +627,17 @@ mod benchmarks {
627627
_(RawOrigin::Root, 1u16.into()/*netuid*/, 256u16/*max_n*/)/*sudo_trim_to_max_allowed_uids()*/;
628628
}
629629

630+
#[benchmark]
631+
fn sudo_set_emissions_disabled() {
632+
pallet_subtensor::Pallet::<T>::set_admin_freeze_window(0);
633+
pallet_subtensor::Pallet::<T>::init_new_network(
634+
1u16.into(), /*netuid*/
635+
1u16, /*tempo*/
636+
);
637+
638+
#[extrinsic_call]
639+
_(RawOrigin::Root, 1u16.into()/*netuid*/, true/*disabled*/)/*sudo_set_emissions_disabled*/;
640+
}
641+
630642
//impl_benchmark_test_suite!(AdminUtils, crate::mock::new_test_ext(), crate::mock::Test);
631643
}

pallets/admin-utils/src/lib.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2221,6 +2221,34 @@ pub mod pallet {
22212221
log::debug!("set_tao_flow_smoothing_factor( {smoothing_factor:?} ) ");
22222222
Ok(())
22232223
}
2224+
2225+
/// Enables or disables emissions for a specific subnet.
2226+
/// It is only callable by the root account (sudo).
2227+
/// When emissions are disabled, the subnet will not receive any TAO emissions.
2228+
#[pallet::call_index(84)]
2229+
#[pallet::weight((
2230+
Weight::from_parts(7_343_000, 0)
2231+
.saturating_add(<T as frame_system::Config>::DbWeight::get().reads(1))
2232+
.saturating_add(<T as frame_system::Config>::DbWeight::get().writes(1)),
2233+
DispatchClass::Operational,
2234+
Pays::Yes
2235+
))]
2236+
pub fn sudo_set_emissions_disabled(
2237+
origin: OriginFor<T>,
2238+
netuid: NetUid,
2239+
disabled: bool,
2240+
) -> DispatchResult {
2241+
ensure_root(origin)?;
2242+
ensure!(
2243+
pallet_subtensor::Pallet::<T>::if_subnet_exist(netuid),
2244+
Error::<T>::SubnetDoesNotExist
2245+
);
2246+
pallet_subtensor::Pallet::<T>::set_emissions_disabled(netuid, disabled);
2247+
log::debug!(
2248+
"sudo_set_emissions_disabled( netuid: {netuid:?}, disabled: {disabled:?} ) "
2249+
);
2250+
Ok(())
2251+
}
22242252
}
22252253
}
22262254

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2865,3 +2865,59 @@ fn test_sudo_set_min_allowed_uids() {
28652865
);
28662866
});
28672867
}
2868+
2869+
#[test]
2870+
fn test_sudo_set_emissions_disabled() {
2871+
new_test_ext().execute_with(|| {
2872+
let netuid = NetUid::from(1);
2873+
add_network(netuid, 10);
2874+
2875+
// Check default value is false (emissions enabled)
2876+
let init_value: bool = SubtensorModule::get_emissions_disabled(netuid);
2877+
assert!(!init_value);
2878+
2879+
// Non-root cannot call
2880+
assert_eq!(
2881+
AdminUtils::sudo_set_emissions_disabled(
2882+
<<Test as Config>::RuntimeOrigin>::signed(U256::from(1)),
2883+
netuid,
2884+
true
2885+
),
2886+
Err(DispatchError::BadOrigin)
2887+
);
2888+
assert_eq!(SubtensorModule::get_emissions_disabled(netuid), init_value);
2889+
2890+
// Root can disable emissions
2891+
assert_ok!(AdminUtils::sudo_set_emissions_disabled(
2892+
<<Test as Config>::RuntimeOrigin>::root(),
2893+
netuid,
2894+
true
2895+
));
2896+
assert!(SubtensorModule::get_emissions_disabled(netuid));
2897+
2898+
// Root can re-enable emissions
2899+
assert_ok!(AdminUtils::sudo_set_emissions_disabled(
2900+
<<Test as Config>::RuntimeOrigin>::root(),
2901+
netuid,
2902+
false
2903+
));
2904+
assert!(!SubtensorModule::get_emissions_disabled(netuid));
2905+
});
2906+
}
2907+
2908+
#[test]
2909+
fn test_sudo_set_emissions_disabled_subnet_not_exist() {
2910+
new_test_ext().execute_with(|| {
2911+
let netuid = NetUid::from(99);
2912+
2913+
// Subnet does not exist
2914+
assert_err!(
2915+
AdminUtils::sudo_set_emissions_disabled(
2916+
<<Test as Config>::RuntimeOrigin>::root(),
2917+
netuid,
2918+
true
2919+
),
2920+
Error::<Test>::SubnetDoesNotExist
2921+
);
2922+
});
2923+
}

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
@@ -1571,6 +1571,11 @@ pub mod pallet {
15711571
pub type FirstEmissionBlockNumber<T: Config> =
15721572
StorageMap<_, Identity, NetUid, u64, OptionQuery>;
15731573

1574+
/// --- MAP ( netuid ) --> emissions_disabled | Whether emissions are disabled for this subnet
1575+
#[pallet::storage]
1576+
pub type EmissionsDisabled<T: Config> =
1577+
StorageMap<_, Identity, NetUid, bool, ValueQuery, DefaultFalse<T>>;
1578+
15741579
/// --- MAP ( netuid ) --> subnet mechanism
15751580
#[pallet::storage]
15761581
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
@@ -3955,3 +3955,35 @@ fn test_get_subnet_terms_alpha_emissions_cap() {
39553955
assert_eq!(alpha_in.get(&netuid).copied().unwrap(), tao_block_emission);
39563956
});
39573957
}
3958+
3959+
#[test]
3960+
fn test_get_subnets_to_emit_to_filters_emissions_disabled() {
3961+
new_test_ext(1).execute_with(|| {
3962+
let netuid0 = add_dynamic_network(&U256::from(1), &U256::from(2));
3963+
let netuid1 = add_dynamic_network(&U256::from(3), &U256::from(4));
3964+
3965+
// Both subnets should be in the list initially
3966+
let subnets_to_emit_to_0 = SubtensorModule::get_subnets_to_emit_to(&[netuid0, netuid1]);
3967+
assert_eq!(subnets_to_emit_to_0.len(), 2);
3968+
assert!(subnets_to_emit_to_0.contains(&netuid0));
3969+
assert!(subnets_to_emit_to_0.contains(&netuid1));
3970+
3971+
// Disable emissions for netuid0
3972+
EmissionsDisabled::<Test>::insert(netuid0, true);
3973+
3974+
// Check that netuid0 is not in the list
3975+
let subnets_to_emit_to_1 = SubtensorModule::get_subnets_to_emit_to(&[netuid0, netuid1]);
3976+
assert_eq!(subnets_to_emit_to_1.len(), 1);
3977+
assert!(!subnets_to_emit_to_1.contains(&netuid0));
3978+
assert!(subnets_to_emit_to_1.contains(&netuid1));
3979+
3980+
// Re-enable emissions for netuid0
3981+
EmissionsDisabled::<Test>::insert(netuid0, false);
3982+
3983+
// Check that netuid0 is back in the list
3984+
let subnets_to_emit_to_2 = SubtensorModule::get_subnets_to_emit_to(&[netuid0, netuid1]);
3985+
assert_eq!(subnets_to_emit_to_2.len(), 2);
3986+
assert!(subnets_to_emit_to_2.contains(&netuid0));
3987+
assert!(subnets_to_emit_to_2.contains(&netuid1));
3988+
});
3989+
}

pallets/subtensor/src/utils/misc.rs

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

610+
// Emissions Disabled utils
611+
pub fn get_emissions_disabled(netuid: NetUid) -> bool {
612+
EmissionsDisabled::<T>::get(netuid)
613+
}
614+
pub fn set_emissions_disabled(netuid: NetUid, disabled: bool) {
615+
EmissionsDisabled::<T>::insert(netuid, disabled);
616+
Self::deposit_event(Event::EmissionsDisabledSet(netuid, disabled));
617+
}
618+
610619
pub fn get_target_registrations_per_interval(netuid: NetUid) -> u16 {
611620
TargetRegistrationsPerInterval::<T>::get(netuid)
612621
}

0 commit comments

Comments
 (0)