1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-21 17:37:01 +01:00

Refactor network client constructor (#17652)

This commit is contained in:
Alex Donesky 2023-03-22 17:20:59 -05:00 committed by GitHub
parent 34ba62470a
commit 349c9d4a03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 342 additions and 351 deletions

View File

@ -0,0 +1,7 @@
import { NetworkClientType } from './create-network-client';
import { testsForProviderType } from './provider-api-tests/shared-tests';
describe('createNetworkClient', () => {
testsForProviderType(NetworkClientType.Infura);
testsForProviderType(NetworkClientType.Custom);
});

View File

@ -0,0 +1,191 @@
import {
createAsyncMiddleware,
createScaffoldMiddleware,
JsonRpcEngine,
mergeMiddleware,
JsonRpcMiddleware,
} from 'json-rpc-engine';
import {
createBlockCacheMiddleware,
createBlockRefMiddleware,
createBlockRefRewriteMiddleware,
createBlockTrackerInspectorMiddleware,
createInflightCacheMiddleware,
createFetchMiddleware,
createRetryOnEmptyMiddleware,
} from '@metamask/eth-json-rpc-middleware';
import {
providerFromEngine,
providerFromMiddleware,
SafeEventEmitterProvider,
} from '@metamask/eth-json-rpc-provider';
import { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';
import type { Hex } from '@metamask/utils/dist';
import { PollingBlockTracker } from 'eth-block-tracker/dist';
import { SECOND } from '../../../../shared/constants/time';
import {
BUILT_IN_INFURA_NETWORKS,
BuiltInInfuraNetwork,
} from '../../../../shared/constants/network';
export enum NetworkClientType {
Custom = 'custom',
Infura = 'infura',
}
type CustomNetworkConfiguration = {
chainId: Hex;
rpcUrl: string;
type: NetworkClientType.Custom;
};
type InfuraNetworkConfiguration = {
network: BuiltInInfuraNetwork;
infuraProjectId: string;
type: NetworkClientType.Infura;
};
/**
* Create a JSON RPC network client for a specific network.
*
* @param networkConfig - The network configuration.
* @returns
*/
export function createNetworkClient(
networkConfig: CustomNetworkConfiguration | InfuraNetworkConfiguration,
): { provider: SafeEventEmitterProvider; blockTracker: PollingBlockTracker } {
const rpcApiMiddleware =
networkConfig.type === NetworkClientType.Infura
? createInfuraMiddleware({
network: networkConfig.network,
projectId: networkConfig.infuraProjectId,
maxAttempts: 5,
source: 'metamask',
})
: createFetchMiddleware({
btoa: global.btoa,
fetch: global.fetch,
rpcUrl: networkConfig.rpcUrl,
});
const rpcProvider = providerFromMiddleware(rpcApiMiddleware);
const blockTrackerOpts =
process.env.IN_TEST && networkConfig.type === 'custom'
? { pollingInterval: SECOND }
: {};
const blockTracker = new PollingBlockTracker({
...blockTrackerOpts,
provider: rpcProvider,
});
const networkMiddleware =
networkConfig.type === NetworkClientType.Infura
? createInfuraNetworkMiddleware({
blockTracker,
network: networkConfig.network,
rpcProvider,
rpcApiMiddleware,
})
: createCustomNetworkMiddleware({
blockTracker,
chainId: networkConfig.chainId,
rpcApiMiddleware,
});
const engine = new JsonRpcEngine();
engine.push(networkMiddleware);
const provider = providerFromEngine(engine);
return { provider, blockTracker };
}
function createInfuraNetworkMiddleware({
blockTracker,
network,
rpcProvider,
rpcApiMiddleware,
}: {
blockTracker: PollingBlockTracker;
network: BuiltInInfuraNetwork;
rpcProvider: SafeEventEmitterProvider;
rpcApiMiddleware: JsonRpcMiddleware<unknown, unknown>;
}) {
return mergeMiddleware([
createNetworkAndChainIdMiddleware({ network }),
createBlockCacheMiddleware({ blockTracker }),
createInflightCacheMiddleware(),
createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),
createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),
createBlockTrackerInspectorMiddleware({ blockTracker }),
rpcApiMiddleware,
]);
}
function createNetworkAndChainIdMiddleware({
network,
}: {
network: BuiltInInfuraNetwork;
}) {
if (!BUILT_IN_INFURA_NETWORKS[network]) {
throw new Error(`createInfuraClient - unknown network "${network}"`);
}
const { chainId, networkId } = BUILT_IN_INFURA_NETWORKS[network];
return createScaffoldMiddleware({
eth_chainId: chainId,
net_version: networkId,
});
}
const createChainIdMiddleware = (
chainId: string,
): JsonRpcMiddleware<unknown, unknown> => {
return (req, res, next, end) => {
if (req.method === 'eth_chainId') {
res.result = chainId;
return end();
}
return next();
};
};
function createCustomNetworkMiddleware({
blockTracker,
chainId,
rpcApiMiddleware,
}: {
blockTracker: PollingBlockTracker;
chainId: string;
rpcApiMiddleware: any;
}) {
const testMiddlewares = process.env.IN_TEST
? [createEstimateGasDelayTestMiddleware()]
: [];
return mergeMiddleware([
...testMiddlewares,
createChainIdMiddleware(chainId),
createBlockRefRewriteMiddleware({ blockTracker }),
createBlockCacheMiddleware({ blockTracker }),
createInflightCacheMiddleware(),
createBlockTrackerInspectorMiddleware({ blockTracker }),
rpcApiMiddleware,
]);
}
/**
* For use in tests only.
* Adds a delay to `eth_estimateGas` calls.
*/
function createEstimateGasDelayTestMiddleware() {
return createAsyncMiddleware(async (req, _, next) => {
if (req.method === 'eth_estimateGas') {
await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
}
return next();
});
}

