@@ -863,12 +863,20 @@ pub mod pallet {
863863 impl < T : Config > BuildGenesisConfig for GenesisConfig < T > {
864864 fn build ( & self ) {
865865 crate :: log!( trace, "initializing with {:?}" , self ) ;
866+ assert ! (
867+ self . validator_count <=
868+ <T :: ElectionProvider as ElectionProvider >:: MaxWinnersPerPage :: get( ) *
869+ <T :: ElectionProvider as ElectionProvider >:: Pages :: get( ) ,
870+ "validator count is too high, `ElectionProvider` can never fulfill this"
871+ ) ;
866872 ValidatorCount :: < T > :: put ( self . validator_count ) ;
873+
867874 assert ! (
868875 self . invulnerables. len( ) as u32 <= T :: MaxInvulnerables :: get( ) ,
869876 "Too many invulnerable validators at genesis."
870877 ) ;
871878 <Invulnerables < T > >:: put ( & self . invulnerables ) ;
879+
872880 ForceEra :: < T > :: put ( self . force_era ) ;
873881 CanceledSlashPayout :: < T > :: put ( self . canceled_payout ) ;
874882 SlashRewardFraction :: < T > :: put ( self . slash_reward_fraction ) ;
@@ -881,39 +889,80 @@ pub mod pallet {
881889 MaxNominatorsCount :: < T > :: put ( x) ;
882890 }
883891
892+ // First pass: set up all validators and idle stakers
884893 for & ( ref stash, balance, ref status) in & self . stakers {
885- crate :: log!(
886- trace,
887- "inserting genesis staker: {:?} => {:?} => {:?}" ,
888- stash,
889- balance,
890- status
891- ) ;
892- assert ! (
893- asset:: free_to_stake:: <T >( stash) >= balance,
894- "Stash does not have enough balance to bond."
895- ) ;
896- assert_ok ! ( <Pallet <T >>:: bond(
897- T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
898- balance,
899- RewardDestination :: Staked ,
900- ) ) ;
901- assert_ok ! ( match status {
902- crate :: StakerStatus :: Validator => <Pallet <T >>:: validate(
903- T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
904- Default :: default ( ) ,
905- ) ,
906- crate :: StakerStatus :: Nominator ( votes) => <Pallet <T >>:: nominate(
907- T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
908- votes. iter( ) . map( |l| T :: Lookup :: unlookup( l. clone( ) ) ) . collect( ) ,
909- ) ,
910- _ => Ok ( ( ) ) ,
911- } ) ;
912- assert ! (
913- ValidatorCount :: <T >:: get( ) <=
914- <T :: ElectionProvider as ElectionProvider >:: MaxWinnersPerPage :: get( ) *
915- <T :: ElectionProvider as ElectionProvider >:: Pages :: get( )
916- ) ;
894+ match status {
895+ crate :: StakerStatus :: Validator => {
896+ crate :: log!(
897+ trace,
898+ "inserting genesis validator: {:?} => {:?} => {:?}" ,
899+ stash,
900+ balance,
901+ status
902+ ) ;
903+ assert ! (
904+ asset:: free_to_stake:: <T >( stash) >= balance,
905+ "Stash does not have enough balance to bond."
906+ ) ;
907+ assert_ok ! ( <Pallet <T >>:: bond(
908+ T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
909+ balance,
910+ RewardDestination :: Staked ,
911+ ) ) ;
912+ assert_ok ! ( <Pallet <T >>:: validate(
913+ T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
914+ Default :: default ( ) ,
915+ ) ) ;
916+ } ,
917+ crate :: StakerStatus :: Idle => {
918+ crate :: log!(
919+ trace,
920+ "inserting genesis idle staker: {:?} => {:?} => {:?}" ,
921+ stash,
922+ balance,
923+ status
924+ ) ;
925+ assert ! (
926+ asset:: free_to_stake:: <T >( stash) >= balance,
927+ "Stash does not have enough balance to bond."
928+ ) ;
929+ assert_ok ! ( <Pallet <T >>:: bond(
930+ T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
931+ balance,
932+ RewardDestination :: Staked ,
933+ ) ) ;
934+ } ,
935+ _ => { } ,
936+ }
937+ }
938+
939+ // Second pass: set up all nominators (now that validators exist)
940+ for & ( ref stash, balance, ref status) in & self . stakers {
941+ match status {
942+ crate :: StakerStatus :: Nominator ( votes) => {
943+ crate :: log!(
944+ trace,
945+ "inserting genesis nominator: {:?} => {:?} => {:?}" ,
946+ stash,
947+ balance,
948+ status
949+ ) ;
950+ assert ! (
951+ asset:: free_to_stake:: <T >( stash) >= balance,
952+ "Stash does not have enough balance to bond."
953+ ) ;
954+ assert_ok ! ( <Pallet <T >>:: bond(
955+ T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
956+ balance,
957+ RewardDestination :: Staked ,
958+ ) ) ;
959+ assert_ok ! ( <Pallet <T >>:: nominate(
960+ T :: RuntimeOrigin :: from( Some ( stash. clone( ) ) . into( ) ) ,
961+ votes. iter( ) . map( |l| T :: Lookup :: unlookup( l. clone( ) ) ) . collect( ) ,
962+ ) ) ;
963+ } ,
964+ _ => { } ,
965+ }
917966 }
918967
919968 // all voters are reported to the `VoterList`.
@@ -1569,7 +1618,9 @@ pub mod pallet {
15691618 let targets: BoundedVec < _ , _ > = targets
15701619 . into_iter ( )
15711620 . map ( |n| {
1572- if old. contains ( & n) || !Validators :: < T > :: get ( & n) . blocked {
1621+ if old. contains ( & n) ||
1622+ ( Validators :: < T > :: contains_key ( & n) && !Validators :: < T > :: get ( & n) . blocked )
1623+ {
15731624 Ok ( n)
15741625 } else {
15751626 Err ( Error :: < T > :: BadTarget . into ( ) )
0 commit comments