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

Пример: минтинг 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.

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

  1. Разверните секцию State overrides под полями шага и нажмите Add State Override. Контракт переопределения по умолчанию совпадает с целью шага (Dai).
  2. В Storage variables введите ключ wards[0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2] и значение 1. Поле ключа предлагает декодированные переменные хранилища контракта (wards[], balanceOf[], totalSupply и так далее); заполните ключ маппинга внутри скобок.
  3. Нажмите кнопку + рядом со значением, чтобы добавить пару. Зафиксированная пара появится строкой под Storage variables. Tenderly сохраняет её как вычисленный хеш слота хранилища.
Step editor with Dai mint function, usr and wad arguments filled, and the State overrides section showing the committed wards mapping override
Пара переопределения должна быть зафиксирована кнопкой +. Незафиксированная запись ключа/значения считается невалидной, и симуляция не запустится.
Чтобы переопределить нативный баланс контракта вместо (или в дополнение к) хранилищу, включите переключатель Use custom balance в той же секции.

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

  1. Нажмите Simulate. Mint выполняется успешно, потому что симуляция видит отправителя как ward.
Simulation result showing Status Success for mint(), an ERC-20 transfer row crediting 2 DAI, and the decoded execution trace
Вкладки результатов подтверждают, что изменило переопределение:
  • Вкладка Events показывает событие Transfer с нулевого адреса на держателя для 2000000000000000000 wei.
Events tab showing the decoded Transfer event with src, dst, and wad fields
  • Вкладка State отображает применённые State Overrides (слот ward, установленный в 1) и результирующие State Changes: balanceOf держателя, растущий с 0 до 2000000000000000000, увеличенный totalSupply и nonce отправителя.
State tab showing the wards storage slot override under State Overrides and the balanceOf and totalSupply changes under State Changes

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

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

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

Симуляции stateless: переопределение применяется к одному запуску. Чтобы сохранить изменённое состояние как постоянное окружение, с которым вы можете многократно взаимодействовать, используйте Virtual Environments.