Internal validator proposals

There are four special internal validator proposals responsible for managing the validator-related storage: ChangeSettings, ChangeBalances, MonthlyWithdraw, and OffchainProposal. These proposals have the privilege to skip the first voting stage on the GovPool contract and can be directly created on the GovValidators contract. Take a look at the example below, where we create an internal proposal to modify GovValidatorsToken balances.

function validatorsInternalProposals(IGovPool govPool) external {
    (, , address govValidatorsAddress, , ) = govPool.getHelperContracts();
    IGovValidators govValidators = IGovValidators(govValidatorsAddress);

    uint256[] memory balances = new uint256[](2);
    balances[0] = 10 ether;
    balances[1] = 20 ether;

    address[] memory validators = new address[](2);
    validators[0] = address(1);
    validators[1] = address(2);

    govValidators.createInternalProposal(
        IGovValidators.ProposalType.ChangeBalances,
        "Change Validators balances",
        abi.encodeWithSelector(IGovValidators.changeBalances.selector, balances, validators)
    );

    uint256 proposalId = GovValidators(payable(govValidatorsAddress))
        .latestInternalProposalId();

    // ...
}

Once you have the internal proposal ID, you can invoke the voteInternalProposal, executeInternalProposal, and getProposalState methods on the GovValidators contract, similar to what was done on the GovPool contract.