Kaupan purkaminen

Neljä instruktiota palauttaa varat ilman selvitystä: Reclaim, Cancel ja Reject kaupan ollessa avoin sekä Recover talletukselle, joka saapuu kaupan sulkeutumisen jälkeen. Mikään niistä ei tarkista vanhenemista. Jäädytetty escrow tai muuttunut mint voi silti pitää osuuden lukittuna, kuten lopun huomautukset kuvaavat.

InstruktioAllekirjoittajaLaajuusKauppa jälkeenpäin
ReclaimDvpuser_a tai user_bAllekirjoittajan oma osuusEdelleen avoin
CancelDvpSelvitysviranomainenMolemmat osuudetSuljettu
RejectDvpuser_a tai user_bMolemmat osuudetSuljettu
RecoverDvpuser_a tai user_bAllekirjoittajan osuus sulkemisen jälkeenJo suljettu

Kussakin tapauksessa escrow tyhjennetään kaikesta sisältämästään osuuden osapuolelle: escrow A osapuolen user_a token accountiin tokenille mint_a ja escrow B osapuolen user_b token accountiin tokenille mint_b, riippumatta siitä, kuka osuuden rahoitti. Memo program account annetaan palautustileille, jotka vaativat memon.

Tämä sivu jatkaa aiemmista vaiheista: client ja allekirjoittajat kohdasta kaupan luominen, userAAtaA ja userBAtaB kohdasta osuuksien rahoittaminen sekä MEMO_PROGRAM_ID ja authority kohdasta kaupan selvittäminen otetaan käyttöön sellaisenaan.

Osuuden palauttaminen (Reclaim)

Reclaim palauttaa allekirjoittajan osuuden ja jättää kaupan avoimeksi, joten osuus voidaan rahoittaa uudelleen. Käytä sitä, kun ongelma on vastapuolen osuudessa; Cancel ja Reject sulkevat koko kaupan.

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 tai Reject

Cancelin allekirjoittaa selvitysviranomainen ja Rejectin jompikumpi osapuoli. Molemmat palauttavat kunkin escrow'n sisältämät varat osuuden osapuolelle ja sulkevat kaupan tietueen sekä molemmat escrow't, ja suljettujen tilien rent menee allekirjoittajalle. Kumpikin instruktio ottaa samat tilit; vain allekirjoittaja eroaa.

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,
});

Palautustilien (userAAtaA, userBAtaB) on oltava olemassa jokaiselle osuudelle, jolla on saldoa; alustamaton palautustili saa token-siirron epäonnistumaan ja peruu instruktion. Osuus, jota ei koskaan rahoitettu, ei vaadi siirtoa ja sietää puuttuvan tilin.

Myöhästyneen talletuksen palauttaminen (Recover)

Settle, Cancel ja Reject sulkevat kaikki molemmat escrow-token accountit, joten pelkkä siirto suljettuun escrow'hun epäonnistuu. Talletus päätyy perille sulkemisen jälkeen vain, jos jokin luo escrow'n ensin uudelleen, esimerkiksi rahoitustapahtuma, joka sisältää create-idempotent associated token account -instruktion ennen siirtoa ja oli kesken, kun vastapuoli lähetti Rejectin. Tokenit jäävät silloin escrow'hun, jonka kauppaa ei enää ole: tietue on poissa, joten Reclaim ei löydä sitä, ja nonce-hautakivi estää uuden kaupan luomisen samaan osoitteeseen ja talletuksen sieppaamisen.

RecoverDvp-instruktiota käyttääkseen osuuden osapuoli antaa alkuperäiset seed-syötteet (selvitysviranomainen, molemmat osapuolet, molemmat mintit, nonce). Ohjelma johtaa tietueen osoitteen uudelleen, vaatii sen hautakiven todisteeksi siitä, että kauppa oli olemassa, tyhjentää escrow'n allekirjoittajan omaan token accountiin ja sulkee sen palauttaen escrow'n rentin allekirjoittajalle. Allekirjoittajan osuus määräytyy sen mukaan, kumpi osapuoli allekirjoittaa: mint_a osapuolelle user_a, mint_b osapuolelle 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]);

Palauttaminen edellyttää, että osapuoli säilyttää luontiparametrit. Kauppoja rahoittava järjestelmä tallentaa seed-syötteet jokaisen toimeksiannon mukana, kunnes kauppa on suljettu ja escrow-saldojen on vahvistettu olevan tyhjät.

Huomautukset

  • Jäädytetyt osuudet. Rajoitetulla mintillä jäädytetty escrow estää näiden instruktioiden suorittaman token-siirron, kunnes jäädytysvaltuuden haltija sulattaa sen. Katso yleiskatsaus.
  • Mintin muutokset luonnin jälkeen. Purkupolut ohittavat laajennus- ja mint-valtuustarkistukset, jotta ohjelman omat tarkistukset eivät estä palautusta. Myös token program soveltaa omia sääntöjään. Mint voidaan sulkea vain, kun sen tarjonta on nolla, joten se ei voi muuttua, kun escrow'ssa on saldoa, mutta mint, joka suljetaan ja luodaan uudelleen NonTransferable- tyyppisenä tai siirtomaksulla ennen myöhästyneen talletuksen saapumista, voi tehdä talletuksesta siirtokelvottoman tai maksullisen. Tämä on se mint-valtuusriippuvuus, joka mainitaan kohdassa tuetut tokenit.

Seuraavat askeleet

Is this page helpful?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.