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

# Симуляция транзакций

> Симулируйте транзакцию и получайте точную оценку газа с помощью JSON-RPC-методов tenderly_simulateTransaction и tenderly_estimateGas.

<Note>Пользовательские RPC-методы находятся в пространстве имён **`tenderly_`**.</Note>

Эти методы работают на [Node RPC](/node-rpc/overview); полный [справочник JSON-RPC](/node-rpc/rpc-reference) содержит все методы и сети.

Два метода выполняют одну транзакцию против заданного блока без её отправки в сеть:

* [`tenderly_simulateTransaction`](#tenderly_simulatetransaction) возвращает полное декодированное выполнение: логи, трассировку вызовов, изменения активов и изменения балансов.
* [`tenderly_estimateGas`](#tenderly_estimategas) выполняет транзакцию тем же образом, но возвращает только показатели газа. Используйте его, когда нужно точное значение газа без полного payload симуляции.

### `tenderly_simulateTransaction`

Симулирует транзакцию так, как она выполнилась бы на заданном блоке.

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

1. **Transaction** Transaction `OBJECT`
   * **from** (*опционально*) `STRING`: адрес в hex
   * **to** `STRING`: адрес в hex
   * **gas** (*опционально*) `NUMBER`
   * **maxFeePerGas** (*опционально*) `NUMBER` max fee: максимальная суммарная комиссия за газ, которую отправитель готов заплатить (включает сетевую / базовую комиссию и комиссию майнера / приоритетную), в wei
   * **maxPriorityFeePerGas** (*опционально*) `NUMBER` max priority fee: максимальная комиссия за газ, которую отправитель готов заплатить майнерам, в wei
   * **gasPrice** (*опционально*) `NUMBER`: цена газа, которую отправитель готов заплатить, в wei
   * **value** (*опционально*) `NUMBER`
   * **data** (*опционально*) `STRING`: байты в hex
   * **accessList** (*опционально*) `ARRAY` из записей access list `OBJECT`
     * **address** `STRING` адрес в hex
     * **storageKeys** `ARRAY` из `STRING` — представление 32-байтового ключа хранилища в hex
2. **Simulation Block Number** (*опционально*) Номер блока, против которого должна быть симулирована транзакция. Одно из:
   * `STRING` номер блока
   * `ENUM` тег блока `earliest|finalized|safe|latest|pending`
3. **State Overrides** (*опционально*) `MAP`: сопоставление учётной записи (адреса) со спецификацией переопределения
   * **key** `STRING`: учётная запись, к которой применяется переопределение
   * **value** `OBJECT`: спецификация переопределения
     * **nonce** (*опционально*) `STRING`: hex-переопределение 8-байтового nonce для учётной записи
     * **code** (*опционально*) `STRING`: данные переопределения кода для учётной записи
     * **balance** (*опционально*) `STRING`: hex-переопределение 32-байтового баланса для учётной записи в wei
     * **stateDiff** (*опционально*) `MAP`: сопоставление ключа хранилища со значением переопределения
       * **key** `STRING`: ключ хранилища
       * **value** `STRING`: переопределяемое значение для указанного ключа хранилища
4. **Block Overrides** (опционально) `OBJECT`: набор полей заголовка блока для переопределения.
   * **number** *(опционально)* `STRING`: hex, переопределяет номер блока
   * **difficulty** *(опционально)* `STRING`: hex, переопределяет сложность блока
   * **time** (*опционально*) `STRING`: hex, переопределяет временную метку блока
   * **gasLimit** *(опционально)* `STRING`: hex, переопределяет лимит газа
   * **coinbase** *(опционально)* `STRING`: hex, переопределяет майнера блока
   * **random** *(опционально)* `STRING`: hex, переопределяет extra data блока, которое подаётся в опкод RANDOM
   * **baseFee** *(опционально)* `STRING`: hex, переопределяет базовую комиссию блока

**Пример**

<Tabs>
  <Tab title="example.json">
    ```json title="example.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "method": "tenderly_simulateTransaction",
      "params": [
        {
          "from": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
          "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
          "data": "0xa9059cbb00000000000000000000000020a5814b73ef3537c6e099a0d45c798f4bd6e1d60000000000000000000000000000000000000000000000000000000000000001"
        },
        "0xF4D880"
      ]
    }
    ```
  </Tab>

  <Tab title="example">
    ```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": "tenderly_simulateTransaction",
    "params": [
    {
    "from": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
    "data": "0xa9059cbb00000000000000000000000020a5814b73ef3537c6e099a0d45c798f4bd6e1d60000000000000000000000000000000000000000000000000000000000000001"
    },
    "0xF4D880"
    ]
    }'
    ```
  </Tab>

  <Tab title="example.js">
    ```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 runSimulateTransaction() {
    // Initialize an ethers instance
    const provider = new ethers.providers.JsonRpcProvider(
    'https://goerli.gateway.tenderly.co/$TENDERLY_WEB3_GATEWAY_KEY',
    );

    // Execute method
    const result = await provider.send('tenderly_simulateTransaction', [

    {
    from: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
    to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
    data: '0xa9059cbb00000000000000000000000020a5814b73ef3537c6e099a0d45c798f4bd6e1d60000000000000000000000000000000000000000000000000000000000000001',
    },
    '0xF4D880',
    ]);

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

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

  <Tab title="example.json">
    ```json title="example.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "result": {
      "status": true,
      "gasUsed": "0xc94e",
      "cumulativeGasUsed": "0x0",
      "blockNumber": "0x1103aae",
      "type": "0x0",
      "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000002000000080000000000000000000000000000000000000000000008000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000004000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000200000800000000000000000000000000000000000000000000000000000",
      "logs": [
    {
      "name": "Transfer",
      "anonymous": false,
      "inputs": [
    {
      "value": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
      "type": "address",
      "name": "src"
    },
    {
      "value": "0x20a5814b73ef3537c6e099a0d45c798f4bd6e1d6",
      "type": "address",
      "name": "dst"
    },
    {
      "value": "1",
      "type": "uint256",
      "name": "wad"
    }
      ],
      "raw": {
      "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
      "topics": [
      "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
      "0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045",
      "0x00000000000000000000000020a5814b73ef3537c6e099a0d45c798f4bd6e1d6"
      ],
      "data": "0x0000000000000000000000000000000000000000000000000000000000000001"
    }
    }
      ],
      "trace": [
    {
      "type": "CALL",
      "from": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
      "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
      "gas": "0xbeb6dbc",
      "gasUsed": "0x750a",
      "value": "0x0",
      "input": "0xa9059cbb00000000000000000000000020a5814b73ef3537c6e099a0d45c798f4bd6e1d60000000000000000000000000000000000000000000000000000000000000001",
      "decodedInput": [
    {
      "value": "0x20a5814b73ef3537c6e099a0d45c798f4bd6e1d6",
      "type": "address",
      "name": "dst"
    },
    {
      "value": "1",
      "type": "uint256",
      "name": "wad"
    }
      ],
      "method": "transfer",
      "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
      "decodedOutput": [
    {
      "value": true,
      "type": "bool",
      "name": ""
    }
      ],
      "subtraces": 0,
      "traceAddress": [
      0
      ]
    }
      ],
      "assetChanges": [
    {
      "assetInfo": {
      "standard": "ERC20",
      "type": "Fungible",
      "contractAddress": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
      "symbol": "weth",
      "name": "WETH",
      "logo": "https://assets.coingecko.com/coins/images/2518/large/weth.webp?1628852295",
      "decimals": 18,
      "dollarValue": "1834.6199951171875"
    },
      "type": "Transfer",
      "from": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
      "to": "0x20a5814b73ef3537c6e099a0d45c798f4bd6e1d6",
      "rawAmount": "0x1",
      "amount": "0.000000000000000001",
      "dollarValue": "0.0000000000000018346199951171875"
    }
      ],
      "balanceChanges": [
    {
      "address": "0x20a5814b73ef3537c6e099a0d45c798f4bd6e1d6",
      "dollarValue": "0.0000000000000018346199951171875",
      "transfers": [
      0
      ]
    },
    {
      "address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
      "dollarValue": "-0.0000000000000018346199951171875",
      "transfers": [
      0
      ]
    }
      ]
    }
    }
    ```
  </Tab>
</Tabs>

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

Результат симуляции `OBJECT`

* **status** `NUMBER:` либо `1` (успех), либо `0` (провал)
* **gasUsed** `NUMBER`: количество газа, использованного этой конкретной транзакцией
* **cumulativeGasUsed** `NUMBER`: суммарное количество газа, использованное к моменту выполнения этой транзакции в блоке
* **blockNumber** `NUMBER`: номер блока, в котором транзакция была симулирована
* **type** `NUMBER`: тип транзакции, `0x00` для legacy-транзакций, `0x01` для типов с access list, `0x02` для динамических комиссий
* **logsBloom** `STRING`: bloom-фильтр для лёгких клиентов, позволяющий быстро находить связанные логи
* **logs**: массив эмитированных событий `ARRAY` из `OBJECT`
  * **name** `STRING`: имя события
  * **anonymous** `BOOLEAN`: указывает, является ли событие анонимным
  * **inputs**: массив декодированных аргументов лога `ARRAY` из декодированных логов `OBJECT`
    * **name** `STRING`: имя аргумента события
    * **type** `STRING`: тип аргумента события из системы типов Solidity
    * **value** (*опционально*) `STRING` строковое представление значения аргумента; интерпретируйте согласно полю `type`
  * **raw** `OBJECT`: сырые логи
    * **address** `STRING` адрес в hex: адрес контракта, эмитирующего лог
    * **topics** `ARRAY` из `STRING` 32-байтовых hex-значений
    * **data** `STRING` строка в hex, представляющая данные события
* **trace**: Trace `ARRAY` из `OBJECT`
  * **type** `STRING` type: тип элемента трассировки — один из `CALL`| `CALLCODE`| `STATICCALL`| `DELEGATECALL`| `CREATE`| `CREATE2`| `SELFDESTRUCT`
  * **from** `STRING`: адрес в hex
  * **to** `STRING`: адрес в hex
  * **gas** `STRING`: hex-кодированное беззнаковое 64-байтовое целое, представляющее газ события
  * **gasUsed** `STRING`: hex-кодированное беззнаковое 64-байтовое целое, представляющее gasUsed события
  * **value** `STRING`: hex-кодированное беззнаковое 64-байтовое целое, представляющее value события в wei
  * **error** `STRING`: низкоуровневая ошибка виртуальной машины
  * **errorReason** `STRING`: извлечённая причина ошибки при revert
  * **input** `STRING`: hex-кодированная строка, представляющая сырые входные байты для точки трассировки
  * **method** `STRING`: вызванный метод контракта
  * **decodedInput** : декодированный вход вызванного метода — `ARRAY` из декодированных входных аргументов `OBJECT`
    * **value** `STRING`: строковое представление значения аргумента; интерпретируйте согласно полю `type`.
    * **type** `STRING`: тип Solidity этого аргумента
    * **name** `STRING`: имя этого аргумента
  * **output** `STRING`: сырой выход трассировки
  * **decodedOutput** : декодированный выход вызванного метода — `ARRAY` из декодированных выходных аргументов `OBJECT`
    * **value** `STRING`: строковое представление значения аргумента; интерпретируйте согласно полю `type`.
    * **type** `STRING`: тип Solidity этого аргумента
    * **name** `STRING`: имя этого аргумента
  * **subtraces** `NUMBER`: количество дочерних трассировок
  * **traceAddress** : позиция трассировки `ARRAY` из `NUMBER`
* **`assetChanges`** `ARRAY`:
  * **`type`** `STRING` тип изменения актива, может быть transfer, mint, burn
  * **`from`** `STRING`: адрес отправителя (пусто для mint-переводов)
  * **`to`** `STRING`: адрес получателя (пусто для burn-переводов)
  * **`amount`** `STRING`: количество переведённого токена
  * **`rawAmount`** `STRING`: сырое количество перевода токена
  * **`dollarValue`**`STRING`: долларовая стоимость переведённого токена
  * **`assetInfo`**`OBJECT`: информация об активе
    * **`standard`** `STRING`: поддерживаемые стандарты токенов: ERC20, ERC721, NativeCurrency
    * **`type`** `STRING`: тип токена: Native, Fungible, Non-Fungible
    * **`contractAddress`**`STRING` : адрес контракта
    * **`symbol`** `STRING`: символ токена
    * **`name`** `STRING`: имя токена
    * **`logo`** `STRING`: URL иконки токена
    * **`decimals`** `NUMBER`: количество знаков после запятой у токена
    * **`dollarValue`**`STRING`: долларовая стоимость одного токена
* **`balanceChanges`** `ARRAY`: массив изменений баланса — суммарных изменений активов
  * **`address`** `STRING` адрес
  * **`dollarValue`** `STRING`: долларовая стоимость суммарных изменений активов
  * **`transfers`** `ARRAY`: массив индексов изменений активов

### `tenderly_estimateGas`

Рассчитывает точную оценку газа для заданной транзакции, с опциональными переопределениями состояния и блока в стиле симуляции. Оценка основана на полностью выполненной транзакции, даже если указанный `gas` недостаточен, поэтому возвращаемое значение точное. В отличие от этого, `eth_estimateGas` может откатиться и дать заниженную оценку.

**Отличия от `tenderly_simulateTransaction`:**

* Оба метода выполняют транзакцию одинаково против заданного блока и оба принимают одинаковые переопределения состояния и блока.
* `tenderly_simulateTransaction` возвращает полный декодированный результат выполнения: логи, трассировку вызовов, изменения активов и изменения балансов.
* `tenderly_estimateGas` возвращает только два показателя газа: рекомендуемый лимит газа и фактически потреблённый газ. Используйте его, когда нужны только значения газа; используйте `tenderly_simulateTransaction`, когда нужно предварительно оценить эффекты транзакции.

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

1. **Transaction** Transaction `OBJECT`: тот же формат, что и в [`tenderly_simulateTransaction`](#tenderly_simulatetransaction) (`from`, `to`, `gas`, `gasPrice`, `value`, `data`, `accessList`)
2. **Simulation Block Number** (*опционально*) Номер блока, против которого должна быть выполнена транзакция. Одно из:
   * `STRING` номер блока
   * `ENUM` тег блока `earliest|finalized|safe|latest|pending`
3. **State Overrides** (*опционально*) `MAP`: сопоставление учётной записи (адреса) со спецификацией переопределения, тот же формат, что и в [`tenderly_simulateTransaction`](#tenderly_simulatetransaction)
4. **Block Overrides** (*опционально*) `OBJECT`: набор полей заголовка блока для переопределения, тот же формат, что и в [`tenderly_simulateTransaction`](#tenderly_simulatetransaction)

**Пример**

<Tabs>
  <Tab title="example.json">
    ```json title="example.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "method": "tenderly_estimateGas",
      "params": [
        {
          "from": "0x8516feaea147ea0db64d1c5b97bb651ca5435155",
          "to": "0x6b175474e89094c44da98b954eedeac495271d0f",
          "data": "0xa9059cbb0000000000000000000000003fc3c4c84bdd2db5ab2cc62f93b2a9a347de25fb00000000000000000000000000000000000000000000001869c36187f3430000",
          "value": "0x0"
        },
        "21285787"
      ]
    }
    ```
  </Tab>

  <Tab title="example">
    ```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": "tenderly_estimateGas",
    "params": [
    {
    "from": "0x8516feaea147ea0db64d1c5b97bb651ca5435155",
    "to": "0x6b175474e89094c44da98b954eedeac495271d0f",
    "data": "0xa9059cbb0000000000000000000000003fc3c4c84bdd2db5ab2cc62f93b2a9a347de25fb00000000000000000000000000000000000000000000001869c36187f3430000",
    "value": "0x0"
    },
    "21285787"
    ]
    }'
    ```
  </Tab>

  <Tab title="response.json">
    ```json title="response.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "result": {
        "gas": "0x12579",
        "gasUsed": "0xff06"
      }
    }
    ```
  </Tab>
</Tabs>

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

Оценка газа `OBJECT`

* **gas** `STRING`: hex-кодированный рекомендуемый лимит газа для установки в транзакции (включает запас над фактически потреблённым газом)
* **gasUsed** `STRING`: hex-кодированное количество газа, фактически потреблённое выполненной транзакцией
