From 1dd4bb5c5d4fcc8579ac9eba1b99b98a15dba577 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Tue, 16 Apr 2024 11:18:54 +0000 Subject: [PATCH 01/10] fix(deps): eth-json-rpc-filters@4.2.2 -> @metamask/eth-json-rpc-filters@^7.0.0 --- app/core/BackgroundBridge/BackgroundBridge.js | 4 ++-- app/core/Snaps/SnapBridge.ts | 4 ++-- package.json | 2 +- yarn.lock | 22 +++++++++---------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/core/BackgroundBridge/BackgroundBridge.js b/app/core/BackgroundBridge/BackgroundBridge.js index 5051d77cbd5a..f6b4bd35fc3c 100644 --- a/app/core/BackgroundBridge/BackgroundBridge.js +++ b/app/core/BackgroundBridge/BackgroundBridge.js @@ -26,8 +26,8 @@ import snapMethodMiddlewareBuilder from '../Snaps/SnapsMethodMiddleware'; import { SubjectType } from '@metamask/permission-controller'; ///: END:ONLY_INCLUDE_IF -const createFilterMiddleware = require('eth-json-rpc-filters'); -const createSubscriptionManager = require('eth-json-rpc-filters/subscriptionManager'); +const createFilterMiddleware = require('@metamask/eth-json-rpc-filters'); +const createSubscriptionManager = require('@metamask/eth-json-rpc-filters/subscriptionManager'); const providerAsMiddleware = require('eth-json-rpc-middleware/providerAsMiddleware'); const pump = require('pump'); // eslint-disable-next-line import/no-nodejs-modules diff --git a/app/core/Snaps/SnapBridge.ts b/app/core/Snaps/SnapBridge.ts index 5a9c468dc65f..7f6ec58ec786 100644 --- a/app/core/Snaps/SnapBridge.ts +++ b/app/core/Snaps/SnapBridge.ts @@ -22,8 +22,8 @@ import snapMethodMiddlewareBuilder from './SnapsMethodMiddleware'; import { SubjectType } from '@metamask/permission-controller'; const ObjectMultiplex = require('@metamask/object-multiplex'); -const createFilterMiddleware = require('eth-json-rpc-filters'); -const createSubscriptionManager = require('eth-json-rpc-filters/subscriptionManager'); +const createFilterMiddleware = require('@metamask/eth-json-rpc-filters'); +const createSubscriptionManager = require('@metamask/eth-json-rpc-filters/subscriptionManager'); const providerAsMiddleware = require('eth-json-rpc-middleware/providerAsMiddleware'); const pump = require('pump'); diff --git a/package.json b/package.json index 7ef5ce60ca15..8161724ec6ad 100644 --- a/package.json +++ b/package.json @@ -150,6 +150,7 @@ "@metamask/design-tokens": "^4.0.0", "@metamask/eth-ledger-bridge-keyring": "^4.1.0", "@metamask/eth-query": "^4.0.0", + "@metamask/eth-json-rpc-filters": "^7.0.0", "@metamask/eth-sig-util": "^7.0.2", "@metamask/eth-snap-keyring": "^4.3.3", "@metamask/etherscan-link": "^2.0.0", @@ -239,7 +240,6 @@ "eciesjs": "^0.3.15", "eth-block-tracker": "^7.0.1", "eth-ens-namehash": "2.0.8", - "eth-json-rpc-filters": "^6.0.1", "eth-json-rpc-middleware": "4.3.0", "eth-url-parser": "1.0.4", "ethereumjs-abi": "0.6.6", diff --git a/yarn.lock b/yarn.lock index f41f1a62e6ec..b386f2fc97c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4529,6 +4529,17 @@ "@metamask/utils" "^9.2.1" ethereum-cryptography "^2.1.2" +"@metamask/eth-json-rpc-filters@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-filters/-/eth-json-rpc-filters-7.0.1.tgz#f3fe43b9dc707401240526e5dacb429434384b66" + integrity sha512-lq3JKi528MZi9ygkPLVyKV/FIJUMwvJnPF0OPnZuhEWA8S0SVC1si5qhqerGz+jrwgrweWf17m1wzgso0MbIfw== + dependencies: + "@metamask/eth-query" "^4.0.0" + "@metamask/json-rpc-engine" "^8.0.2" + "@metamask/safe-event-emitter" "^3.0.0" + async-mutex "^0.5.0" + pify "^5.0.0" + "@metamask/eth-json-rpc-infura@^9.0.0", "@metamask/eth-json-rpc-infura@^9.1.0": version "9.1.0" resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-infura/-/eth-json-rpc-infura-9.1.0.tgz#8e09588ed58f49058615cab7040dcbce4682a292" @@ -17014,17 +17025,6 @@ eth-json-rpc-errors@^1.0.1: dependencies: fast-safe-stringify "^2.0.6" -eth-json-rpc-filters@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz#0b3e370f017f5c6f58d3e7bd0756d8099ed85c56" - integrity sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig== - dependencies: - "@metamask/safe-event-emitter" "^3.0.0" - async-mutex "^0.2.6" - eth-query "^2.1.2" - json-rpc-engine "^6.1.0" - pify "^5.0.0" - eth-json-rpc-middleware@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.3.0.tgz#d3e72efb60b6f601f022ce01384481eaed552b6b" From b58f6b321f916d8e04fedb47d50e92f0b7f65ef1 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Wed, 17 Apr 2024 04:04:48 +0000 Subject: [PATCH 02/10] deps: json-rpc-engine@^6.1.0 -> @metamask/json-rpc-engine@^7.1.0 --- app/core/BackgroundBridge/BackgroundBridge.js | 2 +- app/core/RPCMethods/RPCMethodMiddleware.test.ts | 2 +- app/core/RPCMethods/RPCMethodMiddleware.ts | 2 +- app/core/RPCMethods/eth_sendTransaction.test.ts | 2 +- app/core/RPCMethods/eth_sendTransaction.ts | 2 +- app/core/RPCMethods/wallet_watchAsset.ts | 2 +- app/core/SanitizationMiddleware.ts | 2 +- app/core/Snaps/SnapBridge.ts | 2 +- app/core/WalletConnect/extractApprovedAccounts.ts | 2 +- package.json | 2 +- yarn.lock | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/core/BackgroundBridge/BackgroundBridge.js b/app/core/BackgroundBridge/BackgroundBridge.js index f6b4bd35fc3c..b24d473bd586 100644 --- a/app/core/BackgroundBridge/BackgroundBridge.js +++ b/app/core/BackgroundBridge/BackgroundBridge.js @@ -1,6 +1,6 @@ /* eslint-disable import/no-commonjs */ import URL from 'url-parse'; -import { JsonRpcEngine } from 'json-rpc-engine'; +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { createSelectedNetworkMiddleware, METAMASK_DOMAIN, diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index 04deabc6eb99..8de7f0128bc5 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -5,7 +5,7 @@ import { JsonRpcRequest, JsonRpcResponse, JsonRpcSuccess, -} from 'json-rpc-engine'; +} from '@metamask/json-rpc-engine'; import type { TransactionParams } from '@metamask/transaction-controller'; import { providerErrors, rpcErrors } from '@metamask/rpc-errors'; import Engine from '../Engine'; diff --git a/app/core/RPCMethods/RPCMethodMiddleware.ts b/app/core/RPCMethods/RPCMethodMiddleware.ts index 0928bb73267f..aa67c0f677ac 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/eth_sendTransaction.test.ts b/app/core/RPCMethods/eth_sendTransaction.test.ts index 89e3c154b1f5..a7111d751958 100644 --- a/app/core/RPCMethods/eth_sendTransaction.test.ts +++ b/app/core/RPCMethods/eth_sendTransaction.test.ts @@ -1,6 +1,6 @@ // eslint-disable-next-line import/no-nodejs-modules import { inspect } from 'util'; -import type { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; +import type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/json-rpc-engine'; import type { TransactionParams, TransactionController, diff --git a/app/core/RPCMethods/eth_sendTransaction.ts b/app/core/RPCMethods/eth_sendTransaction.ts index 465cc87b51da..e35f3e0f9a75 100644 --- a/app/core/RPCMethods/eth_sendTransaction.ts +++ b/app/core/RPCMethods/eth_sendTransaction.ts @@ -1,4 +1,4 @@ -import type { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; +import type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/json-rpc-engine'; import { TransactionController, WalletDevice, diff --git a/app/core/RPCMethods/wallet_watchAsset.ts b/app/core/RPCMethods/wallet_watchAsset.ts index 09e7dea54706..b2dc32b8863a 100644 --- a/app/core/RPCMethods/wallet_watchAsset.ts +++ b/app/core/RPCMethods/wallet_watchAsset.ts @@ -11,7 +11,7 @@ import { } from '../../constants/error'; import { selectChainId } from '../../selectors/networkController'; import { isValidAddress } from 'ethereumjs-util'; -import { JsonRpcRequest, PendingJsonRpcResponse } from 'json-rpc-engine'; +import { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/json-rpc-engine'; import { toChecksumHexAddress } from '@metamask/controller-utils'; const wallet_watchAsset = async ({ diff --git a/app/core/SanitizationMiddleware.ts b/app/core/SanitizationMiddleware.ts index a7eb92f9291e..c1cf5db76908 100644 --- a/app/core/SanitizationMiddleware.ts +++ b/app/core/SanitizationMiddleware.ts @@ -1,4 +1,4 @@ -import { JsonRpcMiddleware, JsonRpcRequest } from 'json-rpc-engine'; +import { JsonRpcMiddleware, JsonRpcRequest } from '@metamask/json-rpc-engine'; import { addHexPrefix } from 'ethereumjs-util'; // We use this to clean any custom params from the txParams diff --git a/app/core/Snaps/SnapBridge.ts b/app/core/Snaps/SnapBridge.ts index 7f6ec58ec786..5bb12f265902 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 'json-rpc-middleware-stream'; import { NetworksChainId } from '@metamask/controller-utils'; diff --git a/app/core/WalletConnect/extractApprovedAccounts.ts b/app/core/WalletConnect/extractApprovedAccounts.ts index 8018459950d8..9d30304a2f73 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/json-rpc-engine'; export const extractApprovedAccounts = ( accountPermission: // TODO: Replace "any" with type diff --git a/package.json b/package.json index 8161724ec6ad..7ddbda92826e 100644 --- a/package.json +++ b/package.json @@ -158,6 +158,7 @@ "@metamask/ethjs-query": "^0.7.1", "@metamask/ethjs-unit": "^0.3.0", "@metamask/gas-fee-controller": "^18.0.0", + "@metamask/json-rpc-engine": "^7.1.0", "@metamask/key-tree": "^9.0.0", "@metamask/keyring-api": "^8.1.0", "@metamask/keyring-controller": "^17.2.1", @@ -253,7 +254,6 @@ "human-standard-token-abi": "^2.0.0", "humanize-duration": "^3.27.2", "is-url": "^1.2.4", - "json-rpc-engine": "^6.1.0", "json-rpc-middleware-stream": "3.0.0", "lodash": "^4.17.21", "lottie-ios": "3.4.1", diff --git a/yarn.lock b/yarn.lock index b386f2fc97c1..92e45af0d2e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4799,7 +4799,7 @@ bn.js "^5.2.1" uuid "^8.3.2" -"@metamask/json-rpc-engine@^7.0.0", "@metamask/json-rpc-engine@^7.1.1", "@metamask/json-rpc-engine@^7.3.2", "@metamask/json-rpc-engine@^7.3.3": +"@metamask/json-rpc-engine@^7.0.0", "@metamask/json-rpc-engine@^7.1.0", "@metamask/json-rpc-engine@^7.1.1", "@metamask/json-rpc-engine@^7.3.2", "@metamask/json-rpc-engine@^7.3.3": version "7.3.3" resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz#f2b30a2164558014bfcca45db10f5af291d989af" integrity sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg== From 02918e98653fc6ee99541787e6f34d27fe741012 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Wed, 17 Apr 2024 06:31:12 +0000 Subject: [PATCH 03/10] Update JsonRpcRequest typings test: type adjustments --- .../RPCMethods/RPCMethodMiddleware.test.ts | 35 ++++++++++--------- .../RPCMethods/eth_sendTransaction.test.ts | 25 +++++++++---- app/core/RPCMethods/eth_sendTransaction.ts | 25 +++++++++---- app/core/RPCMethods/wallet_watchAsset.ts | 2 +- app/core/SanitizationMiddleware.ts | 21 ++++++----- .../WalletConnect/extractApprovedAccounts.ts | 2 +- 6 files changed, 69 insertions(+), 41 deletions(-) diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index 8de7f0128bc5..455628715628 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -1,11 +1,12 @@ -import { - JsonRpcEngine, +import { JsonRpcEngine, JsonRpcMiddleware } from '@metamask/json-rpc-engine'; +import type { + Json, JsonRpcFailure, - JsonRpcMiddleware, + JsonRpcParams, JsonRpcRequest, JsonRpcResponse, JsonRpcSuccess, -} from '@metamask/json-rpc-engine'; +} from '@metamask/utils'; import type { TransactionParams } from '@metamask/transaction-controller'; import { providerErrors, rpcErrors } from '@metamask/rpc-errors'; import Engine from '../Engine'; @@ -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); @@ -416,7 +417,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); @@ -1097,7 +1097,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'); @@ -1112,10 +1113,11 @@ describe('getRpcMethodMiddleware', () => { method: 'eth_sendTransaction', params: [mockTransactionParameters], }; - const expectedError = rpcErrors.internal('Failed to add transaction'); + const expectedError = rpcErrors.internal('Internal JSON-RPC error.'); const response = await callMiddleware({ middleware, request }); + console.error((response as JsonRpcFailure).error); expect((response as JsonRpcFailure).error.code).toBe(expectedError.code); expect((response as JsonRpcFailure).error.message).toBe( expectedError.message, @@ -1125,7 +1127,8 @@ describe('getRpcMethodMiddleware', () => { 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'), @@ -1142,7 +1145,7 @@ describe('getRpcMethodMiddleware', () => { method: 'eth_sendTransaction', params: [mockTransactionParameters], }; - const expectedError = rpcErrors.internal('Failed to process transaction'); + const expectedError = rpcErrors.internal('Internal JSON-RPC error.'); const response = await callMiddleware({ middleware, request }); @@ -1215,7 +1218,7 @@ describe('getRpcMethodMiddleware', () => { method: 'personal_ecRecover', params: [helloWorldMessage], }; - const expectedError = rpcErrors.internal('Missing signature parameter'); + const expectedError = rpcErrors.internal('Internal JSON-RPC error.'); const response = await callMiddleware({ middleware, request }); @@ -1234,9 +1237,9 @@ describe('getRpcMethodMiddleware', () => { jsonrpc, id: 1, method: 'personal_ecRecover', - params: [undefined, helloWorldSignature], + params: [undefined, helloWorldSignature] as JsonRpcParams, }; - const expectedError = rpcErrors.internal('Missing data parameter'); + const expectedError = rpcErrors.internal('Internal JSON-RPC error.'); const response = await callMiddleware({ middleware, request }); diff --git a/app/core/RPCMethods/eth_sendTransaction.test.ts b/app/core/RPCMethods/eth_sendTransaction.test.ts index a7111d751958..abab8c2d6b96 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 '@metamask/json-rpc-engine'; +import type { + Json, + JsonRpcParams, + JsonRpcRequest, + PendingJsonRpcResponse, +} from '@metamask/utils'; import type { TransactionParams, TransactionController, @@ -47,9 +52,11 @@ jest.mock('../../util/transaction-controller', () => ({ * @param params - The request parameters. * @returns The JSON-RPC request. */ -function constructSendTransactionRequest( - params: unknown, -): JsonRpcRequest & { method: 'eth_sendTransaction' } { +function constructSendTransactionRequest(params: Json[]): JsonRpcRequest< + [TransactionParams & JsonRpcParams] +> & { + method: 'eth_sendTransaction'; +} { return { jsonrpc: '2.0', id: 1, @@ -63,7 +70,7 @@ function constructSendTransactionRequest( * * @returns A pending JSON-RPC response. */ -function constructPendingJsonRpcResponse(): PendingJsonRpcResponse { +function constructPendingJsonRpcResponse(): PendingJsonRpcResponse { return { jsonrpc: '2.0', id: 1, @@ -144,13 +151,17 @@ function getMockAddTransaction({ describe('eth_sendTransaction', () => { it('sends the transaction and returns the resulting hash', async () => { const mockAddress = '0x0000000000000000000000000000000000000001'; - const mockTransactionParameters = { from: mockAddress }; + const mockTransactionParameters = { + from: mockAddress, + } as TransactionParams; const expectedResult = 'fake-hash'; const pendingResult = constructPendingJsonRpcResponse(); await eth_sendTransaction({ hostname: 'example.metamask.io', - req: constructSendTransactionRequest([mockTransactionParameters]), + req: constructSendTransactionRequest([ + mockTransactionParameters as unknown as JsonRpcParams, + ]), res: pendingResult, sendTransaction: getMockAddTransaction({ expectedTransaction: mockTransactionParameters, diff --git a/app/core/RPCMethods/eth_sendTransaction.ts b/app/core/RPCMethods/eth_sendTransaction.ts index e35f3e0f9a75..4479dae9dde5 100644 --- a/app/core/RPCMethods/eth_sendTransaction.ts +++ b/app/core/RPCMethods/eth_sendTransaction.ts @@ -1,6 +1,13 @@ -import type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/json-rpc-engine'; +import type { + Hex, + Json, + JsonRpcParams, + JsonRpcRequest, + PendingJsonRpcResponse, +} from '@metamask/utils'; import { TransactionController, + TransactionParams, WalletDevice, } from '@metamask/transaction-controller'; import { rpcErrors } from '@metamask/rpc-errors'; @@ -46,6 +53,11 @@ const hasProperty = < ): objectToCheck is ObjectToCheck & Record => Object.hasOwnProperty.call(objectToCheck, name); +interface SendArgs { + from: string; + chainId?: Hex; +} + /** * Handle a `eth_sendTransaction` request. * @@ -66,13 +78,12 @@ async function eth_sendTransaction({ validateAccountAndChainId, }: { hostname: string; - req: JsonRpcRequest & { method: 'eth_sendTransaction' }; - res: PendingJsonRpcResponse; + req: JsonRpcRequest<[TransactionParams & JsonRpcParams]> & { + method: 'eth_sendTransaction'; + }; + res: PendingJsonRpcResponse; sendTransaction: TransactionController['addTransaction']; - validateAccountAndChainId: (args: { - from: string; - chainId?: number; - }) => Promise; + validateAccountAndChainId: (args: SendArgs) => Promise; }) { if ( !Array.isArray(req.params) && diff --git a/app/core/RPCMethods/wallet_watchAsset.ts b/app/core/RPCMethods/wallet_watchAsset.ts index b2dc32b8863a..bf9c2d32da33 100644 --- a/app/core/RPCMethods/wallet_watchAsset.ts +++ b/app/core/RPCMethods/wallet_watchAsset.ts @@ -11,7 +11,7 @@ import { } from '../../constants/error'; import { selectChainId } from '../../selectors/networkController'; import { isValidAddress } from 'ethereumjs-util'; -import { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/json-rpc-engine'; +import { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils'; import { toChecksumHexAddress } from '@metamask/controller-utils'; const wallet_watchAsset = async ({ diff --git a/app/core/SanitizationMiddleware.ts b/app/core/SanitizationMiddleware.ts index c1cf5db76908..705b001a4ed2 100644 --- a/app/core/SanitizationMiddleware.ts +++ b/app/core/SanitizationMiddleware.ts @@ -1,4 +1,5 @@ -import { JsonRpcMiddleware, JsonRpcRequest } from '@metamask/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/WalletConnect/extractApprovedAccounts.ts b/app/core/WalletConnect/extractApprovedAccounts.ts index 9d30304a2f73..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 '@metamask/json-rpc-engine'; +import { Json } from '@metamask/utils'; export const extractApprovedAccounts = ( accountPermission: // TODO: Replace "any" with type From f8833727be32c488c780a0a7aed5cac04fbe4757 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Thu, 18 Apr 2024 21:42:00 +0000 Subject: [PATCH 04/10] chainId is now hex string, not number --- app/core/RPCMethods/RPCMethodMiddleware.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/core/RPCMethods/RPCMethodMiddleware.ts b/app/core/RPCMethods/RPCMethodMiddleware.ts index aa67c0f677ac..8ea23b206cee 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.ts @@ -15,6 +15,7 @@ import { PermissionController, permissionRpcMethods, } from '@metamask/permission-controller'; +import type { Hex } from '@metamask/utils'; import { blockTagParamIndex, getAllNetworks } from '../../util/networks'; import { polyfillGasPrice } from './utils'; import { @@ -112,7 +113,7 @@ export const checkActiveAccountAndChainId = async ({ isWalletConnect, }: { address?: string; - chainId?: number; + chainId?: Hex; channelId?: string; hostname: string; isWalletConnect: boolean; @@ -224,7 +225,7 @@ const generateRawSignature = async ({ title: { current: string }; icon: { current: string | undefined }; analytics: { [key: string]: string | boolean }; - chainId: number; + chainId: Hex; isMMSDK: boolean; channelId?: string; getSource: () => string; @@ -521,7 +522,7 @@ export const getRpcMethodMiddleware = ({ chainId, }: { from?: string; - chainId?: number; + chainId?: Hex; }) => { // TODO this needs to be modified for per dapp selected network await checkActiveAccountAndChainId({ From d625633682dd1942585aba2c4512aa040d4ac895 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Mon, 20 May 2024 07:24:08 +0000 Subject: [PATCH 05/10] chore(test): eth_sendTransaction test type workarounds --- app/core/RPCMethods/eth_sendTransaction.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/core/RPCMethods/eth_sendTransaction.test.ts b/app/core/RPCMethods/eth_sendTransaction.test.ts index abab8c2d6b96..c7b8511a6c1e 100644 --- a/app/core/RPCMethods/eth_sendTransaction.test.ts +++ b/app/core/RPCMethods/eth_sendTransaction.test.ts @@ -61,7 +61,7 @@ function constructSendTransactionRequest(params: Json[]): JsonRpcRequest< jsonrpc: '2.0', id: 1, method: 'eth_sendTransaction', - params, + params: params as any, }; } @@ -161,7 +161,7 @@ describe('eth_sendTransaction', () => { hostname: 'example.metamask.io', req: constructSendTransactionRequest([ mockTransactionParameters as unknown as JsonRpcParams, - ]), + ]) as any, res: pendingResult, sendTransaction: getMockAddTransaction({ expectedTransaction: mockTransactionParameters, @@ -183,7 +183,9 @@ describe('eth_sendTransaction', () => { async () => await eth_sendTransaction({ hostname: 'example.metamask.io', - req: constructSendTransactionRequest(invalidParameter), + req: constructSendTransactionRequest( + invalidParameter as unknown as Json[], + ), res: constructPendingJsonRpcResponse(), sendTransaction: getMockAddTransaction({ returnValue: 'fake-hash', @@ -205,7 +207,9 @@ describe('eth_sendTransaction', () => { async () => await eth_sendTransaction({ hostname: 'example.metamask.io', - req: constructSendTransactionRequest(invalidParameter), + req: constructSendTransactionRequest( + invalidParameter as unknown as Json[], + ), res: constructPendingJsonRpcResponse(), sendTransaction: getMockAddTransaction({ returnValue: 'fake-hash', From eee478ce6e997afdb534055d1ee55d30ac0dd675 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Mon, 20 May 2024 07:47:39 +0000 Subject: [PATCH 06/10] fixup: console.error in test --- app/core/RPCMethods/RPCMethodMiddleware.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index 455628715628..a6a507c51ef9 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -1117,7 +1117,6 @@ describe('getRpcMethodMiddleware', () => { const response = await callMiddleware({ middleware, request }); - console.error((response as JsonRpcFailure).error); expect((response as JsonRpcFailure).error.code).toBe(expectedError.code); expect((response as JsonRpcFailure).error.message).toBe( expectedError.message, From f12d06391e1f6a660c35483339d2cbc8513086b6 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Mon, 20 May 2024 07:49:04 +0000 Subject: [PATCH 07/10] fix(test): test for error cause message in RPCMethodMIddleware --- app/core/RPCMethods/RPCMethodMiddleware.test.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index a6a507c51ef9..d7508d502795 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -1114,6 +1114,7 @@ describe('getRpcMethodMiddleware', () => { params: [mockTransactionParameters], }; const expectedError = rpcErrors.internal('Internal JSON-RPC error.'); + const expectedErrorCauseMessage = 'Failed to add transaction'; const response = await callMiddleware({ middleware, request }); @@ -1121,6 +1122,10 @@ describe('getRpcMethodMiddleware', () => { expect((response as JsonRpcFailure).error.message).toBe( expectedError.message, ); + // @ts-expect-error - TODO: This should type + expect((response as JsonRpcFailure).error.data.cause.message).toBe( + expectedErrorCauseMessage, + ); }); it('returns a JSON-RPC error if an error is thrown after approval', async () => { @@ -1145,6 +1150,7 @@ describe('getRpcMethodMiddleware', () => { params: [mockTransactionParameters], }; const expectedError = rpcErrors.internal('Internal JSON-RPC error.'); + const expectedErrorCauseMessage = 'Failed to add transaction'; const response = await callMiddleware({ middleware, request }); @@ -1152,6 +1158,10 @@ describe('getRpcMethodMiddleware', () => { expect((response as JsonRpcFailure).error.message).toBe( expectedError.message, ); + // @ts-expect-error - TODO: This should type + expect((response as JsonRpcFailure).error.data.cause.message).toBe( + expectedErrorCauseMessage, + ); }); }); From 48e6ffc96134affbf0714a0f6bf4f67be7e99e71 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Tue, 11 Jun 2024 03:33:49 +0000 Subject: [PATCH 08/10] chore: update test --- app/core/RPCMethods/RPCMethodMiddleware.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index d7508d502795..baec1ca1100d 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -1150,7 +1150,7 @@ describe('getRpcMethodMiddleware', () => { params: [mockTransactionParameters], }; const expectedError = rpcErrors.internal('Internal JSON-RPC error.'); - const expectedErrorCauseMessage = 'Failed to add transaction'; + const expectedErrorCauseMessage = 'Failed to process transaction'; const response = await callMiddleware({ middleware, request }); From e3dfc04ecdb3c3edd0c10ff738eef3b0d0025d62 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Tue, 11 Jun 2024 05:02:24 +0000 Subject: [PATCH 09/10] chore: restore @ts-expect-error directive --- app/core/RPCMethods/RPCMethodMiddleware.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index baec1ca1100d..d3fbd3362fc5 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -417,6 +417,7 @@ 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); From f686da2f9cf3560e9139b3c532803bf5a1bbc097 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Tue, 11 Jun 2024 05:37:02 +0000 Subject: [PATCH 10/10] chore(deps): @metamask/rpc-errors@^6.2.1->^6.3.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7ddbda92826e..6d3bf5daabbf 100644 --- a/package.json +++ b/package.json @@ -177,7 +177,7 @@ "@metamask/react-native-payments": "^2.0.0", "@metamask/react-native-search-api": "1.0.1", "@metamask/react-native-webview": "^14.0.4", - "@metamask/rpc-errors": "^6.2.1", + "@metamask/rpc-errors": "^6.3.0", "@metamask/scure-bip39": "^2.1.0", "@metamask/sdk-communication-layer": "0.29.0-wallet", "@metamask/selected-network-controller": "^15.0.2", diff --git a/yarn.lock b/yarn.lock index 92e45af0d2e2..8e9cc8024242 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5310,10 +5310,10 @@ escape-string-regexp "^4.0.0" invariant "2.2.4" -"@metamask/rpc-errors@^6.0.0", "@metamask/rpc-errors@^6.2.1", "@metamask/rpc-errors@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.3.1.tgz#d5bb4740e070c3d87e91717ff4c3c6061a081cab" - integrity sha512-ugDY7cKjF4/yH5LtBaOIKHw/AiGGSAmzptAUEiAEGr/78LwuzcXAxmzEQfSfMIfI+f9Djr8cttq1pRJJKfTuCg== +"@metamask/rpc-errors@^6.0.0", "@metamask/rpc-errors@^6.2.1", "@metamask/rpc-errors@^6.3.0", "@metamask/rpc-errors@^6.3.1": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz#a7ce01c06c9a347ab853e55818ac5654a73bd006" + integrity sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg== dependencies: "@metamask/utils" "^9.0.0" fast-safe-stringify "^2.0.6"