`mintAmount` returned by `RenzoOracle.calculateMintAmount` function can be substantially lower than `_existingEzETHSupply * _newValueAdded / _currentValueInProtocol`
Audit: 2024-04-renzo-findings
Severity: MEDIUM

# Lines of code

https://github.com/code-423n4/2024-04-renzo/blob/549f774626b71dd13a427561d4743535a9cc0dca/contracts/Oracle/RenzoOracle.sol#L123-L149
https://github.com/code-423n4/2024-04-renzo/blob/549f774626b71dd13a427561d4743535a9cc0dca/contracts/RestakeManager.sol#L491-L576
https://github.com/code-423n4/2024-04-renzo/blob/549f774626b71dd13a427561d4743535a9cc0dca/contracts/RestakeManager.sol#L592-L616


# Vulnerability details

## Impact
`mintAmount` returned by the following `RenzoOracle.calculateMintAmount` function is the ezETH amount to be minted.

https://github.com/code-423n4/2024-04-renzo/blob/549f774626b71dd13a427561d4743535a9cc0dca/contracts/Oracle/RenzoOracle.sol#L123-L149
```solidity
    function calculateMintAmount(
        uint256 _currentValueInProtocol,
        uint256 _newValueAdded,
        uint256 _existingEzETHSupply
    ) external pure returns (uint256) {
        ...

        // Calculate the percentage of value after the deposit
        uint256 inflationPercentaage = (SCALE_FACTOR * _newValueAdded) /
            (_currentValueInProtocol + _newValueAdded);

        // Calculate the new supply
        uint256 newEzETHSupply = (_existingEzETHSupply * SCALE_FACTOR) /
            (SCALE_FACTOR - inflationPercentaage);

        // Subtract the old supply from the new supply to get the amount to mint
        uint256 mintAmount = newEzETHSupply - _existingEzETHSupply;

        ...

        return mintAmount;
    }
```

Such `mintAmount` would be evaluated to `_existingEzETHSupply * _newValueAdded / _currentValueInProtocol` according to the following proof. Thus, such `mintAmount` and `_existingEzETHSupply * _newValueAdded / _currentValueInProtocol` should be equivalent after taking into account rounding errors. However, the rounding errors in the calculation of `mintAmount` in the `RenzoOracle.calculateMintAmount` function can cause such `mintAmount` to be substantially lower than `_existingEzETHSupply * _newValueAdded / _currentValueInProtocol`.

```solidity
        // Calculate the percentage of value after the deposit
        inflationPercentaage = (SCALE_FACTOR * _newValueAdded) / (_currentValueInProtocol + _newValueAdded)

        // Calculate the new supply
        newEzETHSupply
        = (_existingEzETHSupply * SCALE_FACTOR) / (SCALE_FACTOR - inflationPercentaage)
        = (_existingEzETHSupply * SCALE_FACTOR) / (SCALE_FACTOR - (SCALE_FACTOR * _newValueAdded) / (_currentValueInProtocol + _newValueAdded))
        = (_existingEzETHSupply * SCALE_FACTOR) / (SCALE_FACTOR * (_currentValueInProtocol + _newValueAdded) / (_currentValueInProtocol + _newValueAdded) - SCALE_FACTOR * _newValueAdded / (_currentValueInProtocol + _newValueAdded))
        = (_existingEzETHSupply * SCALE_FACTOR) / (SCALE_FACTOR * ((_currentValueInProtocol + _newValueAdded) / (_currentValueInProtocol + _newValueAdded) - _newValueAdded / (_currentValueInProtocol + _newValueAdded)))
        = (_existingEzETHSupply * SCALE_FACTOR) / (SCALE_FACTOR * (_currentV