@@ -17,14 +17,16 @@ import {
1717 providerFromEngine ,
1818 providerFromMiddleware ,
1919} from '@metamask/eth-json-rpc-provider' ;
20+ import { asV2Middleware , JsonRpcEngine } from '@metamask/json-rpc-engine' ;
2021import {
21- createAsyncMiddleware ,
2222 createScaffoldMiddleware ,
23- JsonRpcEngine ,
24- mergeMiddleware ,
25- } from '@metamask/json-rpc-engine' ;
26- import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine' ;
27- import type { Hex , Json , JsonRpcParams } from '@metamask/utils' ;
23+ JsonRpcEngineV2 ,
24+ } from '@metamask/json-rpc-engine/v2' ;
25+ import type {
26+ JsonRpcMiddleware ,
27+ MiddlewareContext ,
28+ } from '@metamask/json-rpc-engine/v2' ;
29+ import type { Hex , Json , JsonRpcRequest } from '@metamask/utils' ;
2830import type { Logger } from 'loglevel' ;
2931
3032import type { NetworkControllerMessenger } from './NetworkController' ;
@@ -50,6 +52,12 @@ export type NetworkClient = {
5052 destroy : ( ) => void ;
5153} ;
5254
55+ type RpcApiMiddleware = JsonRpcMiddleware <
56+ JsonRpcRequest ,
57+ Json ,
58+ MiddlewareContext < { origin : string } >
59+ > ;
60+
5361/**
5462 * Create a JSON RPC network client for a specific network.
5563 *
@@ -137,16 +145,23 @@ export function createNetworkClient({
137145 } ) ;
138146 } ) ;
139147
140- const rpcApiMiddleware =
141- configuration . type === NetworkClientType . Infura
142- ? createInfuraMiddleware ( {
143- rpcService : rpcServiceChain ,
144- options : {
145- source : 'metamask' ,
146- } ,
147- } )
148- : createFetchMiddleware ( { rpcService : rpcServiceChain } ) ;
148+ let rpcApiMiddleware : RpcApiMiddleware ;
149+ if ( configuration . type === NetworkClientType . Infura ) {
150+ const infuraEngine = new JsonRpcEngine ( ) ;
151+ infuraEngine . push (
152+ createInfuraMiddleware ( {
153+ rpcService : rpcServiceChain ,
154+ options : {
155+ source : 'metamask' ,
156+ } ,
157+ } ) ,
158+ ) ;
159+ rpcApiMiddleware = asV2Middleware ( infuraEngine ) as RpcApiMiddleware ;
160+ } else {
161+ rpcApiMiddleware = createFetchMiddleware ( { rpcService : rpcServiceChain } ) ;
162+ }
149163
164+ // TODO:next Need eth-json-rpc-provider V2 migration
150165 const rpcProvider = providerFromMiddleware ( rpcApiMiddleware ) ;
151166
152167 const blockTracker = createBlockTracker ( {
@@ -170,10 +185,11 @@ export function createNetworkClient({
170185 rpcApiMiddleware,
171186 } ) ;
172187
173- const engine = new JsonRpcEngine ( ) ;
174-
175- engine . push ( networkMiddleware ) ;
188+ const engine = JsonRpcEngineV2 . create ( {
189+ middleware : [ networkMiddleware ] ,
190+ } ) ;
176191
192+ // TODO:next Need eth-json-rpc-provider V2 migration
177193 const provider = providerFromEngine ( engine ) ;
178194
179195 const destroy = ( ) => {
@@ -241,17 +257,19 @@ function createInfuraNetworkMiddleware({
241257 blockTracker : PollingBlockTracker ;
242258 network : InfuraNetworkType ;
243259 rpcProvider : SafeEventEmitterProvider ;
244- rpcApiMiddleware : JsonRpcMiddleware < JsonRpcParams , Json > ;
260+ rpcApiMiddleware : RpcApiMiddleware ;
245261} ) {
246- return mergeMiddleware ( [
247- createNetworkAndChainIdMiddleware ( { network } ) ,
248- createBlockCacheMiddleware ( { blockTracker } ) ,
249- createInflightCacheMiddleware ( ) ,
250- createBlockRefMiddleware ( { blockTracker, provider : rpcProvider } ) ,
251- createRetryOnEmptyMiddleware ( { blockTracker, provider : rpcProvider } ) ,
252- createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
253- rpcApiMiddleware ,
254- ] ) ;
262+ return JsonRpcEngineV2 . create ( {
263+ middleware : [
264+ createNetworkAndChainIdMiddleware ( { network } ) ,
265+ createBlockCacheMiddleware ( { blockTracker } ) ,
266+ createInflightCacheMiddleware ( ) ,
267+ createBlockRefMiddleware ( { blockTracker, provider : rpcProvider } ) ,
268+ createRetryOnEmptyMiddleware ( { blockTracker, provider : rpcProvider } ) ,
269+ createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
270+ rpcApiMiddleware ,
271+ ] ,
272+ } ) . asMiddleware ( ) ;
255273}
256274
257275/**
@@ -275,11 +293,10 @@ function createNetworkAndChainIdMiddleware({
275293
276294const createChainIdMiddleware = (
277295 chainId : Hex ,
278- ) : JsonRpcMiddleware < JsonRpcParams , Json > => {
279- return ( req , res , next , end ) => {
280- if ( req . method === 'eth_chainId' ) {
281- res . result = chainId ;
282- return end ( ) ;
296+ ) : JsonRpcMiddleware < JsonRpcRequest , Json > => {
297+ return ( { request, next } ) => {
298+ if ( request . method === 'eth_chainId' ) {
299+ return chainId ;
283300 }
284301 return next ( ) ;
285302 } ;
@@ -301,21 +318,23 @@ function createCustomNetworkMiddleware({
301318} : {
302319 blockTracker : PollingBlockTracker ;
303320 chainId : Hex ;
304- rpcApiMiddleware : JsonRpcMiddleware < JsonRpcParams , Json > ;
305- } ) : JsonRpcMiddleware < JsonRpcParams , Json > {
321+ rpcApiMiddleware : RpcApiMiddleware ;
322+ } ) {
306323 const testMiddlewares = process . env . IN_TEST
307324 ? [ createEstimateGasDelayTestMiddleware ( ) ]
308325 : [ ] ;
309326
310- return mergeMiddleware ( [
311- ...testMiddlewares ,
312- createChainIdMiddleware ( chainId ) ,
313- createBlockRefRewriteMiddleware ( { blockTracker } ) ,
314- createBlockCacheMiddleware ( { blockTracker } ) ,
315- createInflightCacheMiddleware ( ) ,
316- createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
317- rpcApiMiddleware ,
318- ] ) ;
327+ return JsonRpcEngineV2 . create ( {
328+ middleware : [
329+ ...testMiddlewares ,
330+ createChainIdMiddleware ( chainId ) ,
331+ createBlockRefRewriteMiddleware ( { blockTracker } ) ,
332+ createBlockCacheMiddleware ( { blockTracker } ) ,
333+ createInflightCacheMiddleware ( ) ,
334+ createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
335+ rpcApiMiddleware ,
336+ ] ,
337+ } ) . asMiddleware ( ) ;
319338}
320339
321340/**
@@ -324,11 +343,14 @@ function createCustomNetworkMiddleware({
324343 *
325344 * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
326345 */
327- function createEstimateGasDelayTestMiddleware ( ) {
328- return createAsyncMiddleware ( async ( req , _ , next ) => {
329- if ( req . method === 'eth_estimateGas' ) {
346+ function createEstimateGasDelayTestMiddleware ( ) : JsonRpcMiddleware <
347+ JsonRpcRequest ,
348+ Json
349+ > {
350+ return async ( { request, next } ) => {
351+ if ( request . method === 'eth_estimateGas' ) {
330352 await new Promise ( ( resolve ) => setTimeout ( resolve , SECOND * 2 ) ) ;
331353 }
332354 return next ( ) ;
333- } ) ;
355+ } ;
334356}
0 commit comments