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

# Precompileリファレンス

RomeのSolana相互運用precompileの各メソッド — アドレス、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 の状態に対して何を行うかを示しています：

| ディスパッチ              | 何が起こるか                                                                                                                                 | 実際の Solana CPI | 反復実行で許可される               |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ------------------------ |
| `呼び出し` / `合成`       | 1つ以上の CPI。シードが適用される場合は、呼び出し元の external-authority PDA として署名されます。 **レガシー** トラックでは即座に実行され、 **キャッシュ済み** トラックではステージされ、トランザクションの最後にコミットされます。 | はい             | レガシー： **いいえ**。キャッシュ済み：はい |
| `EthCall`           | 純粋な計算、または Rome 自身の状態の読み取り                                                                                                              | いいえ            | はい                       |
| `CrossStateEthCall` | エミュレーションによって事前読み込みされた、別の Solana アカウントのバイト列の読み取り。CPI なし、副作用なし。                                                                          | いいえ            | はい                       |
| `プリコンパイル`           | 決定論的暗号処理（Ethereum 標準のプリコンパイル）                                                                                                          | いいえ            | はい                       |

コントラクトは **1つのトラック**：レガシープリコンパイル（`0xff…07`, `0xff…08`, `0xff…09`, `0x42…16`）またはキャッシュ済みのもの（`0xff…04`, `0xff…05`, `0xff…06`, `0xff…0b`）。両方の変更系呼び出しを 1 つのトランザクションで混在させることは、実行時に拒否されます。読み取りは引き続き許可されますが、1 つ例外があります。cached トラックの invoke が一度発火すると、その後のトランザクション中は legacy トラックの読み取りが拒否されます。参照： [Solana プログラムを統合する](/ja/gaido/integrate-solana-program.md).

**誰が支払うか。** Solana の fee payer は、legacy トラックの CPI が消費するすべての lamport を立て替えます（rent、送金、 `swap_gas_to_lamports`）；プログラムは各 CPI の前後で payer の残高を計測し、正味の支出を gas 価格でユーザーに課金し、CPI が返した lamport は払い戻します。

