@@ -955,4 +955,181 @@ mod tests {
955955 assert_eq ! ( sync. governance( ) . block_height( ) , 1_000_000 ) ;
956956 assert_eq ! ( sync. governance( ) . total_stake( ) . 0 , 300_000_000_000 ) ;
957957 }
958+
959+ #[ tokio:: test]
960+ async fn test_governance_pbft_new ( ) {
961+ let keypair = Keypair :: generate ( ) ;
962+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
963+ keypair. hotkey ( ) ,
964+ platform_core:: NetworkConfig :: default ( ) ,
965+ ) ) ) ;
966+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
967+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
968+
969+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
970+
971+ // Verify initialization - governance status
972+ let status = gov_pbft. governance_status ( ) ;
973+ assert ! ( status. is_bootstrap_period) ;
974+ }
975+
976+ #[ tokio:: test]
977+ async fn test_set_block_height ( ) {
978+ let keypair = Keypair :: generate ( ) ;
979+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
980+ keypair. hotkey ( ) ,
981+ platform_core:: NetworkConfig :: default ( ) ,
982+ ) ) ) ;
983+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
984+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
985+
986+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
987+
988+ gov_pbft. set_block_height ( 5000 ) ;
989+ assert_eq ! ( gov_pbft. governance. stake_governance( ) . block_height( ) , 5000 ) ;
990+ }
991+
992+ #[ tokio:: test]
993+ async fn test_update_stakes_from_metagraph ( ) {
994+ let keypair = Keypair :: generate ( ) ;
995+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
996+ keypair. hotkey ( ) ,
997+ platform_core:: NetworkConfig :: default ( ) ,
998+ ) ) ) ;
999+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
1000+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
1001+
1002+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
1003+
1004+ let validators = vec ! [
1005+ ValidatorInfo :: new( Hotkey ( [ 1u8 ; 32 ] ) , Stake ( 100_000_000_000 ) ) ,
1006+ ValidatorInfo :: new( Hotkey ( [ 2u8 ; 32 ] ) , Stake ( 200_000_000_000 ) ) ,
1007+ ] ;
1008+
1009+ gov_pbft. update_stakes_from_metagraph ( & validators) ;
1010+
1011+ assert_eq ! (
1012+ gov_pbft. governance. stake_governance( ) . total_stake( ) . 0 ,
1013+ 300_000_000_000
1014+ ) ;
1015+ }
1016+
1017+ #[ tokio:: test]
1018+ async fn test_execute_sudo_action_bootstrap_non_owner ( ) {
1019+ let keypair = Keypair :: generate ( ) ;
1020+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
1021+ keypair. hotkey ( ) ,
1022+ platform_core:: NetworkConfig :: default ( ) ,
1023+ ) ) ) ;
1024+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
1025+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
1026+
1027+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
1028+
1029+ gov_pbft. set_block_height ( 1000 ) ; // In bootstrap period
1030+
1031+ let action = SudoAction :: UpdateConfig {
1032+ config : platform_core:: NetworkConfig :: default ( ) ,
1033+ } ;
1034+
1035+ let result = gov_pbft. execute_sudo_action ( action) . await ;
1036+ assert ! ( result. is_err( ) ) ;
1037+ }
1038+
1039+ #[ tokio:: test]
1040+ async fn test_governance_status ( ) {
1041+ let keypair = Keypair :: generate ( ) ;
1042+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
1043+ keypair. hotkey ( ) ,
1044+ platform_core:: NetworkConfig :: default ( ) ,
1045+ ) ) ) ;
1046+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
1047+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
1048+
1049+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
1050+
1051+ let status = gov_pbft. governance_status ( ) ;
1052+ assert_eq ! ( status. current_block, 0 ) ;
1053+ assert ! ( status. is_bootstrap_period) ;
1054+ }
1055+
1056+ #[ tokio:: test]
1057+ async fn test_active_proposals ( ) {
1058+ let keypair = Keypair :: generate ( ) ;
1059+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
1060+ keypair. hotkey ( ) ,
1061+ platform_core:: NetworkConfig :: default ( ) ,
1062+ ) ) ) ;
1063+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
1064+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
1065+
1066+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
1067+
1068+ let proposals = gov_pbft. active_proposals ( ) ;
1069+ assert_eq ! ( proposals. len( ) , 0 ) ;
1070+ }
1071+
1072+ #[ tokio:: test]
1073+ async fn test_stake_for_consensus ( ) {
1074+ let keypair = Keypair :: generate ( ) ;
1075+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
1076+ keypair. hotkey ( ) ,
1077+ platform_core:: NetworkConfig :: default ( ) ,
1078+ ) ) ) ;
1079+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
1080+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
1081+
1082+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
1083+
1084+ let ( required, threshold) = gov_pbft. stake_for_consensus ( ) ;
1085+ assert_eq ! ( threshold, crate :: stake_governance:: STAKE_THRESHOLD_PERCENT ) ;
1086+ }
1087+
1088+ #[ tokio:: test]
1089+ async fn test_execute_sudo_action_post_bootstrap ( ) {
1090+ let keypair = Keypair :: generate ( ) ;
1091+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
1092+ keypair. hotkey ( ) ,
1093+ platform_core:: NetworkConfig :: default ( ) ,
1094+ ) ) ) ;
1095+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
1096+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
1097+
1098+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
1099+ gov_pbft. set_block_height ( crate :: stake_governance:: BOOTSTRAP_END_BLOCK + 1 ) ;
1100+
1101+ // Add stake for the validator
1102+ let validators = vec ! [ ValidatorInfo :: new(
1103+ gov_pbft. keypair. hotkey( ) ,
1104+ Stake ( 100_000_000_000 ) ,
1105+ ) ] ;
1106+ gov_pbft. update_stakes_from_metagraph ( & validators) ;
1107+
1108+ let action = SudoAction :: UpdateConfig {
1109+ config : platform_core:: NetworkConfig :: default ( ) ,
1110+ } ;
1111+
1112+ let result = gov_pbft. execute_sudo_action ( action) . await ;
1113+ assert ! ( result. is_ok( ) ) ;
1114+ assert ! ( matches!(
1115+ result. unwrap( ) ,
1116+ SudoExecutionResult :: ProposalCreated { .. }
1117+ ) ) ;
1118+ }
1119+
1120+ #[ tokio:: test]
1121+ async fn test_can_use_bootstrap_false ( ) {
1122+ let keypair = Keypair :: generate ( ) ;
1123+ let state = Arc :: new ( RwLock :: new ( ChainState :: new (
1124+ keypair. hotkey ( ) ,
1125+ platform_core:: NetworkConfig :: default ( ) ,
1126+ ) ) ) ;
1127+ let ( tx, _rx) = tokio:: sync:: mpsc:: channel ( 100 ) ;
1128+ let pbft = Arc :: new ( PBFTEngine :: new ( keypair. clone ( ) , state. clone ( ) , tx) ) ;
1129+
1130+ let gov_pbft = GovernancePBFT :: new ( pbft, state, keypair) ;
1131+ gov_pbft. set_block_height ( 1000 ) ;
1132+
1133+ assert ! ( !gov_pbft. can_use_bootstrap( ) ) ;
1134+ }
9581135}
0 commit comments