58796 sc low incorrect balance snapshot in deallocate causes wethredeemed always 0
Submitted on Nov 4th 2025 at 13:57:21 UTC by @dldLambda for Audit Comp | Alchemix V3
Report ID: #58796
Report Type: Smart Contract
Report severity: Low
Target: https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/strategies/mainnet/MorphoYearnOGWETH.sol
Impacts:
Permanent freezing of funds
Description
Brief/Intro
In the strategy implementation (MorphoYearnOGWETHStrategy._deallocate), the WETH balance is enabled after calling vault.withdraw(...), so the wethRedeemed variable is distributed as the difference between two results taken at the same time—as a result, wethRedeemed always occurs. This strategy's control constantly emits the StrategyDeallocationLoss event, requiring invalid data for verification.
Vulnerability Details
Problematic code:
function _deallocate(uint256 amount) internal override returns (uint256) {
vault.withdraw(amount, address(this), address(this));
uint256 wethBalanceBefore = TokenUtils.safeBalanceOf(address(weth), address(this));
uint256 wethBalanceAfter = TokenUtils.safeBalanceOf(address(weth), address(this));
uint256 wethRedeemed = wethBalanceAfter - wethBalanceBefore;
if (wethRedeemed < amount) {
emit StrategyDeallocationLoss("Strategy deallocation loss.", amount, wethRedeemed);
}
require(wethRedeemed + wethBalanceBefore >= amount, "Strategy balance is less than the amount needed");
require(TokenUtils.safeBalanceOf(address(weth), address(this)) >= amount, "Strategy balance is less than the amount needed");
TokenUtils.safeApprove(address(weth), msg.sender, amount);
return amount;
}wethBalanceBefore and wethBalanceAfter are both read after the withdraw call.
Their difference (wethRedeemed) is always 0, regardless of the actual amount withdrawn.
Consequently, StrategyDeallocationLoss is falsely emitted, and require checks may revert incorrectly.
In production, this can lead to freezing of funds in the strategy and incorrect reporting.
In another strategies, correct (EulerWETHStrategy):
Impact Details
freezing of funds, false alerts are emitted (StrategyDeallocationLoss)
References
https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/strategies/mainnet/MorphoYearnOGWETH.sol
Proof of Concept
Proof of Concept
Add and run and see logs:
Was this helpful?