Деплойментт смарт-контрактів в 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 зберігає адреси деплойменту в broadcast/ директорії.
Тестування на Optimism Sepolia
Перед mainnet деплойментом тестуємо на Optimism Sepolia (chainId 11155420). Тестовий ETH отримуємо через офіційний faucet або Alchemy/Infura faucets. Optimism Sepolia зеркалює mainnet конфігурацію включаючи системні контракти.







