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

# مرجع الدوال المُسبقة

كل طريقة في الدوال المُسبقة الخاصة بالتشغيل البيني مع Solana في Rome — العنوان، توقيع Solidity، المحدِّد، وما إذا كانت تقرأ أو تستدعي أو تُحضِّر نداءً عبر عقود فرعية (CPI).

المحددات التي يرسلها برنامج Rome على السلسلة، حسب الـ precompile. المحدد = `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 حقيقي | مسموح به في التنفيذ التكراري        |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ----------------------------------- |
| `استدعاء` / `مُركَّب` | واحد أو أكثر من CPIs، موقَّعة بصفتها PDA الخاصة بالسلطة الخارجية للمتصل حيث تنطبق البذور. على **المسار القديم** تُنفَّذ فورًا؛ وعلى **مخزّنة** المسار تُرحَّل وتُثبت في نهاية المعاملة. | نعم                      | القديم: **لا**. المخزّن مؤقتًا: نعم |
| `EthCall`             | حساب خالص أو قراءة لحالة Rome نفسها                                                                                                                                                     | لا                       | نعم                                 |
| `CrossStateEthCall`   | قراءة لبايتات حساب Solana آخر، محمّلة مسبقًا بالمحاكاة. لا CPI، لا آثار جانبية.                                                                                                         | لا                       | نعم                                 |
| `مسبق الترجمة`        | تشفير حتمي (المسبقات القياسية في Ethereum)                                                                                                                                              | لا                       | نعم                                 |

تستخدم العقدة **مسارًا واحدًا**: إما المسبقات القديمة (`0xff…07`, `0xff…08`, `0xff…09`, `0x42…16`) أو المخزنة مؤقتًا (`0xff…04`, `0xff…05`, `0xff…06`, `0xff…0b`). يُرفَض مزج الاستدعاءات المُغيِّرة من الاثنين في معاملة واحدة أثناء التشغيل. تظل القراءات مسموحة، مع استثناء واحد: بمجرد إطلاق استدعاء على المسار المخزّن مؤقتًا، تُرفض قراءات المسار القديم لباقي المعاملة. انظر [دمج برنامج سولانا](/ar/adlh-almtw-ryn/integrate-solana-program.md).

**من يدفع.** دافع الرسوم في Solana يقدّم مقدمًا كل لامبورت ينفقه استدعاء CPI على المسار القديم (الإيجار، التحويلات، `swap_gas_to_lamports`)؛ يقيس البرنامج رصيد الدافع حول كل CPI ويحمّل المستخدم صافي الإنفاق كغاز بسعر الغاز، مع ردّ اللومبورتات التي يعيدها CPI.

**من يوقّع.** العقدة التي تستدعي مسبق الترجمة تتصرف بصفتها نفسها: الموقّع هو PDA الخاص بالسلطة الخارجية للعقدة (`["EXTERNAL_AUTHORITY", contract]`). يوقّع PDA الخاص بالمستخدم فقط على معاملة يرسلها المستخدم مباشرة إلى عنوان الـ precompile. تحت `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`) وتقوم بتضمين الـ PDAs المملّحة باسم مساحة الأسماء بعنوان العقدة الجاري تشغيلها.

كل طريقة غير قابلة للدفع (`msg.value > 0` تؤدي إلى revert مع `TransferProhibited`) باستثناء `withdrawal(bytes32)`. الطرق الموسومة بـ *single-state only* مرفوضة على سلاسل op-geth-stack. لا يجوز لـ CPI تسمية دافع رسوم Solana (إلا داخل تعليمات System transfer عادية) أو برنامج Rome، ولا يجوز له استدعاء برنامج Rome.

## SystemCached (`0xff00000000000000000000000000000000000004`)

إنشاء PDA + عمليات برنامج النظام (allocate، assign، lamport transfer)، تُرحَّل إلى الطبقة المتراكبة. النظير المخزَّن مؤقتًا لـ legacy `System @ 0xff..07`محددات التغيير الخاصة به (يحتفظ 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` | `استدعاء` | PDA مشتق من salt، بحجم N، يحدده المالك                                    |
| `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 + قراءات حسابات عبر الحالة، تُرحَّل إلى الطبقة المتراكبة.

| توقيع Solidity                                  | المحدد       | التنفيذ             | الوصف                                                                                                                                                                                                                                                                                                                                                                           |
| ----------------------------------------------- | ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transfer(address,uint256)`                     | `0xa9059cbb` | `استدعاء`           | تحويل SPL حيث يكون المتصل هو المالك إلى ATA مشتق من عنوان EVM، مع mint الحالي للتجميع                                                                                                                                                                                                                                                                                           |
| `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` | `استدعاء`           | موافقة spender في EVM — المالك = `external_auth(caller)`، المفوّض = `external_auth(spender_addr)`. تُستخدم بواسطة `SPL_ERC20_cached.approve`                                                                                                                                                                                                                                    |
| `mint(address,uint256,bytes32)`                 | `0x1e458bee` | `استدعاء`           | PDA الخاص بالمتصل يوقّع بصفته سلطة الـ mint. يفرض وقت تشغيل SPL أن يكون PDA الخاص بالمتصل == سلطة الـ mint على السلسلة. تُستخدم بواسطة `SPL_ERC20_cached.mint_to` وتسوية الجسر الوارد                                                                                                                                                                                           |
| `init(bytes32,bytes32,bytes32)`                 | `0x0b0ad508` | `استدعاء`           | `InitializeAccount3` ix (ata, mint, owner)                                                                                                                                                                                                                                                                                                                                      |
| `account(address)`                              | `0x73b9aa91` | `CrossStateEthCall` | قراءة حالة حساب SPL لـ ATA مشتق من PDA الخاص بعنوان EVM (mint الحالي للتجميع)                                                                                                                                                                                                                                                                                                   |
| `account(bytes32)`                              | `0x882358ae` | `CrossStateEthCall` | قراءة حالة حساب SPL لـ pubkey ATA خام                                                                                                                                                                                                                                                                                                                                           |
| `account(address,bytes32)`                      | `0xf9827227` | `CrossStateEthCall` | نفس `account(address)` مع mint صريح.                                                                                                                                                                                                                                                                                                                                            |
| `mint_info(bytes32)`                            | `0xe24bf5d4` | `CrossStateEthCall` | حقائق الـ Mint، مع وعي بالطبقة المتراكبة: برنامج الرمز، الكسور العشرية، **مُفعّل** برنامج hook (0 عند عدم وجوده *أو* خامل)، رسوم bps الخاصة بالحقبة الحالية، وخريطة بتّات لوجود الامتدادات. نفس المحدد مثل `HelperProgram.mint_info` — قدرة واحدة، وموضعا إرسال مختلفان، لأن العقدة على المسار المخزّن مؤقتًا لا يمكنها استخدام القراءة القديمة بعد إطلاق استدعاء مخزّن مؤقتًا. |

