Empat instruksi mengembalikan dana tanpa melakukan settlement: Reclaim, Cancel, dan Reject saat trade masih terbuka, serta Recover untuk deposit yang masuk setelah trade ditutup. Tidak satu pun dari instruksi ini memeriksa masa kedaluwarsa. Escrow yang dibekukan atau mint yang berubah tetap dapat menahan sebuah leg, seperti dijelaskan pada catatan di bagian akhir.
| Instruksi | Penanda tangan | Cakupan | Trade sesudahnya |
|---|---|---|---|
ReclaimDvp | user_a atau user_b | Leg milik penanda tangan sendiri | Masih terbuka |
CancelDvp | Otoritas settlement | Kedua leg | Ditutup |
RejectDvp | user_a atau user_b | Kedua leg | Ditutup |
RecoverDvp | user_a atau user_b | Leg milik penanda tangan, setelah penutupan | Sudah ditutup |
Dalam setiap kasus, seluruh isi escrow dikosongkan dan dikembalikan kepada pihak pemilik leg:
escrow A ke token account user_a untuk mint_a, escrow B ke token account user_b untuk
mint_b, siapa pun yang mendanainya. Memo program account disertakan untuk akun
pengembalian dana yang mensyaratkan memo.
Halaman ini melanjutkan langkah-langkah sebelumnya: klien dan penanda tangan dari
membuat trade, userAAtaA dan
userBAtaB dari mendanai leg, serta
MEMO_PROGRAM_ID dan authority dari
menyelesaikan trade tetap digunakan.
Menarik kembali sebuah leg
Reclaim mengembalikan leg milik penanda tangan dan membiarkan trade tetap terbuka, sehingga leg tersebut dapat didanai kembali. Gunakan saat masalahnya ada pada leg pihak lawan; Cancel dan Reject menutup seluruh trade.
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 atau Reject
Cancel ditandatangani oleh otoritas settlement dan Reject oleh salah satu pihak. Keduanya mengembalikan seluruh isi setiap escrow kepada pihak pemilik leg, lalu menutup record dan kedua escrow, dengan rent dari akun yang ditutup diberikan kepada penanda tangan. Kedua instruksi ini menggunakan akun yang sama; hanya penanda tangannya yang berbeda.
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,});
Akun pengembalian dana (userAAtaA, userBAtaB) harus sudah ada untuk setiap leg yang menyimpan
saldo; akun pengembalian yang belum diinisialisasi akan menyebabkan transfer token gagal dan
membatalkan instruksi. Leg yang tidak pernah didanai tidak memerlukan transfer dan
toleran terhadap akun yang tidak ada.
Memulihkan deposit yang terlambat
Settle, Cancel, dan Reject sama-sama menutup kedua token account escrow, sehingga transfer biasa ke escrow yang sudah ditutup akan gagal. Sebuah deposit hanya dapat masuk setelah penutupan jika ada sesuatu yang membuat ulang escrow terlebih dahulu, misalnya transaksi pendanaan yang menyertakan instruksi associated token account create-idempotent sebelum transfer dan masih berjalan ketika pihak lawan mengirim Reject. Token tersebut kemudian berada di escrow yang trade-nya sudah tidak ada: record-nya telah hilang, sehingga Reclaim tidak dapat menemukannya, dan nonce tombstone mencegah trade baru dibuat di alamat yang sama dan menangkap deposit tersebut.
Untuk menggunakan RecoverDvp, pihak pemilik leg menyediakan input seed asli
(otoritas settlement, kedua pihak, kedua mint, nonce). Program menurunkan ulang
alamat record, mensyaratkan tombstone-nya sebagai bukti bahwa trade pernah ada, mengosongkan
escrow ke token account milik penanda tangan sendiri, lalu menutupnya, dengan mengembalikan
rent escrow kepada penanda tangan. Leg penanda tangan ditentukan oleh pihak yang menandatangani:
mint_a untuk user_a, mint_b untuk 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]);
Pemulihan bergantung pada pihak yang menyimpan parameter pembuatan. Sistem yang mendanai trade menyimpan input seed bersama setiap order hingga trade ditutup dan saldo escrow dikonfirmasi kosong.
Catatan
- Leg yang dibekukan. Pada mint yang dibatasi, escrow yang dibekukan memblokir transfer token yang dilakukan instruksi-instruksi ini hingga otoritas pembekuan membukanya kembali. Lihat ringkasan.
- Perubahan mint setelah pembuatan. Jalur pembatalan melewati pemeriksaan ekstensi dan otoritas mint agar pemeriksaan program sendiri tidak menghalangi pemulihan. Aturan token program sendiri tetap berlaku. Sebuah mint hanya dapat ditutup pada suplai nol, sehingga tidak dapat berubah selama ada saldo di escrow, tetapi mint yang ditutup dan dibuat ulang sebagai NonTransferable atau dengan biaya transfer sebelum deposit yang terlambat masuk dapat membuat deposit tersebut tidak dapat dipindahkan atau terkena biaya. Itulah ketergantungan pada otoritas mint yang tercantum di bawah token yang didukung.
Langkah berikutnya
- Program DvP: ringkasan, token yang didukung, dan batasan konfigurasi mint
- Delivery vs Payment (DvP) menggunakan delegasi: pertukaran yang sama melalui otoritas yang didelegasikan, tanpa program
Is this page helpful?