> 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/klyuchevye-ponyatiya/token-interop.md).

# Интероперабельность токенов

Rome представляет ERC-20-токен и лежащий в его основе SPL-токен как один общий аккаунт. На этой странице объясняется, как токены работают в EVM и Solana.

## Модель общего состояния

Rome не блокирует токены на одной стороне и не выпускает обёрнутые копии на другой. ERC-20-токен в Rome — это **прозрачная обёртка** над SPL-аккаунтом токена в Solana — баланс ERC-20 *равен* балансу SPL.

<figure><img src="/files/5a8281e8151df93fa566496d83ae52e09f22595c" alt="An ERC-20 wrapper over the same SPL token account on Solana"><figcaption></figcaption></figure>

* Без задержки моста — баланс ERC-20 равен балансу SPL
* Без фрагментации ликвидности — DeFi по обе стороны видит одни и те же токены
* Без риска моста — нет отдельного эскроу, которым можно злоупотребить

> Пути импорта ниже используют `@rome-protocol/rome-solidity`. Публикация в npm ещё не завершена; сегодня вы используете их из публичного [`rome-solidity`](https://github.com/rome-protocol/rome-solidity) репозитория (git-зависимость или скопированные интерфейсы). Интерфейсы precompile находятся в [`contracts/interface.sol`](https://github.com/rome-protocol/rome-solidity/blob/master/contracts/interface.sol).

## Контракт-обёртка

`SPL_ERC20` (и его вариант на cached-track `SPL_ERC20_cached`, который фабрика сегодня разворачивает), предоставляет полный интерфейс ERC-20 поверх SPL mint:

* `balanceOf()` — считывает баланс ATA пользователя из Solana
* `transfer()` — перемещает токены в Solana
* `approve()` / `allowance()` — использует хранилище EVM (в SPL нет разрешений в стиле EVM)
* `totalSupply()` — считывает предложение SPL mint

## Фабрика

`ERC20SPLFactory` разворачивает обёртку для любого SPL mint:

```solidity
import {ERC20SPLFactory} from "@rome-protocol/rome-solidity/contracts/erc20spl/erc20spl_factory.sol";

// Развернуть обёртку, загрузив name/symbol из метаданных Metaplex
address wrapper = factory.add_spl_token_with_metadata(splMint);

// Или указать name/symbol вручную
address wrapper = factory.add_spl_token_no_metadata(splMint, "USD Coin", "USDC");
```

Актуальные адреса фабрик: Hadrian `0x86149124d74ebb3aa41a19641b700e88202b6285`, Martius `0xd7aeeedca26cdd4d34eb7c21110af2e590a8c58a`. Всегда сверяйтесь с [реестром](https://github.com/rome-protocol/rome-registry/tree/main/chains) — это источник достоверных данных для развёрнутых адресов.

## Канонические mint

В блокчейне нет контракта реестра токенов. Канонические обёртки и токены газа/моста курируются во внецепочечном [`rome-protocol/registry`](https://github.com/rome-protocol/rome-registry); обёртки без разрешений, созданные через `add_spl_token_no_metadata` обнаруживаются через ончейн `TokenCreated` событие. Это позволяет каждому активу соответствовать единственному каноническому SPL mint без фрагментации ликвидности.

## Операции SPL из Solidity

Для SPL-примитивов, подписываемых пользователем через PDA, используйте **HelperProgram** precompile (`0xFF…09`) — создание ATA, переводы SPL и конвертация gas↔lamports:

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

IHelperProgram helper = IHelperProgram(0xFF00000000000000000000000000000000000009);

helper.create_ata(user, mint);              // создать ATA пользователя для mint
helper.transfer_spl(to, tokens, mint);      // перевести SPL из PDA вызывающего
```

`transfer_spl` имеет несколько перегрузок (включая вариант delegate для `transferFrom` потоков); см. `interface.sol` для точных сигнатур. На cached-track эквивалентные операции находятся в `ISplCached` (`0xFF…05`) и `IAssociatedSplCached` (`0xFF…06`). Контракт последовательно использует один вариант.

## Внесение и вывод

* **В EVM** — на стороне SPL баланс зачисляется на ATA пользователя, принадлежащий PDA; обёртка ERC-20 немедленно отражает этот баланс. Входящие кросс-чейн переводы рассчитываются без доверия через подписанное пользователем разрешение на мосту.
* **В Solana** — вызовите `Withdraw` precompile (`0x42…16`): `withdraw_to_pda` / `withdraw_to_ata` перемещает токены из PDA пользователя обратно в Solana. Путь wrap-gas-to-SPL — `withdraw_to_ata`.

## Газовый токен

У каждой цепочки есть собственный газовый токен — любой SPL-токен, цена которого определяется через пул Meteora DAMM (v1 или v2, настраивается). Публичные цепочки (Martius, Hadrian) используют USDC. Универсального токена газа по умолчанию не существует.

## Ограничения

* Количество SPL-токенов представлено типом `uint64` (макс. 18,446,744,073,709,551,615)
* Разрешения используют хранилище EVM, а не делегатов Solana
* Символы ERC-20-обёрток должны быть уникальными для каждой фабрики

## Что дальше

* [Адреса контрактов](/ru/spravochnik/contract-addresses.md) — precompile и адреса для каждой цепочки
* [Вызывать Solana из EVM](/ru/rukovodstva-dlya-razrabotchikov/call-solana-from-evm.md) — CPI и операции SPL из Solidity


---

# 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/klyuchevye-ponyatiya/token-interop.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.
