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 berlaku. Escrow yang dibekukan atau mint yang berubah tetap dapat menahan sebuah leg, seperti dijelaskan pada catatan di bagian akhir.
| Instruksi | Penanda tangan | Cakupan | Status trade setelahnya |
|---|---|---|---|
ReclaimDvp | user_a atau user_b | Leg milik penanda tangan sendiri | Tetap 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 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 mewajibkan memo.
Halaman ini melanjutkan langkah-langkah sebelumnya: client dan penanda tangan dari
membuat trade, userAAtaA dan
userBAtaB dari mendanai leg, serta
MEMO_PROGRAM_ID dan authority dari
menyelesaikan trade tetap digunakan.
Reclaim sebuah leg
Reclaim mengembalikan leg milik penanda tangan dan membiarkan trade tetap terbuka, sehingga leg tersebut dapat didanai kembali. Gunakan ini ketika masalah 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 memiliki
saldo; akun pengembalian yang belum diinisialisasi akan membuat 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 semuanya menutup kedua token account escrow, sehingga transfer biasa ke escrow yang sudah ditutup akan gagal. Deposit baru bisa masuk setelah penutupan hanya jika ada yang membuat ulang escrow terlebih dahulu, misalnya transaksi pendanaan yang menyertakan instruksi create-idempotent associated token account 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 mengambil 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, dan 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 sampai trade ditutup dan saldo escrow telah dikonfirmasi kosong.
Catatan
- Leg yang dibekukan. Pada mint yang dibatasi (gated), escrow yang dibekukan memblokir transfer token yang dilakukan instruksi-instruksi ini sampai freeze authority mencairkannya. Lihat ikhtisar.
- Perubahan mint setelah pembuatan. Jalur pembatalan melewati pemeriksaan extension dan mint authority agar pemeriksaan program sendiri tidak menghalangi pemulihan. Aturan token program itu sendiri tetap berlaku. Sebuah mint hanya dapat ditutup saat supply nol, sehingga tidak dapat berubah selama ada saldo di escrow, tetapi mint yang ditutup dan dibuat ulang sebagai NonTransferable atau dengan transfer fee sebelum deposit terlambat masuk dapat membuat deposit tersebut tidak dapat dipindahkan atau terkena biaya. Itulah ketergantungan pada mint authority yang tercantum di bawah token yang didukung.
Langkah berikutnya
- Program DvP: ikhtisar, 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?