The setVaultState() function i the PerpetualVault.sol allows the contract owner to manually modify critical vault parameters. However, if incorrect values are provided (due to human error or misunderstanding), it could result in locked funds, incorrect position management, or system-wide failures. This issue introduces a centralization risk where a single mistake can disrupt operations.
Issue Details & Potential Consequences
| Parameter | Potential Incorrect Input | Impact |
|---|---|---|
_flow |
Incorrect flow type (e.g., WITHDRAW instead of DEPOSIT) |
Users might not be able to withdraw funds properly. |
_flowData |
Invalid numeric value | May cause incorrect position calculations. |
_beenLong |
Wrong long/short flag | Affects leverage logic & risk management. |
_curPositionKey |
Non-existent position key | The contract might manage an invalid GMX position. |
_positionIsClosed |
Setting true while a position is still open |
Blocks further actions & locks user funds. |
_isLock |
Accidentally set to true |
Entire system is frozen, stopping swaps, deposits, and withdrawals. |
_nextAction |
Incorrect action data | Could trigger wrong trading execution. |
Funds Lockup – Incorrect _isLock or _positionIsClosed values could freeze withdrawals, preventing users from accessing their funds.
Broken Trading Execution – An invalid _curPositionKey may cause the system to manage a non-existent GMX position, leading to failed or incorrect trades.
Protocol Instability – Setting incorrect flow parameters (e.g., _flow, _beenLong) could disrupt risk management and cause unexpected losses or liquidations.
Severity: High
Reason: The bug can disrupt core vault operations, potentially locking user funds, breaking trade execution, or causing protocol instability.
Impact: High (affects deposits, withdrawals, and trading logic).
Likelihood: High (manual input errors are common without proper validation).
Urgency: Immediate fix recommended to prevent system failures and user fund lockups.
Manuel Review
Emit an Event for Transparency
Add an event to log all state updates:
Add Input Validations
Ensure that invalid or conflicting values cannot be entered:
Introduce a Time Delay for _gmxLock = true
Prevent instant locking to allow recovery:
Please read the CodeHawks documentation to know which submissions are valid. If you disagree, provide a coded PoC and explain the real likelihood and the detailed impact on the mainnet without any supposition (if, it could, etc) to prove your point. Keepers are added by the admin, there is no "malicious keeper" and if there is a problem in those keepers, that's out of scope. ReadMe and known issues states: " * System relies heavily on keeper for executing trades * Single keeper point of failure if not properly distributed * Malicious keeper could potentially front-run or delay transactions * Assume that Keeper will always have enough gas to execute transactions. There is a pay execution fee function, but the assumption should be that there's more than enough gas to cover transaction failures, retries, etc * There are two spot swap functionalies: (1) using GMX swap and (2) using Paraswap. We can assume that any swap failure will be retried until success. " " * Heavy dependency on GMX protocol functioning correctly * Owner can update GMX-related addresses * Changes in GMX protocol could impact system operations * We can assume that the GMX keeper won't misbehave, delay, or go offline. " "Issues related to GMX Keepers being DOS'd or losing functionality would be considered invalid."
Please read the CodeHawks documentation to know which submissions are valid. If you disagree, provide a coded PoC and explain the real likelihood and the detailed impact on the mainnet without any supposition (if, it could, etc) to prove your point. Keepers are added by the admin, there is no "malicious keeper" and if there is a problem in those keepers, that's out of scope. ReadMe and known issues states: " * System relies heavily on keeper for executing trades * Single keeper point of failure if not properly distributed * Malicious keeper could potentially front-run or delay transactions * Assume that Keeper will always have enough gas to execute transactions. There is a pay execution fee function, but the assumption should be that there's more than enough gas to cover transaction failures, retries, etc * There are two spot swap functionalies: (1) using GMX swap and (2) using Paraswap. We can assume that any swap failure will be retried until success. " " * Heavy dependency on GMX protocol functioning correctly * Owner can update GMX-related addresses * Changes in GMX protocol could impact system operations * We can assume that the GMX keeper won't misbehave, delay, or go offline. " "Issues related to GMX Keepers being DOS'd or losing functionality would be considered invalid."
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.