@@ -12,18 +12,19 @@ import {
1212 createFetchMiddleware ,
1313 createRetryOnEmptyMiddleware ,
1414} from '@metamask/eth-json-rpc-middleware' ;
15+ import { InternalProvider } from '@metamask/eth-json-rpc-provider' ;
16+ import { providerFromMiddlewareV2 } from '@metamask/eth-json-rpc-provider' ;
17+ import { asV2Middleware } from '@metamask/json-rpc-engine' ;
1518import {
16- InternalProvider ,
17- providerFromMiddleware ,
18- } from '@metamask/eth-json-rpc-provider' ;
19- import {
20- createAsyncMiddleware ,
2119 createScaffoldMiddleware ,
22- JsonRpcEngine ,
23- mergeMiddleware ,
24- } from '@metamask/json-rpc-engine' ;
25- import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine' ;
26- import type { Hex , Json , JsonRpcParams } from '@metamask/utils' ;
20+ JsonRpcEngineV2 ,
21+ JsonRpcServer ,
22+ } from '@metamask/json-rpc-engine/v2' ;
23+ import type {
24+ JsonRpcMiddleware ,
25+ MiddlewareContext ,
26+ } from '@metamask/json-rpc-engine/v2' ;
27+ import type { Hex , Json , JsonRpcRequest } from '@metamask/utils' ;
2728import type { Logger } from 'loglevel' ;
2829
2930import type { NetworkControllerMessenger } from './NetworkController' ;
@@ -49,6 +50,12 @@ export type NetworkClient = {
4950 destroy : ( ) => void ;
5051} ;
5152
53+ type RpcApiMiddleware = JsonRpcMiddleware <
54+ JsonRpcRequest ,
55+ Json ,
56+ MiddlewareContext < { origin : string } >
57+ > ;
58+
5259/**
5360 * Create a JSON RPC network client for a specific network.
5461 *
@@ -136,17 +143,21 @@ export function createNetworkClient({
136143 } ) ;
137144 } ) ;
138145
139- const rpcApiMiddleware =
140- configuration . type === NetworkClientType . Infura
141- ? createInfuraMiddleware ( {
142- rpcService : rpcServiceChain ,
143- options : {
144- source : 'metamask' ,
145- } ,
146- } )
147- : createFetchMiddleware ( { rpcService : rpcServiceChain } ) ;
146+ let rpcApiMiddleware : RpcApiMiddleware ;
147+ if ( configuration . type === NetworkClientType . Infura ) {
148+ rpcApiMiddleware = asV2Middleware (
149+ createInfuraMiddleware ( {
150+ rpcService : rpcServiceChain ,
151+ options : {
152+ source : 'metamask' ,
153+ } ,
154+ } ) ,
155+ ) as unknown as RpcApiMiddleware ;
156+ } else {
157+ rpcApiMiddleware = createFetchMiddleware ( { rpcService : rpcServiceChain } ) ;
158+ }
148159
149- const rpcProvider = providerFromMiddleware ( rpcApiMiddleware ) ;
160+ const rpcProvider = providerFromMiddlewareV2 ( rpcApiMiddleware ) ;
150161
151162 const blockTracker = createBlockTracker ( {
152163 networkClientType : configuration . type ,
@@ -169,11 +180,9 @@ export function createNetworkClient({
169180 rpcApiMiddleware,
170181 } ) ;
171182
172- const engine = new JsonRpcEngine ( ) ;
173-
174- engine . push ( networkMiddleware ) ;
175-
176- const provider = new InternalProvider ( { engine } ) ;
183+ const provider = new InternalProvider ( {
184+ server : new JsonRpcServer ( { middleware : [ networkMiddleware ] } ) ,
185+ } ) ;
177186
178187 const destroy = ( ) => {
179188 // TODO: Either fix this lint violation or explain why it's necessary to ignore.
@@ -240,17 +249,19 @@ function createInfuraNetworkMiddleware({
240249 blockTracker : PollingBlockTracker ;
241250 network : InfuraNetworkType ;
242251 rpcProvider : InternalProvider ;
243- rpcApiMiddleware : JsonRpcMiddleware < JsonRpcParams , Json > ;
252+ rpcApiMiddleware : RpcApiMiddleware ;
244253} ) {
245- return mergeMiddleware ( [
246- createNetworkAndChainIdMiddleware ( { network } ) ,
247- createBlockCacheMiddleware ( { blockTracker } ) ,
248- createInflightCacheMiddleware ( ) ,
249- createBlockRefMiddleware ( { blockTracker, provider : rpcProvider } ) ,
250- createRetryOnEmptyMiddleware ( { blockTracker, provider : rpcProvider } ) ,
251- createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
252- rpcApiMiddleware ,
253- ] ) ;
254+ return JsonRpcEngineV2 . create ( {
255+ middleware : [
256+ createNetworkAndChainIdMiddleware ( { network } ) ,
257+ createBlockCacheMiddleware ( { blockTracker } ) ,
258+ createInflightCacheMiddleware ( ) ,
259+ createBlockRefMiddleware ( { blockTracker, provider : rpcProvider } ) ,
260+ createRetryOnEmptyMiddleware ( { blockTracker, provider : rpcProvider } ) ,
261+ createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
262+ rpcApiMiddleware ,
263+ ] ,
264+ } ) . asMiddleware ( ) ;
254265}
255266
256267/**
@@ -272,11 +283,10 @@ function createNetworkAndChainIdMiddleware({
272283
273284const createChainIdMiddleware = (
274285 chainId : Hex ,
275- ) : JsonRpcMiddleware < JsonRpcParams , Json > => {
276- return ( req , res , next , end ) => {
277- if ( req . method === 'eth_chainId' ) {
278- res . result = chainId ;
279- return end ( ) ;
286+ ) : JsonRpcMiddleware < JsonRpcRequest , Json > => {
287+ return ( { request, next } ) => {
288+ if ( request . method === 'eth_chainId' ) {
289+ return chainId ;
280290 }
281291 return next ( ) ;
282292 } ;
@@ -298,21 +308,23 @@ function createCustomNetworkMiddleware({
298308} : {
299309 blockTracker : PollingBlockTracker ;
300310 chainId : Hex ;
301- rpcApiMiddleware : JsonRpcMiddleware < JsonRpcParams , Json > ;
302- } ) : JsonRpcMiddleware < JsonRpcParams , Json > {
311+ rpcApiMiddleware : RpcApiMiddleware ;
312+ } ) {
303313 const testMiddlewares = process . env . IN_TEST
304314 ? [ createEstimateGasDelayTestMiddleware ( ) ]
305315 : [ ] ;
306316
307- return mergeMiddleware ( [
308- ...testMiddlewares ,
309- createChainIdMiddleware ( chainId ) ,
310- createBlockRefRewriteMiddleware ( { blockTracker } ) ,
311- createBlockCacheMiddleware ( { blockTracker } ) ,
312- createInflightCacheMiddleware ( ) ,
313- createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
314- rpcApiMiddleware ,
315- ] ) ;
317+ return JsonRpcEngineV2 . create ( {
318+ middleware : [
319+ ...testMiddlewares ,
320+ createChainIdMiddleware ( chainId ) ,
321+ createBlockRefRewriteMiddleware ( { blockTracker } ) ,
322+ createBlockCacheMiddleware ( { blockTracker } ) ,
323+ createInflightCacheMiddleware ( ) ,
324+ createBlockTrackerInspectorMiddleware ( { blockTracker } ) ,
325+ rpcApiMiddleware ,
326+ ] ,
327+ } ) . asMiddleware ( ) ;
316328}
317329
318330/**
@@ -321,11 +333,14 @@ function createCustomNetworkMiddleware({
321333 *
322334 * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
323335 */
324- function createEstimateGasDelayTestMiddleware ( ) {
325- return createAsyncMiddleware ( async ( req , _ , next ) => {
326- if ( req . method === 'eth_estimateGas' ) {
336+ function createEstimateGasDelayTestMiddleware ( ) : JsonRpcMiddleware <
337+ JsonRpcRequest ,
338+ Json
339+ > {
340+ return async ( { request, next } ) => {
341+ if ( request . method === 'eth_estimateGas' ) {
327342 await new Promise ( ( resolve ) => setTimeout ( resolve , SECOND * 2 ) ) ;
328343 }
329344 return next ( ) ;
330- } ) ;
345+ } ;
331346}
0 commit comments