mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-22 09:23:21 +01:00
Use Infura v3 API (#9368)
* Use eth-json-rpc-infura@5.0.0 * Use Infura v3 API * Add example .metamaskrc file
This commit is contained in:
parent
b80ab53396
commit
e2dedaacdb
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1,6 +1,8 @@
|
||||
* text=auto
|
||||
CHANGELOG.md merge=union
|
||||
|
||||
.metamaskrc.dist linguist-language=ini
|
||||
|
||||
# Reviewing the lockfile contents is an important step in verifying that
|
||||
# we're using the dependencies we expect to be using
|
||||
package-lock.json linguist-generated=false
|
||||
|
2
.metamaskrc.dist
Normal file
2
.metamaskrc.dist
Normal file
@ -0,0 +1,2 @@
|
||||
; Extra environment variables
|
||||
INFURA_PROJECT_ID=00000000000
|
@ -16,6 +16,7 @@ To learn how to contribute to the MetaMask project itself, visit our [Internal D
|
||||
- If you are using [nvm](https://github.com/creationix/nvm#installation) (recommended) running `nvm use` will automatically choose the right node version for you.
|
||||
- Install [Yarn](https://yarnpkg.com/en/docs/install)
|
||||
- Install dependencies: `yarn`
|
||||
- Copy the `.metamaskrc.dist` file to `.metamaskrc`
|
||||
- Build the project to the `./dist/` folder with `yarn dist`.
|
||||
- Optionally, to start a development build (e.g. with logging and file watching) run `yarn start` instead.
|
||||
- To start the [React DevTools](https://github.com/facebook/react-devtools) and [Redux DevTools Extension](http://extension.remotedev.io)
|
||||
|
@ -227,6 +227,7 @@ function setupController (initState, initLangCode) {
|
||||
//
|
||||
|
||||
const controller = new MetamaskController({
|
||||
infuraProjectId: process.env.INFURA_PROJECT_ID,
|
||||
// User confirmation callbacks:
|
||||
showUnconfirmedMessage: triggerUi,
|
||||
showUnapprovedTx: triggerUi,
|
||||
|
@ -10,8 +10,13 @@ import createInfuraMiddleware from 'eth-json-rpc-infura'
|
||||
import BlockTracker from 'eth-block-tracker'
|
||||
import * as networkEnums from './enums'
|
||||
|
||||
export default function createInfuraClient ({ network }) {
|
||||
const infuraMiddleware = createInfuraMiddleware({ network, maxAttempts: 5, source: 'metamask' })
|
||||
export default function createInfuraClient ({ network, projectId }) {
|
||||
const infuraMiddleware = createInfuraMiddleware({
|
||||
network,
|
||||
projectId,
|
||||
maxAttempts: 5,
|
||||
source: 'metamask',
|
||||
})
|
||||
const infuraProvider = providerFromMiddleware(infuraMiddleware)
|
||||
const blockTracker = new BlockTracker({ provider: infuraProvider })
|
||||
|
||||
|
@ -62,6 +62,21 @@ export default class NetworkController extends EventEmitter {
|
||||
this._blockTrackerProxy = null
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Infura project ID
|
||||
*
|
||||
* @param {string} projectId - The Infura project ID
|
||||
* @throws {Error} if the project ID is not a valid string
|
||||
* @return {void}
|
||||
*/
|
||||
setInfuraProjectId (projectId) {
|
||||
if (!projectId || typeof projectId !== 'string') {
|
||||
throw new Error('Invalid Infura project ID')
|
||||
}
|
||||
|
||||
this._infuraProjectId = projectId
|
||||
}
|
||||
|
||||
initializeProvider (providerParams) {
|
||||
this._baseProviderParams = providerParams
|
||||
const { type, rpcTarget, chainId, ticker, nickname } = this.providerStore.getState()
|
||||
@ -177,7 +192,7 @@ export default class NetworkController extends EventEmitter {
|
||||
// infura type-based endpoints
|
||||
const isInfura = INFURA_PROVIDER_TYPES.includes(type)
|
||||
if (isInfura) {
|
||||
this._configureInfuraProvider(opts)
|
||||
this._configureInfuraProvider(type, this._infuraProjectId)
|
||||
// other type-based rpc endpoints
|
||||
} else if (type === LOCALHOST) {
|
||||
this._configureLocalhostProvider()
|
||||
@ -189,10 +204,11 @@ export default class NetworkController extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
_configureInfuraProvider ({ type }) {
|
||||
_configureInfuraProvider (type, projectId) {
|
||||
log.info('NetworkController - configureInfuraProvider', type)
|
||||
const networkClient = createInfuraClient({
|
||||
network: type,
|
||||
projectId,
|
||||
})
|
||||
this._setNetworkClient(networkClient)
|
||||
// setup networkConfig
|
||||
|
@ -97,6 +97,7 @@ export default class MetamaskController extends EventEmitter {
|
||||
// controller initialization order matters
|
||||
|
||||
this.networkController = new NetworkController(initState.NetworkController)
|
||||
this.networkController.setInfuraProjectId(opts.infuraProjectId)
|
||||
|
||||
this.preferencesController = new PreferencesController({
|
||||
initState: initState.PreferencesController,
|
||||
|
@ -15,7 +15,9 @@ const pify = require('pify')
|
||||
const endOfStream = pify(require('end-of-stream'))
|
||||
const { makeStringTransform } = require('browserify-transform-tools')
|
||||
|
||||
const conf = require('rc')('metamask', {})
|
||||
const conf = require('rc')('metamask', {
|
||||
INFURA_PROJECT_ID: process.env.INFURA_PROJECT_ID,
|
||||
})
|
||||
|
||||
const packageJSON = require('../../package.json')
|
||||
const { createTask, composeParallel, composeSeries, runInChildProcess } = require('./task')
|
||||
@ -326,6 +328,11 @@ function createScriptTasks ({ browserPlatforms, livereload }) {
|
||||
ETH_GAS_STATION_API_KEY: process.env.ETH_GAS_STATION_API_KEY || '',
|
||||
CONF: opts.devMode ? conf : ({}),
|
||||
SENTRY_DSN: process.env.SENTRY_DSN,
|
||||
INFURA_PROJECT_ID: conf.INFURA_PROJECT_ID || (
|
||||
opts.testing
|
||||
? '00000000000000000000000000000000'
|
||||
: undefined
|
||||
),
|
||||
}), {
|
||||
global: true,
|
||||
})
|
||||
|
@ -101,7 +101,7 @@
|
||||
"eth-ens-namehash": "^2.0.8",
|
||||
"eth-json-rpc-errors": "^2.0.2",
|
||||
"eth-json-rpc-filters": "^4.1.1",
|
||||
"eth-json-rpc-infura": "^4.0.2",
|
||||
"eth-json-rpc-infura": "^5.0.0",
|
||||
"eth-json-rpc-middleware": "^5.0.2",
|
||||
"eth-keyring-controller": "^6.1.0",
|
||||
"eth-method-registry": "^1.2.0",
|
||||
|
@ -1,5 +1,4 @@
|
||||
import assert from 'assert'
|
||||
import nock from 'nock'
|
||||
import sinon from 'sinon'
|
||||
import ObservableStore from 'obs-store'
|
||||
import contracts from 'eth-contract-metadata'
|
||||
@ -21,13 +20,9 @@ describe('DetectTokensController', function () {
|
||||
}
|
||||
|
||||
beforeEach(async function () {
|
||||
|
||||
nock('https://api.infura.io')
|
||||
.get(/.*/u)
|
||||
.reply(200)
|
||||
|
||||
keyringMemStore = new ObservableStore({ isUnlocked: false })
|
||||
network = new NetworkController()
|
||||
network.setInfuraProjectId('foo')
|
||||
preferences = new PreferencesController({ network })
|
||||
preferences.setAddresses([
|
||||
'0x7e57e2',
|
||||
@ -39,7 +34,6 @@ describe('DetectTokensController', function () {
|
||||
|
||||
after(function () {
|
||||
sandbox.restore()
|
||||
nock.cleanAll()
|
||||
})
|
||||
|
||||
it('should poll on correct interval', async function () {
|
||||
|
@ -82,19 +82,6 @@ describe('MetaMaskController', function () {
|
||||
|
||||
beforeEach(function () {
|
||||
|
||||
nock('https://api.infura.io')
|
||||
.get('/v1/ticker/ethusd')
|
||||
.reply(200, '{"base": "ETH", "quote": "USD", "bid": 288.45, "ask": 288.46, "volume": 112888.17569277, "exchange": "bitfinex", "total_volume": 272175.00106721005, "num_exchanges": 8, "timestamp": 1506444677}')
|
||||
|
||||
nock('https://api.infura.io')
|
||||
.get('/v1/ticker/ethjpy')
|
||||
.reply(200, '{"base": "ETH", "quote": "JPY", "bid": 32300.0, "ask": 32400.0, "volume": 247.4616071, "exchange": "kraken", "total_volume": 247.4616071, "num_exchanges": 1, "timestamp": 1506444676}')
|
||||
|
||||
nock('https://api.infura.io')
|
||||
.persist()
|
||||
.get(/.*/u)
|
||||
.reply(200)
|
||||
|
||||
nock('https://min-api.cryptocompare.com')
|
||||
.persist()
|
||||
.get(/.*/u)
|
||||
@ -114,6 +101,7 @@ describe('MetaMaskController', function () {
|
||||
},
|
||||
initState: cloneDeep(firstTimeState),
|
||||
platform: { showTransactionNotification: () => undefined, getVersion: () => 'foo' },
|
||||
infuraProjectId: 'foo',
|
||||
})
|
||||
|
||||
// add sinon method spies
|
||||
|
@ -1,5 +1,4 @@
|
||||
import assert from 'assert'
|
||||
import nock from 'nock'
|
||||
import NetworkController from '../../../../../app/scripts/controllers/network'
|
||||
import { getNetworkDisplayName } from '../../../../../app/scripts/controllers/network/util'
|
||||
|
||||
@ -12,16 +11,8 @@ describe('NetworkController', function () {
|
||||
}
|
||||
|
||||
beforeEach(function () {
|
||||
nock('https://rinkeby.infura.io')
|
||||
.persist()
|
||||
.post('/metamask')
|
||||
.reply(200)
|
||||
|
||||
networkController = new NetworkController()
|
||||
})
|
||||
|
||||
afterEach(function () {
|
||||
nock.cleanAll()
|
||||
networkController.setInfuraProjectId('foo')
|
||||
})
|
||||
|
||||
describe('#provider', function () {
|
||||
|
@ -47,6 +47,7 @@ describe('Actions', function () {
|
||||
},
|
||||
},
|
||||
initState: cloneDeep(firstTimeState),
|
||||
infuraProjectId: 'foo',
|
||||
})
|
||||
|
||||
metamaskController.threeBoxController = {
|
||||
|
@ -3,7 +3,7 @@ const defaultNetworksData = [
|
||||
labelKey: 'mainnet',
|
||||
iconColor: '#29B6AF',
|
||||
providerType: 'mainnet',
|
||||
rpcUrl: 'https://api.infura.io/v1/jsonrpc/mainnet',
|
||||
rpcUrl: `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
|
||||
chainId: '1',
|
||||
ticker: 'ETH',
|
||||
blockExplorerUrl: 'https://etherscan.io',
|
||||
@ -12,7 +12,7 @@ const defaultNetworksData = [
|
||||
labelKey: 'ropsten',
|
||||
iconColor: '#FF4A8D',
|
||||
providerType: 'ropsten',
|
||||
rpcUrl: 'https://api.infura.io/v1/jsonrpc/ropsten',
|
||||
rpcUrl: `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
|
||||
chainId: '3',
|
||||
ticker: 'ETH',
|
||||
blockExplorerUrl: 'https://ropsten.etherscan.io',
|
||||
@ -21,7 +21,7 @@ const defaultNetworksData = [
|
||||
labelKey: 'rinkeby',
|
||||
iconColor: '#F6C343',
|
||||
providerType: 'rinkeby',
|
||||
rpcUrl: 'https://api.infura.io/v1/jsonrpc/rinkeby',
|
||||
rpcUrl: `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
|
||||
chainId: '4',
|
||||
ticker: 'ETH',
|
||||
blockExplorerUrl: 'https://rinkeby.etherscan.io',
|
||||
@ -30,7 +30,7 @@ const defaultNetworksData = [
|
||||
labelKey: 'goerli',
|
||||
iconColor: '#3099f2',
|
||||
providerType: 'goerli',
|
||||
rpcUrl: 'https://api.infura.io/v1/jsonrpc/goerli',
|
||||
rpcUrl: `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
|
||||
chainId: '5',
|
||||
ticker: 'ETH',
|
||||
blockExplorerUrl: 'https://goerli.etherscan.io',
|
||||
@ -39,7 +39,7 @@ const defaultNetworksData = [
|
||||
labelKey: 'kovan',
|
||||
iconColor: '#9064FF',
|
||||
providerType: 'kovan',
|
||||
rpcUrl: 'https://api.infura.io/v1/jsonrpc/kovan',
|
||||
rpcUrl: `https://kovan.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
|
||||
chainId: '42',
|
||||
ticker: 'ETH',
|
||||
blockExplorerUrl: 'https://etherscan.io',
|
||||
|
21
yarn.lock
21
yarn.lock
@ -10371,7 +10371,7 @@ eth-json-rpc-infura@^3.1.0:
|
||||
json-rpc-error "^2.0.0"
|
||||
tape "^4.8.0"
|
||||
|
||||
eth-json-rpc-infura@^4.0.1, eth-json-rpc-infura@^4.0.2:
|
||||
eth-json-rpc-infura@^4.0.1:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-4.0.2.tgz#8af1a1a2e9a0a82aaa302bbc96fb1a4c15d69b83"
|
||||
integrity sha512-dvgOrci9lZqpjpp0hoC3Zfedhg3aIpLFVDH0TdlKxRlkhR75hTrKTwxghDrQwE0bn3eKrC8RsN1m/JdnIWltpw==
|
||||
@ -10381,6 +10381,16 @@ eth-json-rpc-infura@^4.0.1, eth-json-rpc-infura@^4.0.2:
|
||||
eth-json-rpc-middleware "^4.1.4"
|
||||
json-rpc-engine "^5.1.3"
|
||||
|
||||
eth-json-rpc-infura@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.0.0.tgz#a666efe860659ffa09e918abdf9aab9f2434e508"
|
||||
integrity sha512-TvRgnDHsxNblUpFo1KTqsgfeZ0rMEg6Ga+v+Zbqjb467txODg6oPamKJKh/odOs+MXtYpt9e7d4yJCy+5azq5w==
|
||||
dependencies:
|
||||
eth-json-rpc-middleware "^4.4.0"
|
||||
eth-rpc-errors "^3.0.0"
|
||||
json-rpc-engine "^5.1.3"
|
||||
node-fetch "^2.6.0"
|
||||
|
||||
eth-json-rpc-middleware@^1.5.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
|
||||
@ -10400,7 +10410,7 @@ eth-json-rpc-middleware@^1.5.0:
|
||||
promise-to-callback "^1.0.0"
|
||||
tape "^4.6.3"
|
||||
|
||||
eth-json-rpc-middleware@^4.1.4, eth-json-rpc-middleware@^4.1.5:
|
||||
eth-json-rpc-middleware@^4.1.4, eth-json-rpc-middleware@^4.1.5, eth-json-rpc-middleware@^4.4.0:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz#07d3dd0724c24a8d31e4a172ee96271da71b4228"
|
||||
integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A==
|
||||
@ -10528,6 +10538,13 @@ eth-rpc-errors@^2.1.1:
|
||||
dependencies:
|
||||
fast-safe-stringify "^2.0.6"
|
||||
|
||||
eth-rpc-errors@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10"
|
||||
integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==
|
||||
dependencies:
|
||||
fast-safe-stringify "^2.0.6"
|
||||
|
||||
eth-sig-util@2.3.0, eth-sig-util@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.3.0.tgz#c54a6ac8e8796f7e25f59cf436982a930e645231"
|
||||
|
Loading…
Reference in New Issue
Block a user