Solana consente trasferimenti di token istantanei e globali con commissioni inferiori a $0,001. Che tu stia costruendo rimesse transfrontaliere, erogazioni di stipendi o operazioni di tesoreria, un pagamento base in stablecoin si completa in meno di un secondo e costa una frazione di centesimo.
Come funziona
Un pagamento sposta stablecoin dal token account del mittente al token account del destinatario. Se il destinatario riceve questo token per la prima volta, il suo token account può essere creato come parte della stessa transazione.
Consulta Come funzionano i pagamenti su Solana per i concetti fondamentali sui pagamenti.
Il plugin token2022Program() di @solana-program/token-2022 estende il tuo
client @solana/kit con un helper client.token2022.
Il suo metodo transferToATA gestisce automaticamente la derivazione ATA e la
costruzione delle transazioni, il che lo rende ideale per i trasferimenti di
pagamento singoli.
I passaggi seguenti mostrano il flusso principale. Consulta la Demo per il codice completo eseguibile.
Crea l'helper token
Aggiungi il plugin token2022Program() al tuo client con
.use(token2022Program()). Questo espone client.token2022, le cui
instructions forniscono metodi per le operazioni comuni sui token.
Usa token2022Program() per i mint di proprietà del programma Token-2022,
oppure tokenProgram() da @solana-program/token per i mint di proprietà del
Token program originale.
Invia il pagamento
Usa transferToATA() per trasferire token tra wallet. Il metodo gestisce:
- Risoluzione ATA: Deriva automaticamente gli Associated Token Accounts (ATA) per il mittente e il destinatario. Se l'ATA del destinatario non esiste, l'istruzione per creare l'account viene aggiunta automaticamente alla stessa transazione.
- Importi verificati: Passa
amountin unità base insieme aidecimalsdel mint. Il trasferimento viene verificato rispetto ai decimali del mint on-chain (es. 250000 unità base -> 0,25 token, se il mint ha 6 decimali) - Costruzione della transazione:
sendTransaction()costruisce, firma e invia la transazione, restituendo un risultato il cuicontext.signaturecontiene la firma della transazione
const client = createClient().use(signer(sender)).use(solanaLocalRpc()).use(token2022Program());const result = await client.token2022.instructions.transferToATA({mint: mint.address,authority: sender,recipient: recipient.address,amount: 250_000n,decimals: 6}).sendTransaction();
Verifica i saldi
Al termine del trasferimento, leggi i saldi dei token dall'RPC. Deriva l'ATA di
ciascun wallet con findAssociatedTokenPda(), quindi chiama
getTokenAccountBalance() per recuperare il saldo di quell'account.
const client = createClient().use(signer(sender)).use(solanaLocalRpc()).use(token2022Program());const result = await client.token2022.instructions.transferToATA({mint: mint.address,authority: sender,recipient: recipient.address,amount: 250_000n,decimals: 6}).sendTransaction();const [senderAta] = await findAssociatedTokenPda({mint: mint.address,owner: sender.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const [recipientAta] = await findAssociatedTokenPda({mint: mint.address,owner: recipient.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const senderBalance = await client.rpc.getTokenAccountBalance(senderAta).send();const recipientBalance = await client.rpc.getTokenAccountBalance(recipientAta).send();
Demo
// Generate signers for sender and recipientconst sender = await generateKeyPairSigner();const recipient = await generateKeyPairSigner();console.log("Sender Address:", sender.address);console.log("Recipient Address:", recipient.address);// Demo Setup: Create client, mint account, and fund the sender with initial tokensconst { client, mint } = await demoSetup(sender);console.log("\nMint Address:", mint.address);// =============================================================================// Basic Token Payment Demo// =============================================================================// Transfer tokens from sender to recipient. The source and destination ATAs are// derived automatically, and the recipient's ATA is created if it does not exist.const result = await client.token2022.instructions.transferToATA({mint: mint.address,authority: sender,recipient: recipient.address,amount: 250_000n, // 0.25 tokens (base units for a mint with 6 decimals)decimals: 6}).sendTransaction();console.log("\n=== Token Payment Complete ===");console.log("Transaction Signature:", result.context.signature);// Derive the sender and recipient ATAs to read their balancesconst [senderAta] = await findAssociatedTokenPda({mint: mint.address,owner: sender.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const [recipientAta] = await findAssociatedTokenPda({mint: mint.address,owner: recipient.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});// Fetch final token account balances via RPCconst senderBalance = await client.rpc.getTokenAccountBalance(senderAta).send();const recipientBalance = await client.rpc.getTokenAccountBalance(recipientAta).send();console.log("\nSender Token Account Balance:",senderBalance.value.uiAmountString);console.log("Recipient Token Account Balance:",recipientBalance.value.uiAmountString);// =============================================================================// Demo Setup Helper Function// =============================================================================
Is this page helpful?