Настройка автоматического деплоя через Foundry multi-chain
Задеплоить контракт в пять сетей вручную — значит пять раз прогнать forge script, пять раз скопировать адрес, пять раз верифицировать на соответствующем explorer'е. При этом забыть одну сеть или допустить опечатку в адресе — классическая история. Foundry multi-chain деплой решает это одним скриптом.
Структура деплойного скрипта в Foundry
Foundry Script — это Solidity-контракт, наследующий Script из forge-std. В нём пишется логика деплоя, которая выполняется через forge script с флагом --broadcast.
Для multi-chain деплоя ключевой момент — управление конфигурацией по чейнам. Стандартный подход: JSON-файл с параметрами для каждой сети и чтение через vm.readFile + парсинг через stdJson.
deployments/
config.json # { "arbitrum": { "fee": 100 }, "polygon": { ... } }
arbitrum.json # { "MyContract": "0x..." } (после деплоя)
polygon.json
script/
Deploy.s.sol
В Deploy.s.sol читаем конфиг через vm.readFile, деплоим с нужными параметрами, записываем адрес через vm.writeFile. После деплоя JSON-файлы с адресами — source of truth для frontend и npm-пакета.
Запуск на нескольких сетях
Bash-скрипт, оборачивающий forge script:
CHAINS=("arbitrum" "polygon" "optimism" "base" "bsc")
for chain in "${CHAINS[@]}"; do
forge script script/Deploy.s.sol \
--rpc-url $chain \
--broadcast \
--verify \
--etherscan-api-key $ETHERSCAN_API_KEY \
-vvv
done
RPC URLs настраиваются в foundry.toml:
[rpc_endpoints]
arbitrum = "${ARBITRUM_RPC_URL}"
polygon = "${POLYGON_RPC_URL}"
Верификация (--verify) запускается автоматически после деплоя. Для сетей с нестандартным explorer'ом (BSC → BscScan, Polygon → PolygonScan) — отдельный ETHERSCAN_API_KEY для каждой сети через [etherscan] секцию в foundry.toml.
Детерминированные адреса через CREATE2
Для cross-chain систем часто важно, чтобы контракт имел одинаковый адрес на всех чейнах. CREATE даёт адрес от sender + nonce — если на одной из сетей nonce сдвинулся (например, была ошибочная транзакция), адреса разойдутся.
CREATE2 вычисляет адрес от deployer + salt + bytecode. Один и тот же deployer с одним salt даёт одинаковый адрес везде. Стандартный deployer: 0x4e59b44847b379578588920cA78FbF26c0B4956C (Foundry deterministic deployer, присутствует на всех EVM-чейнах).
В Foundry: new MyContract{salt: bytes32("v1")}(constructorArg) автоматически использует CREATE2 через этот deployer.
CI/CD через GitHub Actions
- name: Deploy to all chains
env:
PRIVATE_KEY: ${{ secrets.DEPLOYER_PRIVATE_KEY }}
ARBITRUM_RPC_URL: ${{ secrets.ARBITRUM_RPC_URL }}
run: |
forge script script/Deploy.s.sol --rpc-url arbitrum --broadcast --verify
Приватный ключ — из GitHub Secrets. Для production лучше: Hardhat Deploy с AWS KMS или скрипт с Safe Transaction Builder (деплой через мультисиг).
Сроки
Настройка Foundry multi-chain деплоя (скрипт, конфиг, CI/CD) для проекта с 1-3 контрактами на 3-5 сетях — 1 рабочий день.







