setArbitraryStorage
签名
function setArbitraryStorage(address target) external;
描述
实用的作弊代码,使给定地址的存储完全符号化。
任何后续对目标存储的 SLOAD 操作都会读取一个任意值,如果同一槽位再次加载,则返回该值。
如果存储槽位被显式写入(在第一次加载之前或之后),则返回写入的值。
示例
对于具有以下存储布局的合约:
contract Counter {
    address[] public owners;
    function getOwner(uint256 pos) public view returns (address) {
        return owners[pos];
    }
    function setOwner(uint256 pos, address owner) public {
        owners[pos] = owner;
    }
}
使用 setArbitraryStorage 作弊代码确保返回任意值:
contract ArbitraryStorageTest is Test {
    function testArbitraryStorage() public {
        Counter counter = new Counter();
        vm.setArbitraryStorage(address(counter));
        // Next call would fail with array out of bounds without arbitrary storage
        address owner = counter.getOwner(55);
        // Subsequent calls to same slot returns same value
        assertEq(counter.getOwner(55), owner);
        // The new value is returned if explicitly written
        counter.setOwner(55, address(111));
        assertEq(counter.getOwner(55), address(111));
    }
}