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

填写好 mint calldata 并配置 ward 状态覆盖的第 1 步。
4
添加第 2 步:Approve
在捆绑包侧栏中点击 + Add function call。将新步骤切换到 Raw 模式。设置:
- From:
0xe58b9ee93700a616b50509c8292977fa7a0f8ce1 - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x095ea7b3000000000000000000000000f7ddedc66b1d482e5c38e4730b3357d32411e5dd0000000000000000000000000000000000000000000000000de0b6b3a7640000
5
添加第 3 步:TransferFrom
再添加一个步骤。切换到 Raw 模式。设置:
- From:
0xf7ddedc66b1d482e5c38e4730b3357d32411e5dd - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x23b872dd000000000000000000000000e58b9ee93700a616b50509c8292977fa7a0f8ce1000000000000000000000000bd8daa414fda8a8a129f7035e7496759c5af8570000000000000000000000000000000000000000000000000006a94d74f430000
6
运行捆绑包
点击 Simulate(或按 

⌘↵)。三个步骤会依次执行。点击侧栏中的每个步骤即可查看其解码后的输出、消耗的 gas、事件和代币转账。
运行后的捆绑包:第 2 步(approve)已被聚焦,显示了 Approval 事件和解码后的输出。

第 3 步(transferFrom)成功。0.03 DAI 的转账在 ERC-20 transfers 标签页中可见。
通过 Simulation API 运行
使用simulate-bundle 端点以编程方式运行相同的序列。将 {accountSlug} 和 {projectSlug} 替换为您自己的值。
status、gasUsed、解码后的 logs、trace、assetChanges 和 balanceChanges。
一次成功的运行会显示所有三个步骤的 "status": true。如果某一步回滚(例如第 1 步缺少了状态覆盖),API 会返回直至并包括失败步骤的所有结果,其后的步骤不会再运行。
应重点关注的结果
后续步骤
- Bundled Simulations(API 参考):完整的端点文档和响应结构。
- 状态覆盖:如何在模拟中覆盖存储、余额和字节码。
- Simulator UI:捆绑包构建器的布局参考和键盘快捷键。