diff --git a/app/core/BackgroundBridge/BackgroundBridge.js b/app/core/BackgroundBridge/BackgroundBridge.js index 73ac7a3efd52..964a6da967a4 100644 --- a/app/core/BackgroundBridge/BackgroundBridge.js +++ b/app/core/BackgroundBridge/BackgroundBridge.js @@ -1,11 +1,11 @@ /* eslint-disable import/no-commonjs */ import URL from 'url-parse'; -import { JsonRpcEngine } from 'json-rpc-engine'; import { createSelectedNetworkMiddleware, METAMASK_DOMAIN, } from '@metamask/selected-network-controller'; import EthQuery from '@metamask/eth-query'; +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import MobilePortStream from '../MobilePortStream'; import { setupMultiplex } from '../../util/streams'; import { @@ -25,10 +25,10 @@ import snapMethodMiddlewareBuilder from '../Snaps/SnapsMethodMiddleware'; import { SubjectType } from '@metamask/permission-controller'; ///: END:ONLY_INCLUDE_IF +import { createEngineStream } from '@metamask/json-rpc-middleware-stream'; const createFilterMiddleware = require('@metamask/eth-json-rpc-filters'); const createSubscriptionManager = require('@metamask/eth-json-rpc-filters/subscriptionManager'); -const { providerAsMiddleware } = require('@metamask/eth-json-rpc-middleware'); -import { createEngineStream } from '@metamask/json-rpc-middleware-stream'; +import { providerAsMiddleware } from '@metamask/eth-json-rpc-middleware'; const pump = require('pump'); // eslint-disable-next-line import/no-nodejs-modules const EventEmitter = require('events').EventEmitter; @@ -388,11 +388,7 @@ export class BackgroundBridge extends EventEmitter { pump(outStream, providerStream, outStream, (err) => { // handle any middleware cleanup - this.engine._middleware.forEach((mid) => { - if (mid.destroy && typeof mid.destroy === 'function') { - mid.destroy(); - } - }); + this.engine.destroy(); if (err) Logger.log('Error with provider stream conn', err); }); } diff --git a/app/core/Encryptor/pbkdf2.test.ts b/app/core/Encryptor/pbkdf2.test.ts index e679b63b7f03..dd4589be55cf 100644 --- a/app/core/Encryptor/pbkdf2.test.ts +++ b/app/core/Encryptor/pbkdf2.test.ts @@ -9,7 +9,7 @@ describe('pbkdf2', () => { afterEach(() => { jest.restoreAllMocks(); }); - + it('uses the native implementation of pbkdf2 with main aes', async () => { NativeModules.Aes.pbkdf2 = jest .fn() diff --git a/app/core/Engine/controllers/RemoteFeatureFlagController/index.ts b/app/core/Engine/controllers/RemoteFeatureFlagController/index.ts index 54fc847b3970..49a15d2409e8 100644 --- a/app/core/Engine/controllers/RemoteFeatureFlagController/index.ts +++ b/app/core/Engine/controllers/RemoteFeatureFlagController/index.ts @@ -1,2 +1 @@ export { createRemoteFeatureFlagController } from './utils'; - diff --git a/app/core/Engine/controllers/RemoteFeatureFlagController/types.ts b/app/core/Engine/controllers/RemoteFeatureFlagController/types.ts index b42163fa2350..4e024983f3e7 100644 --- a/app/core/Engine/controllers/RemoteFeatureFlagController/types.ts +++ b/app/core/Engine/controllers/RemoteFeatureFlagController/types.ts @@ -2,7 +2,6 @@ import { RemoteFeatureFlagControllerMessenger, RemoteFeatureFlagControllerState export interface RemoteFeatureFlagInitParamTypes { state?: RemoteFeatureFlagControllerState; - messenger: RemoteFeatureFlagControllerMessenger, - disabled: boolean + messenger: RemoteFeatureFlagControllerMessenger; + disabled: boolean; } - diff --git a/app/core/Engine/controllers/RemoteFeatureFlagController/utils.test.ts b/app/core/Engine/controllers/RemoteFeatureFlagController/utils.test.ts index 21da6091ed9a..39ab4c1013a4 100644 --- a/app/core/Engine/controllers/RemoteFeatureFlagController/utils.test.ts +++ b/app/core/Engine/controllers/RemoteFeatureFlagController/utils.test.ts @@ -16,7 +16,6 @@ describe('RemoteFeatureFlagController utils', () => { describe('createRemoteFeatureFlagController', () => { it('creates controller with initial undefined state', () => { - const controller = createRemoteFeatureFlagController({ state: undefined, messenger, diff --git a/app/core/Engine/controllers/RemoteFeatureFlagController/utils.ts b/app/core/Engine/controllers/RemoteFeatureFlagController/utils.ts index c45fbe167bf2..55477c7a0995 100644 --- a/app/core/Engine/controllers/RemoteFeatureFlagController/utils.ts +++ b/app/core/Engine/controllers/RemoteFeatureFlagController/utils.ts @@ -34,7 +34,6 @@ export const createRemoteFeatureFlagController = ({ messenger, disabled, }: RemoteFeatureFlagInitParamTypes) => { - const remoteFeatureFlagController = new RemoteFeatureFlagController({ messenger, state, @@ -58,4 +57,3 @@ export const createRemoteFeatureFlagController = ({ } return remoteFeatureFlagController; }; - diff --git a/app/core/Ledger/Ledger.ts b/app/core/Ledger/Ledger.ts index fc595ea711e7..49ec0a513c9a 100644 --- a/app/core/Ledger/Ledger.ts +++ b/app/core/Ledger/Ledger.ts @@ -251,4 +251,3 @@ export const unlockLedgerWalletAccount = async (index: number) => { } }; - diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index 9f02e4ae2f51..65070c13421f 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -1,13 +1,14 @@ -import { - JsonRpcEngine, +import { JsonRpcEngine, JsonRpcMiddleware } from '@metamask/json-rpc-engine'; +import type { + Json, JsonRpcFailure, - JsonRpcMiddleware, + JsonRpcParams, JsonRpcRequest, JsonRpcResponse, JsonRpcSuccess, -} from 'json-rpc-engine'; +} from '@metamask/utils'; +import { type JsonRpcError, providerErrors, rpcErrors } from '@metamask/rpc-errors'; import type { TransactionParams } from '@metamask/transaction-controller'; -import { providerErrors, rpcErrors } from '@metamask/rpc-errors'; import Engine from '../Engine'; import { store } from '../../store'; import { getPermittedAccounts } from '../Permissions'; @@ -106,8 +107,8 @@ const jsonrpc = '2.0' as const; * @throws If the given value is not a valid {@link JsonRpcSuccess} object. */ function assertIsJsonRpcSuccess( - response: JsonRpcResponse, -): asserts response is JsonRpcSuccess { + response: JsonRpcResponse, +): asserts response is JsonRpcSuccess { if ('error' in response) { throw new Error(`Response failed with error '${JSON.stringify('error')}'`); } else if (!('result' in response)) { @@ -208,8 +209,8 @@ async function callMiddleware({ middleware, request, }: { - middleware: JsonRpcMiddleware; - request: JsonRpcRequest; + middleware: JsonRpcMiddleware; + request: JsonRpcRequest; }) { const engine = new JsonRpcEngine(); engine.push(middleware); @@ -415,7 +416,6 @@ describe('getRpcMethodMiddleware', () => { permissionController.createPermissionMiddleware({ origin: hostMock, }); - // @ts-expect-error JsonRpcId (number | string | void) doesn't match PS middleware's id, which is (string | number | null) engine.push(permissionMiddleware); const middleware = getRpcMethodMiddleware(getMinimalOptions()); engine.push(middleware); @@ -1096,7 +1096,8 @@ describe('getRpcMethodMiddleware', () => { it('returns a JSON-RPC error if an error is thrown when adding this transaction', async () => { // Omit `from` and `chainId` here to skip validation for simplicity // Downcast needed here because `from` is required by this type - const mockTransactionParameters = {} as TransactionParams; + const mockTransactionParameters = {} as (TransactionParams & + JsonRpcParams)[]; // Transaction fails before returning a result mockAddTransaction.mockImplementation(async () => { throw new Error('Failed to add transaction'); @@ -1119,12 +1120,17 @@ describe('getRpcMethodMiddleware', () => { expect((response as JsonRpcFailure).error.message).toBe( expectedError.message, ); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(((response as JsonRpcFailure).error as JsonRpcError).data.cause.message).toBe( + expectedError.message, + ); }); it('returns a JSON-RPC error if an error is thrown after approval', async () => { // Omit `from` and `chainId` here to skip validation for simplicity // Downcast needed here because `from` is required by this type - const mockTransactionParameters = {} as TransactionParams; + const mockTransactionParameters = {} as (TransactionParams & + JsonRpcParams)[]; setupGlobalState({ addTransactionResult: Promise.reject( new Error('Failed to process transaction'), @@ -1233,7 +1239,7 @@ describe('getRpcMethodMiddleware', () => { jsonrpc, id: 1, method: 'personal_ecRecover', - params: [undefined, helloWorldSignature], + params: [undefined, helloWorldSignature] as JsonRpcParams, }; const expectedError = rpcErrors.internal('Missing data parameter'); diff --git a/app/core/RPCMethods/RPCMethodMiddleware.ts b/app/core/RPCMethods/RPCMethodMiddleware.ts index 4f3580e0d922..787fe3f9b38d 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.ts @@ -1,6 +1,6 @@ import { Alert } from 'react-native'; import { getVersion } from 'react-native-device-info'; -import { createAsyncMiddleware } from 'json-rpc-engine'; +import { createAsyncMiddleware } from '@metamask/json-rpc-engine'; import { providerErrors, rpcErrors } from '@metamask/rpc-errors'; import { EndFlowOptions, diff --git a/app/core/RPCMethods/createLegacyMethodMiddleware/index.test.ts b/app/core/RPCMethods/createLegacyMethodMiddleware/index.test.ts index c37ce9bff14b..8ce5f6c89755 100644 --- a/app/core/RPCMethods/createLegacyMethodMiddleware/index.test.ts +++ b/app/core/RPCMethods/createLegacyMethodMiddleware/index.test.ts @@ -2,7 +2,7 @@ import { JsonRpcEngine, JsonRpcEngineEndCallback, JsonRpcEngineNextCallback, -} from 'json-rpc-engine'; +} from '@metamask/json-rpc-engine'; import { Json, JsonRpcParams, @@ -150,6 +150,10 @@ describe('createLegacyMethodMiddleware', () => { }); assertIsJsonRpcFailure(response); + // Type assertion for the error not having cause object + const errorData = response.error.data as { cause?: Error }; + + expect(errorData.cause?.message).toBe('test error'); expect(response.error.message).toBe('test error'); }); @@ -166,6 +170,10 @@ describe('createLegacyMethodMiddleware', () => { }); assertIsJsonRpcFailure(response); + // Type assertion for the error not having cause object + const errorData = response.error.data as { cause?: Error }; + + expect(errorData.cause?.message).toBe('test error'); expect(response.error.message).toBe('test error'); }); diff --git a/app/core/RPCMethods/createUnsupportedMethodMiddleware/index.ts b/app/core/RPCMethods/createUnsupportedMethodMiddleware/index.ts index 738f6f4c344b..832ef3c74b06 100644 --- a/app/core/RPCMethods/createUnsupportedMethodMiddleware/index.ts +++ b/app/core/RPCMethods/createUnsupportedMethodMiddleware/index.ts @@ -1,14 +1,16 @@ import { rpcErrors } from '@metamask/rpc-errors'; -import type { JsonRpcMiddleware } from 'json-rpc-engine'; +import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine'; + import { UNSUPPORTED_RPC_METHODS } from '../utils'; +import { Json, JsonRpcParams } from '@metamask/utils'; /** * Creates a middleware that rejects explicitly unsupported RPC methods with the * appropriate error. */ const createUnsupportedMethodMiddleware = (): JsonRpcMiddleware< - unknown, - void + JsonRpcParams, + Json > => async function unsupportedMethodMiddleware(req, _res, next, end) { if ((UNSUPPORTED_RPC_METHODS as Set).has(req.method)) { diff --git a/app/core/RPCMethods/eth_sendTransaction.test.ts b/app/core/RPCMethods/eth_sendTransaction.test.ts index 1490d436e423..a00c2c17d49f 100644 --- a/app/core/RPCMethods/eth_sendTransaction.test.ts +++ b/app/core/RPCMethods/eth_sendTransaction.test.ts @@ -1,6 +1,11 @@ // eslint-disable-next-line import/no-nodejs-modules import { inspect } from 'util'; -import type { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; +import type { + Json, + JsonRpcParams, + JsonRpcRequest, + PendingJsonRpcResponse, +} from '@metamask/utils'; import type { TransactionParams, TransactionController, @@ -50,8 +55,8 @@ const NETWORK_CLIENT_ID_MOCK = 'testNetworkClientId'; * @returns The JSON-RPC request. */ function constructSendTransactionRequest( - params: unknown, -): JsonRpcRequest & { + params: [TransactionParams & JsonRpcParams], +): JsonRpcRequest<[TransactionParams & JsonRpcParams]> & { method: 'eth_sendTransaction'; networkClientId: string; } { @@ -69,7 +74,7 @@ function constructSendTransactionRequest( * * @returns A pending JSON-RPC response. */ -function constructPendingJsonRpcResponse(): PendingJsonRpcResponse { +function constructPendingJsonRpcResponse(): PendingJsonRpcResponse { return { jsonrpc: '2.0', id: 1, @@ -181,6 +186,7 @@ describe('eth_sendTransaction', () => { async () => await eth_sendTransaction({ hostname: 'example.metamask.io', + //@ts-expect-error - invalid parameters forced req: constructSendTransactionRequest(invalidParameter), res: constructPendingJsonRpcResponse(), sendTransaction: getMockAddTransaction({ @@ -203,6 +209,7 @@ describe('eth_sendTransaction', () => { async () => await eth_sendTransaction({ hostname: 'example.metamask.io', + //@ts-expect-error - invalid parameters forced req: constructSendTransactionRequest(invalidParameter), res: constructPendingJsonRpcResponse(), sendTransaction: getMockAddTransaction({ diff --git a/app/core/RPCMethods/eth_sendTransaction.ts b/app/core/RPCMethods/eth_sendTransaction.ts index defb22b92809..93ca88c628d9 100644 --- a/app/core/RPCMethods/eth_sendTransaction.ts +++ b/app/core/RPCMethods/eth_sendTransaction.ts @@ -1,6 +1,12 @@ -import type { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; +import type { + Json, + JsonRpcParams, + JsonRpcRequest, + PendingJsonRpcResponse, +} from '@metamask/utils'; import { TransactionController, + TransactionParams, WalletDevice, } from '@metamask/transaction-controller'; import { rpcErrors } from '@metamask/rpc-errors'; @@ -46,6 +52,11 @@ const hasProperty = < ): objectToCheck is ObjectToCheck & Record => Object.hasOwnProperty.call(objectToCheck, name); +interface SendArgs { + from: string; + chainId?: number; +} + /** * Handle a `eth_sendTransaction` request. * @@ -66,16 +77,13 @@ async function eth_sendTransaction({ validateAccountAndChainId, }: { hostname: string; - req: JsonRpcRequest & { + req: JsonRpcRequest<[TransactionParams & JsonRpcParams]> & { method: 'eth_sendTransaction'; networkClientId: string; }; - res: PendingJsonRpcResponse; + res: PendingJsonRpcResponse; sendTransaction: TransactionController['addTransaction']; - validateAccountAndChainId: (args: { - from: string; - chainId?: number; - }) => Promise; + validateAccountAndChainId: (args: SendArgs) => Promise; }) { if ( !Array.isArray(req.params) && @@ -91,9 +99,13 @@ async function eth_sendTransaction({ message: `Invalid parameters: expected the first parameter to be an object`, }); } + // TODO: Normalize chainId to Hex string + const nChainId = typeof req.params[0].chainId === 'number' + ? req.params[0].chainId + : parseInt(req.params[0].chainId || '0x0', 16); await validateAccountAndChainId({ from: req.params[0].from, - chainId: req.params[0].chainId, + chainId: nChainId, }); const { result, transactionMeta } = await sendTransaction(req.params[0], { diff --git a/app/core/RPCMethods/utils.ts b/app/core/RPCMethods/utils.ts index d5b2c5776116..cb02a3d1805d 100644 --- a/app/core/RPCMethods/utils.ts +++ b/app/core/RPCMethods/utils.ts @@ -2,7 +2,7 @@ import { query } from '@metamask/controller-utils'; import Engine from '../Engine'; import { selectHooks } from '@metamask/snaps-rpc-methods'; import { OptionalDataWithOptionalCause, rpcErrors } from '@metamask/rpc-errors'; -import { JsonRpcMiddleware } from 'json-rpc-engine'; +import { JsonRpcMiddleware } from '@metamask/json-rpc-engine'; import { PermittedHandlerExport } from '@metamask/permission-controller'; import { Json, JsonRpcParams, hasProperty } from '@metamask/utils'; import EthQuery from '@metamask/eth-query'; @@ -76,7 +76,7 @@ export function makeMethodMiddlewareMaker( const makeMethodMiddleware = (hooks: Record) => { assertExpectedHook(hooks, expectedHookNames); - const methodMiddleware: JsonRpcMiddleware = async ( + const methodMiddleware: JsonRpcMiddleware = async ( req, res, next, @@ -88,12 +88,11 @@ export function makeMethodMiddlewareMaker( try { // Implementations may or may not be async, so we must await them. return await implementation( - // @ts-expect-error JsonRpcId (number | string | void) doesn't match the permission middleware's id, which is (string | number | null) req, res, next, end, - selectHooks(hooks, hookNames), + selectHooks(hooks, hookNames) as U, ); } catch (error) { if (process.env.METAMASK_DEBUG) { diff --git a/app/core/RPCMethods/wallet_watchAsset.ts b/app/core/RPCMethods/wallet_watchAsset.ts index fb45849a89a7..6fae74b084ac 100644 --- a/app/core/RPCMethods/wallet_watchAsset.ts +++ b/app/core/RPCMethods/wallet_watchAsset.ts @@ -11,8 +11,8 @@ import { } from '../../constants/error'; import { selectChainId, selectNetworkClientId } from '../../selectors/networkController'; import { isValidAddress } from 'ethereumjs-util'; -import { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; import { toChecksumHexAddress } from '@metamask/controller-utils'; +import { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils'; const wallet_watchAsset = async ({ req, diff --git a/app/core/SanitizationMiddleware.ts b/app/core/SanitizationMiddleware.ts index a7eb92f9291e..705b001a4ed2 100644 --- a/app/core/SanitizationMiddleware.ts +++ b/app/core/SanitizationMiddleware.ts @@ -1,4 +1,5 @@ -import { JsonRpcMiddleware, JsonRpcRequest } from 'json-rpc-engine'; +import { JsonRpcMiddleware } from '@metamask/json-rpc-engine'; +import type { Json, JsonRpcParams, JsonRpcRequest } from '@metamask/utils'; import { addHexPrefix } from 'ethereumjs-util'; // We use this to clean any custom params from the txParams @@ -39,18 +40,20 @@ export const permittedKeys = [ * @param parameter - The parameter to sanitize. * @returns The given parameter containing just permitted keys. */ -function sanitizeRpcParameter(parameter: Record) { - return permittedKeys.reduce>((copy, permitted) => { +function sanitizeRpcParameter( + parameter: Record, +): Record { + return permittedKeys.reduce>((copy, permitted) => { if (permitted in parameter) { const value = parameter[permitted]; if (Array.isArray(value)) { - copy[permitted] = value.map(sanitize); + copy[permitted] = value.map(sanitize) as Json; } else { - copy[permitted] = sanitize(value); + copy[permitted] = sanitize(value) as Json; } } return copy; - }, {}); + }, {} as Record); } /** @@ -80,12 +83,12 @@ function sanitize(value: unknown) { * request along. */ export function createSanitizationMiddleware(): JsonRpcMiddleware< - unknown, - unknown + JsonRpcParams, + Json > { // TODO: Replace "any" with type // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (req: JsonRpcRequest, _: any, next: () => any) => { + return (req: JsonRpcRequest, _: any, next: () => any) => { if (!Array.isArray(req.params)) { next(); return; diff --git a/app/core/Snaps/SnapBridge.ts b/app/core/Snaps/SnapBridge.ts index 93156cc7d49e..f6c0078fc888 100644 --- a/app/core/Snaps/SnapBridge.ts +++ b/app/core/Snaps/SnapBridge.ts @@ -10,7 +10,7 @@ import { createSwappableProxy, createEventEmitterProxy, } from '@metamask/swappable-obj-proxy'; -import { JsonRpcEngine } from 'json-rpc-engine'; +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { createEngineStream } from '@metamask/json-rpc-middleware-stream'; import EthQuery from '@metamask/eth-query'; @@ -20,10 +20,10 @@ import Logger from '../../util/Logger'; import snapMethodMiddlewareBuilder from './SnapsMethodMiddleware'; import { SubjectType } from '@metamask/permission-controller'; -const ObjectMultiplex = require('@metamask/object-multiplex'); -const createFilterMiddleware = require('@metamask/eth-json-rpc-filters'); -const createSubscriptionManager = require('@metamask/eth-json-rpc-filters/subscriptionManager'); -const { providerAsMiddleware } = require('@metamask/eth-json-rpc-middleware'); +import ObjectMultiplex from '@metamask/object-multiplex'; +import createFilterMiddleware from '@metamask/eth-json-rpc-filters'; +import createSubscriptionManager from '@metamask/eth-json-rpc-filters/subscriptionManager'; +import { providerAsMiddleware } from '@metamask/eth-json-rpc-middleware'; const pump = require('pump'); interface ISnapBridgeProps { @@ -124,14 +124,7 @@ export default class SnapBridge { // TODO: Replace "any" with type // eslint-disable-next-line @typescript-eslint/no-explicit-any pump(outStream, providerStream, outStream, (err: any) => { - // handle any middleware cleanup - // TODO: Replace "any" with type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - engine._middleware.forEach((mid: any) => { - if (mid.destroy && typeof mid.destroy === 'function') { - mid.destroy(); - } - }); + engine.destroy(); if (err) Logger.log('Error with provider stream conn', err); }); }; diff --git a/app/core/WalletConnect/extractApprovedAccounts.ts b/app/core/WalletConnect/extractApprovedAccounts.ts index 8018459950d8..24738d449f84 100644 --- a/app/core/WalletConnect/extractApprovedAccounts.ts +++ b/app/core/WalletConnect/extractApprovedAccounts.ts @@ -1,5 +1,5 @@ import { Caveat, ValidPermission } from '@metamask/permission-controller'; -import { Json } from 'json-rpc-engine'; +import { Json } from '@metamask/utils'; export const extractApprovedAccounts = ( accountPermission: // TODO: Replace "any" with type diff --git a/app/core/createTracingMiddleware/index.test.ts b/app/core/createTracingMiddleware/index.test.ts index c9a6f84ad2d7..f599e8704083 100644 --- a/app/core/createTracingMiddleware/index.test.ts +++ b/app/core/createTracingMiddleware/index.test.ts @@ -1,11 +1,11 @@ -import type { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; +import type { Json, JsonRpcParams, JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils'; import { default as createTracingMiddleware, MESSAGE_TYPE } from './index'; const REQUEST_MOCK = { id: 'testId', method: MESSAGE_TYPE.PERSONAL_SIGN, -} as JsonRpcRequest; -const RESPONSE_MOCK = {} as PendingJsonRpcResponse; +} as JsonRpcRequest; +const RESPONSE_MOCK = {} as PendingJsonRpcResponse; const NEXT_MOCK = jest.fn(); jest.mock('../../util/trace', () => ({ @@ -14,7 +14,7 @@ jest.mock('../../util/trace', () => ({ })); describe('createTracingMiddleware', () => { - let request: JsonRpcRequest & { traceContext?: unknown }; + let request: JsonRpcRequest & { traceContext?: unknown }; beforeEach(() => { jest.clearAllMocks(); request = { ...REQUEST_MOCK }; diff --git a/app/core/createTracingMiddleware/index.ts b/app/core/createTracingMiddleware/index.ts index 092447d3d015..5a5b623cdcec 100644 --- a/app/core/createTracingMiddleware/index.ts +++ b/app/core/createTracingMiddleware/index.ts @@ -1,4 +1,4 @@ -import type { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; +import type { Json, JsonRpcParams, JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils'; import { trace, TraceName } from '../../util/trace'; export const MESSAGE_TYPE = { @@ -19,8 +19,8 @@ const METHOD_TYPE_TO_TRACE_NAME: Record = { export default function createTracingMiddleware() { return async function tracingMiddleware( - req: JsonRpcRequest & { traceContext?: unknown }, - _res: PendingJsonRpcResponse, + req: JsonRpcRequest & { traceContext?: unknown }, + _res: PendingJsonRpcResponse, next: () => void, ) { const { id, method } = req; diff --git a/app/selectors/featureFlagController/index.test.ts b/app/selectors/featureFlagController/index.test.ts index ff76cdbdefa3..053f7dab92d7 100644 --- a/app/selectors/featureFlagController/index.test.ts +++ b/app/selectors/featureFlagController/index.test.ts @@ -26,4 +26,3 @@ describe('featureFlagController selector', () => { expect(result).toBeUndefined(); }); }); - diff --git a/app/selectors/featureFlagController/index.ts b/app/selectors/featureFlagController/index.ts index 01f67f3de0af..ea1c0ebc7d4a 100644 --- a/app/selectors/featureFlagController/index.ts +++ b/app/selectors/featureFlagController/index.ts @@ -9,4 +9,3 @@ export const selectRemoteFeatureFlags = createSelector( (remoteFeatureFlagControllerState) => remoteFeatureFlagControllerState?.remoteFeatureFlags ?? {} ); - diff --git a/app/selectors/featureFlagController/minimumAppVersion/index.test.ts b/app/selectors/featureFlagController/minimumAppVersion/index.test.ts index 785cf94a22d1..fe2fd7db7b01 100644 --- a/app/selectors/featureFlagController/minimumAppVersion/index.test.ts +++ b/app/selectors/featureFlagController/minimumAppVersion/index.test.ts @@ -45,7 +45,7 @@ describe('minimumAppVersion Feature flag: selectMobileMinimumVersions selector', it('returns default values when undefined RemoteFeatureFlagController state', () => { testFlagValues( selectMobileMinimumVersions(mockedUndefinedFlagsState), - defaultValues + defaultValues ); }); diff --git a/app/selectors/featureFlagController/minimumAppVersion/types.ts b/app/selectors/featureFlagController/minimumAppVersion/types.ts index 8aaa73501765..b09106973aa3 100644 --- a/app/selectors/featureFlagController/minimumAppVersion/types.ts +++ b/app/selectors/featureFlagController/minimumAppVersion/types.ts @@ -7,4 +7,3 @@ export type MinimumAppVersionType = { appleMinimumOS: number; androidMinimumAPIVersion: number; } - diff --git a/app/selectors/featureFlagController/mocks.ts b/app/selectors/featureFlagController/mocks.ts index 8433d6ef2847..99b265fe745e 100644 --- a/app/selectors/featureFlagController/mocks.ts +++ b/app/selectors/featureFlagController/mocks.ts @@ -45,4 +45,3 @@ export const getInvalidMockedFeatureFlag = (invalidFeatureFlag: FeatureFlags) => }, }, }); - diff --git a/app/selectors/featureFlagController/types.ts b/app/selectors/featureFlagController/types.ts index 7640a1b81a1c..ed260398c76e 100644 --- a/app/selectors/featureFlagController/types.ts +++ b/app/selectors/featureFlagController/types.ts @@ -6,4 +6,3 @@ export type StateWithPartialEngine = RootState | { backgroundState: Partial } }; - diff --git a/app/selectors/settings.ts b/app/selectors/settings.ts index 4f111a2b8c9d..16a228704cf2 100644 --- a/app/selectors/settings.ts +++ b/app/selectors/settings.ts @@ -22,4 +22,3 @@ export const selectBasicFunctionalityEnabled = createSelector( (settingsState: Record) => settingsState.basicFunctionalityEnabled as boolean, ); - diff --git a/babel.config.js b/babel.config.js index 8b3aa3906734..118e11284e47 100644 --- a/babel.config.js +++ b/babel.config.js @@ -19,6 +19,13 @@ module.exports = { test: './node_modules/@metamask/notification-services-controller', plugins: [['@babel/plugin-transform-private-methods', { loose: true }]], }, + { + test: [ + './node_modules/**/@metamask/rpc-errors/**', + './node_modules/@metamask/rpc-errors/**', + ], + plugins: [['@babel/plugin-transform-classes', { loose: true }]], + }, { test: './app/lib/snaps', plugins: [['babel-plugin-inline-import', { extensions: ['.html'] }]], diff --git a/bitrise.yml b/bitrise.yml index 838b9fe67f30..44878376bba8 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -1808,7 +1808,7 @@ app: NVM_SHA256SUM: '8e45fa547f428e9196a5613efad3bfa4d4608b74ca870f930090598f5af5f643' - opts: is_expand: false - NODE_VERSION: 20.17.0 + NODE_VERSION: 20.18.0 - opts: is_expand: false YARN_VERSION: 1.22.22 diff --git a/package.json b/package.json index 3e56519d1009..f3b7384745c1 100644 --- a/package.json +++ b/package.json @@ -112,6 +112,7 @@ "react-native-level-fs/**/bl": "^1.2.3", "react-native-level-fs/levelup/semver": "^5.7.2", "@metamask/react-native-payments/validator": "^13.7.0", + "**/@metamask/utils": "^10.0.0", "**/minimist": "1.2.6", "d3-color": "3.1.0", "tough-cookie": "4.1.3", @@ -157,6 +158,8 @@ "@metamask/composable-controller": "^10.0.0", "@metamask/controller-utils": "^11.3.0", "@metamask/design-tokens": "^4.0.0", + "@metamask/eth-json-rpc-filters": "^9.0.0", + "@metamask/eth-json-rpc-middleware": "^15.0.0", "@metamask/eth-hd-keyring": "^9.0.0", "@metamask/eth-json-rpc-filters": "^8.0.0", "@metamask/eth-json-rpc-middleware": "^11.0.2", @@ -168,6 +171,7 @@ "@metamask/ethjs-contract": "^0.4.1", "@metamask/ethjs-query": "^0.7.1", "@metamask/ethjs-unit": "^0.3.0", + "@metamask/json-rpc-engine": "^10.0.0", "@metamask/gas-fee-controller": "^22.0.2", "@metamask/json-rpc-middleware-stream": "^8.0.2", "@metamask/key-tree": "^9.0.0", @@ -206,6 +210,7 @@ "@metamask/swaps-controller": "^11.0.0", "@metamask/transaction-controller": "^42.0.0", "@metamask/utils": "^10.0.1", + "@metamask/swaps-controller": "^11.0.0", "@ngraveio/bc-ur": "^1.1.6", "@notifee/react-native": "^9.0.0", "@react-native-async-storage/async-storage": "^1.23.1", @@ -253,7 +258,6 @@ "d3-shape": "^3.2.0", "dayjs": "^1.11.13", "eciesjs": "^0.3.15", - "eth-block-tracker": "^7.0.1", "eth-ens-namehash": "2.0.8", "eth-url-parser": "1.0.4", "ethereumjs-abi": "0.6.6", @@ -270,7 +274,6 @@ "human-standard-token-abi": "^2.0.0", "humanize-duration": "^3.27.2", "is-url": "^1.2.4", - "json-rpc-engine": "^6.1.0", "lodash": "^4.17.21", "lottie-ios": "3.4.1", "lottie-react-native": "5.1.5", diff --git a/yarn.lock b/yarn.lock index 99a215534f4d..c09b581b05db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1982,7 +1982,7 @@ resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== -"@ethereumjs/tx@^4.0.2", "@ethereumjs/tx@^4.1.2", "@ethereumjs/tx@^4.2.0": +"@ethereumjs/tx@^4.0.2", "@ethereumjs/tx@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== @@ -5414,7 +5414,7 @@ resolved "https://registry.yarnpkg.com/@metamask/stake-sdk/-/stake-sdk-0.3.0.tgz#b6156fd29666bfb9482a89b555cfe70b2b63769a" integrity sha512-i0QkzEc/7HRpVJbhe+qPORprQaMsuzRBpSgFjKgxbsLhz4YtYVDTgVJ5kesZXNy2KfprYTfeh4oV/jenQWgNJA== -"@metamask/superstruct@^3.0.0", "@metamask/superstruct@^3.1.0": +"@metamask/superstruct@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@metamask/superstruct/-/superstruct-3.1.0.tgz#148f786a674fba3ac885c1093ab718515bf7f648" integrity sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA== @@ -5470,7 +5470,7 @@ lodash "^4.17.21" uuid "^8.3.2" -"@metamask/utils@^10.0.0", "@metamask/utils@^10.0.1": +"@metamask/utils@^10.0.0", "@metamask/utils@^10.0.1", "@metamask/utils@^3.4.1", "@metamask/utils@^5.0.1", "@metamask/utils@^5.0.2", "@metamask/utils@^8.2.0", "@metamask/utils@^8.3.0", "@metamask/utils@^9.0.0", "@metamask/utils@^9.1.0", "@metamask/utils@^9.2.1": version "10.0.1" resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-10.0.1.tgz#a765f96c20e35fc51c068fb9f88a3332b40b215e" integrity sha512-zHgAitJtRwviVVFnRUA2PLRMaAwatr3jiHgiH7mPicJaeSK4ma01aGR4fHy0iy5tlVo1ZiioTmJ1Hbp8FZ6pSg== @@ -5485,57 +5485,6 @@ semver "^7.5.4" uuid "^9.0.1" -"@metamask/utils@^3.4.1": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-3.6.0.tgz#b218b969a05ca7a8093b5d1670f6625061de707d" - integrity sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ== - dependencies: - "@types/debug" "^4.1.7" - debug "^4.3.4" - semver "^7.3.8" - superstruct "^1.0.3" - -"@metamask/utils@^5.0.1", "@metamask/utils@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c" - integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g== - dependencies: - "@ethereumjs/tx" "^4.1.2" - "@types/debug" "^4.1.7" - debug "^4.3.4" - semver "^7.3.8" - superstruct "^1.0.3" - -"@metamask/utils@^8.2.0", "@metamask/utils@^8.3.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.5.0.tgz#ddd0d4012d5191809404c97648a837ea9962cceb" - integrity sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ== - dependencies: - "@ethereumjs/tx" "^4.2.0" - "@metamask/superstruct" "^3.0.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" - -"@metamask/utils@^9.0.0", "@metamask/utils@^9.1.0", "@metamask/utils@^9.2.1": - version "9.2.1" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-9.2.1.tgz#d9f84706ff97e0c8d1bde5778549365b14269e81" - integrity sha512-/u663aUaB6+Xe75i3Mt/1cCljm41HDYIsna5oBrwGvgkY2zH7/9k9Zjd706cxoAbxN7QgLSVAReUiGnuxCuXrQ== - 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" - "@native-html/css-processor@1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@native-html/css-processor/-/css-processor-1.11.0.tgz#27d02e5123b0849f4986d44060ba3f235a15f552" @@ -13737,7 +13686,7 @@ clone@^1.0.2: clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== clone@~0.1.9: version "0.1.19"