In the PerpetualVault::setTreasury , when the treasury address is changed we do not track the previous addresses or transfer the funds already in the previous treasury to the new treasury address.
When the owner changes the PerpetualVault::treasury, all funds held in the previous treasury address remains there. As we do not keep track of previous treasury addresses, the funds will be lost(locked) in the previous treasury addresses.
The protocol will end up losing all the funds that has been sent to the previous treasury address.
Please note that this a fork test. We need to use a fork url for arbitrum. You can get a fork url from [alchemy](https://www.alchemy.com/).
The test won't run if you do not use a fork url. To run the test, open a new terminal and run,
Add the following lines of code to the test/PerpetualVault.t.sol file. This fuzz test will revert because one or more of these conditions won't be met after a few runs.
The issue stems from [PerpetualVault::setTreasury](https://github.com/CodeHawks-Contests/2025-02-gamma/blob/84b9da452fc84762378481fa39b4087b10bab5e0/contracts/PerpetualVault.sol#L712)
There are 2 possible solutions. The first solution is to track all previous treasury address in an array, preferable an enumerable set to prevent duplicate addresses. However, storing previous treasury addresses will take more slots in storage, especially if the treasury addresses change frequently.
The 2nd solution and best solution is to transfer all the funds in the previous address to the new address when we call PerpetualVault::setTreasury.
Please note that for the safeTransferFromfunction to work, the previous treasury needs to approve the contract as spender. This is a test showing how to enable the contract as spender of the previous treasury funds.
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.
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.
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.