58002 sc low missing submitremovestrategy function

Submitted on Oct 29th 2025 at 22:45:10 UTC by @Coachmike for Audit Comp | Alchemix V3arrow-up-right

  • 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?