# Розгортання смартконтракту за допомогою Foundry або Hardhat

> Source: https://docs.blockvectra.com/uk/guides/deploy-contract/

## Вибір мережі

Дотримуйтесь посібника з інтеграції для цільової мережі (доступного через [Підтримувані мережі](https://docs.blockvectra.com/en/chains/)), щоб створити `network.mjs` та експортувати `RPC_URL` і `CHAIN_ID`. Посібники для мереж зчитують chain ID та політику методів з [GET /v1/chains](https://api.blockvectra.com/v1/chains) і пояснюють інформацію про нативний газ-токен, необхідність окремого RPC для трансляції транзакцій та специфічні для мережі налаштування розгортання.

Оберіть один з інструментів нижче. Обидва розгортають однаковий невеликий контракт без аргументів конструктора.

Поповніть баланс адреси розгортання (deployer) нативним токеном газу обраної мережі. Безпечно збережіть `DEPLOYER_PRIVATE_KEY` у своєму локальному оточенні; ніколи не фіксуйте його в системі контролю версій. Наведені нижче команди транслюють транзакцію та витрачають газ.

Створіть `Hello.sol` без аргументів конструктора:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract Hello {
    event Ping(address indexed sender);
    function ping() external { emit Ping(msg.sender); }
    function hello() external pure returns (string memory) {
        return "hello";
    }
}
```

### Foundry

В ініціалізованому проєкті Foundry розмістіть контракт у `src/Hello.sol` та використовуйте такий `foundry.toml`:

```toml
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc_version = "0.8.24"
evm_version = "paris"

[rpc_endpoints]
target = "${RPC_URL}"
```

```bash
: "${RPC_URL:?Set RPC_URL}" "${CHAIN_ID:?Set CHAIN_ID}" "${DEPLOYER_PRIVATE_KEY:?Set deployer key}"
test "$(cast chain-id --rpc-url "$RPC_URL")" = "$CHAIN_ID" || exit 1
forge build
forge create src/Hello.sol:Hello --rpc-url target \
  --chain "$CHAIN_ID" --private-key "$DEPLOYER_PRIVATE_KEY" --broadcast
```

Збережіть хеш транзакції та адресу розгортання. Використовуйте `cast receipt "$TX_HASH" --rpc-url "$RPC_URL"`, щоб перевірити включення в блок і статус, а потім `cast call "$CONTRACT_ADDRESS" "hello()(string)" --rpc-url "$RPC_URL"`, щоб прочитати стан контракту. Встановіть значення цих двох змінних із результату розгортання.

### Hardhat 2 з ethers 6

В окремому проєкті CommonJS (`npm init -y`) встановіть залежності `npm install --save-dev hardhat@2 @nomicfoundation/hardhat-ethers@3 ethers@6`. Розмістіть той самий контракт у `contracts/Hello.sol`. Збережіть такий вміст у `hardhat.config.cjs`:

```js
require('@nomicfoundation/hardhat-ethers');
const { RPC_URL, CHAIN_ID, DEPLOYER_PRIVATE_KEY } = process.env;
if (!RPC_URL || !/^[1-9][0-9]*$/.test(CHAIN_ID ?? '') || !DEPLOYER_PRIVATE_KEY) {
  throw new Error('Set RPC_URL, CHAIN_ID and DEPLOYER_PRIVATE_KEY');
}
module.exports = {
  solidity: { version: '0.8.24', settings: { evmVersion: 'paris' } },
  networks: {
    target: { url: RPC_URL, chainId: Number(CHAIN_ID), accounts: [DEPLOYER_PRIVATE_KEY] },
  },
};
```

Створіть директорію `scripts` і збережіть файл як `scripts/deploy.cjs`:

```js
const { ethers } = require('hardhat');
async function main() {
  const contract = await ethers.deployContract('Hello');
  console.log(contract.deploymentTransaction().hash);
  await contract.waitForDeployment();
  console.log(await contract.getAddress());
}
main().catch(error => { console.error(error); process.exitCode = 1; });
```

```bash
npx hardhat compile
npx hardhat run scripts/deploy.cjs --network target
```

Значення `chainId` мережі перевіряється через RPC. Дивіться [налаштування мережі Hardhat 2](https://v2.hardhat.org/hardhat-runner/docs/config) та [налаштування Foundry](https://www.getfoundry.sh/config/index.html) (дата звернення: 2026-10-07).

## Читання подій

Встановіть змінну `LOG_ADDRESS` на адресу розгорнутого контракту. Дотримуйтесь методу читання подій із посібника для цільової мережі (підписка через WebSocket або фрагментоване опитування через HTTP, залежно від поля `ws` для цієї мережі у `/v1/chains`), щоб зчитувати події `Ping` після виклику `ping()`.