View File

@ -1,49 +0,0 @@
import { createScaffoldMiddleware, mergeMiddleware } from 'json-rpc-engine';
import {
createBlockRefMiddleware,
createRetryOnEmptyMiddleware,
createBlockCacheMiddleware,
createInflightCacheMiddleware,
createBlockTrackerInspectorMiddleware,
providerFromMiddleware,
} from '@metamask/eth-json-rpc-middleware';
import { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';
import { PollingBlockTracker } from 'eth-block-tracker';
import { BUILT_IN_NETWORKS } from '../../../../shared/constants/network';
export default function createInfuraClient({ network, projectId }) {
const infuraMiddleware = createInfuraMiddleware({
network,
projectId,
maxAttempts: 5,
source: 'metamask',
});
const infuraProvider = providerFromMiddleware(infuraMiddleware);
const blockTracker = new PollingBlockTracker({ provider: infuraProvider });
const networkMiddleware = mergeMiddleware([
createNetworkAndChainIdMiddleware({ network }),
createBlockCacheMiddleware({ blockTracker }),
createInflightCacheMiddleware(),
createBlockRefMiddleware({ blockTracker, provider: infuraProvider }),
createRetryOnEmptyMiddleware({ blockTracker, provider: infuraProvider }),
createBlockTrackerInspectorMiddleware({ blockTracker }),
infuraMiddleware,
]);
return { networkMiddleware, blockTracker };
}
function createNetworkAndChainIdMiddleware({ network }) {
if (!BUILT_IN_NETWORKS[network]) {
throw new Error(`createInfuraClient - unknown network "${network}"`);
}
const { chainId, networkId } = BUILT_IN_NETWORKS[network];
return createScaffoldMiddleware({
eth_chainId: chainId,
net_version: networkId,
});
}

View File

@ -1,5 +0,0 @@
import { testsForProviderType } from './provider-api-tests/shared-tests';
describe('createInfuraClient', () => {
testsForProviderType('infura');
});

View File

@ -1,61 +0,0 @@
import { createAsyncMiddleware, mergeMiddleware } from 'json-rpc-engine';
import {
createFetchMiddleware,
createBlockRefRewriteMiddleware,
createBlockCacheMiddleware,
createInflightCacheMiddleware,
createBlockTrackerInspectorMiddleware,
providerFromMiddleware,
} from '@metamask/eth-json-rpc-middleware';
import { PollingBlockTracker } from 'eth-block-tracker';
import { SECOND } from '../../../../shared/constants/time';
export default function createJsonRpcClient({ rpcUrl, chainId }) {
const blockTrackerOpts = process.env.IN_TEST
? { pollingInterval: SECOND }
: {};
const fetchMiddleware = createFetchMiddleware({ rpcUrl });
const blockProvider = providerFromMiddleware(fetchMiddleware);
const blockTracker = new PollingBlockTracker({
...blockTrackerOpts,
provider: blockProvider,
});
const testMiddlewares = process.env.IN_TEST
? [createEstimateGasDelayTestMiddleware()]
: [];
const networkMiddleware = mergeMiddleware([
...testMiddlewares,
createChainIdMiddleware(chainId),
createBlockRefRewriteMiddleware({ blockTracker }),
createBlockCacheMiddleware({ blockTracker }),
createInflightCacheMiddleware(),
createBlockTrackerInspectorMiddleware({ blockTracker }),
fetchMiddleware,
]);
return { networkMiddleware, blockTracker };
}
function createChainIdMiddleware(chainId) {
return (req, res, next, end) => {
if (req.method === 'eth_chainId') {
res.result = chainId;
return end();
}
return next();
};
}
/**
* For use in tests only.
* Adds a delay to `eth_estimateGas` calls.
*/
function createEstimateGasDelayTestMiddleware() {
return createAsyncMiddleware(async (req, _, next) => {
if (req.method === 'eth_estimateGas') {
await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
}
return next();
});
}

View File

@ -1,5 +0,0 @@
import { testsForProviderType } from './provider-api-tests/shared-tests';
describe('createJsonRpcClient', () => {
testsForProviderType('custom');
});

View File

@ -1,8 +1,6 @@
import { strict as assert } from 'assert'; import { strict as assert } from 'assert';
import EventEmitter from 'events'; import EventEmitter from 'events';
import { ComposedStore, ObservableStore } from '@metamask/obs-store'; import { ComposedStore, ObservableStore } from '@metamask/obs-store';
import { JsonRpcEngine } from 'json-rpc-engine';
import { providerFromEngine } from '@metamask/eth-json-rpc-middleware';
import log from 'loglevel'; import log from 'loglevel';
import { import {
createSwappableProxy, createSwappableProxy,
@ -24,8 +22,7 @@ import {
isSafeChainId, isSafeChainId,
} from '../../../../shared/modules/network.utils'; } from '../../../../shared/modules/network.utils';
import { EVENT } from '../../../../shared/constants/metametrics'; import { EVENT } from '../../../../shared/constants/metametrics';
import createInfuraClient from './createInfuraClient'; import { createNetworkClient } from './create-network-client';
import createJsonRpcClient from './createJsonRpcClient';
/** /**
* @typedef {object} NetworkConfiguration * @typedef {object} NetworkConfiguration
@ -428,7 +425,10 @@ export default class NetworkController extends EventEmitter {
// infura type-based endpoints // infura type-based endpoints
const isInfura = INFURA_PROVIDER_TYPES.includes(type); const isInfura = INFURA_PROVIDER_TYPES.includes(type);
if (isInfura) { if (isInfura) {
this._configureInfuraProvider(type, this._infuraProjectId); this._configureInfuraProvider({
type,
infuraProjectId: this._infuraProjectId,
});
// url-based rpc endpoints // url-based rpc endpoints
} else if (type === NETWORK_TYPES.RPC) { } else if (type === NETWORK_TYPES.RPC) {
this._configureStandardProvider(rpcUrl, chainId); this._configureStandardProvider(rpcUrl, chainId);
@ -439,25 +439,23 @@ export default class NetworkController extends EventEmitter {
} }
} }
_configureInfuraProvider(type, projectId) { _configureInfuraProvider({ type, infuraProjectId }) {
log.info('NetworkController - configureInfuraProvider', type); log.info('NetworkController - configureInfuraProvider', type);
const networkClient = createInfuraClient({ const { provider, blockTracker } = createNetworkClient({
network: type, network: type,
projectId, infuraProjectId,
type: 'infura',
}); });
this._setNetworkClient(networkClient); this._setProviderAndBlockTracker({ provider, blockTracker });
} }
_configureStandardProvider(rpcUrl, chainId) { _configureStandardProvider(rpcUrl, chainId) {
log.info('NetworkController - configureStandardProvider', rpcUrl); log.info('NetworkController - configureStandardProvider', rpcUrl);
const networkClient = createJsonRpcClient({ rpcUrl, chainId }); const { provider, blockTracker } = createNetworkClient({
this._setNetworkClient(networkClient); chainId,
} rpcUrl,
type: 'custom',
_setNetworkClient({ networkMiddleware, blockTracker }) { });
const engine = new JsonRpcEngine();
engine.push(networkMiddleware);
const provider = providerFromEngine(engine);
this._setProviderAndBlockTracker({ provider, blockTracker }); this._setProviderAndBlockTracker({ provider, blockTracker });
} }

View File

@ -3,15 +3,15 @@ import { isMatch } from 'lodash';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import nock from 'nock'; import nock from 'nock';
import sinon from 'sinon'; import sinon from 'sinon';
import * as ethJsonRpcMiddlewareModule from '@metamask/eth-json-rpc-middleware'; import * as ethJsonRpcProvider from '@metamask/eth-json-rpc-provider';
import { BUILT_IN_NETWORKS } from '../../../../shared/constants/network'; import { BUILT_IN_NETWORKS } from '../../../../shared/constants/network';
import { EVENT } from '../../../../shared/constants/metametrics'; import { EVENT } from '../../../../shared/constants/metametrics';
import NetworkController from './network-controller'; import NetworkController from './network-controller';
jest.mock('@metamask/eth-json-rpc-middleware', () => { jest.mock('@metamask/eth-json-rpc-provider', () => {
return { return {
__esModule: true, __esModule: true,
...jest.requireActual('@metamask/eth-json-rpc-middleware'), ...jest.requireActual('@metamask/eth-json-rpc-provider'),
}; };
}); });
@ -1760,7 +1760,7 @@ describe('NetworkController', () => {
}, },
]; ];
jest jest
.spyOn(ethJsonRpcMiddlewareModule, 'providerFromEngine') .spyOn(ethJsonRpcProvider, 'providerFromEngine')
.mockImplementationOnce(() => fakeProviders[0]) .mockImplementationOnce(() => fakeProviders[0])
.mockImplementationOnce(() => fakeProviders[1]); .mockImplementationOnce(() => fakeProviders[1]);
await withoutCallingLookupNetwork({ await withoutCallingLookupNetwork({
@ -1876,7 +1876,7 @@ describe('NetworkController', () => {
}, },
]; ];
jest jest
.spyOn(ethJsonRpcMiddlewareModule, 'providerFromEngine') .spyOn(ethJsonRpcProvider, 'providerFromEngine')
.mockImplementationOnce(() => fakeProviders[0]) .mockImplementationOnce(() => fakeProviders[0])
.mockImplementationOnce(() => fakeProviders[1]); .mockImplementationOnce(() => fakeProviders[1]);
await withoutCallingLookupNetwork({ await withoutCallingLookupNetwork({

View File

@ -1,10 +1,7 @@
import nock from 'nock'; import nock from 'nock';
import sinon from 'sinon'; import sinon from 'sinon';
import { JsonRpcEngine } from 'json-rpc-engine';
import { providerFromEngine } from '@metamask/eth-json-rpc-middleware';
import EthQuery from 'eth-query'; import EthQuery from 'eth-query';
import createInfuraClient from '../createInfuraClient'; import { createNetworkClient } from '../create-network-client';
import createJsonRpcClient from '../createJsonRpcClient';
/** /**
* @typedef {import('nock').Scope} NockScope * @typedef {import('nock').Scope} NockScope
@ -414,20 +411,21 @@ export async function withNetworkClient(
delete process.env.IN_TEST; delete process.env.IN_TEST;
const clientUnderTest = const clientUnderTest =
providerType === 'infura' providerType === 'infura'
? createInfuraClient({ ? createNetworkClient({
network: infuraNetwork, network: infuraNetwork,
projectId: MOCK_INFURA_PROJECT_ID, infuraProjectId: MOCK_INFURA_PROJECT_ID,
type: 'infura',
}) })
: createJsonRpcClient({ rpcUrl: customRpcUrl, chainId: customChainId }); : createNetworkClient({
chainId: customChainId,
rpcUrl: customRpcUrl,
type: 'custom',
});
process.env.IN_TEST = inTest; process.env.IN_TEST = inTest;
const { networkMiddleware, blockTracker } = clientUnderTest; const { provider, blockTracker } = clientUnderTest;
const engine = new JsonRpcEngine();
engine.push(networkMiddleware);
const provider = providerFromEngine(engine);
const ethQuery = new EthQuery(provider); const ethQuery = new EthQuery(provider);
const curriedMakeRpcCall = (request) => makeRpcCall(ethQuery, request); const curriedMakeRpcCall = (request) => makeRpcCall(ethQuery, request);
const makeRpcCallsInSeries = async (requests) => { const makeRpcCallsInSeries = async (requests) => {
const responses = []; const responses = [];

View File

@ -291,9 +291,9 @@ export function testsForProviderType(providerType) {
// tests on the core side. // tests on the core side.
{ name: 'net_listening', numberOfParameters: 0 }, { name: 'net_listening', numberOfParameters: 0 },
// TODO: Methods to add back when we add testing for subscribe middleware
{ name: 'eth_subscribe', numberOfParameters: 1 }, // { name: 'eth_subscribe', numberOfParameters: 1 },
{ name: 'eth_unsubscribe', numberOfParameters: 1 }, // { name: 'eth_unsubscribe', numberOfParameters: 1 },
{ name: 'custom_rpc_method', numberOfParameters: 1 }, { name: 'custom_rpc_method', numberOfParameters: 1 },
{ name: 'net_peerCount', numberOfParameters: 0 }, { name: 'net_peerCount', numberOfParameters: 0 },
{ name: 'parity_nextNonce', numberOfParameters: 1 }, { name: 'parity_nextNonce', numberOfParameters: 1 },

View File

@ -871,8 +871,9 @@
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": true, "@metamask/eth-json-rpc-infura>@metamask/utils": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true, "browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
@ -881,57 +882,19 @@
"vinyl>clone": true "vinyl>clone": true
} }
}, },
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true,
"ethereumjs-abi": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true,
"ganache>secp256k1>elliptic": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": {
"packages": {
"browserify>buffer": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ethereumjs-util>ethereum-cryptography>secp256k1": true,
"ethereumjs-wallet>randombytes": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": {
"packages": {
"browserify>buffer": true,
"ethjs>ethjs-util>is-hex-prefixed": true,
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/eth-json-rpc-middleware": { "@metamask/eth-json-rpc-middleware": {
"globals": { "globals": {
"URL": true, "URL": true,
"btoa": true,
"console.error": true, "console.error": true,
"fetch": true,
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/eth-json-rpc-middleware>@metamask/utils": true,
"@metamask/eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-middleware>pify": true,
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true, "@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true,
"lavamoat>json-stable-stringify": true,
"vinyl>clone": true "vinyl>clone": true
} }
}, },
@ -947,6 +910,12 @@
"semver": true "semver": true
} }
}, },
"@metamask/eth-json-rpc-provider": {
"packages": {
"json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true
}
},
"@metamask/eth-keyring-controller": { "@metamask/eth-keyring-controller": {
"packages": { "packages": {
"@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true,
@ -2610,6 +2579,11 @@
"document.createElement": true "document.createElement": true
} }
}, },
"btoa": {
"packages": {
"browserify>buffer": true
}
},
"classnames": { "classnames": {
"globals": { "globals": {
"classNames": "write", "classNames": "write",

View File

@ -925,8 +925,9 @@
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": true, "@metamask/eth-json-rpc-infura>@metamask/utils": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true, "browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
@ -935,57 +936,19 @@
"vinyl>clone": true "vinyl>clone": true
} }
}, },
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true,
"ethereumjs-abi": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true,
"ganache>secp256k1>elliptic": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": {
"packages": {
"browserify>buffer": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ethereumjs-util>ethereum-cryptography>secp256k1": true,
"ethereumjs-wallet>randombytes": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": {
"packages": {
"browserify>buffer": true,
"ethjs>ethjs-util>is-hex-prefixed": true,
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/eth-json-rpc-middleware": { "@metamask/eth-json-rpc-middleware": {
"globals": { "globals": {
"URL": true, "URL": true,
"btoa": true,
"console.error": true, "console.error": true,
"fetch": true,
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/eth-json-rpc-middleware>@metamask/utils": true,
"@metamask/eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-middleware>pify": true,
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true, "@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true,
"lavamoat>json-stable-stringify": true,
"vinyl>clone": true "vinyl>clone": true
} }
}, },
@ -1001,6 +964,12 @@
"semver": true "semver": true
} }
}, },
"@metamask/eth-json-rpc-provider": {
"packages": {
"json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true
}
},
"@metamask/eth-keyring-controller": { "@metamask/eth-keyring-controller": {
"packages": { "packages": {
"@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true,
@ -3051,6 +3020,11 @@
"document.createElement": true "document.createElement": true
} }
}, },
"btoa": {
"packages": {
"browserify>buffer": true
}
},
"classnames": { "classnames": {
"globals": { "globals": {
"classNames": "write", "classNames": "write",

View File

@ -925,8 +925,9 @@
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": true, "@metamask/eth-json-rpc-infura>@metamask/utils": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true, "browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
@ -935,57 +936,19 @@
"vinyl>clone": true "vinyl>clone": true
} }
}, },
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true,
"ethereumjs-abi": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true,
"ganache>secp256k1>elliptic": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": {
"packages": {
"browserify>buffer": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ethereumjs-util>ethereum-cryptography>secp256k1": true,
"ethereumjs-wallet>randombytes": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": {
"packages": {
"browserify>buffer": true,
"ethjs>ethjs-util>is-hex-prefixed": true,
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/eth-json-rpc-middleware": { "@metamask/eth-json-rpc-middleware": {
"globals": { "globals": {
"URL": true, "URL": true,
"btoa": true,
"console.error": true, "console.error": true,
"fetch": true,
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/eth-json-rpc-middleware>@metamask/utils": true,
"@metamask/eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-middleware>pify": true,
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true, "@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true,
"lavamoat>json-stable-stringify": true,
"vinyl>clone": true "vinyl>clone": true
} }
}, },
@ -1001,6 +964,12 @@
"semver": true "semver": true
} }
}, },
"@metamask/eth-json-rpc-provider": {
"packages": {
"json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true
}
},
"@metamask/eth-keyring-controller": { "@metamask/eth-keyring-controller": {
"packages": { "packages": {
"@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true,
@ -3051,6 +3020,11 @@
"document.createElement": true "document.createElement": true
} }
}, },
"btoa": {
"packages": {
"browserify>buffer": true
}
},
"classnames": { "classnames": {
"globals": { "globals": {
"classNames": "write", "classNames": "write",

View File

@ -871,8 +871,9 @@
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": true, "@metamask/eth-json-rpc-infura>@metamask/utils": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true, "browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
@ -881,57 +882,19 @@
"vinyl>clone": true "vinyl>clone": true
} }
}, },
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true,
"ethereumjs-abi": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": {
"packages": {
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": true,
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true,
"ganache>secp256k1>elliptic": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethereum-cryptography": {
"packages": {
"browserify>buffer": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ethereumjs-util>ethereum-cryptography>secp256k1": true,
"ethereumjs-wallet>randombytes": true
}
},
"@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": {
"packages": {
"browserify>buffer": true,
"ethjs>ethjs-util>is-hex-prefixed": true,
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/eth-json-rpc-middleware": { "@metamask/eth-json-rpc-middleware": {
"globals": { "globals": {
"URL": true, "URL": true,
"btoa": true,
"console.error": true, "console.error": true,
"fetch": true,
"setTimeout": true "setTimeout": true
}, },
"packages": { "packages": {
"@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/eth-json-rpc-middleware>@metamask/utils": true,
"@metamask/eth-json-rpc-middleware>pify": true, "@metamask/eth-json-rpc-middleware>pify": true,
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true,
"@metamask/eth-keyring-controller>@metamask/eth-sig-util": true, "@metamask/eth-keyring-controller>@metamask/eth-sig-util": true,
"browserify>browser-resolve": true,
"eth-rpc-errors": true, "eth-rpc-errors": true,
"json-rpc-engine": true, "json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true,
"lavamoat>json-stable-stringify": true,
"vinyl>clone": true "vinyl>clone": true
} }
}, },
@ -947,6 +910,12 @@
"semver": true "semver": true
} }
}, },
"@metamask/eth-json-rpc-provider": {
"packages": {
"json-rpc-engine": true,
"json-rpc-engine>@metamask/safe-event-emitter": true
}
},
"@metamask/eth-keyring-controller": { "@metamask/eth-keyring-controller": {
"packages": { "packages": {
"@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/eth-keyring-controller>@metamask/eth-hd-keyring": true,
@ -2610,6 +2579,11 @@
"document.createElement": true "document.createElement": true
} }
}, },
"btoa": {
"packages": {
"browserify>buffer": true
}
},
"classnames": { "classnames": {
"globals": { "globals": {
"classNames": "write", "classNames": "write",

View File

@ -232,8 +232,9 @@
"@metamask/controller-utils": "^1.0.0", "@metamask/controller-utils": "^1.0.0",
"@metamask/design-tokens": "^1.9.0", "@metamask/design-tokens": "^1.9.0",
"@metamask/desktop": "^0.3.0", "@metamask/desktop": "^0.3.0",
"@metamask/eth-json-rpc-infura": "^7.0.0", "@metamask/eth-json-rpc-infura": "^8.0.0",
"@metamask/eth-json-rpc-middleware": "^10.0.0", "@metamask/eth-json-rpc-middleware": "^11.0.0",
"@metamask/eth-json-rpc-provider": "^1.0.0",
"@metamask/eth-keyring-controller": "^10.0.1", "@metamask/eth-keyring-controller": "^10.0.1",
"@metamask/eth-ledger-bridge-keyring": "^0.13.0", "@metamask/eth-ledger-bridge-keyring": "^0.13.0",
"@metamask/eth-token-tracker": "^4.0.0", "@metamask/eth-token-tracker": "^4.0.0",
@ -285,7 +286,7 @@
"debounce-stream": "^2.0.0", "debounce-stream": "^2.0.0",
"deep-freeze-strict": "1.1.1", "deep-freeze-strict": "1.1.1",
"end-of-stream": "^1.4.4", "end-of-stream": "^1.4.4",
"eth-block-tracker": "^6.0.0", "eth-block-tracker": "^7.0.0",
"eth-ens-namehash": "^2.0.8", "eth-ens-namehash": "^2.0.8",
"eth-json-rpc-filters": "^6.0.0", "eth-json-rpc-filters": "^6.0.0",
"eth-lattice-keyring": "^0.12.3", "eth-lattice-keyring": "^0.12.3",

View File

@ -1,4 +1,4 @@
import { capitalize } from 'lodash'; import { capitalize, pick } from 'lodash';
/** /**
* A type representing any valid value for 'type' for setProviderType and other * A type representing any valid value for 'type' for setProviderType and other
* methods that add or manipulate networks in MetaMask state. * methods that add or manipulate networks in MetaMask state.
@ -301,6 +301,13 @@ export const BUILT_IN_NETWORKS = {
}, },
} as const; } as const;
export const BUILT_IN_INFURA_NETWORKS = pick(
BUILT_IN_NETWORKS,
INFURA_PROVIDER_TYPES,
);
export type BuiltInInfuraNetwork = keyof typeof BUILT_IN_INFURA_NETWORKS;
export const NETWORK_TO_NAME_MAP = { export const NETWORK_TO_NAME_MAP = {
[NETWORK_TYPES.MAINNET]: MAINNET_DISPLAY_NAME, [NETWORK_TYPES.MAINNET]: MAINNET_DISPLAY_NAME,
[NETWORK_TYPES.GOERLI]: GOERLI_DISPLAY_NAME, [NETWORK_TYPES.GOERLI]: GOERLI_DISPLAY_NAME,

1
types/eth-json-rpc-filters/index.d.ts vendored Normal file
View File

@ -0,0 +1 @@
declare module 'eth-json-rpc-filters';

View File

@ -0,0 +1 @@
declare module 'eth-json-rpc-filters/subscriptionManager';

View File

@ -3849,35 +3849,43 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@metamask/eth-json-rpc-infura@npm:^7.0.0": "@metamask/eth-json-rpc-infura@npm:^8.0.0":
version: 7.0.0 version: 8.0.0
resolution: "@metamask/eth-json-rpc-infura@npm:7.0.0" resolution: "@metamask/eth-json-rpc-infura@npm:8.0.0"
dependencies: dependencies:
"@metamask/utils": ^3.0.1 "@metamask/utils": ^3.0.1
eth-json-rpc-middleware: ^8.1.0 eth-json-rpc-middleware: ^9.0.0
eth-rpc-errors: ^4.0.3 eth-rpc-errors: ^4.0.3
json-rpc-engine: ^6.1.0 json-rpc-engine: ^6.1.0
node-fetch: ^2.6.7 node-fetch: ^2.6.7
checksum: 6230cb289b66db39d27f08ffc72cfb79274e632e4e14eb52ca72d19167d17bbf22c58718d80f801818058631dec0638bcc21ef4b229fa8d53e7f9328be870fc6 checksum: e8c3a4b75d4f2bb09f68d7d2ac6b992f264df893921b50a05c35968ee684b7bba90180870eebecfc89b7fbf40d11de2a545ab68f1d511f569ce0a6519c64b0aa
languageName: node languageName: node
linkType: hard linkType: hard
"@metamask/eth-json-rpc-middleware@npm:^10.0.0": "@metamask/eth-json-rpc-middleware@npm:^11.0.0":
version: 10.0.0 version: 11.0.0
resolution: "@metamask/eth-json-rpc-middleware@npm:10.0.0" resolution: "@metamask/eth-json-rpc-middleware@npm:11.0.0"
dependencies: dependencies:
"@metamask/eth-json-rpc-provider": ^1.0.0
"@metamask/eth-sig-util": ^5.0.0 "@metamask/eth-sig-util": ^5.0.0
"@metamask/safe-event-emitter": ^2.0.0
"@metamask/utils": ^3.0.3 "@metamask/utils": ^3.0.3
btoa: ^1.2.1
clone: ^2.1.1 clone: ^2.1.1
eth-block-tracker: ^5.0.1 eth-block-tracker: ^7.0.0
eth-rpc-errors: ^4.0.3 eth-rpc-errors: ^4.0.3
json-rpc-engine: ^6.1.0 json-rpc-engine: ^6.1.0
json-stable-stringify: ^1.0.1
node-fetch: ^2.6.7
pify: ^3.0.0 pify: ^3.0.0
checksum: c754b3a39f175698070b4d07076e692d3080738bd25157c3b93114d286c975ee6895d5793b4188ca3d0abbcdef04bfde9e2d4835251a6b725b002d3750bf98de safe-stable-stringify: ^2.3.2
checksum: c866d07a199ab480ceeb7ab8df61c08284640b5ac13aee3dd81dae9e0e5575f4a425d95728070ab5402c0c6cd5f9237fb5f4f22dbcdc99fe0b50bb47df561830
languageName: node
linkType: hard
"@metamask/eth-json-rpc-provider@npm:^1.0.0":
version: 1.0.0
resolution: "@metamask/eth-json-rpc-provider@npm:1.0.0"
dependencies:
"@metamask/safe-event-emitter": ^2.0.0
json-rpc-engine: ^6.1.0
checksum: 27865d84d90030db1a9e5a66bc0b0ae079706fb7be635ec1e9bd4f64771e819aae78f0a026c6629d3a1a2eb277fcd51977315c049c47a70df1dd95d1d4106982
languageName: node languageName: node
linkType: hard linkType: hard
@ -15563,15 +15571,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eth-block-tracker@npm:^6.0.0": "eth-block-tracker@npm:^7.0.0":
version: 6.0.0 version: 7.0.0
resolution: "eth-block-tracker@npm:6.0.0" resolution: "eth-block-tracker@npm:7.0.0"
dependencies: dependencies:
"@metamask/eth-json-rpc-provider": ^1.0.0
"@metamask/safe-event-emitter": ^2.0.0 "@metamask/safe-event-emitter": ^2.0.0
"@metamask/utils": ^3.0.1 "@metamask/utils": ^3.0.1
json-rpc-random-id: ^1.0.1 json-rpc-random-id: ^1.0.1
pify: ^3.0.0 pify: ^3.0.0
checksum: ad1199b822a9a3ff2673ecc92ca7cda0a37828e5bfd1927fd917a8085a99904fc29d3ef2392068bcfb14e47589df097940ef28f3e9025d1681e56a89b07e284e checksum: b76f6ba022947eec0161e5592bc5386e8f05bff8a2c3e0e10c76bce21bc51900ef1cb153eb8bf31858fb0027e929c6a85a159bdf84aa1e3ef77b24e53e82ba84
languageName: node languageName: node
linkType: hard linkType: hard
@ -15640,21 +15649,22 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eth-json-rpc-middleware@npm:^8.1.0": "eth-json-rpc-middleware@npm:^9.0.0":
version: 8.1.0 version: 9.0.1
resolution: "eth-json-rpc-middleware@npm:8.1.0" resolution: "eth-json-rpc-middleware@npm:9.0.1"
dependencies: dependencies:
"@metamask/eth-sig-util": ^5.0.0
"@metamask/safe-event-emitter": ^2.0.0 "@metamask/safe-event-emitter": ^2.0.0
"@metamask/utils": ^3.0.3
btoa: ^1.2.1 btoa: ^1.2.1
clone: ^2.1.1 clone: ^2.1.1
eth-block-tracker: ^5.0.1 eth-block-tracker: ^5.0.1
eth-rpc-errors: ^4.0.3 eth-rpc-errors: ^4.0.3
eth-sig-util: ^1.4.2
json-rpc-engine: ^6.1.0 json-rpc-engine: ^6.1.0
json-stable-stringify: ^1.0.1 json-stable-stringify: ^1.0.1
node-fetch: ^2.6.7 node-fetch: ^2.6.7
pify: ^3.0.0 pify: ^3.0.0
checksum: ec10bbc04e3b7696f82db2db528b052c8f6de811c90a12d4eb32f23cbe6ea198d86656afa5b53c52de06b631fef633cf29409bb56c04a16f173da94ee1d89ab6 checksum: 9512829a6958df6ef739b891a0c0804b51a140407fd2e3ddaaa6b18d975796646cfcf7f7305a18beb7903db09e0c7a91b06dc5434b6bd2d6cdb85d992d9fd3ab
languageName: node languageName: node
linkType: hard linkType: hard
@ -24268,8 +24278,9 @@ __metadata:
"@metamask/eslint-config-mocha": ^9.0.0 "@metamask/eslint-config-mocha": ^9.0.0
"@metamask/eslint-config-nodejs": ^9.0.0 "@metamask/eslint-config-nodejs": ^9.0.0
"@metamask/eslint-config-typescript": ^9.0.1 "@metamask/eslint-config-typescript": ^9.0.1
"@metamask/eth-json-rpc-infura": ^7.0.0 "@metamask/eth-json-rpc-infura": ^8.0.0
"@metamask/eth-json-rpc-middleware": ^10.0.0 "@metamask/eth-json-rpc-middleware": ^11.0.0
"@metamask/eth-json-rpc-provider": ^1.0.0
"@metamask/eth-keyring-controller": ^10.0.1 "@metamask/eth-keyring-controller": ^10.0.1
"@metamask/eth-ledger-bridge-keyring": ^0.13.0 "@metamask/eth-ledger-bridge-keyring": ^0.13.0
"@metamask/eth-token-tracker": ^4.0.0 "@metamask/eth-token-tracker": ^4.0.0
@ -24402,7 +24413,7 @@ __metadata:
eslint-plugin-react: ^7.23.1 eslint-plugin-react: ^7.23.1
eslint-plugin-react-hooks: ^4.2.0 eslint-plugin-react-hooks: ^4.2.0
eslint-plugin-storybook: ^0.6.4 eslint-plugin-storybook: ^0.6.4
eth-block-tracker: ^6.0.0 eth-block-tracker: ^7.0.0
eth-ens-namehash: ^2.0.8 eth-ens-namehash: ^2.0.8
eth-json-rpc-filters: ^6.0.0 eth-json-rpc-filters: ^6.0.0
eth-lattice-keyring: ^0.12.3 eth-lattice-keyring: ^0.12.3
@ -30453,10 +30464,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"safe-stable-stringify@npm:^2.1.0": "safe-stable-stringify@npm:^2.1.0, safe-stable-stringify@npm:^2.3.2":
version: 2.3.1 version: 2.4.2
resolution: "safe-stable-stringify@npm:2.3.1" resolution: "safe-stable-stringify@npm:2.4.2"
checksum: a0a0bad0294c3e2a9d1bf3cf2b1096dfb83c162d09a5e4891e488cce082120bd69161d2a92aae7fc48255290f17700decae9c89a07fe139794e61b5c8b411377 checksum: 0324ba2e40f78cae63e31a02b1c9bdf1b786621f9e8760845608eb9e81aef401944ac2078e5c9c1533cf516aea34d08fa8052ca853637ced84b791caaf1e394e
languageName: node languageName: node
linkType: hard linkType: hard