Skip to main content
В этом туториале вы научитесь использовать Tenderly SDK для симуляции бандлов транзакций. Бандл — это набор из нескольких транзакций, которые симулируются как единое целое. Бандлы транзакций часто используются в DeFi-протоколах и других приложениях для моделирования сложных операций, включающих несколько взаимодействий с контрактами.
Транзакции из бандла симулируются на одних и тех же блоках.
Мы будем симулировать использование Uniswap для обмена определённого количества DAI на WETH, покажем статус выполнения симулированных транзакций и посчитаем суммарный использованный газ. Вот транзакции, необходимые для этого:
  1. Симулировать минт 2 DAI, чтобы у обменивающего были активы для свопа. Как вариант, если у вас уже есть DAI, этот шаг можно пропустить и выполнить только транзакцию 2.
  2. Одобрить UniswapV3Router на использование DAI.
  3. Выполнить своп. Вызвать UniswapV2Router.exactInputSingle, чтобы выполнить обмен.
Чтобы первая транзакция прошла успешно, отправитель должен быть ward стейблкоина DAI. Поскольку большинство из нас таковыми не являются, мы посмотрим, как с помощью State Overrides «стать ward» в контексте бандл-симуляции.

Предварительные требования

Шаг 1. Настройте проект

Создайте новый npm-проект, установите зависимости и настройте TypeScript, вставив в терминал следующие команды:
example

Шаг 2. Вызовите Simulation API

Скопируйте полный запускаемый пример ниже и вставьте его в файл swap.ts. Транзакции определяются функциями mint2DaiTx, approveUniswapV3RouterTx и swapSomeDaiForWethTx:
example.ts
Ниже в туториале приведены подробные объяснения того, что делает код.

Шаг 3. Запустите скрипт

example

Разбираем код

Сначала мы создаём новый экземпляр Tenderly SDK:
example.ts
Чтобы вызвать Simulation API и выполнить бандл-симуляцию, мы используем Tenderly.simulator.simulateBundle() и передаём объект со следующими полями:
  • blockNumber — номер блока, на котором нужно выполнить симуляцию.
  • transactions — массив из трёх транзакций: минт 2 DAI, одобрение Uniswap Router и обмен DAI на WETH.
  • overrides — объект, делающий fakeWardAddress ward’ом DAI в рамках симуляции.
example.ts

Разбираемся с State Overrides

Мы вызываем функцию mint стейблкоина DAI. Во время симуляции контракт DAI должен «поверить», что вы (отправитель) — один из wards. Иначе он откажется выполнять минт. Для успешного минта, инициированного fakeWardAddressEOA, должно выполняться следующее условие для состояния контракта DAI:
example.ts
Чтобы это обеспечить, мы передаём в SDK overrides, где переопределяем переменную хранилища wards контракта DAI, так что fakeDaiWardAddress становится ward во время симуляции.
example.ts
Обратите внимание, что переопределения применяются ко всему бандлу и видны всем симуляциям внутри бандла.
Теперь вы лучше понимаете, как использовать Tenderly SDK для сложных сценариев симуляции и отображения ключевых результатов.