The contract double-hashes storage slot keys causing it to read garbage data for critical scrvUSD
vault parameters (e.g., total_debt, balanceOf). This corrupts the oracle’s price calculation.
The contract stores key protocol values in specific storage slots:
However, when fetching data in _extractParametersFromProof()
, the contract rehashes the slot values altering the expected storage keys:
Static Slots (e.g., total_debt at slot 21): The slot should be directly referenced as 21 but instead, keccak256(abi.encode(21)) is used pointing to an invalid storage location.
Dynamic Slots (e.g., balanceOf(self)): The correct storage key should be keccak256(abi.encode(18, SCRVUSD)), but the contract hashes it again resulting in an incorrect key.
The contract reads garbage values instead of actual protocol parameters.
Manual code review
- Per sponsor comments, verified slot is vyper, solidity contract only verifies it. - Vyper computes storage slots different from solidity as seen [here](https://ethereum.stackexchange.com/questions/149311/storage-collision-in-vyper-hashmap)
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.