Avanzado iconAvanzado

Actualizado: 2025-09-03

Avanzado iconAvanzado

Actualizado: 2025-09-03
Guía de nivel experto: Esta guía completa cubre la recuperación avanzada de cuentas de tokens de Solana utilizando JavaScript/TypeScript. Requiere conocimientos técnicos y conlleva el riesgo de pérdida de fondos si se ejecuta incorrectamente.

Recuperación completa de cuentas de tokens de Solana

Los desarrolladores avanzados de Solana pueden recuperar SOL de cuentas de tokens asociadas (ATA) vacías y cerrar cuentas de tokens SPL no utilizadas utilizando JavaScript/TypeScript con las bibliotecas oficiales de Solana. Este proceso manual proporciona el máximo control sobre la limpieza de cuentas de tokens, la recuperación de rentas y la optimización del monedero.

Requisitos previos para la recuperación avanzada:
  • Node.js 16+ y npm/yarn instalados
  • Comprensión del modelo de cuentas de Solana y la mecánica de rentas
  • Acceso a las claves privadas del monedero o frases semilla
  • Conocimiento de las instrucciones del programa de tokens SPL
  • Familiaridad con JavaScript/TypeScript y programación asíncrona
  • Comprensión básica de la construcción de transacciones en Solana
¿Por qué JavaScript/TypeScript?
  • La documentación oficial de Solana y los ejemplos están principalmente en JS/TS
  • Ecosistema maduro con @solana/web3.js y @solana/spl-token
  • Soporte activo de la comunidad y tutoriales extensos
  • Web3.js 2.0 (lanzado en noviembre de 2024) ofrece un mejor rendimiento
  • Integración más fácil con aplicaciones web y monederos
Potencial de recuperación
ATA estándar:
0.002 SOL por cuenta
Límite por lote:
20 cuentas por transacción
Costos de transacción:
~0.000005 SOL por firma
Tasa de recuperación neta:
99%+ de la renta bloqueada

Configuración del proyecto y dependencias

Dependencias requeridas

Comandos de instalación:
# Web3.js 2.0 (Latest - Recommended)
npm install @solana/web3.js@2

# OR Web3.js 1.x (Stable)
npm install @solana/web3.js@1

# SPL Token Library
npm install @solana/spl-token

# Additional utilities
npm install bs58 bip39 ed25519-hd-key

Conexión del monedero y gestión de claves

Método 1: Clave privada (Base58)
import { Connection, Keypair } from '@solana/web3.js';
import bs58 from 'bs58';

const connection = new Connection(
  'https://api.mainnet-beta.solana.com'
);

const secretKey = 'YOUR_BASE58_PRIVATE_KEY';
const keypair = Keypair.fromSecretKey(
  bs58.decode(secretKey)
);
Exportar claves privadas desde Phantom: Configuración → Exportar clave privada
Método 2: Recuperación de frase semilla
import { Keypair } from '@solana/web3.js';
import * as bip39 from 'bip39';
import { derivePath } from 'ed25519-hd-key';

const mnemonic = 'your twelve word seed phrase';
const seed = await bip39.mnemonicToSeed(mnemonic);
const derivedSeed = derivePath(
  "m/44'/501'/0'/0'", seed.toString('hex')
).key;

const keypair = Keypair.fromSeed(derivedSeed);
Ruta de derivación estándar de Solana: m/44'/501'/0'/0'
Medidas de seguridad críticas:
  • Nunca almacenes claves privadas en texto plano en el código de producción
  • Usa variables de entorno para datos sensibles
  • Prueba todas las operaciones en devnet primero
  • Guarda copias de seguridad de los pares de claves en lugares seguros
  • Considera usar monederos de hardware para grandes cantidades

Descubrimiento y análisis de cuentas de tokens

Encontrar todas las cuentas de tokens

import {
  TOKEN_PROGRAM_ID,
  getAccount
} from '@solana/spl-token';

