diff --git a/package.json b/package.json index 8b17d8f8..a21c4e16 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "dependencies": { "@metamask/base-controller": "^3.0.0", "@metamask/controller-utils": "^8.0.1", - "@metamask/network-controller": "^17.0.0", + "@metamask/network-controller": "^20.0.0", + "@metamask/rpc-errors": "^6.3.1", "@metamask/utils": "^8.3.0", "await-semaphore": "^0.1.3", "crypto-js": "^4.2.0", diff --git a/src/index.ts b/src/index.ts index d268fe5a..d264c435 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,6 @@ export type { PPOMState, UsePPOM, PPOMControllerActions, - PPOMControllerEvents, PPOMControllerMessenger, } from './ppom-controller'; export { NETWORK_CACHE_DURATION, PPOMController } from './ppom-controller'; diff --git a/src/ppom-controller.test.ts b/src/ppom-controller.test.ts index b3b4152d..01c6d788 100644 --- a/src/ppom-controller.test.ts +++ b/src/ppom-controller.test.ts @@ -122,8 +122,8 @@ describe('PPOMController', () => { buildFetchSpy(); const { ppomController } = buildPPOMController({ provider: { - sendAsync: (_arg1: any, arg2: any) => { - arg2(undefined, 'DUMMY_VALUE'); + request: async () => { + return Promise.resolve('DUMMY_VALUE'); }, }, }); @@ -244,6 +244,7 @@ describe('PPOMController', () => { }), state: { storageMetadata: StorageMetadata, + versionInfo: [], }, }); @@ -306,14 +307,29 @@ describe('PPOMController', () => { status: 304, json: () => VERSION_INFO, }); - const { changeNetwork, ppomController } = buildPPOMController(); + const { changeNetwork, mockGetNetworkClientById, ppomController } = + buildPPOMController(); await ppomController.usePPOM(async () => { return Promise.resolve(); }); expect(spy).toHaveBeenCalledTimes(3); - changeNetwork('0x2'); - changeNetwork(Utils.SUPPORTED_NETWORK_CHAINIDS.MAINNET); + mockGetNetworkClientById.mockReturnValue({ + configuration: { + chainId: '0x2', + }, + }); + changeNetwork({ + selectedNetworkClientId: 'selectedNetworkClientId1', + }); + mockGetNetworkClientById.mockReturnValue({ + configuration: { + chainId: Utils.SUPPORTED_NETWORK_CHAINIDS.MAINNET, + }, + }); + changeNetwork({ + selectedNetworkClientId: 'selectedNetworkClientId2', + }); await ppomController.usePPOM(async () => { return Promise.resolve(); }); @@ -326,7 +342,7 @@ describe('PPOMController', () => { const { ppomController } = buildPPOMController({ ppomProvider: { ppomInit: async () => { - return Promise.resolve('123'); + return Promise.resolve(); }, PPOM: new PPOMClass(undefined, freeMock), }, @@ -365,36 +381,51 @@ describe('PPOMController', () => { const freeMock = jest.fn().mockImplementation(() => { throw new Error('some error'); }); - const { changeNetwork, ppomController } = buildPPOMController({ - ppomProvider: { - ppomInit: async () => { - return Promise.resolve('123'); + const { changeNetwork, mockGetNetworkClientById, ppomController } = + buildPPOMController({ + ppomProvider: { + ppomInit: async () => { + return Promise.resolve('123'); + }, + PPOM: new PPOMClass(undefined, freeMock), }, - PPOM: new PPOMClass(undefined, freeMock), - }, - }); + }); // calling usePPOM initialises PPOM await ppomController.usePPOM(async (ppom: any) => { expect(ppom).toBeDefined(); return Promise.resolve(); }); + mockGetNetworkClientById.mockReturnValue({ + configuration: { + chainId: '0x2', + }, + }); expect(async () => { - changeNetwork('0x2'); + changeNetwork({ + selectedNetworkClientId: 'selectedNetworkClientId1', + }); }).not.toThrow(); expect(mockMutexUse).toHaveBeenCalledTimes(2); }); it('should not do anything when networkChange called for same network', async () => { buildFetchSpy(); - const { changeNetwork, ppomController } = buildPPOMController(); + const { changeNetwork, mockGetNetworkClientById, ppomController } = + buildPPOMController(); // calling usePPOM initialises PPOM await ppomController.usePPOM(async (ppom: any) => { expect(ppom).toBeDefined(); return Promise.resolve(); }); - - changeNetwork(Utils.SUPPORTED_NETWORK_CHAINIDS.MAINNET); + mockGetNetworkClientById.mockReturnValue({ + configuration: { + chainId: Utils.SUPPORTED_NETWORK_CHAINIDS.MAINNET, + }, + }); + changeNetwork({ + selectedNetworkClientId: 'selectedNetworkClientId1', + }); expect(mockMutexUse).toHaveBeenCalledTimes(1); }); }); @@ -434,7 +465,7 @@ describe('PPOMController', () => { }, ppomProvider: { ppomInit: async () => { - return Promise.resolve('123'); + return Promise.resolve(); }, PPOM: new PPOMClass(undefined, freeMock), }, @@ -473,41 +504,46 @@ describe('PPOMController', () => { describe('jsonRPCRequest', () => { it('should propagate to ppom in correct format if JSON RPC request on provider fails', async () => { buildFetchSpy(); + const { ppomController } = buildPPOMController({ provider: { - sendAsync: (_arg1: any, arg2: any) => { - arg2('DUMMY_ERROR'); + request: () => { + throw new Error('DUMMY_ERROR'); }, }, }); - const result = await ppomController.usePPOM(async (ppom: any) => { - return await ppom.testJsonRPCRequest(); + await ppomController.usePPOM(async (ppom: any) => { + await expect(ppom.testJsonRPCRequest()).rejects.toThrow('DUMMY_ERROR'); }); - expect(result.error).toBe('DUMMY_ERROR'); }); it('should not call provider if method call on provider is not allowed to PPOM', async () => { buildFetchSpy(); - const sendAsyncMock = jest.fn(); + const requestMock = jest.fn(); const { ppomController } = buildPPOMController({ provider: { - sendAsync: sendAsyncMock, + request: requestMock, }, }); await ppomController.usePPOM(async (ppom: any) => { - await ppom.testJsonRPCRequest('DUMMY_METHOD'); + await expect(ppom.testJsonRPCRequest('DUMMY_METHOD')).rejects.toThrow( + expect.objectContaining({ + code: Utils.PROVIDER_ERRORS.methodNotSupported().code, + message: Utils.PROVIDER_ERRORS.methodNotSupported().message, + }), + ); }); - expect(sendAsyncMock).toHaveBeenCalledTimes(0); + expect(requestMock).toHaveBeenCalledTimes(0); }); it('should rate limit number of requests by PPOM on provider', async () => { buildFetchSpy(); const { ppomController } = buildPPOMController({ provider: { - sendAsync: (_arg1: any, arg2: any) => { - arg2(undefined, 'DUMMY_VALUE'); + request: async () => { + return Promise.resolve('DUMMY_VALUE'); }, }, providerRequestLimit: 5, @@ -520,9 +556,11 @@ describe('PPOMController', () => { await ppom.testJsonRPCRequest(); await ppom.testJsonRPCRequest(); await ppom.testJsonRPCRequest(); - const result = await ppom.testJsonRPCRequest(); - expect(result.error.code).toBe( - Utils.PROVIDER_ERRORS.limitExceeded().error.code, + await expect(ppom.testJsonRPCRequest()).rejects.toThrow( + expect.objectContaining({ + code: Utils.PROVIDER_ERRORS.limitExceeded().code, + message: Utils.PROVIDER_ERRORS.limitExceeded().message, + }), ); }); }); @@ -531,8 +569,8 @@ describe('PPOMController', () => { buildFetchSpy(); const { ppomController } = buildPPOMController({ provider: { - sendAsync: (_arg1: any, arg2: any) => { - arg2(undefined, 'DUMMY_VALUE'); + request: async () => { + return Promise.resolve('DUMMY_VALUE'); }, }, providerRequestLimit: 25, diff --git a/src/ppom-controller.ts b/src/ppom-controller.ts index 03951e2f..6c0b71e3 100644 --- a/src/ppom-controller.ts +++ b/src/ppom-controller.ts @@ -2,16 +2,13 @@ import type { RestrictedControllerMessenger } from '@metamask/base-controller'; import { BaseControllerV2 } from '@metamask/base-controller'; import { safelyExecute, timeoutFetch } from '@metamask/controller-utils'; import type { + NetworkControllerGetNetworkClientByIdAction, NetworkControllerStateChangeEvent, NetworkState, Provider, } from '@metamask/network-controller'; -import type { - JsonRpcFailure, - Json, - JsonRpcParams, - JsonRpcSuccess, -} from '@metamask/utils'; +import { JsonRpcError } from '@metamask/rpc-errors'; +import type { Json, JsonRpcParams } from '@metamask/utils'; import { Mutex } from 'await-semaphore'; import type { @@ -26,7 +23,6 @@ import { checkFilePath, constructURLHref, createPayload, - IdGenerator, PROVIDER_ERRORS, validateSignature, } from './util'; @@ -133,14 +129,16 @@ export type UsePPOM = { export type PPOMControllerActions = UsePPOM; -export type PPOMControllerEvents = NetworkControllerStateChangeEvent; +export type AllowedEvents = NetworkControllerStateChangeEvent; + +export type AllowedActions = NetworkControllerGetNetworkClientByIdAction; export type PPOMControllerMessenger = RestrictedControllerMessenger< typeof controllerName, - PPOMControllerActions, - NetworkControllerStateChangeEvent, - never, - NetworkControllerStateChangeEvent['type'] + PPOMControllerActions | AllowedActions, + AllowedEvents, + AllowedActions['type'], + AllowedEvents['type'] >; // eslint-disable-next-line @typescript-eslint/naming-convention @@ -382,7 +380,12 @@ export class PPOMController extends BaseControllerV2< * 2. reset PPOM */ #onNetworkChange(networkControllerState: NetworkState): void { - const id = addHexPrefix(networkControllerState.providerConfig.chainId); + const selectedNetworkClient = this.messagingSystem.call( + 'NetworkController:getNetworkClientById', + networkControllerState.selectedNetworkClientId, + ); + const { chainId } = selectedNetworkClient.configuration; + const id = addHexPrefix(chainId); if (id === this.#chainId) { return; } @@ -620,47 +623,30 @@ export class PPOMController extends BaseControllerV2< * Send a JSON RPC request to the provider. * This method is used by the PPOM to make requests to the provider. */ - async #jsonRpcRequest( - method: string, - params: JsonRpcParams, - ): Promise< - | JsonRpcSuccess - | (Omit & { error: unknown }) - | ReturnType<(typeof PROVIDER_ERRORS)[keyof typeof PROVIDER_ERRORS]> - > { - return new Promise((resolve) => { - // Resolve with error if number of requests from PPOM to provider exceeds the limit for the current transaction - if (this.#providerRequests > this.#providerRequestLimit) { - resolve(PROVIDER_ERRORS.limitExceeded()); - return; - } - this.#providerRequests += 1; - // Resolve with error if the provider method called by PPOM is not allowed for PPOM - if (!ALLOWED_PROVIDER_CALLS.includes(method)) { - resolve(PROVIDER_ERRORS.methodNotSupported()); - return; - } - - this.#providerRequestsCount[method] = this.#providerRequestsCount[method] - ? Number(this.#providerRequestsCount[method]) + 1 - : 1; - - // Invoke provider and return result - this.#provider.sendAsync( - createPayload(method, params), - (error, res: JsonRpcSuccess) => { - if (error) { - resolve({ - jsonrpc: '2.0', - id: IdGenerator(), - error, - }); - } else { - resolve(res); - } - }, + async #jsonRpcRequest(method: string, params: JsonRpcParams): Promise { + // Resolve with error if number of requests from PPOM to provider exceeds the limit for the current transaction + if (this.#providerRequests > this.#providerRequestLimit) { + const limitExceededError = PROVIDER_ERRORS.limitExceeded(); + throw new JsonRpcError( + limitExceededError.code, + limitExceededError.message, ); - }); + } + this.#providerRequests += 1; + // Resolve with error if the provider method called by PPOM is not allowed for PPOM + if (!ALLOWED_PROVIDER_CALLS.includes(method)) { + const methodNotSupportedError = PROVIDER_ERRORS.methodNotSupported(); + throw new JsonRpcError( + methodNotSupportedError.code, + methodNotSupportedError.message, + ); + } + + this.#providerRequestsCount[method] = this.#providerRequestsCount[method] + ? Number(this.#providerRequestsCount[method]) + 1 + : 1; + + return await this.#provider.request(createPayload(method, params)); } /* diff --git a/src/util.ts b/src/util.ts index 5e42a097..d1d7575a 100644 --- a/src/util.ts +++ b/src/util.ts @@ -44,24 +44,11 @@ export const createPayload = (method: string, params: JsonRpcParams) => } as const); export const PROVIDER_ERRORS = { - limitExceeded: () => - ({ - jsonrpc: '2.0', - id: IdGenerator(), - error: { - code: -32005, - message: 'Limit exceeded', - }, - } as const), - methodNotSupported: () => - ({ - jsonrpc: '2.0', - id: IdGenerator(), - error: { - code: -32601, - message: 'Method not supported', - }, - } as const), + limitExceeded: () => ({ code: -32005, message: 'Limit exceeded' }), + methodNotSupported: () => ({ + code: -32601, + message: 'Method not supported', + }), }; const getHash = async ( diff --git a/test/test-utils.ts b/test/test-utils.ts index 18f82d53..9ff896a8 100644 --- a/test/test-utils.ts +++ b/test/test-utils.ts @@ -1,10 +1,14 @@ import { ControllerMessenger } from '@metamask/base-controller'; import * as ControllerUtils from '@metamask/controller-utils'; -import type { NetworkState } from '@metamask/network-controller'; +import type { + NetworkClientId, + NetworkState, +} from '@metamask/network-controller'; import type { + AllowedActions, + AllowedEvents, PPOMControllerActions, - PPOMControllerEvents, } from '../src/ppom-controller'; import { PPOMController } from '../src/ppom-controller'; import type { StorageKey } from '../src/ppom-storage'; @@ -174,39 +178,60 @@ export class PPOMClass { }; } -export const buildPPOMController = (args?: any) => { +export const buildPPOMController = (options?: any) => { const controllerMessenger: ControllerMessenger< - PPOMControllerActions, - PPOMControllerEvents + PPOMControllerActions | AllowedActions, + AllowedEvents > = new ControllerMessenger(); + const messenger = controllerMessenger.getRestricted({ + name: 'PPOMController', + allowedActions: ['NetworkController:getNetworkClientById'], + allowedEvents: ['NetworkController:stateChange'], + }); + const mockGetNetworkClientById = jest.fn(); + controllerMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + mockGetNetworkClientById.mockReturnValue({ + configuration: { chainId: '0x1' }, + provider: {}, + destroy: {}, + blockTracker: {}, + }), + ); const ppomController = new PPOMController({ storageBackend: storageBackendReturningData, provider: () => undefined, chainId: SUPPORTED_NETWORK_CHAINIDS.MAINNET, - messenger: controllerMessenger.getRestricted({ - name: 'PPOMController', - allowedEvents: ['NetworkController:stateChange'], - }), + messenger, securityAlertsEnabled: true, onPreferencesChange: () => undefined, state: {}, ppomProvider: { - ppomInit: () => 123, + ppomInit: jest.fn(), PPOM: new PPOMClass(), }, cdnBaseUrl: 'ppom_cdn_base_url', - ...args, + ...options, }); - const changeNetwork = (chainId: string) => { + const changeNetwork = ({ + selectedNetworkClientId, + }: { + selectedNetworkClientId: NetworkClientId; + }) => { controllerMessenger.publish( 'NetworkController:stateChange', { - providerConfig: { chainId }, + selectedNetworkClientId, } as NetworkState, [], ); }; - return { changeNetwork, controllerMessenger, ppomController }; + return { + changeNetwork, + mockGetNetworkClientById, + controllerMessenger, + ppomController, + }; }; // eslint-disable-next-line jsdoc/require-jsdoc diff --git a/yarn.lock b/yarn.lock index 67436223..3a88ed29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -963,17 +963,34 @@ __metadata: languageName: node linkType: hard -"@metamask/base-controller@npm:^4.1.1": - version: 4.1.1 - resolution: "@metamask/base-controller@npm:4.1.1" +"@metamask/base-controller@npm:^6.0.0": + version: 6.0.0 + resolution: "@metamask/base-controller@npm:6.0.0" dependencies: "@metamask/utils": ^8.3.0 immer: ^9.0.6 - checksum: adfbc9815506f41342036743b481236179ffd8378e58dad4ffd5b55158d1a5d5509b113d17af5fe1de35d02c448a7c92fffd5234da1893374aab498356585f76 + checksum: ff5c4acedc698e2477f1d719f64363d8763b21836dcea4675214c078457cd47dde068aa336b249663f3c7fb3c0f536ce420870811e00ca3a410646740a9f5934 languageName: node linkType: hard -"@metamask/controller-utils@npm:^8.0.1, @metamask/controller-utils@npm:^8.0.2": +"@metamask/controller-utils@npm:^11.0.0": + version: 11.0.0 + resolution: "@metamask/controller-utils@npm:11.0.0" + dependencies: + "@ethereumjs/util": ^8.1.0 + "@metamask/eth-query": ^4.0.0 + "@metamask/ethjs-unit": ^0.3.0 + "@metamask/utils": ^8.3.0 + "@spruceid/siwe-parser": 2.1.0 + "@types/bn.js": ^5.1.5 + bn.js: ^5.2.1 + eth-ens-namehash: ^2.0.8 + fast-deep-equal: ^3.1.3 + checksum: ce77d9006c34109d78787d91036b605c2e401f51bae58a60cfd955905ebd63ebe5a007b93861a1fcc51bb7e57b69ec2a6dd6142656c1ee2d87d74e397752dffa + languageName: node + linkType: hard + +"@metamask/controller-utils@npm:^8.0.1": version: 8.0.2 resolution: "@metamask/controller-utils@npm:8.0.2" dependencies: @@ -1038,37 +1055,50 @@ __metadata: languageName: node linkType: hard -"@metamask/eth-json-rpc-infura@npm:^9.0.0": - version: 9.0.0 - resolution: "@metamask/eth-json-rpc-infura@npm:9.0.0" +"@metamask/eth-block-tracker@npm:^9.0.3": + version: 9.0.3 + resolution: "@metamask/eth-block-tracker@npm:9.0.3" + dependencies: + "@metamask/eth-json-rpc-provider": ^3.0.2 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^8.1.0 + json-rpc-random-id: ^1.0.1 + pify: ^5.0.0 + checksum: edd3d59a0416752d90c8e2d8c10c31635dbe3eb323fcb054c401528afe4cbbb6a5a85aedd6ffee4a504d9779656bfab027f2274fd95981c90bf56b6f565dbca2 + languageName: node + linkType: hard + +"@metamask/eth-json-rpc-infura@npm:^9.1.0": + version: 9.1.0 + resolution: "@metamask/eth-json-rpc-infura@npm:9.1.0" dependencies: "@metamask/eth-json-rpc-provider": ^2.1.0 "@metamask/json-rpc-engine": ^7.1.1 "@metamask/rpc-errors": ^6.0.0 "@metamask/utils": ^8.1.0 - node-fetch: ^2.6.7 - checksum: 3dd6783dd54a72fc479496212524150e3e3f6869a135a02709d3ef9c2d7a2e2b99690eef91776c269da3c0d79709daed0c8693549cb8dd999e5b3d96e0b106c0 + node-fetch: ^2.7.0 + checksum: 58f2a6b6ce9c545c9210b2ab3f8c0946cc82ed02c82a096406d8c7146c89c1eba1a13e472048a6e252906dd5eb336e63238d9a5446407c1d46b1d6a40e2a64f4 languageName: node linkType: hard -"@metamask/eth-json-rpc-middleware@npm:^12.0.1": - version: 12.1.0 - resolution: "@metamask/eth-json-rpc-middleware@npm:12.1.0" +"@metamask/eth-json-rpc-middleware@npm:^12.1.1": + version: 12.1.2 + resolution: "@metamask/eth-json-rpc-middleware@npm:12.1.2" dependencies: - "@metamask/eth-json-rpc-provider": ^2.1.0 + "@metamask/eth-block-tracker": ^9.0.3 + "@metamask/eth-json-rpc-provider": ^3.0.2 "@metamask/eth-sig-util": ^7.0.0 - "@metamask/json-rpc-engine": ^7.1.1 + "@metamask/json-rpc-engine": ^8.0.2 "@metamask/rpc-errors": ^6.0.0 "@metamask/utils": ^8.1.0 - eth-block-tracker: ^8.0.0 klona: ^2.0.6 pify: ^5.0.0 safe-stable-stringify: ^2.4.3 - checksum: de4f0afb80575d853901812406e9c58bafd3a1679164b2b9fa60dcfc8841c7e625661b9f1ebe5ef4d0d15b66736a7a5495388de879739689af9a9539daf1fdfa + checksum: 0334fa8e51d73488e42e1cd663e90012f4055c5cd04cb4ff371ecb3552b82cd271f27a88ff0187ad23f195cfbbba467126711c08b20c1124083a706a85524a82 languageName: node linkType: hard -"@metamask/eth-json-rpc-provider@npm:^2.1.0, @metamask/eth-json-rpc-provider@npm:^2.3.2": +"@metamask/eth-json-rpc-provider@npm:^2.1.0": version: 2.3.2 resolution: "@metamask/eth-json-rpc-provider@npm:2.3.2" dependencies: @@ -1079,6 +1109,30 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-json-rpc-provider@npm:^3.0.2": + version: 3.0.2 + resolution: "@metamask/eth-json-rpc-provider@npm:3.0.2" + dependencies: + "@metamask/json-rpc-engine": ^8.0.2 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^8.3.0 + checksum: 0321eaad6fa205a9d3ddcfaf28e63c05291614893cb2e116151185a4acbd6bb6a508d6e556b3cb8bc4d3caef4bf0a638202d9b6bdc127fbcb81715eb2660a809 + languageName: node + linkType: hard + +"@metamask/eth-json-rpc-provider@npm:^4.1.0": + version: 4.1.0 + resolution: "@metamask/eth-json-rpc-provider@npm:4.1.0" + dependencies: + "@metamask/json-rpc-engine": ^9.0.0 + "@metamask/rpc-errors": ^6.2.1 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^8.3.0 + uuid: ^8.3.2 + checksum: c9669c93df073423d36ff941b512247b569e7f7c56cc6110565bc8dc6590ad691a78d6d17eea6243721c1c464f0f008ea1326fc7373f90fb705fba5fb85d804d + languageName: node + linkType: hard + "@metamask/eth-query@npm:^4.0.0": version: 4.0.0 resolution: "@metamask/eth-query@npm:4.0.0" @@ -1113,6 +1167,18 @@ __metadata: languageName: node linkType: hard +"@metamask/ethjs-unit@npm:^0.3.0": + version: 0.3.0 + resolution: "@metamask/ethjs-unit@npm:0.3.0" + dependencies: + "@metamask/number-to-bn": ^1.7.1 + bn.js: ^5.2.1 + peerDependencies: + "@babel/runtime": ^7.0.0 + checksum: 9eb4f894b24c43b7b14a9180cebb0603d4a07c1af583b0c4a36d58f24e202831bbdf98888666b4a3ea2e4d4a9fef4c6cc55d09379870b20b080ea5582764e622 + languageName: node + linkType: hard + "@metamask/json-rpc-engine@npm:^7.1.1, @metamask/json-rpc-engine@npm:^7.3.2": version: 7.3.2 resolution: "@metamask/json-rpc-engine@npm:7.3.2" @@ -1124,25 +1190,58 @@ __metadata: languageName: node linkType: hard -"@metamask/network-controller@npm:^17.0.0": - version: 17.2.0 - resolution: "@metamask/network-controller@npm:17.2.0" +"@metamask/json-rpc-engine@npm:^8.0.2": + version: 8.0.2 + resolution: "@metamask/json-rpc-engine@npm:8.0.2" + dependencies: + "@metamask/rpc-errors": ^6.2.1 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^8.3.0 + checksum: c240d298ad503d93922a94a62cf59f0344b6d6644a523bc8ea3c0f321bea7172b89f2747a5618e2861b2e8152ae5086b76f391a10e4566529faa50b8850c051d + languageName: node + linkType: hard + +"@metamask/json-rpc-engine@npm:^9.0.0": + version: 9.0.0 + resolution: "@metamask/json-rpc-engine@npm:9.0.0" + dependencies: + "@metamask/rpc-errors": ^6.2.1 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^8.3.0 + checksum: b97170b36843145361015dabc5651df1d2c7f28f0756d3c9c05aef6a483098d562a9983cbe0e15f7fd1a66aa26481132b03ccb9061a2c48f0d3249c1f2348e97 + languageName: node + linkType: hard + +"@metamask/network-controller@npm:^20.0.0": + version: 20.0.0 + resolution: "@metamask/network-controller@npm:20.0.0" dependencies: - "@metamask/base-controller": ^4.1.1 - "@metamask/controller-utils": ^8.0.2 - "@metamask/eth-json-rpc-infura": ^9.0.0 - "@metamask/eth-json-rpc-middleware": ^12.0.1 - "@metamask/eth-json-rpc-provider": ^2.3.2 + "@metamask/base-controller": ^6.0.0 + "@metamask/controller-utils": ^11.0.0 + "@metamask/eth-block-tracker": ^9.0.3 + "@metamask/eth-json-rpc-infura": ^9.1.0 + "@metamask/eth-json-rpc-middleware": ^12.1.1 + "@metamask/eth-json-rpc-provider": ^4.1.0 "@metamask/eth-query": ^4.0.0 - "@metamask/json-rpc-engine": ^7.3.2 - "@metamask/rpc-errors": ^6.1.0 + "@metamask/json-rpc-engine": ^9.0.0 + "@metamask/rpc-errors": ^6.2.1 "@metamask/swappable-obj-proxy": ^2.2.0 "@metamask/utils": ^8.3.0 - async-mutex: ^0.2.6 - eth-block-tracker: ^8.0.0 + async-mutex: ^0.5.0 immer: ^9.0.6 + loglevel: ^1.8.1 uuid: ^8.3.2 - checksum: 8fedec394888020a61379c2b64cc1c5bd1c8d43875f4a0c8c13be28f4e04f8375bc175b02c91281b172e1258d601e3e36d5fdd7321bd8eb39e89e3f2da92c1df + checksum: 27a4b669655d4566045de5489d9bc8fee8454f2e74ddc844c0c978a5af6b821c0bdf020b9b649db32f07a298006c021e33e6d29ccf64a6f6301a8e80de21000c + languageName: node + linkType: hard + +"@metamask/number-to-bn@npm:^1.7.1": + version: 1.7.1 + resolution: "@metamask/number-to-bn@npm:1.7.1" + dependencies: + bn.js: 5.2.1 + strip-hex-prefix: 1.0.0 + checksum: e3c198c7ab4783757b36413d67d917f5fd5cadd01ebd7d92ae1ab6cbb11f11bfe9fae89ed849f8d7b0120c3746c58d87e9950df167bd342f0a6e590590d4e0ce languageName: node linkType: hard @@ -1159,7 +1258,8 @@ __metadata: "@metamask/eslint-config-jest": ^12.0.0 "@metamask/eslint-config-nodejs": ^12.1.0 "@metamask/eslint-config-typescript": ^12.1.0 - "@metamask/network-controller": ^17.0.0 + "@metamask/network-controller": ^20.0.0 + "@metamask/rpc-errors": ^6.3.1 "@metamask/utils": ^8.3.0 "@types/crypto-js": ^4.2.1 "@types/elliptic": ^6.4.14 @@ -1193,13 +1293,13 @@ __metadata: languageName: unknown linkType: soft -"@metamask/rpc-errors@npm:^6.0.0, @metamask/rpc-errors@npm:^6.1.0": - version: 6.1.0 - resolution: "@metamask/rpc-errors@npm:6.1.0" +"@metamask/rpc-errors@npm:^6.0.0, @metamask/rpc-errors@npm:^6.1.0, @metamask/rpc-errors@npm:^6.2.1, @metamask/rpc-errors@npm:^6.3.1": + version: 6.3.1 + resolution: "@metamask/rpc-errors@npm:6.3.1" dependencies: - "@metamask/utils": ^8.1.0 + "@metamask/utils": ^9.0.0 fast-safe-stringify: ^2.0.6 - checksum: 9f4821d804e2fcaa8987b0958d02c6d829b7c7db49740c811cb593f381d0c4b00dabb7f1802907f1b2f6126f7c0d83ec34219183d29650f5d24df014ac72906a + checksum: 8761f5c0161cb3b342abd3ccccbd7b792f36a987e1f22c3f89b1bd29f72a2e35a2c91b58164fdd9dc3e5b67157500dcbdb5d04245117c14310c34cf42f7b8463 languageName: node linkType: hard @@ -1210,6 +1310,13 @@ __metadata: languageName: node linkType: hard +"@metamask/superstruct@npm:^3.1.0": + version: 3.1.0 + resolution: "@metamask/superstruct@npm:3.1.0" + checksum: 00e4d0c0aae8b25ccc1885c1db0bb4ed1590010570140c255e4deee3bf8a10c859c8fce5e475b4ae09c8a56316207af87585b91f7f5a5c028d668ccd111f19e3 + languageName: node + linkType: hard + "@metamask/swappable-obj-proxy@npm:^2.2.0": version: 2.2.0 resolution: "@metamask/swappable-obj-proxy@npm:2.2.0" @@ -1233,6 +1340,23 @@ __metadata: languageName: node linkType: hard +"@metamask/utils@npm:^9.0.0": + version: 9.0.0 + resolution: "@metamask/utils@npm:9.0.0" + dependencies: + "@ethereumjs/tx": ^4.2.0 + "@metamask/superstruct": ^3.1.0 + "@noble/hashes": ^1.3.1 + "@scure/base": ^1.1.3 + "@types/debug": ^4.1.7 + debug: ^4.3.4 + pony-cause: ^2.1.10 + semver: ^7.5.4 + uuid: ^9.0.1 + checksum: 5dcb9d47c4768c33d451cc74c83207726c68b1340be1d091ca44105564f0ba0703026d357de7996de4459ac41cd420a0eb1f06db32f5ebbeeee581393f45fd44 + languageName: node + linkType: hard + "@noble/curves@npm:1.3.0, @noble/curves@npm:~1.3.0": version: 1.3.0 resolution: "@noble/curves@npm:1.3.0" @@ -1242,13 +1366,20 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.3, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:~1.3.2": +"@noble/hashes@npm:1.3.3, @noble/hashes@npm:~1.3.2": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" checksum: 8a6496d1c0c64797339bc694ad06cdfaa0f9e56cd0c3f68ae3666cfb153a791a55deb0af9c653c7ed2db64d537aa3e3054629740d2f2338bb1dcb7ab60cd205b languageName: node linkType: hard +"@noble/hashes@npm:^1.1.2, @noble/hashes@npm:^1.3.1": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 8ba816ae26c90764b8c42493eea383716396096c5f7ba6bea559993194f49d80a73c081f315f4c367e51bd2d5891700bcdfa816b421d24ab45b41cb03e4f3342 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1423,6 +1554,18 @@ __metadata: languageName: node linkType: hard +"@spruceid/siwe-parser@npm:2.1.0": + version: 2.1.0 + resolution: "@spruceid/siwe-parser@npm:2.1.0" + dependencies: + "@noble/hashes": ^1.1.2 + apg-js: ^4.1.1 + uri-js: ^4.4.1 + valid-url: ^1.0.9 + checksum: 99365956bd5e35127568e7ee69246cfc79cc26d83f6fbc5e3a9ed6f0693f7da6f2ee67cf8b93b65761da3c3ce8cc156858bab85e24b2eadd49ec8ae07cb8826e + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -1499,7 +1642,7 @@ __metadata: languageName: node linkType: hard -"@types/bn.js@npm:*, @types/bn.js@npm:^5.1.0": +"@types/bn.js@npm:*, @types/bn.js@npm:^5.1.0, @types/bn.js@npm:^5.1.5": version: 5.1.5 resolution: "@types/bn.js@npm:5.1.5" dependencies: @@ -2185,12 +2328,12 @@ __metadata: languageName: node linkType: hard -"async-mutex@npm:^0.2.6": - version: 0.2.6 - resolution: "async-mutex@npm:0.2.6" +"async-mutex@npm:^0.5.0": + version: 0.5.0 + resolution: "async-mutex@npm:0.5.0" dependencies: - tslib: ^2.0.0 - checksum: f50102e0c57f6a958528cff7dff13da070897f17107b42274417a7248905b927b6e51c3387f8aed1f5cd6005b0e692d64a83a0789be602e4e7e7da4afe08b889 + tslib: ^2.4.0 + checksum: be1587f4875f3bb15e34e9fcce82eac2966daef4432c8d0046e61947fb9a1b95405284601bc7ce4869319249bc07c75100880191db6af11d1498931ac2a2f9ea languageName: node linkType: hard @@ -2326,6 +2469,13 @@ __metadata: languageName: node linkType: hard +"bn.js@npm:5.2.1, bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 + languageName: node + linkType: hard + "bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" @@ -2333,13 +2483,6 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^5.1.2, bn.js@npm:^5.2.0": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -3530,19 +3673,6 @@ __metadata: languageName: node linkType: hard -"eth-block-tracker@npm:^8.0.0": - version: 8.1.0 - resolution: "eth-block-tracker@npm:8.1.0" - dependencies: - "@metamask/eth-json-rpc-provider": ^2.1.0 - "@metamask/safe-event-emitter": ^3.0.0 - "@metamask/utils": ^8.1.0 - json-rpc-random-id: ^1.0.1 - pify: ^5.0.0 - checksum: a7e1e8462995d2924a2daa3224539c120df6c07a26d68522f4338ca23189d4195545e6251b8e64f79dc99a685a8124efd496e25f7ee201dc273d92e3d9e90aad - languageName: node - linkType: hard - "eth-ens-namehash@npm:^2.0.8": version: 2.0.8 resolution: "eth-ens-namehash@npm:2.0.8" @@ -5413,6 +5543,13 @@ __metadata: languageName: node linkType: hard +"loglevel@npm:^1.8.1": + version: 1.9.1 + resolution: "loglevel@npm:1.9.1" + checksum: e1c8586108c4d566122e91f8a79c8df728920e3a714875affa5120566761a24077ec8ec9e5fc388b022e39fc411ec6e090cde1b5775871241b045139771eeb06 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.2.0 resolution: "lru-cache@npm:10.2.0" @@ -5834,7 +5971,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -7306,10 +7443,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad +"tslib@npm:^2.4.0, tslib@npm:^2.6.2": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 languageName: node linkType: hard @@ -7520,7 +7657,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -7545,6 +7682,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -7563,6 +7709,13 @@ __metadata: languageName: node linkType: hard +"valid-url@npm:^1.0.9": + version: 1.0.9 + resolution: "valid-url@npm:1.0.9" + checksum: 3ecb030559404441c2cf104cbabab8770efb0f36d117db03d1081052ef133015a68806148ce954bb4dd0b5c42c14b709a88783c93d66b0916cb67ba771c98702 + languageName: node + linkType: hard + "vscode-oniguruma@npm:^1.7.0": version: 1.7.0 resolution: "vscode-oniguruma@npm:1.7.0"