56528 sc insight unbounded slippagebps can freeze withdrawals

Submitted on Oct 17th 2025 at 09:40:39 UTC by @OxPrince for Audit Comp | Alchemix V3arrow-up-right

  • Report ID: #56528

  • Report Type: Smart Contract

  • Report severity: Insight

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

  • Impacts:

    • Permanent freezing of funds

Description

Brief/Intro

slippageBPS is accepted from strategy params without validation in MYTStrategy and stored both in params.slippageBPS and the local copy slippageBPS.

  • Every concrete strategy subtracts slippageBPS / 10_000 from withdrawal previews. When the value exceeds 10_000 (100%), the subtraction underflows and reverts because Solidity 0.8+ guards against underflow.

  • The allocator and shared tests rely on previewAdjustedWithdraw to size withdrawals. A revert here prevents operators from computing safe withdrawal amounts and blocks standard deallocation workflows.

Vulnerability Details

Constructor leaves slippageBPS unchecked (src/MYTStrategy.sol:79-99). No subsequent setter clamps it either.

  • Multiple strategies inherit this behaviour; for example:

    • StargateEthPoolStrategy._previewAdjustedWithdraw (src/strategies/optimism/StargateEthPoolStrategy.sol:96-99)

    • MoonwellWETHStrategy._previewAdjustedWithdraw (src/strategies/optimism/MoonwellWETHStrategy.sol:81-89)

    • FluidARBUSDCStrategy._previewAdjustedWithdraw (src/strategies/arbitrum/FluidARBUSDCStrategy.sol:51-55)

  • Shared test helpers and the allocator code path call previewAdjustedWithdraw before deallocations (src/test/libraries/BaseStrategyTest.sol:140-151, src/AlchemistAllocator.sol:46-65), so any revert there halts the withdrawal flow.

Impact Details

  • Misconfigured deployments with slippageBPS > 10_000 make every previewAdjustedWithdraw call revert, preventing vault operators from calculating deallocation amounts through the intended interface.

  • Because the allocator is expected to follow the documented flow, withdrawals become operationally blocked until the contract is upgraded or replaced, effectively freezing funds managed by that strategy.

References

Add any relevant links to documentation or code

Proof of Concept

Proof of Concept

forge test --match-test previewAdjustedWithdrawRevertsWhenSlippageExceedsOneHundredPercent -vvvv

│ │ └─ ← [Return] true │ └─ ← [Return] 7080 bytes of code ├─ [0] VM::expectRevert(custom error 0xf28dceb3: $NH{q) │ └─ ← [Return] ├─ [1637] SlippagePreviewStrategy::previewAdjustedWithdraw(1000000000000000000 [1e18]) [staticcall] │ └─ ← [Revert] panic: arithmetic underflow or overflow (0x11)

Was this helpful?