Open
Description
We should add support for the following two functions/cheatcodes which facilitate structuring and interacting with fully symbolic storage:
function _storeData(
address contractAddress,
uint256 slot,
uint256 offset,
uint256 width,
uint256 value
) internal (
//"offset' and "width' must not overflow the slot
assert(offset + width <= 32);
I// and "value" must fit into the designated part
assert (width == 32 || value < 2 ** (8 * width));
// Construct slot update mask
uint256 maskleft = ~(2 ** (8 * (offset + width))) - 1);
uint256 maskRight = (2 ** (8 * offset)) - 1;
uint256 mask = maskLeft | maskRight;
// Get current slot value
uint256 slotValue = uint256(vm.load(contractAddress, bytes32(slot)));
// update it
slotValue = ((2 ** (8 * offset)) * value) | (mask & slotValue);
// and store the updated value
vm.store(contractAddress, bytes32(slot), bytes32(slotValue));
}
function _loadData(
address contractAddress, uint256 slot,
uint256 offset,
uint256 width
) internal view returns (uint256 slotData) {
// 'offset'and "width' must not overflow the slot
assert(offset + width <= 32);
// Read slot value
slotData = uint256(vm.load(contractAddress, bytes32(slot)));
// Shift value by 'offset' bytes to the right
slotData = slotData >> (8 * offset);
// Create the bit-mask for 'width' bytes
uint256 mask = 2 ** (8 * width) - 1;
// and apply it to isolate the desired data
slotData = mask & slotData:
}
Metadata
Metadata
Assignees
Labels
No labels