**誰が署名するか。** プリコンパイルを呼び出すコントラクトは自分自身として振る舞います。署名者はそのコントラクトの external-authority 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` なお、ミントの rent を支払うために外側の呼び出し元の PDA で署名し続け、権限がその PDA であるミントのみを作成できます。また `invoke` / `invoke_signed` 素の権限（`DelegatecallOwnerAuthority`）は拒否し、salt 付き PDA は実行中のコントラクトのアドレスで名前空間化されます。

すべてのメソッドは non-payable（`msg.value > 0` により revert します： `TransferProhibited`）ただし次を除く： `withdrawal(bytes32)`。 *単一状態のみ* は op-geth-stack チェーンでは拒否されます。CPI は Solana の fee payer（通常の System 送金命令の内部を除く）や Rome プログラムを指定してはならず、Rome プログラムを呼び出してもいけません。

## SystemCached（`0xff00000000000000000000000000000000000004`)

PDA 作成 + system-program の操作（allocate、assign、lamport 送金）を overlay にステージします。legacy のキャッシュ版 `System @ 0xff..07`の変更系セレクタです（legacy System は純粋な読み取りセレクタを保持します）。

| Solidity シグネチャ                       | セレクタ         | ディスパッチ | 説明                                               |
| ------------------------------------ | ------------ | ------ | ------------------------------------------------ |
| `create_pda()`                       | `0xe0402a8d` | `呼び出し` | 呼び出し元の `external_auth` PDA を作成します。rent 免除、データ長 0 |
| `create_pda(uint64)`                 | `0x4ceab657` | `呼び出し` | 同様。ただし rent を超える lamport 数は funder 指定            |
| `create_pda(uint64,bytes32)`         | `0x48e2bb86` | `呼び出し` | lamport 付きの salt 由来 PDA                          |
| `create_pda(bytes32,uint64,bytes32)` | `0xcc258bbf` | `呼び出し` | 所有者指定、サイズ N、salt 由来                              |
| `allocate(uint64,bytes32)`           | `0x93225c9f` | `呼び出し` | salt 由来 PDA に N バイトを割り当てます                       |
| `assign(bytes32,bytes32)`            | `0x8ac00bdc` | `呼び出し` | salt 由来 PDA を新しい所有者に割り当てます                       |
| `transfer(address,uint64)`           | `0x5d359fbd` | `呼び出し` | EVM アドレス由来 PDA への lamport 送金                     |
| `transfer(bytes32,uint64)`           | `0xfd54d1ea` | `呼び出し` | 生の Solana pubkey への lamport 送金                   |
| `transfer(bytes32,uint64,bytes32)`   | `0x875abfc0` | `呼び出し` | 生の pubkey への lamport 送金、送金元は salt 由来             |

## SplCached（`0xff00000000000000000000000000000000000005`)

SPL Token / Token-2022 の送金 + ATA 初期化 + cross-state アカウント読み取りを overlay にステージします。

| Solidity シグネチャ                                  | セレクタ         | ディスパッチ              | 説明                                                                                                                                                                                                                                       |
| ----------------------------------------------- | ------------ | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transfer(address,uint256)`                     | `0xa9059cbb` | `呼び出し`              | 呼び出し元を所有者とする SPL 送金。送金先は EVM アドレス由来 PDA の ATA、ミントは現在の rollup mint                                                                                                                                                                        |
| `transfer(bytes32,uint256)`                     | `0x6a467394` | `呼び出し`              | 同様。受取人は生の Solana pubkey で指定                                                                                                                                                                                                              |
| `transfer(address,uint256,bytes32)`             | `0x57cfeeee` | `呼び出し`              | 明示的ミント版、送信先は EVM アドレス                                                                                                                                                                                                                    |
| `transfer(bytes32,uint256,bytes32)`             | `0x7db527f9` | `呼び出し`              | 明示的ミント版、送信先は生の pubkey                                                                                                                                                                                                                    |
| `transferFrom(address,address,uint256,bytes32)` | `0x401e3367` | `呼び出し`              | 委任元版 — 権限 = `external_auth(caller)`、ATA 所有者または十分な残高の delegate として受け入れられます。使用先： `SPL_ERC20_cached.transferFrom` およびルーター主導のフロー                                                                                                             |
| `approve(address,uint256,bytes32)`              | `0x8180f2fc` | `呼び出し`              | EVM スポンダー承認 — owner = `external_auth(caller)`、delegate = `external_auth(spender_addr)`。使用先： `SPL_ERC20_cached.approve`                                                                                                                   |
| `mint(address,uint256,bytes32)`                 | `0x1e458bee` | `呼び出し`              | 呼び出し元の PDA が mint 権限者として署名します。SPL ランタイムは caller-PDA == オンチェーンの mint 権限者を強制します。使用先： `SPL_ERC20_cached.mint_to` および inbound ブリッジの精算                                                                                                        |
| `init(bytes32,bytes32,bytes32)`                 | `0x0b0ad508` | `呼び出し`              | `InitializeAccount3` ix（ata、mint、owner）                                                                                                                                                                                                  |
| `account(address)`                              | `0x73b9aa91` | `CrossStateEthCall` | EVM アドレスの PDA 由来 ATA の SPL アカウント状態を読み取ります（現在の rollup mint）                                                                                                                                                                               |
| `account(bytes32)`                              | `0x882358ae` | `CrossStateEthCall` | 生の ATA pubkey の SPL アカウント状態を読み取ります                                                                                                                                                                                                       |
| `account(address,bytes32)`                      | `0xf9827227` | `CrossStateEthCall` | と同じ `account(address)` ただし mint を明示します。                                                                                                                                                                                                  |
| `mint_info(bytes32)`                            | `0xe24bf5d4` | `CrossStateEthCall` | Mint 情報。overlay を考慮：token program、decimals、 **有効化済み** hook program（存在しない場合は 0、 *または* 無効）、現在エポックの fee bps、および拡張の有無を示すビットマップ。 `HelperProgram.mint_info` — 1つの機能、2つのディスパッチ先。cached トラックのコントラクトは、cached invoke が一度発火すると legacy の読み取りを使えないため。 |

