Η χρηματοδότηση είναι ένα απλό TransferChecked στον λογαριασμό escrow του σκέλους, οπότε οποιοδήποτε πορτοφόλι ή σύστημα
φύλαξης που μπορεί να στείλει μεταφορά token μπορεί να χρηματοδοτήσει ένα σκέλος. Μόνο η ανάγνωση
της εγγραφής της συναλλαγής πριν από τη χρηματοδότηση απαιτεί τον πελάτη DvP. Το πρόγραμμα ελέγχει
τα υπόλοιπα των escrow μόνο κατά τον διακανονισμό· τίποτα δεν ελέγχει τη μεταφορά όταν αυτή καταφθάσει,
γι' αυτό κάθε συμβαλλόμενος διαβάζει την εγγραφή της συναλλαγής πριν από τη μεταφορά.
Αυτή η σελίδα συνεχίζει από το δημιουργία συναλλαγής· ο πελάτης και οι υπογράφοντες μεταφέρονται από εκεί.
Επαλήθευση των όρων
Η δημιουργία μιας εγγραφής γίνεται χωρίς άδεια και οι διευθύνσεις escrow προκύπτουν
από την εγγραφή και το mint μόνο, ποτέ από τους όρους. Μια μεταφορά σε έναν λογαριασμό escrow μπορεί
επομένως να καταλήξει σε όρους που ποτέ δεν συμφωνήσατε, συμπεριλαμβανομένων προορισμών
διακανονισμού που ανακατευθύνουν τα έσοδα του αντισυμβαλλομένου σας σε τρίτη διεύθυνση.
Πριν από τη χρηματοδότηση, διαβάστε τον λογαριασμό SwapDvp και ελέγξτε τον με βάση τη
συμφωνηθείσα συναλλαγή.
Η verifySwapDvp στο TypeScript και η verify::decode_swap_dvp_account στη Rust
επιβεβαιώνουν ότι ο λογαριασμός ανήκει στο πρόγραμμα DvP, έχει ακριβώς 458 bytes και
βρίσκεται στη διεύθυνση που προκύπτει από τα δικά του πεδία (η fetchSwapDvpChecked εκτελεί μόνο
τους δύο πρώτους ελέγχους). Οι απλοί αναγνώστες fetchSwapDvp και decodeSwapDvp
δεν εκτελούν κανέναν από αυτούς τους ελέγχους. Οι έλεγχοι για τα μέρη, τα ποσά, τις χρονικές στιγμές και τους προορισμούς
πραγματοποιούνται από τον καλούντα με βάση τη συμφωνηθείσα συναλλαγή.
import { unwrapOption } from "@solana/kit";import { verifySwapDvp } from "./dvp";const trade = await verifySwapDvp(client.rpc, swapDvp);const t = trade.data;const expectedAmountA = 1_000_000_000n;const expectedAmountB = 998_500_000n;const expectedEarliestSettlement: bigint | null = null; // as agreedconst expectedExpiry = 1_798_761_600n; // as agreed, unix secondsif (t.userA !== userA ||t.userB !== userB ||t.mintA !== mintA ||t.mintB !== mintB ||t.settlementAuthority !== settlementAuthority ||t.tokenProgramA !== tokenProgramA ||t.tokenProgramB !== tokenProgramB ||t.amountA !== expectedAmountA ||t.amountB !== expectedAmountB ||unwrapOption(t.earliestSettlementTimestamp) !== expectedEarliestSettlement ||t.expiryTimestamp !== expectedExpiry ||t.userASettlementDestination !== userA ||t.userBSettlementDestination !== userB) {throw new Error("Stored terms do not match the agreed trade; do not fund");}if (t.expiryTimestamp <= BigInt(Math.floor(Date.now() / 1000)) + 60n) {throw new Error("Trade expires too soon to fund safely");}
Αν η εγγραφή δημιουργήθηκε από τον αντισυμβαλλόμενό σας ή από την αρχή διακανονισμού, συγκρίνετε κάθε πεδίο με τους όρους που συμφωνήσατε εκτός καταστίχου. Αν τη δημιουργήσατε εσείς, αυτή η ανάγνωση επιβεβαιώνει ότι καταχωρήθηκε όπως στάλθηκε.
Μεταφορά στον λογαριασμό escrow
Χρηματοδοτήστε το σκέλος με ακριβώς το συμφωνηθέν ποσό. Το πρόγραμμα περιορίζει τον διακανονισμό στο
amount_x και επιστρέφει οποιοδήποτε πλεόνασμα στον συμβαλλόμενο του σκέλους, οπότε το πλεόνασμα δεν χάνεται,
αλλά προσθέτει μια δεύτερη μεταφορά κατά τον διακανονισμό και μπορεί να αποτύχει με ορισμένα transfer
hooks (δείτε τις σημειώσεις παρακάτω).
Χρησιμοποιήστε το TransferChecked, όχι ένα μη ελεγμένο Transfer. Τα mint του Token-2022 με
επεκτάσεις που εξαρτώνται από τον mint account, όπως το Pausable, απορρίπτουν μια μεταφορά
που δεν τον παρέχει, και ένα mint με transfer hook χρειάζεται οι λογαριασμοί του hook
να επιλυθούν και να προστεθούν με τον ίδιο τρόπο όπως σε κάθε άλλη μεταφορά αυτού του
token.
Ο συμβαλλόμενος του σκέλους περιουσιακού στοιχείου, υπογράφοντας ως userASigner, χρηματοδοτεί το escrow A:
import {findAssociatedTokenPda,getTransferCheckedInstruction,} from "@solana-program/token-2022";const [userAAtaA] = await findAssociatedTokenPda({mint: mintA,owner: userA,tokenProgram: tokenProgramA,});const [userBAtaB] = await findAssociatedTokenPda({mint: mintB,owner: userB,tokenProgram: tokenProgramB,});const fundAssetLeg = getTransferCheckedInstruction({source: userAAtaA,mint: mintA,destination: escrowA,authority: userASigner,amount: t.amountA,decimals: 6,}, { programAddress: tokenProgramA });await client.sendTransaction([fundAssetLeg]);
Ο συμβαλλόμενος του σκέλους μετρητών κάνει το ίδιο για το escrow B με userBAtaB, mintB,
userBSigner, t.amountB και { programAddress: tokenProgramB }.
Μια μεταφορά χρηματοδότησης που εμφανίζεται ως confirmed
μπορεί να ακυρωθεί εκ των υστέρων. Το πρόγραμμα διαβάζει το υπόλοιπο του escrow onchain κατά τον
διακανονισμό, οπότε ένα Settle που στέλνεται με βάση μια μεταφορά χρηματοδότησης που δεν καταχωρήθηκε αποτυγχάνει
με LegNotFunded και τίποτα δεν μετακινείται· το κόστος είναι ένα αποτυχημένο Settle και μια επανάληψη.
Θεωρήστε ένα σκέλος χρηματοδοτημένο όταν η μεταφορά του είναι finalized.
Σημειώσεις
- Σκέλη με wrapped SOL. Το πρόγραμμα διαβάζει το υπόλοιπο ενός native escrow αφού το συγχρονίσει, οπότε τα lamports που στάλθηκαν σε escrow wrapped SOL μέσω μεταφοράς του συστήματος λαμβάνονται υπόψη. Μην στέλνετε ποτέ SOL σε escrow για οποιοδήποτε άλλο mint: το πρόγραμμα δεν μπορεί να το επιστρέψει και πηγαίνει σε όποιον κλείσει τον λογαριασμό.
- Mints με περιορισμένη πρόσβαση. Σε ένα mint με Default Account State frozen, το escrow δημιουργείται παγωμένο και η μεταφορά αποτυγχάνει μέχρι ο εκδότης να το ξεπαγώσει ή να το εγκρίνει. Η επισκόπηση περιγράφει την αλληλεπίδραση με το Token ACL.
- Transfer hooks. Χρηματοδοτήστε τα escrow με hook με ακριβώς το συμφωνηθέν ποσό. Αν ένα πλεόνασμα επιβάλλει επιστροφή κατά τον διακανονισμό, η επιστροφή επαναχρησιμοποιεί τους λογαριασμούς hook του σκέλους με διαφορετικό προορισμό και ποσό, κάτι που ορισμένα hooks απορρίπτουν. Η ανάκτηση γίνεται με Reclaim, νέα χρηματοδότηση με το ακριβές ποσό και νέο διακανονισμό.
- Χρηματοδότηση μετά τη λήξη. Τίποτα δεν εμποδίζει μια μεταφορά μετά το
expiry_timestamp. Αυτή καταχωρείται, ο διακανονισμός δεν είναι πλέον δυνατός και ο συμβαλλόμενος του σκέλους την ανακτά με Reclaim όσο η συναλλαγή είναι ανοιχτή ή με Recover αφού κλείσει. Δείτε αναίρεση μιας συναλλαγής. - Ποιος χρηματοδοτεί πρώτος. Το πρόγραμμα δεν ορίζει σειρά για τα δύο σκέλη. Η σειρά είναι θέμα των συμβαλλομένων· κάθε πλευρά μπορεί να ανακτήσει το δικό της σκέλος ανά πάσα στιγμή πριν από τον διακανονισμό, εκτός αν μια αρχή του mint (freeze, pause ή transfer hook) μπλοκάρει το escrow.
Επόμενα βήματα
- Διακανονισμός της συναλλαγής: η αρχή διακανονισμού ανταλλάσσει και τα δύο σκέλη σε μία συναλλαγή
- Αναίρεση μιας συναλλαγής: ανάκτηση ενός χρηματοδοτημένου σκέλους όταν η συναλλαγή δεν διακανονίζεται
Is this page helpful?