Skip to main content
Draft 链接会打开预填好表单的 Tenderly Simulator:单个调用或多调用 bundle,包括状态覆盖、注入的余额和编辑后的合约源码。在接收者点击 Simulate 之前不会执行任何操作,因此可以放心地在测试报告、pull request、治理提案或告警中分享该链接。 Draft 存储在服务端并通过 id 引用。链接本身不携带负载,也不包含项目: https://dashboard.tenderly.co/simulator/new?draftId=<id>

从 dashboard 分享 draft

  1. 在 Simulator 中构建模拟:选择网络,添加一个或多个调用,设置覆盖,应用源码编辑。
  2. 点击页面标题中的 Share draft。Draft 被保存,链接复制到剪贴板。
该链接支持 bundle 和编辑后的源码,且没有长度限制。从 dashboard 分享的 draft 可由其保存所在项目的成员读取,并会自动过期。
Simulator 标题栏,Simulate 旁边是 Share draft 按钮,提示说明该链接支持 bundle 和编辑后的源码

Simulator 标题中的 Share draft 保存当前设置并复制一个可重新打开它的链接。

打开 draft 链接时会发生什么

Dashboard 发出一次请求获取 draft,然后根据响应:
  • Draft 所属项目的成员。 Dashboard 重定向到该项目的 Simulator,表单已预填,没有任何提示。
  • 共享 draft(通过 API 以 shared: true 创建)。首先打开 Select Project 对话框;draft 在接收者选择的项目中打开。
  • 无效的 id、过期的 draft 或没有访问权限。 这三种情况返回相同的响应,因此无法探测 draft id。接收者会看到 “This draft link is invalid, has expired, or you don’t have access to it.” 并回到 dashboard 首页。
  • 未登录。 接收者先登录,然后流程用同一链接继续。
  • Simulator 中有未保存的编辑。 打开 draft 会替换当前表单,因此 dashboard 会在丢弃编辑之前请求确认。
打开共享 draft 链接时显示的 Select Project 对话框,包含项目下拉框

共享 draft 不绑定项目,因此由接收者选择在哪里打开。

部分恢复

Draft 中的每个调用独立恢复,因此一个有问题的调用不会导致整个 draft 被拒绝。一个可关闭的横幅会按调用列出未能恢复的内容: 没有横幅表示一切都已恢复。格式错误的负载,或项目中未启用的网络,会整体拒绝 draft:接收者会看到错误和空表单。
Simulator 中预填了 3 个调用的 bundle,并显示警告横幅,列出合约或函数无法恢复的调用

恢复横幅列出 draft 打开后需要处理的调用。

从 CI 或工具创建 draft 链接

使用 drafts API 创建 draft,然后把返回的 id 放入链接。请求使用 access key 进行身份验证;调用者必须是 URL 中项目的成员。 POST https://api.tenderly.co/api/v2/account/{account}/project/{project}/simulation-drafts (API reference) 响应为 { "resource_id": "<uuid>" }。

读取已保存的 draft

GET https://api.tenderly.co/api/v2/account/{account}/project/{project}/simulation-drafts/{id} (API reference) URL 中的项目是调用者自己的项目(任何其可查看的项目)。访问权限由 draft 的可见性决定:
  • 项目范围的 draft 在调用者可查看 draft 来源项目时返回 { "payload": {…}, "account_id": "…", "project_id": "…" }。
  • 共享 draft 返回 { "payload": {…} },不含来源信息。
  • 其他任何情况(未知 id、过期的 draft、无来源项目的访问权限)返回 404,"slug": "resource_not_found"。
为复杂设置获取正确负载最快的方法:在 Simulator 中构建它,点击 Share draft,然后用复制链接中的 id GET 该 draft。响应是 dashboard 能接受的负载,包括 stateOverrides、customSource 和 fundAddress 的结构。

Draft 负载

Row 字段

只有 contractAddress 是必填的。不需要的字段可以省略。省略的字段保持表单默认值,未知的额外字段会被忽略。

合约与函数

交易参数

区块选择

关于区块选择和交易索引在 UI 中的行为,参见模拟参数。

L2 参数

这些字段仅适用于 OP-stack 和 Boba 网络。

覆盖

资金注入与编辑后的源码

验证与错误

创建 draft: 打开 draft 在负载层面是全有或全无:错误的 v、缺少 rows 条目、非字符串的 contractAddress,或任何类型错误的 row 字段都会以 “This draft link is invalid or corrupted” 拒绝整个 draft。依赖实时数据的单个调用问题(合约获取、函数匹配、源码编译、代币槽位)按部分恢复中的描述单独降级。

限制

  • 每个 draft 的负载上限为 256 KB,由 API 强制执行。
  • Draft 会自动过期。过期的 draft 从 API 返回 404,在 dashboard 中显示 “invalid, has expired, or you don’t have access” 消息。
  • 打开 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。