التراجع عن صفقة

أربع تعليمات تعيد الأموال دون إتمام التسوية: Reclaim وCancel وReject أثناء بقاء الصفقة مفتوحة، وRecover للإيداع الذي يصل بعد إغلاقها. لا تتحقق أي منها من انتهاء الصلاحية. وقد يظل شق محتجزًا بسبب حساب ضمان مجمَّد أو mint تغيّر، كما تصف الملاحظات في النهاية.

التعليمةالموقِّعالنطاقالصفقة بعد ذلك
ReclaimDvpuser_a أو user_bشق الموقِّع نفسهلا تزال مفتوحة
CancelDvpسلطة التسويةالشقان كلاهمامغلقة
RejectDvpuser_a أو user_bالشقان كلاهمامغلقة
RecoverDvpuser_a أو user_bشق الموقِّع، بعد الإغلاقمغلقة بالفعل

في كل حالة يُفرَّغ حساب الضمان من كل ما يحتويه إلى صاحب الشق: حساب الضمان A إلى token account الخاص بـ user_a للعملة mint_a، وحساب الضمان B إلى token account الخاص بـ user_b للعملة mint_b، أيًّا كان من موَّله. ويُوفَّر program account الخاص ببرنامج memo لحسابات الاسترداد التي تتطلب memo.

تتابع هذه الصفحة الخطوات السابقة: يُنقل العميل والموقِّعون من إنشاء صفقة، وuserAAtaA وuserBAtaB من تمويل الشقين، وMEMO_PROGRAM_ID وauthority من تسوية الصفقة.

استرجاع شق

يعيد Reclaim شق الموقِّع ويُبقي الصفقة مفتوحة، بحيث يمكن تمويل الشق مرة أخرى. استخدمه عندما تكون المشكلة في شق الطرف المقابل؛ أما Cancel وReject فيُغلقان الصفقة كلها.

import { MEMO_PROGRAM_ADDRESS } from "@solana-program/memo";
import { getReclaimDvpInstruction } from "./dvp";
// The asset-leg party takes its asset back.
const reclaimInstruction = getReclaimDvpInstruction({
signer: userASigner,
swapDvp,
mint: mintA,
dvpSourceAta: escrowA,
signerDestAta: userAAtaA,
tokenProgram: tokenProgramA,
memoProgram: MEMO_PROGRAM_ADDRESS,
});
await client.sendTransaction([reclaimInstruction]);

الإلغاء أو الرفض

يوقّع Cancel سلطةُ التسوية، ويوقّع Reject أيٌّ من الطرفين. وكلاهما يردّ ما يحتويه كل حساب ضمان إلى صاحب الشق، ويغلق السجل وحسابَي الضمان كليهما، وتذهب rent الحسابات المغلقة إلى الموقِّع. وتستخدم التعليمتان الحسابات نفسها؛ والفرق الوحيد هو الموقِّع.

import { getCancelDvpInstruction, getRejectDvpInstruction } from "./dvp";
const unwindAccounts = {
swapDvp,
mintA,
mintB,
dvpAtaA: escrowA,
dvpAtaB: escrowB,
userAAtaA,
userBAtaB,
tokenProgramA,
tokenProgramB,
memoProgram: MEMO_PROGRAM_ADDRESS,
legAExtrasCount: 0,
};
// Signed by the settlement authority:
const cancelInstruction = getCancelDvpInstruction({
settlementAuthority: authoritySigner,
...unwindAccounts,
});
// Or signed by either party:
const rejectInstruction = getRejectDvpInstruction({
signer: userBSigner,
...unwindAccounts,
});

يجب أن تكون حسابات الاسترداد (userAAtaA وuserBAtaB) موجودة لأي شق يحتوي على رصيد؛ فحساب الاسترداد غير المهيأ يجعل تحويل الرمز يفشل ويتراجع تنفيذ التعليمة. أما الشق الذي لم يُموَّل قط فلا يحتاج إلى تحويل ويتحمل غياب الحساب.

استرداد إيداع متأخر

تغلق Settle وCancel وReject جميعها token accounts الخاصة بحسابَي الضمان، لذا يفشل التحويل العادي إلى حساب ضمان مغلق. ولا يصل الإيداع بعد الإغلاق إلا إذا أعاد شيء ما إنشاء حساب الضمان أولًا، مثل معاملة تمويل تتضمن تعليمة create-idempotent associated token account قبل التحويل وكانت قيد التنفيذ عندما أرسل الطرف المقابل Reject. عندئذٍ تستقر الرموز في حساب ضمان لم تعد صفقته موجودة: السجل اختفى فلا يستطيع Reclaim العثور عليه، ويمنع tombstone الخاص بـ nonce إنشاء صفقة جديدة على العنوان نفسه والاستيلاء على الإيداع.

لاستخدام RecoverDvp، يوفّر صاحب الشق مدخلات seed الأصلية (سلطة التسوية، الطرفان، الـ mint كلاهما، nonce). يعيد البرنامج اشتقاق عنوان السجل، ويشترط وجود tombstone الخاص به كدليل على وجود الصفقة، ويفرّغ حساب الضمان إلى token account الخاص بالموقِّع، ثم يغلقه ويعيد rent حساب الضمان إلى الموقِّع. ويتحدد شق الموقِّع بحسب الطرف الذي يوقّع: mint_a لـ user_a، وmint_b لـ user_b.

import { getAddressEncoder, getProgramDerivedAddress } from "@solana/kit";
import { DVP_SWAP_PROGRAM_PROGRAM_ADDRESS, getRecoverDvpInstruction } from "./dvp";
const [nonceTombstone] = await getProgramDerivedAddress({
programAddress: DVP_SWAP_PROGRAM_PROGRAM_ADDRESS,
seeds: ["nonce", getAddressEncoder().encode(swapDvp)],
});
const recoverInstruction = getRecoverDvpInstruction({
signer: userASigner,
swapDvp,
nonceTombstone,
mint: mintA,
dvpEscrowAta: escrowA,
signerDestAta: userAAtaA,
tokenProgram: tokenProgramA,
memoProgram: MEMO_PROGRAM_ADDRESS,
settlementAuthority,
userA,
userB,
mintA,
mintB,
nonce,
});
await client.sendTransaction([recoverInstruction]);

يعتمد الاسترداد على احتفاظ الطرف بمعاملات الإنشاء. فالنظام الذي يموّل الصفقات يخزّن مدخلات seed مع كل أمر إلى أن تُغلق الصفقة ويتأكد من أن أرصدة حسابات الضمان فارغة.

ملاحظات

  • الشقوق المجمَّدة. في mint مقيَّد، يمنع حساب الضمان المجمَّد تحويل الرمز الذي تجريه هذه التعليمات إلى أن تفك سلطة التجميد التجميد. راجع النظرة العامة.
  • تغييرات mint بعد الإنشاء. تتخطى مسارات التراجع فحوصات الامتدادات وسلطة mint حتى لا تعيق فحوصات البرنامج نفسه عملية الاسترداد. وتظل قواعد Token Program نفسها سارية. لا يمكن إغلاق mint إلا عندما يكون المعروض صفرًا، لذا لا يمكن أن يتغير بينما يوجد رصيد في حساب الضمان، لكن mint أُغلق وأُعيد إنشاؤه بوصفه NonTransferable أو برسوم تحويل قبل وصول إيداع متأخر قد يجعل ذلك الإيداع غير قابل للتحويل أو خاضعًا لرسوم. وهذا هو الاعتماد على سلطة mint المذكور ضمن الرموز المدعومة.

الخطوات التالية

Is this page helpful?

جدول المحتويات

تعديل الصفحة