Category: Coding Mistakes
Incorrect rounding direction in previewMint
Low Impact
Low Severity
Medium Likelihood
Description
The previewMint
function in the ConcreteMultiStrategyVault contract uses Rounding.Floor
as the rounding direction for grossShares
after fee calculation and in _convertToAssets
:
function previewMint(uint256 shares_) public view override returns (uint256) {
uint256 grossShares = shares_.mulDiv(MAX_BASIS_POINTS, MAX_BASIS_POINTS - fees.depositFee, Math.Rounding.Floor);
return _convertToAssets(grossShares, Math.Rounding.Floor);
}
However, the mint
function uses Rounding.Ceil
for both operations:
function mint(uint256 shares_, address receiver_)
public
override
nonReentrant
whenNotPaused
takeFees
returns (uint256 assets)
{
// [...]
uint256 feeShares =
shares_.mulDiv(MAX_BASIS_POINTS, MAX_BASIS_POINTS - depositFee, Math.Rounding.Ceil) - shares_;
// [...]
assets = _convertToAssets(shares_ + feeShares, Math.Rounding.Ceil);
// [...]
}
Impact
This inconsistency in rounding direction causes previewMint
to return inaccurate mint previews.
Recommendations
Update the rounding direction in previewMint
to match the mint
function's use of Rounding.Ceil
.
Remediation
This issue has been acknowledged by Blueprint Finance, and a fix was implemented in commit c58be473↗.