58428 sc low toke reward loss when calling deallocate
Submitted on Nov 2nd 2025 at 09:21:02 UTC by @SOPROBRO for Audit Comp | Alchemix V3
Report ID: #58428
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
When you deallocate funds, TOKE rewards are sent to the strategy contract instead of the MORPHO vault (MYT). Since the strategy has no mechanism to withdraw or forward these tokens, the rewards become permanently locked.
Vulnerability Details
During deallocation in TokeAutoUSDStrategy and TokeAutoEth:
rewarder.withdraw(address(this), sharesNeeded, true);This triggers the following in rewarder::_withdraw (1):
Since account is address(this) (the strategy), the rewarder sends rewards to the strategy contract itself (2):
The strategy does not expose any method to recover these rewards, effectively locking all accrued TOKE tokens.
Impact Details
The impact of this is locked TOKE rewards, particularly in TokeAutoUSDStrategy, which lacks a _claimRewards implementation altogether — meaning the only reward path is through deallocate, which locks the rewards.
References
(1) https://etherscan.io/address/0x60882D6f70857606Cdd37729ccCe882015d1755E#code#F3#L84
(2) https://etherscan.io/address/0x60882D6f70857606Cdd37729ccCe882015d1755E#code#F3#L141
Proof of Concept
Add the following import to the top of TokeAutoETHStrategy
Then add the following test, and run in the console forge test --mt test_strat_loses_rewards -vv
From the logs, we can clearly see the TOKE is sent to the Strategy instead of the MYT Vault during deallocation, you can uncomment the // IMYTStrategy(strategy).claimRewards(); to see the claimRewards will send the TOKE to the MYT Vault.
Was this helpful?