58002 sc low missing submitremovestrategy function
Submitted on Oct 29th 2025 at 22:45:10 UTC by @Coachmike for Audit Comp | Alchemix V3
Report ID: #58002
Report Type: Smart Contract
Report severity: Low
Target: https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/AlchemistCurator.sol
Impacts:
Permanent freezing of funds
Description
Brief/Intro
The issue is found in the removeStrategy(address adapter, address myt) function in the AlchemistCurator contract. This function is intended to remove a strategy (adapter) from the associated Morpho Vault V2 (MYT), but it fails to do so
Vulnerability Details
The issue triggers in the line where removeStrategy () calls _setStrategy(adapter, myt, true), which directly invokes vault.removeAdapter(adapter) without a prior submit call to queue the timelock. This causes a revert in VaultV2's timelocked() guard.
Walkthrough of the Issue
function removeStrategy(address adapter, address myt) external onlyOperator { // <-- Caller (operator) calls this
require(adapter != address(0), "INVALID_ADDRESS");
require(myt != address(0), "INVALID_ADDRESS");
_setStrategy(adapter, myt, true); // remove // <-- Jumps directly to execution (skips submit!)
} Function passes requires. Calls _setStrategy(adapter, myt, true).
Unlike submitSetStrategy (for adds), there's no vault.submit(data) to queue the timelock.
Inside VaultV2.sol: removeAdapter (Timelock Check Fails)
selector = bytes4(msg.data) extracts removeAdapter selector.
executableAt[msg.data] checks for pending submission. Value: 0 (no prior submit(data) call was made for this exact calldata: abi.encodeCall(IVaultV2.removeAdapter, (adapter))).
Revert: require(executableAt[msg.data] != 0, ErrorsLib.DataNotTimelocked()) fails with "DataNotTimelocked".
Reproduction Steps :
Deploy VaultV2 with curator set to the AlchemistCurator instance.
Set a timelock > 0 for removeAdapter.selector.
As operator, call removeStrategy(adapter, myt) for a valid added adapter.
Reverts with DataNotTimelocked().
Soln
Add submitRemoveStrategy(address adapter, address myt) external onlyOperator mirroring submitSetStrategy, but using abi.encodeCall(IVaultV2.removeAdapter, adapter). Emit SubmitRemoveStrategy. Then removeStrategy can execute post-timelock like setStrategy.
Impact Details
This bug prevents operators from removing adapters (strategies) from the vault, permanently locking in potentially risky or outdated allocations and exposing the vault to unmitigated security or inefficiency risks.
References
https://github.com/alchemix-finance/v3-poc/blob/a192ab313c81ba3ab621d9ca1ee000110fbdd1e9/src/AlchemistCurator.sol#L49
Proof of Concept
Proof of Concept
POC
POC 2
Was this helpful?