## ASplCached (`0xff00000000000000000000000000000000000006`)

إنشاء Associated Token Account، بصورة idempotent.

| توقيع Solidity                | المحدد       | التنفيذ   | الوصف                                                      |
| ----------------------------- | ------------ | --------- | ---------------------------------------------------------- |
| `create_ata()`                | `0xb6d336ed` | `استدعاء` | إنشاء ATA idempotent لـ caller-PDA × mint التجميع الحالي   |
| `create_ata(bytes32)`         | `0x81972e35` | `استدعاء` | إنشاء ATA idempotent لـ caller-PDA × mint صريح             |
| `create_ata(address)`         | `0x5a7c3259` | `استدعاء` | إنشاء ATA idempotent لـ EVM-addr-derived PDA × mint الحالي |
| `create_ata(address,bytes32)` | `0x3de2251a` | `استدعاء` | إنشاء ATA idempotent لـ EVM-addr × mint صريح               |

## WithdrawCached (`0xff0000000000000000000000000000000000000b`)

أرجل سحب رمز الغاز (غاز أصلي → غلاف SPL، غاز أصلي → SOL، غاز أصلي → caller PDA)، تُرحَّل. النظير المخزَّن مؤقتًا لـ legacy `Withdraw @ 0x42..16`.

| توقيع Solidity                | المحدد       | التنفيذ   | الوصف                                                                                                                                                                                                                                                                                                                                                                                                    |
| ----------------------------- | ------------ | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `withdrawal(bytes32) payable` | `0x4d8b0ea4` | `مُركَّب` | حرق `msg.value` غاز Rome، التحويل إلى مستلم حساب نظام Solana                                                                                                                                                                                                                                                                                                                                             |
| `withdraw_to_pda(uint256)`    | `0x7f3124a0` | `مُركَّب` | احرق wei، وأودِع lamports إلى `EXTERNAL_AUTHORITY` PDA الخاص بالمتصل. حالة واحدة فقط.                                                                                                                                                                                                                                                                                                                    |
| `withdraw_to_ata(uint256)`    | `0x8059abc0` | `مُركَّب` | احرق wei، وأودِع غلاف SPL إلى ATA المملوك لـ PDA الخاص بالمتصل. حالة واحدة فقط. ذراع التغليف من جسر غلاف الغاز.                                                                                                                                                                                                                                                                                          |
| `deposit(uint256)`            | `0xb6b55f25` | `مُركَّب` | عكس `withdrawal` — تحويل SPL من ATA المملوك لـ PDA الخاص بالمتصل إلى ATA sol\_wallet الخاص بالسلسلة على جانب Solana؛ **mint** `wei` غاز أصلي إلى المتصل على جانب EVM. سكّ خالص (من دون خصمٍ مقابل من `Withdraw::ADDRESS` — محفظة SPL الخاصة بالسلسلة هي الغطاء الاقتصادي، لا عنوان الـ precompile). حالة واحدة فقط. ذراع فكّ التغليف من جسر غلاف الغاز. يطابق `HelperProgram.deposit_from_ata` الدلالات. |

