@@ -250,3 +250,88 @@ fn test_neuron_certificate() {
250
250
assert_err ! ( NeuronCertificate :: try_from( data) , ( ) ) ;
251
251
} ) ;
252
252
}
253
+
254
+ #[ test]
255
+ fn test_replace_neuron_subnet_owner_not_replaced ( ) {
256
+ new_test_ext ( 1 ) . execute_with ( || {
257
+ let owner_hotkey = U256 :: from ( 100 ) ;
258
+ let owner_coldkey = U256 :: from ( 999 ) ;
259
+ let new_hotkey_account_id = U256 :: from ( 2 ) ;
260
+
261
+ let netuid = add_dynamic_network ( & owner_hotkey, & owner_coldkey) ;
262
+ let neuron_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & owner_hotkey)
263
+ . expect ( "Owner neuron should be registered by add_dynamic_network" ) ;
264
+
265
+ let current_block = SubtensorModule :: get_current_block_as_u64 ( ) ;
266
+ SubtensorModule :: replace_neuron ( netuid, neuron_uid, & new_hotkey_account_id, current_block) ;
267
+
268
+ let still_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & owner_hotkey) ;
269
+ assert_ok ! ( still_uid) ;
270
+ assert_eq ! (
271
+ still_uid. unwrap( ) ,
272
+ neuron_uid,
273
+ "UID should remain unchanged for subnet owner"
274
+ ) ;
275
+
276
+ let new_key_uid =
277
+ SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & new_hotkey_account_id) ;
278
+ assert_err ! ( new_key_uid, Error :: <Test >:: HotKeyNotRegisteredInSubNet , ) ;
279
+ } ) ;
280
+ }
281
+
282
+ #[ test]
283
+ fn test_get_neuron_to_prune_owner_not_pruned ( ) {
284
+ new_test_ext ( 1 ) . execute_with ( || {
285
+ let owner_hotkey = U256 :: from ( 123 ) ;
286
+ let owner_coldkey = U256 :: from ( 999 ) ;
287
+
288
+ let netuid = add_dynamic_network ( & owner_hotkey, & owner_coldkey) ;
289
+
290
+ SubtensorModule :: set_max_registrations_per_block ( netuid, 100 ) ;
291
+ SubtensorModule :: set_target_registrations_per_interval ( netuid, 100 ) ;
292
+ SubnetOwner :: < Test > :: insert ( netuid, owner_coldkey) ;
293
+
294
+ let owner_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & owner_hotkey)
295
+ . expect ( "Owner neuron should already be registered by add_dynamic_network" ) ;
296
+
297
+ let additional_hotkey_1 = U256 :: from ( 1000 ) ;
298
+ let additional_coldkey_1 = U256 :: from ( 2000 ) ;
299
+
300
+ let additional_hotkey_2 = U256 :: from ( 1001 ) ;
301
+ let additional_coldkey_2 = U256 :: from ( 2001 ) ;
302
+
303
+ register_ok_neuron ( netuid, additional_hotkey_1, additional_coldkey_1, 0 ) ;
304
+ let uid_1 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_1)
305
+ . expect ( "Should be registered" ) ;
306
+
307
+ register_ok_neuron ( netuid, additional_hotkey_2, additional_coldkey_2, 1 ) ;
308
+ let uid_2 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_2)
309
+ . expect ( "Should be registered" ) ;
310
+
311
+ SubtensorModule :: set_pruning_score_for_uid ( netuid, owner_uid, 0 ) ;
312
+ SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_1, 1 ) ;
313
+ SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_2, 2 ) ;
314
+
315
+ let pruned_uid = SubtensorModule :: get_neuron_to_prune ( netuid) ;
316
+
317
+ // - The pruned UID must be `uid_1` (score=1).
318
+ // - The owner's UID remains unpruned.
319
+ assert_eq ! (
320
+ pruned_uid, uid_1,
321
+ "Should prune the neuron with pruning score=1, not the owner (score=0)."
322
+ ) ;
323
+
324
+ let pruned_score = SubtensorModule :: get_pruning_score_for_uid ( netuid, uid_1) ;
325
+ assert_eq ! (
326
+ pruned_score,
327
+ u16 :: MAX ,
328
+ "Pruned neuron's score should be set to u16::MAX"
329
+ ) ;
330
+
331
+ let owner_score = SubtensorModule :: get_pruning_score_for_uid ( netuid, owner_uid) ;
332
+ assert_eq ! (
333
+ owner_score, 0 ,
334
+ "Owner's pruning score remains 0, indicating it was skipped"
335
+ ) ;
336
+ } ) ;
337
+ }
0 commit comments