58376 sc low claimrewards function permanently locks earned toke reward token on morpho vaultv2

Submitted on Nov 1st 2025 at 19:11:53 UTC by @kaysoft for Audit Comp | Alchemix V3arrow-up-right

  • Report ID: #58376

  • Report Type: Smart Contract

  • Report severity: Low

  • Target: https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/strategies/mainnet/TokeAutoEth.sol

  • Impacts:

    • Permanent freezing of unclaimed yield

Description

Brief/Intro

The claimRewards() function of TokeAutoEth.sol used the MYT(VaultV2) as the receiver of the Toke reward tokens. This permently locks the reward tokens on the VaultV2.

Vulnerability Details

The Toke reward token from calling claimRewards() is sent to the MYT which is the Morpho VaultV2 because MYT is passed as the receiver of the reward tokens. Since the VaultV2 does not have function to manage or pull the Toke reward token, the Toke reward token will permanently locked on the VaultV2.

File: TokeAutoEth.sol
function _claimRewards() internal override returns (uint256 rewardsClaimed) {
        rewardsClaimed = rewarder.earned(address(this));
        rewarder.getReward(address(this), address(MYT), false);//@audit MYT is the receiver of Toke reward tokens
    }

The external claimRewards function is on the parent MYTStrategy.sol contract.

Looking at the rewarder contract's getReward(...) function it can be seen that the receiver parameter is what is passed as the MYT

Impact Details

All earned Toke reward tokens will be permanently locked on the VaultV2 contract when anyone calls the claimRewards() function of TokeAutoEth.sol

Recommendation

Consider managing the Token Reward tokens instead of the passing MYT as the receiver.

Proof of Concept

Proof of Concept

  1. Create a file named POC.t.so in this directory: src/test/strategies/POC.t.sol

  2. Run forge test --match-test test_LockRewards_on_MYT -vvv

  3. This test shows that claimRewards() function sends claimed Toke reward tokens to the MYT contract which does not have any function to handle to tokens causing the tokens to be locked on the contract.

Was this helpful?