Déposer des tokens

Vue d'ensemble

L'instruction Deposit transfère des tokens SPL depuis l'associated token account d'un utilisateur vers l'associated token account de l'entiercement. Une fois déposés, les tokens sont disponibles pour les transferts hors chaîne via la passerelle. Le paramètre optionnel recipient permet à un déposant de créditer le solde du canal d'un autre utilisateur.

Prérequis

  • Installation et génération du client effectuées
  • Un portefeuille devnet avec des SOL (pour les frais de transaction) et le token SPL que vous souhaitez déposer
  • Une instance Private Channels active avec votre mint sur la liste d'autorisation

Code

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

Vérifier

Une fois votre transaction devnet confirmée, l'indexeur détecte l'événement de dépôt via Yellowstone gRPC et l'opérateur émet le solde équivalent sur le canal. Un délai de sécurité de finalité est appliqué avant le crédit, donc comptez environ 15 secondes avant que le solde du canal soit disponible.

Interrogez votre solde via la passerelle (et non le RPC devnet) pour confirmer :

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

Un solde non nul confirme que le dépôt a été indexé et crédité. Si le solde est nul après 30 secondes, vérifiez que indexer-solana et operator-solana sont en cours d'exécution (make docker-devnet-logs).

Prochaines étapes

Envoyer un transfert - envoyez votre premier transfert hors chaîne

Is this page helpful?

Table des matières

Modifier la page
© 2026 Fondation Solana. Tous droits réservés.