# Rome SDK

Rome SDK предоставляет типизированные интерфейсы Solidity для взаимодействия с программами Solana из смарт-контрактов EVM. Это набор инструментов для разработчиков, предназначенный для создания кросс-рантайм приложений на Rome.

## Два SDK

У Rome есть два SDK, предназначенные для разных задач:

### Solidity SDK (`@rome-protocol/solidity-sdk`)

**Для разработчиков на Solidity.** Предоставляет интерфейсы precompile, обёртки ERC-20/SPL, вычисление PDA и утилиты CPI. Устанавливается через npm и импортируется в ваши контракты Solidity.

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

```solidity
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";
```

### Rust SDK (`rome-sdk`)

**Для операторов инфраструктуры.** Рабочее пространство Rust из 9 crate, которое обрабатывает компоновку транзакций, взаимодействие с Solana, ценообразование газа, индексирование блоков и оркестрацию сервисов. Используется Proxy, Hercules и Rhea.

## Solidity SDK: что входит

### Интерфейсы precompile

Предварительно привязанные константы-одиночки для всех precompile Rome:

```solidity
// Доступны глобально после импорта
ISplToken constant SplToken;                    // 0xff...05
IAssociatedSplToken constant AssociatedSplToken; // 0xff...06
ISystemProgram constant SystemProgram;           // 0xff...07
ICrossProgramInvocation constant CpiProgram;     // 0xff...08
IWithdraw constant Withdraw;                     // 0x42...16
```

### Операции с SPL Token

```solidity
// Чтение состояния аккаунта токена
ISplToken.Account memory acc = SplToken.account_state(tokenAccountPubkey);
uint64 balance = acc.amount;
bytes32 owner = acc.owner;

// Перевод токенов
SplToken.transfer(recipientAta, mintPubkey, amount);

// Инициализация нового аккаунта токена
SplToken.initialize_account3(newAccount, mintPubkey, ownerPubkey);
```

### Вычисление PDA

```solidity
// Вычислить Solana PDA пользователя
bytes32 userPda = RomeEVMAccount.pda(msg.sender);

// Вычислить PDA с солью (для создания нескольких PDA на пользователя)
bytes32 pda = RomeEVMAccount.pda_with_salt(msg.sender, salt);

// Найти произвольный PDA
(bytes32 pda, uint8 bump) = SystemProgram.find_program_address(programId, seeds);
```

### Вызов межпрограммного взаимодействия

```solidity
// Вызвать любую программу Solana
ICrossProgramInvocation.AccountMeta[] memory accounts = new ICrossProgramInvocation.AccountMeta[](2);
accounts[0] = ICrossProgramInvocation.AccountMeta(signerPda, true, true);
accounts[1] = ICrossProgramInvocation.AccountMeta(targetAccount, false, true);

CpiProgram.invoke(programId, accounts, instructionData);

// Вызов с подписью PDA
CpiProgram.invoke_signed(programId, accounts, data, seeds);

// Чтение данных аккаунта
(uint64 lamports, bytes32 owner, bool isSigner, bool isWritable, bool executable, bytes memory data)
    = CpiProgram.account_info(pubkey);
```

### ERC-20 поверх SPL Token

```solidity
// Развернуть обёртку для любого SPL mint
ERC20SPLFactory factory = ERC20SPLFactory(FACTORY_ADDRESS);
address wrapper = factory.add_spl_token_with_metadata(splMint);

// Использовать обёртку как стандартный ERC-20
SPL_ERC20 token = SPL_ERC20(wrapper);
token.transfer(recipient, amount);
uint256 balance = token.balanceOf(user);
```

### Реестр токенов

```solidity
TokenRegistry registry = TokenRegistry(REGISTRY_ADDRESS);

// Регистрация с кроссчейн-метаданными
registry.registerToken(splMint, TokenOrigin.WormholeWrapped, externalAddr, chainId);

// Поиск по внешнему токену
TokenEntry memory entry = registry.getTokenByExternal(2, ethUsdcAddress);
```

### Десериализация Borsh

```solidity
import {Convert} from "@rome-protocol/solidity-sdk/contracts/core/Convert.sol";

// Разбор данных аккаунта Solana (формат Borsh, little-endian)
(uint64 value, uint256 newOffset) = Convert.read_u64le(data, offset);
(bytes32 pubkey, uint256 newOffset2) = Convert.read_bytes32(data, offset);
```

