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

# Симуляция блоков с eth_simulateV1

> Симулируйте последовательность блоков с пакетами вызовов, переопределениями состояния и блока с помощью стандартного JSON-RPC-метода eth_simulateV1.

`eth_simulateV1` является стандартным методом мультиблочной симуляции из спецификации [Ethereum execution APIs](https://github.com/ethereum/execution-apis). Он симулирует последовательность блоков, каждый из которых содержит пакет вызовов, поверх базового блока, ничего не отправляя в сеть. Вызовы внутри блока выполняются последовательно и разделяют состояние, а каждый симулируемый блок строится поверх предыдущего.

Метод работает на [Node RPC](/node-rpc/overview) и [Virtual Environments](/virtual-environments/overview); полный [справочник JSON-RPC](/node-rpc/rpc-reference) содержит все методы и сети. Небольшой набор сетей его не поддерживает; см. раздел [Доступность в сетях](#доступность-в-сетях).

Используйте `eth_simulateV1`, когда нужна переносимая, соответствующая спецификации симуляция, возвращающая результаты в формате блоков. Для декодированных логов, трассировки вызовов, изменений активов и балансов используйте [`tenderly_simulateTransaction`](/node-rpc/guides/simulate-json-rpc) для одной транзакции или [`tenderly_simulateBundle`](/node-rpc/guides/simulate-bundle-json-rpc) для последовательности транзакций.

### `eth_simulateV1`

Симулирует последовательность блоков поверх заданного базового блока. Каждый блок содержит пакет вызовов: вызов N видит изменения состояния вызова N-1, а каждый блок после первого строится на предыдущем.

**Параметры**

1. **Simulation payload** `OBJECT`
   * **blockStateCalls** `ARRAY` из Block state call `OBJECT`: последовательность блоков для симуляции, по порядку
     * **blockOverrides** (*опционально*) `OBJECT`: набор полей заголовка для переопределения в этом блоке
       * **number** (*опционально*) `STRING`: hex, переопределяет номер блока
       * **difficulty** (*опционально*) `STRING`: hex, переопределяет сложность блока
       * **time** (*опционально*) `STRING`: hex, переопределяет временную метку блока
       * **gasLimit** (*опционально*) `STRING`: hex, переопределяет лимит газа
       * **coinbase** (*опционально*) `STRING`: hex, переопределяет майнера блока
       * **random** (*опционально*) `STRING`: hex, переопределяет значение, которое подаётся в опкод PREVRANDAO
       * **baseFee** (*опционально*) `STRING`: hex, переопределяет базовую комиссию блока
       * **excessBlobGas** (*опционально*) `STRING`: hex, переопределяет избыточный blob-газ
       * **blobGasUsed** (*опционально*) `STRING`: hex, переопределяет использованный blob-газ
     * **stateOverrides** (*опционально*) `MAP`: сопоставление учётной записи (адреса) со спецификацией переопределения. Задавайте переопределения состояния на **первой** записи блока; см. [Особенности реализации Tenderly](#особенности-реализации-tenderly)
       * **key** `STRING`: учётная запись, к которой применяется переопределение
       * **value** `OBJECT`: спецификация переопределения
         * **balance** (*опционально*) `STRING`: hex-кодированное переопределение баланса учётной записи в wei
         * **nonce** (*опционально*) `STRING`: hex-кодированное переопределение nonce для учётной записи
         * **code** (*опционально*) `STRING`: данные переопределения кода для учётной записи
         * **stateDiff** (*опционально*) `MAP`: сопоставление ключа хранилища со значением переопределения
           * **key** `STRING`: ключ хранилища
           * **value** `STRING`: переопределяемое значение для указанного ключа хранилища
     * **calls** `ARRAY` из Transaction call `OBJECT`: выполняются по порядку; каждый вызов видит изменения состояния предшествующих ему вызовов
       * **from** (*опционально*) `STRING`: адрес в hex; по умолчанию нулевой адрес
       * **to** (*опционально*) `STRING`: адрес в hex
       * **gas** (*опционально*) `STRING`: hex-кодированный лимит газа для вызова
       * **gasPrice** (*опционально*) `STRING`: hex, цена газа, которую отправитель готов заплатить, в wei
       * **maxFeePerGas** (*опционально*) `STRING`: hex, максимальная суммарная комиссия за газ, которую отправитель готов заплатить (включает сетевую / базовую комиссию и комиссию майнера / приоритетную), в wei
       * **maxPriorityFeePerGas** (*опционально*) `STRING`: hex, максимальная комиссия за газ, которую отправитель готов заплатить майнерам, в wei
       * **value** (*опционально*) `STRING`: hex-кодированное значение в wei; по умолчанию `0x0`
       * **input** (*опционально*) `STRING`: hex-кодированные данные вызова; `data` принимается как устаревший псевдоним, при одновременном указании приоритет имеет `input`
       * **nonce** (*опционально*) `STRING`: hex-кодированный nonce
       * **type** (*опционально*) `STRING`: hex-кодированный тип транзакции
       * **accessList** (*опционально*) `ARRAY` из записей access list `OBJECT`
         * **address** `STRING`: адрес в hex
         * **storageKeys** `ARRAY` из `STRING`: представление 32-байтовых hex-кодированных ключей хранилища
       * **maxFeePerBlobGas** (*опционально*) `STRING`: hex, максимальная комиссия за blob-газ в wei
       * **blobVersionedHashes** (*опционально*) `ARRAY` из `STRING`: 32-байтовые hex-кодированные версионированные хеши blob
       * **authorizationList** (*опционально*) `ARRAY`: кортежи авторизации EIP-7702
   * **returnFullTransactions** (*опционально*) `BOOLEAN`: если `true`, блоки результата содержат полные объекты транзакций вместо хешей транзакций
2. **Base block number** (*опционально*) Блок, поверх которого выполняется симуляция. По умолчанию `latest`. Одно из:
   * `STRING` номер блока
   * `ENUM` тег блока `earliest|finalized|safe|latest|pending`

**Пример**

Запрос симулирует два блока. Первый блок пополняет баланс отправителя через переопределение состояния, затем отправляет ETH и оборачивает 1 ETH в WETH; второй блок задаёт пользовательскую временную метку и переводит WETH, созданный в первом блоке.

<Tabs>
  <Tab title="Request">
    ```json title="example.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "method": "eth_simulateV1",
      "params": [
        {
          "blockStateCalls": [
            {
              "stateOverrides": {
                "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2": {
                  "balance": "0x3635c9adc5dea00000"
                }
              },
              "calls": [
                {
                  "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                  "to": "0x1111111111111111111111111111111111111111",
                  "value": "0x1bc16d674ec80000"
                },
                {
                  "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                  "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "value": "0xde0b6b3a7640000",
                  "input": "0xd0e30db0"
                }
              ]
            },
            {
              "blockOverrides": { "time": "0x6ae00000" },
              "calls": [
                {
                  "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                  "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "input": "0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000"
                }
              ]
            }
          ]
        },
        "latest"
      ]
    }
    ```
  </Tab>

  <Tab title="Shell">
    ```bash title="example" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl https://mainnet.gateway.tenderly.co/$TENDERLY_NODE_ACCESS_KEY \
    -X POST \
    -H "Content-Type: application/json" \
    -d \
    '{
    "id": 0,
    "jsonrpc": "2.0",
    "method": "eth_simulateV1",
    "params": [
    {
    "blockStateCalls": [
      {
        "stateOverrides": {
          "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2": {
            "balance": "0x3635c9adc5dea00000"
          }
        },
        "calls": [
          {
            "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
            "to": "0x1111111111111111111111111111111111111111",
            "value": "0x1bc16d674ec80000"
          },
          {
            "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
            "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
            "value": "0xde0b6b3a7640000",
            "input": "0xd0e30db0"
          }
        ]
      },
      {
        "blockOverrides": { "time": "0x6ae00000" },
        "calls": [
          {
            "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
            "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
            "input": "0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000"
          }
        ]
      }
    ]
    },
    "latest"
    ]
    }'
    ```
  </Tab>

  <Tab title="JavaScript">
    ```javascript title="example.js" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    // Installation Instructions: https://docs.ethers.io/v5/getting-started/#installing
    const { ethers } = require('ethers');

    async function runSimulateV1() {
    // Initialize an ethers instance
    const provider = new ethers.providers.JsonRpcProvider(
    'https://mainnet.gateway.tenderly.co/$TENDERLY_NODE_ACCESS_KEY',
    );

    // Execute method
    const result = await provider.send('eth_simulateV1', [
    {
    blockStateCalls: [
      {
        stateOverrides: {
          '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2': {
            balance: '0x3635c9adc5dea00000',
          },
        },
        calls: [
          {
            from: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2',
            to: '0x1111111111111111111111111111111111111111',
            value: '0x1bc16d674ec80000',
          },
          {
            from: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2',
            to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
            value: '0xde0b6b3a7640000',
            input: '0xd0e30db0',
          },
        ],
      },
      {
        blockOverrides: { time: '0x6ae00000' },
        calls: [
          {
            from: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2',
            to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
            input: '0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000',
          },
        ],
      },
    ],
    },
    'latest',
    ]);

    // Print the output to console
    console.log(result);
    }

    (async () => {
    runSimulateV1();
    })();
    ```
  </Tab>

  <Tab title="Response">
    ```json title="response.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "result": [
        {
          "number": "0x184b35b",
          "hash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
          "parentHash": "0x1fe7faf7d5b3a57fe52192bcf634b62bda8cfd39a5509d5541a2fb30d5438463",
          "nonce": "0x88425305eb52b6f7",
          "mixHash": "0x5bf018c82ca9e0e3805b00475afe61be2b1077eff79abb6cb4617af8548aa514",
          "sha3Uncles": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
          "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "miner": "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97",
          "difficulty": "0x0",
          "extraData": "0x546974616e2028746974616e6275696c6465722e78797a29",
          "size": "0x0",
          "gasLimit": "0x3938700",
          "gasUsed": "0x3938700",
          "timestamp": "0x6a4bb197",
          "transactionsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "receiptsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "baseFeePerGas": "0x18d7ee41",
          "blobGasUsed": "0x60000",
          "excessBlobGas": "0xba42085",
          "uncles": [],
          "transactions": [
            "0xbb42f5dcbfa507c52b64642c9b9e2a95fc4e2542cbd06b180239367d45f35e30",
            "0xcb06f645c2962f5dfff047efb2a000d05d0a58a619c63c97ec3e12cf48d02033"
          ],
          "calls": [
            {
              "returnData": "0x",
              "logs": [],
              "gasUsed": "0x5208",
              "status": "0x1"
            },
            {
              "returnData": "0x",
              "logs": [
                {
                  "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "topics": [
                    "0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c",
                    "0x000000000000000000000000e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2"
                  ],
                  "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
                  "blockNumber": "0x184b35b",
                  "transactionHash": "0xcb06f645c2962f5dfff047efb2a000d05d0a58a619c63c97ec3e12cf48d02033",
                  "transactionIndex": "0x1",
                  "blockHash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
                  "logIndex": "0x0",
                  "removed": false
                }
              ],
              "gasUsed": "0xafee",
              "status": "0x1"
            }
          ]
        },
        {
          "number": "0x184b35c",
          "hash": "0xddb8a8a01c753b30acea4c8a12e36f3157dfa854ad0134b1dbb1e6227a9838cd",
          "parentHash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
          "nonce": "0x0000000000000000",
          "mixHash": "0x5bf018c82ca9e0e3805b00475afe61be2b1077eff79abb6cb4617af8548aa514",
          "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
          "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "miner": "0x0000000000000000000000000000000000000000",
          "difficulty": "0x0",
          "extraData": "0x546974616e2028746974616e6275696c6465722e78797a29",
          "size": "0x18e",
          "gasLimit": "0x3938700",
          "gasUsed": "0x0",
          "timestamp": "0x6ae00000",
          "transactionsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
          "baseFeePerGas": "0x1bf2ec09",
          "excessBlobGas": "0xba62085",
          "uncles": [],
          "transactions": [
            "0x21ac69b18844a9f1345c2b29292852477672178b0d338092f20dcb850d261604"
          ],
          "calls": [
            {
              "returnData": "0x0000000000000000000000000000000000000000000000000000000000000001",
              "logs": [
                {
                  "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                    "0x000000000000000000000000e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                    "0x0000000000000000000000001111111111111111111111111111111111111111"
                  ],
                  "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
                  "blockNumber": "0x184b35b",
                  "transactionHash": "0x21ac69b18844a9f1345c2b29292852477672178b0d338092f20dcb850d261604",
                  "transactionIndex": "0x0",
                  "blockHash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
                  "logIndex": "0x1",
                  "removed": false
                }
              ],
              "gasUsed": "0x73fe",
              "status": "0x1"
            }
          ]
        }
      ]
    }
    ```
  </Tab>
</Tabs>

**Результат**

`ARRAY` из Block result `OBJECT`, по одному на каждую запись `blockStateCalls`, по порядку. Каждый результат блока содержит стандартные поля заголовка блока, возвращаемые `eth_getBlockByNumber` (`number`, `hash`, `parentHash`, `timestamp`, `gasLimit`, `gasUsed`, `baseFeePerGas`, `logsBloom`, `miner` и так далее), а также:

* **transactions** `ARRAY`: хеши транзакций симулированных вызовов или полные объекты транзакций, если `returnFullTransactions` равно `true`
* **calls** `ARRAY` из Call result `OBJECT`, по одному на вызов, по порядку:
  * **returnData** `STRING`: hex-кодированные возвращаемые данные вызова
  * **logs** `ARRAY` из Log `OBJECT`: события, эмитированные вызовом (`address`, `topics`, `data`, `blockNumber`, `transactionHash`, `transactionIndex`, `blockHash`, `logIndex`, `removed`); пустой массив для откатившихся вызовов
  * **gasUsed** `STRING`: hex-кодированное количество газа, потреблённого вызовом
  * **status** `STRING`: `0x1` при успехе, `0x0` при неудаче
  * **error** `OBJECT`: присутствует только при неудачном вызове
    * **code** `NUMBER`: код ошибки
    * **message** `STRING`: сообщение об ошибке, включая причину revert, когда она доступна

### Особенности реализации Tenderly

Реализация Tenderly отличается от эталонной спецификации [execution-apis](https://github.com/ethereum/execution-apis) следующим образом:

* **`validation` не поддерживается.** Установка `validation: true` возвращает ошибку `validation flag is not supported`. Симуляция всегда выполняется в невалидирующем режиме: требования к nonce, балансу и комиссиям не применяются к вызовам.
* **`traceTransfers` не поддерживается.** Установка `traceTransfers: true` возвращает ошибку `traceTransfers flag is not supported`. Синтетические логи переводов ETH не создаются.
* **Переопределения `state` не поддерживаются.** Поле `state` (полная замена хранилища) в переопределении состояния возвращает ошибку `not supported`. Используйте `stateDiff` для переопределения отдельных слотов хранилища.
* **Переопределения состояния применяются с первого блока.** Задавайте `stateOverrides` на первой записи `blockStateCalls`; `stateOverrides` на последующих записях не применяются.
* **`gas` на уровне вызова ограничивается сверху.** Значение `gas` выше лимита газа блока плюс 600 000 000 усекается до этого потолка, а не отклоняется.
* **Нет лимитов на количество блоков и вызовов.** Максимальное количество записей `blockStateCalls` и количество вызовов в одном блоке не ограничены.
* **Хеши транзакций синтетические.** Хеши в блоках результата идентифицируют симулированные вызовы, но не являются хешами подписанных транзакций.
* **Продвижение блоков.** Каждый симулируемый блок после первого получает `number = предыдущий + 1` и `parentHash`, связанный с предыдущим результатом, при этом базовая комиссия и лимит газа пересчитываются. Автоматически генерируемая временная метка берётся из системных часов ноды, поэтому задавайте `blockOverrides.time` явно, когда временные метки важны. Переопределённые номера блоков и временные метки применяются как есть; монотонность не проверяется. Если первая запись блока содержит `blockOverrides` без `number`, номер блока по умолчанию равен номеру базового блока плюс 1.

### Доступность в сетях

`eth_simulateV1` доступен в сетях Node RPC и Virtual Environments, за исключением следующих сетей, где ноды базовой сети не поддерживают этот метод:

* ApeChain
* Avalanche C-Chain
* Avalanche C-Chain Fuji
* Blast
* Curtis
* Flare
* Immutable
* Immutable Testnet
* Lens
* Lens Testnet
* Metis Andromeda
* Metis Sepolia
* Monad
* Monad Testnet
* Moonbase Alpha
* Moonbeam
* Moonriver
* Scroll Mainnet
* Scroll Sepolia
* Sonic
* Sonic Testnet
* Stable
* Stable Testnet
* ZKsync
* ZKsync Sepolia
