# تكامل الرموز

تربط Rome EVM بين رموز ERC-20 ورموز SPL عبر نموذج الحالة الواحدة. تشرح هذه الصفحة كيفية عمل الرموز عبر EVM وسولانا.

## نموذج الحالة الواحدة

على خلاف الجسور التقليدية، لا تقوم Rome بقفل الرموز على سلسلة واحدة وسك نسخ مغلفة على أخرى. وبدلاً من ذلك، فإن رموز ERC-20 على Rome EVM هي **أغلفة شفافة** فوق حسابات رموز SPL الأساسية على سولانا.

```
┌──────────────────────────────────┐
│ Rome EVM                         │
│                                  │
│   ERC-20 "rUSDC"                 │
│   ┌────────────────────────┐     │
│   │ balanceOf(user)        │─────┼──► يقرأ مباشرةً من SPL ATA
│   │ transfer(to, amount)   │─────┼──► ينفذ تحويل SPL عبر precompile
│   │ totalSupply()          │─────┼──► يقرأ عرض سكّ SPL
│   └────────────────────────┘     │
│                                  │
└──────────────────────────────────┘
                 │
                 │ نفس البيانات الأساسية
                 ↓
┌──────────────────────────────────┐
│ Solana                           │
│                                  │
│   حساب رمز SPL (ATA)             │
│   المالك: PDA الخاص بالمستخدم    │
│   السك: USDC (العملة الأصلية لـ Circle)     │
│   المبلغ: 1000000 (= 1 USDC)    │
│                                  │
└──────────────────────────────────┘
```

**ما الذي يعنيه هذا:**

* لا يوجد تأخير في الجسر — رصيد ERC-20 هو نفسه رصيد SPL
* لا يوجد تجزؤ في السيولة — ترى DeFi على الجانبين الرموز نفسها
* لا توجد مخاطرة جسر — لا يوجد حساب وصاية منفصل يمكن استغلاله

## ERC20SPL: عقد الغلاف

`SPL_ERC20` هو عقد الغلاف القياسي الذي يوفّر واجهة ERC-20 كاملة فوق سكّ رمز SPL:

```solidity
import {SPL_ERC20} from "@rome-protocol/solidity-sdk/contracts/token/ERC20SPL.sol";

// يقرأ الغلاف الأرصدة من ATA الخاص بالمستخدم على SPL
uint256 balance = wrapper.balanceOf(userAddress);

// تُنفَّذ التحويلات عبر precompile الخاص بـ SPL Token
wrapper.transfer(recipient, amount);
```

**كيف يعمل ذلك في الخلفية:**

* `balanceOf()` → يستنتج ATA الخاص بالمستخدم (حساب الرمز المرتبط) → يقرأ الرصيد من سولانا
* `transfer()` → يستدعي precompile الخاص بـ SPL Token (`0xff...05`) → ينقل الرموز على سولانا
* `approve()` / `allowance()` → يستخدم تخزين EVM (نمط ERC-20 القياسي) لأن SPL لا يدعم أصلاً بدلات بأسلوب EVM
* `totalSupply()` → يقرأ من حساب سكّ SPL

## ERC20SPLFactory

يقوم عقد المصنع بنشر أغلفة لأي رمز SPL:

```solidity
import {ERC20SPLFactory} from "@rome-protocol/solidity-sdk/contracts/token/ERC20SPLFactory.sol";

ERC20SPLFactory factory = ERC20SPLFactory(0xfd21da046c282e1d36cc45e46d9599cff5742f2b);

// نشر غلاف لسكّ SPL (يحمّل الاسم/الرمز من بيانات Metaplex الوصفية)
address wrapper = factory.add_spl_token_with_metadata(splMintPubkey);

// أو حدّد الاسم/الرمز يدويًا
address wrapper = factory.add_spl_token_no_metadata(splMintPubkey, "USD Coin", "USDC");
```

**عنوان المصنع (devnet):** `0xfd21da046c282e1d36cc45e46d9599cff5742f2b`

## سجل الرموز

يقدّم `TokenRegistry` تسجيلًا مُدارًا من قبل المسؤول للرموز SPL المعتمدة مع بيانات وصفية عبر السلاسل:

