In StrategyOp.sol, StrategyMainnet.sol, and StrategyArb.sol, balanceDeployed() function.
The vulnerability is derived from incorrect accounting assumptions in the balance tracking logic. The balanceDeployed() function performs direct addition of three balances:
Unexchanged balance from transmuter
Underlying token balance
Asset balance
However, when funds are claimed from the transmuter but not yet swapped, they exist simultaneously as:
Part of the unexchanged balance (not yet removed from transmuter accounting)
Actual underlying tokens in the contract
This creates a window where the same funds are counted twice, violating the invariant:
The issue becomes evident specifically during the execution path:
Initial state with funds in transmuter
claimAndSwap() is called
After transmuter.claim() executes but before swap completion
Balance calculation double counts the claimed amount
This represents a fundamental accounting error in the protocol's balance tracking mechanism
The primary issue resides within the balance accounting mechanism across all strategy variants (StrategyOp.sol, StrategyMainnet.sol, StrategyArb.sol).
In the Transmuter interface: #L4-L11
The vulnerability is evident in the balance tracking logic: #function balanceDeployed()
The issue arises during the claim and swap procedure: #function claimAndSwap
The vulnerability originates from a fundamental flaw in the accounting logic during the claim->swap transition period. The system inadequately tracks the state transition of funds as they shift from 'unexchanged' status in the transmuter to 'claimed' underlying tokens.
Impact across supported chains:
Optimism (StrategyOp.sol)
Ethereum (StrategyMainnet.sol)
Arbitrum (StrategyArb.sol)
This affects all token interactions:
WETH (underlying)
alETH (synthetic)
Related yTokens
The bug creates a systematic overstatement of total assets during claim->swap transitions, which could:
Break share price calculations
Lead to incorrect TVL reporting
Create arbitrage opportunities
Impact withdrawal calculations
It affects core accounting across all supported chains and token implementations in the Alchemix ecosystem.
In all strategy variants (StrategyOp.sol, StrategyMainnet.sol, StrategyArb.sol), the accounting system fails to adequatly handle the intermediate state between claiming funds from the transmuter and completing the swap.
Code path of the issue claimAndSwap()
The balance calculation compounds this issue
The root cause is that the system:
Maintains unexchanged balance in transmuter even after claiming
Adds claimed underlying tokens to the total balance
Fails to subtract claimed amounts from unexchanged balance immediately
This creates a window where the same funds are counted twice in the total balance, breaking the core invariant.
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.