58506 sc low adjusted cap limits are never enforced

Submitted on Nov 2nd 2025 at 21:11:55 UTC by @Tee0x for Audit Comp | Alchemix V3arrow-up-right

  • Report ID: #58506

  • Report Type: Smart Contract

  • Report severity: Low

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

  • Impacts:

    • Protocol insolvency

Description

Brief/Intro

The AlchemistAllocator contract calculates role-based allocation limits (adjusted) to enforce different permission levels for admins vs operators, but never validates that allocation amounts respect these calculated limits before forwarding calls to the vault.

Vulnerability Details

The AlchemistAllocator contract calculates adjusted cap limits in both allocate() and deallocate() functions but completely fails to enforce them. After computing the maximum allowable allocation through a multiple step cap selection process, the contract proceeds with allocations without any validation against these calculated limits, rendering the entire cap system non-functional.

After computing adjusted, a validation should follow but this validation is completely missing. The adjusted variable is calculated and not used to validate the allocation amount.

Since daoTarget is currently set to type(uint256).max, the adjusted cap becomes effectively infinite regardless of vault configured caps. Any operator can allocate unlimited funds to any adapter, completely bypassing all governance-configured risk limits.

Even when the FIXME is resolved and daoTarget is set to a real value from StrategyClassificationProxy, the issue remains because the enforcement check is still missing.

Impact Details

Since daoTarget = type(uint256).max, the adjusted cap becomes infinite for operators. Operators can allocate up to the absolute maximum vault caps without any risk-based restrictions. Even when StrategyClassificationProxy is implemented, there's no enforcement.

References

Proof of Concept

Proof of Concept

This test should be ran in the AlchemistAllocator.t.sol found in the test folder using this command; forge test --match-test test_BypassAbsoluteCap -vv

Was this helpful?