我在我的项目中使用 ether.js,并通过 Infura 建立了 Websocket 连接。我找不到直接监听特定地址交易的简单方法。作为解决方法,我在挂起的挂钩中合并了一个过滤器。这种方法在一定程度上发挥了作用,但性能并不是最优的,而且只是暂时的。由于每笔交易都是在钩子内请求的,因此每天的请求限制很快就会被突破。
如果有人了解如何正确配置 Websocket 连接以侦听特定地址的待处理交易,我将非常感谢您的帮助!
const wsProvider = new InfuraWebSocketProvider('sepolia', API_KEY);
export const initTransactionsListener = (address: string): WebSocketListener => {
wsProvider.on('pending', async (tx: string) => {
const transaction = await wsProvider.getTransaction(tx);
if ([null, undefined].includes(transaction)) {
return;
}
const { from, to } = transaction;
if (![from, to].includes(address)) {
return;
}
console.log('Transaction', transaction)
});
return {
destroy: async () => await wsProvider.destroy()
};
};
下面的代码将解决您的问题。修改以适合您的使用
provider.on("pending", (txHash) => {
const address = "address you want to listen for trx";
provider.getTransaction(txHash).then(function (transaction) {
//console.log(transaction?.from);
const from = transaction?.from;
const to = transaction?.to;
const value =transaction?.value;
if (from === address) {
process.stdout.write(`[${(new Date).toLocaleTimeString()}] Outgoing transfer: ${value} ETH to ${to} \r`);
//console.log(`Outgoing transfer: ${value} ETH to ${to}`);
} else if (to === address) {
//console.log(`Incoming transfer: ${value} ETH from ${from}`);
process.stdout.write(`[${(new Date).toLocaleTimeString()}] Incoming transfer: ${value} ETH to ${from} \r`);
}else {
console.log('Unknown transfer');
}
console.log(`[${(new Date).toLocaleTimeString()}] => Monitoring address: ${address}`);
});
});