Κατάθεση Tokens

Επισκόπηση

Η εντολή 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 account
const [userAta] = await findAssociatedTokenPda({
mint: address(mintAddress),
owner: address(payerSigner.address),
tokenProgram: TOKEN_PROGRAM_ADDRESS
});
// Build the deposit instruction - allowedMint and instanceAta are auto-derived
const 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 RPC
const 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?

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

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