> ## 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.

# 通过 API 创建 Virtual Environments

> 使用 Tenderly REST API 通过脚本创建单网络和 Multichain Virtual Environments。适用于 CI/CD 以及每个 PR 一个的环境。

使用 REST API 从脚本、CI/CD 作业或任何后端创建 Virtual Environments。仪表板背后使用的是相同的端点。

有关完整的请求和响应架构，请参见 [REST API 参考](/virtual-environments/rest-api)。

## 开始之前

* 一个 [Tenderly access key](/platform/account/projects/api-tokens)。在您的 shell 中将其导出为 `TENDERLY_ACCESS_KEY`。
* 您的账户和项目 slug，可在 Tenderly Dashboard 的 URL 中查看。

```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
export TENDERLY_ACCESS_KEY=# the key you copied
```

## 创建单网络 Virtual Environment

<Steps>
  ### 调用 API

  使用您的 fork 和链配置向 `vnets` 端点发送 `POST` 请求：

  ```bash title="testnet-create.sh" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  RESPONSE=$(curl --request POST \
    --url https://api.tenderly.co/api/v1/account/me/project/project/vnets \
    --header 'Accept: application/json' \
    --header 'Content-Type: application/json' \
    --header "X-Access-Key: ${TENDERLY_ACCESS_KEY}" \
    --data '{
      "slug": "my-staging-testnet-25",
      "display_name": "My Staging TestNet",
      "fork_config":            { "network_id": 1, "block_number": "latest" },
      "virtual_network_config": { "chain_config": { "chain_id": 73571 } },
      "sync_state_config":      { "enabled": false, "commitment_level": "latest" },
      "explorer_page_config":   { "enabled": false, "verification_visibility": "bytecode" }
    }')
  ```

  ### 提取 Admin RPC URL

  响应中的 `rpcs` 数组包含 Admin 和 Public RPC URL。将 Admin RPC 提取出来供脚本的其余部分使用：

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  ADMIN_RPC=$(echo $RESPONSE | jq -r '.rpcs[] | select(.name == "Admin RPC") | .url')
  ```
</Steps>

## 创建 Multichain Virtual Environment

[Multichain Virtual Environment](/virtual-environments/multichain/overview) 通过 `multivnets` 端点在一次调用中创建。调用中的所有网络都归入同一个 `stack_id`，这正是使它们之间的跨链桥接成为可能的原因。

```bash title="multivnet-create.sh" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
curl --location 'https://api.tenderly.co/api/v1/account/me/project/project/multivnets' \
  --header 'accept: application/json, text/plain, */*' \
  --header "X-Access-Key: ${TENDERLY_ACCESS_KEY}" \
  --header 'content-type: application/json' \
  --data '{
    "vnets": [
      {
        "slug": "mainnet-staging",
        "fork_config":            { "network_id": 1,     "block_number": "latest" },
        "virtual_network_config": { "chain_config": { "chain_id": 1 } }
      },
      {
        "slug": "arbitrum-staging",
        "fork_config":            { "network_id": 42161, "block_number": "latest" },
        "virtual_network_config": { "chain_config": { "chain_id": 42161 } }
      },
      {
        "slug": "base-staging",
        "fork_config":            { "network_id": 8453,  "block_number": "latest" },
        "virtual_network_config": { "chain_config": { "chain_id": 8453 } }
      }
    ]
  }'
```

`vnets` 数组中的每个条目在 Multichain Virtual Environment 内创建一个网络。响应返回一个 `stack_id` 和一个 Virtual Environment 对象数组，每个对象都有自己的 RPC 端点。

按字段划分的架构请参见 [REST API 参考](/virtual-environments/rest-api#create-a-multichain-virtual-environment)。

## 后续步骤

* [使用 Foundry](/virtual-environments/ci-cd/github-actions-foundry) 或 [Hardhat](/virtual-environments/ci-cd/github-actions-hardhat) 设置 GitHub Actions，为每个 pull request 配置 Virtual Environments。
* 在您刚创建的 Virtual Environment 上[暂存合约](/virtual-environments/ci-cd/stage-contracts)。
* 浏览完整的 [REST API 参考](/virtual-environments/rest-api)。