async function findAllTokenAccounts(walletAddress) {
  // Get all token accounts
  const tokenAccounts = await connection.getTokenAccountsByOwner(
    walletAddress,
    { programId: TOKEN_PROGRAM_ID }
  );

  // Categorize accounts
  const emptyAccounts = [];
  const accountsWithTokens = [];

  for (const account of tokenAccounts.value) {
    const accountInfo = await getAccount(connection, account.pubkey);
    if (accountInfo.amount === 0n) {
      emptyAccounts.push(account.pubkey);
    } else {
      accountsWithTokens.push({
        pubkey: account.pubkey,
        mint: accountInfo.mint,
        amount: accountInfo.amount
      });
    }
  }

  return { emptyAccounts, accountsWithTokens };
}
Soporte para Token-2022:
import { TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';

// For Token Extensions (Token-2022)
{ programId: TOKEN_2022_PROGRAM_ID }
Reference: https://spl.solana.com/token-2022

Operaciones de quema de tokens

🚨 FLUJOS DE TRABAJO CRÍTICOS - Sigue este orden:
  1. Paso 1: Identificar - Encuentra todas las cuentas de tokens y clasifícalas
  2. Paso 2: Quemar primero - Si deseas destruir tokens con saldo > 0, quémalos primero
  3. Paso 3: Cerrar después - Solo cierra cuentas que estén 100% vacías

⚠️ ¡NUNCA cierres cuentas con saldos de tokens > 0 - Perderás tokens valiosos para siempre!

Quema de tokens individual
import {
  createBurnInstruction,
  Transaction,
  sendAndConfirmTransaction
} from '@solana/spl-token';

async function burnTokens(
  tokenAccount, mint, owner, amount
) {
  const instruction = createBurnInstruction(
    tokenAccount, // Token account
    mint, // Mint account
    owner, // Owner
    amount // Amount to burn
  );

  const transaction = new Transaction().add(instruction);
  return await sendAndConfirmTransaction(
    connection, transaction, [ownerKeypair]
  );
}

Quema tokens de forma permanente, reduciendo el suministro total y preparando las cuentas para el cierre.

Quema de tokens por lotes
async function burnAllTokensInAccounts(accountsWithTokens) {
  for (const account of accountsWithTokens) {
    console.log(
      `Burning {account.amount} tokens from {account.pubkey}`
    );

    await burnTokens(
      account.pubkey,
      account.mint,
      ownerKeypair.publicKey,
      account.amount
    );

    // Rate limiting
    await new Promise(r => setTimeout(r, 2000));
  }
}
⚠️ ADVERTENCIA: ¡Esto destruye tokens permanentemente! Solo quema tokens sin valor o no deseados.

Cierre de cuentas de tokens asociadas

Cierre de cuenta individual
import {
  createCloseAccountInstruction
} from '@solana/spl-token';

async function closeEmptyTokenAccount(
  tokenAccount, owner, recipient
) {
  // CRITICAL: Verify account is empty first
  const accountInfo = await getAccount(
    connection, tokenAccount
  );
  if (accountInfo.amount !== 0n) {
    throw new Error('Account must be empty!');
  }

  const instruction = createCloseAccountInstruction(
    tokenAccount, // Empty token account
    recipient, // SOL recipient
    owner // Account owner
  );

  const transaction = new Transaction().add(instruction);
  return await sendAndConfirmTransaction(
    connection, transaction, [ownerKeypair]
  );
}

Cierra cuentas de tokens VACÍAS individuales y recupera 0.002 SOL de renta por cuenta.

Cierre masivo de cuentas vacías
async function closeAllEmptyAccounts(emptyAccounts) {
  const batchSize = 20; // Max per transaction
  const results = [];

  for (let i = 0; i < emptyAccounts.length; i += batchSize) {
    const batch = emptyAccounts.slice(i, i + batchSize);
    const transaction = new Transaction();

    // Double-verify all accounts are empty
    for (const account of batch) {
      const info = await getAccount(connection, account);
      if (info.amount !== 0n) {
        throw new Error(`Account not empty: {account}`);
      }
      transaction.add(
        createCloseAccountInstruction(
          account, recipient, owner
        )
      );
    }

    const signature = await sendAndConfirmTransaction(
      connection, transaction, [ownerKeypair]
    );
    results.push(signature);

    // Rate limiting
    await new Promise(r => setTimeout(r, 1000));
  }

  return results;
}
✅ Procesamiento masivo seguro con doble verificación de que las cuentas están vacías.

Tarifas prioritarias para confirmación más rápida

Agregar instrucciones de presupuesto de cómputo

import { ComputeBudgetProgram } from '@solana/web3.js';

// Add priority fee for faster confirmation
transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: 1000 // 0.000001 SOL
  })
);

// Optional: Set compute unit limit
transaction.add(
  ComputeBudgetProgram.setComputeUnitLimit({
    units: 200000
  })
);
Las tarifas prioritarias ayudan a garantizar una confirmación de transacción más rápida durante la congestión de la red. Ajusta los microLamports según las condiciones actuales de la red.

Resolución de problemas y problemas comunes

Fallos de transacción
  • Cuenta no vacía: Verifica que el saldo de tokens sea exactamente 0
  • Desajuste de autoridad: Asegúrate de que el monedero sea propietario de la cuenta
  • SOL insuficiente: Se necesita SOL para las tarifas de transacción
  • Congestión de la red: Agrega tarifas prioritarias o intenta de nuevo más tarde
Problemas de RPC y red
  • Limitación de tasa: Agrega retrasos entre solicitudes (1-2 segundos)
  • Errores de tiempo de espera: Usa un proveedor de RPC confiable (Helius, QuickNode)
  • Blockhash expirado: Obtén un blockhash reciente nuevo
  • Errores 429: Implementa retroceso exponencial
Consejos de optimización
  • Operaciones por lotes: Agrupa hasta 20 cuentas por transacción
  • Manejo de errores: Usa bloques try/catch con lógica de reintento
  • Filtros de cuenta: Filtra previamente las cuentas vacías del lado del cliente
  • Pruebas: Siempre prueba en devnet primero
Alerta de seguridad - Diciembre 2024:

Las versiones 1.95.6 y 1.95.7 de @solana/web3.js fueron comprometidas. Siempre usa la última versión:

npm install @solana/web3.js@latest

Mejores prácticas de seguridad y recursos

Medidas de seguridad críticas:
  • Prueba todas las operaciones en devnet primero
  • Usa variables de entorno para claves privadas
  • Verifica las direcciones del monedero antes de la ejecución
  • Mantén @solana/web3.js actualizado a la última versión
  • Monitorea las transacciones en exploradores de Solana
  • Usa monederos de hardware para grandes cantidades
  • Nunca cierres cuentas con saldos de tokens > 0
  • Siempre verifica dos veces el estado de las cuentas antes de las operaciones
Recursos oficiales:

Para usuarios que no se sienten cómodos con la codificación, las herramientas automatizadas ofrecen alternativas más seguras:

  • SweepSOL: Recuperación automatizada basada en GUI
  • Verificación profesional y controles de seguridad
  • Soporte técnico y orientación