> 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/vi/tai-lieu-tham-khao/precompiles.md).

# Tài liệu tham chiếu Precompile

Mọi phương thức trên các precompile tương tác với Solana của Rome — địa chỉ, chữ ký Solidity, selector, và việc nó đọc, gọi hay dàn dựng một CPI.

Các selector mà chương trình on-chain của Rome điều phối, theo từng precompile. Selector = `keccak256(signature)[:4]`; mọi hàng bên dưới đều được đối chiếu với điều đó. Các giao diện Solidity nằm trong [`rome-solidity/contracts/interface.sol`](https://github.com/rome-protocol/rome-solidity/blob/master/contracts/interface.sol).

**Đọc cột Dispatch trước tiên, trước mọi thứ khác.** Nó cho biết một phương thức làm gì đối với trạng thái Solana:

| Điều phối             | Điều gì xảy ra                                                                                                                                                                                                     | CPI Solana thực | Được phép trong thực thi lặp  |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- | ----------------------------- |
| `Gọi` / `Được tổ hợp` | Một hoặc nhiều CPI, được ký như PDA quyền bên ngoài của bên gọi khi áp dụng seed. Trên **nhánh legacy** chúng chạy ngay lập tức; trên **cached** nhánh cached, chúng được dàn dựng và ghi nhận vào cuối giao dịch. | Có              | Legacy: **không**. Cached: có |
| `EthCall`             | Tính toán thuần túy hoặc đọc trạng thái của chính Rome                                                                                                                                                             | Không           | Có                            |
| `CrossStateEthCall`   | Đọc các byte của một tài khoản Solana khác, được nạp sẵn bởi mô phỏng. Không CPI, không tác dụng phụ.                                                                                                              | Không           | Có                            |
| `Đã biên dịch sẵn`    | Mật mã xác định (các precompile chuẩn Ethereum)                                                                                                                                                                    | Không           | Có                            |

Một hợp đồng sử dụng **một nhánh**: hoặc các precompile legacy (`0xff…07`, `0xff…08`, `0xff…09`, `0x42…16`) hoặc các precompile cached (`0xff…04`, `0xff…05`, `0xff…06`, `0xff…0b`). Trộn các lời gọi có thay đổi trạng thái từ cả hai trong cùng một giao dịch sẽ bị từ chối khi chạy. Các lệnh đọc vẫn được phép, với một ngoại lệ: một khi đã kích hoạt invoke trên nhánh cached, các lệnh đọc trên nhánh legacy sẽ bị từ chối trong phần còn lại của giao dịch. Xem [Tích hợp một chương trình Solana](/vi/huong-dan-cho-nha-phat-trien/integrate-solana-program.md).

**Ai trả.** Người trả phí Solana ứng trước mọi lamport mà một CPI trên nhánh legacy chi tiêu (rent, chuyển khoản, `swap_gas_to_lamports`); chương trình đo số dư của bên trả phí quanh mỗi CPI và tính phần chi ròng cho người dùng như gas theo giá gas, đồng thời hoàn lại lamport mà CPI trả về.

**Ai ký.** Một hợp đồng gọi một precompile sẽ hành xử như chính nó: bên ký là PDA quyền bên ngoài của hợp đồng (`["EXTERNAL_AUTHORITY", contract]`). PDA của chính người dùng chỉ ký trên một giao dịch mà người dùng gửi trực tiếp tới địa chỉ precompile. Dưới `DELEGATECALL` / `CALLCODE`, các selector thay đổi trạng thái sẽ bị từ chối ngoại trừ `create_ata*`, `create_pda*`, `swap_gas_to_lamports`, `init_spl_mint` và `create_and_init_mint` trên HelperProgram, `create_ata*` trên ASplCached, và `invoke` / `invoke_signed` trên CpiProgram. Chúng được miễn vì đích đến của chúng bị ràng buộc với bên gọi hoặc do nhà vận hành tài trợ, chứ không phải vì chúng không ký gì: `create_and_init_mint` vẫn ký bằng PDA của bên gọi bên ngoài để trả rent cho mint và chỉ có thể tạo một mint mà các quyền của nó là PDA đó, và `invoke` / `invoke_signed` từ chối quyền thô (`DelegatecallOwnerAuthority`) và thêm salt vào PDAs theo không gian tên bằng địa chỉ của hợp đồng đang chạy.

Mọi phương thức đều không payable (`msg.value > 0`  sẽ revert với `TransferProhibited`) ngoại trừ `withdrawal(bytes32)`. Các phương thức được đánh dấu *chỉ một trạng thái* bị từ chối trên các chuỗi op-geth-stack. Một CPI không được nêu tên Solana fee payer (trừ bên trong một lệnh System transfer thuần túy) hoặc chương trình Rome, và không được gọi chương trình Rome.

## SystemCached (`0xff00000000000000000000000000000000000004`)

Tạo PDA + các thao tác chương trình hệ thống (allocate, assign, chuyển lamport), được dàn dựng vào overlay. Bản cached tương ứng với legacy `System @ 0xff..07`các selector thay đổi trạng thái của nó (System legacy vẫn giữ các selector chỉ đọc thuần).

| Chữ ký Solidity                      | Selector     | Điều phối | Mô tả                                                          |
| ------------------------------------ | ------------ | --------- | -------------------------------------------------------------- |
| `create_pda()`                       | `0xe0402a8d` | `Gọi`     | Tạo PDA `external_auth` , miễn thuê, không dữ liệu             |
| `create_pda(uint64)`                 | `0x4ceab657` | `Gọi`     | Tương tự, với số lamport do bên tài trợ chỉ định vượt mức rent |
| `create_pda(uint64,bytes32)`         | `0x48e2bb86` | `Gọi`     | PDA suy ra từ salt với lamport                                 |
| `create_pda(bytes32,uint64,bytes32)` | `0xcc258bbf` | `Gọi`     | Chỉ định chủ sở hữu, kích thước N, suy ra từ salt              |
| `allocate(uint64,bytes32)`           | `0x93225c9f` | `Gọi`     | Phân bổ N byte trên một PDA suy ra từ salt                     |
| `assign(bytes32,bytes32)`            | `0x8ac00bdc` | `Gọi`     | Gán một PDA suy ra từ salt cho chủ sở hữu mới                  |
| `transfer(address,uint64)`           | `0x5d359fbd` | `Gọi`     | Chuyển lamport tới PDA suy ra từ địa chỉ EVM                   |
| `transfer(bytes32,uint64)`           | `0xfd54d1ea` | `Gọi`     | Chuyển lamport tới pubkey Solana thô                           |
| `transfer(bytes32,uint64,bytes32)`   | `0x875abfc0` | `Gọi`     | Chuyển lamport tới pubkey thô, nguồn suy ra từ salt            |

## SplCached (`0xff00000000000000000000000000000000000005`)

Chuyển SPL Token / Token-2022 + khởi tạo ATA + đọc tài khoản xuyên trạng thái, được dàn dựng vào overlay.

| Chữ ký Solidity                                 | Selector     | Điều phối           | Mô tả                                                                                                                                                                                                                                                                                                                                                                                            |
| ----------------------------------------------- | ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `transfer(address,uint256)`                     | `0xa9059cbb` | `Gọi`               | Chuyển SPL do bên gọi làm chủ sở hữu tới ATA của PDA suy ra từ địa chỉ EVM, mint rollup hiện tại                                                                                                                                                                                                                                                                                                 |
| `transfer(bytes32,uint256)`                     | `0x6a467394` | `Gọi`               | Tương tự, với người nhận được chỉ định là pubkey Solana thô                                                                                                                                                                                                                                                                                                                                      |
| `transfer(address,uint256,bytes32)`             | `0x57cfeeee` | `Gọi`               | Biến thể mint rõ ràng, đích EVM-addr                                                                                                                                                                                                                                                                                                                                                             |
| `transfer(bytes32,uint256,bytes32)`             | `0x7db527f9` | `Gọi`               | Biến thể mint rõ ràng, đích pubkey thô                                                                                                                                                                                                                                                                                                                                                           |
| `transferFrom(address,address,uint256,bytes32)` | `0x401e3367` | `Gọi`               | Biến thể nguồn ủy quyền — authority = `external_auth(caller)`, được chấp nhận làm chủ ATA HOẶC là delegate có đủ số lượng. Được dùng bởi `SPL_ERC20_cached.transferFrom` và các luồng do bộ định tuyến điều khiển                                                                                                                                                                                |
| `approve(address,uint256,bytes32)`              | `0x8180f2fc` | `Gọi`               | Phê duyệt người chi tiêu EVM — owner = `external_auth(caller)`, delegate = `external_auth(spender_addr)`. Được dùng bởi `SPL_ERC20_cached.approve`                                                                                                                                                                                                                                               |
| `mint(address,uint256,bytes32)`                 | `0x1e458bee` | `Gọi`               | PDA của bên gọi ký với tư cách authority của mint. SPL runtime buộc PDA của bên gọi == authority mint on-chain. Được dùng bởi `SPL_ERC20_cached.mint_to` và quá trình settle của cầu nối đi vào                                                                                                                                                                                                  |
| `init(bytes32,bytes32,bytes32)`                 | `0x0b0ad508` | `Gọi`               | `InitializeAccount3` ix (ata, mint, owner)                                                                                                                                                                                                                                                                                                                                                       |
| `account(address)`                              | `0x73b9aa91` | `CrossStateEthCall` | Đọc trạng thái tài khoản SPL cho ATA suy ra từ PDA của địa chỉ EVM (mint rollup hiện tại)                                                                                                                                                                                                                                                                                                        |
| `account(bytes32)`                              | `0x882358ae` | `CrossStateEthCall` | Đọc trạng thái tài khoản SPL cho một pubkey ATA thô                                                                                                                                                                                                                                                                                                                                              |
| `account(address,bytes32)`                      | `0xf9827227` | `CrossStateEthCall` | Giống như `account(address)` với mint rõ ràng.                                                                                                                                                                                                                                                                                                                                                   |
| `mint_info(bytes32)`                            | `0xe24bf5d4` | `CrossStateEthCall` | Thông tin mint, có nhận biết overlay: chương trình token, số thập phân, **đã kích hoạt**  chương trình hook (0 khi không có *hoặc* vô hiệu), fee bps của epoch hiện tại, và bitmap hiện diện extension. Cùng selector với `HelperProgram.mint_info` — một năng lực, hai nơi điều phối, vì hợp đồng trên nhánh cached không thể dùng phép đọc legacy sau khi một invoke cached đã được kích hoạt. |

## ASplCached (`0xff00000000000000000000000000000000000006`)

Tạo Associated Token Account, có tính idempotent.

| Chữ ký Solidity               | Selector     | Điều phối | Mô tả                                                            |
| ----------------------------- | ------------ | --------- | ---------------------------------------------------------------- |
| `create_ata()`                | `0xb6d336ed` | `Gọi`     | Tạo ATA idempotent cho PDA của bên gọi × mint rollup hiện tại    |
| `create_ata(bytes32)`         | `0x81972e35` | `Gọi`     | Tạo ATA idempotent cho PDA của bên gọi × mint rõ ràng            |
| `create_ata(address)`         | `0x5a7c3259` | `Gọi`     | Tạo ATA idempotent cho PDA suy ra từ địa chỉ EVM × mint hiện tại |
| `create_ata(address,bytes32)` | `0x3de2251a` | `Gọi`     | Tạo ATA idempotent cho EVM-addr × mint rõ ràng                   |

## WithdrawCached (`0xff0000000000000000000000000000000000000b`)

Các nhánh rút gas-token (gas gốc → wrapper SPL, gas gốc → SOL, gas gốc → PDA của bên gọi), được dàn dựng. Bản cached tương ứng với legacy `Withdraw @ 0x42..16`.

| Chữ ký Solidity               | Selector     | Điều phối     | Mô tả                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ----------------------------- | ------------ | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `withdrawal(bytes32) payable` | `0x4d8b0ea4` | `Được tổ hợp` | Đốt `msg.value` gas Rome, chuyển đến người nhận là tài khoản hệ thống Solana                                                                                                                                                                                                                                                                                                                                                  |
| `withdraw_to_pda(uint256)`    | `0x7f3124a0` | `Được tổ hợp` | Đốt wei, nạp lamport vào `EXTERNAL_AUTHORITY` PDA. Chỉ một trạng thái.                                                                                                                                                                                                                                                                                                                                                        |
| `withdraw_to_ata(uint256)`    | `0x8059abc0` | `Được tổ hợp` | Đốt wei, nạp SPL wrapper vào ATA thuộc PDA của bên gọi. Chỉ một trạng thái. Nhánh bọc của cầu nối gas-wrapper.                                                                                                                                                                                                                                                                                                                |
| `deposit(uint256)`            | `0xb6b55f25` | `Được tổ hợp` | Ngược lại với `rút` — chuyển SPL từ ATA thuộc PDA của bên gọi sang ATA sol\_wallet của chuỗi ở phía Solana; **mint** `wei` gas gốc tới bên gọi ở phía EVM. Mint thuần túy (không bù trừ ghi nợ đối ứng với `Withdraw::ADDRESS` — ví SPL của chuỗi là phần bảo chứng kinh tế, không phải địa chỉ precompile). Chỉ một trạng thái. Nhánh tháo bọc của cầu nối gas-wrapper. Khớp với `HelperProgram.deposit_from_ata` ngữ nghĩa. |

## System (`0xff00000000000000000000000000000000000007`)

Suy ra PDA + chuyển đổi base58 + các tiện ích kiểu nhận dạng. Precompile chỉ đọc thuần túy — mọi phương thức đều `EthCall` (không có tác dụng phụ trên Solana).

| Chữ ký Solidity                                   | Selector     | Điều phối | Mô tả                                                                      |
| ------------------------------------------------- | ------------ | --------- | -------------------------------------------------------------------------- |
| `find_program_address(bytes32,(bytes)[])`         | `0x27e3edda` | `EthCall` | Solana `find_program_address` qua syscall — trả về `(pda, bump)`           |
| `create_program_address(bytes32,(bytes)[],uint8)` | `0xb99f29e1` | `EthCall` | Suy ra PDA theo thời gian hằng số với bump đã biết                         |
| `rome_evm_program_id()`                           | `0xb76fd45b` | `EthCall` | Trả về Solana program ID của chương trình Rome EVM này                     |
| `program_id()`                                    | `0x77764881` | `EthCall` | Trả về System Program ID của Rome (danh tính của precompile này)           |
| `mint_id()`                                       | `0xe132a122` | `EthCall` | Trả về pubkey SPL mint của gas token của chuỗi (`OwnerInfo.chain_mint_id`) |
| `operator()`                                      | `0x570ca735` | `EthCall` | Trả về signer Solana của Rome tx bên ngoài                                 |
| `bytes32_to_base58(bytes32)`                      | `0xfa2b1a5f` | `EthCall` | Byte pubkey → chuỗi base58                                                 |
| `base58_to_bytes32(bytes)`                        | `0x5df01b72` | `EthCall` | chuỗi base58 → byte pubkey                                                 |

## CpiProgram (`0xff00000000000000000000000000000000000008`)

**Precompile đa mục đích.** Trong 7 selector dưới đây, **2 cái thực hiện CPI Solana thực** (`invoke`, `invoke_signed` — điều phối như `Gọi`) và **5 cái là các lượt đọc xuyên trạng thái thuần túy** (`account_info`, `account_data_at`, `account_u64_at`, `account_lamports`, `pdas_batch_derive` — điều phối như `CrossStateEthCall`, không syscall, không `cờ found_cpi` được đặt). Cụm từ lịch sử "CPI shortcut selectors" dùng để chỉ các selector đọc như các phương án thay thế tiết kiệm CU cho các lượt đọc dựa trên CPI trước đó — bản thân chúng **không phải CPI**. Xem bảng phân biệt ở đầu phần này để biết ma trận hành vi đầy đủ.

| Chữ ký Solidity                                                | Selector     | Điều phối           | Mô tả                                                                                                                                                                                                                                                  |
| -------------------------------------------------------------- | ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `invoke(bytes32,(bytes32,bool,bool)[],bytes)`                  | `0x7480cb86` | `Gọi`               | CPI được ký như `EXTERNAL_AUTHORITY(caller)` khi tài khoản đó được liệt kê là signer (bị từ chối dưới DELEGATECALL); không có sub-PDA có salt. Bên gọi truyền vào chương trình đích + account meta + dữ liệu ix                                        |
| `invoke_signed(bytes32,(bytes32,bool,bool)[],bytes,bytes32[])` | `0xb94f3733` | `Gọi`               | CPI được ký như `EXTERNAL_AUTHORITY(caller)` trên một CALL trực tiếp; salt được thêm vào seed theo từng PDA. Dưới DELEGATECALL, quyền thô của bên gọi bị từ chối và các seed có salt mang địa chỉ của hợp đồng đang chạy — xem ghi chú suy ra bên dưới |
| `account_info(bytes32)`                                        | `0xc13465d9` | `CrossStateEthCall` | Đọc toàn bộ trạng thái của một tài khoản Solana (lamports/chủ sở hữu/cờ/dữ liệu)                                                                                                                                                                       |
| `account_data_at(bytes32,uint16,uint16)`                       | `0x593762e8` | `CrossStateEthCall` | Đọc một lát của bộ đệm dữ liệu của bất kỳ tài khoản Solana nào                                                                                                                                                                                         |
| `account_u64_at(bytes32,uint16)`                               | `0xb317d4c1` | `CrossStateEthCall` | Đọc u64 LE có kiểu tại một offset đã biết — tiết kiệm vòng lặp ABI                                                                                                                                                                                     |
| `account_lamports(bytes32)`                                    | `0xde79ed54` | `CrossStateEthCall` | Thăm dò chỉ lamport — bỏ qua việc lấy dữ liệu                                                                                                                                                                                                          |
| `pdas_batch_derive(bytes[][],bytes32)`                         | `0x944336f8` | `CrossStateEthCall` | N PDA độc lập đối với một chương trình trong một lần điều phối                                                                                                                                                                                         |

## HelperProgram (`0xff00000000000000000000000000000000000009`)

Các trợ thủ hướng người dùng của Rome cho việc tạo ATA/PDA, chuyển/duyệt/mint SPL được ký bởi `EXTERNAL_AUTHORITY` PDA của bên gọi, chuyển đổi gas↔lamport, nạp vào ATA, và các lượt đọc hướng tới SPL\_ERC20 (`user_balance` / `allowance_of`). Mọi phương thức đều `không payable`; các lộ trình thay đổi trạng thái đi qua `Gọi` (một CPI duy nhất) ngoại trừ `deposit_from_ata` (`Được tổ hợp`, chỉ một trạng thái), ba truy vấn `pda`/`ata` chỉ đọc (`EthCall`), và hai lượt đọc SPL\_ERC20 xuyên trạng thái (`CrossStateEthCall` — một lần lấy tài khoản Solana.

| Chữ ký Solidity                                                  | Selector     | Điều phối           | Mô tả                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ---------------------------------------------------------------- | ------------ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_ata(address)`                                            | `0x5a7c3259` | `Gọi`               | Tạo ATA cho người dùng EVM dưới mint gas của chuỗi                                                                                                                                                                                                                                                                                                                                                                                      |
| `create_ata(address,bytes32)`                                    | `0x3de2251a` | `Gọi`               | Tạo ATA cho người dùng EVM dưới một mint tùy ý                                                                                                                                                                                                                                                                                                                                                                                          |
| `create_ata_for_key(bytes32,bytes32)`                            | `0xd258a69d` | `Gọi`               | Tạo ATA idempotent cho một pubkey Solana thô bất kỳ làm chủ sở hữu (không suy ra qua `external_auth`). Người vận hành trả rent. Được dùng bởi `SPL_ERC20.bridgeOutToSolana` / `ensureRecipientAta` / `create_token_account` các luồng nhận là pubkey thô                                                                                                                                                                                |
| `create_pda(address)`                                            | `0xff3556ca` | `Gọi`               | Tạo PDA của người dùng `EXTERNAL_AUTHORITY` PDA (miễn phí thuê)                                                                                                                                                                                                                                                                                                                                                                         |
| `create_pda(address,uint64)`                                     | `0x58e88298` | `Gọi`               | Tương tự, nhưng được nạp bằng `lamports` vượt mức sàn thuê                                                                                                                                                                                                                                                                                                                                                                              |
| `swap_gas_to_lamports(uint64)`                                   | `0x6e3f24e0` | `Gọi`               | Ghi có cho PDA của người gọi bằng `n` lamports từ người trả phí Solana của giao dịch; người gọi trả cho chúng bằng gas Rome (số lamport mà người trả phí chi trong bất kỳ CPI kiểu cũ nào sẽ được cộng vào phí giao dịch)                                                                                                                                                                                                               |
| `transfer_lamports(address,uint64)`                              | `0x5fe71665` | `Gọi`               | Chuyển lamports từ PDA của người gọi sang PDA của người dùng EVM khác                                                                                                                                                                                                                                                                                                                                                                   |
| `transfer_spl(address,uint64)`                                   | `0xb12be5ba` | `Gọi`               | Gửi SPL chain-gas từ ATA của PDA người gọi đến ATA của người dùng đích                                                                                                                                                                                                                                                                                                                                                                  |
| `transfer_spl(bytes32,uint64)`                                   | `0xba3a5eac` | `Gọi`               | Gửi SPL chain-gas từ ATA của PDA người gọi đến một ATA chỉ định                                                                                                                                                                                                                                                                                                                                                                         |
| `transfer_spl(address,uint64,bytes32)`                           | `0x53b505e0` | `Gọi`               | Gửi SPL có mint tùy ý từ ATA của PDA người gọi đến ATA của người dùng đích                                                                                                                                                                                                                                                                                                                                                              |
| `transfer_spl(bytes32,uint64,bytes32)`                           | `0xb6977879` | `Gọi`               | Gửi SPL có mint tùy ý từ ATA của PDA người gọi đến ATA chỉ định                                                                                                                                                                                                                                                                                                                                                                         |
| `transfer_spl(bytes32,bytes32,uint64,bytes32)`                   | `0x766b362a` | `Gọi`               | Biến thể ủy quyền — người gọi cung cấp `src_ata` (phải do PDA sở hữu HOẶC PDA phải là bên được ủy quyền với đủ `delegated_amount`)                                                                                                                                                                                                                                                                                                      |
| `transfer_spl(address,address,uint64,bytes32)`                   | `0xe479df56` | `Gọi`               | Biến thể ủy quyền theo khóa địa chỉ — nội bộ suy ra cả hai ATA từ địa chỉ EVM. Ký dưới dạng `external_auth(caller)`; SPL Token chấp nhận PDA làm chủ sở hữu HOẶC bên được ủy quyền. Được dùng bởi `SPL_ERC20.transferFrom`                                                                                                                                                                                                              |
| `transfer_spl_to_signer(uint64,bytes32)`                         | `0x46efa679` | `Gọi`               | Nhánh thoát gốc Solana. Gửi `amount` của `mint` từ ATA của PDA người gọi đến **ATA của người ký Solana bên ngoài** cho mint đó (ví của chính người dùng — không chuyển đổi địa chỉ EVM). Không cần approve — PDA của người gọi sở hữu ATA nguồn. Ghép với `ActivateAta` (slot 18) + `DoTxUnsigned` (slot 17) cho sử dụng EVM chỉ với khóa Solana end-to-end                                                                             |
| `approve_spl(address,uint64,bytes32)`                            | `0xabf6f675` | `Gọi`               | PDA người gọi với tư cách chủ sở hữu đặt `delegate_pda(spender)` trên ATA của chủ sở hữu qua SPL `approve_checked`. Được dùng bởi `SPL_ERC20.approve`                                                                                                                                                                                                                                                                                   |
| `approve_spl_raw_delegate(bytes32,bytes32,uint64,bytes32,uint8)` | `0x7881d453` | `Gọi`               | SPL `approve_checked` với bên được ủy quyền bằng raw-pubkey do người gọi cung cấp (ví dụ Wormhole `authority_signer` PDA, không có tương đương địa chỉ EVM). Người gọi truyền `decimals` để bỏ qua việc đọc mint trên chuỗi (tiết kiệm khoảng 30–50K CU). Mã hóa cứng `spl_program = SPL Token`. Được dùng bởi `RomeBridgeWithdraw.approveBurnETH`                                                                                      |
| `mint_spl(address,uint64,bytes32)`                               | `0xd795522b` | `Gọi`               | PDA người gọi với tư cách mint authority đúc vào ATA của người dùng đích qua SPL `mint_to_checked`. SPL runtime ép buộc khớp quyền hạn. Được dùng bởi `SPL_ERC20.mint_to`                                                                                                                                                                                                                                                               |
| `create_mint_account(bytes32)`                                   | `0xe97d3291` | `Gọi`               | System CreateAccount cấp phát một PDA suy ra từ salt (`external_auth_with_salt(caller, salt)`) với dung lượng=82 thuộc sở hữu của SPL Token. Bên cấp vốn = PDA external\_auth của người gọi. Hai PDA ký. Được dùng bởi `ERC20SPLFactory.create_token_mint`                                                                                                                                                                              |
| `init_spl_mint(bytes32,uint8,bytes32,bool,bytes32)`              | `0x4f75e987` | `Gọi`               | SPL Token `InitializeMint2` trên mint đã được cấp trước. Không có PDA ký (mint\_authority/freeze\_authority được lưu dưới dạng dữ liệu, không phải chữ ký lúc chạy). Được dùng bởi `ERC20SPLFactory.init_token_mint`                                                                                                                                                                                                                    |
| `create_and_init_mint(uint8,bytes32,bool,bytes32,bytes32)`       | `0x20972d0f` | `Được tổ hợp`       | Kết hợp: System CreateAccount + SPL InitializeMint2 trong một lần dispatch. Tiết kiệm 1 lớp bao Rome DoTx so với `create_mint_account` + `init_spl_mint` các lần gọi                                                                                                                                                                                                                                                                    |
| `deposit_from_ata(uint256)`                                      | `0x4479b709` | `Được tổ hợp`       | Kéo SPL từ ATA của người gọi vào gas gốc Rome. **Chỉ trạng thái đơn** — bị từ chối trên các chain op-geth                                                                                                                                                                                                                                                                                                                               |
| `pda(address)`                                                   | `0x8854a299` | `EthCall`           | Suy ra PDA của `EXTERNAL_AUTHORITY` PDA của người dùng — chỉ đọc                                                                                                                                                                                                                                                                                                                                                                        |
| `pda_with_salt(address,bytes32)`                                 | `0x5c6d04b3` | `EthCall`           | Được suy ra từ salt `EXTERNAL_AUTHORITY` PDA trong một lần dispatch. Gộp chuỗi 2 lệnh ở phía Solidity `rome_evm_program_id() + find_program_address()` thành một bước. Được dùng bởi `RomeEVMAccount.pda_with_salt`, `RomeBridgeWithdraw.{burnUSDC,burnETH}`                                                                                                                                                                            |
| `ata(address)`                                                   | `0x31db4f82` | `EthCall`           | Suy ra `getATA(user_pda, chain_mint_id)` — kết hợp EXT\_AUTH + ATA — chỉ đọc                                                                                                                                                                                                                                                                                                                                                            |
| `ata(address,bytes32)`                                           | `0xfeb1c647` | `EthCall`           | Tương tự với một mint chỉ định — chỉ đọc                                                                                                                                                                                                                                                                                                                                                                                                |
| `user_balance(address,bytes32)`                                  | `0xdd0119c8` | `CrossStateEthCall` | Đọc ATA người dùng `amount` (SPL TokenAccount offset 64). Trả về 0 nếu ATA không tồn tại (kiểm tra chuỗi mới). Gộp 3 lần dispatch v1. Được dùng bởi `SPL_ERC20.balanceOf`                                                                                                                                                                                                                                                               |
| `mint_info(bytes32)`                                             | `0xe24bf5d4` | `CrossStateEthCall` | Thông tin mint cho một caller theo luồng cũ: chương trình token, số thập phân, **đã kích hoạt**  chương trình hook (0 khi không có *hoặc* trơ), phí bps của epoch hiện tại, bitmap sự hiện diện extension. Phản chiếu trên `SplCached` cùng selector. `feeBps` là một **vị từ** — nó cho biết một khoản phí đã được kích hoạt, nó không phải một toán hạng, vì phí thực tế bị giới hạn bởi `maximum_fee` mà trường này cố ý không chứa. |
| `allowance_of(address,address,bytes32)`                          | `0xed72dbc8` | `CrossStateEthCall` | Đọc delegated\_amount của owner-ATA với **kiểm tra bằng nhau của delegate** — trả về 0 trừ khi delegate trên chuỗi == `external_auth(spender)`. Đúng ngữ nghĩa ERC-20 (YÊU CẦU CỨNG). Được dùng bởi `SPL_ERC20.allowance`                                                                                                                                                                                                               |

## Rút (`0x4200000000000000000000000000000000000016`)

Rút khí gốc Rome → Solana.

| Chữ ký Solidity            | Selector     | Điều phối                                | Mô tả                                                                                                                                   |
| -------------------------- | ------------ | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `withdrawal(bytes32)`      | `0x4d8b0ea4` | `Được tổ hợp` (`có thể nhận thanh toán`) | Đốt `msg.value` Gas Rome; mint + chuyển đến một tài khoản hệ thống Solana `vào`. Phương thức precompile duy nhất có thể nhận thanh toán |
| `withdraw_to_pda(uint256)` | `0x7f3124a0` | `Được tổ hợp`                            | Đốt gas; gửi vào `EXTERNAL_AUTHORITY` PDA của người gọi. **Chỉ trạng thái đơn**                                                         |
| `withdraw_to_ata(uint256)` | `0x8059abc0` | `Được tổ hợp`                            | Đốt gas; gửi vào `getATA(caller_pda, chain_mint_id)`. **Chỉ trạng thái đơn**                                                            |


---

# 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/vi/tai-lieu-tham-khao/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.
