redundant-rpc-provider

Redundant RPC provider for metamasks eth provider engine

Usage no npm install needed!

<script type="module">
  import redundantRpcProvider from 'https://cdn.skypack.dev/redundant-rpc-provider';
</script>

README

redundant-rpc-provider

Redundant RPC provider for metamasks eth provider engine

What it does?

  • For transaction sending it pushes your transaction to all RPCs but only waits for the first one to respond.
  • For data-fetching calls it queries the random RPC and failovers to others if it's down

API

new RedundantRPCSubprovider([
            url_1,
            url_2,
            ...
            url_n
        ],
        RpcSubprovider
)

Example usage

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')
const RedundantRPCSubprovider = require('redundant-rpc-provider')
const Web3 = require('web3')

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

// data source
const INFURA_RPC = 'https://ropsten.infura.io/'
const MEW_RPC = 'https://api.myetherapi.com/rop'

engine.addProvider(
    new RedundantRPCSubprovider([
            INFURA_RPC,
            MEW_RPC
        ],
        RpcSubprovider
    )
)

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