Επισκόπηση
Η εντολή Deposit μεταφέρει SPL tokens από το associated token
account ενός χρήστη στο associated token account του escrow. Μόλις κατατεθούν, τα tokens είναι
διαθέσιμα για off-chain μεταφορές μέσω του gateway. Η προαιρετική παράμετρος recipient
επιτρέπει σε έναν καταθέτη να πιστώσει το υπόλοιπο καναλιού διαφορετικού χρήστη.
Προαπαιτούμενα
- Ολοκληρωμένη εγκατάσταση και δημιουργία client
- Ένα πορτοφόλι devnet με SOL (για χρεώσεις συναλλαγών) και το SPL token που θέλετε να καταθέσετε
- Μια ενεργή παρουσία Private Channels με το mint σας στη λίστα επιτρεπόμενων
Κώδικας
import { getDepositInstructionAsync } from "../private-channel-escrow-program/clients/typescript/src/generated";import {createSolanaRpc,address,pipe,createTransactionMessage,setTransactionMessageFeePayerSigner,setTransactionMessageLifetimeUsingBlockhash,appendTransactionMessageInstruction,signAndSendTransactionMessageWithSigners,assertIsTransactionMessageWithSingleSendingSigner,getBase58Decoder} from "@solana/kit";import { findAssociatedTokenPda } from "@solana-program/token";const rpc = createSolanaRpc("https://api.devnet.solana.com");const TOKEN_PROGRAM_ADDRESS = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");// Derive the user's associated token accountconst [userAta] = await findAssociatedTokenPda({mint: address(mintAddress),owner: address(payerSigner.address),tokenProgram: TOKEN_PROGRAM_ADDRESS});// Build the deposit instruction - allowedMint and instanceAta are auto-derivedconst depositIx = await getDepositInstructionAsync({payer: payerSigner,user: payerSigner,instance: address(instancePda),mint: address(mintAddress),userAta,amount: 1_000_000n, // 1 USDC (6 decimals)recipient: null // null = credit the depositing user's channel balance});const { value: latestBlockhash } = await rpc.getLatestBlockhash({ commitment: "confirmed" }).send();// Deposit is an ordinary Solana instruction sent to Solana RPC directly// (not the gateway), so the versioned (v0) transaction format applies here.const transactionMessage = pipe(createTransactionMessage({ version: 0 }),(m) => setTransactionMessageFeePayerSigner(payerSigner, m),(m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),(m) => appendTransactionMessageInstruction(depositIx, m));assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);const signatureBytes =await signAndSendTransactionMessageWithSigners(transactionMessage);const signature = getBase58Decoder().decode(signatureBytes);console.log("Deposit signature:", signature);
Επαλήθευση
Αφού επιβεβαιωθεί η συναλλαγή σας στο devnet, ο indexer εντοπίζει το συμβάν κατάθεσης μέσω Yellowstone gRPC και ο operator εκδίδει το ισοδύναμο υπόλοιπο στο κανάλι. Εφαρμόζεται μια καθυστέρηση ασφαλείας οριστικοποίησης πριν από την πίστωση, οπότε αναμένετε ~15 δευτερόλεπτα πριν το υπόλοιπο καναλιού γίνει διαθέσιμο.
Ελέγξτε το υπόλοιπό σας μέσω του gateway (όχι μέσω του devnet RPC) για επιβεβαίωση:
import { createSolanaRpc, address } from "@solana/kit";import { findAssociatedTokenPda } from "@solana-program/token";// Point to the gateway, not a public Solana RPCconst privateChannelRpc = createSolanaRpc("http://localhost:8899");const TOKEN_PROGRAM_ADDRESS = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const [channelAta] = await findAssociatedTokenPda({mint: address(mintAddress),owner: address(payerSigner.address),tokenProgram: TOKEN_PROGRAM_ADDRESS});const balance = await privateChannelRpc.getTokenAccountBalance(channelAta).send();console.log("Channel balance:", balance.value.uiAmountString);
Ένα μη μηδενικό υπόλοιπο επιβεβαιώνει ότι η κατάθεση καταχωρήθηκε και πιστώθηκε. Εάν το υπόλοιπο
είναι μηδενικό μετά από 30 δευτερόλεπτα, ελέγξτε ότι τα indexer-solana και operator-solana εκτελούνται
(make docker-devnet-logs).
Επόμενα Βήματα
Αποστολή Transfer - στείλτε το πρώτο σας off-chain transfer
Is this page helpful?