transferFrom этим spender’ом. Каждый шаг зависит от состояния, создаваемого предыдущим шагом, поэтому именно пакет — правильный инструмент.
Зачем нужен пакет?
Симуляция каждой транзакции по отдельности не работает:- Только Mint: вы можете проверить логику mint, но у адреса-держателя нет токенов в mainnet.
- Только Approve: симуляции нужно, чтобы у держателя действительно был баланс для одобрения.
- Только TransferFrom: требуется, чтобы был и баланс, и одобрение.
Три транзакции
Все три транзакции направлены на контракт DAI в Ethereum mainnet (0x6b175474e89094c44da98b954eedeac495271d0f).
Шаг 1. Mint 2 DAI
mint в DAI защищена маппингом wards: вызвать её могут только адреса, зарегистрированные как wards. Fake ward (0xe2e2...e2) не является ward в mainnet. Чтобы этот шаг прошёл успешно, добавьте переопределение состояния, которое устанавливает слот хранилища ward для этого адреса в 1:
| Поле | Значение |
|---|---|
| Contract | 0x6b175474e89094c44da98b954eedeac495271d0f |
| Storage key | 0xedd7d04419e9c48ceb6055956cbb4e2091ae310313a4d1fa7cbcfe7561616e03 |
| Value | 0x0000000000000000000000000000000000000000000000000000000000000001 |
keccak256(abi.encode(wardAddress, 0)), стандартный слот маппинга Solidity для wards[fakeWardAddress] при позиции хранилища 0.
Шаг 2. Approve 1 DAI
Шаг 3. TransferFrom 0.03 DAI
Запуск через UI Simulator
Откройте Sim Bundle Builder
Перейдите в Simulator в левой навигации, затем нажмите New Simulation. Откроется конструктор пакета с одним пустым шагом.
Настройте панель сессии
Панель сессии расположена сверху. Установите Network в Mainnet и оставьте Block как Pending.
Заполните шаг 1: Mint
Переключите шаг в режим Raw. Установите:
- From:
0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2 - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x40c10f19000000000000000000000000e58b9ee93700a616b50509c8292977fa7a0f8ce10000000000000000000000000000000000000000000000001bc16d674ec80000

Добавьте шаг 2: Approve
Нажмите + Add function call на панели пакета. Переключите новый шаг в режим Raw. Установите:
- From:
0xe58b9ee93700a616b50509c8292977fa7a0f8ce1 - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x095ea7b3000000000000000000000000f7ddedc66b1d482e5c38e4730b3357d32411e5dd0000000000000000000000000000000000000000000000000de0b6b3a7640000
Добавьте шаг 3: TransferFrom
Добавьте ещё один шаг. Переключитесь в режим Raw. Установите:
- From:
0xf7ddedc66b1d482e5c38e4730b3357d32411e5dd - To:
0x6b175474e89094c44da98b954eedeac495271d0f - Calldata:
0x23b872dd000000000000000000000000e58b9ee93700a616b50509c8292977fa7a0f8ce1000000000000000000000000bd8daa414fda8a8a129f7035e7496759c5af8570000000000000000000000000000000000000000000000000006a94d74f430000
Запуск через Simulation API
Используйте эндпоинтsimulate-bundle, чтобы запустить ту же последовательность программно. Замените {accountSlug} и {projectSlug} на ваши значения.
status, gasUsed, декодированные logs, trace, assetChanges и balanceChanges.
Успешное выполнение показывает "status": true для всех трёх шагов. Если шаг откатывается (например, потому что в шаге 1 отсутствует переопределение состояния), API возвращает все результаты вплоть до сбойного шага включительно, а последующие шаги не выполняются.
На что обращать внимание в результатах
| Шаг | Ключевые сигналы |
|---|---|
| Mint | Запись assetChanges с "type": "Mint" и зачислением 2 DAI держателю. Событие Transfer с нулевого адреса. |
| Approve | Событие Approval в logs. Изменений активов нет (approve не перемещает токены). |
| TransferFrom | Запись assetChanges с "type": "Transfer" и перемещением 0.03 DAI от держателя к получателю. Событие Transfer в logs. balanceChanges показывает отрицательное изменение у держателя и положительное у получателя. |
Следующие шаги
- Пакетные симуляции (справочник API): полная документация по эндпоинту и схеме ответа.
- Переопределения состояния: как переопределять хранилище, баланс и байткод в симуляциях.
- UI Simulator: справочник по компоновке и горячие клавиши для конструктора пакетов.

