Presentamos los balances históricos de tokens de Solana
Autor: Alchemy

Pregúntale a una wallet de Solana qué tiene hoy y cualquier nodo puede responder en una sola llamada. Pregúntale qué tenía la primavera pasada, o en el momento exacto justo antes de que la vaciaran, y el camino fácil desaparece. Los nodos entregan balances actuales. No mantienen un registro continuo de quién tuvo qué, y cuándo. Así que la respuesta honesta a "qué tenía esta wallet en ese momento" ha sido: reconstrúyelo tú mismo.
Hoy eso cambia. getTokenAccountsByOwnerAtSlot devuelve todo lo que una wallet tenía en cualquier punto pasado del tiempo, con balances exactos, en una sola llamada.
El problema de reconstruir el historial
El getTokenAccountsByOwner estándar solo responde una pregunta: qué tiene esta wallet en este momento. Eso cubre la mayoría de los flujos de apps en producción, pero deja sin respuesta toda una categoría de preguntas.
Para reconstruir un balance pasado tú mismo, tienes que reproducir la vida de la cuenta. Obtienes el historial completo de firmas de la wallet con getSignaturesForAddress, traes cada transacción con getTransaction, y luego vuelves a derivar los balances slot por slot hasta tu punto objetivo. Para una wallet activa, eso son miles de llamadas, mucho parseo, y bastante margen para equivocarse en los cálculos. Los nodos archivales ayudan a leer estado antiguo, pero tampoco responden directamente "lista las cuentas de token de este owner en el slot X".
Cómo funciona
El método mantiene la sintaxis que ya conoces de getTokenAccountsByOwner y agrega una cosa: un slot. Un slot es el reloj de Solana, aproximadamente un bloque, así que pasar un slot significa "dame esta wallet tal como estaba en ese punto exacto de la historia".
Al llamarlo, obtienes de vuelta las token accounts de la wallet, los registros individuales que contienen cada token que posee una wallet. En Solana una wallet no tiene balances directamente, así que listar estas cuentas es la forma de leer las tenencias. Cada una viene con su balance y sus lamports, la pequeña cantidad de SOL (fracciones de una moneda, 1 SOL equivale a 1,000 millones de lamports) que toda cuenta lleva para existir on-chain. El método cubre los dos estándares de token de Solana: SPL Token, el original detrás de prácticamente todos los tokens conocidos como USDC, y Token-2022, la versión más nueva con extras como comisiones de transferencia y balances confidenciales. Esos estándares viven bajo IDs de programa distintos, así que un filtro por programId solo devuelve las cuentas de ese programa.
Detrás de la llamada hay un índice histórico construido de forma continua, un registro versionado de cada token account a lo largo del tiempo: quién tuvo cada cuenta, cuánto, y entre qué slots, mantenido al día conforme llegan nuevos bloques. Puedes acotar una consulta de dos formas. Por mint, para leer el balance de un solo token en un slot pasado. O por programa, para listar cada token account que pertenecía a ese programa en ese slot. Para un portafolio completo entre ambos estándares, llama una vez con el ID del programa SPL Token y otra con el ID del programa Token-2022, y luego combina los resultados. El ejemplo de abajo se acota solo a SPL Token.
const res = await fetch("https://solana-mainnet.g.alchemy.com/v2/{ALCHEMY_API_KEY}", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getTokenAccountsByOwnerAtSlot",
params: [
"89zoESAF7JqYQz5uhf5eYwg3QsKXQy5QFs4WZQ4hMPnb",
{ programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
{ encoding: "jsonParsed", slot: 80000000 }
]
})
});
console.log(await res.json());La paginación se mantiene consistente porque el pageKey fija el slot que pediste. La punta de la cadena puede avanzar mientras paginas, y tus resultados siguen describiendo el mismo punto en el tiempo, hasta 10,000 cuentas por página.
Por qué importa
Las tenencias en un punto específico del tiempo se convierten en una consulta de primera clase. El pipeline de indexación que de otro modo tendrías que construir y mantener se reduce a una sola llamada RPC, lo que libera a tu equipo para trabajar en el producto en lugar de en la plomería.
Eso habilita trabajo que antes era doloroso:
- Snapshots de portafolio y PnL en cualquier momento histórico
- Cost basis y reportes de impuestos vinculados a slots o fechas específicas
- Trabajo de disputas, forense e incidentes, como mostrar qué tenía una wallet el bloque antes de ser vaciada
- Pipelines de analítica e indexación que necesitan estado histórico preciso sin necesidad de reproducir la cadena
Verificamos los resultados contra la verdad on-chain durante las pruebas. Las consultas históricas muestreadas coincidieron exactamente con los balances y lamports de la cadena, incluyendo historial profundo como un balance de KIN en el slot 80,000,000.
Cómo empezar
El método está disponible en el endpoint estándar de Solana mainnet, así que si ya envías RPC de Solana a través de Alchemy puedes llamarlo con tu API key existente. Apunta a https://solana-mainnet.g.alchemy.com/v2/{ALCHEMY_API_KEY}, agrega un slot, y lee las tenencias de vuelta.
Consulta la guía de inicio rápido de Solana API para configurar una key y enviar tu primera solicitud.
Preguntas frecuentes
¿Qué hace getTokenAccountsByOwnerAtSlot?
Devuelve las token accounts de una wallet de Solana, con balances y lamports, tal como estaban en un slot pasado que tú especificas. Tiene la misma forma que getTokenAccountsByOwner, más un parámetro slot.
¿Qué son SPL Token y Token-2022?
Son los dos estándares de token de Solana. SPL Token es el original y cubre prácticamente todos los tokens conocidos de la red. Token-2022 es la versión más nueva que agrega funciones opcionales como comisiones de transferencia y balances confidenciales. El método cubre ambos.
¿En qué se diferencia de getTokenAccountsByOwner?
getTokenAccountsByOwner devuelve solo las tenencias actuales. getTokenAccountsByOwnerAtSlot responde la misma pregunta en cualquier slot pasado, leyendo de un índice histórico en lugar del estado en vivo del nodo.
¿Necesito un nodo archival o un indexador propio?
No. El método lee un índice histórico ya construido, así que no necesitas operar infraestructura archival ni reproducir el historial de transacciones tú mismo.
¿Puedo consultar el portafolio completo de una wallet, no solo un token?
Sí, pero no en una sola llamada a programId si la wallet tiene ambos estándares. Acota por mint para un solo token, o por programId para cada cuenta bajo ese programa en un slot. SPL Token y Token-2022 usan IDs de programa distintos, así que para un portafolio completo debes consultar ambos y combinar las respuestas.
¿Cómo se mantiene precisa la paginación mientras avanza la cadena?
El pageKey fija el slot de tu consulta, así que los resultados se mantienen consistentes entre páginas incluso cuando llegan nuevos bloques, hasta 10,000 cuentas por página.
Boletín de Alchemy
Entérate primero de los lanzamientos
Suscríbete a nuestro boletín
Recibe las últimas actualizaciones de productos y recursos de Alchemy
Al ingresar tu correo electrónico, aceptas recibir nuestras comunicaciones de marketing y actualizaciones de productos. Reconoces que Alchemy procesa la información que recibimos de acuerdo con nuestro Aviso de Privacidad. Puedes cancelar tu suscripción en cualquier momento.
Artículos relacionados

Glamsterdam: la guía completa para desarrolladores de Ethereum
Glamsterdam ya está en Sepolia. La guía completa sobre lo que significa para los desarrolladores y cómo Alchemy se preparó para la actualización de la red.

¿Con qué proveedor de RPC deberías construir en Tokio?
Comparamos cinco de los proveedores de RPC que sirven Tokio en cinco cadenas. Así se comparan, y dónde importan las diferencias para los equipos sensibles a la latencia.

Diseño de lecturas RPC de Solana para velocidad y confiabilidad líderes en la industria
Alchemy tiene la latencia de lectura de Solana más baja: 9.21 ms, cerca de 26% más rápido que el siguiente proveedor.