> 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/adlh-almtw-ryn/open-to-solana-users.md).

# افتح عقدك لمستخدمي سولانا

انشر عقد Solidity على Rome (شبكة Hadrian التجريبية، الشبكة الرئيسية Rubicon) وافتحه أمام محافظ Solana — ما الذي يحتاجه العقد، وكيف يستدعيه مستخدم محفظة Solana، والعناوين الخاصة بكل شبكة، وقائمة إطلاق ch

عملية نشر واحدة، ونوعان من المستخدمين. يتم الوصول إلى عقد على Rome بواسطة مستخدمي MetaMask بمفتاح EVM الخاص بهم، وبواسطة مستخدمي محافظ Solana (مثل Solflare) بمفتاح Solana الخاص بهم — نفس العنوان، ونفس الحالة. هذه الصفحة هي المسار من البداية إلى النهاية: انشر، واجعل العقد جاهزًا لـ Solana، وصِل مسار Solana في تطبيقك، وأطلقه على الشبكة الرئيسية.

## 1. انشر على الشبكة التي تريدها

سلاسل Rome هي أهداف EVM قياسية: تعمل Hardhat وFoundry وviem وethers دون تغيير (شرح كامل في [نشر عقود Solidity](/ar/adlh-almtw-ryn/deploy-solidity.md)).

