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

# Rome SDK

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

## SDK

У Rome есть SDK для трех аудиторий — разработчиков приложений (TypeScript), разработчиков контрактов (Solidity) и инфраструктурных операторов (Rust).

### SDK на TypeScript (`@rome-protocol/sdk`)

**Для разработчиков dapp и frontend** — SDK, с которого чаще всего начинают разработчики приложений. [`@rome-protocol/sdk`](https://github.com/rome-protocol/rome-sdk-ts) оборачивает путь записи Rome, чтобы веб-приложение корректно отправляло транзакции Rome: `submitRomeTx` (корректный путь записи плюс обработка газа/комиссии), вывод PDA / ATA, CPI `invoke` / `invoke_signed` кодировщики, привязки precompile и `/bridge` подпуть. Установка из репозитория (публикация в npm ожидается):

```bash
npm install github:rome-protocol/rome-sdk-ts#v0.2.1
```

```typescript
import { submitRomeTx } from '@rome-protocol/sdk';
// Отправка любой записи EVM Rome через корректный путь записи (обрабатывает кодирование газа/комиссии).
```

Публичные эталонные приложения — [rome-dex](https://github.com/rome-protocol/rome-dex) и [cardo](https://github.com/rome-protocol/cardo) — используют этот SDK.

**Обе линии — один SDK.** `submitRomeTx` — это линия EVM (MetaMask). Для **линии Solana** — кошелек Phantom/Solana, управляющий вашим приложением EVM — `submitRomeTxSolanaLane` повторяет это: пользователь подписывает транзакцию Solana, а Rome выполняет ее как транзакцию EVM от его производной идентичности, без ключа EVM. Средства перемещаются внутрь и наружу через `buildFundLeg` / `buildSweepLeg` как обертка ERC-20 (например, `wUSDC`), а не нативный `msg.value` — синтетический отправитель ничего не хранит в состоянии покоя — и первый синтетический автоматически создается при первом использовании. См. [Создайте приложение с двумя линиями](/ru/rukovodstva-dlya-razrabotchikov/dual-lane-app.md) и [Вызывайте EVM из Solana](/ru/rukovodstva-dlya-razrabotchikov/call-evm-from-solana.md).

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

**Для разработчиков Solidity.** Предоставляет интерфейсы precompile, обертки ERC-20/SPL, вывод PDA и утилиты CPI. Публикация в npm ожидается; сегодня вы используете это из публичного [`rome-solidity`](https://github.com/rome-protocol/rome-solidity) репозитория (зависимость git или скопированные файлы).

```solidity
import {ISystemProgram, ICrossProgramInvocation, IHelperProgram, IWithdraw}
    from "@rome-protocol/rome-solidity/contracts/interface.sol";
import {SPL_ERC20} from "@rome-protocol/rome-solidity/contracts/erc20spl/erc20spl.sol";
import {RomeEVMAccount} from "@rome-protocol/rome-solidity/contracts/rome_evm_account.sol";
```

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

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

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

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

Привяжите интерфейс к его precompile-адресу:

```solidity
ISystemProgram          constant System   = ISystemProgram(0xFF00000000000000000000000000000000000007);
ICrossProgramInvocation constant Cpi      = ICrossProgramInvocation(0xFF00000000000000000000000000000000000008);
IHelperProgram          constant Helper   = IHelperProgram(0xFF00000000000000000000000000000000000009);
IWithdraw               constant Withdraw = IWithdraw(0x4200000000000000000000000000000000000016);
// Кэшированный трек: ISplCached 0xff…05, IAssociatedSplCached 0xff…06, ISystemCached 0xff…04, IWithdrawCached 0xff…0b
```

### Операции с токенами SPL

Используйте `IHelperProgram` (`0xff…09`) для примитивов SPL, подписанных user-PDA:

```solidity
// Создать ATA вызывающего для mint
Helper.create_ata(user, mint);

// Перевести SPL из PDA вызывающего
Helper.transfer_spl(to, tokens, mint);
```

На кэшированном треке эквивалентные операции находятся в `ISplCached` (`0xff…05`) и `IAssociatedSplCached` (`0xff…06`). См. `interface.sol` для всех перегрузок; контракт последовательно использует один трек.

### Вывод 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

```solidity
// Развернуть обертку для любого mint SPL
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);
```

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

```solidity
import {Convert} from "@rome-protocol/rome-solidity/contracts/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/rome-solidity/contracts/mpl_token_metadata/lib.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 — это рабочее пространство Cargo. Его основные crates:

| Crate               | Назначение                                                                                 |
| ------------------- | ------------------------------------------------------------------------------------------ |
| `rome-sdk`          | Основной API: `Rome` структура, конфигурация, типы транзакций (RheaTx, RemusTx, RomulusTx) |
| `rome-evm-client`   | клиент rollup EVM, TxBuilder, ResourceFactory, интеграция с эмулятором                     |
| `rome-solana`       | Solana tower, RPC-клиент, пакетирование и отслеживание транзакций                          |
| `rome-utils`        | утилиты RLP, hex, JSON-RPC, аутентификации                                                 |
| `rome-obs`          | наблюдаемость OpenTelemetry (трейсы, метрики, логи)                                        |
| `rome-meteora`      | адаптеры пулов AMM Meteora DEX для ценообразования газа                                    |
| `rome-jito-bundler` | сборщик bundle Jito для атомарной отправки нескольких транзакций                           |

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

```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) и индексы аккаунтов-хранителей для параллельной отправки транзакций:

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

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

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

* Обертки токенов SPL и интерфейсы precompile
* Обмены Meteora DAMM v1 через CPI
* Oracle Gateway V1 + V2 (Pyth Pull, Switchboard V3)
* Вспомогательные функции System Program, десериализация Borsh
* Фабрика ERC20SPL и bridge-контракты

## Что дальше

* [Развернуть 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
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 dynamically by asking a question.

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

```
GET https://docs.rome.builders/ru/produkty/rome-sdk.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
