@@ -35,7 +35,7 @@ const CANDIDATE_LIMIT = 2000;
3535
3636describe ( "Governance" , function ( ) {
3737
38- let Governance : any ;
38+ let Governance : any , Policy : any ;
3939 let user : any , candidate1 : any , candidate2 : any ;
4040
4141 beforeEach ( async function ( ) {
@@ -59,8 +59,11 @@ describe("Governance", function () {
5959
6060 const policy_code = await ethers . provider . send ( "eth_getCode" , [ policy_deploy . target ] ) ;
6161 await ethers . provider . send ( "hardhat_setCode" , [ POLICY_PROXY , policy_code ] ) ;
62- const contract = require ( "../artifacts/solidity/Governance.sol/Governance.json" ) ;
63- Governance = new ethers . Contract ( GOV_PROXY , contract . abi , user ) ;
62+
63+ const governance_contract = require ( "../artifacts/solidity/Governance.sol/Governance.json" ) ;
64+ Governance = new ethers . Contract ( GOV_PROXY , governance_contract . abi , user ) ;
65+ const policy_contract = require ( "../artifacts/solidity/Policy.sol/Policy.json" ) ;
66+ Policy = new ethers . Contract ( POLICY_PROXY , policy_contract . abi , user ) ;
6467
6568 // Write Governance config to storage
6669 await ethers . provider . send ( "hardhat_setStorageAt" , [ GOV_PROXY , "0x1" , ethers . toBeHex ( CONSENSUS_SIZE , 32 ) ] ) ;
@@ -86,7 +89,7 @@ describe("Governance", function () {
8689 await ethers . provider . send ( "hardhat_setStorageAt" , [ GOV_PROXY , "0x31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6c" , ethers . toBeHex ( STANDBY_VALIDATORS [ 4 ] , 32 ) ] ) ;
8790 await ethers . provider . send ( "hardhat_setStorageAt" , [ GOV_PROXY , "0x31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6d" , ethers . toBeHex ( STANDBY_VALIDATORS [ 5 ] , 32 ) ] ) ;
8891 await ethers . provider . send ( "hardhat_setStorageAt" , [ GOV_PROXY , "0x31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6e" , ethers . toBeHex ( STANDBY_VALIDATORS [ 6 ] , 32 ) ] ) ;
89-
92+
9093 // Write Policy config to storage
9194 await ethers . provider . send ( "hardhat_setStorageAt" , [ POLICY_PROXY , "0x2" , ethers . toBeHex ( MIN_GAS_TIP_CAP , 32 ) ] ) ;
9295 await ethers . provider . send ( "hardhat_setStorageAt" , [ POLICY_PROXY , "0x3" , ethers . toBeHex ( BASE_FEE , 32 ) ] ) ;
@@ -399,6 +402,59 @@ describe("Governance", function () {
399402 await MockSysCall . call_onPersist ( Governance )
400403 ) . to . changeEtherBalance ( STANDBY_VALIDATORS [ 0 ] , 1000000000000000000n ) ;
401404 } ) ;
405+
406+ it ( "Should reject blacklisted addresses in election" , async function ( ) {
407+ let signers = await ethers . getSigners ( ) ;
408+ for ( let i = 0 ; i < CONSENSUS_SIZE ; i ++ ) {
409+ await Governance . connect ( signers [ i ] ) . registerCandidate ( 500 , { value : REGISTER_FEE } ) ;
410+ await Governance . connect ( signers [ i ] ) . vote ( signers [ i ] , { value : VOTE_TARGET_AMOUNT } ) ;
411+ }
412+ await mine ( EPOCH_DURATION ) ;
413+ await MockSysCall . call_onPersist ( Governance ) ;
414+
415+ // Register a new candidate and vote
416+ await Governance . connect ( signers [ CONSENSUS_SIZE ] ) . registerCandidate ( 500 , { value : REGISTER_FEE } ) ;
417+ await Governance . connect ( signers [ CONSENSUS_SIZE ] ) . vote ( signers [ CONSENSUS_SIZE ] , { value : 2n * VOTE_TARGET_AMOUNT } ) ;
418+
419+ // Add this candidate to blacklist
420+ for ( let i = 0 ; i < 4 ; i ++ ) {
421+ await expect (
422+ Policy . connect ( signers [ i ] ) . addBlackList ( signers [ 1 ] )
423+ ) . not . to . be . reverted ;
424+ }
425+ expect ( await Policy . isBlackListed ( signers [ 1 ] ) ) . to . eq ( true ) ;
426+
427+ // Check election result
428+ await mine ( EPOCH_DURATION ) ;
429+ await MockSysCall . call_onPersist ( Governance ) ;
430+ let consensus = await Governance . getCurrentConsensus ( ) ;
431+ for ( let i = 0 ; i < CONSENSUS_SIZE ; i ++ ) {
432+ expect ( consensus [ i ] ) . to . not . eq ( signers [ 1 ] . address ) ;
433+ }
434+ } ) ;
435+
436+ it ( "Should take standby validators as consensus if good addresses are fewer than threshold" , async function ( ) {
437+ let signers = await ethers . getSigners ( ) ;
438+ for ( let i = 0 ; i < CONSENSUS_SIZE ; i ++ ) {
439+ await Governance . connect ( signers [ i ] ) . registerCandidate ( 500 , { value : REGISTER_FEE } ) ;
440+ await Governance . connect ( signers [ i ] ) . vote ( signers [ i ] , { value : VOTE_TARGET_AMOUNT } ) ;
441+ }
442+ await mine ( EPOCH_DURATION ) ;
443+ await MockSysCall . call_onPersist ( Governance ) ;
444+
445+ // Add this candidate to blacklist
446+ for ( let i = 0 ; i < 4 ; i ++ ) {
447+ await expect (
448+ Policy . connect ( signers [ i ] ) . addBlackList ( signers [ 0 ] )
449+ ) . not . to . be . reverted ;
450+ }
451+ expect ( await Policy . isBlackListed ( signers [ 0 ] ) ) . to . eq ( true ) ;
452+
453+ // Check election result
454+ await mine ( EPOCH_DURATION ) ;
455+ await MockSysCall . call_onPersist ( Governance ) ;
456+ expect ( await Governance . getCurrentConsensus ( ) ) . to . deep . equal ( STANDBY_VALIDATORS ) ;
457+ } ) ;
402458 } ) ;
403459
404460 describe ( "vote" , function ( ) {
@@ -410,7 +466,7 @@ describe("Governance", function () {
410466
411467 it ( "Should revert if target is not a candidate" , async function ( ) {
412468 await expect (
413- Governance . connect ( candidate1 ) . vote ( candidate1 , { value : MIN_VOTE_AMOUNT } )
469+ Governance . connect ( candidate1 ) . vote ( candidate1 , { value : MIN_VOTE_AMOUNT } )
414470 ) . to . be . revertedWithCustomError ( Governance , ERRORS . CANDIDATE_NOT_EXISTS ) ;
415471 } ) ;
416472
0 commit comments