Solana permite transferencias de tokens instantáneas y globales con tarifas inferiores a $0.001. Ya sea que estés construyendo remesas transfronterizas, desembolsos de nómina u operaciones de tesorería, un pago básico de stablecoin se liquida en menos de un segundo y cuesta una fracción de centavo.
Cómo funciona
Un pago mueve stablecoins desde la cuenta de token del remitente a la cuenta de token del destinatario. Si el destinatario está recibiendo este token por primera vez, su cuenta de token puede crearse como parte de la misma transacción.
Consulta Cómo funcionan los pagos en Solana para conocer los conceptos básicos de pagos.
El plugin token2022Program() de @solana-program/token-2022 extiende tu
cliente @solana/kit con un helper client.token2022.
Su método transferToATA gestiona la derivación de ATA y la construcción de
transacciones automáticamente, lo que lo hace ideal para transferencias de pago
únicas.
Los pasos a continuación muestran el flujo principal. Consulta la Demo para ver el código completo ejecutable.
Crear el helper de token
Añade el plugin token2022Program() a tu cliente con
.use(token2022Program()). Esto expone client.token2022, cuyos instructions
proporcionan métodos para operaciones comunes con tokens.
Usa token2022Program() para mints gestionados por el programa Token-2022, o
tokenProgram() de @solana-program/token para mints gestionados por el Token
Program original.
Enviar el pago
Usa transferToATA() para transferir tokens entre billeteras. El método
gestiona:
- Resolución de ATA: Deriva automáticamente los Associated Token Accounts (ATAs) para el emisor y el destinatario. Si el ATA del destinatario no existe, la instrucción para crear la cuenta se añade automáticamente a la misma transacción.
- Importes verificados: Pasa
amounten unidades base junto con losdecimalsdel mint. La transferencia se verifica contra los decimales del mint on-chain (p. ej., 250000 unidades base -> 0,25 tokens, si el mint tiene 6 decimales) - Construcción de transacciones:
sendTransaction()construye, firma y envía la transacción, resolviendo en un resultado cuyocontext.signaturecontiene la firma de la transacción
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();
Verificar saldos
Una vez completada la transferencia, lee los saldos de tokens desde el RPC.
Deriva el associated token account de cada billetera con
findAssociatedTokenPda() y, a continuación, llama a getTokenAccountBalance()
para obtener el saldo de esa cuenta.
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?