> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# دليل اختبار Travel Rule في البيئة التجريبية

> اختبر كل نتائج Travel Rule في البيئة التجريبية مع Didit Test VASP: القبول والرفض وعدم تطابق الاسم والمهلة والمحافظ ذاتية الاستضافة.

يتبادل تطبيقٌ في البيئة التجريبية بيانات Travel Rule مع طرف مقابل واحد فقط، هو **Didit Test VASP**، وهو VASP اختباري مدمج في المنصة. يردّ على كل تحويل بالطريقة التي تطلبها، عبر الشيفرة نفسها التي تتعامل مع طرف مقابل حقيقي، فيمكنك متابعة كل حالة وكل إدخال في الجدول الزمني وكل webhook في عملية التبادل قبل الإطلاق الفعلي.

لا يغادر Didit أي شيء ترسله في البيئة التجريبية. لا يُتصل بأي شبكة أو مستلم بريد إلكتروني أو أي عميل آخر لدى Didit، ولا يُفرض أي رسوم.

## قبل أن تبدأ

1. استخدم مفتاح API لتطبيق **البيئة التجريبية**. لا تصل تطبيقات الإنتاج إلى VASP الاختباري أبدًا.
2. فعّل Travel Rule باستخدام اسم قانوني:

```bash theme={null}
curl -X PUT https://verification.didit.me/v3/travel-rule/settings/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"is_enabled": true, "legal_name": "Example CASP Sandbox"}'
```

3. يمكنك اختياريًا الاشتراك في وجهة webhook للحدث `travel_rule.status.updated`. ترسل البيئة التجريبية هذا الحدث موسومًا بـ `"environment": "sandbox"`.

## Didit Test VASP

يعيد `GET /v1/sandbox/scenarios/` ملف تعريف VASP الاختباري وكل السيناريوهات في كائن `travel_rule` الخاص به، فيمكن لاختباراتك قراءة قيم المُشغِّلات بدلًا من ترميزها يدويًا:

| الحقل | القيمة |
| - | - |
| `legal_name` | `Didit Test VASP` |
| `lei` | `DIDITESTVASP00000001`، بتنسيق صحيح لكنه غير مسجّل |
| `jurisdiction` | `GB` |
| `compliance_email` | عنوان ضمن النطاق `didit.test`، ولا يُرسل إليه بريد أبدًا |
| `travel_address` | عنوان Travel Address ضمن مضيف بالنطاق `.test`، ولا يمكن الوصول إليه أبدًا |
| `network_codes` | رموز اختبار لا يُتصل بها أبدًا |
| `default_scenario` | `accept` |
| `inbound_scenarios` | `["accept", "name_mismatch"]` |

كل قيمة هنا بيانات اختبار. VASP الاختباري ليس عضوًا في أي شبكة Travel Rule، ولا تُظهر أي نتيجة في البيئة التجريبية أن طرفًا مقابلًا حقيقيًا أو شبكة حقيقية يمكن الوصول إليهما.

## سيناريوهات التحويلات الصادرة

كل معاملة `travelRule` صادرة من تطبيق في البيئة التجريبية تحتاج إلى تبادل تُرسل إلى VASP الاختباري. اختر النتيجة بعنوان محفظة المستفيد (دون مراعاة حالة الأحرف)، أو باسم مستفيد بالصيغة `Didit Test VASP <suffix>`. تكون المحفظة هي الأولوية إذا ضُبط الاثنان معًا. وإذا لم يُضبط أيٌّ منهما، أو كانت اللاحقة غير مدرجة في الجدول، يكتمل التحويل (`accept`).

لا تصل التحويلات التي لا تحتاج إلى تبادل إلى VASP الاختباري أبدًا: التحويل الأقل من `threshold_amount` لديك، والتحويل إلى المحفظة المُتحقَّق منها لمستخدمك، والتحويل إلى محفظة طرف مقابل أعلنتَ أنها ذاتية الاستضافة. أما VASP الطرف المقابل الذي تختاره أنت أو مستخدمك النهائي يدويًا من الدليل، فيُحكم عليه بالمسارات نفسها التي يعتمدها التطبيق الحي: إذا كان له مسار واحد على الأقل (نقطة endpoint مُتحقَّق منها لـ `TRP`، أو شبكة يرسل تطبيقك عليها، أو جهة اتصال للامتثال)، يُوجَّه التحويل إلى VASP الاختباري. وإذا لم يكن له أي مسار، ينتهي التحويل بالحالة `COUNTERPARTY_VASP_NOT_FOUND`، كما يحدث في التطبيق الحي.

