diff --git a/packages/instant/CHANGELOG.json b/packages/instant/CHANGELOG.json index 4fcd69fc11..e52a729968 100644 --- a/packages/instant/CHANGELOG.json +++ b/packages/instant/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "4.1.0", + "changes": [ + { + "note": "Run Web3ProviderEngine without excess block polling", + "pr": 1695 + } + ] + }, { "version": "4.0.0", "changes": [ diff --git a/packages/instant/src/util/provider_factory.ts b/packages/instant/src/util/provider_factory.ts index a0e63eb118..e84cecd9a0 100644 --- a/packages/instant/src/util/provider_factory.ts +++ b/packages/instant/src/util/provider_factory.ts @@ -3,7 +3,7 @@ import { providerUtils } from '@0x/utils'; import { ZeroExProvider } from 'ethereum-types'; import * as _ from 'lodash'; -import { BLOCK_POLLING_INTERVAL_MS, ETHEREUM_NODE_URL_BY_NETWORK } from '../constants'; +import { ETHEREUM_NODE_URL_BY_NETWORK } from '../constants'; import { Maybe, Network } from '../types'; export const providerFactory = { @@ -22,9 +22,7 @@ export const providerFactory = { return undefined; }, getFallbackNoSigningProvider: (network: Network): Web3ProviderEngine => { - const providerEngine = new Web3ProviderEngine({ - pollingInterval: BLOCK_POLLING_INTERVAL_MS, - }); + const providerEngine = new Web3ProviderEngine(); // Intercept calls to `eth_accounts` and always return empty providerEngine.addProvider(new EmptyWalletSubprovider()); // Construct an RPC subprovider, all data based requests will be sent via the RPCSubprovider @@ -32,9 +30,7 @@ export const providerFactory = { const rpcUrl = ETHEREUM_NODE_URL_BY_NETWORK[network]; providerEngine.addProvider(new RPCSubprovider(rpcUrl)); // Start the Provider Engine - // HACK: Start the provider without unused block polling - // providerEngine.start(); - (providerEngine as any)._ready.go(); + providerUtils.startProviderEngine(providerEngine); return providerEngine; }, }; diff --git a/packages/order-watcher/CHANGELOG.json b/packages/order-watcher/CHANGELOG.json index 51b253d72b..9d6ae1f060 100644 --- a/packages/order-watcher/CHANGELOG.json +++ b/packages/order-watcher/CHANGELOG.json @@ -13,6 +13,10 @@ { "note": "Fix race-condition bugs due to async event callbacks modifying shared state", "pr": 1718 + }, + { + "note": "Run Web3ProviderEngine without excess block polling", + "pr": 1695 } ], "timestamp": 1553091633 diff --git a/packages/order-watcher/src/server.ts b/packages/order-watcher/src/server.ts index 1d31e87ab9..9afb4c65d8 100644 --- a/packages/order-watcher/src/server.ts +++ b/packages/order-watcher/src/server.ts @@ -1,5 +1,6 @@ import { getContractAddressesForNetworkOrThrow } from '@0x/contract-addresses'; import { RPCSubprovider, Web3ProviderEngine } from '@0x/subproviders'; +import { providerUtils } from '@0x/utils'; import * as _ from 'lodash'; import { OrderWatcherWebSocketServer } from './order_watcher/order_watcher_web_socket_server'; @@ -11,7 +12,7 @@ const provider = new Web3ProviderEngine(); const jsonRpcUrl = process.env.JSON_RPC_URL || DEFAULT_RPC_URL; const rpcSubprovider = new RPCSubprovider(jsonRpcUrl); provider.addProvider(rpcSubprovider); -provider.start(); +providerUtils.startProviderEngine(provider); const networkId = process.env.NETWORK_ID !== undefined ? _.parseInt(process.env.NETWORK_ID) : GANACHE_NETWORK_ID; diff --git a/packages/utils/CHANGELOG.json b/packages/utils/CHANGELOG.json index 58c0118353..1bfd7e6013 100644 --- a/packages/utils/CHANGELOG.json +++ b/packages/utils/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "4.3.0", + "changes": [ + { + "note": "Added `startProviderEngine` to `providerUtils`. Preventing excess block polling", + "pr": 1695 + } + ] + }, { "timestamp": 1553091633, "version": "4.2.3", diff --git a/packages/utils/src/provider_utils.ts b/packages/utils/src/provider_utils.ts index 19ef0725e7..aae779ddf6 100644 --- a/packages/utils/src/provider_utils.ts +++ b/packages/utils/src/provider_utils.ts @@ -8,6 +8,17 @@ import { import * as _ from 'lodash'; export const providerUtils = { + /** + * Starts the Web3ProviderEngine without excess block polling + * @param providerEngine The Web3ProviderEngine + */ + startProviderEngine(providerEngine: any): void { + if (providerEngine.start === undefined) { + throw new Error(`Invalid Web3ProviderEngine`); + } + (providerEngine as any)._ready.go(); + (providerEngine as any)._running = true; + }, /** * Standardize the supported provider types into our internal provider interface * or throw if unsupported provider supplied. diff --git a/packages/website/ts/blockchain.ts b/packages/website/ts/blockchain.ts index d4df7c2478..e5eba7d2d1 100644 --- a/packages/website/ts/blockchain.ts +++ b/packages/website/ts/blockchain.ts @@ -61,7 +61,6 @@ import { errorReporter } from 'ts/utils/error_reporter'; import { fakeTokenRegistry } from 'ts/utils/fake_token_registry'; import { tokenAddressOverrides } from 'ts/utils/token_address_overrides'; import { utils } from 'ts/utils/utils'; -import FilterSubprovider from 'web3-provider-engine/subproviders/filters'; import MintableArtifacts from '../contracts/Mintable.json'; @@ -120,14 +119,11 @@ export class Blockchain { }; const ledgerSubprovider = new LedgerSubprovider(ledgerWalletConfigs); provider.addProvider(ledgerSubprovider); - provider.addProvider(new FilterSubprovider()); const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkIdIfExists], publicNodeUrl => { return new RPCSubprovider(publicNodeUrl); }); provider.addProvider(new RedundantSubprovider(rpcSubproviders)); - // HACK: Start the provider without unused block polling - // provider.start(); - (provider as any)._ready.go(); + providerUtils.startProviderEngine(provider); return [provider, ledgerSubprovider]; } else if (doesInjectedProviderExist && isPublicNodeAvailableForNetworkId) { // We catch all requests involving a users account and send it to the injectedWeb3 @@ -140,14 +136,11 @@ export class Blockchain { ? new MetamaskSubprovider(injectedProviderIfExists) : new SignerSubprovider(injectedProviderIfExists); provider.addProvider(signerSubprovider); - provider.addProvider(new FilterSubprovider()); const rpcSubproviders = _.map(publicNodeUrlsIfExistsForNetworkId, publicNodeUrl => { return new RPCSubprovider(publicNodeUrl); }); provider.addProvider(new RedundantSubprovider(rpcSubproviders)); - // HACK: Start the provider without unused block polling - // provider.start(); - (provider as any)._ready.go(); + providerUtils.startProviderEngine(provider); return [provider, undefined]; } else if (doesInjectedProviderExist) { // Since no public node for this network, all requests go to injectedWeb3 instance @@ -157,15 +150,12 @@ export class Blockchain { // We do this so that users can still browse the 0x Portal DApp even if they do not have web3 // injected into their browser. const provider = new Web3ProviderEngine(); - provider.addProvider(new FilterSubprovider()); const networkId = constants.NETWORK_ID_MAINNET; const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkId], publicNodeUrl => { return new RPCSubprovider(publicNodeUrl); }); provider.addProvider(new RedundantSubprovider(rpcSubproviders)); - // HACK: Start the provider without unused block polling - // provider.start(); - (provider as any)._ready.go(); + providerUtils.startProviderEngine(provider); return [provider, undefined]; } }