إيداع الرموز

نظرة عامة

يقوم تعليمات Deposit بنقل رموز SPL من associated token account الخاص بالمستخدم إلى associated token account الخاص بالضمان. بمجرد الإيداع، تصبح الرموز متاحة للتحويلات خارج السلسلة عبر البوابة. تتيح المعامِلة الاختيارية recipient للمودِع إضافة الرصيد إلى قناة مستخدم آخر.

المتطلبات الأساسية

  • اكتمال التثبيت وإنشاء العميل
  • محفظة devnet تحتوي على SOL (لرسوم المعاملات) ورمز SPL الذي تريد إيداعه
  • نسخة نشطة من 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، يرصد المُفهرس حدث الإيداع عبر Yellowstone gRPC ويقوم المشغّل بسك الرصيد المعادل على القناة. يُطبَّق تأخير لضمان النهائية قبل إضافة الرصيد، لذا توقع مرور ~15 ثانية قبل أن يصبح رصيد القناة متاحاً.

استعلم عن رصيدك عبر البوابة (وليس عبر 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).

الخطوات التالية

إرسال تحويل - أرسل أول تحويل لك خارج السلسلة

Is this page helpful?

جدول المحتويات

تعديل الصفحة