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

# Симуляция с State Overrides

> Используйте переопределения состояния в builder'е симуляций, чтобы задать пользовательское состояние контракта перед запуском симуляции, что демонстрируется минтингом DAI с адреса, не являющегося ward.

State overrides задают пользовательские значения хранилища контракта перед выполнением симуляции. Используйте их, чтобы удовлетворить проверки контроля доступа, «подсадить» балансы или задать любому слоту хранилища значение, необходимое вашему сценарию, не владея ключами или состоянием в реальной сети.

Эта страница проходит через полный пример. Полное описание полей cheatcode State overrides см. в [Simulation Parameters](/simulator-ui/parameters#state-overrides).

## Пример: минтинг 2 DAI

Мы симулируем минтинг 2 DAI (`2000000000000000000` wei) на держателя `0xe58b9ee93700a616b50509c8292977fa7a0f8ce1`, отправляемый с `0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2`.

Функция `mint` DAI защищена маппингом `wards`: минтить могут только зарегистрированные адреса ward. Отправитель не является ward в Mainnet, поэтому обычная симуляция откатывается. Переопределение `wards[0xe2e2…e2e2] = 1` делает его ward на время симуляции.

### Постройте шаг mint

1. Перейдите в **Simulator** и нажмите **New Simulation**.
2. В поле **Contract** вставьте `0x6b175474e89094c44da98b954eedeac495271d0f` и выберите **Dai**.
3. Выберите **mint** в поле **Function**.
4. Установите **usr** в `0xe58b9ee93700a616b50509c8292977fa7a0f8ce1`, а **wad** в `2000000000000000000`.
5. Установите **From** шага в `0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2`.

### Добавьте переопределение состояния

6. Разверните секцию **State overrides** под полями шага и нажмите **Add State Override**. Контракт переопределения по умолчанию совпадает с целью шага (Dai).
7. В **Storage variables** введите ключ `wards[0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2]` и значение `1`. Поле ключа предлагает декодированные переменные хранилища контракта (`wards[]`, `balanceOf[]`, `totalSupply` и так далее); заполните ключ маппинга внутри скобок.
8. Нажмите кнопку **+** рядом со значением, чтобы добавить пару. Зафиксированная пара появится строкой под Storage variables. Tenderly сохраняет её как вычисленный хеш слота хранилища.

<Frame caption="Шаг mint с зафиксированным переопределением wards под Storage variables.">
  <img src="https://mintcdn.com/tenderly/5rOzguRoBTCVuzKW/images/simulator-ui/sim-override-mint-form.webp?fit=max&auto=format&n=5rOzguRoBTCVuzKW&q=85&s=9a03769f1aa12076c42894d4053a6ecf" alt="Step editor with Dai mint function, usr and wad arguments filled, and the State overrides section showing the committed wards mapping override" width="240" height="660" data-path="images/simulator-ui/sim-override-mint-form.webp" />
</Frame>

<Note>
  Пара переопределения должна быть зафиксирована кнопкой **+**. Незафиксированная запись ключа/значения считается невалидной, и симуляция не запустится.
</Note>

Чтобы переопределить нативный баланс контракта вместо (или в дополнение к) хранилищу, включите переключатель **Use custom balance** в той же секции.

### Запустите и изучите

9. Нажмите **Simulate**. Mint выполняется успешно, потому что симуляция видит отправителя как ward.

<Frame caption="Успешный mint: перевод ERC-20 в 2 DAI на держателя, с выполненной трассировкой ниже.">
  <img src="https://mintcdn.com/tenderly/5rOzguRoBTCVuzKW/images/simulator-ui/sim-override-mint-result.webp?fit=max&auto=format&n=5rOzguRoBTCVuzKW&q=85&s=b9ff257affa00dbfcf1b2bc7c924ca56" alt="Simulation result showing Status Success for mint(), an ERC-20 transfer row crediting 2 DAI, and the decoded execution trace" width="1512" height="982" data-path="images/simulator-ui/sim-override-mint-result.webp" />
</Frame>

Вкладки результатов подтверждают, что изменило переопределение:

* Вкладка **Events** показывает событие `Transfer` с нулевого адреса на держателя для `2000000000000000000` wei.

<Frame caption="Событие Transfer, испущенное mint'ом.">
  <img src="https://mintcdn.com/tenderly/5rOzguRoBTCVuzKW/images/simulator-ui/sim-override-events.webp?fit=max&auto=format&n=5rOzguRoBTCVuzKW&q=85&s=4e9c41da8f75879b8b715e6c4a2ca6c3" alt="Events tab showing the decoded Transfer event with src, dst, and wad fields" width="1179" height="290" data-path="images/simulator-ui/sim-override-events.webp" />
</Frame>

* Вкладка **State** отображает применённые **State Overrides** (слот ward, установленный в `1`) и результирующие **State Changes**: `balanceOf` держателя, растущий с `0` до `2000000000000000000`, увеличенный `totalSupply` и nonce отправителя.

<Frame caption="Вкладка State: применённые переопределения вверху, декодированные изменения состояния ниже.">
  <img src="https://mintcdn.com/tenderly/5rOzguRoBTCVuzKW/images/simulator-ui/sim-override-state.webp?fit=max&auto=format&n=5rOzguRoBTCVuzKW&q=85&s=d123abc5781646dc02da87f5d61e44a0" alt="State tab showing the wards storage slot override under State Overrides and the balanceOf and totalSupply changes under State Changes" width="1179" height="330" data-path="images/simulator-ui/sim-override-state.webp" />
</Frame>

## Сырые ключи хранилища

Вместо декодированной формы `mapping[key]` вы можете напрямую ввести сырой 32-байтовый слот хранилища. Для Solidity-маппинга в позиции хранилища `p` слот для `mapping[k]` равен `keccak256(abi.encode(k, p))`. Переопределение wards выше разрешается в:

```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03
```

Сырые ключи — единственный вариант для контрактов без верифицированного исходного кода, и они соответствуют формату, используемому [state overrides Simulation API](/simulations/state-overrides) и [руководством по бандлу](/simulations/guides/mint-approve-transfer-bundle).

## Сохранение переопределённого состояния

Симуляции stateless: переопределение применяется к одному запуску. Чтобы сохранить изменённое состояние как постоянное окружение, с которым вы можете многократно взаимодействовать, используйте [Virtual Environments](/virtual-environments/overview).
