{"id":13608363,"url":"https://github.com/MetaMask/web3-provider-engine","last_synced_at":"2025-04-12T17:31:18.108Z","repository":{"id":38239712,"uuid":"47658358","full_name":"MetaMask/web3-provider-engine","owner":"MetaMask","description":"A JavaScript library for composing Ethereum provider objects using middleware modules","archived":true,"fork":false,"pushed_at":"2024-04-22T08:27:27.000Z","size":5542,"stargazers_count":598,"open_issues_count":7,"forks_count":328,"subscribers_count":72,"default_branch":"main","last_synced_at":"2024-10-14T13:02:40.904Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MetaMask.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":"metamask","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2015-12-09T00:32:36.000Z","updated_at":"2024-09-23T11:46:08.000Z","dependencies_parsed_at":"2024-06-18T11:11:56.420Z","dependency_job_id":"bcf76587-25cb-4b68-8068-fc3aa3c1e690","html_url":"https://github.com/MetaMask/web3-provider-engine","commit_stats":{"total_commits":741,"total_committers":70,"mean_commits":"10.585714285714285","dds":0.4412955465587044,"last_synced_commit":"472426ae0460e7482330d970a2a1e17c7b5b5157"},"previous_names":["metamask/provider-engine"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MetaMask%2Fweb3-provider-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MetaMask%2Fweb3-provider-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MetaMask%2Fweb3-provider-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MetaMask%2Fweb3-provider-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MetaMask","download_url":"https://codeload.github.com/MetaMask/web3-provider-engine/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248605047,"owners_count":21132099,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T19:01:26.684Z","updated_at":"2025-04-12T17:31:16.602Z","avatar_url":"https://github.com/MetaMask.png","language":"JavaScript","readme":"# Web3 ProviderEngine\n\nWeb3 ProviderEngine is a tool for composing your own [web3 providers](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3).\n\n\u003e [!CAUTION]\n\u003e This package has been deprecated.\n\u003e\n\u003e This package was originally created for MetaMask, but has been replaced by `@metamask/json-rpc-engine`, `@metamask/eth-json-rpc-middleware`, `@metamask/eth-json-rpc-provider`, and various other packages.\n\u003e\n\u003e Here is an example of how to create a provider using those packages:\n\u003e\n\u003e ```javascript\n\u003e import { providerFromMiddleware } from '@metamask/eth-json-rpc-provider';\n\u003e import { createFetchMiddleware } from '@metamask/eth-json-rpc-middleware';\n\u003e import { valueToBytes, bytesToBase64 } from '@metamask/utils';\n\u003e import fetch from 'cross-fetch';\n\u003e\n\u003e const rpcUrl = '[insert RPC URL here]';\n\u003e\n\u003e const fetchMiddleware = createFetchMiddleware({\n\u003e   btoa: (stringToEncode) =\u003e bytesToBase64(valueToBytes(stringToEncode)),\n\u003e   fetch,\n\u003e   rpcUrl,\n\u003e });\n\u003e const provider = providerFromMiddleware(fetchMiddleware);\n\u003e\n\u003e provider.sendAsync(\n\u003e   { id: 1, jsonrpc: '2.0', method: 'eth_chainId' },\n\u003e   (error, response) =\u003e {\n\u003e     if (error) {\n\u003e       console.error(error);\n\u003e     } else {\n\u003e       console.log(response.result);\n\u003e     }\n\u003e   }\n\u003e );\n\u003e ```\n\u003e\n\u003e This example was written with v12.1.0 of `@metamask/eth-json-rpc-middleware`, v3.0.1 of `@metamask/eth-json-rpc-provider`, and v8.4.0 of `@metamask/utils`.\n\u003e\n\n\n### Composable\n\nBuilt to be modular - works via a stack of 'sub-providers' which are like normal web3 providers but only handle a subset of rpc methods.\n\nThe subproviders can emit new rpc requests in order to handle their own;  e.g. `eth_call` may trigger `eth_getAccountBalance`, `eth_getCode`, and others.\nThe provider engine also handles caching of rpc request results.\n\n```js\nconst ProviderEngine = require('web3-provider-engine')\nconst CacheSubprovider = require('web3-provider-engine/subproviders/cache.js')\nconst FixtureSubprovider = require('web3-provider-engine/subproviders/fixture.js')\nconst FilterSubprovider = require('web3-provider-engine/subproviders/filters.js')\nconst VmSubprovider = require('web3-provider-engine/subproviders/vm.js')\nconst HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet.js')\nconst NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker.js')\nconst RpcSubprovider = require('web3-provider-engine/subproviders/rpc.js')\n\nvar engine = new ProviderEngine()\nvar web3 = new Web3(engine)\n\n// static results\nengine.addProvider(new FixtureSubprovider({\n  web3_clientVersion: 'ProviderEngine/v0.0.0/javascript',\n  net_listening: true,\n  eth_hashrate: '0x00',\n  eth_mining: false,\n  eth_syncing: true,\n}))\n\n// cache layer\nengine.addProvider(new CacheSubprovider())\n\n// filters\nengine.addProvider(new FilterSubprovider())\n\n// pending nonce\nengine.addProvider(new NonceSubprovider())\n\n// vm\nengine.addProvider(new VmSubprovider())\n\n// id mgmt\nengine.addProvider(new HookedWalletSubprovider({\n  getAccounts: function(cb){ ... },\n  approveTransaction: function(cb){ ... },\n  signTransaction: function(cb){ ... },\n}))\n\n// data source\nengine.addProvider(new RpcSubprovider({\n  rpcUrl: 'https://testrpc.metamask.io/',\n}))\n\n// log new blocks\nengine.on('block', function(block){\n  console.log('================================')\n  console.log('BLOCK CHANGED:', '#'+block.number.toString('hex'), '0x'+block.hash.toString('hex'))\n  console.log('================================')\n})\n\n// network connectivity error\nengine.on('error', function(err){\n  // report connectivity errors\n  console.error(err.stack)\n})\n\n// start polling for blocks\nengine.start()\n```\n\nWhen importing in webpack:\n```js\nimport * as Web3ProviderEngine  from 'web3-provider-engine';\nimport * as RpcSource  from 'web3-provider-engine/subproviders/rpc';\nimport * as HookedWalletSubprovider from 'web3-provider-engine/subproviders/hooked-wallet';\n```\n\n### Built For Zero-Clients\n\nThe [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) was not designed to have one node service many clients.\nHowever 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.\nWe handle as many types of requests locally as possible, and just let data lookups fallback to some data source ( hosted rpc, blockchain api, etc ).\nCategorically, we don’t want / can’t have the following types of RPC calls go to the network:\n* id mgmt + tx signing (requires private data)\n* filters (requires a stateful data api)\n* vm (expensive, hard to scale)\n\n## Running tests\n\n```bash\nyarn test\n```\n","funding_links":["https://opencollective.com/metamask"],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMetaMask%2Fweb3-provider-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMetaMask%2Fweb3-provider-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMetaMask%2Fweb3-provider-engine/lists"}