### Метаданные Metaplex

```solidity
import {MplTokenMetadataLib} from "@rome-protocol/solidity-sdk/contracts/programs/metadata/MplTokenMetadataLib.sol";

// Загрузить метаданные токена из Metaplex
MplTokenMetadataLib.Metadata memory meta = MplTokenMetadataLib.load_metadata(
    mintPubkey, mplProgramId, cpiAddress
);
string memory name = meta.name;
string memory symbol = meta.symbol;
```

## Rust SDK: архитектура

Rust SDK — это рабочее пространство из 9 crate:

| Crate             | Назначение                                                                        |
| ----------------- | --------------------------------------------------------------------------------- |
| `rome-sdk`        | Основной API: `Rome` struct, config, типы транзакций (RheaTx, RemusTx, RomulusTx) |
| `rome-evm-client` | Клиент EVM rollup, TxBuilder, ResourceFactory, интеграция с эмулятором            |
| `rome-solana`     | Solana tower, RPC-клиент, батчинг и отслеживание транзакций                       |
| `rome-geth`       | Интеграция с OP-Geth Engine API для построения блоков                             |
| `rome-utils`      | Утилиты RLP, hex, JSON-RPC, аутентификации                                        |
| `rome-obs`        | Наблюдаемость OpenTelemetry (трейсы, метрики, логи)                               |
| `rome-da`         | Слой доступности данных Celestia                                                  |
| `rome-meteora`    | Адаптеры пулов Meteora DEX AMM для ценообразования газа                           |
| `rome-meta-hook`  | Клиент маршрутизатора Token-2022 Transfer Hook                                    |

### Типы транзакций

```rust
// Одна транзакция rollup
let rhea = RheaTx::new(signed_eth_tx);
let mut tx = rome.compose_rollup_tx(rhea).await?;
let sig = rome.send_and_confirm(&mut *tx).await?;

// Атомарная меж-rollup транзакция
let remus = RemusTx::new(vec![tx1, tx2]);
let mut tx = rome.compose_cross_rollup_tx(remus).await?;

// Атомарная межцепочечная транзакция (EVM + Solana)
let romulus = RomulusTx::new(eth_txs, sol_ixs);
let mut tx = rome.compose_cross_chain_tx(romulus, signers).await?;
```

### Пулинг ресурсов

SDK объединяет ключевые пары Solana (payer) и индексы аккаунтов holder для параллельной отправки транзакций:

```rust
let resource = resource_factory.get().await?;
let payer = resource.payer();       // Ключевая пара Solana
let holder = resource.holder();     // Индекс аккаунта holder
// Ресурс автоматически возвращается в пул при Drop
```

## Дорожная карта SDK

### Реализовано и работает

* Обёртки SPL Token и интерфейсы precompile
* Свопы Meteora DAMM v1 через CPI
* Oracle Gateway V1 + V2 (Pyth Pull, Switchboard V3)
* Хелперы System Program, десериализация Borsh
* ERC20SPL Factory + мостовые контракты
* Реестр токенов с кроссчейн-метаданными

### В процессе

* JupiterRouter (интерфейс Solidity для свопов Jupiter)
* Клиент SDK маршрутизатора Meta-Hook

### Планируется (этап 2)

| Интерфейс | Протокол                   |
| --------- | -------------------------- |
| IJupiter  | Агрегатор DEX Jupiter      |
| IDrift    | Бессрочные контракты Drift |
| IKamino   | Кредитование Kamino        |
| IMeteora  | Ликвидность Meteora        |
| IOndoGM   | RWA Ondo                   |

### Планируется (этап 3)

| Интерфейс     | Программа          |
| ------------- | ------------------ |
| IStakeProgram | Стейкинг Solana    |
| IVoteProgram  | Голосование Solana |
| ISlotHashes   | Sysvar SlotHashes  |

## Что дальше

* [Развернуть Solidity](/ru/rukovodstva-dlya-razrabotchikov/deploy-solidity.md) — разверните свой первый контракт с использованием SDK
* [Вызов Solana из EVM](/ru/rukovodstva-dlya-razrabotchikov/call-solana-from-evm.md) — используйте CPI для взаимодействия с программами Solana
* [Адреса контрактов](/ru/spravochnik/contract-addresses.md) — адреса развернутых контрактов SDK


---

# 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/produkty/rome-sdk.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.
