Разовый деплой через forge create или npx hardhat deploy с хардкодированными параметрами — это технический долг. Когда нужно задеплоить на 5 чейнов, потом воспроизвести на тестнете для аудиторов, затем повторить через 3 месяца для новой версии — выясняется, что никто не помнит точный порядок вызовов, какие контракты нужно инициализировать после деплоя и на каком блоке была верификация. Недавно к нам обратилась команда протокола, у которой после ухода разработчика никто не мог повторить деплой на мейннет. Мы написали скрипт за день, и теперь деплой занимает 5 минут. Мы специализируемся на создании профессиональных скриптов деплоя под ключ: от параметризации до интеграции с CI/CD. Наш опыт — 5+ лет в Web3, более 50 успешных проектов. Свяжитесь с нами для консультации или получите индивидуальную оценку вашего проекта.
Какие проблемы решают скрипты деплоя?
Ручной деплой через forge create или Hardhat консоль приводит к нескольким типичным проблемам:
- Отсутствие воспроизводимости: повторить точный порядок вызовов через месяц — лотерея.
- Ошибки инициализации: забыли вызвать initialize() после прокси — контракт неработоспособен.
- Потеря адресов: никто не записал, где лежит proxy или admin.
- Долгое переключение сетей: при деплое на 5 сетей вручную — потеря времени на 80%.
Скрипты решают эти проблемы: один запуск, полный лог, автоматическая верификация.
Почему Forge Script — стандарт индустрии?
Foundry Script (.s.sol) — Solidity-файл, который выполняется как деплой-скрипт. Ключевое преимущество: один язык для контрактов и деплоя, проверка типов компилятором, возможность тестировать сам скрипт. В документации Foundry подчёркивается, что это значительно снижает количество ошибок по сравнению с JS-скриптами.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {Script, console} from "forge-std/Script.sol";
import {MyProtocol} from "../src/MyProtocol.sol";
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
contract DeployMyProtocol is Script {
function run() external {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
address deployer = vm.addr(deployerKey);
vm.startBroadcast(deployerKey);
ProxyAdmin admin = new ProxyAdmin(deployer);
MyProtocol implementation = new MyProtocol();
bytes memory initData = abi.encodeCall(
MyProtocol.initialize,
(vm.envAddress("TREASURY"), vm.envUint("FEE_BPS"))
);
TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(
address(implementation),
address(admin),
initData
);
console.log("ProxyAdmin:", address(admin));
console.log("Implementation:", address(implementation));
console.log("Proxy:", address(proxy));
vm.stopBroadcast();
}
}
Запуск: forge script script/DeployMyProtocol.s.sol --rpc-url $RPC --broadcast --verify. Флаг --verify автоматически верифицирует все задеплоенные контракты через Etherscan API. --slow добавляет задержку между транзакциями — нужно для RPC-провайдеров с rate limits.
Как параметризация исключает ошибки?
Никакого хардкода адресов в скрипте. Всё через environment variables:
address treasury = vm.envAddress("TREASURY");
uint256 fee = vm.envUint("FEE_BPS");
bool isMainnet = vm.envBool("IS_MAINNET");
Для разных окружений: файлы .env.sepolia, .env.mainnet, .env.polygon. Скрипт деплоя один и тот же. Это экономит до 40% времени на подготовку деплоя.
Логирование адресов задеплоенных контрактов
После деплоя адреса нужно зафиксировать. Подходы:
JSON файл через foundry's --json флаг. forge script ... --json > deployments/sepolia.json — структурированный вывод с адресами, transaction hashes, block numbers.
Кастомное логирование в скрипте через vm.writeJson() и vm.writeFile():
string memory json = vm.serializeAddress("deployment", "proxy", address(proxy));
vm.writeJson(json, string.concat("deployments/", vm.toString(block.chainid), ".json"));
Файлы деплоя коммитим в репозиторий — они служат источником истины для frontend, аналитики и будущих upgrade-скриптов.
Upgrade скрипты и мультичейн деплой
Для UUPS и Transparent Proxy паттернов отдельный скрипт для каждого upgrade:
contract UpgradeV2 is Script {
function run() external {
address proxy = vm.envAddress("PROXY_ADDRESS");
address admin = vm.envAddress("PROXY_ADMIN");
vm.startBroadcast(vm.envUint("PRIVATE_KEY"));
MyProtocolV2 newImpl = new MyProtocolV2();
ProxyAdmin(admin).upgradeAndCall(
ITransparentUpgradeableProxy(proxy),
address(newImpl),
""
);
vm.stopBroadcast();
}
}
Каждый upgrade-скрипт имеет имя с версией (UpgradeToV2.s.sol) и хранится в истории репозитория.
Мультичейн деплой: скрипт запускается последовательно для каждого чейна:
forge script script/Deploy.s.sol --rpc-url $ETHEREUM_RPC --broadcast --verify
forge script script/Deploy.s.sol --rpc-url $POLYGON_RPC --broadcast --verify --verifier-url $POLYGONSCAN_API
forge script script/Deploy.s.sol --rpc-url $ARBITRUM_RPC --broadcast --verify
Или через Makefile / shell скрипт с итерацией по массиву RPC endpoints. Наши скрипты сокращают время деплоя на 80% по сравнению с ручным подходом.
Что входит в нашу работу?
- Разработка базового деплой-скрипта с параметризацией (env).
- Настройка автоматической верификации через Etherscan API.
- Логирование всех адресов и артефактов в JSON.
- Создание upgrade-скриптов для UUPS/Transparent Proxy.
- Поддержка мультичейн (Ethereum, Polygon, Arbitrum, BNB Chain и др.).
- Интеграция с CI/CD (GitHub Actions, GitLab CI).
- Документация и обучение вашей команды.
- Гарантия корректности деплоя на тестнете перед мейннетом.
Сроки и стоимость
Написание базового деплой-скрипта с параметризацией и логированием — 1 день. Полная deployment infrastructure с upgrade скриптами, мультичейн поддержкой и CI интеграцией — 2-3 дня. Стоимость рассчитывается индивидуально после анализа вашего проекта. Клиенты экономят до 70% времени на деплое, что в пересчёте на зарплату инженера даёт десятки тысяч долларов экономии в год. Оценим ваш проект бесплатно — свяжитесь с нами.
Сравнение: ручной деплой vs скрипты
| Критерий | Ручной деплой | Скрипты деплоя (наши) |
|---|---|---|
| Время на 1 чейн | 30-60 мин | 2-5 мин |
| Верификация | вручную через Etherscan | автоматически |
| Воспроизводимость | низкая | 100% |
| Ошибки инициализации | часты | исключены тестами |
| Мультичейн | дни | 1 час |
Как мы гарантируем корректность?
Мы пишем тесты на деплой-скрипты (например, через Foundry), используем симуляцию транзакций в Tenderly, проверяем логов и проводим code review. После деплоя контракты верифицируются автоматически. Получите консультацию инженера — обсудим ваш проект и предложим решение.







