Procházet zdrojové kódy

ethereum: add arrayElementLocation() test helper

Review feedback from @kcsongor in #3363
Jeff Schroeder před 2 roky
rodič
revize
a9437e8dc2

+ 2 - 2
ethereum/forge-test/Governance.t.sol

@@ -517,7 +517,7 @@ contract TestGovernance is TestUtils {
         for(uint8 i = 0; i < newGuardianSet.length; i++) {
             vm.assume(newGuardianSet[i] != address(0));
             // New GuardianSet key array elements should be initialized from zero to non-zero
-            vm.assume(storageSlot != bytes32(uint256(keccak256(abi.encodePacked(hashedLocationOffset(1, GUARDIANSETS_SLOT, 0)))) + i));
+            vm.assume(storageSlot != arrayElementLocation(hashedLocationOffset(1, GUARDIANSETS_SLOT, 0), i));
         }
 
         vm.chainId(EVMCHAINID);
@@ -769,7 +769,7 @@ contract TestGovernance is TestUtils {
         for(uint8 i = 0; i < newGuardianSet.length; i++) {
             vm.assume(newGuardianSet[i] != address(0));
             // New GuardianSet key array elements should be initialized from zero to non-zero
-            vm.assume(storageSlot != bytes32(uint256(keccak256(abi.encodePacked(hashedLocationOffset(1, GUARDIANSETS_SLOT, 0)))) + i));
+            vm.assume(storageSlot != arrayElementLocation(hashedLocationOffset(1, GUARDIANSETS_SLOT, 0), i));
         }
 
         vm.chainId(EVMCHAINID);

+ 6 - 0
ethereum/forge-test/rv-helpers/TestUtils.sol

@@ -184,4 +184,10 @@ contract TestUtils is Test, KEVMCheats {
 
         signature = abi.encodePacked(r, s,(v - 27));
     }
+
+    // @dev compute the storage slot of an array based on its key and offset
+    // @dev `keyHash` is generally from `hashedLocationOffset()`
+    function arrayElementLocation(bytes32 keyHash, uint8 arrayOffset) public pure returns (bytes32) {
+        return bytes32(uint256(keccak256(abi.encodePacked(keyHash))) + arrayOffset);
+    }
 }