Симуляция пакета Mint, Approve и TransferFrom для токена
Симулируйте пакет из 3 шагов, который минтит DAI, одобряет spender и передаёт токены, с общим состоянием между шагами для тестирования многотранзакционных потоков.
Это руководство создаёт пакет симуляции из 3 шагов, который отрабатывает классический процесс одобрения ERC-20: минтинг токенов держателю, одобрение spender’у, а затем вызов transferFrom этим spender’ом. Каждый шаг зависит от состояния, создаваемого предыдущим шагом, поэтому именно пакет — правильный инструмент.
Функция mint в DAI защищена маппингом wards: вызвать её могут только адреса, зарегистрированные как wards. Fake ward (0xe2e2...e2) не является ward в mainnet. Чтобы этот шаг прошёл успешно, добавьте переопределение состояния, которое устанавливает слот хранилища ward для этого адреса в 1:
Spender перемещает 0.03 DAI от держателя получателю. Это работает, потому что шаг 2 предоставил разрешение (allowance), которое видно только внутри потока состояния пакета, а не в сети.
Затем раскройте State overrides, добавьте контракт DAI и введите слот хранилища ward и значение из таблицы выше. Нажмите Add storage override, чтобы зафиксировать слот.
Step 1 with the mint calldata filled and the ward state override configured.
4
Добавьте шаг 2: Approve
Нажмите + Add function call на панели пакета. Переключите новый шаг в режим Raw. Установите:
Нажмите Simulate (или клавиши ⌘↵). Все три шага выполняются последовательно. Нажмите каждый шаг на панели, чтобы просмотреть его декодированный вывод, использованный газ, события и трансферы токенов.
The bundle after running: step 2 (approve) is focused, showing the Approval event and decoded output.
Step 3 (transferFrom) succeeded. The 0.03 DAI transfer is visible in the ERC-20 transfers tab.
Ответ — массив из трёх результатов симуляции, по одному на шаг. Каждая запись содержит status, gasUsed, декодированные logs, trace, assetChanges и balanceChanges.Успешное выполнение показывает "status": true для всех трёх шагов. Если шаг откатывается (например, потому что в шаге 1 отсутствует переопределение состояния), API возвращает все результаты вплоть до сбойного шага включительно, а последующие шаги не выполняются.
Запись assetChanges с "type": "Mint" и зачислением 2 DAI держателю. Событие Transfer с нулевого адреса.
Approve
Событие Approval в logs. Изменений активов нет (approve не перемещает токены).
TransferFrom
Запись assetChanges с "type": "Transfer" и перемещением 0.03 DAI от держателя к получателю. Событие Transfer в logs. balanceChanges показывает отрицательное изменение у держателя и положительное у получателя.