## System (`0xff00000000000000000000000000000000000007`)

اشتقاق PDA + تحويل base58 + أدوات على نمط الهوية. precompile للقراءة الخالصة — كل طريقة هي `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 لبرنامج Rome EVM هذا                                 |
| `program_id()`                                    | `0x77764881` | `EthCall` | يعيد معرّف برنامج النظام الخاص بـ Rome (هوية هذا الـ precompile)              |
| `mint_id()`                                       | `0xe132a122` | `EthCall` | يعيد pubkey لمنتج SPL الخاص برمز الغاز في السلسلة (`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`)

**precompile مزدوج الغرض.** من بين المحددات السبعة أدناه، **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 — وهي نفسها **ليست CPIs**. انظر جدول إزالة الالتباس في أعلى هذا القسم للحصول على مصفوفة السلوك الكاملة.

| توقيع Solidity                                                 | المحدد       | التنفيذ             | الوصف                                                                                                                                                                                                            |
| -------------------------------------------------------------- | ------------ | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `invoke(bytes32,(bytes32,bool,bool)[],bytes)`                  | `0x7480cb86` | `استدعاء`           | CPI موقّع بصفت `EXTERNAL_AUTHORITY(caller)` ه عندما يكون ذلك الحساب مدرجًا بوصفه موقّعًا (مرفوض تحت DELEGATECALL)؛ لا توجد sub-PDAs مملّحة. يمرر المتصل البرنامج الهدف + account metas + بيانات ix               |
| `invoke_signed(bytes32,(bytes32,bool,bool)[],bytes,bytes32[])` | `0xb94f3733` | `استدعاء`           | CPI موقّع بصفت `EXTERNAL_AUTHORITY(caller)` في CALL مباشر؛ تُلحَق الأملاح ببذرة كل PDA. تحت DELEGATECALL تُرفض سلطة المتصل العارية وتحمل البذور المملحة عنوان العقدة الجاري تشغيلها — انظر ملاحظة الاشتقاق أدناه |
| `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 من PDAs المستقلة ضد برنامج واحد في تنفيذ واحد                                                                                                                                                                  |

## HelperProgram (`0xff00000000000000000000000000000000000009`)

مساعدو Rome الموجّهون للمستخدم لإنشاء ATA/PDA، وتحويلات/approve/mint الخاصة بـ SPL والموقعة بواسطة `EXTERNAL_AUTHORITY` PDA الخاص بالمتصل، وتحويل gas↔lamports، وإيداع ATA، وقراءات SPL\_ERC20-facing (`user_balance` / `allowance_of`). كل طريقة هي `not_payable`؛ مسارات التغيير تمر عبر `استدعاء` (CPI واحد) باستثناء `deposit_from_ata` (`مُركَّب`، حالة واحدة فقط)، والاستعلامات الثلاثة للقراءة فقط عن `pda`/`ata`  (`EthCall`), وقراءتا SPL\_ERC20 عبر الحالة (`CrossStateEthCall` — جلب حساب Solana واحد).

