I use ethers
to connect to ethereum contract and listen for its events.
This is how I set it up:
const provider = new ethers.WebSocketProvider(providerUrl);
const contract = new ethers.Contract(
contractAddress,
contractABI,
provider
);
and after that I just connect to its events:
contract.removeAllListeners("EventName");
contract.on("EventName",(data)=>{
...rest of the code
})
I remove all events first to be sure there are no other listeners. When I get events constantly everything works fine. The problem is when I do not get any events for some time, usually like 30+ minutes with no event. It looks like it just stops and does not listen any more events and I have to restart the app. I've tried fixing it by adding a filter for all txs:
const filter = {
fromBlock: "latest",
toBlock: "latest",
topics: [],
};
provider.on(filter, (log, event) => {});
but it doesn't work, it still disconnects. I've also tried to ping it by getting block number each few minutes but still nothing.
I use ethers
version 6.7.1
. I cannot find any information about reconnecting to websockets. I found it in previous ethers
version but it looks like it was removed in version 6.7.1
.
Any help is highly appreciated.
I fixed it finally by adding a wrapper for Websocket connection and reconnecting when it disconnects:
It works fine but for some reason it disconnects very often, looks like each 5-10 minutes when my provider (in this example Chainstack) should disconnect after 1 hour (reading their docs).