## ASplCached（`0xff00000000000000000000000000000000000006`)

Associated Token Account の作成。冪等。

| Solidity シグネチャ                | セレクタ         | ディスパッチ | 説明                                        |
| ----------------------------- | ------------ | ------ | ----------------------------------------- |
| `create_ata()`                | `0xb6d336ed` | `呼び出し` | 呼び出し元 PDA × 現在の rollup mint に対する冪等 ATA 作成 |
| `create_ata(bytes32)`         | `0x81972e35` | `呼び出し` | 呼び出し元 PDA × 明示的 mint に対する冪等 ATA 作成        |
| `create_ata(address)`         | `0x5a7c3259` | `呼び出し` | EVM アドレス由来 PDA × 現在の mint に対する冪等 ATA 作成   |
| `create_ata(address,bytes32)` | `0x3de2251a` | `呼び出し` | EVM アドレス × 明示的 mint に対する冪等 ATA 作成         |

## WithdrawCached（`0xff0000000000000000000000000000000000000b`)

ガストークンの引き出し経路（ネイティブ gas → SPL ラッパー、ネイティブ gas → SOL、ネイティブ gas → 呼び出し元 PDA）をステージします。legacy のキャッシュ版 `Withdraw @ 0x42..16`.

| Solidity シグネチャ                | セレクタ         | ディスパッチ | 説明                                                                                                                                                                                                                                                                                                           |
| ----------------------------- | ------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `withdrawal(bytes32) payable` | `0x4d8b0ea4` | `合成`   | バーン `msg.value` Rome gas を消費し、Solana の system-account 受取人へ送金                                                                                                                                                                                                                                                 |
| `withdraw_to_pda(uint256)`    | `0x7f3124a0` | `合成`   | wei を消費し、呼び出し元の `EXTERNAL_AUTHORITY` PDA に lamport を預けます。単一状態のみ。                                                                                                                                                                                                                                             |
| `withdraw_to_ata(uint256)`    | `0x8059abc0` | `合成`   | wei を消費し、呼び出し元の PDA 所有 ATA に SPL ラッパーを預けます。単一状態のみ。gas ラッパー・ブリッジの wrap 側です。                                                                                                                                                                                                                                   |
| `deposit(uint256)`            | `0xb6b55f25` | `合成`   | の逆 `withdrawal` — Solana 側で、呼び出し元の PDA 所有 ATA からチェーンの sol\_wallet ATA への SPL 送金； **トークンのラッパーを見つけるには、その** `wei` EVM 側で呼び出し元にネイティブ gas を付与します。純粋な mint（ `Withdraw::ADDRESS` — チェーンの SPL ウォレットが経済的裏付けであり、プリコンパイルアドレスではありません）。単一状態のみ。gas ラッパー・ブリッジの unwrap 側です。 `HelperProgram.deposit_from_ata` のセマンティクスに一致します。 |

## System（`0xff00000000000000000000000000000000000007`)

PDA 導出 + base58 変換 + identity 系ユーティリティ。純読み取りのプリコンパイル — すべてのメソッドは `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` | 既知の bump を用いた定数時間の PDA 導出                                          |
| `rome_evm_program_id()`                           | `0xb76fd45b` | `EthCall` | この Rome EVM プログラムの Solana プログラム ID を返します                           |
| `program_id()`                                    | `0x77764881` | `EthCall` | Rome の System Program ID を返します（このプリコンパイルの識別子）                      |
| `mint_id()`                                       | `0xe132a122` | `EthCall` | チェーンの gas トークンの SPL mint pubkey を返します（`OwnerInfo.chain_mint_id`)   |
| `operator()`                                      | `0x570ca735` | `EthCall` | 外側の Rome tx の Solana 署名者を返します                                      |
| `bytes32_to_base58(bytes32)`                      | `0xfa2b1a5f` | `EthCall` | Pubkey バイト列 → base58 文字列                                           |
| `base58_to_bytes32(bytes)`                        | `0x5df01b72` | `EthCall` | base58 文字列 → pubkey バイト列                                           |

