Enviar USDT programáticamente en TRON con TronWeb — TRON Wiki

Enviar USDT programáticamente en TRON con TronWeb

11 min de lectura · ⌘K buscar

Automatizar los pagos USDT en TRON (nómina, retiros, reembolsos a comerciantes) requiere crear transacciones TRC-20 transfer firmadas a través de TronWeb o API HTTP sin formato. La finalidad de ~3 segundos de TRON hace que la programática USDT sea ideal para la liquidación de alto rendimiento cuando se maneja correctamente la energía y la seguridad.

Esta guía cubre los envíos USDT de un extremo a otro desde un servicio backend.

Requisitos previos {#requisitos previos}

  • TronWeb + TronGrid Clave API
  • Cartera caliente con saldo USDT + TRX o energía congelada
  • Contrato oficial USDT: TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
  • Validación de dirección antes de cada envío.
Riesgo de billetera caliente
Las claves de firma automática son objetivos de robo. Utilice HSM, MPC o un servidor de pago dedicado con un saldo mínimo.

Conversión de monto

USDT utiliza 6 decimales:

Código
function toUsdtBaseUnits(humanAmount) {
  return Math.round(Number(humanAmount) * 1e6);
}

function fromUsdtBaseUnits(base) {
  return Number(base) / 1e6;
}

Prefiera BigInt para valores grandes.

Transferencia básica con TronWeb

Código
const TronWeb = require('tronweb');

const tronWeb = new TronWeb({
  fullHost: 'https://api.trongrid.io',
  privateKey: process.env.PAYOUT_PRIVATE_KEY,
  headers: { 'TRON-PRO-API-KEY': process.env.TRONGRID_KEY },
});

const USDT = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t';

async function sendUsdt(toAddress, amountHuman) {
  if (!tronWeb.isAddress(toAddress)) {
    throw new Error('Invalid TRON address');
  }

  const contract = await tronWeb.contract().at(USDT);
  const amount = toUsdtBaseUnits(amountHuman);

  const txid = await contract.transfer(toAddress, amount).send({
    feeLimit: 100_000_000,
    callValue: 0,
    shouldPollResponse: true,
  });

  return txid;
}

Energía y feeLimit

  • Configure feeLimit lo suficientemente alto como para evitar OUT_OF_ENERGY (punto de partida común de 100 TRX unidades solares; sintonice empíricamente).
  • Monitorear energía del remitente: tronWeb.trx.getAccountResources(address)
  • Congele TRX en la billetera de pagos para costos predecibles

Contexto de tarifas de cara al usuario: cómo enviar USDT TRC-20.

Idempotencia y seguridad

Los sistemas de pago de producción necesitan:

ControlarPropósito
Claves de idempotenciaEvitar el doble envío al reintentar
Verificación previa del saldoConsultar saldo antes de la transferencia
Lista de permitidosValidación de destinatario opcional
Volumen máximo diarioLimite la exposición de la billetera caliente
Registro de transmisiónAlmacenar txid por solicitud de pago

Confirmar entrega

Después de la transmisión:

Código
const info = await tronWeb.trx.getTransactionInfo(txid);
// info.receipt.result === 'SUCCESS'

Patrones completos: verificar API de transacción.

patrón transferFrom (custodia)

Si el usuario aprobó su contrato/gastador:

Código
await contract.transferFrom(userAddress, toAddress, amount).send({ feeLimit: 100_000_000 });

Requiere approve previo del usuario: común en DeFi, poco común en pagos simples.

Error al manejar

ErrorAcción
OUT_OF_ENERGYRecarga TRX o congela más TRX
REVERTConsultar saldo, pausa de contrato, lista negra
DUPLICADOIdempotencia: es posible que tx ya exista
Dirección no válidaRechazar en la capa de validación de API

Pruebas en Shasta

Implemente el simulacro TRC-20 con 6 decimales en Shasta o use tokens de prueba. Nunca realice pruebas con claves privadas de la red principal en repositorios.

Nota de cumplimiento

Las transferencias automatizadas USDT pueden generar obligaciones ALD dependiendo de la jurisdicción. Esta es documentación técnica, no asesoramiento legal.

Manejo de errores en producción

Envuelva .send() en try/catch. En caso de error, busque getTransactionInfo antes de volver a intentarlo; las transmisiones parciales son raras en TRON pero la idempotencia es importante. Registre la energía consumida para ajustar las cantidades congeladas de TRX en billeteras activas.

TronLink frente a la firma del servidor

Las aplicaciones del navegador deben usar TronLink window.tronWeb para las claves controladas por el usuario. Los barridos de pago del servidor utilizan una clave privada en el constructor TronWeb: se aíslan en VPC, nunca se exponen al frontend. La tesorería multifirma requiere un flujo de trabajo de permisos de cuenta en lugar de una sola clave TronWeb.

Lista de verificación para solucionar problemas

Si algo sale mal en TRON, trátelo como un problema de depuración estructurado: confirme el txid exacto en la cadena, verifique la dirección del contrato de destino y solo entonces decida si la falla es recuperable. En TRON, muchos problemas "misteriosos" son simplemente uno de: red incorrecta (mainnet vs testnet), contrato de token incorrecto (falso USDT/tokens con nombres similares), recursos insuficientes (OUT_OF_ENERGY/ancho de banda) o retraso en la interfaz de usuario/indexador entre la billetera y el explorador.

Comience con estas comprobaciones en cadena:

  • Copie siempre el txid/hash completo de su billetera o explorador.
  • Confirme el estado del resultado del tx en TronScan (SUCCESS, REVERT, OUT_OF_ENERGY o aún pendiente).
  • Compruebe si la dirección del destinatario/contrato coincide con la que desea enviar.
  • Si se trata de una llamada de contrato, confirme que el selector de función y los parámetros coincidan con el estándar de token que cree que está utilizando (TRC-20 vs TRC-10 vs BEP-20 en BSC).

Luego aplique la ruta de corrección para su categoría:

  • Confirmar el estado y los parámetros de la transacción.
  • Verificar direcciones (contrato de token, destinatario, enrutador/gastador).
  • Agregar o delegar recursos (Energía/Ancho de banda) cuando el fallo esté basado en recursos.

Errores comunes

Estos patrones causan la mayoría de los errores a nivel de usuario:

  • Usar direcciones de mainnet en testnet (o al revés).
  • Copiar un símbolo de token en lugar de la dirección del contrato TRC-20 real.
  • Firmar la dirección de aprobación/gastador incorrecta porque el enlace de la interfaz de usuario es malicioso o está desactualizado.
  • Reintentar sin cambiar la entrada fallida (por ejemplo, REVERT sigue revirtiéndose hasta que corrija el parámetro).

Si no está seguro, no “simplemente envíe de nuevo”. Realice un cambio controlado, verifique en TronScan y luego continúe.

Preguntas frecuentes

¿Cómo sé si una transacción está realmente confirmada?

Utilice TronScan y verifique el estado del resultado del tx. Las etiquetas "pendientes" de la billetera pueden retrasarse; El estado de la cadena es la fuente de la verdad. Copie txid y verifique SUCCESS/REVERT/OUT_OF_ENERGY, no solo el texto de la interfaz de usuario.

¿Por qué la interfaz de usuario difiere de TronScan?

Algunas billeteras y dApps utilizan diferentes indexadores o capas de caché. Es normal que haya un breve retraso entre la transmisión y la indexación; compare txid y espere a que la cadena se estabilice antes de concluir que hay una falla.

¿Qué debo hacer después de un REVERT?Detenga y decodifique la llamada fallida. La mayoría de los REVERT se deben a parámetros no válidos, dirección de contrato incorrecta, aprobaciones faltantes o una falta de coincidencia entre el estándar del token y el método. Solucione la causa y luego vuelva a firmar.

¿Es seguro firmar una aprobación ilimitada?

Las aprobaciones ilimitadas son seguras solo para direcciones de gastadores confiables que usted haya verificado (fuente verificada, enrutador correcto y contrato de token esperado). Para las pruebas, prefiera aprobaciones limitadas y revoque una vez que haya terminado.

¿Qué recursos requiere TRON para las llamadas de contrato?

La ejecución de contratos inteligentes consume principalmente energía, mientras que los bytes de transacciones consumen ancho de banda. Si recibe OUT_OF_ENERGY, agregue/congela/delegue energía. Si se agota el ancho de banda, concéntrese en mantener suficiente líquido TRX para bytes y asignación de recursos.

¿Cómo puedo reducir los tickets de soporte?

Muestre a los usuarios un mensaje claro de "qué sucedió" basado en el estado de la cadena y vincule directamente a la guía relevante (pendiente, fallida, sin energía o verificación). Guarda txid para que puedas conciliar rápidamente.

Guías relacionadas

Preguntas frecuentes

¿Cuánta energía utiliza una transferencia USDT?

Aproximadamente 65,000 Energía en la red principal para una transferencia estándar TRC-20 cuando el destinatario ya tiene USDT. Los destinatarios nuevos pueden costar más.

¿Puedo enviar USDT sin TRX en la misma billetera?

La cuenta emisora ​​necesita Energía o TRX para consumir tarifas. USDT por sí solo no puede pagar los recursos de la red.

¿Cómo puedo agrupar muchos pagos?

Bucle con limitación de velocidad: TRON no tiene procesamiento por lotes ERC-4337 nativo. Considere el trabajador de cola con límite de concurrencia.

No. El servidor usa una clave privada directamente a través de TronWeb.

¿Dirección incorrecta enviada mediante programación?

Irreversible. Valide tronWeb.isAddress() y, opcionalmente, confirme los patrones de suma de verificación.