Antes de crear flujos de pago en Solana, necesitarás comprender cinco conceptos básicos: billeteras, stablecoins, cuentas de token, comisiones y transacciones. Los pagos en Solana se corresponden claramente con sistemas de pago multimoneda:
| Modelo de pago tradicional | Solana | Descripción |
|---|---|---|
| ID de cliente / Número de cuenta | Dirección de billetera | Identificador único para el titular de una cuenta |
| Moneda (USD, EUR) | Token Mint (USDG, USDC) | El tipo de activo que se transfiere |
| Saldo por moneda | Token Account (ATA) | Contiene un saldo de una moneda/mint específica |
Así como un cliente bancario tiene una única identidad pero mantiene saldos separados para cada moneda, una billetera de Solana tiene una dirección pero una cuenta de token distinta para cada activo que posee. Analicemos cada componente.
Billeteras: remitentes y destinatarios
Cada pago involucra a dos partes, cada una identificada por una dirección de
billetera—una clave pública única de 32 bytes (p. ej., 7EcDhS...).
- Remitente: la billetera que inicia el pago. Debe tener suficiente saldo en la cuenta de stablecoin y firmar la transacción.
- Destinatario: la billetera de destino. No necesita firmar ni tener un saldo existente.
- Pagador de comisión: la billetera opcional que paga la comisión. Puede usarse para subsidiar o habilitar transacciones solo con stablecoin entre usuarios.
Piensa en las direcciones de billetera como números de cuenta bancaria: públicas, seguras para compartir y necesarias para enviar o recibir fondos.
Stablecoins
Las stablecoins se denominan "tokens" en Solana. Los tokens representan un tipo de activo en la red. Cada token tiene un identificador único llamado "dirección de mint". Al crear sistemas de pago, harás referencia a estas direcciones de mint para identificar el activo con el que estás interactuando. Aquí hay algunos mints de stablecoin comunes en mainnet:
| Token | Emisor | Dirección de mint |
|---|---|---|
| USDC | Circle | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| USDT | Tether | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB |
| PYUSD | PayPal | 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo |
| USDG | Paxos | 2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH |
Para más información sobre stablecoins en Solana, consulta la página de soluciones de Stablecoins.
Al aceptar pagos, siempre valida la dirección de mint y el Token Program. Los tokens pueden compartir nombres pero tener diferentes emisores y activos subyacentes.
Token accounts
Las wallets no contienen tokens directamente. En su lugar, cada wallet tiene autoridad sobre un token account para cada tipo de token que posee. Los pagos se realizan transfiriendo tokens desde el token account del remitente al token account del receptor del mismo mint:
Token accounts
Un associated token account es un token account determinístico vinculado a una wallet y mint específicos. Dada una dirección de wallet y un mint, la dirección ATA es siempre la misma.
- Un ATA por mint. Una wallet tiene exactamente un ATA para USDC, uno para USDT, etc.
- Debe existir antes de recibir. No puedes enviar tokens a un ATA que no existe.
- El remitente normalmente lo crea. Si el ATA del receptor no existe, el remitente puede crearlo como parte de la transacción de pago.
import { findAssociatedTokenPda } from "@solana-program/token";const [receiverATA] = await findAssociatedTokenPda({mint: USDG_MINT_ADDRESS,owner: receiverWallet.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});
Token Programs
En Solana, los programas son lógica ejecutable que gobierna el estado de las cuentas. Los token accounts son gestionados por un Token Program—el código on-chain que verifica transferencias y actualiza saldos de forma atómica.
Solana tiene dos Token Programs:
| Programa | Dirección | Tokens de ejemplo que usan este programa |
|---|---|---|
| Token Program | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | USDC, USDT |
| Token-2022 | TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb | PYUSD, USDG |
Token-2022 (también llamado "Token Extensions") añade funcionalidades como hooks de transferencia, tarifas de transferencia y transferencias confidenciales. Ambos programas funcionan de manera similar para transferencias básicas, pero debes usar el correcto al derivar ATAs.
Por qué esto importa
El Token Program usado para crear un token gobierna las instrucciones y el estado de cuenta del token. Si usas el programa incorrecto, no podrás transferir el token.
Los ATAs se derivan de tres entradas: wallet + mint + token_program. Usar el
programa incorrecto produce una dirección completamente diferente:
import {findAssociatedTokenPda,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";import { TOKEN_2022_PROGRAM_ADDRESS } from "@solana-program/token-2022";// USDC uses Token Programconst [usdcAta] = await findAssociatedTokenPda({mint: USDC_MINT,owner: walletAddress,tokenProgram: TOKEN_PROGRAM_ADDRESS // ✓ Correct});// ❌ This will produce a different address because it uses the wrong programconst [wrongUsdcAta] = await findAssociatedTokenPda({mint: USDC_MINT,owner: walletAddress,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ❌ Wrong program});// PYUSD uses Token-2022const [pyusdAta] = await findAssociatedTokenPda({mint: PYUSD_MINT,owner: walletAddress,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ✓ Correct});
Derivar un ATA con el programa incorrecto producirá una dirección inválida. Siempre haz coincidir el programa con el mint del token.
El mismo principio se aplica a las instrucciones de transferencia. Cada token program tiene su propia instrucción de transferencia, y debes invocar la correcta:
import { getTransferInstruction } from "@solana-program/token";import { getTransferInstruction as getTransferInstruction22 } from "@solana-program/token-2022";// For USDC (Token Program)const usdcTransferIx = getTransferInstruction({source: senderUsdcAta,destination: receiverUsdcAta,authority: senderWallet,amount: 1_000_000n // 1 USDC (6 decimals)});// For PYUSD (Token-2022)const pyusdTransferIx = getTransferInstruction22({source: senderPyusdAta,destination: receiverPyusdAta,authority: senderWallet,amount: 1_000_000n // 1 PYUSD (6 decimals)});// *Note*: Most token program JS Client functions include the ability// to specify the token program address. Generally, defining it is a// good practice to ensure you are fully aware of the program you are usingconst usdcTransferIx2 = getTransferInstruction({source: senderUsdcAta,destination: receiverUsdcAta,authority: senderWallet,amount: 1_000_000n // 1 USDC (6 decimals)},{ tokenProgram: TOKEN_PROGRAM_ADDRESS });
Enviar una instrucción de transferencia al programa incorrecto fallará. El programa valida que posee las token accounts involucradas—las cuentas creadas por Token Program no pueden ser transferidas vía Token-2022, y viceversa.
Para verificar qué programa usa un token o token account, obtén el mint o la
token account y verifica su campo owner:
import { createSolanaRpc, address } from "@solana/kit";const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");const accountInfo = await rpc.getAccountInfo(address(mintAddress)).send();// The owner field tells you which program manages this tokenconst tokenProgram = accountInfo.value?.owner;// Returns: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (Token Program)// or: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb (Token-2022)
Para aplicaciones de pago, almacena la dirección correcta del programa junto con cada token soportado:
const SUPPORTED_TOKENS = {USDC: {mint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",program: TOKEN_PROGRAM_ADDRESS,decimals: 6},PYUSD: {mint: "2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",program: TOKEN_2022_PROGRAM_ADDRESS,decimals: 6}};
Token Extensions
El Token Extensions Program (Token 2022) proporciona más funcionalidades a través de instrucciones adicionales denominadas extensiones. Las extensiones son características opcionales que puedes agregar a un token mint o token account.
Para más información sobre Token Extensions, consulta la documentación de Token Extensions.
Tarifas
Los pagos en Solana involucran hasta tres componentes de costo:
| Tipo de tarifa | SOL | USD (est.) | Cuándo |
|---|---|---|---|
| Tarifa base de transacción | 5,000 lamports* | ~$0.0007 | Cada transacción (agrupa múltiples pagos para amortizar) |
| Tarifa de prioridad | Variable | Variable | Opcional; inclusión más rápida durante congestión |
| Creación de cuenta (rent) | ~0.0029 SOL | ~$0.40 | Solo al crear un nuevo token account |
Costo total por pago: Menos de $0.001 para la mayoría de las transferencias. Si se crea un nuevo token account, espera un total de ~$0.40.
Solana utiliza mercados de tarifas locales—las transacciones de cada programa compiten solo con otras transacciones dirigidas al mismo estado. Esto significa que las tarifas de pago se mantienen bajas y predecibles incluso durante períodos de alta actividad de red en otros lugares. Los costos de rent también están planeados para disminuir un 50% en el futuro cercano.
Puedes abstraer completamente las tarifas para que los usuarios nunca interactúen con SOL. Consulta Abstracción de tarifas para patrones de implementación.
Transacciones e instrucciones
Una transacción es la unidad atómica de ejecución en Solana—o todas las operaciones tienen éxito, o ninguna lo hace. Cada transacción contiene una o más instrucciones, que son comandos individuales (por ejemplo, "transferir 10 USDC", "crear token account").
Una transacción de pago típica podría incluir dos instrucciones: crear el token account del receptor (si es necesario), luego transferir tokens. Ambas se ejecutan atómicamente—sin estados parciales. Como verás en Procesamiento de pagos, puedes agrupar múltiples pagos en una sola transacción para reducir costos y aumentar el rendimiento.
Juntando todo
Un flujo de pago típico:
- Recopilar información. Obtén las direcciones de las billeteras del remitente y del destinatario, y la dirección del mint del token que se va a transferir.
- Derivar ATAs. Determina las cuentas de tokens para ambas partes.
- Construir y firmar. Construye la transacción con las instrucciones de transferencia necesarias, firma con la clave del remitente.
- Enviar y confirmar. La transacción se liquida en menos de un segundo.
Próximos pasos
Interactuar con Solana
Conéctate a la red y explora los datos de pagos de Solana.
Envía tu primer pago
Construye y envía una transferencia de stablecoin.
* un lamport es la unidad más pequeña de SOL y equivale a 0.000000001 SOL
Is this page helpful?