From ea0c1257b2a33533379d5119d19a5bf2d0c7cdd1 Mon Sep 17 00:00:00 2001 From: Jake Naviasky Date: Wed, 4 Aug 2021 14:36:18 -0400 Subject: [PATCH] Raises polling interval to 12s from 4s to reduce infura load. (#70) * Refactor provider init and update polling. * Lower to 12s. --- package.json | 2 +- scripts/listener.ts | 2 +- src/aave/subscribeFunc.ts | 24 ++---------------------- src/erc20/subscribeFunc.ts | 24 ++---------------------- src/eth.ts | 28 ++++++++++++++++++++++++++++ src/marlin/subscribeFunc.ts | 24 ++---------------------- src/moloch/subscribeFunc.ts | 24 ++---------------------- 7 files changed, 38 insertions(+), 90 deletions(-) create mode 100644 src/eth.ts diff --git a/package.json b/package.json index 624df25d5df..3a84e926904 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@commonwealth/chain-events", - "version": "0.7.1", + "version": "0.7.2", "description": "Listen to various chains for events.", "license": "GPL-3.0", "files": [ diff --git a/scripts/listener.ts b/scripts/listener.ts index 08735408112..1a27d607855 100644 --- a/scripts/listener.ts +++ b/scripts/listener.ts @@ -46,7 +46,7 @@ const networkUrls = { aave: 'wss://mainnet.infura.io/ws', 'aave-local': 'ws://127.0.0.1:9545', 'dydx-ropsten': 'wss://ropsten.infura.io/ws', - 'dydx': 'wss://mainnet.infura.io/ws', + dydx: 'wss://mainnet.infura.io/ws', erc20: 'wss://mainnet.infura.io/ws', } as const; diff --git a/src/aave/subscribeFunc.ts b/src/aave/subscribeFunc.ts index f18fd9e46fe..fec0eaa4079 100644 --- a/src/aave/subscribeFunc.ts +++ b/src/aave/subscribeFunc.ts @@ -1,7 +1,6 @@ -import { providers } from 'ethers'; -import Web3 from 'web3'; import sleep from 'sleep-promise'; +import { createProvider } from '../eth'; import { IDisconnectedRange, CWEvent, @@ -32,27 +31,8 @@ export async function createApi( governanceAddress: string, retryTimeMs = 10 * 1000 ): Promise { - if (ethNetworkUrl.includes('infura')) { - const networkPrefix = ethNetworkUrl.split('infura')[0]; - if (process && process.env) { - const { INFURA_API_KEY } = process.env; - if (!INFURA_API_KEY) { - throw new Error('no infura key found!'); - } - ethNetworkUrl = `${networkPrefix}infura.io/ws/v3/${INFURA_API_KEY}`; - } else { - throw new Error('must use nodejs to connect to infura provider!'); - } - } try { - const web3Provider = new Web3.providers.WebsocketProvider(ethNetworkUrl, { - reconnect: { - auto: true, - delay: retryTimeMs, - onTimeout: true, - }, - }); - const provider = new providers.Web3Provider(web3Provider); + const provider = createProvider(ethNetworkUrl); // fetch governance contract const governanceContract = IAaveGovernanceV2Factory.connect( diff --git a/src/erc20/subscribeFunc.ts b/src/erc20/subscribeFunc.ts index aad00cc00c0..195df4c7884 100644 --- a/src/erc20/subscribeFunc.ts +++ b/src/erc20/subscribeFunc.ts @@ -1,7 +1,6 @@ -import { providers } from 'ethers'; -import Web3 from 'web3'; import sleep from 'sleep-promise'; +import { createProvider } from '../eth'; import { CWEvent, SubscribeFunc, ISubscribeOptions } from '../interfaces'; import { factory, formatFilename } from '../logging'; import { ERC20__factory as ERC20Factory } from '../contractTypes'; @@ -27,27 +26,8 @@ export async function createApi( tokenAddresses: string[], retryTimeMs = 10 * 1000 ): Promise { - if (ethNetworkUrl.includes('infura')) { - const networkPrefix = ethNetworkUrl.split('infura')[0]; - if (process && process.env) { - const { INFURA_API_KEY } = process.env; - if (!INFURA_API_KEY) { - throw new Error('no infura key found!'); - } - ethNetworkUrl = `${networkPrefix}infura.io/ws/v3/${INFURA_API_KEY}`; - } else { - throw new Error('must use nodejs to connect to infura provider!'); - } - } try { - const web3Provider = new Web3.providers.WebsocketProvider(ethNetworkUrl, { - reconnect: { - auto: true, - delay: retryTimeMs, - onTimeout: true, - }, - }); - const provider = new providers.Web3Provider(web3Provider); + const provider = createProvider(ethNetworkUrl); const tokenContracts = tokenAddresses.map((o) => ERC20Factory.connect(o, provider) diff --git a/src/eth.ts b/src/eth.ts new file mode 100644 index 00000000000..7c3e3e8fcc1 --- /dev/null +++ b/src/eth.ts @@ -0,0 +1,28 @@ +import { providers } from 'ethers'; +import Web3 from 'web3'; + +export function createProvider(ethNetworkUrl: string): providers.Web3Provider { + if (ethNetworkUrl.includes('infura')) { + const networkPrefix = ethNetworkUrl.split('infura')[0]; + if (process && process.env) { + const { INFURA_API_KEY } = process.env; + if (!INFURA_API_KEY) { + throw new Error('no infura key found!'); + } + ethNetworkUrl = `${networkPrefix}infura.io/ws/v3/${INFURA_API_KEY}`; + } else { + throw new Error('must use nodejs to connect to infura provider!'); + } + } + const web3Provider = new Web3.providers.WebsocketProvider(ethNetworkUrl, { + reconnect: { + auto: true, + delay: 5000, + onTimeout: true, + }, + }); + const provider = new providers.Web3Provider(web3Provider); + // 12s minute polling interval (default is 4s) + provider.pollingInterval = 12000; + return provider; +} diff --git a/src/marlin/subscribeFunc.ts b/src/marlin/subscribeFunc.ts index a5e9787928d..36eda14bb4e 100644 --- a/src/marlin/subscribeFunc.ts +++ b/src/marlin/subscribeFunc.ts @@ -1,8 +1,7 @@ -import { providers } from 'ethers'; -import Web3 from 'web3'; import EthDater from 'ethereum-block-by-date'; import sleep from 'sleep-promise'; +import { createProvider } from '../eth'; import { IDisconnectedRange, CWEvent, @@ -33,27 +32,8 @@ export async function createApi( governorAlphaAddress: string, retryTimeMs = 10 * 1000 ): Promise { - if (ethNetworkUrl.includes('infura')) { - const networkPrefix = ethNetworkUrl.split('infura')[0]; - if (process && process.env) { - const { INFURA_API_KEY } = process.env; - if (!INFURA_API_KEY) { - throw new Error('no infura key found!'); - } - ethNetworkUrl = `${networkPrefix}infura.io/ws/v3/${INFURA_API_KEY}`; - } else { - throw new Error('must use nodejs to connect to infura provider!'); - } - } try { - const web3Provider = new Web3.providers.WebsocketProvider(ethNetworkUrl, { - reconnect: { - auto: true, - delay: retryTimeMs, - onTimeout: true, - }, - }); - const provider = new providers.Web3Provider(web3Provider); + const provider = createProvider(ethNetworkUrl); // init governance contract const governorAlphaContract = GovernorAlphaFactory.connect( diff --git a/src/moloch/subscribeFunc.ts b/src/moloch/subscribeFunc.ts index 2bf809bd54a..8b7c7e3abca 100644 --- a/src/moloch/subscribeFunc.ts +++ b/src/moloch/subscribeFunc.ts @@ -1,8 +1,7 @@ -import { providers } from 'ethers'; -import Web3 from 'web3'; import EthDater from 'ethereum-block-by-date'; import sleep from 'sleep-promise'; +import { createProvider } from '../eth'; import { Moloch1__factory as Moloch1Factory, Moloch2__factory as Moloch2Factory, @@ -28,27 +27,8 @@ export async function createApi( contractAddress: string, retryTimeMs = 10 * 1000 ): Promise { - if (ethNetworkUrl.includes('infura')) { - const networkPrefix = ethNetworkUrl.split('infura')[0]; - if (process && process.env) { - const { INFURA_API_KEY } = process.env; - if (!INFURA_API_KEY) { - throw new Error('no infura key found!'); - } - ethNetworkUrl = `${networkPrefix}infura.io/ws/v3/${INFURA_API_KEY}`; - } else { - throw new Error('must use nodejs to connect to infura provider!'); - } - } try { - const web3Provider = new Web3.providers.WebsocketProvider(ethNetworkUrl, { - reconnect: { - auto: true, - delay: retryTimeMs, - onTimeout: true, - }, - }); - const provider = new providers.Web3Provider(web3Provider); + const provider = createProvider(ethNetworkUrl); const contract = contractVersion === 1 ? Moloch1Factory.connect(contractAddress, provider)