| السيناريو | لاحقة الاسم | المحفظة (ETH) | ينتهي عند |
| - | - | - | - |
| `accept` | لا شيء | `0xc00c4cd93ff83953ce3347b33656d68ab8f35cfb` | `COMPLETED`، ثم `FINISHED` بعد أن تُبلغ عن `payment_txn_id` |
| `decline` | `Decline` | `0x7694c5b0213859ef409107853a36ff7c85835f18` | `COUNTERPARTY_VASP_GENERAL_DECLINE` |
| `name_mismatch` | `Name Mismatch` | `0x501b7a0886e31f516aaf54fa99107d2377bd2d3e` | `COUNTERPARTY_MISMATCHED_DATA`، عند قاعدة الاسم لديك (مع `NONE` يكتمل التحويل) |
| `not_reachable` | `Not Reachable` | `0xf0e986c1a1c3ae41629bf5cdcee0a67dd1eb0cce` | `COUNTERPARTY_VASP_NOT_REACHABLE` بعد جدول إعادة المحاولة الفعلي (30 ثانية، ثم 2 و10 و30 و60 دقيقة، أي نحو ساعة و45 دقيقة في المجموع)، ثم تصبح قابلة لإعادة الإرسال |
| `timeout` | `Timeout` | `0xb63a1b1d4bee82d109332187cbf5b657eb7da498` | `EXPIRED` عند أول فحص متأخر بعد انتهاء مهلته البالغة دقيقة واحدة، أي خلال نحو 15 دقيقة. ثم يُطبَّق `timeout_outcome` لديك |
| `self_hosted` | `Self Hosted` | `0x33dcc2a7e69cf965f7f4eaf6ba657bcb078a2b65` | `UNCONFIRMED_OWNERSHIP`، ثم `COMPLETED` بعد تسجيل إثبات ملكية المحفظة |

```bash theme={null}
curl -X POST https://verification.didit.me/v3/transactions/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transaction_id": "sbx-tr-accept-001",
    "transaction_category": "travelRule",
    "transaction_details": {
      "direction": "outbound",
      "action_type": "transfer",
      "amount": "0.25",
      "currency": "ETH",
      "currency_kind": "crypto"
    },
    "subject": { "entity_type": "individual", "vendor_data": "user-042", "full_name": "Jane Doe" },
    "travel_rule_details": {
      "status": "AWAITING_COUNTERPARTY",
      "beneficiary_data": {
        "wallet_address": "0xc00c4cd93ff83953ce3347b33656d68ab8f35cfb",
        "name": "Carlos Ruiz"
      }
    }
  }'
```

يكون `rail` للتحويل هو `TEST_VASP`، وتسمّي قائمة التحويلات `Didit Test VASP` بوصفه VASP المستفيد. تابع التحويل في webhooks للحدث `travel_rule.status.updated`، أو اقرأه من `GET /v3/transactions/{transaction_id}/`.

