Τέσσερις εντολές επιστρέφουν κεφάλαια χωρίς διακανονισμό: οι Reclaim, Cancel και Reject ενώ η συναλλαγή είναι ανοιχτή, και η Recover για μια κατάθεση που φτάνει αφού η συναλλαγή έχει κλείσει. Καμία τους δεν ελέγχει τη λήξη. Ένα παγωμένο escrow ή ένα αλλαγμένο mint μπορεί ακόμη να κρατήσει ένα σκέλος, όπως περιγράφεται στις σημειώσεις στο τέλος.
| Εντολή | Υπογράφων | Εύρος | Συναλλαγή στη συνέχεια |
|---|---|---|---|
ReclaimDvp | user_a ή user_b | Το δικό του σκέλος του υπογράφοντος | Παραμένει ανοιχτή |
CancelDvp | Αρχή διακανονισμού | Και τα δύο σκέλη | Κλειστή |
RejectDvp | user_a ή user_b | Και τα δύο σκέλη | Κλειστή |
RecoverDvp | user_a ή user_b | Το σκέλος του υπογράφοντος, μετά το κλείσιμο | Ήδη κλειστή |
Σε κάθε περίπτωση το escrow αδειάζει ό,τι περιέχει προς το μέρος του σκέλους:
το escrow A στο token account του user_a για το mint_a, το escrow B στο token account του user_b για το
mint_b, ανεξάρτητα από το ποιος το χρηματοδότησε. Το memo program account παρέχεται για
λογαριασμούς επιστροφής που απαιτούν memo.
Αυτή η σελίδα συνεχίζει από τα προηγούμενα βήματα: ο client και οι υπογράφοντες από το
δημιουργία συναλλαγής, τα userAAtaA και
userBAtaB από το χρηματοδότηση των σκελών, καθώς και τα
MEMO_PROGRAM_ID και authority από το
διακανονισμός της συναλλαγής μεταφέρονται εδώ.
Ανάκτηση ενός σκέλους
Το Reclaim επιστρέφει το σκέλος του υπογράφοντος και αφήνει τη συναλλαγή ανοιχτή, ώστε το σκέλος να μπορεί να χρηματοδοτηθεί ξανά. Χρησιμοποιήστε το όταν το πρόβλημα βρίσκεται στο σκέλος του αντισυμβαλλομένου· τα Cancel και Reject κλείνουν ολόκληρη τη συναλλαγή.
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 υπογράφεται από την αρχή διακανονισμού και το Reject από οποιοδήποτε μέρος. Και τα δύο επιστρέφουν ό,τι κρατά κάθε escrow στο μέρος του σκέλους και κλείνουν την εγγραφή και τα δύο escrow, με το rent των κλειστών λογαριασμών να πηγαίνει στον υπογράφοντα. Οι δύο εντολές δέχονται τους ίδιους λογαριασμούς· διαφέρει μόνο ο υπογράφων.
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,});
Οι λογαριασμοί επιστροφής (userAAtaA, userBAtaB) πρέπει να υπάρχουν για κάθε σκέλος που κρατά
υπόλοιπο· ένας μη αρχικοποιημένος λογαριασμός επιστροφής κάνει τη μεταφορά token να αποτύχει και
αναιρεί την εντολή. Ένα σκέλος που δεν χρηματοδοτήθηκε ποτέ δεν χρειάζεται μεταφορά και
ανέχεται έναν λογαριασμό που λείπει.
Ανάκτηση μιας καθυστερημένης κατάθεσης
Οι εντολές Settle, Cancel και Reject κλείνουν και τα δύο token accounts των escrow, επομένως μια απλή μεταφορά σε ένα κλειστό escrow αποτυγχάνει. Μια κατάθεση φτάνει μετά το κλείσιμο μόνο αν κάτι δημιουργήσει ξανά πρώτα το escrow, για παράδειγμα μια συναλλαγή χρηματοδότησης που περιλαμβάνει εντολή create-idempotent associated token account πριν από τη μεταφορά και βρισκόταν σε εξέλιξη όταν ο αντισυμβαλλόμενος έστειλε Reject. Τα tokens τότε βρίσκονται σε ένα escrow του οποίου η συναλλαγή δεν υπάρχει πια: η εγγραφή έχει χαθεί, οπότε το Reclaim δεν μπορεί να τη βρει, και το nonce tombstone εμποδίζει τη δημιουργία νέας συναλλαγής στην ίδια διεύθυνση που θα καταλάμβανε την κατάθεση.
Για να χρησιμοποιήσει το RecoverDvp, το μέρος του σκέλους παρέχει τις αρχικές εισόδους seed
(αρχή διακανονισμού, και τα δύο μέρη, και τα δύο mints, nonce). Το πρόγραμμα υπολογίζει ξανά
τη διεύθυνση της εγγραφής, απαιτεί το tombstone της ως απόδειξη ότι η συναλλαγή υπήρξε, αδειάζει
το escrow στο δικό του token account του υπογράφοντος και το κλείνει, επιστρέφοντας το
rent του escrow στον υπογράφοντα. Το σκέλος του υπογράφοντος επιλέγεται από το ποιο μέρος υπογράφει:
το mint_a για τον user_a, το mint_b για τον 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]);
Η ανάκτηση εξαρτάται από το αν το μέρος διατηρεί τις παραμέτρους δημιουργίας. Ένα σύστημα που χρηματοδοτεί συναλλαγές αποθηκεύει τις εισόδους seed με κάθε εντολή μέχρι να κλείσει η συναλλαγή και να επιβεβαιωθεί ότι τα υπόλοιπα των escrow είναι κενά.
Σημειώσεις
- Παγωμένα σκέλη. Σε ένα gated mint, ένα παγωμένο escrow μπλοκάρει τη μεταφορά token που εκτελούν αυτές οι εντολές μέχρι να το ξεπαγώσει η freeze authority. Δείτε την επισκόπηση.
- Αλλαγές του mint μετά τη δημιουργία. Οι διαδρομές αναίρεσης παραλείπουν τους ελέγχους επεκτάσεων και mint authority, ώστε οι έλεγχοι του ίδιου του προγράμματος να μην εμποδίζουν μια ανάκτηση. Οι κανόνες του ίδιου του Token Program εξακολουθούν να ισχύουν. Ένα mint μπορεί να κλείσει μόνο με μηδενικό supply, επομένως δεν μπορεί να αλλάξει ενώ υπάρχει υπόλοιπο στο escrow, αλλά ένα mint που κλείνει και δημιουργείται ξανά ως NonTransferable ή με transfer fee πριν φτάσει μια καθυστερημένη κατάθεση μπορεί να κάνει την κατάθεση αυτή αμετακίνητη ή επιβαρυμένη με χρέωση. Αυτή είναι η εξάρτηση από τη mint authority που αναφέρεται στα υποστηριζόμενα tokens.
Επόμενα βήματα
- Πρόγραμμα DvP: η επισκόπηση, τα υποστηριζόμενα tokens και οι περιορισμοί διαμόρφωσης του mint
- Delivery vs Payment (DvP) με χρήση ανάθεσης: η ίδια ανταλλαγή μέσω εξουσιοδοτημένης αρχής, χωρίς πρόγραμμα
Is this page helpful?