transferFrom。每一步都依赖前一步创建的状态,这也是为什么捆绑(bundle)是在此正确工具的原因。
为什么使用捆绑?
单独模拟每笔交易会失败:- 仅铸造:您可以验证铸造逻辑,但持有人地址在主网上没有代币。
- 仅授权:模拟需要持有人实际持有一定余额才能授权。
- 仅 TransferFrom:既需要余额也需要授权都已就绪。
三笔交易
这三笔交易都以 Ethereum 主网上的 DAI 合约(0x6b175474e89094c44da98b954eedeac495271d0f)为目标。
第 1 步:铸造 2 DAI
mint 函数由 wards 映射守卫:只有注册为 ward 的地址才能调用它。fake ward(0xe2e2...e2)在主网上并不是 ward。要让这一步成功,请添加一个状态覆盖,将该地址的 ward 存储槽设置为 1:
| 字段 | 值 |
|---|---|
| 合约 | 0x6b175474e89094c44da98b954eedeac495271d0f |
| Storage key | 0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03 |
| Value | 0x0000000000000000000000000000000000000000000000000000000000000001 |
keccak256(abi.encode(wardAddress, 0)),即 wards[fakeWardAddress] 在存储位置 0 处的标准 Solidity mapping 槽位。
第 2 步:授权 1 DAI
第 3 步:TransferFrom 0.03 DAI
通过 Simulator UI 运行
填写第 1 步:Mint
将该步骤切换到 Raw 模式。设置:
- From:
0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2 - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x40c10f19000000000000000000000000e58b9ee93700a616b50509c8292977fa7a0f8ce10000000000000000000000000000000000000000000000001bc16d674ec80000

添加第 2 步:Approve
在捆绑包侧栏中点击 + Add function call。将新步骤切换到 Raw 模式。设置:
- From:
0xe58b9ee93700a616b50509c8292977fa7a0f8ce1 - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x095ea7b3000000000000000000000000f7ddedc66b1d482e5c38e4730b3357d32411e5dd0000000000000000000000000000000000000000000000000de0b6b3a7640000
添加第 3 步:TransferFrom
再添加一个步骤。切换到 Raw 模式。设置:
- From:
0xf7ddedc66b1d482e5c38e4730b3357d32411e5dd - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x23b872dd000000000000000000000000e58b9ee93700a616b50509c8292977fa7a0f8ce1000000000000000000000000bd8daa414fda8a8a129f7035e7496759c5af8570000000000000000000000000000000000000000000000000006a94d74f430000
通过 Simulation API 运行
使用simulate-bundle 端点以编程方式运行相同的序列。将 {accountSlug} 和 {projectSlug} 替换为您自己的值。
status、gasUsed、解码后的 logs、trace、assetChanges 和 balanceChanges。
一次成功的运行会显示所有三个步骤的 "status": true。如果某一步回滚(例如第 1 步缺少了状态覆盖),API 会返回直至并包括失败步骤的所有结果,其后的步骤不会再运行。
应重点关注的结果
| 步骤 | 关键信号 |
|---|---|
| Mint | assetChanges 条目中出现 "type": "Mint",向持有人存入 2 DAI。来自零地址的 Transfer 事件。 |
| Approve | logs 中出现 Approval 事件。没有资产变化(授权不会转移代币)。 |
| TransferFrom | assetChanges 条目中出现 "type": "Transfer",0.03 DAI 从持有人转移到接收方。logs 中出现 Transfer 事件。balanceChanges 显示持有人有负增量,接收方有正增量。 |
后续步骤
- Bundled Simulations(API 参考):完整的端点文档和响应结构。
- 状态覆盖:如何在模拟中覆盖存储、余额和字节码。
- Simulator UI:捆绑包构建器的布局参考和键盘快捷键。

