function updateValidatorSetV2(
address[] memory _consensusAddrs,
uint64[] memory _votingPowers,
bytes[] memory _voteAddrs
) public onlyCoinbase onlyZeroGasPrice {
uint256 _length = _consensusAddrs.length;
Validator[] memory _validatorSet = new Validator[](_length);
for (uint256 i; i < _length; ++i) {
_validatorSet[i] = Validator({
consensusAddress: _consensusAddrs[i],
feeAddress: payable(address(0)),
BBCFeeAddress: address(0),
votingPower: _votingPowers[i],
jailed: false,
incoming: 0
});
}
// step 0: force all maintaining validators to exit `Temporary Maintenance`
// - 1. validators exit maintenance
// - 2. clear all maintainInfo
// - 3. get unjailed validators from validatorSet
(Validator[] memory validatorSetTemp, bytes[] memory voteAddrsTemp) =
_forceMaintainingValidatorsExit(_validatorSet, _voteAddrs);
// step 1: distribute incoming
for (uint256 i; i < currentValidatorSet.length; ++i) {
uint256 incoming = currentValidatorSet[i].incoming;
if (incoming != 0) {
currentValidatorSet[i].incoming = 0;
IStakeHub(STAKE_HUB_ADDR).distributeReward{ value: incoming }(currentValidatorSet[i].consensusAddress);
}
}
// step 2: do dusk transfer
if (address(this).balance > 0) {
emit systemTransfer(address(this).balance);
address(uint160(SYSTEM_REWARD_ADDR)).transfer(address(this).balance);
}
// step 3: do update validator set state
totalInComing = 0;
if (validatorSetTemp.length != 0) {
doUpdateState(validatorSetTemp, voteAddrsTemp);
}
// step 3: clean slash contract
ISlashIndicator(SLASH_CONTRACT_ADDR).clean();
emit validatorSetUpdated();
}