# Развертывание контрактов Solidity

Это руководство описывает развертывание смарт-контрактов Solidity в Rome EVM с использованием Hardhat и Foundry.

## Требования

* Установлены Node.js v18+ (Hardhat) или Foundry
* Пополненный адрес Rome EVM (см. [Quickstart](/ru/nachalo-raboty/quickstart.md))
* Ваш закрытый ключ, экспортированный как переменная окружения

```bash
export PRIVATE_KEY="0xYOUR_PRIVATE_KEY"
```

## Конфигурация сети

| Сеть              | RPC URL                                      | ID сети  |
| ----------------- | -------------------------------------------- | -------- |
| Локальная         | `http://localhost:9090`                      | `1001`   |
| Devnet (montispl) | `https://montispl.devnet.romeprotocol.xyz`   | `200002` |
| Testnet (Martius) | `https://martius-i.testnet.romeprotocol.xyz` | `121214` |
| Testnet (Caelian) | `https://caelian-i.testnet.romeprotocol.xyz` | `121215` |

## Hardhat

### Настройка

```bash
mkdir my-rome-project && cd my-rome-project
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
npx hardhat init
```

### hardhat.config.js

```javascript
require("@nomicfoundation/hardhat-toolbox");

module.exports = {
  solidity: {
    version: "0.8.28",
    settings: {
      optimizer: { enabled: true, runs: 200 },
    },
  },
  networks: {
    rome_local: {
      url: "http://localhost:9090",
      chainId: 1001,
      accounts: [process.env.PRIVATE_KEY],
    },
    rome_devnet: {
      url: "https://montispl.devnet.romeprotocol.xyz",
      chainId: 200002,
      accounts: [process.env.PRIVATE_KEY],
    },
    rome_martius: {
      url: "https://martius-i.testnet.romeprotocol.xyz",
      chainId: 121214,
      accounts: [process.env.PRIVATE_KEY],
    },
    rome_caelian: {
      url: "https://caelian-i.testnet.romeprotocol.xyz",
      chainId: 121215,
      accounts: [process.env.PRIVATE_KEY],
    },
  },
};
```

### Развернуть

```bash
npx hardhat run scripts/deploy.js --network rome_devnet
```

### Проверить в обозревателе блоков

```bash
npx hardhat verify --network rome_martius 0xCONTRACT_ADDRESS
```

## Foundry

### Настройка

```bash
forge init my-rome-project
cd my-rome-project
```

### Развернуть

```bash
# Локально
forge create --rpc-url http://localhost:9090 \
  --private-key $PRIVATE_KEY \
  src/Counter.sol:Counter

# Devnet
forge create --rpc-url https://montispl.devnet.romeprotocol.xyz \
  --private-key $PRIVATE_KEY \
  src/Counter.sol:Counter
```

### Вызов развернутого контракта

```bash
# Чтение
cast call 0xCONTRACT_ADDRESS "number()" \
  --rpc-url https://montispl.devnet.romeprotocol.xyz

# Запись
cast send 0xCONTRACT_ADDRESS "increment()" \
  --rpc-url https://montispl.devnet.romeprotocol.xyz \
  --private-key $PRIVATE_KEY
```

## Использование Rome Solidity SDK

Для контрактов, взаимодействующих с программами Solana, установите Rome Solidity SDK:

```bash
npm install @rome-protocol/solidity-sdk
```

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {SplToken, CpiProgram, SystemProgram} from "@rome-protocol/solidity-sdk/contracts/core/Precompiles.sol";
import {SPL_ERC20} from "@rome-protocol/solidity-sdk/contracts/token/ERC20SPL.sol";
import {RomeEVMAccount} from "@rome-protocol/solidity-sdk/contracts/core/RomeEVMAccount.sol";

contract MyRomeContract {
    // Чтение баланса SPL-токенов пользователя из Solana
    function getSolanaBalance(bytes32 mint) external view returns (uint64) {
        bytes32 userPda = RomeEVMAccount.pda(msg.sender);
        ISplToken.Account memory account = SplToken.account_state(userPda);
        return account.amount;
    }

    // Вызов любой программы Solana через CPI
    function callSolanaProgram(
        bytes32 programId,
        ICrossProgramInvocation.AccountMeta[] calldata accounts,
        bytes calldata data
    ) external {
        CpiProgram.invoke(programId, accounts, data);
    }
}
```

## Ограничения развертывания

| Ограничение                    | Лимит                   | Примечания                                                                   |
| ------------------------------ | ----------------------- | ---------------------------------------------------------------------------- |
| Максимальный размер контракта  | 480 КБ                  | Увеличен с 24 КБ в Ethereum для режима OP-Geth                               |
| Ограничение размера транзакции | 80 КБ на держателя      | Крупные развертывания прозрачно распределяются по учетным записям держателей |
| Бюджет вычислений              | \~1,4 млн CU (атомарно) | Используйте итеративный режим для ресурсоемких контрактов                    |
| Версия Solidity                | Рекомендуется 0.8.28    | Более ранние версии работают, но 0.8.28 соответствует SDK                    |

## Распространённые ошибки

| Ошибка                          | Причина                            | Исправление                                                |
| ------------------------------- | ---------------------------------- | ---------------------------------------------------------- |
| `недостаточно средств для газа` | У EVM-адреса нет баланса           | Внесите SOL через интерфейс пополнения                     |
| `nonce too low`                 | Устаревший nonce в кошельке        | Сбросьте учетную запись MetaMask или укажите nonce вручную |
| `execution reverted`            | Логика контракта завершилась сбоем | Отладка с помощью `eth_call` или `forge test --fork-url`   |
| `transaction underpriced`       | Цена газа ниже минимальной         | Увеличьте цену газа в транзакции                           |

## Что дальше

* [Вызов Solana из EVM](/ru/rukovodstva-dlya-razrabotchikov/call-solana-from-evm.md) — используйте CPI precompiles для взаимодействия с программами Solana
* [Обертывание токенов](https://github.com/rome-protocol/docs/blob/main/developer-guides/token-wrapping.md) — развертывайте обертки ERC-20 для токенов SPL
* [Оптимизация CU](https://github.com/rome-protocol/docs/blob/main/developer-guides/cu-optimization.md) — уменьшите потребление вычислительных единиц


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.rome.builders/ru/rukovodstva-dlya-razrabotchikov/deploy-solidity.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
