示例:铸造 2 DAI
我们将模拟向持有者0xe58b9ee93700a616b50509c8292977fa7a0f8ce1 铸造 2 DAI(2000000000000000000 wei),由 0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2 发送。
DAI 的 mint 函数受 wards 映射保护:只有注册的 ward 地址才能进行铸造。发送方在 Mainnet 上不是 ward,因此普通模拟会 revert。覆盖 wards[0xe2e2…e2e2] = 1 会使其在模拟期间成为 ward。
构建 mint 步骤
- 前往 Simulator 并点击 New Simulation。
- 在 Contract 字段中粘贴
0x6b175474e89094c44da98b954eedeac495271d0f并选择 Dai。 - 在 Function 字段中选择 mint。
- 将 usr 设置为
0xe58b9ee93700a616b50509c8292977fa7a0f8ce1,将 wad 设置为2000000000000000000。 - 将该步骤的 From 设置为
0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2。
添加状态覆盖
- 展开步骤字段下方的 State overrides 部分,然后点击 Add State Override。覆盖的合约默认为步骤的目标(Dai)。
- 在 Storage variables 下,输入键
wards[0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2]和值1。键字段会建议合约的解码存储变量(wards[]、balanceOf[]、totalSupply等);在括号内填入映射键。 - 点击值旁边的 + 按钮以添加该键值对。已提交的键值对会作为一行显示在 Storage variables 下。Tenderly 会将其存储为计算后的存储槽哈希。

覆盖的键值对必须通过 + 按钮提交。未提交的键/值条目会被视为无效,模拟将不会启动。
运行并检查
- 点击 Simulate。铸造成功执行,因为模拟将发送方视为 ward。

- Events 标签页显示从零地址向持有者发出的
2000000000000000000wei 的Transfer事件。

- State 标签页列出了已应用的 State Overrides(ward 槽设置为
1)以及由此产生的 State Changes:持有者的balanceOf从0变为2000000000000000000、增加的totalSupply和发送方的 nonce。

原始存储键
除了解码后的mapping[key] 形式外,您还可以直接输入原始的 32 字节存储槽。对于位于存储位置 p 的 Solidity 映射,mapping[k] 的槽位是 keccak256(abi.encode(k, p))。上面的 wards 覆盖解析为: