如何用TronWeb监听TRON链USDT合约事件并按接收地址过滤
正确实现TRON USDT Transfer事件过滤(仅监听指定目标地址)
你原代码的问题有两个:一是filters的语法错误(缺少冒号),二是没有将base58地址转换为合约事件对应的十六进制格式——TRON合约事件中地址参数以十六进制形式存储,直接用base58地址无法匹配过滤规则。
以下是修正后的完整代码:
const fullNode = 'https://api.shasta.trongrid.io'; const solidityNode = 'https://api.shasta.trongrid.io'; const eventServer = 'https://api.shasta.trongrid.io'; const tronweb = new TronWeb(fullNode, solidityNode, eventServer); // 目标接收地址(base58格式) const targetAddress = 'TGdMonBPqH9THEhgNxMtHEcnxgbXxUuXeX'; // 转换为合约事件兼容的十六进制格式(去掉0x前缀) const targetHexAddress = tronweb.address.toHex(targetAddress).replace('0x', ''); async function watchTargetTransfers() { try { const contract = await tronweb.contract().at('TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs'); // 正确配置过滤规则,仅监听转到目标地址的Transfer事件 const eventWatcher = await contract.Transfer().watch({ filters: { to: targetHexAddress } }, (err, res) => { if (err) { console.error('监听异常:', err); return; } if (res) { console.log('捕获目标转账事件:', res); // 在这里执行你的数据库更新逻辑 } }); console.log('事件监听器已启动'); } catch (error) { console.error('初始化失败:', error); } } watchTargetTransfers();
关键细节说明:
- 地址格式转换:TRON合约事件返回的地址参数是不带
0x前缀的十六进制字符串,因此需要用tronweb.address.toHex()将base58地址转格式后,再移除0x前缀才能匹配过滤。 - 过滤规则语法:原代码中
filters{}是语法错误,必须写成filters: {}的标准键值对形式。 - 多条件过滤扩展:如果需要同时限制转出地址,可以在filters中添加
from字段,同样传入转换后的十六进制地址即可。
内容的提问来源于stack exchange,提问作者Remi_la
相关产品推荐
相关产品推荐

