Χρηματοδότηση των σκελών

Η χρηματοδότηση είναι μια απλή μεταφορά TransferChecked στο escrow του σκέλους, επομένως οποιοδήποτε πορτοφόλι ή σύστημα φύλαξης που μπορεί να στείλει μεταφορά token μπορεί να χρηματοδοτήσει ένα σκέλος. Μόνο η ανάγνωση της εγγραφής συναλλαγής πριν από τη χρηματοδότηση απαιτεί τον πελάτη DvP. Το πρόγραμμα ελέγχει τα υπόλοιπα του escrow μόνο κατά τον διακανονισμό· τίποτα δεν ελέγχει τη μεταφορά όταν καταφτάνει, γι' αυτό κάθε μέρος διαβάζει την εγγραφή συναλλαγής πριν από τη μεταφορά.

Αυτή η σελίδα συνεχίζει από την ενότητα Δημιουργία συναλλαγής· ο πελάτης και οι υπογράφοντες παραμένουν οι ίδιοι.

Επαλήθευση των όρων

Η δημιουργία μιας εγγραφής δεν απαιτεί άδεια και οι διευθύνσεις escrow προκύπτουν μόνο από την εγγραφή και το mint, ποτέ από τους όρους. Μια μεταφορά σε ένα escrow μπορεί επομένως να καταχωρηθεί έναντι όρων που δεν έχετε συμφωνήσει ποτέ, συμπεριλαμβανομένων προορισμών διακανονισμού που ανακατευθύνουν τα έσοδα του αντισυμβαλλομένου σας σε τρίτη διεύθυνση. Πριν από τη χρηματοδότηση, διαβάστε τον λογαριασμό SwapDvp και ελέγξτε τον με βάση τη συμφωνηθείσα συναλλαγή.

Οι verifySwapDvp στην TypeScript και verify::decode_swap_dvp_account στη Rust επιβεβαιώνουν ότι ο λογαριασμός ανήκει στο πρόγραμμα DvP, έχει μέγεθος ακριβώς 458 byte και βρίσκεται στη διεύθυνση που προκύπτει από τα δικά του πεδία (η 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 agreed
const expectedExpiry = 1_798_761_600n; // as agreed, unix seconds
if (
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");
}

Αν η εγγραφή δημιουργήθηκε από τον αντισυμβαλλόμενό σας ή την αρχή διακανονισμού, συγκρίνετε κάθε πεδίο με τους όρους που συμφωνήσατε εκτός ledger. Αν τη δημιουργήσατε εσείς, αυτή η ανάγνωση επιβεβαιώνει ότι καταχωρήθηκε όπως στάλθηκε.

Μεταφορά στο escrow

Χρηματοδοτήστε το σκέλος με ακριβώς το συμφωνηθέν ποσό. Το πρόγραμμα περιορίζει τον διακανονισμό στο amount_x και επιστρέφει οποιοδήποτε πλεόνασμα στο μέρος του σκέλους, οπότε το πλεόνασμα δεν χάνεται, αλλά προσθέτει μια δεύτερη μεταφορά κατά τον διακανονισμό και μπορεί να αποτύχει με ορισμένα transfer hooks (δείτε τις σημειώσεις παρακάτω).

Χρησιμοποιήστε TransferChecked, όχι μη ελεγμένη Transfer. Τα mints 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 με hooks με ακριβώς το συμφωνηθέν ποσό. Αν ένα πλεόνασμα επιβάλλει επιστροφή κατά τον διακανονισμό, η επιστροφή επαναχρησιμοποιεί τους λογαριασμούς hook του σκέλους με διαφορετικό προορισμό και ποσό, κάτι που ορισμένα hooks απορρίπτουν. Η ανάκτηση είναι Reclaim, επαναχρηματοδότηση με το ακριβές ποσό και νέος διακανονισμός.
  • Χρηματοδότηση μετά τη λήξη. Τίποτα δεν εμποδίζει μια μεταφορά μετά το expiry_timestamp. Η μεταφορά καταχωρείται, ο διακανονισμός δεν είναι πλέον δυνατός και το μέρος του σκέλους την ανακτά με Reclaim όσο η συναλλαγή είναι ανοιχτή ή με Recover αφού κλείσει. Δείτε Αναίρεση συναλλαγής.
  • Ποιος χρηματοδοτεί πρώτος. Το πρόγραμμα δεν ορίζει σειρά στα δύο σκέλη. Η σειρά είναι θέμα των μερών· κάθε πλευρά μπορεί να ανακτήσει το δικό της σκέλος ανά πάσα στιγμή πριν από τον διακανονισμό, εκτός αν μια αρχή του mint (freeze, pause ή transfer hook) μπλοκάρει το escrow.

Επόμενα βήματα

Is this page helpful?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.