> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/ru/rukovodstva-dlya-razrabotchikov/deploy-solidity.md).

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

Разворачивайте смарт-контракты Solidity в Solana с помощью Hardhat или Foundry — настройка сети Rome, пополненные аккаунты и пошаговое развёртывание.

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

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

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

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

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

| Сеть                  | URL RPC                                     | ID цепочки | Обозреватель                           |
| --------------------- | ------------------------------------------- | ---------- | -------------------------------------- |
| Hadrian (testnet)     | `https://hadrian.testnet.romeprotocol.xyz/` | `200010`   | `via-hadrian.testnet.romeprotocol.xyz` |
| **Rubicon (mainnet)** | `https://rubicon.mainnet.romeprotocol.xyz/` | `7531`     | `via-rubicon.mainnet.romeprotocol.xyz` |

Газ во всех сетях — USDC. В Hadrian вы получаете его, переводя тестовый USDC через мост или оборачивая его из кошелька Solana devnet ([Краны](/ru/resursy/faucets.md)); в Rubicon — путем перевода USDC с Ethereum через [моста Rome](https://bridge-api.mainnet.romeprotocol.xyz/). Развертывайте в Rubicon с теми же артефактами, которые вы тестировали в Hadrian, — отличаются только chain id и адреса wrapper-контрактов.

## Hardhat

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

```bash
mkdir my-rome-project && cd my-rome-project
npx hardhat --init
```

Примите значения по умолчанию (Hardhat 3, текущий каталог, шаблон TypeScript + viem); зависимости установятся автоматически.

### hardhat.config.ts

```typescript
import hardhatToolboxViemPlugin from "@nomicfoundation/hardhat-toolbox-viem";
import { configVariable, defineConfig } from "hardhat/config";

export default defineConfig({
  plugins: [hardhatToolboxViemPlugin],
  solidity: {
    profiles: {
      default: { version: "0.8.28" },
      production: {
        version: "0.8.28",
        settings: { optimizer: { enabled: true, runs: 200 } },
      },
    },
  },
  networks: {
    hadrian: {
      type: "http",
      chainType: "l1",
      chainId: 200010,
      url: "https://hadrian.testnet.romeprotocol.xyz/",
      accounts: [configVariable("PRIVATE_KEY")],
    },
    rubicon: {
      type: "http",
      chainType: "l1",
      chainId: 7531,
      url: "https://rubicon.mainnet.romeprotocol.xyz/",
      accounts: [configVariable("PRIVATE_KEY")],
    },
  },
});
```

`configVariable("PRIVATE_KEY")` разрешается из среды (или из зашифрованного keystore — `npx hardhat keystore set PRIVATE_KEY`).

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

```bash
npx hardhat run scripts/deploy.ts --network hadrian
```

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

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

Требуется конфигурация верификатора Sourcify из [Проверить контракты](/ru/rukovodstva-dlya-razrabotchikov/verify-contracts.md) в вашем `hardhat.config.ts`.

## Foundry

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

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

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

```bash
# Тестовая сеть
forge create --rpc-url https://hadrian.testnet.romeprotocol.xyz/ \\
  --private-key $PRIVATE_KEY \\
  src/Counter.sol:Counter
```

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

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

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

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

Для контрактов, которые взаимодействуют с программами Solana, используйте интерфейсы из публичного [`rome-solidity`](https://github.com/rome-protocol/rome-solidity) репозитория. Он устанавливается из GitHub, а не из npm:

```bash
# Hardhat / npm
npm install github:rome-protocol/rome-solidity

# Foundry
forge install rome-protocol/rome-solidity
# затем в foundry.toml, в разделе [profile.default]:
# remappings = ["@rome-protocol/rome-solidity/=lib/rome-solidity/"]
```

Контракты помимо `interface.sol` и интерфейсы oracle (например, обертки ERC-20 и factory) импортируют OpenZeppelin. С npm он устанавливается как зависимость. В Foundry также выполните `forge install OpenZeppelin/openzeppelin-contracts` и добавьте remapping `@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/`.

В npm пакет устанавливается как `@rome-protocol/rome-solidity`, поэтому приведенный ниже импорт разрешается из `node_modules`. В Foundry remapping позволяет разрешать тот же импорт из `lib/rome-solidity`.

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

import {ICrossProgramInvocation, IHelperProgram}
    from "@rome-protocol/rome-solidity/contracts/interface.sol";

contract MyRomeContract {
    IHelperProgram constant Helper =
        IHelperProgram(0xFF00000000000000000000000000000000000009);
    ICrossProgramInvocation constant Cpi =
        ICrossProgramInvocation(0xFF00000000000000000000000000000000000008);

    // Перевод SPL-токена из PDA вызывающей стороны
    function moveSpl(address to, uint64 tokens, bytes32 mint) external {
        Helper.transfer_spl(to, tokens, mint);
    }

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

## Перенесите существующий протокол

Любой контракт Solidity разворачивается в Rome без изменений — контракт для соблюдения требований, DeFi-протокол или существующее защищенное приложение. Единственное, чего нет в вашем контракте, — это **одноразовое разрешение wrapper-контракту**: пользователь, который переводит через ваш контракт токены SPL-wrapper (wUSDC и подобные), должен один раз до первой `transferFrom`. Без этого перевод откатится с ошибкой SPL `0x4`. Проверьте `isEnabled(user)` в wrapper-контракте и увидеть [Разовое разрешение для каждого кошелька](/ru/klyuchevye-ponyatiya/token-interop.md#one-time-grant-per-wallet); ваш фронтенд отправляет разрешение, ваш контракт не меняется. Два производственных примера, которые вы можете форкнуть и развернуть с тем же потоком Hardhat / Foundry, что и выше:

* [**compound-on-rome-comet**](https://github.com/rome-protocol/compound-on-rome-comet) — канонический Compound v3 (Comet), стандартный Foundry.
* [**rome-aave-v3**](https://github.com/rome-protocol/rome-aave-v3) — канонический Aave v3.

Оба получают возможность выполнения в Solana и композиции CPI без изменений контракта; их пользователи выдают одноразовое разрешение wrapper-контракту, описанное выше, перед первым депозитом.

## Газ

Пусть ваши инструменты оценивают газ (`eth_estimateGas`; Hardhat, `forge create` и `cast` все они делают это) и никогда не жестко не задавайте `21000`. В Rome большая часть стоимости записи приходится на создание аккаунтов Solana, таких как развернутый контракт, новый токен-аккаунт или получатель, который еще не использовался, и оценка учитывает это. Для вызова, который выполняет CPI Solana, оценка может оказаться заниженной, поэтому закладывайте запас. Rome взимает фактически использованный gas. По измерениям в Hadrian развертывание контракта размером 10 байт оценено и потребило 1,147,921 gas, а нативный перевод на уже существующий адрес был оценен в 21,000 и использовал 10,001. Реальный контракт стоит дороже, поэтому оценивайте развертывание самостоятельно. На [странице JSON-RPC](/ru/spravochnik/json-rpc.md#gas-is-solana-derived-estimate-dont-hardcode) находится таблица с измерениями.

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

| Ограничение                    | Ограничение          | Примечания                                                         |
| ------------------------------ | -------------------- | ------------------------------------------------------------------ |
| Максимальный размер контракта  | 24 КБ                | То же, что и в Ethereum (EIP-170, 24 576 байт)                     |
| Ограничение размера транзакции | 80 КБ на один holder | Крупные развертывания прозрачно распределяются по аккаунтам holder |
| Бюджет вычислений              | \~1.4M CU (атомарно) | Используйте итеративный режим для тяжелых контрактов               |
| Версия Solidity                | Рекомендуется 0.8.28 | Ранние версии работают, но 0.8.28 соответствует SDK                |

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

| Ошибка                                                                       | Причина                                                                               | Исправление                                                                                                                                                                                                                                                                     |
| ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `недостаточно средств для gas`                                               | У адреса EVM нет gas-токена                                                           | Hadrian: переведите тестовый USDC через [моста Rome](/ru/prilozheniya-v-rome/bridge-api.md) (см. [Быстрый старт](/ru/nachalo-raboty/quickstart.md), шаг 2); Rubicon: переведите реальный USDC через [Rome Bridge в основной сети](https://bridge-api.mainnet.romeprotocol.xyz/) |
| `слишком низкий nonce`                                                       | Устаревший nonce в кошельке                                                           | Сбросьте учетную запись MetaMask или укажите nonce вручную                                                                                                                                                                                                                      |
| `выполнение отменено`                                                        | Логика контракта завершилась с ошибкой                                                | Отладьте с помощью `eth_call` или `forge test --fork-url`                                                                                                                                                                                                                       |
| `выполнение отменено` с ошибкой SPL `0x4` при перемещении токенов wrapper    | Пользователь не выдал одноразовое разрешение wrapper-контракту                        | Проверьте `isEnabled(user)` в wrapper-контракте и отправьте `approve_spl` один раз ([подробности](/ru/klyuchevye-ponyatiya/token-interop.md#one-time-grant-per-wallet))                                                                                                         |
| `transaction underpriced`                                                    | Цена gas ниже минимальной                                                             | Увеличьте цену gas в транзакции                                                                                                                                                                                                                                                 |
| Перевод или развертывание завершается с ошибкой при фиксированном лимите gas | Жестко заданный лимит, например `21000` ниже, чем стоимость создания аккаунтов Solana | Удалите его и используйте `eth_estimateGas`                                                                                                                                                                                                                                     |

## Что дальше

* [Откройте свой контракт для пользователей Solana](/ru/rukovodstva-dlya-razrabotchikov/open-to-solana-users.md) — позвольте пользователям кошельков Solana вызывать то, что вы только что развернули
* [Вызов Solana из EVM](/ru/rukovodstva-dlya-razrabotchikov/call-solana-from-evm.md) — используйте precompile для CPI, чтобы взаимодействовать с программами Solana
* [Проверить контракты](/ru/rukovodstva-dlya-razrabotchikov/verify-contracts.md) — опубликуйте исходный код в обозревателе блоков


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
