Skip to content

Instantly share code, notes, and snippets.

@uF4No
Created March 17, 2022 12:03
Show Gist options
  • Save uF4No/6079b8caa2f9c5cb53f99ed1c0def569 to your computer and use it in GitHub Desktop.
Save uF4No/6079b8caa2f9c5cb53f99ed1c0def569 to your computer and use it in GitHub Desktop.
how to use multiple RPC endpoints with ethers to reconnect on error
const { ethers } = require('ethers')
const endpoints = [
// main rpc endpoint
'http://localhost:8545',
// fallback one
'https://fallback-rpc-endpoint/12345',
// fallback two
'https://another-fallback-rpc-endpoint/12345',
]
let ethersProvider
let retries = 0
let isAlive = false
const initProvider = async () => {
// reset
isAlive = false
retries = 0
console.log('Initialising Ethers provider', retries)
while (!isAlive) {
if (retries > endpoints.length) {
console.log('All nodes are down!')
break
}
try {
console.log(`${retries} try, now with enpoint ${endpoints[retries]}`)
// for WSS
// ethersProvider = new ethers.providers.WebSocketProvider(endpoints[retries])
// For HTTP providers
ethersProvider = new ethers.providers.JsonRpcProvider(endpoints[retries])
// ethersProvider.ready() does not work 😕
isAlive = await ethersProvider.getNetwork()
console.log('isAlive :>> ', isAlive)
// For WSS providers
// ethersProvider.on('error', async () => {
// console.log('Error captured >>>>>>>>', error)
// isAlive = false
// await initProvider()
// })
} catch (error) {
console.error('Error initialising provider')
retries++
}
}
}
// blockchain example method
const checkBlock = async () => {
try {
return await ethersProvider.getBlockNumber()
} catch (error) {
console.error(error)
throw error
}
}
const main = async () => {
await initProvider()
//
try {
let blockN = await checkBlock()
console.log('block number is :>> ', blockN)
} catch (error) {
initProvider()
}
// forces error
ethersProvider = null
try {
blockN = await checkBlock()
console.log('block number is :>> ', blockN)
} catch (error) {
initProvider()
}
try {
blockN = await checkBlock()
console.log('block number is :>> ', blockN)
} catch (error) {
initProvider()
}
try {
blockN = await checkBlock()
console.log('block number is :>> ', blockN)
} catch (error) {
initProvider()
}
try {
blockN = await checkBlock()
console.log('block number is :>> ', blockN)
} catch (error) {
initProvider()
}
}
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment