> For the complete documentation index, see [llms.txt](https://docs.termina.technology/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.termina.technology/documentation/developer-docs-ru/scenarii/vosproizvedenie-rynka.md).

# Воспроизведение рынка

{% stepper %}
{% step %}

#### Выбор отрезка времени

Проверьте, попадает ли нужный диапазон в готовые бандлы: они покрывают последние 30 дней. При необходимости сузьте поиск флагами `--after <DATE>` или `--before <DATE>`.

```bash
sim ranges
```

```
Start Time (UTC)       End Time (UTC)         Start Slot    End Slot      Bundle Size   Kind            Scope
----------------------------------------------------------------------------------------------------------------------------------
2026-06-30T17:53:10Z   2026-06-30T19:00:53Z   429,926,541   429,936,540   10,000        account_state   global
2026-06-30T18:23:38Z   2026-06-30T18:27:02Z   429,931,041   429,931,540   500           account_state   global
2026-07-19T05:50:16Z   2026-07-19T07:00:13Z   433,838,452   433,848,451   10,000        account_state   global
```

Для диапазонов старше 30 дней или тех, что попадают между готовыми бандлами, соберите собственный бандл.

```bash
sim bundle build --start-slot 400000000 --end-slot 400001000
```

{% endstep %}

{% step %}

#### Базовый прогон

Запустите сессию, чтобы заново исполнить транзакции и зафиксировать текущее поведение. Если диапазон покрывается несколькими бандлами, флаг `--parallel` разделит работу между одновременными сессиями.

```bash
# Базовый прогон
sim run \
  --start-slot 400000000 \
  --end-slot 400001000 \
  --program-id <PROGRAM_ID> \
  --output-file baseline.json
```

Результат записывается в JSON-файл, где каждая запись идет с новой строки.

<details>

<summary>baseline.json</summary>

```json
{
  "metadata": {
    "start_slot": 400000000,
    "end_slot": 400001000,
    "program_id": "<PROGRAM_ID>",
    "session_ids": ["..."],
    "timestamp": "2026-05-29T03:06:07Z"
  },
  "transactions": [
    {
      "slot": 400000042,
      "signature": "<BASE58_SIG>",
      "success": true,
      "error": null,
      "logs": ["Program log: ...", "..."],
      "sol_changes": { "<PUBKEY>": -5000000 },
      "token_changes": { "<PUBKEY>": { "<MINT>": -1000 } },
      "account_diffs": { "<PUBKEY>": { "before": "...", "after": "..." } }
    }
  ],
  "summary": {
    "total": 847,
    "successes": 831,
    "failures": 16
  }
}
```

</details>

В `sim` есть команда, которая читает этот JSON и кратко подводит итоги прогона.

```bash
sim summarize baseline.json
```

```
File        : baseline.json
Slot range  : 400000000 → 400001000
Program IDs : <PROGRAM_ID>
Session(s)  : 10
Ran at      : 2026-05-29 03:06:07 UTC

i Transactions : 205308 (96972 successes, 108336 failures)
```

```bash
# Отследить изменения баланса конкретного кошелька
sim summarize baseline.json --accounts E2gE...
```

```
Account: E2gE...
  SOL  29.455253127 → 29.293640983  (Δ -0.161612144)
```

{% endstep %}

{% step %}

#### Эксперимент

Соберите измененную версию программы: с новыми параметрами, доработками или исправлениями ошибок. Подставьте ее вместо исходного бинарника и прогоните новую логику на тех же исторических транзакциях.

```bash
# Эксперимент
sim run \
  --start-slot 400000000 \
  --end-slot 400001000 \
  --program-id <PROGRAM_ID> \
  --program-so <PATH_TO_NEW_BINARY> \
  --output-file experiment.json
```

Если новой программе нужно больше вычислительных единиц (CU), поднимите лимит флагом `--extra-compute-units <EXTRA_UNITS>`, иначе транзакции будут падать.
{% endstep %}

{% step %}

#### Сравнение результатов

Когда готовы и базовый прогон, и эксперимент, сравните их:

* регрессии: транзакция раньше проходила -> теперь падает
* улучшения: транзакция раньше падала -> теперь проходит
* изменения балансов: разница по токен-аккаунтам каждого аккаунта

```bash
sim compare baseline.json experiment.json
```

```bash
# Показать только то, что сломалось
sim compare baseline.json experiment.json regressions
```

```bash
# Проверить влияние на P&L
sim compare baseline.json experiment.json balances
```

{% endstep %}
{% endstepper %}
