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↗.