> 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/spravochnik/precompiles.md).

# Справочник по прекампилам

Каждый метод прекампилов Solana-interop в Rome — адрес, сигнатура Solidity, селектор и указание, читает ли он, вызывает ли он или подготавливает CPI.

Селекторы, которые ончейн-программа Rome передаёт на исполнение, по предкомпилятору. Селектор = `keccak256(signature)[:4]`; каждая строка ниже проверяется на соответствие этому. Интерфейсы Solidity находятся в [`rome-solidity/contracts/interface.sol`](https://github.com/rome-protocol/rome-solidity/blob/master/contracts/interface.sol).

**Прежде всего прочтите столбец Dispatch.** В нём указано, что метод делает с состоянием Solana:

| Диспетчеризация       | Что происходит                                                                                                                                                                                                                           | Реальный CPI Solana | Разрешено при итеративном выполнении |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ------------------------------------ |
| `Вызов` / `Составной` | Один или несколько CPI, подписанные как PDA внешнего полномочия вызывающего, где применяются семена. На **устаревшей** трассе они выполняются немедленно; на **кэшированное** трассе они откладываются и фиксируются в конце транзакции. | Да                  | Устаревшее: **нет**. Кэшировано: да  |
| `EthCall`             | Чистые вычисления или чтение собственного состояния Rome                                                                                                                                                                                 | Нет                 | Да                                   |
| `CrossStateEthCall`   | Чтение байтов другого аккаунта Solana, предварительно загруженных эмуляцией. Никаких CPI, никаких побочных эффектов.                                                                                                                     | Нет                 | Да                                   |
| `Предкомпилированный` | Детерминированная криптография (предкомпиляции по стандарту Ethereum)                                                                                                                                                                    | Нет                 | Да                                   |

Контракт использует **одну трассу**: либо устаревшие предкомпиляции (`0xff…07`, `0xff…08`, `0xff…09`, `0x42…16`) или кэшированные (`0xff…04`, `0xff…05`, `0xff…06`, `0xff…0b`). Смешивание изменяющих вызовов из обеих трасс в одной транзакции отклоняется во время выполнения. Чтения по-прежнему разрешены, за одним исключением: после срабатывания invoke на кэшированной трассе чтения на устаревшей трассе отклоняются до конца транзакции. См. [Интеграция программы Solana](/ru/rukovodstva-dlya-razrabotchikov/integrate-solana-program.md).

**Кто платит.** Плательщик комиссии Solana авансирует каждый лампорт, который расходует CPI на устаревшей трассе (ренту, переводы, `swap_gas_to_lamports`); программа измеряет баланс плательщика до и после каждого CPI и списывает с пользователя чистый расход как газ по цене газа, возвращая лампорты, которые CPI возвращает.

**Кто подписывает.** Контракт, вызывающий предкомпиляцию, действует от своего имени: подписантом является PDA внешнего полномочия контракта (`["EXTERNAL_AUTHORITY", contract]`). Собственный PDA пользователя подписывает только транзакцию, которую пользователь отправляет напрямую на адрес предкомпиляции. При `DELEGATECALL` / `CALLCODE`, изменяющие селекторы отклоняются, кроме `create_ata*`, `create_pda*`, `swap_gas_to_lamports`, `init_spl_mint` и `create_and_init_mint` в HelperProgram, `create_ata*` в ASplCached и `invoke` / `invoke_signed` в CpiProgram. Они исключены, поскольку их цель привязана к вызывающему или финансируется оператором, а не потому, что они ничего не подписывают: `create_and_init_mint` по-прежнему подписывает с PDA внешнего вызывающего, чтобы оплатить ренту mint, и может создавать только mint, чьи полномочия принадлежат этому PDA, и `invoke` / `invoke_signed` отклоняют голое полномочие (`DelegatecallOwnerAuthority`) и добавляют к пространству имён salt для PDA по адресу выполняемого контракта.

Каждый метод non-payable (`msg.value > 0` откатывается с `TransferProhibited`) кроме `withdrawal(bytes32)`. Методы, помеченные *только для одного состояния* отклоняются в цепочках op-geth-stack. CPI не может указывать плательщика комиссии Solana (кроме как внутри обычной инструкции System transfer) или программу Rome, и не может вызывать программу Rome.

## SystemCached (`0xff00000000000000000000000000000000000004`)

Создание PDA + операции системной программы (allocate, assign, перевод лампортов), откладываемые в overlay. Кэшированный аналог legacy `System @ 0xff..07`'изменяющих селекторов (legacy System сохраняет чистые селекторы чтения).

| Сигнатура Solidity                   | Селектор     | Диспетчеризация | Описание                                                                            |
| ------------------------------------ | ------------ | --------------- | ----------------------------------------------------------------------------------- |
| `create_pda()`                       | `0xe0402a8d` | `Вызов`         | Создать `external_auth` PDA вызывающего, освобождённый от ренты, с нулевыми данными |
| `create_pda(uint64)`                 | `0x4ceab657` | `Вызов`         | То же, но с лампортами, указанными финансирующей стороной сверх ренты               |
| `create_pda(uint64,bytes32)`         | `0x48e2bb86` | `Вызов`         | PDA, полученный из salt, с лампортами                                               |
| `create_pda(bytes32,uint64,bytes32)` | `0xcc258bbf` | `Вызов`         | Указанный владельцем, размер N, полученный из salt                                  |
| `allocate(uint64,bytes32)`           | `0x93225c9f` | `Вызов`         | Выделить N байт на PDA, полученном из salt                                          |
| `assign(bytes32,bytes32)`            | `0x8ac00bdc` | `Вызов`         | Назначить нового владельца PDA, полученному из salt                                 |
| `transfer(address,uint64)`           | `0x5d359fbd` | `Вызов`         | Перевод лампортов на PDA, производный от адреса EVM                                 |
| `transfer(bytes32,uint64)`           | `0xfd54d1ea` | `Вызов`         | Перевод лампортов на необработанный pubkey Solana                                   |
| `transfer(bytes32,uint64,bytes32)`   | `0x875abfc0` | `Вызов`         | Перевод лампортов на необработанный pubkey, источник, полученный из salt            |

## SplCached (`0xff00000000000000000000000000000000000005`)

Переводы SPL Token / Token-2022 + инициализация ATA + чтение аккаунтов из другого состояния, откладываемые в overlay.

| Сигнатура Solidity                              | Селектор     | Диспетчеризация     | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ----------------------------------------------- | ------------ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transfer(address,uint256)`                     | `0xa9059cbb` | `Вызов`             | SPL-перевод от имени вызывающего как владельца на ATA PDA, производного от адреса EVM, текущий mint rollup                                                                                                                                                                                                                                                                                                                                          |
| `transfer(bytes32,uint256)`                     | `0x6a467394` | `Вызов`             | То же, получатель указан как необработанный pubkey Solana                                                                                                                                                                                                                                                                                                                                                                                           |
| `transfer(address,uint256,bytes32)`             | `0x57cfeeee` | `Вызов`             | Вариант с явным mint, назначение — адрес EVM                                                                                                                                                                                                                                                                                                                                                                                                        |
| `transfer(bytes32,uint256,bytes32)`             | `0x7db527f9` | `Вызов`             | Вариант с явным mint, назначение — необработанный pubkey                                                                                                                                                                                                                                                                                                                                                                                            |
| `transferFrom(address,address,uint256,bytes32)` | `0x401e3367` | `Вызов`             | Вариант с делегированным источником — полномочие = `external_auth(caller)`, принимается как владелец ATA ИЛИ как делегат с достаточной суммой. Используется в `SPL_ERC20_cached.transferFrom` и потоках, управляемых маршрутизатором                                                                                                                                                                                                                |
| `approve(address,uint256,bytes32)`              | `0x8180f2fc` | `Вызов`             | Разрешение EVM-spender — владелец = `external_auth(caller)`, делегат = `external_auth(spender_addr)`. Используется в `SPL_ERC20_cached.approve`                                                                                                                                                                                                                                                                                                     |
| `mint(address,uint256,bytes32)`                 | `0x1e458bee` | `Вызов`             | PDA вызывающего подписывает как authority mint. SPL runtime требует, чтобы caller-PDA == on-chain authority mint. Используется в `SPL_ERC20_cached.mint_to` и в урегулировании входящего моста                                                                                                                                                                                                                                                      |
| `init(bytes32,bytes32,bytes32)`                 | `0x0b0ad508` | `Вызов`             | `InitializeAccount3` инструкция (ata, mint, owner)                                                                                                                                                                                                                                                                                                                                                                                                  |
| `account(address)`                              | `0x73b9aa91` | `CrossStateEthCall` | Читать состояние аккаунта SPL для ATA, производного от PDA адреса EVM (текущий mint rollup)                                                                                                                                                                                                                                                                                                                                                         |
| `account(bytes32)`                              | `0x882358ae` | `CrossStateEthCall` | Читать состояние аккаунта SPL для необработанного pubkey ATA                                                                                                                                                                                                                                                                                                                                                                                        |
| `account(address,bytes32)`                      | `0xf9827227` | `CrossStateEthCall` | То же, что `account(address)` с явным mint.                                                                                                                                                                                                                                                                                                                                                                                                         |
| `mint_info(bytes32)`                            | `0xe24bf5d4` | `CrossStateEthCall` | Сведения о mint, с учётом overlay: программа токена, десятичные знаки, **активирован** программа hook (0, если отсутствует *или* неактивна), комиссия в б.п. за текущую эпоху и битовая карта наличия расширений. Тот же селектор, что и у `HelperProgram.mint_info` — одна возможность, два места диспетчеризации, поскольку контракт на кэшированной трассе не может использовать устаревшее чтение после того, как было выполнено cached invoke. |

## ASplCached (`0xff00000000000000000000000000000000000006`)

Создание Associated Token Account, идемпотентное.

| Сигнатура Solidity            | Селектор     | Диспетчеризация | Описание                                                                      |
| ----------------------------- | ------------ | --------------- | ----------------------------------------------------------------------------- |
| `create_ata()`                | `0xb6d336ed` | `Вызов`         | Идемпотентное создание ATA для caller-PDA × текущий mint rollup               |
| `create_ata(bytes32)`         | `0x81972e35` | `Вызов`         | Идемпотентное создание ATA для caller-PDA × явный mint                        |
| `create_ata(address)`         | `0x5a7c3259` | `Вызов`         | Идемпотентное создание ATA для PDA, производного от адреса EVM × текущий mint |
| `create_ata(address,bytes32)` | `0x3de2251a` | `Вызов`         | Идемпотентное создание ATA для адреса EVM × явный mint                        |

## WithdrawCached (`0xff0000000000000000000000000000000000000b`)

Этапы вывода gas-токена (нативный gas → SPL wrapper, нативный gas → SOL, нативный gas → PDA вызывающего), откладываемые. Кэшированный аналог legacy `Withdraw @ 0x42..16`.

| Сигнатура Solidity            | Селектор     | Диспетчеризация | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| ----------------------------- | ------------ | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `withdrawal(bytes32) payable` | `0x4d8b0ea4` | `Составной`     | Сжечь `msg.value` Сжечь gas Rome, перевести получателю — системному аккаунту Solana                                                                                                                                                                                                                                                                                                                                                                                          |
| `withdraw_to_pda(uint256)`    | `0x7f3124a0` | `Составной`     | Сжечь wei, зачислить лампорты на `EXTERNAL_AUTHORITY` PDA вызывающего. Только для одного состояния.                                                                                                                                                                                                                                                                                                                                                                          |
| `withdraw_to_ata(uint256)`    | `0x8059abc0` | `Составной`     | Сжечь wei, зачислить SPL wrapper на ATA вызывающего, принадлежащий PDA. Только для одного состояния. Этап wrap моста gas-wrapper.                                                                                                                                                                                                                                                                                                                                            |
| `deposit(uint256)`            | `0xb6b55f25` | `Составной`     | Обратная операция к `withdrawal` — SPL-перевод с ATA вызывающего, принадлежащего PDA, на ATA chain's sol\_wallet на стороне Solana; **mint** `wei` нативный gas вызывающему на стороне EVM. Чистая эмиссия (без компенсирующего дебета по `Withdraw::ADDRESS` — SPL-кошелёк цепочки является экономическим обеспечением, а не адресом предкомпиляции). Только для одного состояния. Этап unwrap моста gas-wrapper. Соответствует `HelperProgram.deposit_from_ata` семантике. |

## System (`0xff00000000000000000000000000000000000007`)

Вывод PDA + преобразование base58 + утилиты идентификации. Предкомпиляция только для чтения — каждый метод `EthCall` (без побочных эффектов в Solana).

| Сигнатура Solidity                                | Селектор     | Диспетчеризация | Описание                                                                  |
| ------------------------------------------------- | ------------ | --------------- | ------------------------------------------------------------------------- |
| `find_program_address(bytes32,(bytes)[])`         | `0x27e3edda` | `EthCall`       | Solana `find_program_address` через syscall — возвращает `(pda, bump)`    |
| `create_program_address(bytes32,(bytes)[],uint8)` | `0xb99f29e1` | `EthCall`       | Вывод PDA за постоянное время с известным bump                            |
| `rome_evm_program_id()`                           | `0xb76fd45b` | `EthCall`       | Возвращает Solana program ID этой программы Rome EVM                      |
| `program_id()`                                    | `0x77764881` | `EthCall`       | Возвращает System Program ID Rome (идентификатор этой предкомпиляции)     |
| `mint_id()`                                       | `0xe132a122` | `EthCall`       | Возвращает pubkey mint SPL gas-токена цепочки (`OwnerInfo.chain_mint_id`) |
| `operator()`                                      | `0x570ca735` | `EthCall`       | Возвращает подписанта Solana внешней транзакции Rome                      |
| `bytes32_to_base58(bytes32)`                      | `0xfa2b1a5f` | `EthCall`       | Байты pubkey → строка base58                                              |
| `base58_to_bytes32(bytes)`                        | `0x5df01b72` | `EthCall`       | Строка base58 → байты pubkey                                              |

## CpiProgram (`0xff00000000000000000000000000000000000008`)

**Предкомпиляция двойного назначения.** Из 7 селекторов ниже, **2 выполняют реальный CPI Solana** (`invoke`, `invoke_signed` — исполняются как `Вызов`и **5 являются чистыми чтениями из другого состояния** (`account_info`, `account_data_at`, `account_u64_at`, `account_lamports`, `pdas_batch_derive` — исполняются как `CrossStateEthCall`, без syscall, без `found_cpi` установленного флага). Исторический термин "CPI shortcut selectors" относился к селекторам чтения как к заменам, экономящим CU, для более ранних чтений на основе CPI — сами они **не являются CPI**. Полную поведенческую матрицу см. в таблице различий в начале этого раздела.

| Сигнатура Solidity                                             | Селектор     | Диспетчеризация     | Описание                                                                                                                                                                                                                                              |
| -------------------------------------------------------------- | ------------ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `invoke(bytes32,(bytes32,bool,bool)[],bytes)`                  | `0x7480cb86` | `Вызов`             | CPI, подписанный как `EXTERNAL_AUTHORITY(caller)` когда этот аккаунт указан как подписант (отклоняется при DELEGATECALL); без salt-под-PDA. Вызывающий передаёт целевую программу + account metas + данные ix                                         |
| `invoke_signed(bytes32,(bytes32,bool,bool)[],bytes,bytes32[])` | `0xb94f3733` | `Вызов`             | CPI, подписанный как `EXTERNAL_AUTHORITY(caller)` при прямом CALL; salt добавляется к seed каждого PDA. При DELEGATECALL голое полномочие вызывающего отклоняется, а salted seeds несут адрес выполняющегося контракта — см. примечание о выводе ниже |
| `account_info(bytes32)`                                        | `0xc13465d9` | `CrossStateEthCall` | Прочитать полное состояние аккаунта Solana (lamports/owner/flags/data)                                                                                                                                                                                |
| `account_data_at(bytes32,uint16,uint16)`                       | `0x593762e8` | `CrossStateEthCall` | Прочитать фрагмент буфера данных любого аккаунта Solana                                                                                                                                                                                               |
| `account_u64_at(bytes32,uint16)`                               | `0xb317d4c1` | `CrossStateEthCall` | Типизированное чтение u64 LE по известному смещению — экономит обратный вызов ABI                                                                                                                                                                     |
| `account_lamports(bytes32)`                                    | `0xde79ed54` | `CrossStateEthCall` | Проверка только lamports — без получения данных                                                                                                                                                                                                       |
| `pdas_batch_derive(bytes[][],bytes32)`                         | `0x944336f8` | `CrossStateEthCall` | N независимых PDA для одной программы в одном dispatch                                                                                                                                                                                                |

## HelperProgram (`0xff00000000000000000000000000000000000009`)

Пользовательские вспомогательные функции Rome для создания ATA/PDA, SPL-переводов/approve/mint, подписываемые `EXTERNAL_AUTHORITY` PDA вызывающего, конвертации gas↔lamports, депозита в ATA и чтений, доступных через SPL\_ERC20 (`user_balance` / `allowance_of`). Каждый метод `not_payable`; изменение проходит через `Вызов` (один CPI), кроме `deposit_from_ata` (`Составной`, только для одного состояния), три только для чтения `pda`/`ata` запроса (`EthCall`), и два чтения SPL\_ERC20 из другого состояния (`CrossStateEthCall` — один запрос аккаунта Solana).

| Сигнатура Solidity                                               | Селектор     | Диспетчеризация     | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ---------------------------------------------------------------- | ------------ | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_ata(address)`                                            | `0x5a7c3259` | `Вызов`             | Создать ATA для пользователя EVM под gas mint цепочки                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `create_ata(address,bytes32)`                                    | `0x3de2251a` | `Вызов`             | Создать ATA для пользователя EVM под произвольный mint                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `create_ata_for_key(bytes32,bytes32)`                            | `0xd258a69d` | `Вызов`             | Идемпотентное создание ATA для произвольного необработанного pubkey Solana в качестве владельца (не производного через `external_auth`). Ренту оплачивает оператор. Используется в `SPL_ERC20.bridgeOutToSolana` / `ensureRecipientAta` / `create_token_account` потоках с получателем в виде необработанного pubkey                                                                                                                                                                                                                                                                                                                                                                           |
| `create_pda(address)`                                            | `0xff3556ca` | `Вызов`             | Создаёт пользовательский `EXTERNAL_AUTHORITY` PDA (освобождённый от аренды)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `create_pda(address,uint64)`                                     | `0x58e88298` | `Вызов`             | То же, но профинансирован с `лампортами` сверх минимального порога аренды                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `swap_gas_to_lamports(uint64)`                                   | `0x6e3f24e0` | `Вызов`             | Зачисляет на PDA вызывающей стороны `n` лампортов из кошелька оплаты комиссии Solana в транзакции; вызывающая сторона оплачивает их в газе Rome (расход лампортов плательщика внутри любого legacy CPI добавляется к комиссии транзакции)                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `transfer_lamports(address,uint64)`                              | `0x5fe71665` | `Вызов`             | Перемещает лампорты с PDA вызывающей стороны на PDA другого пользователя EVM                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `transfer_spl(address,uint64)`                                   | `0xb12be5ba` | `Вызов`             | Отправляет SPL chain-gas из ATA PDA вызывающей стороны в ATA пользователя-получателя                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `transfer_spl(bytes32,uint64)`                                   | `0xba3a5eac` | `Вызов`             | Отправляет SPL chain-gas из ATA PDA вызывающей стороны в явно указанную ATA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `transfer_spl(address,uint64,bytes32)`                           | `0x53b505e0` | `Вызов`             | Отправляет SPL с произвольным mint из ATA PDA вызывающей стороны в ATA пользователя-получателя                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `transfer_spl(bytes32,uint64,bytes32)`                           | `0xb6977879` | `Вызов`             | Отправляет SPL с произвольным mint из ATA PDA вызывающей стороны в явно указанную ATA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `transfer_spl(bytes32,bytes32,uint64,bytes32)`                   | `0x766b362a` | `Вызов`             | Вариант с делегатом — вызывающая сторона предоставляет `src_ata` (должна принадлежать PDA ИЛИ PDA должен быть делегатом с достаточным `делегированным_количеством`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `transfer_spl(address,address,uint64,bytes32)`                   | `0xe479df56` | `Вызов`             | Вариант с делегатом, привязанный к адресу — внутренне выводит обе ATA из EVM-адресов. Подписывает как `external_auth(caller)`; SPL Token принимает PDA как владельца ИЛИ делегата. Используется `SPL_ERC20.transferFrom`                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `transfer_spl_to_signer(uint64,bytes32)`                         | `0x46efa679` | `Вызов`             | Выходная ветка нативной Solana. Отправляет `количество` из `mint` из ATA PDA вызывающей стороны в **ATA внешнего подписанта Solana** для этого mint'а (собственный кошелёк пользователя только на Solana-ветке, подписанной кошельком; из MetaMask или через релей подписантом является прокси-плательщик Rome; преобразование EVM-адреса не требуется). Одобрение не нужно — источник ATA принадлежит PDA вызывающей стороны. Используйте вместе с `ActivateAta` (слот 18) для сквозного EVM-использования только с Solana-ключом. Достигает кошелька на текущей v1-ветке и на более старой legacy `DoTxUnsigned` (слот 17), поскольку кошелёк подписывает Solana-транзакцию в обоих случаях. |
| `approve_spl(address,uint64,bytes32)`                            | `0xabf6f675` | `Вызов`             | PDA вызывающей стороны как владелец устанавливает `delegate_pda(spender)` делегата в owner-ATA через SPL `approve_checked`. Используется в `SPL_ERC20.approve`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `approve_spl_raw_delegate(bytes32,bytes32,uint64,bytes32,uint8)` | `0x7881d453` | `Вызов`             | SPL `approve_checked` с заданным вызывающей стороной делегатом в виде необработанного открытого ключа (например, Wormhole `authority_signer` PDA, без эквивалента EVM-адреса). Вызывающая сторона передаёт `десятичные знаки` чтобы пропустить чтение mint в блокчейне (экономия \~30–50 тыс. CU). Жёстко заданный `spl_program = SPL Token`. Используется в `RomeBridgeWithdraw.approveBurnETH`                                                                                                                                                                                                                                                                                               |
| `mint_spl(address,uint64,bytes32)`                               | `0xd795522b` | `Вызов`             | PDA вызывающей стороны как mint-authority выпускает в ATA пользователя-получателя через SPL `mint_to_checked`. Runtime SPL принудительно проверяет соответствие полномочий. Используется `SPL_ERC20.mint_to`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `create_mint_account(bytes32)`                                   | `0xe97d3291` | `Вызов`             | System CreateAccount, выделяющий PDA, производный от salt (`external_auth_with_salt(caller, salt)`) с объёмом space=82, принадлежащий SPL Token. Источник финансирования = external\_auth PDA вызывающей стороны. Два подписанта PDA. Используется `ERC20SPLFactory.create_token_mint`                                                                                                                                                                                                                                                                                                                                                                                                         |
| `init_spl_mint(bytes32,uint8,bytes32,bool,bytes32)`              | `0x4f75e987` | `Вызов`             | SPL Token `InitializeMint2` для заранее выделенного mint. Подписант PDA отсутствует (mint\_authority/freeze\_authority хранятся как данные, а не как подписанты во время выполнения). Используется `ERC20SPLFactory.init_token_mint`                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `create_and_init_mint(uint8,bytes32,bool,bytes32,bytes32)`       | `0x20972d0f` | `Составной`         | Комбинированно: System CreateAccount + SPL InitializeMint2 в одном вызове. Экономит 1 оболочку Rome DoTx по сравнению с отдельными `create_mint_account` + `init_spl_mint` вызовами                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `deposit_from_ata(uint256)`                                      | `0x4479b709` | `Составной`         | Переводит SPL из ATA вызывающей стороны в нативный газ Rome. **Только для одного состояния** — отклоняется в цепочках op-geth                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `pda(address)`                                                   | `0x8854a299` | `EthCall`           | Вычисляет пользовательский `EXTERNAL_AUTHORITY` PDA — только для чтения                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `pda_with_salt(address,bytes32)`                                 | `0x5c6d04b3` | `EthCall`           | Производный от salt `EXTERNAL_AUTHORITY` PDA в одном вызове. Сводит двухвызовную `rome_evm_program_id() + find_program_address()` композицию на стороне Solidity. Используется `RomeEVMAccount.pda_with_salt`, `RomeBridgeWithdraw.{burnUSDC,burnETH}`                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `ata(address)`                                                   | `0x31db4f82` | `EthCall`           | Вычисляет `getATA(user_pda, chain_mint_id)` — объединяет EXT\_AUTH + ATA — только для чтения                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `ata(address,bytes32)`                                           | `0xfeb1c647` | `EthCall`           | То же, но с явно указанным mint — только для чтения                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `user_balance(address,bytes32)`                                  | `0xdd0119c8` | `CrossStateEthCall` | Читает ATA пользователя `количество` (смещение 64 в SPL TokenAccount). Возвращает 0, если ATA не существует (проверка на свежей цепочке). Сводит 3 вызова v1. Используется `SPL_ERC20.balanceOf`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `mint_info(bytes32)`                                             | `0xe24bf5d4` | `CrossStateEthCall` | Сведения о mint для вызывающей стороны на legacy-ветке: токен-программа, десятичные знаки, **активирован** программа hook (0, если отсутствует *или* неактивен), текущие fee bps эпохи, битовая карта наличия расширений. Отражается в `SplCached` по тому же селектору. `feeBps` является **предикатом** — он указывает, что комиссия активирована; это не операнд, поскольку фактическая комиссия ограничена `maximum_fee` который намеренно здесь не передаётся.                                                                                                                                                                                                                            |
| `allowance_of(address,address,bytes32)`                          | `0xed72dbc8` | `CrossStateEthCall` | Читает delegated\_amount owner-ATA с **проверкой равенства делегата** — возвращает 0, если on-chain delegate == `external_auth(spender)`. Семантически корректно для ERC-20 (ЖЁСТКОЕ ТРЕБОВАНИЕ). Используется `SPL_ERC20.allowance`                                                                                                                                                                                                                                                                                                                                                                                                                                                           |

## Withdraw (`0x4200000000000000000000000000000000000016`)

Вывод нативного газа Rome → Solana.

| Сигнатура Solidity         | Селектор     | Диспетчеризация         | Описание                                                                                                            |
| -------------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `withdrawal(bytes32)`      | `0x4d8b0ea4` | `Составной` (`payable`) | Сжечь `msg.value` газ Rome; выпуск и перевод на системный аккаунт Solana `в`. Единственный платный метод precompile |
| `withdraw_to_pda(uint256)` | `0x7f3124a0` | `Составной`             | Сжечь газ; зачислить на PDA вызывающей стороны `EXTERNAL_AUTHORITY` PDA. **Только для одного состояния**            |
| `withdraw_to_ata(uint256)` | `0x8059abc0` | `Составной`             | Сжечь газ; зачислить на `getATA(caller_pda, chain_mint_id)`. **Только для одного состояния**                        |


---

# 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/spravochnik/precompiles.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.
