Need help with web3-provider-engine?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

492 Stars 319 Forks MIT License 827 Commits 33 Opened issues


A JavaScript library for composing Ethereum provider objects using middleware modules

Services available


Need anything else?

Contributors list

Web3 ProviderEngine

Web3 ProviderEngine is a tool for composing your own web3 providers.

Originally created for MetaMask, but has been superceded by json-rpc-engine in combination with our eth-json-rpc-middleware. This module is not very actively maintained, so we recommend using that one instead.


Built to be modular - works via a stack of 'sub-providers' which are like normal web3 providers but only handle a subset of rpc methods.

The subproviders can emit new rpc requests in order to handle their own; e.g.

may trigger
, and others. The provider engine also handles caching of rpc request results.
const ProviderEngine = require('web3-provider-engine')
const CacheSubprovider = require('web3-provider-engine/subproviders/cache.js')
const FixtureSubprovider = require('web3-provider-engine/subproviders/fixture.js')
const FilterSubprovider = require('web3-provider-engine/subproviders/filters.js')
const VmSubprovider = require('web3-provider-engine/subproviders/vm.js')
const HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet.js')
const NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker.js')
const RpcSubprovider = require('web3-provider-engine/subproviders/rpc.js')

var engine = new ProviderEngine() var web3 = new Web3(engine)

// static results engine.addProvider(new FixtureSubprovider({ web3_clientVersion: 'ProviderEngine/v0.0.0/javascript', net_listening: true, eth_hashrate: '0x00', eth_mining: false, eth_syncing: true, }))

// cache layer engine.addProvider(new CacheSubprovider())

// filters engine.addProvider(new FilterSubprovider())

// pending nonce engine.addProvider(new NonceSubprovider())

// vm engine.addProvider(new VmSubprovider())

// id mgmt engine.addProvider(new HookedWalletSubprovider({ getAccounts: function(cb){ ... }, approveTransaction: function(cb){ ... }, signTransaction: function(cb){ ... }, }))

// data source engine.addProvider(new RpcSubprovider({ rpcUrl: '', }))

// log new blocks engine.on('block', function(block){ console.log('================================') console.log('BLOCK CHANGED:', '#'+block.number.toString('hex'), '0x'+block.hash.toString('hex')) console.log('================================') })

// network connectivity error engine.on('error', function(err){ // report connectivity errors console.error(err.stack) })

// start polling for blocks engine.start()

When importing in webpack:

import * as Web3ProviderEngine  from 'web3-provider-engine';
import * as RpcSource  from 'web3-provider-engine/subproviders/rpc';
import * as HookedWalletSubprovider from 'web3-provider-engine/subproviders/hooked-wallet';

Built For Zero-Clients

The Ethereum JSON RPC was not designed to have one node service many clients. However a smaller, lighter subset of the JSON RPC can be used to provide the blockchain data that an Ethereum 'zero-client' node would need to function. We handle as many types of requests locally as possible, and just let data lookups fallback to some data source ( hosted rpc, blockchain api, etc ). Categorically, we don’t want / can’t have the following types of RPC calls go to the network: * id mgmt + tx signing (requires private data) * filters (requires a stateful data api) * vm (expensive, hard to scale)

Running tests

yarn test

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.