Oyentes de eventos con TronWeb: monitorear transferencias TRC-20 en TRON
La detección de depósitos USDT en tiempo real impulsa los intercambios, pasarelas de pago y plataformas de juegos en TRON. En lugar de sondear balanceOf cada segundo, los sistemas de producción escuchan los eventos Transfer emitidos por el contrato USDT cuando los fondos llegan a las direcciones monitoreadas.
Esta guía cubre la mecánica de eventos, consultas TronGrid, patrones TronWeb y arquitectura escalable.
TRC-20 Evento de transferencia
event Transfer(address indexed from, address indexed to, uint256 value);
Tema0 (hash de firma del evento):
ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
Los from y to indexados permiten el filtrado por destinatario, algo fundamental para las carteras de depósito.
USDT contrato: TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
TronGrid API de eventos
Patrón (consulte los últimos documentos TronGrid para conocer la ruta exacta):
GET /v1/contracts/{contractAddress}/events?event_name=Transfer&only_confirmed=true
Filtre del lado del cliente o mediante parámetros API para la dirección to que coincida con su billetera de depósito.
Encabezados: TRON-PRO-API-KEY
Pagina con fingerprint para sincronización histórica.
Ejemplo de trabajador electoral
const USDT = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t';
let lastTimestamp = Date.now() - 60_000;
async function pollTransfers(depositAddress) {
const url = `https://api.trongrid.io/v1/contracts/${USDT}/events?event_name=Transfer&only_confirmed=true&min_block_timestamp=${lastTimestamp}`;
const res = await fetch(url, {
headers: { 'TRON-PRO-API-KEY': process.env.TRONGRID_KEY },
});
const { data } = await res.json();
for (const ev of data || []) {
const to = tronWeb.address.fromHex(ev.result.to);
if (to !== depositAddress) continue;
const value = Number(ev.result.value) / 1e6;
await creditDeposit(ev.transaction_id, value, ev);
}
lastTimestamp = Date.now();
}
setInterval(() => pollTransfers(process.env.DEPOSIT_ADDRESS), 5000);
TronWeb eventos de contrato
const contract = await tronWeb.contract().at(USDT);
// Historical — depends on TronWeb version / node support
const events = await contract.Transfer().get({
filters: { to: depositAddressHex },
fromBlock: 0,
toBlock: 'latest',
});
El soporte varía: TronGrid REST es más confiable para los indexadores de producción.
Direcciones de depósito por usuario
Dos patrones:
| Patrón | Ventajas | Contras |
|---|---|---|
| Billetera única + igualación de montos | Un oyente | Riesgo de colisión |
| Dirección única de billetera HD por usuario | Atribución limpia | Más claves para gestionar |
El filtro de eventos en el campo to funciona mejor con direcciones únicas.
Flujo de pago completo: aceptar API de pagos USDT.
Idempotencia
Clave: transaction_id + event_index o índice de registro
Antes de acreditar:
- Verifique la base de datos para ver si hay txid existente
- Verificar transacción SUCCESS
- Confirmar que el contrato es oficial USDT
- Usuario de crédito
Escalando
Alto volumen:
- Ejecute un indexador dedicado que consuma TronGrid o un complemento de evento autohospedado
- Cola de eventos para Kafka/RabbitMQ
- Trabajadores horizontales con partición por rango de direcciones.
- Archivar cursores antiguos en Redis
Expectativas de latencia
TRON ~3s de tiempo de bloqueo → intervalo de sondeo de 3 a 5s razonable. Una experiencia de usuario más rápida muestra "confirmación" hasta que N bloques se solidifican.
Escalar la indexación de eventos
En grandes volúmenes, ejecute un indexador dedicado que almacene eventos en PostgreSQL en lugar de sondear TronGrid desde los controladores de solicitudes. Deduplicar mediante transactionId + logIndex. Manejar reorganizaciones de cadena: poco común en TRON pero indexa blockNumber para la lógica de reproducción.
Referencia de firma del evento de transferencia
USDT Transferir evento tema0 (keccak256): ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. Filtre topic2 para la dirección del destinatario (rellenado a 32 bytes). Decodifica el campo data como cantidad uint256. Un relleno incorrecto provoca depósitos perdidos: use el decodificador ABI TronWeb en lugar del corte hexadecimal manual cuando sea posible.
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 real del contrato TRC-20.
- 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
- Aceptar API de pagos USDT
- TronGrid Guía API
- Verificar API de transacción
- TRON Referencia de API HTTP
Preguntas frecuentes
¿Qué evento emite USDT durante la transferencia?
TRC-20 Transferencia (dirección indexada desde, dirección indexada hacia, valor uint256): tema0 es el hash de firma del evento keccak256.
¿Puede TronWeb suscribirse como WebSocket en Ethereum?
Las herramientas TRON normalmente utilizan puntos finales de eventos TronGrid de sondeo o ejecutan su propio complemento de eventos, no idéntico a eth_subscribe.
¿Hasta qué fecha puedo consultar eventos?
TronGrid conserva eventos indexados: use la paginación para sincronizar el historial completo en una nueva implementación.
¿Las transacciones internas emiten Transferencia?
USDT transfer es la llamada estándar TRC-20; aparece en los registros si se realiza correctamente. Analizar los registros de transmisión principales.
¿Eventos USDT falsos?
Filtre contract_address estrictamente: los tokens de phishing emiten eventos con nombres similares a partir de contratos incorrectos.
Gracias — tu feedback nos ayuda a mejorar la documentación.