Een overdracht versturen

Overzicht

Kanaaloverdrachten zijn standaard SPL-tokenoverdrachten die naar de gateway worden gestuurd – er is geen speciale Private Channels-overdrachtsinstruction. De gateway stuurt de transactie door naar het write node, dat deze uitvoert tegen de off-chain accountslaag van het kanaal. Overdrachten worden bevestigd wanneer de sequencer ze verwerkt, niet wanneer een Solana-blok wordt bevestigd, en verschijnen niet op Mainnet.

De RPC van je wallet aanpassen

Voordat je een overdracht verstuurt, moet je het RPC-eindpunt van je wallet wijzigen naar de gateway-URL in plaats van Solana Devnet:

http://localhost:8899

Transacties die naar een openbare Solana RPC worden gestuurd, komen terecht op Mainnet, niet op het kanaal.

Authenticatie

Als je de stack hebt gestart zonder --profile auth (de standaard devnet-configuratie), werkt de gateway in de open modus en is er geen token vereist – sla deze sectie over.

Wanneer de Auth Service is ingeschakeld (JWT_SECRET is ingesteld op de gateway), vereisen alle verzoeken een JWT bearer-token in de Authorization-header:

Authorization: Bearer <JWT_TOKEN>

Zie Authenticatie & Rollen voor informatie over hoe je je kunt registreren, inloggen en een token kunt verkrijgen.

Een overdracht opbouwen en versturen

Als de associated token account van de ontvanger nog niet op het kanaal bestaat, voeg dan een createAssociatedTokenAccountIdempotent-instruction toe vóór de overdracht. De onderstaande code verwerkt beide gevallen:

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

De overdracht verifiëren

Vraag het kanaalsaldo van de ontvanger op via de gateway om te bevestigen dat de overdracht is verwerkt:

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

Volgende stappen

Fondsen opnemen – tokens terug opnemen naar je Solana-wallet

Is this page helpful?

Inhoudsopgave

Pagina Bewerken
© 2026 Solana Foundation. Alle rechten voorbehouden.