> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Симуляция транзакций Safe{Wallet} в своём проекте Tenderly

> Укажите Tenderly API URL и токен доступа в настройках Environment variables кошелька Safe Wallet и симулируйте транзакции Safe в своём проекте Tenderly.

Safe\{Wallet} симулирует транзакции через [Tenderly Simulation API](/simulations/single-simulations#simulate-via-api). Встроенная симуляция входит в Safe Pro. На других планах Safe проверка **Transaction simulation** в Safe Shield показывает ссылку **Set**, а транзакции в очереди показывают **Set up simulation** вместо результата. Чтобы запускать симуляции на любом плане Safe, добавьте собственный проект Tenderly в настройках **Environment variables**. После этого Safe отправляет каждый запрос на симуляцию в ваш проект, и каждая симуляция сохраняется там с полным трейсом вызовов.

<Note>
  Создание API-токенов доступа и использование Tenderly API доступны на платном плане. Чтобы включить их для вашей учётной записи, [свяжитесь с нашим отделом продаж](https://tenderly.co/contact-us), чтобы назначить звонок и обсудить обновление плана.
</Note>

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

* Проект Tenderly.
* [Токен доступа](/platform/account/projects/api-tokens) с доступом к проекту. Достаточно токена проекта (область **One project**).
* Аккаунт Safe, в котором подключённый кошелёк является владельцем.

## Как составить Tenderly API URL

Поле **Tenderly API URL** принимает полный эндпоинт Simulation API, включая путь `/simulate`:

```bash title="Tenderly API URL" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
https://api.tenderly.co/api/v1/account/{account_slug}/project/{project_slug}/simulate
```

Чтобы составить URL, откройте проект в Tenderly, перейдите в **Settings**, нажмите **Copy API URL** рядом с **Project Access Tokens** и добавьте `simulate` в конец скопированного URL. Для аккаунта `my-org` и проекта `treasury` получится `https://api.tenderly.co/api/v1/account/my-org/project/treasury/simulate`.

<Warning>
  **Copy API URL** копирует базовый URL проекта, который заканчивается на `/project/{project_slug}/`. Safe отправляет запросы ровно на тот URL, который вы ввели, поэтому с базовым URL без `simulate` каждая симуляция завершается ошибкой.
</Warning>

## Добавление проекта Tenderly в настройках Safe\{Wallet}

1. В Safe\{Wallet} откройте **Settings** и выберите вкладку **Environment variables**. Ссылки **Set** и **Set up simulation** открывают ту же страницу.
2. В разделе **Tenderly** вставьте URL из предыдущего раздела в поле **Tenderly API URL**.
3. Вставьте токен доступа в поле **Tenderly access token**.
4. Нажмите **Save**. Safe перезагрузит страницу и применит настройки.

<Frame caption="Tenderly API URL и токен доступа в настройках Environment variables Safe{Wallet}">
  <img src="https://mintcdn.com/tenderly/oghi1Zo4upwEdT7R/images/simulations/safe-wallet/environment-variables-tenderly.webp?fit=max&auto=format&n=oghi1Zo4upwEdT7R&q=85&s=92d9bd7e5aa09cb189d58f62c53814be" alt="Настройки Environment variables в Safe{Wallet}: Tenderly API URL, оканчивающийся на /simulate, и скрытый токен доступа" width="1190" height="456" data-path="images/simulations/safe-wallet/environment-variables-tenderly.webp" />
</Frame>

Заполните оба поля. Safe использует ваш проект, только если заданы и URL, и токен доступа.

Safe хранит значения в локальном хранилище браузера. Они действуют для всех Safe и сетей, которые вы открываете в этом браузере, поэтому повторите настройку в каждом браузере, которым пользуетесь. Чтобы вернуть значения по умолчанию, нажмите значок сброса в каждом поле, а затем **Save**.

## Запуск симуляции транзакции Safe

1. В Safe\{Wallet} нажмите **New transaction**, настройте транзакцию и нажмите **Next**. Откроется экран **Confirm transaction** с панелью Safe Shield справа.
2. Рядом с **Transaction simulation** нажмите **Run**.
3. Проверка сменится на **Simulation successful** или **Simulation failed**. Нажмите **View**, чтобы открыть симуляцию в вашем проекте Tenderly.

<Frame caption="Safe Shield с успешной симуляцией и ссылкой View">
  <img src="https://mintcdn.com/tenderly/oghi1Zo4upwEdT7R/images/simulations/safe-wallet/safe-shield-simulation-successful.webp?fit=max&auto=format&n=oghi1Zo4upwEdT7R&q=85&s=fe0fcdb115367bdb0712987e9dd501be" alt="Экран Confirm transaction в Safe{Wallet}: Safe Shield показывает Simulation successful и ссылку View" width="1040" height="420" data-path="images/simulations/safe-wallet/safe-shield-simulation-successful.webp" />
</Frame>

Чтобы симулировать транзакцию, которая уже стоит в очереди, откройте **Transactions**, разверните транзакцию на вкладке **Queue** и нажмите **Simulate**.

Ссылка **View** открывает `https://dashboard.tenderly.co/{account_slug}/{project_slug}/simulator/{simulation_id}`, где можно изучить [трейс вызовов, изменения состояния и события](/simulator-ui/overview) симулированного вызова `execTransaction`.

## Что Safe отправляет в Simulation API

Safe отправляет `POST`-запрос на Tenderly API URL с токеном доступа в заголовке `X-Access-Key`. Тело запроса описывает [одиночную симуляцию](/simulations/single-simulations) вызова `execTransaction` контракта Safe (или вызова `multiSend` для пакетов) со следующими параметрами:

| Поле | Значение |
| - | - |
| `from` | Подключённый кошелёк, если он является владельцем, иначе первый владелец Safe |
| `gas_price` | `0`, поэтому отправителю не нужен баланс для оплаты газа |
| `save`, `save_if_fails` | `true`: каждая симуляция сохраняется в ваш проект, включая неудачные |
| `state_objects` | [Переопределения состояния](/simulations/state-overrides) контракта Safe: порог устанавливается в `1`, если не хватает подписей; nonce устанавливается равным nonce транзакции, если она не следующая в очереди; transaction guard удаляется, если он задан |

## Устранение неполадок: Error while simulating

Когда Simulation API возвращает ошибку, Safe показывает **Error while simulating** в очереди транзакций и **Simulation failed** в Safe Shield, без подробностей ошибки. Чтобы увидеть фактический ответ:

1. Откройте инструменты разработчика в браузере и выберите вкладку **Network**.
2. Запустите симуляцию повторно.
3. Выберите запрос к `api.tenderly.co` и посмотрите код статуса и тело ответа.

| Ответ | Причина | Решение |
| - | - | - |
| `400` `validation`: `at least one of name, options, restricted or members must be provided` | Указан базовый URL проекта без `simulate` | Добавьте `simulate` в конец URL, как описано в разделе [Как составить Tenderly API URL](#как-составить-tenderly-api-url) |
| `401` `unauthorized` или `403` `insufficient_permissions` | Токен доступа отозван, истёк или введён с ошибкой | [Создайте новый токен доступа](/platform/account/projects/api-tokens) и вставьте его в Safe |
| `404` `Project not found` | Неверный slug проекта, или у токена нет доступа к проекту | Скопируйте URL заново через **Copy API URL** и проверьте область действия токена |
| `404` `Platform Account not found` | Неверный slug аккаунта | Скопируйте URL заново через **Copy API URL** |
| Ошибка CORS | URL указывает на `dashboard.tenderly.co` вместо `api.tenderly.co` | Используйте API URL из раздела [Как составить Tenderly API URL](#как-составить-tenderly-api-url) |
| `200` с `simulation.status: false` | Симуляция выполнена, и транзакция откатывается (revert) | Нажмите **View** и изучите revert в [Debugger](/debugger/overview) |

Если ни один запрос не доходит до `api.tenderly.co`, проверьте, что оба поля сохранены: Safe показывает ссылку **Set**, пока не заданы и URL, и токен доступа.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.