Danai Kedua Leg

Pendanaan hanyalah TransferChecked biasa ke escrow leg, sehingga dompet atau sistem kustodi apa pun yang dapat mengirim transfer token bisa mendanai sebuah leg. Hanya pembacaan catatan perdagangan sebelum pendanaan yang memerlukan klien DvP. Program memeriksa saldo escrow hanya saat penyelesaian; tidak ada yang memeriksa transfer saat transfer itu masuk, jadi setiap pihak membaca catatan perdagangan sebelum melakukan transfer.

Halaman ini melanjutkan dari membuat perdagangan; klien dan penanda tangan digunakan kembali.

Verifikasi ketentuan

Pembuatan catatan bersifat permissionless, dan alamat escrow diturunkan dari catatan dan mint saja, bukan dari ketentuan. Karena itu, transfer ke sebuah escrow dapat masuk untuk ketentuan yang tidak pernah Anda setujui, termasuk tujuan penyelesaian yang mengalihkan hasil milik rekanan Anda ke alamat ketiga. Sebelum mendanai, baca akun SwapDvp dan periksa terhadap perdagangan yang disepakati.

verifySwapDvp di TypeScript dan verify::decode_swap_dvp_account di Rust memastikan bahwa akun dimiliki oleh program DvP, berukuran tepat 458 byte, dan berada di alamat yang diturunkan dari field-nya sendiri (fetchSwapDvpChecked hanya melakukan dua pemeriksaan pertama). Pembaca fetchSwapDvp dan decodeSwapDvp biasa tidak melakukan satu pun dari pemeriksaan ini. Pemeriksaan atas pihak, jumlah, waktu, dan tujuan dilakukan oleh pemanggil terhadap perdagangan yang disepakati.

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

Jika catatan dibuat oleh rekanan Anda atau otoritas penyelesaian, bandingkan setiap field dengan ketentuan yang Anda sepakati di luar ledger. Jika Anda membuatnya sendiri, pembacaan ini memastikan catatan masuk sebagaimana dikirim.

Transfer ke escrow

Danai leg dengan jumlah yang persis sesuai kesepakatan. Program membatasi penyelesaian pada amount_x dan mengembalikan kelebihan ke pihak leg tersebut, jadi kelebihan tidak hilang, tetapi menambah satu transfer lagi saat penyelesaian dan dapat gagal pada beberapa transfer hook (lihat catatan di bawah).

Gunakan TransferChecked, bukan Transfer tanpa pemeriksaan. Mint Token-2022 dengan ekstensi yang bergantung pada mint account, seperti Pausable, menolak transfer yang tidak menyertakannya, dan mint dengan transfer hook memerlukan akun-akun hook diselesaikan dan ditambahkan dengan cara yang sama seperti untuk transfer token lainnya.

Pihak asset-leg, yang menandatangani sebagai userASigner, mendanai 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]);

Pihak cash-leg melakukan hal yang sama untuk escrow B dengan userBAtaB, mintB, userBSigner, t.amountB, dan { programAddress: tokenProgramB }.

Transfer pendanaan yang terlihat pada confirmed tetap dapat digantikan. Program membaca saldo escrow onchain saat penyelesaian, jadi Settle yang dikirim terhadap transfer pendanaan yang tidak masuk akan gagal dengan LegNotFunded dan tidak ada yang berpindah; biayanya adalah Settle yang gagal dan percobaan ulang. Anggap sebuah leg telah didanai ketika transfernya finalized.

Catatan

  • Leg SOL terbungkus. Program membaca saldo escrow native setelah menyinkronkannya, sehingga lamport yang dikirim ke escrow wrapped-SOL melalui transfer sistem ikut dihitung. Jangan pernah mengirim SOL ke escrow untuk mint lain: program tidak dapat mengembalikannya, dan SOL tersebut menjadi milik siapa pun yang menutup akun.
  • Mint dengan gerbang akses. Pada mint dengan Default Account State frozen, escrow dibuat dalam keadaan frozen dan transfer gagal sampai penerbit membuka pembekuan atau mengizinkannya. Ikhtisar menjelaskan interaksi dengan Token ACL.
  • Transfer hook. Danai escrow yang memiliki hook dengan jumlah yang persis sesuai kesepakatan. Jika kelebihan memaksa pengembalian dana saat penyelesaian, pengembalian tersebut menggunakan ulang akun hook leg dengan tujuan dan jumlah yang berbeda, yang ditolak oleh beberapa hook. Pemulihannya adalah Reclaim, danai ulang dengan jumlah yang tepat, lalu selesaikan lagi.
  • Pendanaan setelah kedaluwarsa. Tidak ada yang menghentikan transfer setelah expiry_timestamp. Transfer tetap masuk, penyelesaian tidak lagi dimungkinkan, dan pihak leg memulihkannya dengan Reclaim selama perdagangan masih terbuka atau Recover setelah ditutup. Lihat membatalkan perdagangan.
  • Siapa yang mendanai lebih dulu. Program tidak mengatur urutan kedua leg. Urutannya diserahkan kepada para pihak; masing-masing pihak dapat me-reclaim leg miliknya kapan saja sebelum penyelesaian, kecuali otoritas mint (freeze, pause, atau transfer hook) memblokir escrow.

Langkah berikutnya

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.