Created
March 17, 2022 12:03
-
-
Save uF4No/6079b8caa2f9c5cb53f99ed1c0def569 to your computer and use it in GitHub Desktop.
how to use multiple RPC endpoints with ethers to reconnect on error
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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