The strategy design relies on an off-chain actor (a keeper) to call transmuterBuffer.exchange, which converts some portion of aLETH into WETH. Until the keeper subsequently calls strategy.claimAndSwap, these newly converted assets remain locked and cannot be withdrawn by users. As a result, users are not guaranteed the ability to withdraw their funds on demand unless the keeper performs timely claimAndSwap operations.
In the given strategy implementation, user deposits are converted into aLETH and managed via the transmuter. Normally, users should be able to withdraw their deposited assets at any time. However, if a keeper has called transmuterBuffer.exchange but not subsequently performed a claimAndSwap, a portion of these assets remain in a state where they cannot be withdrawn as WETH. This creates a scenario where the user’s withdrawal is partially dependent on the keeper’s follow-up actions.
The availableWithdrawLimit function correctly returns the total amount that can be withdrawn under normal circumstances, but the actual liquidation of the position into a freely withdrawable form (e.g., WETH or the base asset) is held up until a keeper chooses to run claimAndSwap. This can cause delays or temporary inability for users to access their funds.
The impact is a partial denial of service for user withdrawals. While user funds are not permanently lost, they cannot be retrieved at will, introducing both uncertainty and inconvenience. This situation may erode user trust and reliability in the system. If the keeper fails or refuses to call claimAndSwap, users might have to wait indefinitely to access their own funds.
Manual Code Review and Foundry
A direct mitigation strategy is to consolidate the keeper’s responsibilities into the Strategy contract itself. Instead of relying on an external keeper, the Strategy can implement an internal function that both calls exchange and claimAndSwap atomically within a single transaction. By doing this, whenever it becomes profitable or necessary to perform these operations, the Strategy contract—acting as its own keeper—can ensure that the assets are immediately converted and made available for users to withdraw. This approach removes the dependency on an external actor’s timing and guarantees continuous access to user funds.
Alternatively, another approach is to modify the withdraw function. In cases where there are insufficient funds available for withdrawal, the contract can directly call the claim function on the transmuter to extract any claimable WETH and provide it to the user. This ensures that withdrawals are not blocked even when certain conditions (such as delayed claimAndSwap operations) temporarily limit available liquidity. By dynamically adjusting to the state of the transmuter during withdrawals, user experience can be further enhanced.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.