Membatalkan Trade

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.

InstruksiPenanda tanganCakupanStatus trade setelahnya
ReclaimDvpuser_a atau user_bLeg milik penanda tangan sendiriTetap terbuka
CancelDvpOtoritas settlementKedua legDitutup
RejectDvpuser_a atau user_bKedua legDitutup
RecoverDvpuser_a atau user_bLeg milik penanda tangan, setelah penutupanSudah 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

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.