@@ -3747,3 +3747,108 @@ fn test_do_set_child_cooldown_period() {
3747
3747
assert_eq ! ( children_after, vec![ ( proportion, child) ] ) ;
3748
3748
} ) ;
3749
3749
}
3750
+
3751
+ // Test that revoking childkeys does not require minimum stake
3752
+ #[ test]
3753
+ fn test_revoke_child_no_min_stake_check ( ) {
3754
+ new_test_ext ( 1 ) . execute_with ( || {
3755
+ let coldkey = U256 :: from ( 1 ) ;
3756
+ let parent = U256 :: from ( 2 ) ;
3757
+ let child = U256 :: from ( 3 ) ;
3758
+ let netuid: u16 = 1 ;
3759
+ let proportion: u64 = 1000 ;
3760
+
3761
+ // Add network and register hotkey
3762
+ add_network ( netuid, 13 , 0 ) ;
3763
+ register_ok_neuron ( netuid, parent, coldkey, 0 ) ;
3764
+
3765
+ // Set minimum stake for setting children
3766
+ let parent_total_stake_original = TotalHotkeyStake :: < Test > :: get ( parent) ;
3767
+ StakeThreshold :: < Test > :: put ( 1_000_000_000_000 ) ;
3768
+ TotalHotkeyStake :: < Test > :: insert ( parent, StakeThreshold :: < Test > :: get ( ) ) ;
3769
+
3770
+ // Schedule parent-child relationship
3771
+ assert_ok ! ( SubtensorModule :: do_schedule_children(
3772
+ RuntimeOrigin :: signed( coldkey) ,
3773
+ parent,
3774
+ netuid,
3775
+ vec![ ( proportion, child) ] ,
3776
+ ) ) ;
3777
+
3778
+ // Ensure the childkeys are not yet applied
3779
+ let children_before = SubtensorModule :: get_children ( & parent, netuid) ;
3780
+ assert_eq ! ( children_before, vec![ ] ) ;
3781
+
3782
+ wait_and_set_pending_children ( netuid) ;
3783
+ TotalHotkeyStake :: < Test > :: insert ( parent, parent_total_stake_original) ;
3784
+
3785
+ // Ensure the childkeys are applied
3786
+ let children_after = SubtensorModule :: get_children ( & parent, netuid) ;
3787
+ assert_eq ! ( children_after, vec![ ( proportion, child) ] ) ;
3788
+
3789
+ // Reduce the stake below required threshold
3790
+ TotalHotkeyStake :: < Test > :: insert ( parent, StakeThreshold :: < Test > :: get ( ) - 1 ) ;
3791
+
3792
+ // Bypass tx rate limit
3793
+ SubtensorModule :: set_last_transaction_block_on_subnet (
3794
+ & parent,
3795
+ netuid,
3796
+ & TransactionType :: SetChildren ,
3797
+ 0 ,
3798
+ ) ;
3799
+
3800
+ // Schedule parent-child relationship revokation
3801
+ assert_ok ! ( SubtensorModule :: do_schedule_children(
3802
+ RuntimeOrigin :: signed( coldkey) ,
3803
+ parent,
3804
+ netuid,
3805
+ vec![ ] ,
3806
+ ) ) ;
3807
+
3808
+ wait_and_set_pending_children ( netuid) ;
3809
+ TotalHotkeyStake :: < Test > :: insert ( parent, parent_total_stake_original) ;
3810
+
3811
+ // Ensure the childkeys are revoked
3812
+ let children_after = SubtensorModule :: get_children ( & parent, netuid) ;
3813
+ assert_eq ! ( children_after, vec![ ] ) ;
3814
+ } ) ;
3815
+ }
3816
+
3817
+ // Test that setting childkeys works even if subnet registration is disabled
3818
+ #[ test]
3819
+ fn test_do_set_child_registration_disabled ( ) {
3820
+ new_test_ext ( 1 ) . execute_with ( || {
3821
+ let coldkey = U256 :: from ( 1 ) ;
3822
+ let parent = U256 :: from ( 2 ) ;
3823
+ let child = U256 :: from ( 3 ) ;
3824
+ let netuid: u16 = 1 ;
3825
+ let proportion: u64 = 1000 ;
3826
+
3827
+ // Add network and register hotkey
3828
+ add_network ( netuid, 13 , 0 ) ;
3829
+ register_ok_neuron ( netuid, parent, coldkey, 0 ) ;
3830
+
3831
+ // Set minimum stake for setting children
3832
+ let parent_total_stake_original = TotalHotkeyStake :: < Test > :: get ( parent) ;
3833
+ StakeThreshold :: < Test > :: put ( 1_000_000_000_000 ) ;
3834
+ TotalHotkeyStake :: < Test > :: insert ( parent, StakeThreshold :: < Test > :: get ( ) ) ;
3835
+
3836
+ // Disable subnet registrations
3837
+ NetworkRegistrationAllowed :: < Test > :: insert ( netuid, false ) ;
3838
+
3839
+ // Schedule parent-child relationship
3840
+ assert_ok ! ( SubtensorModule :: do_schedule_children(
3841
+ RuntimeOrigin :: signed( coldkey) ,
3842
+ parent,
3843
+ netuid,
3844
+ vec![ ( proportion, child) ] ,
3845
+ ) ) ;
3846
+
3847
+ wait_and_set_pending_children ( netuid) ;
3848
+ TotalHotkeyStake :: < Test > :: insert ( parent, parent_total_stake_original) ;
3849
+
3850
+ // Ensure the childkeys are applied
3851
+ let children_after = SubtensorModule :: get_children ( & parent, netuid) ;
3852
+ assert_eq ! ( children_after, vec![ ( proportion, child) ] ) ;
3853
+ } ) ;
3854
+ }
0 commit comments