كيف يوجّه Didit التحويل
عندما يرسل عميل Didit تحويلاً، يحاول Didit هذه المسارات بالترتيب الصارم للأولوية، ويستخدم أول مسار يستطيع الوصول إليك:
يغطي الجدول أعلاه التحويلات التي يرسلها عميل Didit.
عندما ترسل تحويلاً إلى عميل Didit، لا يمكن لـ Didit قبوله إلا كـاستعلام تحويل من نوع
TRP، بعد أن يصبح مضيف TRP العام لـ Didit فعّالاً (وهو لا يستجيب بعد، انظر endpoints TRP)، أو، بعد التسوية، كـتسجيل Sunrise. حالياً، لا تُسلّم أي شبكة ولا أي قناة بريد إلكتروني تحويلاً وارداً إلى عميل Didit.
تعمل مسارات الشبكة (GTR وTRUST وVERIFYVASP وSYGNA) عبر عضوية على جانب المُرسِل.
وهذا يعني حالياً أن تكون العضوية المرتبطة هي عضوية عميل Didit الخاصة به؛ إذ لا تملك منصة Didit أي عضوية على أي من هذه الشبكات بعد، وهي بصدد التسجيل كمزوّد.
لا تكون GTR مشمولة افتراضياً، وينطبق شرط العضوية نفسه على الشبكات الأربع.
ينبغي للمُرسِل أن يتحقق من كائن networks في الحصول على إعدادات Travel Rule: تعني القيمة didit أن عضوية Didit تحمل التطبيق كمشارك خاص بها على الشبكة، وتعني own وجود عضوية مرتبطة للعميل، وتعني off أن التوجيه عبر المنصة معطّل، وتعني unavailable أنه لا يمكن لأي جهة الإرسال عبر تلك الشبكة لهذا التطبيق حتى الآن.
وإلى أن تملك Didit عضوية للمنصة، لا تُبلغ أي شبكة عن القيمة didit.
لا يؤدي تفعيل Travel Rule إلى تفعيل عضوية أي شبكة.
انظر شبكات Travel Rule لمعرفة ما تصل إليه كل شبكة اليوم.
إذا كنت على إحدى هذه الشبكات، وكان لدى عميل Didit عضوية خاصة به فيها، فشاركه معرّف الشبكة الخاص بك، وسيصلك التحويل عبر الشبكة التي تديرها أصلاً.
عبر SYGNA، يكمل ردك على الإذن التحويل أو يرفضه: يستعلم Didit عن حالة التحويل كل 5 دقائق، ويسجّل أيضاً https://trp.didit.me/sygna/callbacks/permission/{token}/ كرد استدعاء لكل طلب إذن، مع token يُنشأ لذلك التحويل.
هذا الـcallback موجود على مضيف TRP العام لدى Didit، الذي لا يستجيب للطلبات بعد.
تنقل القيمة ACCEPTED في permission_status تحويل المُرسِل إلى COMPLETED، وتنقله القيمة REJECTED إلى COUNTERPARTY_VASP_GENERAL_DECLINE، أو إلى COUNTERPARTY_MISMATCHED_DATA عندما تكون قيمة reject_code هي BVRC007 (اسم المستفيد لا يطابق).
يتطلب الرد الاستدعائي توقيعك: فهو يُرجع 401 مع {"status": "INVALID_SIGNATURE"} من دون توقيع صالح، و404 لـ token غير معروف، و200 مرة أخرى لقرار سبق تطبيقه.
عند عدم وجود أي عضوية مشتركة، يكون TRP هو المسار الذي ينبغي التخطيط له: شارك Travel Address الخاص بك مع عميل Didit، وستصل تحويلاته إلى endpoint TRP الخاصة بك. الرد الذي تعطيه في استجابة الاستعلام يكمل التحويل أو يرفضه فوراً؛ أما الرد الذي ترسله لاحقاً إلى عنوان الاستدعاء لدى Didit فيحتاج إلى مضيف TRP العام لدى Didit، وهو غير فعّال بعد.
عندما لا تتمكن أي من المسارات من التعرّف عليك، ينفذ Didit خطوة تحديد إضافية: إسناد تحليلات البلوكتشين.
يُحلّل عنوان المحفظة المستلِمة مقابل بيانات تحليلات البلوكتشين، وعندما تُسنَد إلى منصة التداول الخاصة بك أو خدمة الحفظ الخاصة بك، يسجّل Didit اسمك في دليل VASP الخاص به، ويعيد تجربة المسارات باستخدامه.
وهذا يعني أنه يمكن التعرّف عليك حتى عندما لا يقدّم المُرسِل سوى عنوان المحفظة.
لا تُوجَّه التحويلات المُسندة إليك تلقائياً إلا عندما يحمل إدخالك في الدليل مساراً: endpoint TRP موثّقة، أو إدراجاً في الشبكة، أو جهة اتصال للامتثال (انظر الدخول إلى دليل VASP في Didit).
إذن السلسلة الكاملة للتحديد هي: عميل Didit الذي أثبت سيطرته على المحفظة (INTERNAL) وعنوان Travel Address الذي خزّنه المُرسِل له، ثم مسارات البروتوكول والشبكة، ثم تحليلات البلوكتشين.
Travel Address
يملك كل VASP من Didit يكون Travel Rule مفعّلاً لديه Travel Address، وهي سلسلة قصيرة تبدأ بالحرفينta وتشفّر عنوان URL الخاص بنقطة نهاية استفسار النقل عبر TRP المخصصة له.
يقرأ عملاء Didit الـ Travel Address الخاص بهم من إعدادات Travel Rule ويشاركونه مع الأطراف المقابلة، وعندما يعطيك أحد عملاء Didit الـ Travel Address الخاص به، تكون لديك كل المعلومات اللازمة للوصول إليه عبر TRP.
يتبع الترميز اتفاقية Travel Address في TRP:
- احذف البادئة
ta. - فكّ ترميز Base58Check للجزء المتبقي (أبجدية Bitcoin، وقيمة تحقق محسوبة باستخدام double-SHA256).
- تمثّل البايتات المفكوكة عنوان URL الخاص بالاستفسار دون بادئة البروتوكول؛ أضف
https://في البداية. - يحمل عنوان URL دائماً زوج الاستعلام
t=i(النوع: استفسار).
{profile_uuid} ملف VASP المستضاف. أرسل استفساراتك للنقل باستخدام طريقة POST إلى عنوان URL هذا، واستعلم أولاً من endpoint الهوية المطابق للتحقق من هوية الطرف الذي تتواصل معه.
الشكل الثاني هو Travel Address لكل محفظة: يحدد محفظة واحدة من محافظ عميل Didit (receiving_travel_address في دفتر عناوينه)، فيصل استفسارك إلى تلك المحفظة دون الحاجة إلى مطابقتها برقم الحساب أو باسم صاحبه. ويعيد الرمز 404 بعد حذف المحفظة أو عندما تكون مسجلة لدى VASP آخر.
endpoints TRP
يتعامل Didit مع TRP بالإصدار3.2.1 على عنوان الأساس https://trp.didit.me.
تتبادل جميع endpoints بيانات JSON عبر HTTPS.
رأسا TRP مهمان:
api-version- إصدار بروتوكول TRP الذي تستخدمه، على سبيل المثال3.2.1. وهما مطلوبان في الاستفسارات وفي رابطَي الاستدعاء كليهما.request-identifier- معرّفك الفريد للطلب، ويُعاد في ترويسات الاستجابة. وهما مطلوبان في الاستفسارات وفي رابطَي الاستدعاء كليهما.
400.
تحمل كل استجابة من Didit الترويسة api-version: 3.2.1 وتعيد request-identifier الخاص بك.
GET /identity
يعيد هوية مشغّل المنصة. لا تُشترط أي ترويسات.GET /trp/identity//
يعيد هوية VASP الذي توشك على تبادل البيانات معه. استخدمها للتحقق من الاسم ورمز LEI قبل إرسال المعلومات الشخصية (PII). يُجري Didit الفحص نفسه بالاتجاه المعاكس عند بدء التبادل: إذا لم تطابق الهوية التي تعيدها نقطتك رمز LEI أو الاسم المتوقع، يُلغى التبادل.404 عندما لا يكون الملف موجوداً، أو عندما يكون إعداد Travel Rule الخاص به معطّلاً.
POST /trp/inquiries//
أرسل استفسار تحويل. أنت VASP المُرسِل، وعميل Didit هو VASP المستفيد.
تُحدَّد الأصول بواسطة DTI في هذا المسار، ويُحدِّد DTI الرمز على بلوكتشين واحد.
يربط Didit حالياً
BTC (4H95J0R2X) وETH (X9J9K872S) وUSDC عبر تسع شبكات، ويُضاف مزيد من الأصول مع الوقت.
راجع معرّفات أصول TRP للاطلاع على القائمة الكاملة.
يُقبل الاستفسار الذي لا يتعرف Didit على DTI الخاص به، ويُعرض على VASP المستفيد مع استخدام DTI رمزاً للأصل.
تعني الاستجابة 200 أن الاستفسار قُبل للمعالجة. وتعني 400 أن ترويسات TRP مفقودة أو أن المتن غير صالح. وتعني 404 أن الملف، أو المحفظة المرتبطة بـ Travel Address لكل محفظة، غير معروف أو معطّل. وتعني 422 أن الطلب يستخدم امتداداً لـ TRP، ولا يدعم Didit أياً منها، لذا تُرفض ترويسة api-extensions أو مفتاح extensions في المتن.
إعادة إرسال request-identifier نفسه لا تُحدث أثراً متكرراً؛ يُعاد استخدام الاستفسار الأصلي بدلاً من تكراره.
ثم ينشئ Didit التحويل الوارد في تطبيق العميل، ويحسمه بالرجوع إلى دفتر عناوين محافظ العميل وسياسته.
يطابق المستفيد عبر المحفظة التي يسميها Travel Address لكل محفظة، وإلا فعبر أول عنوان محفظة في IVMS101.beneficiary.accountNumber، أو عند غيابه، عبر اسم beneficiaryPersons[0].naturalPerson مقابل مدخلات المحافظ المُتحقَّق منها لدى العميل.
تحمل الاستجابة 200 الجواب عندما يستطيع Didit تقديمه فوراً:
{"approved": {"address": "...", "callback": "..."}}عندما يُقبل الاستفسار تلقائياً. لا يرسل Didit تلك الموافقة إلىcallbackالخاص بك أيضاً.{"rejected": "NOT_ENOUGH_COUNTERPARTY_DATA: inquiry carries no beneficiary identification"}عندما لا يذكر الاستفسار المستفيد ولا عنوان محفظة، لذا أدرِج الاثنين دائماً.{"version": "3.2.1"}عندما ينتظر القرار عميل Didit. تصل نتيجة الحسم لاحقاً كطلب POST إلى عنوانcallbackالخاص بك، بأحد المتنين التاليين.
originatingVASP هو ما يراه عميل Didit بوصفه VASP المُرسِل للتحويل.
لا يحدد Didit مهلة للاستفسار الذي ترسله، ولا يرسل إليك عميل Didit الذي يلغيه أي رفض، لذا طبّق مهلة انتظار خاصة بك.
بعد أن تستلم الموافقة وتبث التحويل على السلسلة، أنهِ التبادل بإرسال طلب POST إلى رابط الاستدعاء approved.callback الذي زُوِّدت به:
{ "canceled": "reason" } إلى رابط الاستدعاء نفسه إذا ألغيت التحويل.
ينقل txid التحويل لدى جهة المستفيد إلى الحالة FINISHED، وينقله canceled إلى الحالة CANCELLED.
يُجيب الاستدعاءان بـ204 بعد معالجتهما، و404 لرمز غير معروف أو لتحويل لم يعد ينتظر هذا الاستدعاء، و400 لمتن لا يحمل أيّاً من الحقلين الخاصين بالاستدعاء.
حل الاستفسارات التي يرسلها Didit إليك
عندما يُنشئ عميل Didit تحويلًا إليك عبر TRP، يقوم Didit بما يلي:- يجلب
/identityمن جذر مضيف عنوان URL الاستفسار الخاص بك (https://{your-host}/identity)، ويتحقق من الاسم والرمز LEI المُبلَّغ عنهما مقارنةً بما يتوقعه العميل. عندما يأتي المسار من دليل Didit، يجب أن يُبلّغ/identityالخاص بك عن الرمز LEI الوارد في إدخال الدليل ذاك. - يُرسل Didit طلب POST بالاستفسار عن التحويل إلى عنوان URL الاستفسار الخاص بك، بالبنية نفسها المذكورة أعلاه:
asset.dti، وamountبوحدة الأساس كرقم JSON، وcallback، وحمولةIVMS101.
2xx. يُعدّ الرد 3xx مرفوضًا، لأن عمليات إعادة التوجيه لا تُتبَع، وأي رد آخر يُسجَّل في الجدول الزمني لتحويل العميل مع رمز الحالة الذي أعدته، مثلًا refused by counterparty (HTTP 403): ....
يحمل الاستدعاءان رأسَي TRP، ولا يتبع Didit عمليات إعادة التوجيه في HTTP عليهما، لذا قدّم /identity وعنوان URL الاستفسار مباشرةً.
إذا تعذّر الوصول إلى /identity، أو لم يُبلّغ عن أي رمز LEI، أو أبلغ عن رمز مختلف عندما زوّده العميل، أو أبلغ عن اسم غير متطابق، يتوقف Didit قبل إرسال الاستفسار، وينتقل تحويل العميل إلى COUNTERPARTY_VASP_NOT_REACHABLE.
وإذا فشل طلب POST الخاص بالاستفسار بعد ذلك، أو ردّت نقطة النهاية لديك عليه برمز 4xx أو 5xx، ينتقل التحويل أيضًا إلى COUNTERPARTY_VASP_NOT_REACHABLE.
يشير callback في ذلك الاستفسار إلى نقطة نهاية الحل الخاصة بـ Didit (/trp/callbacks/resolution/{token}/).
ردّ بإرسال طلب POST يحمل أجسام الحل نفسها التي يستخدمها Didit: { "approved": { "address": "...", "callback": "..." } } للموافقة (يكون callback الخاص بك هو المكان الذي سينشر فيه Didit التأكيد على السلسلة)، أو { "rejected": "reason" } للرفض.
أرسل رأسَي TRP مع هذا الطلب.
يرد Didit بالرمز 204 بعد المعالجة، وبالرمز 404 إذا لم يعد التحويل ينتظر حلًا، وبالرمز 400 عند الموافقة دون address، أو عندما لا يكون callback عنوان URL عامًا من نوع http(s) يستطيع Didit استدعاءه.
عند الموافقة ينتقل جانب Didit إلى COMPLETED؛ وبعد أن يُبلّغ العميل عن الهاش على السلسلة، يُرسل Didit طلب POST بالجسم { "txid": "..." } إلى رابط التأكيد الذي زوّدته (أو { "canceled": "reason" } إذا أُلغي التحويل أولًا).
رموز token الخاصة بالاستدعاء تُستخدم لغرض واحد، وهي أسرار لا يمكن تخمينها تُنشأ لكل تحويل على حدة. عامِل روابط الاستدعاء الكاملة كمعلومات سرية، ولاحظ أن الحل لا يُقبل إلا طالما ما زال التحويل ينتظره.
الاستلام عبر البريد الإلكتروني
إذا لم تصل أي قناة بروتوكول إليك، وزوّد عميل Didit بريد الامتثال الخاص بك، يلجأ Didit إلى البريد الإلكتروني: تتلقى جهة اتصال الامتثال لديك رسالة تسمّي VASP المُرسِل، مع رابط استلام آمن لمرة واحدة. لا يلزم أي حساب أو مفتاح API أو تكامل، فـ token الموجود في الرابط هو المصادقة. يعرض فتح الرابط التبادل المعلّق. أما واجهة API الأساسية، التي تستدعيها الصفحة المستضافة نيابةً عنك، فهي عامة:amount هو الكسر العشري المخزَّن كما هو، لذلك يحمل المنازل العشرية الـ18 كاملةً.
decision هي accept أو decline. عند القبول، زوّد اسم المستفيد كما هو مسجّل لديك، ليتمكن جانب المُرسِل من إجراء مطابقة الاسم، أو أرسل ردّ IVMS 101 الكامل بوصفه ivms_response، فيكون اسم المستفيد الوارد فيه هو المعتمد حينئذٍ.
عند الرفض، يمكنك ذكر decline_reason (القيم: data_mismatch، وnot_our_customer، وwallet_not_hosted، وsanctions، وrisk_appetite، وjurisdiction، وinsufficient_data، أو other)، وdecline_detail بطول يصل إلى 512 حرفًا، وهو مطلوب مع other.
يُسجَّل القبول بدون beneficiary_name على أنه عدم تطابق إذا زوّد المُرسِل اسم مستفيد، إلا إذا كان المُرسِل قد أوقف مطابقة الأسماء.
الاستجابة هي {"status": "..."} الناتج: COMPLETED عند تطابق الأسماء، أو COUNTERPARTY_MISMATCHED_DATA عند عدم التطابق، أو COUNTERPARTY_VASP_GENERAL_DECLINE بعد الرفض.
يمكنك الرد مرة واحدة فقط، طالما أن التحويل ينتظرك: فبعد ردّك، أو بعد إلغاء التحويل، أو بعد موعد تأكيده النهائي، تُرجع كلتا نقطتي النهاية الرمز 410، وtoken غير المعروف يُرجع 404.
يعرض الطلب حقول المُرسِل التي يشاركها، وحقل ivms_request بصيغة IVMS 101 وبلغة ولايتك القضائية، ويُذكَّر بالموعد النهائي قبل 72 و24 و6 ساعات طالما لم تردّ.
Sunrise: التحويلات التي تمت تسويتها قبل التبادل
عندما يصل تحويل إلى محفظة عميل Didit قبل أي تبادل لـ Travel Rule، لعدم وجود قناة مشتركة آنذاك، يمكن تسليم البيانات بعد التسوية أيضًا. أرسل حمولة Travel Rule عبر قناتك المعتادة إلى عميل Didit (وهو الطرف المقابل المستفيد لديك)، واطلب منه تسجيلها: يستدعيPOST /v3/travel-rule/inbound/ مع سلسلة الإيداع وtxid وعنوان المحفظة والمبلغ والعملة وبيانات المُرسِل لديك.
أدرج هوية VASP الخاصة بك، أي الاسم ورمز LEI وTravel Address، ضمن originating_vasp في تلك الحمولة، حتى يسجّل تحويل عميل Didit مَن أرسل الإيداع.
يبقى ذلك على ذلك التحويل وحده، ولا ينشئ إدخال الدليل الخاص بك ولا يغيّره أبدًا.
يجب أن يكون رمز LEI صالحًا ومكوّنًا من 20 حرفًا، وأن يكون Travel Address صالحًا، وإلا رُفض التسجيل.
الإدراج في دليل VASP الخاص بـ Didit
تحتفظ Didit بدليل VASP يعتمد عليه التوجيه الصادر لعملاء Didit. تأتي الإدخالات من المصادر التالية:- سجل ESMA المؤقت لمزودي خدمات الأصول المشفرة بموجب MiCA، ويُقرأ أسبوعياً: اسمك وLEI الخاص بك ودولة العضوية الأصلية، إن كنت مدرجاً فيه.
- دليل TRISA العام، ويُقرأ أسبوعياً: هويتك وبلدك وإدراجك في TRISA.
- سجل LEI العالمي، الذي يملأ LEI الخاص بك وأسماءك القانونية الأخرى والدولة.
- إسناد تحليلات البلوكتشين، عندما يُربط عنوان محفظة وجهة بمنصتك أو خدمة الحفظ الخاصة بك: تضيف Didit إدخالك أو تطابقه، وتحتفظ بالاسم المسنَد بوصفه اسماً مستعاراً.
- موظفو Didit، الذين يديرون الإدخالات أو يحرّرونها بعناية: معرّفات التوجيه وإدراجات الشبكة التي تحققوا منها، وجهات اتصال الامتثال، والأسماء المستعارة، والعلامات التجارية مع كياناتها.
originating_vasp في تسجيل Sunrise أو Travel Address في تحويل، يبقى في تحويل ذلك العميل ولا يغيّر إدخالك أبداً.
كذلك لا تنشئ استفسارات التحويل التي ترسلها إلى عميل Didit إدخالك ولا تحدّثه.
يوجّه إدخالك التحويل إليك عندما يحمل endpoint TRP موثّق، أو إدراجاً في شبكة يستطيع المرسل استخدامه، أو جهة اتصال للامتثال لاستخدامها عند الرجوع إلى البريد الإلكتروني.
يصبح عنوان امتثال على أحد نطاقاتك الخاصة، إذا ردّ على طلب عبر رابط الرد الخاص به، جهة اتصال يمكن لكل عميل في Didit استخدامها.
إلى أن يحمل إدخالك مساراً، لا يصل إليك عميل Didit إلا عبر الحقول التي يمرّرها مع كل تحويل: Travel Address الخاص بك، أو معرّف الشبكة الخاص بك (counterparty_gtr_vasp_code أو counterparty_trust_membership_id أو counterparty_verifyvasp_id أو counterparty_sygna_vasp_code)، أو بريد الامتثال الإلكتروني الخاص بك (counterparty_vasp_email).
لكي تكون قابلاً للوصول اليوم، شارك Travel Address أو معرّف الشبكة أو بريد الامتثال الإلكتروني مع عملاء Didit الذين تعمل معهم.
قائمة التحقق لـ VASP الأطراف المقابلة
- أنت تطبّق TRP بالفعل: شارك Travel Address ورمز LEI الخاص بك مع عميل Didit؛ تصل تحويلات
BTCوETHوUSDCالخاصة به على شكل استفسارات TRP قياسية إلى endpoint الخاص بك. أجب في ردّ الاستفسار الخاص بك. أما الرد اللاحق فيتطلب مضيف TRP العام التابع لـ Didit، وهو غير متاح بعد. - أنت على GTR أو TRUST أو VerifyVASP: شارك معرّف شبكتك؛ تصل التحويلات عبر تلك الشبكة عندما يملك عميل Didit عضويته الخاصة فيها. تقرأ Didit ردّك على GTR أو VerifyVASP من الشبكة، لكنها لا تقرأ ردّ TRUST، لذلك انشر أيضاً endpoint TRP عندما يجب أن يُختتم التبادل عبر TRUST. يوضح شبكات Travel Rule متى يتغير ذلك.
- أنت على Sygna Bridge: شارك رمز Sygna VASP الخاص بك؛ عندما يملك عميل Didit عضويته الخاصة في Sygna، يُكمل ردّ الإذن الخاص بك التحويل أو يرفضه بمجرد أن تقرأه Didit بالاستطلاع الدوري.
- ليست لديك قناة بروتوكول بعد: أعطِ عميل Didit بريد امتثال تتم مراقبته. ستتلقى روابط الاستلام ويمكنك الرد من الصفحة المستضافة دون أي تكامل.
- تحويل تمّت تسويته بالفعل: سلّم البيانات عبر تسجيل Sunrise من خلال عميل Didit.
- تريد أيضاً الإرسال إلى مزودي VASP في Didit: اطلب من طرفك المقابل Travel Address الخاص به من إعدادات Travel Rule في Didit، ثم اتبع POST /trp/inquiries عندما يصبح مضيف TRP العام التابع لـ Didit متاحاً.
الخطوات التالية
Travel Rule
المنتج الموجَّه للعملاء: دورة الحياة والإعدادات والمسارات وواجهة /v3/ البرمجية.
أداة إثبات ملكية المحفظة
كيف تُجمع إثباتات الملكية من جهة المستفيد عندما تكون محفظة ذاتية الاستضافة.
تسجيل Sunrise
تسجيل بيانات Travel Rule للإيداعات التي تمت تسويتها بالفعل على السلسلة.
webhook
كيف يرصد عملاء Didit كل تغيّر في حالة التبادل من جانبهم.