@@ -2,6 +2,7 @@ use super::*;
2
2
extern crate alloc;
3
3
use crate :: epoch:: math:: * ;
4
4
use codec:: Compact ;
5
+ use frame_support:: IterableStorageDoubleMap ;
5
6
use frame_support:: pallet_prelude:: { Decode , Encode } ;
6
7
use substrate_fixed:: types:: I64F64 ;
7
8
use substrate_fixed:: types:: I96F32 ;
@@ -107,7 +108,7 @@ pub struct Metagraph<AccountId: TypeInfo + Encode + Decode> {
107
108
alpha_dividends_per_hotkey : Vec < ( AccountId , Compact < u64 > ) > , // List of dividend payout in alpha via subnet.
108
109
}
109
110
110
- #[ freeze_struct( "182c7375fee9db7b " ) ]
111
+ #[ freeze_struct( "2eca518cf84390fa " ) ]
111
112
#[ derive( Decode , Encode , PartialEq , Eq , Clone , Debug , TypeInfo ) ]
112
113
pub struct SelectiveMetagraph < AccountId : TypeInfo + Encode + Decode + Clone > {
113
114
// Subnet index
@@ -205,6 +206,9 @@ pub struct SelectiveMetagraph<AccountId: TypeInfo + Encode + Decode + Clone> {
205
206
// Dividend break down.
206
207
tao_dividends_per_hotkey : Option < Vec < ( AccountId , Compact < u64 > ) > > , // List of dividend payouts in tao via root.
207
208
alpha_dividends_per_hotkey : Option < Vec < ( AccountId , Compact < u64 > ) > > , // List of dividend payout in alpha via subnet.
209
+
210
+ // validators
211
+ validators : Option < Vec < Compact < u16 > > > , // List of validators
208
212
}
209
213
210
214
impl < AccountId > SelectiveMetagraph < AccountId >
@@ -361,7 +365,7 @@ where
361
365
Some ( SelectiveMetagraphIndex :: AlphaDividendsPerHotkey ) => {
362
366
self . alpha_dividends_per_hotkey = other. alpha_dividends_per_hotkey . clone ( )
363
367
}
364
-
368
+ Some ( SelectiveMetagraphIndex :: Validators ) => self . validators = other . validators . clone ( ) ,
365
369
None => { }
366
370
} ;
367
371
}
@@ -445,6 +449,7 @@ where
445
449
total_stake : None ,
446
450
tao_dividends_per_hotkey : None ,
447
451
alpha_dividends_per_hotkey : None ,
452
+ validators : None ,
448
453
}
449
454
}
450
455
}
@@ -522,6 +527,7 @@ pub enum SelectiveMetagraphIndex {
522
527
TotalStake ,
523
528
TaoDividendsPerHotkey ,
524
529
AlphaDividendsPerHotkey ,
530
+ Validators ,
525
531
}
526
532
527
533
impl SelectiveMetagraphIndex {
@@ -599,6 +605,7 @@ impl SelectiveMetagraphIndex {
599
605
69 => Some ( SelectiveMetagraphIndex :: TotalStake ) ,
600
606
70 => Some ( SelectiveMetagraphIndex :: TaoDividendsPerHotkey ) ,
601
607
71 => Some ( SelectiveMetagraphIndex :: AlphaDividendsPerHotkey ) ,
608
+ 72 => Some ( SelectiveMetagraphIndex :: Validators ) ,
602
609
_ => None ,
603
610
}
604
611
}
@@ -1356,13 +1363,53 @@ impl<T: Config> Pallet<T> {
1356
1363
..Default :: default ( )
1357
1364
}
1358
1365
}
1366
+ Some ( SelectiveMetagraphIndex :: Validators ) => Self :: get_validators ( netuid) ,
1359
1367
None => SelectiveMetagraph {
1360
1368
// Subnet index
1361
1369
netuid : netuid. into ( ) ,
1362
1370
..Default :: default ( )
1363
1371
} ,
1364
1372
}
1365
1373
}
1374
+
1375
+ fn get_validators ( netuid : u16 ) -> SelectiveMetagraph < T :: AccountId > {
1376
+ let stake_threshold = Self :: get_stake_threshold ( ) ;
1377
+ let hotkeys: Vec < ( u16 , T :: AccountId ) > =
1378
+ <Keys < T > as IterableStorageDoubleMap < u16 , u16 , T :: AccountId > >:: iter_prefix ( netuid)
1379
+ . collect ( ) ;
1380
+ let validator_permits: Vec < bool > = Self :: get_validator_permit ( netuid) ;
1381
+
1382
+ // filter according to validator_permits
1383
+ let hotkeys: Vec < & ( u16 , T :: AccountId ) > = hotkeys
1384
+ . iter ( )
1385
+ . filter ( |( uid, _) | * validator_permits. get ( * uid as usize ) . unwrap_or ( & false ) )
1386
+ . collect :: < Vec < _ > > ( ) ;
1387
+
1388
+ // map hotkeys to validators with stake
1389
+ let mut validators: Vec < ( u16 , I64F64 ) > = hotkeys
1390
+ . iter ( )
1391
+ . map ( |( uid, hotkey) | {
1392
+ let stake = Self :: get_stake_weights_for_hotkey_on_subnet ( hotkey, netuid) ;
1393
+ ( * uid, stake. 0 )
1394
+ } )
1395
+ . collect ( ) ;
1396
+
1397
+ // sort validators by stake
1398
+ validators. sort_by ( |a, b| a. 1 . cmp ( & b. 1 ) ) ;
1399
+
1400
+ let validators: Vec < Compact < u16 > > = validators
1401
+ . iter ( )
1402
+ . filter ( |( _uid, stake) | * stake > stake_threshold)
1403
+ . map ( |( uid, _) | Compact :: from ( * uid) )
1404
+ . collect :: < Vec < _ > > ( ) ;
1405
+
1406
+ SelectiveMetagraph {
1407
+ // Subnet index
1408
+ netuid : netuid. into ( ) ,
1409
+ validators : Some ( validators) ,
1410
+ ..Default :: default ( )
1411
+ }
1412
+ }
1366
1413
}
1367
1414
1368
1415
#[ test]
@@ -1441,6 +1488,7 @@ fn test_selective_metagraph() {
1441
1488
total_stake : None ,
1442
1489
tao_dividends_per_hotkey : None ,
1443
1490
alpha_dividends_per_hotkey : None ,
1491
+ validators : None ,
1444
1492
} ;
1445
1493
1446
1494
// test init value
0 commit comments