Exploit that drained $13.4M from Abracadabra’s GMX V2 Cauldron through accounting manipulation in the RouterOrder system
GmxV2CauldronRouterOrder
contract had two critical functions:
sendValueInCollateral()
- Extracted real tokens during liquidationsorderValueInCollateral()
- Reported collateral value for borrowing calculationssendValueInCollateral()
removed tokens, it failed to update internal accounting variables (inputAmount
, minOut
, minOutLong
). This meant orderValueInCollateral()
continued reporting the original collateral value even after tokens were extracted.
Exploitation Steps:
sendValueInCollateral()
orderValueInCollateral()
functionorderValueInCollateral()
returns 1000 USDC equivalent, actual balance = 1000 USDC → Assertion passes ✅sendValueInCollateral()
extracts 500 USDC, but orderValueInCollateral()
still returns 1000 USDC equivalent, actual balance = 500 USDC → Assertion fails ❌orderValueInCollateral()
still returns 1000 USDC equivalent, actual balance = 0 USDC → Assertion fails ❌