@@ -5,7 +5,6 @@ use crate::*;
5
5
use frame_support:: { assert_err, assert_ok} ;
6
6
use frame_system:: Config ;
7
7
use sp_core:: U256 ;
8
- use substrate_fixed:: types:: I64F64 ;
9
8
10
9
/********************************************
11
10
tests for uids.rs file
@@ -281,10 +280,11 @@ fn test_replace_neuron_subnet_owner_not_replaced() {
281
280
}
282
281
283
282
#[ test]
284
- fn test_get_neuron_to_prune_owner_not_pruned ( ) {
283
+ fn test_replace_neuron_subnet_owner_not_replaced_if_in_sn_owner_hotkey_map ( ) {
285
284
new_test_ext ( 1 ) . execute_with ( || {
286
285
let owner_hotkey = U256 :: from ( 123 ) ;
287
286
let owner_coldkey = U256 :: from ( 999 ) ;
287
+ let other_owner_hotkey = U256 :: from ( 456 ) ;
288
288
289
289
let netuid = add_dynamic_network ( & owner_hotkey, & owner_coldkey) ;
290
290
@@ -295,54 +295,64 @@ fn test_get_neuron_to_prune_owner_not_pruned() {
295
295
let owner_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & owner_hotkey)
296
296
. expect ( "Owner neuron should already be registered by add_dynamic_network" ) ;
297
297
298
- let additional_hotkey_1 = U256 :: from ( 1000 ) ;
299
- let additional_coldkey_1 = U256 :: from ( 2000 ) ;
298
+ // Register another hotkey for the owner
299
+ register_ok_neuron ( netuid, other_owner_hotkey, owner_coldkey, 0 ) ;
300
+ let other_owner_uid =
301
+ SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & other_owner_hotkey)
302
+ . expect ( "Should be registered" ) ;
300
303
304
+ let additional_hotkey_1 = U256 :: from ( 1000 ) ;
301
305
let additional_hotkey_2 = U256 :: from ( 1001 ) ;
302
- let additional_coldkey_2 = U256 :: from ( 2001 ) ;
303
-
304
- register_ok_neuron ( netuid, additional_hotkey_1, additional_coldkey_1, 0 ) ;
305
- let uid_1 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_1)
306
- . expect ( "Should be registered" ) ;
307
306
308
- register_ok_neuron ( netuid, additional_hotkey_2, additional_coldkey_2, 1 ) ;
309
- let uid_2 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_2)
310
- . expect ( "Should be registered" ) ;
311
-
312
- SubtensorModule :: set_pruning_score_for_uid ( netuid, owner_uid, 0 ) ;
313
- SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_1, 1 ) ;
314
- SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_2, 2 ) ;
315
-
316
- let pruned_uid = SubtensorModule :: get_neuron_to_prune ( netuid) ;
307
+ let current_block = SubtensorModule :: get_current_block_as_u64 ( ) ;
308
+ SubtensorModule :: replace_neuron ( netuid, owner_uid, & additional_hotkey_1, current_block) ;
317
309
318
- // - The pruned UID must be `uid_1` (score=1).
319
- // - The owner's UID remains unpruned.
310
+ let still_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid , & owner_hotkey ) ;
311
+ assert_ok ! ( still_uid ) ;
320
312
assert_eq ! (
321
- pruned_uid, uid_1,
322
- "Should prune the neuron with pruning score=1, not the owner (score=0)."
313
+ still_uid. unwrap( ) ,
314
+ owner_uid,
315
+ "Owner's first hotkey should remain registered"
323
316
) ;
324
317
325
- let pruned_score = SubtensorModule :: get_pruning_score_for_uid ( netuid, uid_1) ;
326
- assert_eq ! (
327
- pruned_score,
328
- u16 :: MAX ,
329
- "Pruned neuron's score should be set to u16::MAX"
330
- ) ;
318
+ let new_key_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_1) ;
319
+ assert_err ! ( new_key_uid, Error :: <Test >:: HotKeyNotRegisteredInSubNet , ) ;
331
320
332
- let owner_score = SubtensorModule :: get_pruning_score_for_uid ( netuid, owner_uid) ;
333
- assert_eq ! (
334
- owner_score, 0 ,
335
- "Owner's pruning score remains 0, indicating it was skipped"
321
+ // Try to replace the other owner hotkey
322
+ SubtensorModule :: replace_neuron (
323
+ netuid,
324
+ other_owner_uid,
325
+ & additional_hotkey_1,
326
+ current_block,
336
327
) ;
328
+ let still_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & other_owner_hotkey) ;
329
+ assert_err ! ( still_uid, Error :: <Test >:: HotKeyNotRegisteredInSubNet , ) ; // Was replaced
330
+
331
+ // Re-register this hotkey
332
+ register_ok_neuron ( netuid, other_owner_hotkey, owner_coldkey, 0 ) ;
333
+ let _other_owner_uid =
334
+ SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & other_owner_hotkey)
335
+ . expect ( "Should be registered" ) ;
336
+
337
+ // Set this hotkey as the SubnetOwnerHotkey
338
+ SubnetOwnerHotkey :: < Test > :: insert ( netuid, other_owner_hotkey) ;
339
+
340
+ SubtensorModule :: replace_neuron ( netuid, owner_uid, & additional_hotkey_2, current_block) ;
341
+
342
+ // The owner's first hotkey should be replaceable; it's not the top-stake owner hotkey
343
+ let still_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & owner_hotkey) ;
344
+ assert_err ! ( still_uid, Error :: <Test >:: HotKeyNotRegisteredInSubNet , ) ;
345
+
346
+ let new_key_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_2) ;
347
+ assert_ok ! ( new_key_uid) ;
337
348
} ) ;
338
349
}
339
350
340
351
#[ test]
341
- fn test_get_neuron_to_prune_owner_pruned_if_not_top_stake_owner_hotkey ( ) {
352
+ fn test_get_neuron_to_prune_owner_not_pruned ( ) {
342
353
new_test_ext ( 1 ) . execute_with ( || {
343
354
let owner_hotkey = U256 :: from ( 123 ) ;
344
355
let owner_coldkey = U256 :: from ( 999 ) ;
345
- let other_owner_hotkey = U256 :: from ( 456 ) ;
346
356
347
357
let netuid = add_dynamic_network ( & owner_hotkey, & owner_coldkey) ;
348
358
@@ -353,68 +363,54 @@ fn test_get_neuron_to_prune_owner_pruned_if_not_top_stake_owner_hotkey() {
353
363
let owner_uid = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & owner_hotkey)
354
364
. expect ( "Owner neuron should already be registered by add_dynamic_network" ) ;
355
365
356
- // Register another hotkey for the owner
357
- register_ok_neuron ( netuid, other_owner_hotkey, owner_coldkey, 0 ) ;
358
- let other_owner_uid =
359
- SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & other_owner_hotkey)
360
- . expect ( "Should be registered" ) ;
361
-
362
366
let additional_hotkey_1 = U256 :: from ( 1000 ) ;
363
367
let additional_coldkey_1 = U256 :: from ( 2000 ) ;
364
368
365
369
let additional_hotkey_2 = U256 :: from ( 1001 ) ;
366
370
let additional_coldkey_2 = U256 :: from ( 2001 ) ;
367
371
368
- register_ok_neuron ( netuid, additional_hotkey_1, additional_coldkey_1, 1 ) ;
369
- let uid_2 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_1)
372
+ register_ok_neuron ( netuid, additional_hotkey_1, additional_coldkey_1, 0 ) ;
373
+ let uid_1 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_1)
370
374
. expect ( "Should be registered" ) ;
371
375
372
- register_ok_neuron ( netuid, additional_hotkey_2, additional_coldkey_2, 2 ) ;
373
- let uid_3 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_2)
376
+ register_ok_neuron ( netuid, additional_hotkey_2, additional_coldkey_2, 1 ) ;
377
+ let uid_2 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_2)
374
378
. expect ( "Should be registered" ) ;
375
379
376
380
SubtensorModule :: set_pruning_score_for_uid ( netuid, owner_uid, 0 ) ;
377
- // Other owner key has pruning score not worse than the owner's first hotkey, but worse than the additional hotkeys
378
- SubtensorModule :: set_pruning_score_for_uid ( netuid, other_owner_uid, 1 ) ;
381
+ SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_1, 1 ) ;
379
382
SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_2, 2 ) ;
380
- SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_3, 3 ) ;
381
383
382
384
let pruned_uid = SubtensorModule :: get_neuron_to_prune ( netuid) ;
383
- assert_eq ! ( pruned_uid, other_owner_uid, "Should prune the owner" ) ;
384
385
385
- // Give the owner's other hotkey some stake
386
- SubtensorModule :: increase_stake_for_hotkey_and_coldkey_on_subnet (
387
- & other_owner_hotkey,
388
- & owner_coldkey,
389
- netuid,
390
- 1000 ,
386
+ // - The pruned UID must be `uid_1` (score=1).
387
+ // - The owner's UID remains unpruned.
388
+ assert_eq ! (
389
+ pruned_uid, uid_1,
390
+ "Should prune the neuron with pruning score=1, not the owner (score=0)."
391
391
) ;
392
392
393
- // Reset pruning scores
394
- SubtensorModule :: set_pruning_score_for_uid ( netuid, owner_uid, 0 ) ;
395
- SubtensorModule :: set_pruning_score_for_uid ( netuid, other_owner_uid, 1 ) ;
396
- SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_2, 2 ) ;
397
- SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_3, 3 ) ;
398
-
399
- let pruned_uid = SubtensorModule :: get_neuron_to_prune ( netuid) ;
393
+ let pruned_score = SubtensorModule :: get_pruning_score_for_uid ( netuid, uid_1) ;
394
+ assert_eq ! (
395
+ pruned_score,
396
+ u16 :: MAX ,
397
+ "Pruned neuron's score should be set to u16::MAX"
398
+ ) ;
400
399
401
- // - The pruned UID must be `uid_1` (score=1).
402
- // - The owner's UID remains unpruned.
400
+ let owner_score = SubtensorModule :: get_pruning_score_for_uid ( netuid, owner_uid) ;
403
401
assert_eq ! (
404
- pruned_uid , owner_uid ,
405
- "Should prune the owner, not the top-stake owner hotkey and not the additional hotkeys "
402
+ owner_score , 0 ,
403
+ "Owner's pruning score remains 0, indicating it was skipped "
406
404
) ;
407
405
} ) ;
408
406
}
409
407
410
408
#[ test]
411
- fn test_get_neuron_to_prune_owner_pruned_if_not_top_stake_owner_hotkey_chk ( ) {
409
+ fn test_get_neuron_to_prune_owner_pruned_if_not_in_sn_owner_hotkey_map ( ) {
412
410
new_test_ext ( 1 ) . execute_with ( || {
413
411
let owner_hotkey = U256 :: from ( 123 ) ;
414
412
let owner_coldkey = U256 :: from ( 999 ) ;
415
413
let other_owner_hotkey = U256 :: from ( 456 ) ;
416
- let parent_hotkey = U256 :: from ( 4567 ) ;
417
- let parent_coldkey = U256 :: from ( 4568 ) ;
418
414
419
415
let netuid = add_dynamic_network ( & owner_hotkey, & owner_coldkey) ;
420
416
@@ -445,60 +441,26 @@ fn test_get_neuron_to_prune_owner_pruned_if_not_top_stake_owner_hotkey_chk() {
445
441
let uid_3 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & additional_hotkey_2)
446
442
. expect ( "Should be registered" ) ;
447
443
448
- register_ok_neuron ( netuid, parent_hotkey, parent_coldkey, 3 ) ;
449
- let uid_4: u16 = SubtensorModule :: get_uid_for_net_and_hotkey ( netuid, & parent_hotkey)
450
- . expect ( "Should be registered" ) ;
451
-
452
- // Give parent key some stake
453
- SubtensorModule :: increase_stake_for_hotkey_and_coldkey_on_subnet (
454
- & parent_hotkey,
455
- & parent_coldkey,
456
- netuid,
457
- 10_000_000 ,
458
- ) ;
459
-
460
444
SubtensorModule :: set_pruning_score_for_uid ( netuid, owner_uid, 0 ) ;
461
445
// Other owner key has pruning score not worse than the owner's first hotkey, but worse than the additional hotkeys
462
446
SubtensorModule :: set_pruning_score_for_uid ( netuid, other_owner_uid, 1 ) ;
463
447
SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_2, 2 ) ;
464
448
SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_3, 3 ) ;
465
449
466
- // Ensure parent key is not pruned
467
- SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_4, 10_000 ) ;
468
-
469
450
let pruned_uid = SubtensorModule :: get_neuron_to_prune ( netuid) ;
470
- assert_eq ! (
471
- pruned_uid, other_owner_uid,
472
- "Should prune the owner's other hotkey"
473
- ) ;
451
+ assert_eq ! ( pruned_uid, other_owner_uid, "Should prune the owner" ) ;
474
452
475
- // Give the owner's other hotkey some CHK stake; Doesn't need to be much
476
- mock_set_children_no_epochs (
477
- netuid,
478
- & parent_hotkey,
479
- & [ (
480
- I64F64 :: saturating_from_num ( 0.1 )
481
- . saturating_mul ( I64F64 :: saturating_from_num ( u64:: MAX ) )
482
- . saturating_to_num :: < u64 > ( ) ,
483
- other_owner_hotkey,
484
- ) ] ,
485
- ) ;
486
- // Check stake weight of other_owner_hotkey
487
- let stake_weight =
488
- SubtensorModule :: get_stake_weights_for_hotkey_on_subnet ( & other_owner_hotkey, netuid) ;
489
- assert ! ( stake_weight. 0 > 0 ) ;
453
+ // Set the owner's other hotkey as the SubnetOwnerHotkey
454
+ SubnetOwnerHotkey :: < Test > :: insert ( netuid, other_owner_hotkey) ;
490
455
491
456
// Reset pruning scores
492
457
SubtensorModule :: set_pruning_score_for_uid ( netuid, owner_uid, 0 ) ;
493
458
SubtensorModule :: set_pruning_score_for_uid ( netuid, other_owner_uid, 1 ) ;
494
459
SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_2, 2 ) ;
495
460
SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_3, 3 ) ;
496
- SubtensorModule :: set_pruning_score_for_uid ( netuid, uid_4, 10_000 ) ;
497
461
498
462
let pruned_uid = SubtensorModule :: get_neuron_to_prune ( netuid) ;
499
463
500
- // - The pruned UID must be `uid_1` (score=1).
501
- // - The owner's UID remains unpruned.
502
464
assert_eq ! (
503
465
pruned_uid, owner_uid,
504
466
"Should prune the owner, not the top-stake owner hotkey and not the additional hotkeys"
0 commit comments