| الشبكة                                                   | معرّف السلسلة | RPC                                         | المستكشف                                                                              | رمز الغاز     | كيفية الحصول على الغاز                                                                                                                                         |
| -------------------------------------------------------- | ------------- | ------------------------------------------- | ------------------------------------------------------------------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [**روبيكون**](/ar/alshbkat/rubicon.md) (الشبكة الرئيسية) | `7531`        | `https://rubicon.mainnet.romeprotocol.xyz/` | [via-rubicon.mainnet.romeprotocol.xyz](https://via-rubicon.mainnet.romeprotocol.xyz/) | USDC          | حوّل USDC من Ethereum (CCTP) أو من Solana باستخدام [جسر Rome](https://bridge-api.mainnet.romeprotocol.xyz/)؛ حيث يصل كغاز                                      |
| **هادريان** (الشبكة التجريبية)                           | `200010`      | `https://hadrian.testnet.romeprotocol.xyz/` | [via-hadrian.testnet.romeprotocol.xyz](https://via-hadrian.testnet.romeprotocol.xyz/) | USDC التجريبي | حوّل USDC التجريبي من شبكة اختبار ([الصنابير](/ar/almward/faucets.md)) أو لفّه من محفظة devnet على Solana في [تطبيق Rome](https://app.devnet.romeprotocol.xyz) |

الغاز هو USDC مع 18 منزلة عشرية على جانب EVM؛ لا توجد حنفية Rome على أي شبكة. تكاليف الكتابة أعلى من الحدس المعتاد في Ethereum، لأن معظم التكلفة يأتي من إنشاء حسابات Solana: مستلم لم يُستخدم من قبل، حساب رمز جديد، عقد منشور. استخدم `eth_estimateGas`، وهو ما تفعله الأدوات القياسية، ولا تضع أبدًا 21,000 بشكل صلب. في Hadrian، تم قياس نشر عقد بحجم 10 بايت بتقدير واستخدام 1,147,921 من الغاز، وتحويلًا أصليًا إلى عنوان لم يُستخدم من قبل استهلك 1,086,961، مقابل 21,000 للتحويل إلى عنوان موجود. تفرض Rome الغاز المستخدم فعليًا، والذي لم يتجاوز التقدير في هذه القياسات. موّل ببضع USDC قبل أول عملية نشر. تحقّق من المصدر على المستكشف بعد ذلك ([التحقق من العقود](/ar/adlh-almtw-ryn/verify-contracts.md)؛ والمتحقق على الشبكة الرئيسية هو `https://verify.mainnet.romeprotocol.xyz`).

طوّر على Hadrian، ثم أعد نشر الأصول نفسها إلى Rubicon مع استبدال معرف السلسلة وعناوين الغلاف الخاصة بالشبكة الرئيسية؛ لا يتغير أي شيء في العقد بين الشبكات. Rubicon غير موجودة في السجل العام، `create-rome-app` أو `rome-cli` حتى الآن، لذا لا يمكن للأدوات التي تقرأ قيم السلسلة منه أن تستهدفها؛ املأ القيم يدويًا من [روبيكون](/ar/alshbkat/rubicon.md)。 الغاز على Rubicon هو USDC حقيقي بسعر يقارب عشرة أضعاف سعر الغاز في Hadrian، لذا فإن عملية النشر هناك تكلّف مالًا حقيقيًا.

## 2. ما الذي يجعل العقد جاهزًا لـ Solana

هوية EVM لمستخدم Solana هي **العنوان الاصطناعي**, `keccak256(solana_pubkey)[12:]`: `msg.sender`عنوان EVM عادي، مع nonce عادي. معظم العقود لا تحتاج أي تغيير على الإطلاق. الأشياء الثلاثة المهمة:

* **تلقَّ القيمة كـ ERC-20، لا كـ `msg.value`.** أموال مستخدم Solana هي رموز SPL في محفظته، وتُرى على جانب EVM كغلاف الرمز (`wUSDC`, `wETH`, `wSOL`). يحتفظ الرمز الاصطناعي لا شيء في حالة السكون وتصل أصول المستخدم على هيئة الغلاف، لذا اسحب باستخدام `transferFrom` بعد `approve` وَأعِد باستخدام `transfer`. يمنح كل مستخدم الغلاف حق المندوب SPL الخاص به مرة واحدة قبل أول سحب ([لمرة واحدة: امنح الغلاف](/ar/adlh-almtw-ryn/dual-lane-app.md#one-time-grant-the-wrapper)). `قابل للدفع` لن يعمل نقطة إدخال إلا بعد منح الرمز الاصطناعي غازًا أصليًا ( `rome_composeExternalDepositV1`)، وهو ما لا يفعله نموذج التمويل ثم السحب. خزنة ERC-20 موجودة أو AMM أو سوق إقراض لديها بالفعل الشكل الصحيح.
* **استخدم الأغلفة القياسية.** لكل سلسلة غلاف واحد لكل mint؛ والعناوين موجودة في [عناوين العقود](/ar/almrja/contract-addresses.md) (كما أن عنوان Hadrian موجود أيضًا في السجل العام [السجل](https://github.com/rome-protocol/rome-registry)). وجّه البُناة إلى تلك العناوين؛ ولا تنشر غلافك الخاص.
* **طابق الميزانية الذرية حيث يوقّع المحفظة.** توقّع محفظة Solana معاملة Solana واحدة، لذا يجب أن يناسبها استدعاء مسار Solana: حوالي 1.4 مليون وحدة حساب، و64 حسابًا، و4 كيلوبايت ([القيود](/ar/almfahym-alasasyh/constraints.md)). في القياس على Hadrian: تناسب عملية تحويل، وapprove، وإيداع Aave؛ وتناسب عملية swap في Uniswap V3 مع هامش صغير (حوالي 1.24 مليون CU)؛ أما اقتراض Aave فلا يناسب وتنتقل إلى مسار relay في القسم التالي. قِس باستخدام `computeUnitsConsumed`، مع طلب المعاملة باستخدام `maxSupportedTransactionVersion: 1` (الأطراف في Rome هي معاملات v1؛ وبدون ذلك يظهر الحقل 0).

ما لا تحتاج إليه: برنامج Solana، أو جسر، أو عملية نشر ثانية، أو أي Solidity خاص بـ Rome. إذا كان العقد يستدعي أيضًا برامج Solana عبر precompiles، فانظر [استدعِ Solana من EVM](/ar/adlh-almtw-ryn/call-solana-from-evm.md).

## 3. دع محفظة Solana تستدعيه

مسار EVM في تطبيقك لم يتغير (MetaMask + `submitRomeTx`, أو viem/ethers عاديان). بالنسبة لمسار Solana، هناك شكلان.

**مسار SDK — معاملة Solana v1 واحدة لكل استدعاء.** [`@rome-protocol/sdk`](https://github.com/rome-protocol/rome-sdk-ts) (`submitRomeTxV1`) يجعل الوكيل يؤلف معاملة Solana v1 واحدة لاستدعاء EVM الخاص بك (حتى 64 حسابًا و4 كيلوبايت، من دون جدول بحث عن العناوين؛ ولا توجد تعليمات ComputeBudget، أو محفظة خزينة، أو اكتشاف حساب في شيفرتك). يوقّع المحفظة مرتين بالمفتاح نفسه: أولًا رسالة تفويض مقروءة (`تفويض Rome` في سطر واحد، `0x` وتجزئة معاملة EVM في السطر التالي)، والتي تتحقق السلسلة منها عبر برنامج Ed25519، ثم المعاملة. يرسل التطبيق المعاملة الموقعة إلى Solana RPC؛ ويُعيد الاستدعاء تجزئة معاملة EVM وإيصالها. قبل أن يوقّع المحفظة المعاملة، يتحقق SDK منها: المموّل هو الموقّع الوحيد، ولا يعمل سوى برنامج Rome والمتحقق Ed25519، وتحمل تعليمات Rome بالضبط الاستدعاء الذي فوّضه المستخدم، ولا توجد رسوم أولوية. يُرفض أي شيء آخر.

إذا لم يناسب الاستدعاء معاملة واحدة، يرفضه المؤلف ويعطيه SDK إلى الوكيل لتمريره، مع نفس توقيع التفويض، بحيث يرى المستخدم مع ذلك مطالبة تفويض واحدة. عندها تكون النتيجة `route: "relay"`. قواعد الاستدعاءات المرحّلة والاستدعاءات الطويلة موجودة في [الاستدعاءات المُرحَّلة والاستدعاءات الطويلة](/ar/adlh-almtw-ryn/call-evm-from-solana.md#relayed-calls-and-long-calls). الاستدعاء المرحّل يُدفع بعملة الغاز الأصلية في السلسلة، لذا يحتاج الرمز الاصطناعي إلى رصيد غاز: `fundSyntheticGas(deps, amountWei)` ينقل رمز الغاز في السلسلة (USDC على Hadrian وRubicon) من حساب رموز المحفظة إلى داخله، في معاملة v1 واحدة موقعة من المحفظة.

مرحلة التمويل (`buildFundLeg`) وإنشاء حساب رمز المحفظة قبل السحب هما تعليمات Solana عادية; `submitSolanaInstructionsV1` يرسلها أيضًا كمعاملات v1، موقّعة من نفس موقّع المحفظة، من دون تدخل الوكيل. الاستدعاء نفسه الخاص بعملية السحب (`buildSweepLeg`, `HelperProgram.transfer_spl`) يمر عبر `submitRomeTxV1` مثل أي استدعاء آخر، ويجد الوكيل حسابات الرموز. `submitRomeTxV1` لا ينشئ حساب الرمز الاصطناعي الجديد بنفسه: قبل أول استدعاء ينقل القيمة، تحقّق من `isSyntheticProvisioned(...)` وإذا كانت false، فأرسل `buildCreatePdaCall(synthetic)` من خلال `submitRomeTxV1` مرة واحدة. يوجد شرح كامل للإيداع والسحب مع الشيفرة في [ابنِ تطبيقًا ثنائي المسار](/ar/adlh-almtw-ryn/dual-lane-app.md)؛ والميكانيكا موجودة في [استدعِ EVM من Solana](/ar/adlh-almtw-ryn/call-evm-from-solana.md). أما `submitRomeTxSolanaLane`، التي تبني معاملة Solana قديمة في العميل، وما تزال موجودة في SDK كمسار أقدم.

**من أين تأتي كل `deps` قيمة.** الكائن `deps` في SDK يحتوي على خمسة حقول مطلوبة (أما الباقي، مثل `fetchImpl` وفترات المهلة، فهي اختيارية). أربعة تأتي من السلسلة وواحدة من المحفظة:

| `deps` الحقل | مصدره                                                                                                   | دالة الجلب من السجل (`@rome-protocol/registry` v0.2.0)                                        |
| ------------ | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `proxyUrl`   | عنوان RPC الخاص بالسلسلة                                                                                | `getChain(chainId).rpcUrl`                                                                    |
| `chainId`    | معرّف السلسلة                                                                                           | `getChain(chainId).chainId`                                                                   |
| `programId`  | معرّف برنامج Rome الذي تعمل عليه السلسلة                                                                | `getChain(chainId).romeEvmProgramId`                                                          |
| `connection` | RPC الخاص بـ Solana لعنقود السلسلة، حيث تُرسل المعاملة الموقعة (devnet لـ Hadrian، وmainnet لـ Rubicon) | `getChain(chainId).solana.rpc` (عنوان devnet عام لـ Hadrian)؛ ولـ mainnet استخدم RPC خاصًا بك |
| `signer`     | الموقّع الخاص بـ `LaneSigner`، أو `Keypair` في البرامج النصية                                           | لا شيء                                                                                        |

منشئو الأطراف يأخذون قيمًا غير موجودة في `deps`. `mint` اسمها `(المسمى` usdcMint `في الشرح) هو mint الخاص برمز الغاز على Solana، من` getTokens(chainId) `(الإدخال ذو`kind: "gas" `mintId`، الحقل `عنوان غلاف wUSDC ليس مدخلًا لمنشئ الطرف؛ بل تستخدمه لاستدعاءات ERC-20، وهو الإدخال ذو` kind: "spl\_wrapper" `wUSDC` والرمز `address`). يغطي السجل Hadrian. وبالنسبة إلى Rubicon، املأها يدويًا: `proxyUrl` `https://rubicon.mainnet.romeprotocol.xyz/`, `chainId` `7531`, `programId` `RomePq9X3iAoTr813HR7uRarafFDUJty6GdiEceYpzX`, `mint` `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`، الغلاف من الجدول في القسم التالي، وRPC رئيسي على Solana لـ `connection`. [روبيكون](/ar/alshbkat/rubicon.md) يحتوي على القائمة الكاملة.

**نقاط النهاية الخارجية V1 الخاصة بالوكيل — المسار نفسه من دون SDK.** يلفّ SDK عملية التأليف الذرية، والتمرير المرحّل، وإيداع الغاز (`fundSyntheticGas`). تبقى طرق RPC الخام للعملاء الذين لا يستخدمون SDK، وتشمل التأليف التكراري، الذي لا يلفّه SDK. يوقّع المحفظة رسالة Ed25519 واحدة على الاستدعاء (الصيغة المقروءة `تفويض Rome`\
`0x<hash>` أو التجزئة الخام)، ثم يقوم الوكيل إما بتأليف معاملات Solana ليوقّعها المحفظة (`rome_composeUnsignedAtomicV1`, `rome_composeUnsignedIterativeV1` + `rome_submitSignedV1Plan`) أو بتنفيذ العملية كاملة بنفسه بتوقيع محفظة واحد (`rome_relayUnsignedV1`، بعد `rome_composeExternalDepositV1` (خاص بـ SDK `fundSyntheticGas`) يموّل رصيد الغاز الخاص بالرمز الاصطناعي؛ الاستدعاءات المرحّلة تستهلك منه، لذا أعد شحنه عندما ينخفض). أشكال الطرق في [دعم JSON-RPC](/ar/almrja/json-rpc.md)؛ وقواعد التفويض في [استدعِ EVM من Solana](/ar/adlh-almtw-ryn/call-evm-from-solana.md#the-external-v1-endpoints). استخدم relay لأي شيء تكراري، ومسار SDK لكل ما يناسب.

وفي كلتا الحالتين يرى العقد معاملة عادية من العنوان الاصطناعي، ولا يحتفظ المستخدم أبدًا بمفتاح EVM.

## 4. عناوين الأغلفة لكل شبكة

| الشبكة           | `wUSDC` الغلاف                               | أغلفة أخرى                                                                                               |
| ---------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| Rubicon (7531)   | `0x0952d233b0c254cd375f3bfb3e5869c1a906f9b3` | `wETH` `0x01e8b3573da1d4b7b4b1ce0932cf07c8af0c92e9`, `wSOL` `0xc4e29e0f726a906e93277cbbc37bf27a9848a113` |
| Hadrian (200010) | `0xbce339ba4c3a8de3bb8af1c5539e6ac11da3112d` | `wETH` `0x02aeace038269f9961c93d04dcacd6fb3adfa55f`, `wSOL` `0x39f36444fcb79b3e691544aee2a832ebef54ca9f` |

يظهر رمز الغاز الأصلي كـ `0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee` في قوائم الرموز؛ وهو ليس عقد ERC-20. تحمل الأغلفة منازل mint الخاصة بـ SPL، وليس 18: wUSDC 6، وwETH 8، وwSOL 9.

## 5. قائمة التحقق للإطلاق

1. تم النشر على Hadrian؛ ويعمل مسار EVM من MetaMask.
2. كل نقطة دخول تنقل القيمة تعتمد على ERC-20 وموجّهة إلى الغلاف القياسي الخاص بالسلسلة.
3. تُكمل محفظة Solana التي توقّع معاملات v1 (يفعل Solflare ذلك على devnet اليوم؛ أما Phantom فلا يفعل بعد) الدورة الكاملة على Hadrian: تهيئة الرمز الاصطناعي (`create_pda`، مرة واحدة) → مرحلة التمويل → منح → approve → call → مرحلة السحب، باستخدام مسار SDK؛ أو مسار relay إذا كان الاستدعاء تكراريًا.
4. يُقرأ `computeUnitsConsumed` من إيصال Solana ويقع تحت الميزانية الذرية، أو يُوجَّه الاستدعاء عبر relay.
5. منح الغلاف موجود في تدفق أول إيداع لتطبيقك في كلا المسارين: `isEnabled(user)` يُتحقق من `approve_spl` ويُرسل مرة واحدة عندما تكون false ([لمرة واحدة: امنح الغلاف](/ar/adlh-almtw-ryn/dual-lane-app.md#one-time-grant-the-wrapper)).
6. تم التحقق من المصدر على المستكشف.
7. أُعيد نشره على Rubicon مع عناوين الغلاف على الشبكة الرئيسية. Rubicon غير موجودة في السجل، لذا فإن `deps` القيم تُملأ يدويًا من [روبيكون](/ar/alshbkat/rubicon.md). تُجرى الدورة نفسها مرة واحدة بأموال حقيقية، باستخدام محفظة تحققتَ من أنها توقّع معاملات v1 على الشبكة الرئيسية.

## ما التالي

* [ابنِ تطبيقًا ثنائي المسار](/ar/adlh-almtw-ryn/dual-lane-app.md) — مثال الخزنة، خطوة بخطوة، كلا المحفظتين
* [استدعِ EVM من Solana](/ar/adlh-almtw-ryn/call-evm-from-solana.md) — عناوين الرمز الاصطناعي، اكتشاف الحساب، نقاط النهاية الخارجية V1
* [نشر عقود Solidity](/ar/adlh-almtw-ryn/deploy-solidity.md) · [التحقق من العقود](/ar/adlh-almtw-ryn/verify-contracts.md) · [عناوين العقود](/ar/almrja/contract-addresses.md)


---

# 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/adlh-almtw-ryn/open-to-solana-users.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.
