Настройка и деплой на Polygon
Как настроить Hardhat-проект, подключить Polygon Amoy и задеплоить Solidity-контракт через ethers.
Что нужно для деплоя в Polygon
Polygon PoS — это EVM-совместимая сеть со своим consensus и native token POL. Для деплоя нужны RPC URL, private key и POL на балансе для оплаты gas.
В примере используется Polygon Amoy — тестовая сеть с chain ID 80002. Mumbai больше не поддерживается.
Создаём Hardhat-проект
mkdir polygon-deploy-demo
cd polygon-deploy-demo
npm init -y
npm pkg set type="module"
npm install --save-dev hardhat typescript tsx @types/node @nomicfoundation/hardhat-toolbox-mocha-ethers @nomicfoundation/hardhat-keystore
mkdir contracts scriptsСоздайте файл hardhat.config.ts:
import hardhatKeystore from "@nomicfoundation/hardhat-keystore";
import hardhatToolboxMochaEthers from "@nomicfoundation/hardhat-toolbox-mocha-ethers";
import { configVariable, defineConfig } from "hardhat/config";
export default defineConfig({
plugins: [hardhatToolboxMochaEthers, hardhatKeystore],
solidity: {
version: "0.8.20",
},
networks: {
polygonAmoy: {
type: "http",
chainType: "generic",
url: "https://rpc-amoy.polygon.technology",
accounts: [configVariable("POLYGON_AMOY_PRIVATE_KEY")],
},
},
});Сохраните private key в Hardhat keystore:
npx hardhat keystore set POLYGON_AMOY_PRIVATE_KEYPOLYGON_AMOY_PRIVATE_KEY должен принадлежать аккаунту с POL в Polygon Amoy. POL можно получить через faucet.polygon.technology.
Пишем контракт
Создайте файл contracts/Poll.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Poll {
string public question;
uint256 public yesCount;
uint256 public noCount;
event Voted(address indexed voter, bool support);
constructor(string memory initialQuestion) {
question = initialQuestion;
}
function voteYes() external {
yesCount += 1;
emit Voted(msg.sender, true);
}
function voteNo() external {
noCount += 1;
emit Voted(msg.sender, false);
}
}Скомпилируйте контракт:
npx hardhat buildДеплоим в Polygon Amoy
Создайте файл scripts/deploy-poll.ts:
import { network } from "hardhat";
const { ethers } = await network.create();
const expectedChainId = 80002n;
const provider = ethers.provider;
const currentNetwork = await provider.getNetwork();
if (currentNetwork.chainId !== expectedChainId) {
throw new Error(
`Ожидался Polygon Amoy chainId ${expectedChainId}, получен ${currentNetwork.chainId}`,
);
}
const initialQuestion = "Деплоим ли контракт в Polygon Amoy?";
const poll = await ethers.deployContract("Poll", [initialQuestion]);
console.log("Deploy transaction:", poll.deploymentTransaction()?.hash);
await poll.waitForDeployment();
const address = await poll.getAddress();
const question = await poll.question();
const yesCount = await poll.yesCount();
const noCount = await poll.noCount();
console.log("Poll address:", address);
console.log("Question:", question);
console.log("Yes count:", yesCount.toString());
console.log("No count:", noCount.toString());
console.log(`Explorer: https://amoy.polygonscan.com/address/${address}`);Запустите deploy:
npx hardhat run scripts/deploy-poll.ts --network polygonAmoyПосле подтверждения транзакции скрипт напечатает адрес контракта и ссылку на Polygonscan Amoy.
Как это работает
polygonAmoy — имя сети в hardhat.config.ts. Его же передают в --network polygonAmoy.
type: "http" — говорит Hardhat подключаться к внешнему RPC endpoint.
chainType: "generic" — режим для EVM-сетей, которые не используют OP Stack или специальный L1 chain type Hardhat.
url: "https://rpc-amoy.polygon.technology" — официальный RPC endpoint Polygon Amoy.
configVariable("POLYGON_AMOY_PRIVATE_KEY") — берёт private key из Hardhat keystore, а не из исходного кода.
ethers.deployContract("Poll", [initialQuestion]) — компилирует контракт по имени из Hardhat artifacts и отправляет deploy-транзакцию.
waitForDeployment() — ждёт, пока контракт появится в Polygon Amoy.
Polygon Amoy vs Ethereum Sepolia
| Сеть | Chain ID | RPC в примере | Gas token |
|---|---|---|---|
| Ethereum Sepolia | 11155111 | https://ethereum-sepolia-rpc.publicnode.com | ETH |
| Polygon Amoy | 80002 | https://rpc-amoy.polygon.technology | POL |
Один private key даёт один и тот же адрес в обеих сетях, но балансы разные. ETH в Ethereum Sepolia не оплачивает gas в Polygon Amoy.
Частые ошибки
Используете Mumbai вместо Amoy → Mumbai deprecated. Chain ID 80001 больше не подходит для новых проектов. Используйте Amoy с chain ID 80002.
Недостаточно POL для gas → пополните адрес через faucet Polygon. ETH и POL — разные токены.
Подключили RPC другой сети → проверьте chainId. Для Polygon Amoy он должен быть 80002.
Hardhat не видит private key → выполните npx hardhat keystore set POLYGON_AMOY_PRIVATE_KEY в корне проекта и повторите deploy.
Что дальше
- Деплой контракта — разобрать, что происходит внутри deploy-транзакции
- Верификация контракта на Etherscan — опубликовать исходники контракта в explorer
- Оценка газа (estimateGas) — проверить стоимость транзакции до отправки