Una Cuenta de Token Asociada (ATA) es la dirección canónica de cuenta de token SPL para un par de billetera + emisión. Las billeteras, los programas y los indexadores confían en este PDA determinista en lugar de direcciones de cuenta de token ad hoc.
import { createSolanaRpc, createTransactionMessage, pipe, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstructions, signTransactionMessageWithSigners, sendAndConfirmTransactionFactory, address,} from "@solana/kit";import { getCreateAssociatedTokenIdempotentInstruction, findAssociatedTokenPda, TOKEN_PROGRAM_ADDRESS,} from "@solana-program/token";import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from "@solana-program/associated-token";const rpc = createSolanaRpc("https://api.devnet.solana.com");const mint = address("MINT_PUBKEY");const owner = address("WALLET_PUBKEY");const [ata] = await findAssociatedTokenPda({ mint, owner, tokenProgram: TOKEN_PROGRAM_ADDRESS,});const createAtaIx = getCreateAssociatedTokenIdempotentInstruction({ ata, mint, owner, payer: owner, // firmante del pagador de tarifa en una app real tokenProgram: TOKEN_PROGRAM_ADDRESS, associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,});// Construir, firmar y enviar con el firmante de tu billetera conectado a los campos de pagador de tarifa y pagadorconsole.log("ATA:", ata);
init_if_needed requiere la característica cargo, o el programa no se compilará:
# Cargo.tomlanchor-lang = { version = "0.32.1", features = ["init-if-needed"] }anchor-spl = "0.32.1"
La dirección ATA se deriva del propietario, la emisión y el ID del programa de token.
create_associated_token_account_idempotent es seguro de llamar cuando la ATA puede existir.
Las restricciones associated_token de Anchor conectan la misma derivación on-chain, incluido token_program para que la derivación coincida con el programa real de la emisión.
Estos tipos anchor_spl::token son solo para el Token clásico; para una emisión que pueda ser Token-2022, usa anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface} con InterfaceAccount e Interface<'info, TokenInterface>.
use anchor_spl::associated_token::{ get_associated_token_address, get_associated_token_address_with_program_id,};// Solo Token clásico: esta utilidad codifica Tokenkeg... en las semillas.let ata = get_associated_token_address(&owner.key(), &mint.key());// Para una emisión que pueda ser Token-2022, el programa de token es parte de las semillas:let ata_any = get_associated_token_address_with_program_id( &owner.key(), &mint.key(), token_program.key,);// Comparar con la cuenta pasada en rutas de validación manual
Programa de token incorrecto en la derivación: desajuste de dirección ATA para emisiones Token-2022. Solución: pasar el ID real del programa de token de la emisión a findAssociatedTokenPda.
Enviar a una billetera sin ATA: la transferencia falla. Solución:--fund-recipient en la CLI o createAssociatedTokenIdempotent en clientes.
Asumir una cuenta de token por emisión globalmente: pueden existir múltiples cuentas no ATA. Solución: preferir ATA; validar que la dirección coincide con la derivación en programas.
El propietario es un PDA: la ATA aún funciona; el propietario es la clave pública del PDA, no una clave de firma. Solución: el programa firma como PDA al mover tokens desde una ATA propiedad del PDA.
Almacenar en caché el alquiler de ATA: los parámetros del clúster cambian. Solución: consultar getMinimumBalanceForRentExemption(165).
El PDA canónico de cuenta de token asociada para un propietario de billetera y emisión dados. Las billeteras muestran una dirección de depósito por activo SPL.
¿Pueden existir dos ATAs para el mismo propietario y emisión?
No. La derivación es determinista: solo una dirección ATA por triple (propietario, emisión, programa de token).
¿La creación de ATA cuesta SOL?
Sí. El pagador financia lamports exentos de alquiler (~2M para una cuenta de 165 bytes) más la tarifa de transacción.
¿Puede un programa poseer una ATA?
Sí. La clave pública del propietario puede ser un PDA; el programa propietario firma las transferencias con las semillas del PDA.
¿Cómo obtengo la dirección ATA sin crearla?
Derívala con findAssociatedTokenPda / spl-token address --token; la creación es un paso separado.
¿Es segura la creación idempotente para spam?
Sí. La instrucción idempotente tiene éxito independientemente de si la ATA ya existe o no.
¿Las emisiones Token-2022 usan el mismo programa ATA?
Sí, pero pasa el ID del programa Token-2022 en la derivación e instrucciones.
¿Qué pasa si transfiero a una cuenta de token aleatoria?
Funciona si la emisión de la cuenta coincide, pero la UX se rompe: los usuarios esperan direcciones ATA en exploradores y billeteras.
¿Puedo cerrar una ATA?
Sí, cuando el saldo es cero. Los lamports se devuelven a una cuenta de destino.
¿Cómo encuentran los indexadores los tokens de una billetera?
getTokenAccountsByOwner devuelve ATAs y cualquier otra cuenta de token para ese propietario.
¿Deben los protocolos pagar el alquiler de ATA?
Subsidio común de incorporación: presupuestar tesorería para create ATA por usuario por emisión.
¿Incluye @solana/kit 7.0.0 ayudantes de ATA?
Utiliza los paquetes @solana-program/token y @solana-program/associated-token junto con el RPC de kit y los constructores de transacciones.
Versiones de la pila: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 16 jul 2026