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

# Бэктест позиции в токене на исторических блоках

> Сделайте форк на прошлом блоке, откройте позицию в доходном токене и воспроизведите историю mainnet с Network Mirror Mode, чтобы измерить доходность.

[Network Mirror Mode](/virtual-environments/network-mirror-mode) воспроизводит реальные блоки родительской сети на Virtual Environment. Когда Virtual Environment форкнута на **прошлом блоке**, это воспроизведение охватывает реальную историю: каждая транзакция mainnet от точки форка повторно исполняется на вашей приватной копии, по порядку. В этом руководстве воспроизведение используется для бэктеста позиции: форк на прошлую дату, покупка доходного токена, воспроизведение истории вперёд и чтение доходности, которую позиция фактически заработала за период.

Рабочий пример: токен Franklin OnChain U.S. Government Money Fund (`BENJI`) на Ethereum Mainnet. Тот же процесс применим к любому доходному токену.

<Note>
  Network Mirror Mode доступен на платном тарифе. Чтобы включить его для вашего аккаунта, [свяжитесь с отделом продаж](https://tenderly.co/contact-us).
</Note>

<Steps>
  ### Создайте Virtual Environment на прошлом блоке

  Создайте новую Virtual Environment в вашем проекте. В форме создания укажите:

  * **Networks**: Ethereum Mainnet
  * **Network mode**: **Network mirror** (полное поблочное воспроизведение mainnet)
  * Снимите флажок **Start from latest block**, выберите тип точки отсчёта **Block Number** и введите номер блока на дату начала позиции. Столбец **Fork from block** показывает блок форка для каждой выбранной сети.

  <Frame caption="Форма Create Virtual Environment: выбран режим Network mirror, флажок Start from latest block снят, в качестве точки отсчёта задан прошлый номер блока.">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-create.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=eee8be67183659b356bdaf46dad8203b" alt="Create Virtual Environment form with Ethereum Mainnet, Network mirror mode, and a past fork block number entered" width="1600" height="1330" data-path="images/testnets/mirror-backtest-create.webp" />
  </Frame>

  Создайте Virtual Environment, откройте её и перейдите на вкладку **Network sync**. Панель **Network sync status** показывает голову mainnet, голову Virtual Environment (стоящую на вашем блоке форка) и количество блоков отставания от mainnet. Этот разрыв и есть отрезок истории, который охватит воспроизведение.

  <Frame caption="Панель Network sync status: голова mainnet, голова Virtual Environment на блоке форка и счётчик отставания в блоках.">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-sync-status.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=0cb57769a10ffac34ebbf7a652f02f59" alt="Network sync status panel showing Mainnet head 25,638,816, Virtual Environment head 25,634,161, and 4,655 blocks behind mainnet" width="1600" height="1000" data-path="images/testnets/mirror-backtest-sync-status.webp" />
  </Frame>

  ### Профинансируйте кошелёк и откройте позицию

  Реальное состояние сети на момент блока форка уже доступно в Virtual Environment, так что контракт токена фонда и любые пулы, где он торгуется, на месте.

  [Читкоды Admin RPC отключены, пока синхронизация активна](/virtual-environments/network-mirror-mode#cheatcode-behavior), поэтому выполните всю подготовку до запуска воспроизведения. Убедитесь, что синхронизация на паузе: панель статуса показывает **Start auto-sync**, а не работающий таймер.

  1. Используйте **RPC Cheatcodes** в правом верхнем углу, чтобы профинансировать кошелёк инвестора: [`tenderly_setBalance`](/virtual-environments/admin-rpc#tenderly_setbalance) для ETH на газ и [`tenderly_setErc20Balance`](/virtual-environments/admin-rpc#tenderly_seterc20balance) для стейблкоина, который будет инвестирован.
  2. Приобретите токен фонда так, как это сделал бы инвестор: обменяйте на него или подпишитесь через ончейн-процесс фонда. Кошелёк теперь держит позицию по состоянию на дату форка.

  ### Отслеживайте баланс позиции

  Оставаясь на вкладке **Network sync**, переключите нижнюю панель с **Sync operations** на **State drift**, затем откройте под-вкладку **Balance**.

  Нажмите **Track balance** и заполните диалог **Track wallet balance**:

  * **Wallet**: кошелёк инвестора
  * **Token**: токен фонда (`BENJI`: `0x3DDc84940Ab509C11B20B76B466933f40b750dc9`)

  Появится карточка с кошельком, токеном и счётчиком **Diff**. До воспроизведения блоков она показывает «No balance drift data yet».

  <Frame caption="Диалог Track wallet balance: кошелёк инвестора и токен фонда BENJI.">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-track-dialog.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=b59d880652741ac8ac914a80c078958b" alt="Track wallet balance dialog with a wallet address and the BENJI token on Mainnet selected" width="528" height="304" data-path="images/testnets/mirror-backtest-track-dialog.webp" />
  </Frame>

  ### Воспроизведите историю вперёд

  В панели **Network sync status**:

  1. Откройте выпадающий список скорости рядом с кнопкой синхронизации и выберите **4×** (один блок каждые 3 секунды; см. [настройки скорости](/virtual-environments/network-mirror-mode#time-controls)).
  2. Нажмите **Start auto-sync**.

  Virtual Environment воспроизводит реальные блоки mainnet на форке. Голова Virtual Environment растёт, счётчик отставания уменьшается, и каждая реальная транзакция за период повторно исполняется по порядку, включая ончейн-выплаты доходности фонда.

  На карточке **Balance** каждая воспроизведённая выплата доходности ступенчато увеличивает отслеживаемый баланс на графике. Дайте воспроизведению покрыть период, который хотите измерить, затем нажмите **Stop auto-sync**.

  <Frame caption="Карточка Balance после воспроизведения: отслеживаемый баланс BENJI ступенчато растёт на блоке, где повторно исполняется выплата фонда.">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-drift-step.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=1c7dceeba8d7b143abca2a721c2a0403" alt="State drift Balance card showing a flat BENJI balance line stepping up sharply at block 25,634,222" width="700" height="380" data-path="images/testnets/mirror-backtest-drift-step.webp" />
  </Frame>

  ### Прочитайте реализованную доходность

  Карточка **Balance** теперь содержит результат:

  * График показывает отслеживаемый баланс на каждом воспроизведённом блоке. Каждая выплата отображается как ступенька вверх; разница между балансом в начале и в конце воспроизведённого окна и есть реализованная доходность за период. Для фонда с NAV \$1.00 это доходность в долларах.
  * Наведите курсор на график, чтобы прочитать баланс на любом блоке.
  * Счётчик **Diff** показывает, насколько отслеживаемый баланс отклонился от mainnet на той же высоте блока. Он остаётся `0.000`, пока воспроизведение повторяет историю mainnet без изменений, и меняется, когда ваши транзакции на Virtual Environment изменяют позицию относительно mainnet.

  Для годовой ставки, при приросте *G* на капитал *P* за *D* дней воспроизведённой истории: `APY ≈ (1 + G/P)^(365/D) − 1`.

  ### Сравните сценарии (опционально)

  * **Rewind** откатывает последние синхронизированные блоки, чтобы можно было заново прогнать отрезок истории.
  * **Sync block** продвигает ровно на один блок; это удобно, чтобы попасть на отдельную выплату доходности и прочитать её изолированно.
  * Создайте вторую Virtual Environment на другом блоке форка или с другим размером позиции, чтобы сравнить результаты рядом.
</Steps>

## Практические заметки

* **Доходность появляется, когда воспроизводятся реальные транзакции доходности фонда.** Баланс ребейз-токена растёт автоматически. Для фонда, распределяющего доход зарегистрированным держателям, отслеживайте позицию держателя, чтобы выплаты попадали на неё.
* **Читкоды ставятся на паузу вместе с синхронизацией.** Выполните всю подготовку (финансирование, вход в позицию), пока синхронизация на паузе, затем запустите воспроизведение.
* **Одна сеть на окружение.** Network Mirror Mode работает с одной родительской сетью; он не совмещается с [multichain Virtual Environments](/virtual-environments/multichain/overview).
* **Воспроизведение ограничено реальными блоками.** Длинный период означает воспроизведение большого числа блоков. Чтобы быстро зафиксировать доходность, сделайте форк незадолго до известной выплаты или воспроизведите репрезентативное окно и приведите к годовой ставке.

## Дальнейшие шаги

* Отслеживайте слот хранилища вместо баланса (**State drift → State → Track variable**), чтобы следить за любой переменной контракта за воспроизведённый период.
* Направьте RPC вашего dapp на Virtual Environment, чтобы управлять тем же воспроизведением из собственного UI. См. [Stage dapps](/virtual-environments/ci-cd/stage-dapps).
* Прочитайте концептуальную страницу [Network Mirror Mode](/virtual-environments/network-mirror-mode): механика синхронизации, контроль времени и поведение читкодов.
