跳转到主要内容
在本教程中,您将学习如何使用 Tenderly SDK 模拟捆绑交易。捆绑交易是一组作为整体进行模拟的多笔交易。 捆绑交易通常用于 DeFi 协议和其他应用中,以模拟执行涉及多个合约交互的复杂操作。
捆绑中的交易在相同的区块上进行模拟。
我们将模拟通过 Uniswap 将一定数量的 DAI 兑换为 WETH,展示已模拟交易的执行状态,并计算总的 gas 使用量。 要达成此目标所需的交易如下:
  1. 模拟铸造 2 个 DAI,使兑换者拥有可兑换的资产。或者,如果您已有 DAI,可以跳过此步骤,直接执行第 2 笔交易。
  2. 批准 UniswapV3Router 使用 DAI。
  3. 执行兑换。调用 UniswapV2Router.exactInputSingle 进行兑换。
要使第 1 笔交易成功运行,发送方需要是 DAI 稳定币的 ward(授权者)。由于我们大多数人都不是,因此我们将了解如何在捆绑模拟的上下文中通过 State Overrides “成为 ward”。

前提条件

第 1 步:设置项目

将以下命令粘贴到您的终端中,以创建一个新的 npm 项目、安装依赖并配置 Typescript:
example

第 2 步:调用 Simulation API

从下方复制完整可运行示例并粘贴到 swap.ts 文件中。 交易由 mint2DaiTxapproveUniswapV3RouterTxswapSomeDaiForWethTx 函数确定:
example.ts
在本教程的后续部分,您将找到关于代码在做什么的详细解释。

第 3 步:运行脚本

example

理解代码

首先,我们创建 Tenderly SDK 的新实例:
example.ts
要调用 Simulation API 并执行捆绑模拟,我们使用 Tenderly.simulator.simulateBundle() 并传入包含以下字段的对象:
  • blockNumber - 您希望在其上执行模拟的区块号。
  • transactions - 包含三笔交易的数组:铸造 2 个 DAI、批准 Uniswap Router 以及将 DAI 兑换为 WETH。
  • overrides - 一个对象,使 fakeWardAddress 在本次模拟中成为 DAI 的 ward。
example.ts

理解 State Overrides

我们正在调用 DAI 稳定币的 mint 函数。在模拟过程中,DAI 合约必须相信您(发送方)是 wards 之一,否则它将拒绝铸造。 为使 fakeWardAddressEOA 发起的铸造成功,DAI 合约状态必须满足以下条件:
example.ts
为实现这一点,我们将 overrides 传递给 SDK,从而覆盖 DAI 的 wards 存储变量,使 fakeDaiWardAddress 在模拟期间成为 ward。
example.ts
请注意,overrides 适用于整个捆绑,并对捆绑中的所有模拟可见。
现在,您对如何使用 Tenderly SDK 执行复杂的模拟场景并展示关键结果有了更深入的了解。