## CpiProgram（`0xff00000000000000000000000000000000000008`)

**二重用途のプリコンパイル。** 以下の 7 つのセレクタのうち、 **2 つは実際の Solana CPI を実行し** (`invoke`, `invoke_signed` — としてディスパッチし `呼び出し`と **5 つは純粋な cross-state 読み取りです** (`account_info`, `account_data_at`, `account_u64_at`, `account_lamports`, `pdas_batch_derive` — としてディスパッチし `CrossStateEthCall`、syscall なし、 `found_cpi` フラグが設定されます）。歴史的な「CPI shortcut selectors」という表現は、以前の CPI ベースの読み取りの代替として CU を節約する読み取りセレクタを指していましたが、それ自体は **CPI ではありません**。完全な振る舞いの一覧は、この節の冒頭にある曖昧性解消表を参照してください。

| Solidity シグネチャ                                                 | セレクタ         | ディスパッチ              | 説明                                                                                                                                                                      |
| -------------------------------------------------------------- | ------------ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `invoke(bytes32,(bytes32,bool,bool)[],bytes)`                  | `0x7480cb86` | `呼び出し`              | 次として署名された CPI `EXTERNAL_AUTHORITY(caller)` そのアカウントが signer として列挙されている場合（DELEGATECALL では拒否）；salt 付きサブ PDA はありません。呼び出し元は target program + account metas + ix data を渡します   |
| `invoke_signed(bytes32,(bytes32,bool,bool)[],bytes,bytes32[])` | `0xb94f3733` | `呼び出し`              | 次として署名された CPI `EXTERNAL_AUTHORITY(caller)` 直接の CALL では；salt は PDA ごとの seed に追加されます。DELEGATECALL では素の呼び出し元権限は拒否され、salt 付き seed には実行中のコントラクトのアドレスが含まれます — 下の導出メモを参照してください |
| `account_info(bytes32)`                                        | `0xc13465d9` | `CrossStateEthCall` | Solana アカウントの完全な状態（lamports/owner/flags/data）を読み取ります                                                                                                                    |
| `account_data_at(bytes32,uint16,uint16)`                       | `0x593762e8` | `CrossStateEthCall` | 任意の Solana アカウントの data バッファの一部を読み取ります                                                                                                                                   |
| `account_u64_at(bytes32,uint16)`                               | `0xb317d4c1` | `CrossStateEthCall` | 既知のオフセットで型付き u64 LE を読み取ります — ABI の往復を節約します                                                                                                                             |
| `account_lamports(bytes32)`                                    | `0xde79ed54` | `CrossStateEthCall` | lamports のみのプローブ — data の取得を省略します                                                                                                                                       |
| `pdas_batch_derive(bytes[][],bytes32)`                         | `0x944336f8` | `CrossStateEthCall` | 1 つのプログラムに対する N 個の独立した PDA を 1 回のディスパッチで導出します                                                                                                                           |

## HelperProgram（`0xff00000000000000000000000000000000000009`)

Rome のユーザー向けヘルパー。ATA/PDA 作成、呼び出し元の `EXTERNAL_AUTHORITY` PDA による署名付き SPL 送金/approve/mint、gas↔lamports 変換、ATA への deposit、SPL\_ERC20 向け読み取り（`user_balance` / `allowance_of`）。すべてのメソッドは `支払い不可`；変更は `呼び出し` （単一 CPI）を通ります。ただし `deposit_from_ata` (`合成`、単一状態のみ）、3 つの読み取り専用 `PDA`/`ATA` クエリ（`EthCall`）、および 2 つの cross-state SPL\_ERC20 読み取り（`CrossStateEthCall` — Solana アカウント取得 1 回分）。

| Solidity シグネチャ                                                   | セレクタ         | ディスパッチ              | 説明                                                                                                                                                                                                                                                       |
| ---------------------------------------------------------------- | ------------ | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_ata(address)`                                            | `0x5a7c3259` | `呼び出し`              | チェーンの gas mint 下で EVM ユーザーの ATA を作成                                                                                                                                                                                                                      |
| `create_ata(address,bytes32)`                                    | `0x3de2251a` | `呼び出し`              | 任意の mint 下で EVM ユーザーの ATA を作成                                                                                                                                                                                                                            |
| `create_ata_for_key(bytes32,bytes32)`                            | `0xd258a69d` | `呼び出し`              | 任意の生の Solana pubkey を所有者とする冪等 ATA 作成（ `external_auth`で導出されたものではありません）。rent はオペレーターが支払います。使用先： `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 gasでそれらを支払う（レガシーCPI内での支払者のランポート支出はトランザクション手数料に加算される）                                                                                                                                             |
| `transfer_lamports(address,uint64)`                              | `0x5fe71665` | `呼び出し`              | 呼び出し元のPDAから別のEVMユーザーのPDAへランポートを移動する                                                                                                                                                                                                                      |
| `transfer_spl(address,uint64)`                                   | `0xb12be5ba` | `呼び出し`              | 呼び出し元PDAのATAから宛先ユーザーのATAへチェーンガスSPLを送る                                                                                                                                                                                                                    |
| `transfer_spl(bytes32,uint64)`                                   | `0xba3a5eac` | `呼び出し`              | 呼び出し元PDAのATAから明示的なATAへチェーンガスSPLを送る                                                                                                                                                                                                                       |
| `transfer_spl(address,uint64,bytes32)`                           | `0x53b505e0` | `呼び出し`              | 呼び出し元PDAのATAから宛先ユーザーのATAへ任意ミントSPLを送る                                                                                                                                                                                                                     |
| `transfer_spl(bytes32,uint64,bytes32)`                           | `0xb6977879` | `呼び出し`              | 呼び出し元PDAのATAから明示的なATAへ任意ミントSPLを送る                                                                                                                                                                                                                        |
| `transfer_spl(bytes32,bytes32,uint64,bytes32)`                   | `0x766b362a` | `呼び出し`              | 委任バリアント — 呼び出し元が指定 `src_ata` （PDA所有であるか、またはPDAが十分な `delegated_amount`)                                                                                                                                                                                   |
| `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ネイティブの出口レッグ。 `量` の `トークンのラッパーを見つけるには、その` を呼び出し元PDAのATAから **外側のSolana署名者の** そのミントのATAへ（ユーザー自身のウォレット — EVMアドレス変換なし）。承認は不要 — 呼び出し元PDAがソースATAを所有している。と組み合わせて使用 `ActivateAta` （slot 18）+ `DoTxUnsigned` （slot 17）を使って、SolanaキーのみのEVM利用をエンドツーエンドで実現      |
| `approve_spl(address,uint64,bytes32)`                            | `0xabf6f675` | `呼び出し`              | 呼び出し元PDAが所有者として `delegate_pda(spender)` をSPL経由で所有者ATAに設定する `approve_checked`。使用先： `SPL_ERC20.approve`                                                                                                                                                    |
| `approve_spl_raw_delegate(bytes32,bytes32,uint64,bytes32,uint8)` | `0x7881d453` | `呼び出し`              | SPL `approve_checked` 呼び出し元が指定する生の公開鍵デリゲート付き（例：Wormhole `authority_signer` PDA、EVMアドレス相当なし）。呼び出し元は `decimals` オンチェーンのミント読取を省略するため（約30～50K CUの節約）。ハードコードされた `spl_program = SPL Token`。使用先： `RomeBridgeWithdraw.approveBurnETH`                            |
| `mint_spl(address,uint64,bytes32)`                               | `0xd795522b` | `呼び出し`              | 呼び出し元PDAがミント権限者として、SPL経由で宛先ユーザーのATAにミントする `mint_to_checked`。SPLランタイムが権限の一致を強制する。で使用される `SPL_ERC20.mint_to`                                                                                                                                               |
| `create_mint_account(bytes32)`                                   | `0xe97d3291` | `呼び出し`              | SPL Tokenが所有する、salt由来のPDA（`external_auth_with_salt(caller, salt)`）を空間=82で割り当てるSystem CreateAccount。資金提供者 = 呼び出し元のexternal\_auth PDA。2つのPDA署名者。で使用される `ERC20SPLFactory.create_token_mint`                                                                 |
| `init_spl_mint(bytes32,uint8,bytes32,bool,bytes32)`              | `0x4f75e987` | `呼び出し`              | SPL Token `InitializeMint2` 事前割り当て済みミントに対して。PDA署名者なし（mint\_authority/freeze\_authorityはデータとして保存され、実行時署名者ではない）。で使用される `ERC20SPLFactory.init_token_mint`                                                                                                   |
| `create_and_init_mint(uint8,bytes32,bool,bytes32,bytes32)`       | `0x20972d0f` | `合成`                | 統合版：System CreateAccount + SPL InitializeMint2 を1つのディスパッチで実行。別々の `create_mint_account` + `init_spl_mint` 呼び出しに比べてRome DoTxエンベロープを1つ節約                                                                                                                    |
| `deposit_from_ata(uint256)`                                      | `0x4479b709` | `合成`                | 呼び出し元のATAからRomeネイティブガスへSPLを引き出す。 **単一状態のみ** — op-gethチェーンでは拒否される                                                                                                                                                                                         |
| `pda(address)`                                                   | `0x8854a299` | `EthCall`           | ユーザーの `EXTERNAL_AUTHORITY` PDAを導出する — 読み取り専用                                                                                                                                                                                                             |
| `pda_with_salt(address,bytes32)`                                 | `0x5c6d04b3` | `EthCall`           | salt由来の `EXTERNAL_AUTHORITY` PDAを単一ディスパッチで処理する。Solidity側の2回呼び出し `rome_evm_program_id() + find_program_address()` の合成をまとめる。で使用される `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`           | 明示的なミントを使う同様のもの — 読み取り専用                                                                                                                                                                                                                                 |
| `user_balance(address,bytes32)`                                  | `0xdd0119c8` | `CrossStateEthCall` | ユーザーATAを読み取る `量` （SPL TokenAccount オフセット64）。ATAが存在しない場合は0を返す（新規チェーン検査）。v1の3つのディスパッチをまとめる。で使用される `SPL_ERC20.balanceOf`                                                                                                                                    |
| `mint_info(bytes32)`                                             | `0xe24bf5d4` | `CrossStateEthCall` | レガシートラックの呼び出し元向けのミント情報：トークンプログラム、decimals、 **有効化済み** hook program（存在しない場合は 0、 *または* 無効）、現在エポックのfee bps、拡張存在ビットマップ。同じセレクタで `SplCached` にミラーされる。 `feeBps` は **述語** — それは手数料が有効化されていることを示すだけで、実際の手数料はによって上限が定められるため、オペランドではない `maximum_fee` これは意図的に含まれていない。 |
| `allowance_of(address,address,bytes32)`                          | `0xed72dbc8` | `CrossStateEthCall` | 所有者ATAのdelegated\_amountを読み取る **委任一致チェック** — オンチェーンのdelegate == でない限り0を返す `external_auth(spender)`。ERC-20の意味論的に正しい（必須要件）。で使用される `SPL_ERC20.allowance`                                                                                                    |

## Withdraw（`0x4200000000000000000000000000000000000016`)

Rome → Solana ネイティブガスの引き出し。

| Solidity シグネチャ             | セレクタ         | ディスパッチ           | 説明                                                                           |
| -------------------------- | ------------ | ---------------- | ---------------------------------------------------------------------------- |
| `withdrawal(bytes32)`      | `0x4d8b0ea4` | `合成` (`payable`) | バーン `msg.value` Rome gas; Solanaシステムアカウントへのミント＋転送 `を`。唯一のpayableなプリコンパイルメソッド |
| `withdraw_to_pda(uint256)` | `0x7f3124a0` | `合成`             | ガスをバーンし、呼び出し元の `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/ja/rifarensu/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.
