by MetaMask

A JavaScript library for composing Ethereum provider objects using middleware modules

420 Stars 252 Forks Last release: 29 days ago (v16.0.0) MIT License 812 Commits 2 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

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: 'https://testrpc.metamask.io/', }))

// 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)

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.