```solidity
import {TokenRegistry, TokenOrigin} from "@rome-protocol/solidity-sdk/contracts/token/TokenRegistry.sol";

// تسجيل رمز SPL أصلي
registry.registerToken(
    splMint,
    TokenOrigin.NativeSPL,
    bytes32(0),   // لا يوجد عنوان خارجي
    0             // لا توجد سلسلة خارجية
);

// تسجيل رمز مغلف بواسطة Wormhole مع بيانات وصفية عبر السلاسل
registry.registerToken(
    wormholeMint,
    TokenOrigin.WormholeWrapped,
    externalTokenAddress,  // الرمز الأصلي على سلسلة المصدر
    2                       // معرّف سلسلة Wormhole لإيثريوم
);
```

يضمن السجل أن كل أصل يُطابِق سكّ SPL واحدًا وحيدًا ومعتمدًا — مما يمنع تعدد تمثيلات USDC من تجزئة السيولة.

## تدفق الإيداع / السحب

### الإيداع من SPL إلى EVM

1. يقوم المستخدم بتحويل رموز SPL إلى خزنة الجسر
2. ينشئ الجسر ATA الخاص بالمستخدم على Rome EVM (إن لم يكن موجودًا)
3. يصبح غلاف ERC-20 نشطًا — يرى المستخدم الرصيد في MetaMask

### السحب من EVM إلى SPL

1. يستدعي المستخدم precompile الخاص بالسحب (`0x42...16`) على Rome EVM
2. ينفّذ الـ precompile تحويل SPL من PDA الخاص بالمستخدم عائدًا إلى محفظته على سولانا
3. تظهر رموز SPL في محفظة المستخدم على سولانا

## اشتقاق PDA

كل عنوان EVM يُطابِق PDA على سولانا يملك حسابات الرموز الخاصة به:

```solidity
import {RomeEVMAccount} from "@rome-protocol/solidity-sdk/contracts/core/RomeEVMAccount.sol";

// احصل على PDA الخاص بسولانا لعنوان EVM
bytes32 userPda = RomeEVMAccount.pda(msg.sender);

// احصل على ATA الخاص بالمستخدم لسكّ محدد
bytes32 ata = AssociatedSplToken.create_associated_token_account(userPda, mintPubkey);
```

## الأنماط الرئيسية

### قراءة أرصدة SPL من Solidity

```solidity
// قراءة الحالة الخام لحساب رمز SPL
ISplToken.Account memory account = SplToken.account_state(tokenAccountPubkey);
uint64 balance = account.amount;
uint8 decimals = SplToken.decimals_eq(mintPubkey, 9); // التحقق من الخانات العشرية
```

### تحويل الرموز عبر SPL Precompile

```solidity
// تحويل SPL مباشر (مستوى أدنى من غلاف ERC-20)
SplToken.transfer(recipientAta, mintPubkey, amount);
```

## رمز الغاز

تملك كل سلسلة Rome EVM رمز غاز خاصًا بها — أي رمز SPL يتم اختياره عند تسجيل السلسلة:

* **RSOL** — رمز الغاز الافتراضي (SOL مغلف)
* الرموز المخصصة — أي رمز SPL، يتم تسعيره عبر مجمع Meteora DAMM V1

رموز الغاز هي تمثيلات ERC-20 لرموز SPL. لا يتم تشغيل Transfer Hooks في دفعات الغاز الداخلية على EVM.

## القيود

* كميات رموز SPL هي `uint64` — القيمة القصوى 18,446,744,073,709,551,615
* الخانات العشرية الافتراضية لسكوك SPL الجديدة: 9
* يجب أن تكون رموز غلاف ERC-20 فريدة عالميًا لكل مصنع
* تستخدم البدلات تخزين EVM (وليس مفوضي سولانا)

## ما التالي

* [Transfer Hooks](/ar/almfahym-alasasyh/transfer-hooks.md) — منطق EVM في transfer hooks الخاصة بـ Token-2022
* [دليل تغليف الرموز](https://github.com/rome-protocol/docs/blob/main/developer-guides/token-wrapping.md) — انشر غلاف ERC-20 الخاص بك
* [عناوين العقود](/ar/almrja/contract-addresses.md) — عناوين المصانع المنشورة


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.rome.builders/ar/almfahym-alasasyh/token-interop.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
