// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {Script, console2} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";
contract CounterScript is Script {
function run() public {
vm.startBroadcast();
Counter counter = new Counter();
vm.stopBroadcast();
console2.log(address(counter));
}
}
Служебная функция run() как раз и служит для деплоя, vm.startBroadcast и vm.stopBroadcast еще пара читкодов, которые позволяют отправлять транзакции в блокчейн.
Открываем новый терминал, не удаляя тот, где запущен Anvil, и выполняем команду:
forge script script/Counter.s.sol
В итоге у нас будет будет что-то вроде:
Script ran successfully.
Gas used: 228424
== Logs ==
0x90193C961A926261B75...
Был ли в данном случае выполнен деплой? Нет, сейчас просто прогнался наш контракт как скрипт.
Как я понял из сторонних статей и объяснений на форумах, эта простая команда нужна для того, чтобы проверить наличие ошибок при деплое контрактов.
Также симулировать деплой можно с помощью похожей команды, указав rpc ссылку сети, в которую будет идти деплой. Например, для Anvil:
forge script script/Counter.s.sol --rpc-url http://127.0.0.1:8...
При этом вам могут показать некоторые предупреждения, как например:
EIP-3855 is not supported in one or more of the RPCs used.
Unsupported Chain IDs: 31337.
Contracts deployed with a Solidity version equal or higher than 0.8.20 might not work properly.
И уже для полноценного деплоя нам нужно указать приватный ключ от аккаунта, с которого будет идти деплой контрактов в сеть, а также добавить ключевое слово --broadcast:
forge script script/Counter.s.sol --rpc-url http://127.0.0.1:8.. --private-key $PRIVATE_KEY --broadcast
Теперь, если мы откроем терминал, где у нас был запущен блокчейн, то можем увидеть новую запись:
[Success]Hash: 0xdb858b56859825d35f6bffe022c9524e640869974e219387a87b4d542ce311f1
Contract Address: 0x5FbDB2315678afecb367f032d93F642f64180aa3
Block: 1
Paid: 0.0009359 ETH (233975 gas * 4 gwei)
Кстати, сюда же мы можем отправлять транзакции через cast send и cast call, так как это полноценный контракт в блокчейне.
Также мы можем заметить, что в древе файлов нашего проекта появилась новая папка broadcast. Здесь находится информация по деплою нашего контракта.
Существует еще более директивный способ деплоя контрактов в сеть с помощью команды
forge create
Здесь вам также нужно будет указывать rpc ссылку и приватный ключ.
Больше информации тут: https://book.getfoundry.sh/reference/forge/forge-create
При этом с create, те же аргументы для контрактов нужно будет также прописывать через дополнительные команды, типа --constructor-args, в то время как для скриптовой версии, все это указывается как в обычном коде Solidity.
Скриптовой вариант более удобнее и проще, в особенности для деплоя множества контрактов.
Ну, и в завершение, пару слов о верификации контрактов.
При обычном способе, нам нужно было бы заходить на тот же etherscan и вручную указывать многие параметры нашего контракта, включая его код на Solidity. При этом, по слухам, было много шансов ошибиться на каком-либо шаге и каждый раз начинать все заново. С Foundry этот процесс стал проще.
Для этого мы можем добавить команду --verify в команду исполнения скрипта:
forge script script/Counter.s.sol --rpc-url http://127.0.0.1:8... --private-key $PRIVATE_KEY --broadcast --verify
Вообще для скриптов написали достаточно много команд, их можно посмотреть тут:
https://book.getfoundry.sh/reference/forge/forge-script
Дополнительно темы деплоя мы будем касаться в постах, где это будет необходимо, указывая на новые нюансы и опции.
А пока что, попробуйте потренироваться сами.
#foundry #lesson19