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.
| Instruktio | Allekirjoittaja | Laajuus | Kauppa jälkeenpäin |
|---|---|---|---|
ReclaimDvp | user_a tai user_b | Allekirjoittajan oma osuus | Edelleen avoin |
CancelDvp | Selvitysviranomainen | Molemmat osuudet | Suljettu |
RejectDvp | user_a tai user_b | Molemmat osuudet | Suljettu |
RecoverDvp | user_a tai user_b | Allekirjoittajan osuus sulkemisen jälkeen | Jo 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
- DvP-ohjelma: yleiskatsaus, tuetut tokenit ja mint-määritysten rajoitteet
- Toimitus maksua vastaan (DvP) delegoinnilla: sama vaihto delegoidun valtuuden kautta ilman ohjelmaa
Is this page helpful?