تحتفظ التفويضات والاشتراكات بالـ rent الذي يعود عادةً إلى الدافع المسجّل عند
الإلغاء. إذا موّل راعٍ الحساب وقام المستخدم لاحقاً بإغلاق سلطة الاشتراك الخاصة
به أو استبدالها، يصبح الحساب معلقاً ويتعذّر استرداد الـ rent الخاص به. يتيح كلٌّ
من RevokeAbandonedDelegation وRevokeAbandonedSubscription للدافع المسجّل
استعادته.
متى يُطبَّق
لا يُسمح بذلك إلا عندما تكون سلطة الاشتراك للحساب منتهية بشكل قاطع — مغلقة، أو
مغلقة وأُعيد إنشاؤها (بحيث لم يعد init_id مطابقاً). لا يمكن إغلاق تفويض أو
اشتراك نشط بهذه الطريقة أبداً.
RevokeAbandonedDelegation | RevokeAbandonedSubscription | |
|---|---|---|
| يُغلق | PDA تفويض ثابت أو متكرر | PDA اشتراك |
| الموقّع | الدافع المسجّل | الدافع المسجّل |
| الحسابات | التفويض + السلطة المسجّلة | الاشتراك + السلطة المسجّلة + الخطة |
| يكون مؤهلاً عندما | السلطة مغلقة، أو أُعيد إنشاؤها (عدم تطابق init_id) | نفس الشرط، لعملة سك الخطة — يُقرأ عنوان السك من الخطة المرتبطة، لذلك لا يمكن استبدال سلطة غير ذات صلة لإجبار الإغلاق |
| استخدم الإلغاء العادي عوضاً عندما | التفويض منتهي الصلاحية أو مُستنفَد بالكامل | الاشتراك ملغى ومنتهي الصلاحية |
يُعدّ RevokeAbandonedDelegation أيضاً المسار الوحيد لاسترداد الدافع المسجّل
للـ rent من تفويض لا تنتهي صلاحيته أبداً (expiry_ts == 0) ولم يُستنفَد
بالكامل: إذ لا يُفعَّل الإلغاء العادي للدافع إلا عند انتهاء الصلاحية، أو عند
الإنفاق الكامل في حالة التفويض الثابت.
إلغاء تفويض مهجور
يقوم الدافع المسجّل بالتوقيع. مرّر PDA التفويض المنتهي وسلطة الاشتراك المسجّلة الخاصة به (والتي قد تكون مغلقة بالفعل). يعود الـ rent إلى الدافع.
import { getRevokeAbandonedDelegationInstruction } from '@solana/subscriptions';// Build the instruction and send it in a transaction like any other.const revokeAbandonedIx = getRevokeAbandonedDelegationInstruction({payer: payerSigner,delegationAccount: delegationPda,subscriptionAuthority: subscriptionAuthorityPda,});
إلغاء اشتراك متروك
يوقّع الدافع المسجَّل. مرِّر PDA الخاص بالاشتراك المتروك، وسلطة الاشتراك المسجَّلة (التي قد تكون مغلقة بالفعل)، والخطة التي ينتمي إليها الاشتراك. يعود rent إلى الدافع.
import { getRevokeAbandonedSubscriptionInstruction } from '@solana/subscriptions';// Build the instruction and send it in a transaction like any other.const revokeAbandonedIx = getRevokeAbandonedSubscriptionInstruction({payer: payerSigner,subscriptionAccount: subscriptionPda,subscriptionAuthority: subscriptionAuthorityPda,planPda,});
ملاحظات
- يوقّع الدافع المسجَّل، وليس المفوِّض أو المفوَّض إليه أو المشترك.
- يفشل كلا التعليمتين إذا كانت سلطة الاشتراك لا تزال نشطة للحساب — استخدم الإلغاء العادي بدلاً من ذلك.
RevokeAbandonedDelegationتعمل مع كلٍّ من التفويضات الثابتة والمتكررة.
Is this page helpful?