Skip to main content
Draft-ссылка открывает Tenderly Simulator с предзаполненной формой: одиночный вызов или многошаговый бандл, включая переопределения состояния, пополненные балансы и изменённый исходный код контракта. Ничего не запускается, пока получатель не нажмёт Simulate, поэтому ссылкой безопасно делиться в тест-отчётах, pull request’ах, governance-предложениях или оповещениях. Draft хранится на стороне сервера и адресуется по id. Сама ссылка не содержит ни полезной нагрузки, ни проекта: https://dashboard.tenderly.co/simulator/new?draftId=<id>

Поделиться draft-ссылкой из dashboard

  1. Соберите симуляцию в Simulator: выберите сеть, добавьте один или несколько вызовов, задайте переопределения, примените правки исходного кода.
  2. Нажмите Share draft в заголовке страницы. Draft сохраняется, а ссылка копируется в буфер обмена.
Ссылка работает для бандлов и изменённого исходного кода и не имеет ограничения по длине. Draft, созданный из dashboard, доступен участникам проекта, в котором он был сохранён, и автоматически истекает.
Заголовок Simulator с кнопкой Share draft рядом с Simulate и подсказкой о том, что ссылка работает для бандлов и изменённого исходного кода

Кнопка Share draft в заголовке Simulator сохраняет текущую настройку и копирует ссылку, которая её открывает.

Что происходит при открытии draft-ссылки

Dashboard выполняет один запрос за draft, и дальше в зависимости от ответа:
  • Участник проекта, в котором создан draft. Dashboard перенаправляет в Simulator этого проекта с предзаполненной формой, без дополнительных запросов.
  • Общий draft (создан через API с shared: true). Сначала открывается диалог Select Project; draft открывается в проекте, который выберет получатель.
  • Недействительный id, истёкший draft или нет доступа. Все три случая дают одинаковый ответ, чтобы id draft’ов нельзя было перебирать. Получатель видит сообщение “This draft link is invalid, has expired, or you don’t have access to it.” и попадает на главную страницу dashboard.
  • Пользователь не авторизован. Получатель сначала входит в систему, затем сценарий продолжается с той же ссылкой.
  • В Simulator есть несохранённые правки. Открытие draft заменяет текущую форму, поэтому dashboard запрашивает подтверждение перед тем, как отбросить правки.
Диалог Select Project, показываемый при открытии общей draft-ссылки, с выпадающим списком проектов

Общий draft не привязан к проекту, поэтому получатель выбирает, где его открыть.

Частичное восстановление

Каждый вызов в draft восстанавливается независимо, поэтому один проблемный вызов не отклоняет весь draft. Закрываемый баннер перечисляет, что не удалось восстановить, по каждому вызову: Отсутствие баннера означает, что всё восстановлено. Некорректная полезная нагрузка или сеть, не включённая в проекте, отклоняют draft целиком: получатель видит ошибку и пустую форму.
Simulator с предзаполненным бандлом из 3 вызовов и предупреждающим баннером, перечисляющим вызовы, чей контракт или функцию не удалось восстановить

Баннер восстановления называет вызовы, требующие внимания после открытия draft.

Создание draft-ссылки из CI или инструментов

Создайте draft через drafts API, затем подставьте возвращённый id в ссылку. Запросы аутентифицируются access key; вызывающий должен быть участником проекта из URL. POST https://api.tenderly.co/api/v2/account/{account}/project/{project}/simulation-drafts (API reference) Ответ: { "resource_id": "<uuid>" }.

Чтение draft по id

GET https://api.tenderly.co/api/v2/account/{account}/project/{project}/simulation-drafts/{id} (API reference) Проект в URL: собственный проект вызывающего (любой проект, который он может просматривать). Доступ определяется видимостью draft:
  • Draft, ограниченный проектом, возвращает { "payload": {…}, "account_id": "…", "project_id": "…" }, если вызывающий может просматривать исходный проект draft.
  • Общий draft возвращает { "payload": {…} } без сведений об источнике.
  • Всё остальное (неизвестный id, истёкший draft, нет доступа к исходному проекту) возвращает 404 со "slug": "resource_not_found".
Самый быстрый способ получить корректную полезную нагрузку для сложной настройки: собрать её в Simulator, нажать Share draft и выполнить GET draft по id из скопированной ссылки. Ответ содержит полезную нагрузку, которую принимает dashboard, включая формы stateOverrides, customSource и fundAddress.

Полезная нагрузка draft

Поля row

Обязательно только поле contractAddress. Опускайте всё, что вам не нужно. Пропущенные поля сохраняют значения формы по умолчанию, а неизвестные лишние поля игнорируются.

Контракт и функция

Параметры транзакции

Выбор блока

О том, как выбор блока и индекс транзакции работают в UI, см. Параметры симуляции.

Параметры L2

Эти поля применимы только к сетям OP-stack и Boba.

Переопределения

Пополнение адресов и изменённый исходный код

Валидация и ошибки

Создание draft: Открытие draft на уровне полезной нагрузки работает по принципу “всё или ничего”: неверный v, отсутствие элементов в rows, нестроковый contractAddress или любое поле row неверного типа отклоняют весь draft с сообщением “This draft link is invalid or corrupted”. Проблемы отдельных вызовов, зависящие от живых данных (загрузка контракта, сопоставление функции, компиляция исходного кода, слот токена), деградируют по отдельности, как описано в разделе Частичное восстановление.

Ограничения

  • Полезная нагрузка ограничена 256 КБ на draft; лимит обеспечивает API.
  • Draft’ы автоматически истекают. Истёкший draft возвращает 404 из API и сообщение “invalid, has expired, or you don’t have access” в dashboard.
  • Для открытия draft-ссылки требуется аккаунт Tenderly. Общие draft’ы (shared: true) доступны любому авторизованному пользователю; draft’ы, ограниченные проектом, только участникам исходного проекта.
  • ABI контракта загружается при открытии ссылки. Если его не удалось получить (неверифицированный контракт), вызовы в decoded-режиме открываются с заполненным адресом, но без выбранной функции. Raw-режим от этого не зависит.

Устаревшие ссылки ?draft=

До появления серверных draft’ов dashboard кодировал одиночный вызов прямо в URL: https://dashboard.tenderly.co/<org>/<project>/simulator/new?draft=<value> <value>: полезная нагрузка версии 1 ({ "v": 1, "network": {…}, "row": {…} }, один row вместо rows) в виде UTF-8 JSON, затем base64url (+ в -, / в _, заполнение = удалено). Существующие ссылки продолжают открываться. Объект row принимает поля row, описанные выше, кроме fundAddress, customSource и contractSourceEdited, а весь URL должен оставаться короче примерно 2000 символов. Dashboard больше не создаёт этот формат; для новых интеграций используйте drafts API. О полях формы, которые заполняет draft, см. Параметры симуляции. Чтобы сохранить изменённое состояние как постоянное окружение, а не одноразовую симуляцию, используйте Virtual Environments.