58056 sc low the auto eth and usdc staking rewards will stuck in vault

Submitted on Oct 30th 2025 at 10:59:36 UTC by @aman for Audit Comp | Alchemix V3arrow-up-right

  • Report ID: #58056

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

Description

Brief/Intro

The autoEth and autoUSDC Share can be staked to earn rewards in the form of TOKE tokens. When withdrawing from the rewarder contract, the reward tokens are automatically claimed and transferred to the vault. However, there is no mechanism for these tokens to be withdrawn or distributed among the strategy’s shareholders.

Vulnerability Details

I will focus on the TokeAutoEth strategy here, but the same logic applies to the TokeAutoUSDCStrategy. In the TokeAutoEth strategy, we first deposit WETH into the AutoETH contract and then deposit its shares into the rewarder contract.

/v3-poc/src/strategies/mainnet/TokeAutoEth.sol:56
56:     function _allocate(uint256 amount) internal override returns (uint256) {
57:         require(TokenUtils.safeBalanceOf(address(weth), address(this)) >= amount, "Strategy balance is less than amount");
58:         TokenUtils.safeApprove(address(weth), address(router), amount);
59:         uint256 shares = router.depositMax(autoEth, address(this), 0);
60:         TokenUtils.safeApprove(address(autoEth), address(rewarder), shares);
61:         rewarder.stake(address(this), shares);
62:         return amount;
63:     }

When withdrawing WETH, we first need to withdraw the shares from the rewarder contract, and then use those shares to redeem WETH from the AutoETH contract. In the first step, when the shares are withdrawn from the rewarder contract, it also automatically claims the rewards accumulated for the strategy up to that point.

At Link https://vscode.blockscan.com/ethereum/0x60882D6f70857606Cdd37729ccCe882015d1755E , you can see that when the withdraw function is called, it also triggers the claim of the TOKE rewards.

Impact Details

The reward tokens, such as TOKE in this case, will remain permanently stuck in the Vault contract, as there is no mechanism to withdraw them or convert them into WETH or USDC for distribution as yield among the strategy’s shareholders As intended.

References

Proof of Concept

Proof of Concept

Apply following git Diff to TokeAutoETHStrategy and run test case with command : forge test --mc TokeAutoETHStrategyTest --match-test test_strategy_rewards_stuck -vvv --decode-internal

Was this helpful?