const { JsonRpcProvider } = require('@ethersproject/providers');
const { ethers } = require("ethers");
const erc20ABI = require('./abi/erc20.json');
const TARGET_CONTRACT = '0x1f3Af095CDa17d63cad238358837321e95FC5915';
return new Promise(resolve => setTimeout(resolve, sec * 1000));
async function checkEvents(contract, fromBlock, toBlock = 'latest') {
const events = await contract.queryFilter('*', fromBlock, toBlock);
console.log(`[SKIP_REMOVED] ${event.transactionHash}`);
if (event.event === 'Transfer' && event.args) {
console.log('Transfer event detected:', event);
async function runForever() {
const provider = new JsonRpcProvider(getRandomRPCServer());
const contract = new ethers.Contract(TARGET_CONTRACT, erc20ABI, provider);
let recentBlock = await provider.getBlockNumber();
let lastCheckedBlock = recentBlock - 4999; // Max API limit: 5000
let fromBlock = lastCheckedBlock + 1;
logger(`First, fetch from the last checked block: #${fromBlock} - #${recentBlock}`);
// This will fetch all events from [fromBlock - recentBlock]
await checkEvents(contract, fromBlock);
await sleep(3); // BSC block speed: 3 secs
fromBlock = recentBlock + 1;
recentBlock = await provider.getBlockNumber();
// If we are faster than block mining
if (fromBlock >= recentBlock) {
console.log(`#${fromBlock} block is not mined yet. Wait..`);
console.log(`Check blocks: #${fromBlock} - #${recentBlock}`);
await checkEvents(contract, fromBlock); // Check [fromBlock - recentBlock]
fromBlock = recentBlock + 1;