Assessment reports>Concrete>Low findings>Incorrect rounding direction in ,previewMint
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.

Zellic © 2025Back to top ↑