* **`name_mismatch`** يقارن الاسم الذي أرسلته للمستفيد باسم صاحب الحساب الذي يردّ به VASP الاختباري، وفق قاعدة الاسم لديك لنوع كيان المستفيد (`matching_rules.individual.name` أو `matching_rules.company.name`، وتتبع هذه القواعد `name_matching_strictness` إلى أن تضبطها). يحمل التحويل، وإدخال الجدول الزمني الذي حسم الأمر، القيمة `name_match` (مع `compared_with: "counterparty_vasp"`) والقيمة `data_match` مع `mismatched_fields: ["name"]`.
* **`not_reachable`** يُبقي التحويل في `AWAITING_COUNTERPARTY` أثناء إعادة المحاولة، مع `delivery.status` بالقيمة `RETRYING` و`last_error` بالقيمة `test VASP is not answering`، ثم يجعله `COUNTERPARTY_VASP_NOT_REACHABLE`. أرسل `{"action": "resend"}` بعد ذلك لتشغيله من جديد.
* **`self_hosted`** يجعل VASP الاختباري يُجيب بأن المحفظة ذاتية الاستضافة. سجّل الإثبات باستخدام [أداة ملكية المحفظة](https://docs.didit.me/ar/transaction-monitoring/wallet-ownership-widget.md)، التي تُنشأ لك تلقائيًا حين يكون `auto_wallet_verification` مفعّلًا، أو عبر [`POST .../travel-rule/ownership/`](https://docs.didit.me/ar/management-api/travel-rule/confirm-ownership) مع `{"confirmed": true}`. عندها تُضاف المحفظة إلى دفتر العناوين لديك باسم المستفيد، ويحسم تطابق الاسم التحويل: يكتمل التحويل عند التطابق وتُعلَّم المحفظة موثّقة. أما `{"confirmed": false}` فيرفض التحويل.

## التحويلات الواردة من الـ VASP التجريبي

لاختبار جانب الاستقبال، اطلب من الـ VASP التجريبي إرسال تحويل إليك باستخدام `POST /v3/travel-rule/test-vasp/inbound/`. حدّد إحدى محافظ [دفتر العناوين](https://docs.didit.me/ar/transaction-monitoring/travel-rule.md#دفتر-عناوين-المحافظ) الخاصة بتطبيقك. يُبتّ في التحويل عبر المسار الوارد نفسه الذي يُستخدم مع التحويل الحقيقي، وذلك وفق دفتر العناوين لديك ووضع الملكية وقواعد الأسماء.

```bash theme={null}
curl -X POST https://verification.didit.me/v3/travel-rule/test-vasp/inbound/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "beneficiary_wallet_address": "0xYourDepositWallet",
    "scenario": "accept",
    "reference": "sbx-inbound-001"
  }'
```

| الحقل | الوصف |
| - | - |
| `beneficiary_wallet_address` | مطلوب، بحد أقصى 128 حرفًا. استخدم إحدى محافظ دفتر العناوين الخاصة بك. أي محفظة أخرى تُسجَّل بحالة `ON_HOLD`. |
| `scenario` | `accept` (الافتراضي): يذكر الـ VASP التجريبي صاحب المحفظة نفسه. `name_mismatch`: يذكر شخصًا لا يوافق عليه أي صاحب محفظة. |
| `chain`, `amount`, `currency` | اختيارية. القيم الافتراضية `ETH` و`1` و`ETH`. |
| `reference` | اختياري، بحد أقصى 128 حرفًا. إرسال `reference` نفسه مرة أخرى يعيد الإجابة الأولى (`201`) ولا يسجّل أي شيء جديد. |

تتضمن استجابة `201` الحقول `transaction_id` و`txn_id` و`scenario` و`travel_rule_status` و`detail` و`test_vasp: true`، إلى جانب تحويل `travel_rule`. يحصل التطبيق الحي على `400` (`"The Didit Test VASP is only available on sandbox applications."`)، وأي قيمة أخرى لـ `scenario` تعيد `400`، والتطبيق الذي يكون فيه Travel Rule معطّلًا يعيد `409`.

| سجل محفظتك | `accept` | `name_mismatch` |
| - | - | - |
| لا توجد محفظة على تلك الشبكة | `ON_HOLD` | `ON_HOLD` |
| لم تثبت الملكية وفق [وضع الملكية](https://docs.didit.me/ar/transaction-monitoring/travel-rule.md#أوضاع-التحقق-من-الملكية) الخاص بك | `UNCONFIRMED_OWNERSHIP` | `UNCONFIRMED_OWNERSHIP` |
| موثّقة | تصبح `COMPLETED` ما دام `inbound_auto_accept` مفعّلًا، وإلا فإنها `ON_HOLD` | `COUNTERPARTY_MISMATCHED_DATA` (عند قاعدة الأسماء `NONE`، كما في `accept`) |

ابتّ في التحويل المعلّق عبر [`POST .../travel-rule/ownership/`](https://docs.didit.me/ar/management-api/travel-rule/confirm-ownership) كما تفعل مع التحويل الحقيقي: يُكمل `{"confirmed": true}` التحويل، ويرفضه `{"confirmed": false}`.

الإيداع الذي تبلّغ عنه بنفسك عبر `POST /v3/transactions/` ليس تحويلًا أرسله الـ VASP التجريبي. يبقى بحالة `AWAITING_COUNTERPARTY` في انتظار الـ VASP المصدر، ويذكر سجلّه الزمني نقطة النهاية المذكورة أعلاه. لا يُطلق أي webhook حتى تنتهي صلاحيته بعد `confirmation_timeout_hours`. ولا يزال [`POST /v3/travel-rule/inbound/`](https://docs.didit.me/ar/management-api/travel-rule/register-inbound) يسوّي تسجيل ما بعد الإيداع مقابل دفتر العناوين لديك، كما في التطبيق الحي.

## webhook في البيئة التجريبية

يُطلق `travel_rule.status.updated` للتطبيقات التجريبية عند كل تغيير في الحالة، مع `"environment": "sandbox"`. ويحمل التحويل الذي ردّ عليه الـ VASP التجريبي أيضًا `rail: "TEST_VASP"` و`test_vasp: true` و`test_vasp_scenario`. أما بقية البيئة التجريبية فتسلك كما هو موضح في [مراقبة المعاملات في البيئة التجريبية](https://docs.didit.me/ar/integration/sandbox-testing.md#مراقبة-المعاملات-في-البيئة-التجريبية): لا تُقيَّم القواعد، ولا يُرسَل `transaction.created` ولا `transaction.status.updated`، ولا تتم فوترة أي شيء.

## ما لا تثبته البيئة التجريبية

* لا تثبت أن أي جهة مقابلة حقيقية، أو عضوية شبكة، أو مضيف TRP العام التابع لـ Didit يعمل. لا يُتصل بأي منها.
* لا تثبت أن بيانات اعتماد الشبكة لديك صالحة. تُثبت العضوية المتصلة بأول تبادل حي لها.
* مسارات [الدليل](https://docs.didit.me/ar/transaction-monitoring/travel-rule.md#الدليل) لدى الـ VASPs الحقيقية: في التطبيق التجريبي تظهر كل مسارات الدليل بحالة `unavailable` مع `reason: sandbox_application`، ويظهر كل صف بقيمة `reachable: false`.

راجع [شبكات Travel Rule](https://docs.didit.me/ar/transaction-monitoring/travel-rule-networks.md) لمعرفة ما تصل إليه كل قناة في الإنتاج اليوم.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.