Сегодня разберем скрипт деплоя для нашего теста.
Файл BatchCallAndSponsor.s.sol содержит тестовый скрипт для контракта BatchCallAndSponsor. Он делает деплой контракта, минтит токены и тестирует функции пакетного и спонсорского выполнения. Мы будем использовать этот скрипт для развертывания контракта и тестирования его функций в локальной сети.
function run() external {
// Start broadcasting transactions with Alice's private key.
vm.startBroadcast(ALICE_PK);
// Deploy the delegation contract (Alice will delegate calls to this contract).
implementation = new BatchCallAndSponsor();
// Deploy an ERC-20 token contract where Alice is the minter.
token = new MockERC20();
// // Fund accounts
token.mint(ALICE_ADDRESS, 1000e18);
vm.stopBroadcast();
// Perform direct execution
performDirectExecution();
// Perform sponsored execution
performSponsoredExecution();
}Для начала запустим локальный блокчейн:
anvil --hardfork prague
В другом терминале установим зависимости проекта и скомпилируем контракты:
forge install
forge build
Теперь можно запускать тесты:
forge test -vvv
В общем, у вас должно получиться следующее:
Ran 4 tests for test/BatchCallAndSponsor.t.sol:BatchCallAndSponsorTest
[PASS] testDirectExecution() (gas: 128386)
Logs:
Sending 1 ETH from Alice to Bob and transferring 100 tokens to Bob in a single transaction
[PASS] testReplayAttack() (gas: 114337)
Logs:
Test replay attack: Reusing the same signature should revert.
[PASS] testSponsoredExecution() (gas: 110461)
Logs:
Sending 1 ETH from Alice to a random address while the transaction is sponsored by Bob
[PASS] testWrongSignature() (gas: 37077)
Logs:
Test wrong signature: Execution should revert with 'Invalid signature'.
Suite result: ok. 4 passed; 0 failed; 0 skipped;
Теперь можно запустить наш скрипт. Тут мы используем команды:
--broadcast: Транслирует транзакции в вашу локальную сеть.
--rpc-url 127.0.0.1:8545: Подключается к вашей локальной сети.
--tc BatchCallAndSponsorScript: Указывает целевой контракт для сценария.
forge script ./script/BatchCallAndSponsor.s.sol --tc BatchCallAndSponsorScript --broadcast --rpc-url 127.0.0.1:8545
Может появиться предупреждающее сообщение, подобное следующему:
Warning: Script contains a transaction to 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 which does not contain any code.
Do you wish to continue?
Это предупреждение ожидаемо, поскольку до применения EIP-7702, у EOA нет кода на блокчейн сети. Просто введите "y", чтобы продолжить.
После завершения работы скрипта вы увидите сообщения журнала, указывающие на то, что выполнение прошло успешно. Транзакции сохраняются в папке broadcast, а все конфиденциальные значения - в папке cache.
ONCHAIN EXECUTION COMPLETE & SUCCESSFUL.
Transactions saved to: /project-path/broadcast/...
Sensitive values saved to: /project-path/cache/...
Вы можете просмотреть сохраненные транзакции, чтобы узнать больше о том, как выполняются транзакции EIP-7702. Например, в последней транзакции спонсируемого выполнения Боб является отправителем, а адрес контракта принадлежит Алисе. Кроме того, эта транзакция включает в себя список authorizationList, содержащий подписанные авторизации.
#eip7702