Deposits require that _vaultIds[0] != globalState.groupDepositIndex
, where _vaultIds
is an array decoded from generic bytse calldata. However, because multiple users may interact with the contract during similar time, and globalState.groupDepositIndex
updates with each iteration over _vaultIds
in VaultControllerStrategy#_depositToVaults
, during execution many of the requests will revert with globalState.groupDepositIndex
mismatch.
When calling deposit, the code finally lands in VaultControllerStrategy (delegatecall from VCS). Then the calldata that the user sent is decoded into which vaults to deposit into:
It's enforced that the vault id of the array passed in calldata starts with the vault they left off at during the previous call
- this will never work if it's used frequently. That's because of globalVaultState.groupDepositIndex
will already be overriden between user posting a transaction, and the transaction being executed during high demand.
A malicious user can even go ahead and soft DoS it for prolonged period of time by creating muyltiple spaced deposits to a single vault. Then other people requests won't start with the id that the code expects.
DoS of the deposits in times of high demand/by malicious actor.
Manual review
Consider changing the code to automatically put the funds into appropriate vaults, and not rely on user calldata.
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.