| توقيع Solidity                                                   | المحدد       | التنفيذ             | الوصف                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ---------------------------------------------------------------- | ------------ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_ata(address)`                                            | `0x5a7c3259` | `استدعاء`           | إنشاء ATA للمستخدم EVM تحت mint الغاز الخاص بالسلسلة                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `create_ata(address,bytes32)`                                    | `0x3de2251a` | `استدعاء`           | إنشاء ATA للمستخدم EVM تحت mint تعسفي                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `create_ata_for_key(bytes32,bytes32)`                            | `0xd258a69d` | `استدعاء`           | إنشاء ATA idempotent لـ 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` لامبورتات من دافع رسوم سولانا في المعاملة؛ يدفع المستدعي ثمنها بعملة Rome gas (يُضاف إنفاق lamport الخاص بالدافع داخل أي CPI قديم إلى رسوم المعاملة)                                                                                                                                                                                                                                                                                                                                                                                                |
| `transfer_lamports(address,uint64)`                              | `0x5fe71665` | `استدعاء`           | انقل لامبورتات من PDA الخاص بالمستدعي إلى PDA لمستخدم EVM آخر                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `transfer_spl(address,uint64)`                                   | `0xb12be5ba` | `استدعاء`           | أرسل SPL لغاز السلسلة من ATA الخاص بـ PDA للمستدعي إلى ATA الخاص بالمستخدم الوجهة                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `transfer_spl(bytes32,uint64)`                                   | `0xba3a5eac` | `استدعاء`           | أرسل SPL لغاز السلسلة من ATA الخاص بـ PDA للمستدعي إلى ATA صريح                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `transfer_spl(address,uint64,bytes32)`                           | `0x53b505e0` | `استدعاء`           | أرسل SPL بأي سكّ مخصص من ATA الخاص بـ PDA للمستدعي إلى ATA الخاص بالمستخدم الوجهة                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `transfer_spl(bytes32,uint64,bytes32)`                           | `0xb6977879` | `استدعاء`           | أرسل SPL بأي سكّ مخصص من ATA الخاص بـ PDA للمستدعي إلى ATA صريح                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `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` | `استدعاء`           | مسار الخروج الأصلي في سولانا. يرسل `الكمية` من `mint` من ATA الخاص بـ PDA للمستدعي إلى **ATA الخاص بالموقّع الخارجي على سولانا** لهذا السكّ (فقط محفظة المستخدم على مسار سولانا الموقّع من المحفظة؛ ومن MetaMask أو عبر المرحّل يكون الموقّع هو دافع Rome الوكيل؛ لا يوجد تحويل لعنوان EVM). لا حاجة إلى موافقة — PDA الخاص بالمستدعي يملك ATA المصدر. اقترنه مع `ActivateAta` (الفتحة 18) لاستخدام EVM بنهاية-إلى-نهاية مع مفاتيح سولانا فقط. يصل إلى المحفظة على المسار v1 الحالي وعلى المسار القديم الأقدم `DoTxUnsigned` (الفتحة 17) لأن المحفظة توقّع معاملة سولانا في كليهما. |
| `approve_spl(address,uint64,bytes32)`                            | `0xabf6f675` | `استدعاء`           | يعيّن المالك PDA الخاص بالمستدعي `delegate_pda(spender)` على ATA الخاص بالمالك عبر SPL `approve_checked`. تُستخدم بواسطة `SPL_ERC20.approve`                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `approve_spl_raw_delegate(bytes32,bytes32,uint64,bytes32,uint8)` | `0x7881d453` | `استدعاء`           | SPL `approve_checked` مع مفوّض raw-pubkey يزوّده المستدعي (مثل Wormhole `authority_signer` PDA، بلا مكافئ لعنوان EVM). يمرّر المستدعي `decimals` لتجاوز قراءة السكّ على السلسلة (\~توفير 30-50 ألف CU). `spl_program = SPL Token`. تُستخدم بواسطة `RomeBridgeWithdraw.approveBurnETH`                                                                                                                                                                                                                                                                                               |
| `mint_spl(address,uint64,bytes32)`                               | `0xd795522b` | `استدعاء`           | يُسكّ من قبل PDA الخاص بالمستدعي بصفته سلطة السكّ إلى ATA الخاص بالمستخدم الوجهة عبر SPL `mint_to_checked`. يفرض وقت تشغيل SPL تطابق السلطة. تُستخدم بواسطة `SPL_ERC20.mint_to`                                                                                                                                                                                                                                                                                                                                                                                                     |
| `create_mint_account(bytes32)`                                   | `0xe97d3291` | `استدعاء`           | إنشاء حساب نظام يخصّص PDA مشتقًا من ملح (`external_auth_with_salt(caller, salt)`) بمساحة=82 ومملوكًا لـ SPL Token. الممول = PDA الخاص بـ external\_auth للمستدعي. موقّعان اثنان من نوع 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 في إرسالية واحدة. يوفّر غلاف Rome DoTx واحدًا مقارنةً بـ `create_mint_account` + `init_spl_mint` استدعاءات                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `deposit_from_ata(uint256)`                                      | `0x4479b709` | `مُركَّب`           | اسحب SPL من ATA الخاص بالمستدعي إلى غاز Rome الأصلي. **حالة واحدة فقط** — مرفوض على سلاسل op-geth                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `pda(address)`                                                   | `0x8854a299` | `EthCall`           | استخرج PDA الخاص بالمستخدم `EXTERNAL_AUTHORITY` — للقراءة فقط                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `pda_with_salt(address,bytes32)`                                 | `0x5c6d04b3` | `EthCall`           | PDA مشتق من ملح `EXTERNAL_AUTHORITY` في إرسالية واحدة. يدمج تركيب Solidity ذي الاستدعاءين `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 الخاص بالمستخدم `الكمية` (إزاحة 64 في SPL TokenAccount). يعيد 0 إذا لم يكن ATA موجودًا (فحص سلسلة جديدة). يدمج 3 إرسالات v1. تُستخدم بواسطة `SPL_ERC20.balanceOf`                                                                                                                                                                                                                                                                                                                                                                                                          |
| `mint_info(bytes32)`                                             | `0xe24bf5d4` | `CrossStateEthCall` | حقائق السكّ لمستدعي المسار القديم: برنامج الرمز، الكسور العشرية، **مُفعّل** برنامج hook (0 عند عدم وجوده *أو* خامل)، رسوم bps لآخر حقبة، خريطة بتات وجود الامتدادات. معكوس على `SplCached` على نفس المحدد. `feeBps` هو **مُسند** — أي إنه يشير إلى أن رسومًا مفعّلة، لكنه ليس معطى فعليًا، إذ إن الرسوم الحقيقية مُقيدة بواسطة `maximum_fee` الذي لا يحمله هذا عمدًا.                                                                                                                                                                                                               |
| `allowance_of(address,address,bytes32)`                          | `0xed72dbc8` | `CrossStateEthCall` | اقرأ delegated\_amount الخاص بـ ATA المالك مع **فحص مساواة المفوَّض** — يعيد 0 ما لم يكن المفوَّض على السلسلة == `external_auth(spender)`. مطابق دلاليًا لـ ERC-20 (شرط صارم). تُستخدم بواسطة `SPL_ERC20.allowance`                                                                                                                                                                                                                                                                                                                                                                 |

## سحب (`0x4200000000000000000000000000000000000016`)

سحب الغاز الأصلي من Rome إلى سولانا.

| توقيع Solidity             | المحدد       | التنفيذ                  | الوصف                                                                                                         |
| -------------------------- | ------------ | ------------------------ | ------------------------------------------------------------------------------------------------------------- |
| `withdrawal(bytes32)`      | `0x4d8b0ea4` | `مُركَّب` (`قابل للدفع`) | حرق `msg.value` غاز Rome؛ سكّ + تحويل إلى حساب نظام سولانا `إلى`. الطريقة الوحيدة القابلة للدفع في precompile |
| `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/ar/almrja/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.
