> 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/call-evm-from-solana.md).

# Вызывать EVM из Solana

Обратное направление [Вызов Solana из EVM](/ru/rukovodstva-dlya-razrabotchikov/call-solana-from-evm.md): кошелёк Solana (например, Phantom) напрямую вызывает любой EVM-контракт в Rome, без **ключа Ethereum**. Так работают [Aerarium](/ru/prilozheniya-na-rome/apps.md) и [Rome DEX](/ru/prilozheniya-na-rome/apps.md) позволяют нативным пользователям Solana использовать те же контракты, что и пользователи EVM.

Способ одного вызова в SDK — это `submitRomeTxSolanaLane`; эта страница объясняет, что он делает.

## Синтетические адреса

EVM-идентичность кошелька Solana — это его **синтетический адрес** — последние 20 байт `keccak256` хеша его 32-байтного открытого ключа Solana:

```
synthetic_evm_address = keccak256(solana_pubkey)[12:]
```

Это `msg.sender` при вызове контракта кошельком и стабильная идентичность, под которой находятся его nonce и хранилище. Деривация зафиксирована в протоколе, поэтому кошелёк всегда сопоставляется с одним и тем же адресом.

```javascript
import { syntheticAddress } from "@rome-protocol/sdk";
const from = syntheticAddress(solanaPubkey); // 0x… 20 байт
```

## Синтетический адрес — это промежуточный адрес: в состоянии покоя он не хранит токены

Расходуемый баланс нативного пользователя Solana находится в его **кошельке Solana** (как SPL-токены) и 1:1 отображается на стороне EVM как **обёртка ERC20SPL** (например, `wUSDC`). Синтетический адрес ничего не хранит в покое, поэтому стоимость проходит *через* него — каждый шаг подписан кошельком Solana:

1. **Подготовка (один раз).** PDA внешней авторизации у совершенно нового синтетического адреса не существует, пока `create_pda` не выполнится — и нижеприведённые переводы подписываются этим PDA. `submitRomeTxSolanaLane` автоматически подготавливает его при первом использовании (или вызовите `provisionSynthetic` для явного шага «Активация»; проверяйте через `isSyntheticProvisioned`).
2. **Этап пополнения (кошелёк → синтетический адрес).** Переместите токен из ATA кошелька в ATA синтетического адреса — шаг `ActivateAta` «ActivateAta», создаваемый `buildFundLeg`. Теперь `wrapper.balanceOf(synthetic)` читает этот баланс, поэтому синтетический адрес расходует его как обычный ERC-20 (`transfer` / `transferFrom`) — **не** как нативный `msg.value`, который он не хранит.
3. **Вызов(ы) (`DoTxUnsigned`).** Синтетический адрес выполняет EVM-транзакцию(и) — например, `approve` затем vault `deposit` который забирает через `transferFrom`.
4. **Этап вывода (синтетический адрес → кошелёк).** После того как withdraw / borrow / claim зачисляет токены на синтетический адрес, `buildSweepLeg` возвращает их обратно в ATA кошелька пользователя (`HelperProgram.transfer_spl`), так что на синтетическом адресе итоговый баланс сводится к нулю.

## Как формируется вызов

`submitRomeTxSolanaLane` делает всё это. Механика такая:

1. **Сформируйте неподписанную транзакцию EIP-1559** с `from` = синтетического адреса — без подписи secp256k1.
2. **Определите аккаунты** — вызовите [`rome_emulateCallAccounts`](/ru/spravochnik/json-rpc.md) с полями `from`, `to`, `data`, **и `value`** (когда вызов payable). Передача `value` важна: прокси эмулирует *реальный* вызов, поэтому любая зависящая от value запись в хранилище — например, новый слот mapping — выделяется, и его аккаунт Solana возвращается. Если его опустить, этот аккаунт будет отсутствовать, и транзакция завершится ошибкой *«instruction modified data of a read-only account.»*
3. **Соберите транзакцию Solana:** две **ComputeBudget** инструкции (EVM Rome требует повышенного лимита CU ≈1,35 млн и большого heap frame ≈250 КБ — значения Solana по умолчанию приводят к сбою) + **`DoTxUnsigned`** инструкция (неподписанный RLP + обнаруженные аккаунты) + **казначейский кошелёк** (при выполнении с него взимается небольшая комиссия; при обнаружении его опускают, поэтому SDK добавляет его).
4. **Кошелёк подписывает и отправляет.** Кошелёк **кошелёк Solana подписывает транзакцию Solana (Ed25519) и отправляет её в Solana RPC — а не в прокси.** Среда выполнения Solana проверяет подпись; в сети программа выводит `msg.sender` из этого подписанта. Полномочия определяются подписью Solana, а не подписью Ethereum. (Прокси используется только для эмуляции/обнаружения на шаге 2.)

PDA пользователя (`["EXTERNAL_AUTHORITY", synthetic_address]`) владеет его token accounts и подписывает SPL CPI от его имени — так что пользователь Solana может полностью из Phantom вносить, занимать, обменивать и предоставлять ликвидность.

## Референсные реализации

* **Aerarium** — управляет Compound v3 (supply / borrow) из Phantom через `DoTxUnsigned`.
* **Rome DEX** — Solana lane торгует и предоставляет ликвидность в том же пуле, что и EVM lane.

Оба решения нативны для Solana, без моста и без второго кошелька — синтетический адрес делает один ключ Phantom полноценным EVM-аккаунтом.

## Что дальше

* [Вызов Solana из EVM](/ru/rukovodstva-dlya-razrabotchikov/call-solana-from-evm.md) — обратное направление, через CPI
* [Интероперабельность токенов](/ru/klyuchevye-ponyatiya/token-interop.md) — как балансы разделяются между EVM и Solana


---

# 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/rukovodstva-dlya-razrabotchikov/call-evm-from-solana.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.
