Transfer Gönder

Genel Bakış

Kanal transferleri, ağ geçidine gönderilen standart SPL token transferleridir — özel bir Private Channels transfer talimatı yoktur. Ağ geçidi, işlemi yazma düğümüne yönlendirir; bu düğüm işlemi kanalın zincir dışı hesaplar katmanına karşı çalıştırır. Transferler, bir Solana bloğu onaylandığında değil, sıralayıcı onları işlediğinde onaylanır ve Mainnet üzerinde görünmez.

Cüzdan RPC'nizi Değiştirin

Transfer göndermeden önce, cüzdanınızın RPC uç noktasını Solana Devnet yerine ağ geçidi URL'siyle değiştirin:

http://localhost:8899

Herkese açık bir Solana RPC'sine gönderilen işlemler kanala değil, Mainnet'e düşer.

Kimlik Doğrulama

Stack'i --profile auth olmadan başlattıysanız (varsayılan devnet yapılandırması), ağ geçidi açık modda çalışır ve herhangi bir token gerekmez — bu bölümü atlayabilirsiniz.

Auth Service etkinleştirildiğinde (ağ geçidinde JWT_SECRET ayarlandığında), tüm istekler Authorization başlığında bir JWT taşıyıcı token gerektirir:

Authorization: Bearer <JWT_TOKEN>

Kayıt olma, giriş yapma ve token edinme hakkında bilgi almak için Kimlik Doğrulama & Roller bölümüne bakın.

Transfer Oluşturun ve Gönderin

Alıcının associated token account'u kanalda henüz mevcut değilse, transferden önce bir createAssociatedTokenAccountIdempotent talimatı ekleyin. Aşağıdaki kod her iki durumu da ele alır:

import {
address,
createSolanaRpc,
pipe,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signAndSendTransactionMessageWithSigners,
assertIsTransactionMessageWithSingleSendingSigner,
getBase58Decoder
} from "@solana/kit";
import {
findAssociatedTokenPda,
getCreateAssociatedTokenIdempotentInstruction,
getTransferInstruction
} from "@solana-program/token";
const TOKEN_PROGRAM_ADDRESS = address(
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
);
// Point to the gateway, not a public Solana RPC
const privateChannelRpc = createSolanaRpc("http://localhost:8899");
// Derive source and destination associated token accounts
const [sourceAta] = await findAssociatedTokenPda({
mint: address(mintAddress),
owner: address(senderAddress),
tokenProgram: TOKEN_PROGRAM_ADDRESS
});
const [destinationAta] = await findAssociatedTokenPda({
mint: address(mintAddress),
owner: address(recipientAddress),
tokenProgram: TOKEN_PROGRAM_ADDRESS
});
const transferInstruction = getTransferInstruction({
source: sourceAta,
destination: destinationAta,
authority: transactionSigner,
amount: 1_000_000n // 1 USDC (6 decimals)
});
// Create the destination ATA on the channel if it does not exist yet
const destinationAtaInfo = await privateChannelRpc
.getAccountInfo(destinationAta, { encoding: "base64" })
.send();
const { value: latestBlockhash } = await privateChannelRpc
.getLatestBlockhash({ commitment: "confirmed" })
.send();
// Sent to the Private Channels gateway (not Solana RPC directly), which
// expects the legacy transaction format - do not switch this to version 0.
const transactionMessage = !destinationAtaInfo.value
? pipe(
createTransactionMessage({ version: "legacy" }),
(m) => setTransactionMessageFeePayerSigner(transactionSigner, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),
(m) =>
appendTransactionMessageInstruction(
getCreateAssociatedTokenIdempotentInstruction({
payer: transactionSigner,
ata: destinationAta,
owner: address(recipientAddress),
mint: address(mintAddress)
}),
m
),
(m) => appendTransactionMessageInstruction(transferInstruction, m)
)
: pipe(
createTransactionMessage({ version: "legacy" }),
(m) => setTransactionMessageFeePayerSigner(transactionSigner, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),
(m) => appendTransactionMessageInstruction(transferInstruction, m)
);
assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);
const signatureBytes =
await signAndSendTransactionMessageWithSigners(transactionMessage);
const signature = getBase58Decoder().decode(signatureBytes);
console.log("Transfer signature:", signature);

Transferi Doğrulayın

Transferin başarıyla gerçekleştiğini onaylamak için alıcının kanal bakiyesini ağ geçidi aracılığıyla sorgulayın:

const [recipientAta] = await findAssociatedTokenPda({
mint: address(mintAddress),
owner: address(recipientAddress),
tokenProgram: TOKEN_PROGRAM_ADDRESS
});
const balance = await privateChannelRpc
.getTokenAccountBalance(recipientAta)
.send();
console.log(balance.value.uiAmountString);

Sonraki Adımlar

Fonları Çek — tokens'ları Solana cüzdanınıza geri çekin

Is this page helpful?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.