Деплой смарт-контрактов в Optimism
Optimism — EVM-эквивалентный L2 на базе OP Stack с Bedrock архитектурой. С точки зрения деплоя контракты компилируются точно как для Ethereum mainnet. Отличия появляются при работе с L1↔L2 messaging, получении L1 block data и расчёте gas fees.
Конфигурация для деплоя
Добавляем Optimism в Hardhat или Foundry конфигурацию:
// hardhat.config.ts
networks: {
optimism: {
url: process.env.OPTIMISM_RPC ?? "https://mainnet.optimism.io",
accounts: [process.env.DEPLOYER_PRIVATE_KEY!],
chainId: 10,
},
"optimism-sepolia": {
url: "https://sepolia.optimism.io",
accounts: [process.env.DEPLOYER_PRIVATE_KEY!],
chainId: 11155420,
},
}
# Foundry
forge create src/MyContract.sol:MyContract \
--rpc-url https://mainnet.optimism.io \
--private-key $DEPLOYER_PRIVATE_KEY \
--etherscan-api-key $OPTIMISM_ETHERSCAN_KEY \
--verify
Gas на Optimism: две составляющие
Главная особенность Optimism (и всех OP Stack чейнов) — gas fee состоит из двух частей:
L2 execution gas — как обычный Ethereum gas, но значительно дешевле. Оплачивается в ETH.
L1 data fee — стоимость публикации calldata транзакции в Ethereum mainnet (для data availability). После EIP-4844 (blobs) стоимость снизилась на 90%+.
Контракт GasPriceOracle (адрес 0x420000000000000000000000000000000000000F) предоставляет методы l1BaseFee(), baseFee(), gasPrice() для расчёта полной стоимости.
Верификация контракта
Optimism имеет собственный Etherscan (optimistic.etherscan.io) с отдельным API ключом:
npx hardhat verify --network optimism \
--contract contracts/MyToken.sol:MyToken \
DEPLOYED_ADDRESS \
"Constructor Arg 1" "Constructor Arg 2"
Для proxy контрактов (OpenZeppelin TransparentUpgradeableProxy) верифицируем implementation и proxy отдельно, затем используем Etherscan UI для линковки.
Специфика OP Stack
Predeploys — ряд системных контрактов задеплоен по фиксированным адресам. Важные:
-
0x4200...0006— L2CrossDomainMessenger (для L1↔L2 messages) -
0x4200...0010— L2StandardBridge (бридж ERC-20) -
0x4200...000F— GasPriceOracle
Sequencer и finality — транзакции подтверждаются sequencer-ом быстро (2 секунды), но finality на L1 занимает ~7 дней (challenge period). Для большинства dApp это не важно, но учитываем при работе с L1 withdrawals.
Block time — 2 секунды. Если контракт использует block.timestamp для timeouts или TWAP расчётов — это влияет на параметры.
Деплой через Foundry script
// script/Deploy.s.sol
pragma solidity ^0.8.20;
import "forge-std/Script.sol";
import "../src/MyProtocol.sol";
contract DeployScript is Script {
function run() external {
uint256 deployerKey = vm.envUint("DEPLOYER_PRIVATE_KEY");
vm.startBroadcast(deployerKey);
MyProtocol protocol = new MyProtocol(
0x4200000000000000000000000000000000000006 // L2CrossDomainMessenger
);
console.log("Deployed at:", address(protocol));
vm.stopBroadcast();
}
}
forge script script/Deploy.s.sol:DeployScript \
--rpc-url https://mainnet.optimism.io \
--broadcast \
--verify \
-vvvv
Флаг --verify автоматически верифицирует контракт после деплоя. Foundry сохраняет deployment адреса в broadcast/ директории.
Тестирование на Optimism Sepolia
Перед mainnet деплоем тестируем на Optimism Sepolia (chainId 11155420). Тестовый ETH получаем через официальный фосет или Alchemy/Infura фосеты. Optimism Sepolia зеркалирует mainnet конфигурацию включая системные контракты.







