Skip to content

Instantly share code, notes, and snippets.

@chiro-hiro
Created December 15, 2022 06:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chiro-hiro/1ec9563d900462af8b5e961a41af0143 to your computer and use it in GitHub Desktop.
Save chiro-hiro/1ec9563d900462af8b5e961a41af0143 to your computer and use it in GitHub Desktop.
A wrapper of real JSON RPC provider
import { ethers } from 'ethers';
import { TillSuccess } from 'noqueue';
// Let's consider this is a dirty trick, to force the JSON RPC
// to retries several times before give up
function getFakeProvider(
provider: ethers.providers.StaticJsonRpcProvider,
): ethers.providers.StaticJsonRpcProvider {
const fakeProvider = {};
const injected: string[] = [];
for (let k in provider) {
// Inject public methods
if (typeof provider[k] === 'function' && !k.startsWith('_')) {
injected.push(k);
fakeProvider[k] = (...args: any[]) => {
console.log(`Injected ${k}() ha ha`);
// Retries 3 times every 3 secs
return TillSuccess(async () => provider[k](...args), 3000, 3);
};
}
}
return new Proxy(provider, {
get(target, p, receiver) {
if (injected.includes(p as string)) {
return Reflect.get(fakeProvider, p, target);
}
return Reflect.get(target, p, receiver);
},
});
}
(async () => {
let provider = new ethers.providers.StaticJsonRpcProvider(
'https://bsc-dataseed.binance.org/',
);
let faker = getFakeProvider(provider);
console.log(await faker.getBlock('latest'));
console.log(faker._isProvider);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment