китаев.tech

Настройка и деплой на 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-проект

bash
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:

typescript
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:

bash
npx hardhat keystore set POLYGON_AMOY_PRIVATE_KEY

POLYGON_AMOY_PRIVATE_KEY должен принадлежать аккаунту с POL в Polygon Amoy. POL можно получить через faucet.polygon.technology.


Пишем контракт

Создайте файл contracts/Poll.sol:

solidity
// 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);
    }
}

Скомпилируйте контракт:

bash
npx hardhat build

Деплоим в Polygon Amoy

Создайте файл scripts/deploy-poll.ts:

typescript
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:

bash
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 IDRPC в примереGas token
Ethereum Sepolia11155111https://ethereum-sepolia-rpc.publicnode.comETH
Polygon Amoy80002https://rpc-amoy.polygon.technologyPOL

Один 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.


Что дальше

Материалы китаev.tech публикуются в образовательных целях и не являются инвестиционной рекомендацией. Примеры кода и описания протоколов — для обучения; использование в продакшне на ваш собственный риск. Дисклеймер и политика конфиденциальности.