From 000eee473f44283504c6e99dd5e033601ac28b2c Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Fri, 14 Apr 2023 10:59:16 +0200 Subject: [PATCH 1/4] Bump json-rpc-engine and rpc-errors --- packages/rpc-methods/package.json | 4 +- packages/snaps-controllers/package.json | 4 +- .../snaps-execution-environments/package.json | 4 +- packages/snaps-utils/package.json | 2 +- yarn.lock | 37 +++++++++++++++---- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/packages/rpc-methods/package.json b/packages/rpc-methods/package.json index 49bb60d1b8..af602f3f89 100644 --- a/packages/rpc-methods/package.json +++ b/packages/rpc-methods/package.json @@ -29,12 +29,12 @@ "dependencies": { "@metamask/key-tree": "^7.0.0", "@metamask/permission-controller": "^3.1.0", + "@metamask/rpc-errors": "^5.0.0", "@metamask/snaps-ui": "workspace:^", "@metamask/snaps-utils": "workspace:^", "@metamask/types": "^1.1.0", "@metamask/utils": "^5.0.0", "@noble/hashes": "^1.1.3", - "eth-rpc-errors": "^4.0.3", "nanoid": "^3.1.31", "superstruct": "^1.0.3" }, @@ -46,6 +46,7 @@ "@metamask/eslint-config-jest": "^11.0.0", "@metamask/eslint-config-nodejs": "^11.0.1", "@metamask/eslint-config-typescript": "^11.0.0", + "@metamask/json-rpc-engine": "^7.0.0", "@types/node": "^17.0.36", "@typescript-eslint/eslint-plugin": "^5.42.1", "@typescript-eslint/parser": "^5.42.1", @@ -60,7 +61,6 @@ "expect-type": "^0.15.0", "jest": "^29.0.2", "jest-it-up": "^2.0.0", - "json-rpc-engine": "^6.1.0", "prettier": "^2.7.1", "prettier-plugin-packagejson": "^2.2.11", "rimraf": "^4.1.2", diff --git a/packages/snaps-controllers/package.json b/packages/snaps-controllers/package.json index dbcbee72d9..24e980bd45 100644 --- a/packages/snaps-controllers/package.json +++ b/packages/snaps-controllers/package.json @@ -35,9 +35,11 @@ "dependencies": { "@metamask/approval-controller": "^2.0.0", "@metamask/base-controller": "^2.0.0", + "@metamask/json-rpc-engine": "^7.0.0", "@metamask/object-multiplex": "^1.2.0", "@metamask/permission-controller": "^3.1.0", "@metamask/post-message-stream": "^6.1.2", + "@metamask/rpc-errors": "^5.0.0", "@metamask/rpc-methods": "workspace:^", "@metamask/snaps-execution-environments": "workspace:^", "@metamask/snaps-registry": "^1.2.0", @@ -47,10 +49,8 @@ "@xstate/fsm": "^2.0.0", "concat-stream": "^2.0.0", "cron-parser": "^4.5.0", - "eth-rpc-errors": "^4.0.3", "gunzip-maybe": "^1.4.2", "immer": "^9.0.6", - "json-rpc-engine": "^6.1.0", "json-rpc-middleware-stream": "^4.2.0", "nanoid": "^3.1.31", "pump": "^3.0.0", diff --git a/packages/snaps-execution-environments/package.json b/packages/snaps-execution-environments/package.json index 0b5859df44..4a3efb8a0c 100644 --- a/packages/snaps-execution-environments/package.json +++ b/packages/snaps-execution-environments/package.json @@ -35,14 +35,14 @@ "publish:preview": "yarn npm publish --tag preview" }, "dependencies": { + "@metamask/json-rpc-engine": "^7.0.0", "@metamask/object-multiplex": "^1.2.0", "@metamask/post-message-stream": "^6.1.2", "@metamask/providers": "^10.2.1", + "@metamask/rpc-errors": "^5.0.0", "@metamask/rpc-methods": "workspace:^", "@metamask/snaps-utils": "workspace:^", "@metamask/utils": "^5.0.0", - "eth-rpc-errors": "^4.0.3", - "json-rpc-engine": "^6.1.0", "nanoid": "^3.1.31", "pump": "^3.0.0", "ses": "^0.18.1", diff --git a/packages/snaps-utils/package.json b/packages/snaps-utils/package.json index 313a7acb1a..b4e0d1133a 100644 --- a/packages/snaps-utils/package.json +++ b/packages/snaps-utils/package.json @@ -57,13 +57,13 @@ "@metamask/base-controller": "^2.0.0", "@metamask/permission-controller": "^3.1.0", "@metamask/providers": "^10.2.1", + "@metamask/rpc-errors": "^5.0.0", "@metamask/snaps-registry": "^1.2.0", "@metamask/snaps-ui": "workspace:^", "@metamask/utils": "^5.0.0", "@noble/hashes": "^1.1.3", "@scure/base": "^1.1.1", "cron-parser": "^4.5.0", - "eth-rpc-errors": "^4.0.3", "fast-deep-equal": "^3.1.3", "fast-json-stable-stringify": "^2.1.0", "rfdc": "^1.3.0", diff --git a/yarn.lock b/yarn.lock index 0df27eba1c..dd64781447 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3135,6 +3135,17 @@ __metadata: languageName: node linkType: hard +"@metamask/json-rpc-engine@npm:^7.0.0": + version: 7.0.0 + resolution: "@metamask/json-rpc-engine@npm:7.0.0" + dependencies: + "@metamask/rpc-errors": ^5.0.0 + "@metamask/safe-event-emitter": ^2.0.0 + "@metamask/utils": ^5.0.1 + checksum: d22347ee4597bc72cdc34e65a27872ed8e77de188c5b95fed9133c25289cd4abd7aafa72e3e326d8a7449a857c275ed6435642727c30c51319f5d97a579c5f49 + languageName: node + linkType: hard + "@metamask/key-tree@npm:^7.0.0": version: 7.0.0 resolution: "@metamask/key-tree@npm:7.0.0" @@ -3246,6 +3257,16 @@ __metadata: languageName: node linkType: hard +"@metamask/rpc-errors@npm:^5.0.0": + version: 5.0.0 + resolution: "@metamask/rpc-errors@npm:5.0.0" + dependencies: + "@metamask/utils": ^5.0.0 + fast-safe-stringify: ^2.0.6 + checksum: fbcb21ad1460883ee9d28f487d9cf5de7d3c6ac819024a1b6e5732d5da9a9f275f19fa0b4daa06dbd9b45d89c9e50ab9f281d597324e36d3324fbc9ebfdf0ba8 + languageName: node + linkType: hard + "@metamask/rpc-methods@workspace:^, @metamask/rpc-methods@workspace:packages/rpc-methods": version: 0.0.0-use.local resolution: "@metamask/rpc-methods@workspace:packages/rpc-methods" @@ -3257,8 +3278,10 @@ __metadata: "@metamask/eslint-config-jest": ^11.0.0 "@metamask/eslint-config-nodejs": ^11.0.1 "@metamask/eslint-config-typescript": ^11.0.0 + "@metamask/json-rpc-engine": ^7.0.0 "@metamask/key-tree": ^7.0.0 "@metamask/permission-controller": ^3.1.0 + "@metamask/rpc-errors": ^5.0.0 "@metamask/snaps-ui": "workspace:^" "@metamask/snaps-utils": "workspace:^" "@metamask/types": ^1.1.0 @@ -3275,11 +3298,9 @@ __metadata: eslint-plugin-jsdoc: ^39.6.2 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^4.2.1 - eth-rpc-errors: ^4.0.3 expect-type: ^0.15.0 jest: ^29.0.2 jest-it-up: ^2.0.0 - json-rpc-engine: ^6.1.0 nanoid: ^3.1.31 prettier: ^2.7.1 prettier-plugin-packagejson: ^2.2.11 @@ -3425,9 +3446,11 @@ __metadata: "@metamask/eslint-config-jest": ^11.0.0 "@metamask/eslint-config-nodejs": ^11.0.1 "@metamask/eslint-config-typescript": ^11.0.0 + "@metamask/json-rpc-engine": ^7.0.0 "@metamask/object-multiplex": ^1.2.0 "@metamask/permission-controller": ^3.1.0 "@metamask/post-message-stream": ^6.1.2 + "@metamask/rpc-errors": ^5.0.0 "@metamask/rpc-methods": "workspace:^" "@metamask/snaps-execution-environments": "workspace:^" "@metamask/snaps-registry": ^1.2.0 @@ -3464,7 +3487,6 @@ __metadata: eslint-plugin-jsdoc: ^39.6.2 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^4.2.1 - eth-rpc-errors: ^4.0.3 expect-webdriverio: ^4.1.2 gunzip-maybe: ^1.4.2 immer: ^9.0.6 @@ -3474,7 +3496,6 @@ __metadata: jest: ^29.0.2 jest-fetch-mock: ^3.0.3 jest-it-up: ^2.0.0 - json-rpc-engine: ^6.1.0 json-rpc-middleware-stream: ^4.2.0 mkdirp: ^1.0.4 nanoid: ^3.1.31 @@ -3514,9 +3535,11 @@ __metadata: "@metamask/eslint-config-jest": ^11.0.0 "@metamask/eslint-config-nodejs": ^11.0.1 "@metamask/eslint-config-typescript": ^11.0.0 + "@metamask/json-rpc-engine": ^7.0.0 "@metamask/object-multiplex": ^1.2.0 "@metamask/post-message-stream": ^6.1.2 "@metamask/providers": ^10.2.1 + "@metamask/rpc-errors": ^5.0.0 "@metamask/rpc-methods": "workspace:^" "@metamask/snaps-utils": "workspace:^" "@metamask/utils": ^5.0.0 @@ -3545,14 +3568,12 @@ __metadata: eslint-plugin-jsdoc: ^39.6.2 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^4.2.1 - eth-rpc-errors: ^4.0.3 expect-webdriverio: ^4.1.2 istanbul-lib-coverage: ^3.2.0 istanbul-lib-report: ^3.0.0 istanbul-reports: ^3.1.5 jest: ^29.0.2 jest-fetch-mock: ^3.0.3 - json-rpc-engine: ^6.1.0 lavamoat: ^6.4.0 lavamoat-browserify: ^15.5.0 memfs: ^3.4.13 @@ -3709,6 +3730,7 @@ __metadata: "@metamask/permission-controller": ^3.1.0 "@metamask/post-message-stream": ^6.1.2 "@metamask/providers": ^10.2.1 + "@metamask/rpc-errors": ^5.0.0 "@metamask/snaps-registry": ^1.2.0 "@metamask/snaps-ui": "workspace:^" "@metamask/utils": ^5.0.0 @@ -3737,7 +3759,6 @@ __metadata: eslint-plugin-jsdoc: ^39.6.2 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^4.2.1 - eth-rpc-errors: ^4.0.3 expect-webdriverio: ^4.1.2 fast-deep-equal: ^3.1.3 fast-json-stable-stringify: ^2.1.0 @@ -3841,7 +3862,7 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^5.0.0": +"@metamask/utils@npm:^5.0.0, @metamask/utils@npm:^5.0.1": version: 5.0.1 resolution: "@metamask/utils@npm:5.0.1" dependencies: From 219b7f19964c586bdd97ed0d9b6c942ea32457e6 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Fri, 14 Apr 2023 11:21:19 +0200 Subject: [PATCH 2/4] Update imports --- packages/examples/examples/wasm/package.json | 2 +- packages/examples/examples/wasm/src/index.js | 4 ++-- .../src/permitted/common/snapInstallation.ts | 6 ++--- .../src/permitted/invokeSnapSugar.test.ts | 4 ++-- .../src/permitted/invokeSnapSugar.ts | 23 +++++++++---------- .../src/permitted/middleware.test.ts | 2 +- .../rpc-methods/src/permitted/middleware.ts | 6 ++--- .../src/permitted/requestSnaps.test.ts | 2 +- .../rpc-methods/src/permitted/requestSnaps.ts | 4 ++-- .../restricted/caveats/permittedCoinTypes.ts | 8 +++---- .../caveats/permittedDerivationPaths.ts | 6 ++--- .../src/restricted/caveats/snapIds.ts | 4 ++-- packages/rpc-methods/src/restricted/dialog.ts | 10 ++++---- .../src/restricted/getBip32Entropy.ts | 4 ++-- .../src/restricted/getBip32PublicKey.ts | 6 ++--- .../src/restricted/getBip44Entropy.ts | 4 ++-- .../rpc-methods/src/restricted/getEntropy.ts | 4 ++-- .../rpc-methods/src/restricted/invokeSnap.ts | 8 +++---- .../src/restricted/manageState.test.ts | 4 ++-- .../rpc-methods/src/restricted/manageState.ts | 16 ++++++------- packages/rpc-methods/src/restricted/notify.ts | 10 ++++---- .../src/multichain/middleware.test.ts | 2 +- .../src/multichain/middleware.ts | 18 +++++++-------- .../src/services/AbstractExecutionService.ts | 16 ++++++------- .../src/snaps/SnapController.test.ts | 11 +++++---- .../src/snaps/SnapController.ts | 10 ++++---- .../src/snaps/endowments/cronjob.ts | 8 +++---- .../src/snaps/endowments/keyring.ts | 10 ++++---- .../src/snaps/endowments/rpc.ts | 8 +++---- .../snaps/endowments/transaction-insight.ts | 6 ++--- .../src/test-utils/controller.ts | 4 ++-- .../src/test-utils/execution-environment.ts | 2 +- .../src/test-utils/service.ts | 2 +- .../src/common/BaseSnapExecutor.ts | 10 ++++---- .../src/common/test-utils/endowments.ts | 2 +- .../src/common/utils.ts | 8 +++---- packages/snaps-utils/src/snaps.ts | 5 +--- yarn.lock | 4 ++-- 38 files changed, 129 insertions(+), 134 deletions(-) diff --git a/packages/examples/examples/wasm/package.json b/packages/examples/examples/wasm/package.json index 917f72046f..b6aa461c24 100644 --- a/packages/examples/examples/wasm/package.json +++ b/packages/examples/examples/wasm/package.json @@ -21,7 +21,7 @@ "serve": "mm-snap serve" }, "dependencies": { - "eth-rpc-errors": "^4.0.3" + "@metamask/rpc-errors": "^5.0.0" }, "devDependencies": { "@lavamoat/allow-scripts": "^2.0.3", diff --git a/packages/examples/examples/wasm/src/index.js b/packages/examples/examples/wasm/src/index.js index 5bf50e18c1..c6bfb94fc6 100644 --- a/packages/examples/examples/wasm/src/index.js +++ b/packages/examples/examples/wasm/src/index.js @@ -1,6 +1,6 @@ // Due to a bug of how brfs interacts with babel, we need to use require() syntax instead of import pattern // https://github.com/browserify/brfs/issues/39 -const { ethErrors } = require('eth-rpc-errors'); +const { rpcErrors } = require('@metamask/rpc-errors'); const fs = require('fs'); // Ref: @@ -46,5 +46,5 @@ module.exports.onRpcRequest = async ({ request }) => { if (wasm.instance.exports[request.method]) { return wasm.instance.exports[request.method](...request.params); } - throw ethErrors.rpc.methodNotFound({ data: { request } }); + throw rpcErrors.methodNotFound({ data: { request } }); }; diff --git a/packages/rpc-methods/src/permitted/common/snapInstallation.ts b/packages/rpc-methods/src/permitted/common/snapInstallation.ts index 9ab7eafce7..63df0d3cea 100644 --- a/packages/rpc-methods/src/permitted/common/snapInstallation.ts +++ b/packages/rpc-methods/src/permitted/common/snapInstallation.ts @@ -1,7 +1,7 @@ import { RequestedPermissions } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { InstallSnapsResult } from '@metamask/snaps-utils'; import { isObject } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; export type { InstallSnapsResult } from '@metamask/snaps-utils'; @@ -25,12 +25,12 @@ export async function handleInstallSnaps( installSnaps: InstallSnapsHook, ): Promise { if (!isObject(requestedSnaps)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Invalid snap installation params.`, data: { requestedSnaps }, }); } else if (Object.keys(requestedSnaps).length === 0) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Must specify at least one snap to install.`, data: { requestedSnaps }, }); diff --git a/packages/rpc-methods/src/permitted/invokeSnapSugar.test.ts b/packages/rpc-methods/src/permitted/invokeSnapSugar.test.ts index 57b15d83e1..64a3db5421 100644 --- a/packages/rpc-methods/src/permitted/invokeSnapSugar.test.ts +++ b/packages/rpc-methods/src/permitted/invokeSnapSugar.test.ts @@ -1,9 +1,9 @@ +import { rpcErrors } from '@metamask/rpc-errors'; import { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback, JsonRpcRequest, } from '@metamask/types'; -import { ethErrors } from 'eth-rpc-errors'; import { getValidatedParams, invokeSnapSugar } from './invokeSnapSugar'; @@ -49,7 +49,7 @@ describe('wallet_invokeSnap', () => { invokeSnapSugar(req, _res, next, end); expect(end).toHaveBeenCalledWith( - ethErrors.rpc.invalidParams({ + rpcErrors.invalidParams({ message: 'Must specify a valid snap ID.', }), ); diff --git a/packages/rpc-methods/src/permitted/invokeSnapSugar.ts b/packages/rpc-methods/src/permitted/invokeSnapSugar.ts index bb020ab36f..1a28036dd1 100644 --- a/packages/rpc-methods/src/permitted/invokeSnapSugar.ts +++ b/packages/rpc-methods/src/permitted/invokeSnapSugar.ts @@ -1,15 +1,14 @@ import { - PermittedHandlerExport, - JsonRpcRequest, - JsonRpcEngineNextCallback, JsonRpcEngineEndCallback, -} from '@metamask/types'; -import { isObject } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; + JsonRpcEngineNextCallback, +} from '@metamask/json-rpc-engine'; +import { rpcErrors } from '@metamask/rpc-errors'; +import { PermittedHandlerExport } from '@metamask/types'; +import { isObject, JsonRpcRequest } from '@metamask/utils'; export type InvokeSnapSugarArgs = { snapId: string; - request: JsonRpcRequest; + request: JsonRpcRequest; }; /** @@ -17,7 +16,7 @@ export type InvokeSnapSugarArgs = { */ export const invokeSnapSugarHandler: PermittedHandlerExport< void, - JsonRpcRequest, + JsonRpcRequest, unknown > = { methodNames: ['wallet_invokeSnap'], @@ -38,7 +37,7 @@ export const invokeSnapSugarHandler: PermittedHandlerExport< * @throws If the params are invalid. */ export function invokeSnapSugar( - req: JsonRpcRequest, + req: JsonRpcRequest, _res: unknown, next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, @@ -64,7 +63,7 @@ export function invokeSnapSugar( */ export function getValidatedParams(params: unknown): InvokeSnapSugarArgs { if (!isObject(params)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected params to be a single object.', }); } @@ -72,13 +71,13 @@ export function getValidatedParams(params: unknown): InvokeSnapSugarArgs { const { snapId, request } = params; if (!snapId || typeof snapId !== 'string' || snapId === '') { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Must specify a valid snap ID.', }); } if (!isObject(request)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected request to be a single object.', }); } diff --git a/packages/rpc-methods/src/permitted/middleware.test.ts b/packages/rpc-methods/src/permitted/middleware.test.ts index f9b4abff5e..7c18274767 100644 --- a/packages/rpc-methods/src/permitted/middleware.test.ts +++ b/packages/rpc-methods/src/permitted/middleware.test.ts @@ -1,8 +1,8 @@ +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { MOCK_SNAP_ID, getTruncatedSnap, } from '@metamask/snaps-utils/test-utils'; -import { JsonRpcEngine } from 'json-rpc-engine'; import { createSnapsMethodMiddleware } from './middleware'; diff --git a/packages/rpc-methods/src/permitted/middleware.ts b/packages/rpc-methods/src/permitted/middleware.ts index 5e59d943ef..f9d6d7233d 100644 --- a/packages/rpc-methods/src/permitted/middleware.ts +++ b/packages/rpc-methods/src/permitted/middleware.ts @@ -1,6 +1,6 @@ +import { JsonRpcMiddleware } from '@metamask/json-rpc-engine'; +import { rpcErrors } from '@metamask/rpc-errors'; import { logError } from '@metamask/snaps-utils'; -import { ethErrors } from 'eth-rpc-errors'; -import { JsonRpcMiddleware } from 'json-rpc-engine'; import { selectHooks } from '../utils'; import { methodHandlers } from './handlers'; @@ -23,7 +23,7 @@ export function createSnapsMethodMiddleware( methodHandlers[request.method as keyof typeof methodHandlers]; if (handler) { if (request.method.startsWith('snap_') && !isSnap) { - return end(ethErrors.rpc.methodNotFound()); + return end(rpcErrors.methodNotFound()); } // TODO: Once json-rpc-engine types are up to date, we should type this correctly diff --git a/packages/rpc-methods/src/permitted/requestSnaps.test.ts b/packages/rpc-methods/src/permitted/requestSnaps.test.ts index f2575a2909..fd7294f0ed 100644 --- a/packages/rpc-methods/src/permitted/requestSnaps.test.ts +++ b/packages/rpc-methods/src/permitted/requestSnaps.test.ts @@ -1,3 +1,4 @@ +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { RequestedPermissions, PermissionConstraint, @@ -13,7 +14,6 @@ import { JsonRpcSuccess, PendingJsonRpcResponse, } from '@metamask/types'; -import { JsonRpcEngine } from 'json-rpc-engine'; import { WALLET_SNAP_PERMISSION_KEY } from '../restricted/invokeSnap'; import { diff --git a/packages/rpc-methods/src/permitted/requestSnaps.ts b/packages/rpc-methods/src/permitted/requestSnaps.ts index 69fe757f80..977d69cdf3 100644 --- a/packages/rpc-methods/src/permitted/requestSnaps.ts +++ b/packages/rpc-methods/src/permitted/requestSnaps.ts @@ -3,6 +3,7 @@ import { RequestedPermissions, Caveat, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SnapCaveatType, SnapsPermissionRequest, @@ -15,7 +16,6 @@ import { JsonRpcEngineEndCallback, } from '@metamask/types'; import { hasProperty, isObject, Json } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { WALLET_SNAP_PERMISSION_KEY } from '../restricted/invokeSnap'; import { MethodHooksObject } from '../utils'; @@ -176,7 +176,7 @@ async function requestSnapsImplementation( const requestedSnaps = req.params; if (!isObject(requestedSnaps)) { return end( - ethErrors.rpc.invalidParams({ + rpcErrors.invalidParams({ message: '"params" must be an object.', }), ); diff --git a/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts b/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts index 2e60069bda..6f1568dcd3 100644 --- a/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts +++ b/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts @@ -3,9 +3,9 @@ import { RestrictedMethodCaveatSpecificationConstraint, Caveat, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SnapCaveatType } from '@metamask/snaps-utils'; import { Json, hasProperty, isPlainObject } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { GetBip44EntropyParams } from '../getBip44Entropy'; @@ -40,7 +40,7 @@ export function validateBIP44Params( value: unknown, ): asserts value is GetBip44EntropyParams { if (!isPlainObject(value) || !hasProperty(value, 'coinType')) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected a plain object containing a coin type.', }); } @@ -51,7 +51,7 @@ export function validateBIP44Params( value.coinType < 0 || value.coinType > 0x7fffffff ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Invalid "coinType" parameter. Coin type must be a non-negative integer.', }); @@ -71,7 +71,7 @@ export function validateBIP44Caveat(caveat: Caveat) { !Array.isArray(caveat.value) || caveat.value.length === 0 ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected non-empty array of coin types.', }); } diff --git a/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts b/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts index df6820748e..74144b50b9 100644 --- a/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts +++ b/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts @@ -3,13 +3,13 @@ import { PermissionConstraint, RestrictedMethodCaveatSpecificationConstraint, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SnapCaveatType, Bip32Entropy, Bip32EntropyStruct, } from '@metamask/snaps-utils'; import { Json, assertStruct } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { array, size, type } from 'superstruct'; import { isEqual } from '../../utils'; @@ -51,7 +51,7 @@ export function validateBIP32Path( value, Bip32EntropyStruct, 'Invalid BIP-32 entropy path definition', - ethErrors.rpc.invalidParams, + rpcErrors.invalidParams, ); } @@ -69,7 +69,7 @@ export function validateBIP32CaveatPaths( caveat, type({ value: size(array(Bip32EntropyStruct), 1, Infinity) }), 'Invalid BIP-32 entropy caveat', - ethErrors.rpc.internal, + rpcErrors.internal, ); } diff --git a/packages/rpc-methods/src/restricted/caveats/snapIds.ts b/packages/rpc-methods/src/restricted/caveats/snapIds.ts index 31ced4c054..10c7f996a4 100644 --- a/packages/rpc-methods/src/restricted/caveats/snapIds.ts +++ b/packages/rpc-methods/src/restricted/caveats/snapIds.ts @@ -4,9 +4,9 @@ import { RestrictedMethodParameters, RestrictedMethodCaveatSpecificationConstraint, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { assertIsValidSnapId, SnapCaveatType } from '@metamask/snaps-utils'; import { isObject, hasProperty } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { InvokeSnapParams } from '../invokeSnap'; @@ -18,7 +18,7 @@ import { InvokeSnapParams } from '../invokeSnap'; */ export function validateSnapIdsCaveat(caveat: Caveat) { if (!isObject(caveat.value) || Object.keys(caveat.value).length === 0) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected caveat to have a value property of a non-empty object of snap IDs.', }); diff --git a/packages/rpc-methods/src/restricted/dialog.ts b/packages/rpc-methods/src/restricted/dialog.ts index 374d2cce72..2958c28c2a 100644 --- a/packages/rpc-methods/src/restricted/dialog.ts +++ b/packages/rpc-methods/src/restricted/dialog.ts @@ -4,9 +4,9 @@ import { RestrictedMethodOptions, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { Component, ComponentStruct } from '@metamask/snaps-ui'; import { NonEmptyArray } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { create, enums, @@ -183,7 +183,7 @@ function getValidatedType(params: unknown): DialogType { try { return create(params, BaseParamsStruct).type; } catch (error) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `The "type" property must be one of: ${Object.values( DialogType, ).join(', ')}.`, @@ -210,18 +210,18 @@ function getValidatedParams( const { key, type: errorType } = error; if (key === 'placeholder' && errorType === 'never') { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Invalid params: Alerts or confirmations may not specify a "placeholder" field.', }); } - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Invalid params: ${error.message}.`, }); } /* istanbul ignore next */ - throw ethErrors.rpc.internal(); + throw rpcErrors.internal(); } } diff --git a/packages/rpc-methods/src/restricted/getBip32Entropy.ts b/packages/rpc-methods/src/restricted/getBip32Entropy.ts index ef3ded6a04..2f361409a9 100644 --- a/packages/rpc-methods/src/restricted/getBip32Entropy.ts +++ b/packages/rpc-methods/src/restricted/getBip32Entropy.ts @@ -11,9 +11,9 @@ import { RestrictedMethodOptions, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { Bip32Entropy, SnapCaveatType } from '@metamask/snaps-utils'; import { NonEmptyArray, assert } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { MethodHooksObject } from '../utils'; @@ -69,7 +69,7 @@ const specificationBuilder: PermissionSpecificationBuilder< caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.PermittedDerivationPaths ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Expected a single "${SnapCaveatType.PermittedDerivationPaths}" caveat.`, }); } diff --git a/packages/rpc-methods/src/restricted/getBip32PublicKey.ts b/packages/rpc-methods/src/restricted/getBip32PublicKey.ts index 1e7a66b913..2481c8b41e 100644 --- a/packages/rpc-methods/src/restricted/getBip32PublicKey.ts +++ b/packages/rpc-methods/src/restricted/getBip32PublicKey.ts @@ -6,13 +6,13 @@ import { RestrictedMethodOptions, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { bip32entropy, Bip32PathStruct, SnapCaveatType, } from '@metamask/snaps-utils'; import { NonEmptyArray, assertStruct } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { boolean, enums, object, optional } from 'superstruct'; import { MethodHooksObject } from '../utils'; @@ -83,7 +83,7 @@ const specificationBuilder: PermissionSpecificationBuilder< caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.PermittedDerivationPaths ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Expected a single "${SnapCaveatType.PermittedDerivationPaths}" caveat.`, }); } @@ -125,7 +125,7 @@ export function getBip32PublicKeyImplementation({ args.params, Bip32PublicKeyArgsStruct, 'Invalid BIP-32 public key params', - ethErrors.rpc.invalidParams, + rpcErrors.invalidParams, ); const { params } = args; diff --git a/packages/rpc-methods/src/restricted/getBip44Entropy.ts b/packages/rpc-methods/src/restricted/getBip44Entropy.ts index e60a020350..b35e790308 100644 --- a/packages/rpc-methods/src/restricted/getBip44Entropy.ts +++ b/packages/rpc-methods/src/restricted/getBip44Entropy.ts @@ -6,9 +6,9 @@ import { RestrictedMethodOptions, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SnapCaveatType } from '@metamask/snaps-utils'; import { NonEmptyArray } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { MethodHooksObject } from '../utils'; @@ -69,7 +69,7 @@ const specificationBuilder: PermissionSpecificationBuilder< caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.PermittedCoinTypes ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Expected a single "${SnapCaveatType.PermittedCoinTypes}" caveat.`, }); } diff --git a/packages/rpc-methods/src/restricted/getEntropy.ts b/packages/rpc-methods/src/restricted/getEntropy.ts index f18b6913d4..3d1e0ef264 100644 --- a/packages/rpc-methods/src/restricted/getEntropy.ts +++ b/packages/rpc-methods/src/restricted/getEntropy.ts @@ -4,9 +4,9 @@ import { RestrictedMethodOptions, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SIP_6_MAGIC_VALUE } from '@metamask/snaps-utils'; import { assertStruct, Hex, NonEmptyArray } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { Infer, literal, object, optional, string } from 'superstruct'; import { deriveEntropy, MethodHooksObject } from '../utils'; @@ -107,7 +107,7 @@ function getEntropyImplementation({ params, GetEntropyArgsStruct, 'Invalid "snap_getEntropy" parameters', - ethErrors.rpc.invalidParams, + rpcErrors.invalidParams, ); await getUnlockPromise(true); diff --git a/packages/rpc-methods/src/restricted/invokeSnap.ts b/packages/rpc-methods/src/restricted/invokeSnap.ts index 65dc24bf22..3ad8091a2d 100644 --- a/packages/rpc-methods/src/restricted/invokeSnap.ts +++ b/packages/rpc-methods/src/restricted/invokeSnap.ts @@ -6,6 +6,7 @@ import { PermissionValidatorConstraint, PermissionSideEffect, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { Snap, SnapId, @@ -16,7 +17,6 @@ import { InstallSnapsResult, } from '@metamask/snaps-utils'; import { isJsonRpcRequest, Json, NonEmptyArray } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { nanoid } from 'nanoid'; import { MethodHooksObject } from '../utils'; @@ -129,7 +129,7 @@ const specificationBuilder: PermissionSpecificationBuilder< methodImplementation: getInvokeSnapImplementation(methodHooks), validator: ({ caveats }) => { if (caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.SnapIds) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Expected a single "${SnapCaveatType.SnapIds}" caveat.`, }); } @@ -178,14 +178,14 @@ export function getInvokeSnapImplementation({ }; if (!isJsonRpcRequest(rpcRequest)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Must specify a valid JSON-RPC request object as single parameter.', }); } if (!getSnap(snapId)) { - throw ethErrors.rpc.invalidRequest({ + throw rpcErrors.invalidRequest({ message: `The snap "${snapId}" is not installed. Please install it first, before invoking the snap.`, }); } diff --git a/packages/rpc-methods/src/restricted/manageState.test.ts b/packages/rpc-methods/src/restricted/manageState.test.ts index 19b477942a..1d408c99d0 100644 --- a/packages/rpc-methods/src/restricted/manageState.test.ts +++ b/packages/rpc-methods/src/restricted/manageState.test.ts @@ -1,10 +1,10 @@ import { decrypt, encrypt } from '@metamask/browser-passworder'; +import { rpcErrors } from '@metamask/rpc-errors'; import { MOCK_LOCAL_SNAP_ID, MOCK_SNAP_ID, TEST_SECRET_RECOVERY_PHRASE_BYTES, } from '@metamask/snaps-utils/test-utils'; -import { ethErrors } from 'eth-rpc-errors'; import { getManageStateImplementation, @@ -309,7 +309,7 @@ describe('snap_manageState', () => { params: { operation: ManageStateOperation.GetState }, }), ).rejects.toThrow( - ethErrors.rpc.internal({ + rpcErrors.internal({ message: 'Failed to decrypt snap state, the state must be corrupted.', }), ); diff --git a/packages/rpc-methods/src/restricted/manageState.ts b/packages/rpc-methods/src/restricted/manageState.ts index d465c20fb3..434ee6f452 100644 --- a/packages/rpc-methods/src/restricted/manageState.ts +++ b/packages/rpc-methods/src/restricted/manageState.ts @@ -4,6 +4,7 @@ import { RestrictedMethodOptions, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { STATE_ENCRYPTION_MAGIC_VALUE } from '@metamask/snaps-utils'; import { Json, @@ -14,7 +15,6 @@ import { isValidJson, Hex, } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { deriveEntropy, EnumToUnion, MethodHooksObject } from '../utils'; @@ -229,7 +229,7 @@ async function decryptState({ return decryptedState as Record; } catch { - throw ethErrors.rpc.internal({ + throw rpcErrors.internal({ message: 'Failed to decrypt snap state, the state must be corrupted.', }); } @@ -311,7 +311,7 @@ export function getManageStateImplementation({ } default: - throw ethErrors.rpc.invalidParams( + throw rpcErrors.invalidParams( `Invalid ${method} operation: "${operation as string}"`, ); } @@ -333,7 +333,7 @@ export function getValidatedParams( storageSizeLimit = STORAGE_SIZE_LIMIT, ): ManageStateArgs { if (!isObject(params)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected params to be a single object.', }); } @@ -345,14 +345,14 @@ export function getValidatedParams( typeof operation !== 'string' || !(Object.values(ManageStateOperation) as string[]).includes(operation) ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Must specify a valid manage state "operation".', }); } if (operation === ManageStateOperation.UpdateState) { if (!isObject(newState)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Invalid ${method} "updateState" parameter: The new state must be a plain object.`, data: { receivedNewState: @@ -366,7 +366,7 @@ export function getValidatedParams( // `getJsonSize` will throw if the state is not JSON serializable. size = getJsonSize(newState); } catch { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Invalid ${method} "updateState" parameter: The new state must be JSON serializable.`, data: { receivedNewState: @@ -376,7 +376,7 @@ export function getValidatedParams( } if (size > storageSizeLimit) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Invalid ${method} "updateState" parameter: The new state must not exceed ${storageSizeLimit} bytes in size.`, data: { receivedNewState: diff --git a/packages/rpc-methods/src/restricted/notify.ts b/packages/rpc-methods/src/restricted/notify.ts index bc47f30471..08ef994925 100644 --- a/packages/rpc-methods/src/restricted/notify.ts +++ b/packages/rpc-methods/src/restricted/notify.ts @@ -4,8 +4,8 @@ import { RestrictedMethodOptions, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { NonEmptyArray, isObject } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { EnumToUnion, MethodHooksObject } from '../utils'; @@ -124,7 +124,7 @@ export function getImplementation({ case NotificationType.InApp: return await showInAppNotification(origin, validatedParams); default: - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Must specify a valid notification "type".', }); } @@ -140,7 +140,7 @@ export function getImplementation({ */ export function getValidatedParams(params: unknown): NotificationArgs { if (!isObject(params)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected params to be a single object.', }); } @@ -152,14 +152,14 @@ export function getValidatedParams(params: unknown): NotificationArgs { typeof type !== 'string' || !Object.values(NotificationType).includes(type as NotificationType) ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Must specify a valid notification "type".', }); } // Set to the max message length on a Mac notification for now. if (!message || typeof message !== 'string' || message.length >= 50) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Must specify a non-empty string "message" less than 50 characters long.', }); diff --git a/packages/snaps-controllers/src/multichain/middleware.test.ts b/packages/snaps-controllers/src/multichain/middleware.test.ts index 88fd2548cd..fdd19a9d32 100644 --- a/packages/snaps-controllers/src/multichain/middleware.test.ts +++ b/packages/snaps-controllers/src/multichain/middleware.test.ts @@ -1,4 +1,4 @@ -import { JsonRpcEngine } from 'json-rpc-engine'; +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { createMultiChainMiddleware } from './middleware'; diff --git a/packages/snaps-controllers/src/multichain/middleware.ts b/packages/snaps-controllers/src/multichain/middleware.ts index d0767030eb..b67c881a5b 100644 --- a/packages/snaps-controllers/src/multichain/middleware.ts +++ b/packages/snaps-controllers/src/multichain/middleware.ts @@ -1,3 +1,7 @@ +import { + createAsyncMiddleware, + JsonRpcMiddleware, +} from '@metamask/json-rpc-engine'; import { assertIsConnectArguments, assertIsMultiChainRequest, @@ -5,12 +9,7 @@ import { Session, MultiChainRequest, } from '@metamask/snaps-utils'; -import { assert } from '@metamask/utils'; -import { - createAsyncMiddleware, - JsonRpcMiddleware, - JsonRpcRequest, -} from 'json-rpc-engine'; +import { JsonRpcRequest, assert } from '@metamask/utils'; /** * Creates a middleware that handles requests to the multichain controller. @@ -29,12 +28,11 @@ export function createMultiChainMiddleware({ requestedNamespaces: ConnectArguments, ) => Promise; onRequest: (origin: string, data: MultiChainRequest) => Promise; -}): JsonRpcMiddleware, 'id' | 'jsonrpc'>, any> { +}): JsonRpcMiddleware, any> { return createAsyncMiddleware(async function middleware(req, res, next) { // This is added by other middleware - const { origin, params: unwrapped } = req as JsonRpcRequest< - JsonRpcRequest - > & { origin: string }; + const { origin, params: unwrapped } = + req as JsonRpcRequest & { origin: string }; if (req.method !== 'wallet_multiChainRequestHack') { await next(); return; diff --git a/packages/snaps-controllers/src/services/AbstractExecutionService.ts b/packages/snaps-controllers/src/services/AbstractExecutionService.ts index d827cb6439..faf9c42515 100644 --- a/packages/snaps-controllers/src/services/AbstractExecutionService.ts +++ b/packages/snaps-controllers/src/services/AbstractExecutionService.ts @@ -1,3 +1,4 @@ +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import ObjectMultiplex from '@metamask/object-multiplex'; import { BasePostMessageStream } from '@metamask/post-message-stream'; import { @@ -12,13 +13,9 @@ import { isObject, Json, JsonRpcNotification, -} from '@metamask/utils'; -import { - JsonRpcEngine, - // TODO: Replace with @metamask/utils version after bumping json-rpc-engine JsonRpcRequest, PendingJsonRpcResponse, -} from 'json-rpc-engine'; +} from '@metamask/utils'; import { createStreamMiddleware } from 'json-rpc-middleware-stream'; import { nanoid } from 'nanoid'; import pump from 'pump'; @@ -230,7 +227,7 @@ export abstract class AbstractExecutionService // Also keep track of outbound request/responses const notificationHandler = ( message: - | JsonRpcRequest + | JsonRpcRequest | JsonRpcNotification>, ) => { if (!isJsonRpcNotification(message)) { @@ -364,7 +361,7 @@ export abstract class AbstractExecutionService // Cannot be hash private yet because of tests. private async command( jobId: string, - message: JsonRpcRequest, + message: JsonRpcRequest, ): Promise { if (typeof message !== 'object') { throw new Error('Must send object.'); @@ -376,8 +373,9 @@ export abstract class AbstractExecutionService } log('Parent: Sending Command', message); - const response: PendingJsonRpcResponse = - await job.rpcEngine.handle(message); + const response: PendingJsonRpcResponse = await job.rpcEngine.handle( + message, + ); if (response.error) { throw new Error(response.error.message); } diff --git a/packages/snaps-controllers/src/snaps/SnapController.test.ts b/packages/snaps-controllers/src/snaps/SnapController.test.ts index 18691cd8fe..0a1211db21 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.test.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.test.ts @@ -1,9 +1,14 @@ import { getPersistentState } from '@metamask/base-controller'; +import { + createAsyncMiddleware, + JsonRpcEngine, +} from '@metamask/json-rpc-engine'; import { Caveat, SubjectPermissions, ValidPermission, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { WALLET_SNAP_PERMISSION_KEY } from '@metamask/rpc-methods'; import { DEFAULT_ENDOWMENTS, @@ -30,9 +35,7 @@ import { MOCK_SNAP_ID, } from '@metamask/snaps-utils/test-utils'; import { AssertionError, SemVerVersion, SemVerRange } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import fetchMock from 'jest-fetch-mock'; -import { createAsyncMiddleware, JsonRpcEngine } from 'json-rpc-engine'; import { createEngineStream } from 'json-rpc-middleware-stream'; import pump from 'pump'; import { Duplex } from 'stream'; @@ -1658,7 +1661,7 @@ describe('SnapController', () => { }, }), ).rejects.toThrow( - ethErrors.rpc.invalidRequest({ + rpcErrors.invalidRequest({ message: 'Invalid "jsonrpc" property. Must be "2.0" if provided.', data: 'kaplar', }), @@ -3445,7 +3448,7 @@ describe('SnapController', () => { detectSnapLocation(), ), ).rejects.toThrow( - ethErrors.rpc.invalidParams( + rpcErrors.invalidParams( `Snap "${MOCK_SNAP_ID}@${snap.version}" is already installed. Couldn't update to a version inside requested "*" range.`, ), ); diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index f028bb6f0e..e87ff450c5 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -24,6 +24,7 @@ import { ValidPermission, UpdateCaveat, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { caveatMappers, WALLET_SNAP_PERMISSION_KEY, @@ -80,7 +81,6 @@ import { timeSince, } from '@metamask/utils'; import { createMachine, interpret, StateMachine } from '@xstate/fsm'; -import { ethErrors } from 'eth-rpc-errors'; import type { Patch } from 'immer'; import { nanoid } from 'nanoid'; @@ -1621,7 +1621,7 @@ export class SnapController extends BaseController< const [error, version] = resolveVersionRange(rawVersion); if (error) { - throw ethErrors.rpc.invalidParams( + throw rpcErrors.invalidParams( `The "version" field must be a valid SemVer version range if specified. Received: "${rawVersion}".`, ); } @@ -1700,7 +1700,7 @@ export class SnapController extends BaseController< if (this.#featureFlags.dappsCanUpdateSnaps === true) { return await this.updateSnap(origin, snapId, location, versionRange); } - throw ethErrors.rpc.invalidParams( + throw rpcErrors.invalidParams( `Version mismatch with already installed snap. ${snapId}@${existingSnap.version} doesn't satisfy requested version ${versionRange}.`, ); } @@ -1850,7 +1850,7 @@ export class SnapController extends BaseController< const newVersion = newSnap.manifest.result.version; if (!gtVersion(newVersion, snap.version)) { - throw ethErrors.rpc.invalidParams( + throw rpcErrors.invalidParams( `Snap "${snapId}@${snap.version}" is already installed. Couldn't update to a version inside requested "${newVersionRange}" range.`, ); } @@ -2520,7 +2520,7 @@ export class SnapController extends BaseController< if (!hasProperty(request, 'jsonrpc')) { _request = { ...(request as Record), jsonrpc: '2.0' }; } else if (request.jsonrpc !== '2.0') { - throw ethErrors.rpc.invalidRequest({ + throw rpcErrors.invalidRequest({ message: 'Invalid "jsonrpc" property. Must be "2.0" if provided.', data: request.jsonrpc, }); diff --git a/packages/snaps-controllers/src/snaps/endowments/cronjob.ts b/packages/snaps-controllers/src/snaps/endowments/cronjob.ts index 4724cd2bc5..e0a2b45c27 100644 --- a/packages/snaps-controllers/src/snaps/endowments/cronjob.ts +++ b/packages/snaps-controllers/src/snaps/endowments/cronjob.ts @@ -7,6 +7,7 @@ import { Caveat, CaveatSpecificationConstraint, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SnapCaveatType, CronjobSpecification, @@ -19,7 +20,6 @@ import { Json, NonEmptyArray, } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { SnapEndowments } from './enum'; @@ -113,7 +113,7 @@ export function getCronjobCaveatJobs( */ export function validateCronjobCaveat(caveat: Caveat) { if (!hasProperty(caveat, 'value') || !isPlainObject(caveat.value)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected a plain object.', }); } @@ -121,13 +121,13 @@ export function validateCronjobCaveat(caveat: Caveat) { const { value } = caveat; if (!hasProperty(value, 'jobs') || !isPlainObject(value)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected a plain object.', }); } if (!isCronjobSpecificationArray(value.jobs)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected a valid cronjob specification array.', }); } diff --git a/packages/snaps-controllers/src/snaps/endowments/keyring.ts b/packages/snaps-controllers/src/snaps/endowments/keyring.ts index 3251a92a7f..44544ca7c3 100644 --- a/packages/snaps-controllers/src/snaps/endowments/keyring.ts +++ b/packages/snaps-controllers/src/snaps/endowments/keyring.ts @@ -8,6 +8,7 @@ import { PermissionValidatorConstraint, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { assertIsNamespacesObject, Namespaces, @@ -20,7 +21,6 @@ import { NonEmptyArray, assert, } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { SnapEndowments } from './enum'; @@ -58,7 +58,7 @@ const specificationBuilder: PermissionSpecificationBuilder< caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.SnapKeyring ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Expected a single "${SnapCaveatType.SnapKeyring}" caveat.`, }); } @@ -80,7 +80,7 @@ export const keyringEndowmentBuilder = Object.freeze({ */ function validateCaveatNamespace(caveat: Caveat): void { if (!hasProperty(caveat, 'value') || !isPlainObject(caveat.value)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected a plain object.', }); } @@ -88,12 +88,12 @@ function validateCaveatNamespace(caveat: Caveat): void { const { value } = caveat; if (!hasProperty(value, 'namespaces') || !isPlainObject(value)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected a plain object.', }); } - assertIsNamespacesObject(value.namespaces, ethErrors.rpc.invalidParams); + assertIsNamespacesObject(value.namespaces, rpcErrors.invalidParams); } /** diff --git a/packages/snaps-controllers/src/snaps/endowments/rpc.ts b/packages/snaps-controllers/src/snaps/endowments/rpc.ts index 0d7b434da0..dcc79abc40 100644 --- a/packages/snaps-controllers/src/snaps/endowments/rpc.ts +++ b/packages/snaps-controllers/src/snaps/endowments/rpc.ts @@ -8,6 +8,7 @@ import { PermissionValidatorConstraint, ValidPermissionSpecification, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { assertIsRpcOrigins, RpcOrigins, @@ -20,7 +21,6 @@ import { NonEmptyArray, assert, } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { SnapEndowments } from './enum'; @@ -58,7 +58,7 @@ const specificationBuilder: PermissionSpecificationBuilder< caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.RpcOrigin ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Expected a single "${SnapCaveatType.RpcOrigin}" caveat.`, }); } @@ -80,13 +80,13 @@ export const rpcEndowmentBuilder = Object.freeze({ */ function validateCaveatOrigins(caveat: Caveat) { if (!hasProperty(caveat, 'value') || !isPlainObject(caveat.value)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Invalid JSON-RPC origins: Expected a plain object.', }); } const { value } = caveat; - assertIsRpcOrigins(value, ethErrors.rpc.invalidParams); + assertIsRpcOrigins(value, rpcErrors.invalidParams); } /** diff --git a/packages/snaps-controllers/src/snaps/endowments/transaction-insight.ts b/packages/snaps-controllers/src/snaps/endowments/transaction-insight.ts index 9099eb0b2f..fd06de7b2c 100644 --- a/packages/snaps-controllers/src/snaps/endowments/transaction-insight.ts +++ b/packages/snaps-controllers/src/snaps/endowments/transaction-insight.ts @@ -8,6 +8,7 @@ import { CaveatSpecificationConstraint, Caveat, } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SnapCaveatType } from '@metamask/snaps-utils'; import { assert, @@ -17,7 +18,6 @@ import { Json, NonEmptyArray, } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { SnapEndowments } from './enum'; @@ -54,7 +54,7 @@ const specificationBuilder: PermissionSpecificationBuilder< (caveats?.length === 1 && caveats[0].type !== SnapCaveatType.TransactionOrigin) ) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: `Expected a single "${SnapCaveatType.TransactionOrigin}" caveat.`, }); } @@ -75,7 +75,7 @@ export const transactionInsightEndowmentBuilder = Object.freeze({ */ function validateCaveat(caveat: Caveat): void { if (!hasProperty(caveat, 'value') || !isPlainObject(caveat)) { - throw ethErrors.rpc.invalidParams({ + throw rpcErrors.invalidParams({ message: 'Expected a plain object.', }); } diff --git a/packages/snaps-controllers/src/test-utils/controller.ts b/packages/snaps-controllers/src/test-utils/controller.ts index 7a5becd570..c7a81a1847 100644 --- a/packages/snaps-controllers/src/test-utils/controller.ts +++ b/packages/snaps-controllers/src/test-utils/controller.ts @@ -5,6 +5,7 @@ import { ValidPermission, Caveat, } from '@metamask/permission-controller'; +import { providerErrors } from '@metamask/rpc-errors'; import { WALLET_SNAP_PERMISSION_KEY } from '@metamask/rpc-methods'; import { SnapCaveatType } from '@metamask/snaps-utils'; import { @@ -20,7 +21,6 @@ import { SubjectType, } from '@metamask/subject-metadata-controller'; import { Json } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { CronjobControllerActions, CronjobControllerEvents } from '../cronjob'; import { @@ -87,7 +87,7 @@ export class MockApprovalController { }) { if (this.#approval) { if (requestState.loading === false && !requestState.error) { - this.#approval.promise.reject(ethErrors.provider.userRejectedRequest()); + this.#approval.promise.reject(providerErrors.userRejectedRequest()); } } } diff --git a/packages/snaps-controllers/src/test-utils/execution-environment.ts b/packages/snaps-controllers/src/test-utils/execution-environment.ts index 32be049f1e..221b3dae2c 100644 --- a/packages/snaps-controllers/src/test-utils/execution-environment.ts +++ b/packages/snaps-controllers/src/test-utils/execution-environment.ts @@ -1,6 +1,6 @@ +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { SnapRpcHookArgs } from '@metamask/snaps-utils'; import { MockControllerMessenger } from '@metamask/snaps-utils/test-utils'; -import { JsonRpcEngine } from 'json-rpc-engine'; import { createEngineStream } from 'json-rpc-middleware-stream'; import pump from 'pump'; diff --git a/packages/snaps-controllers/src/test-utils/service.ts b/packages/snaps-controllers/src/test-utils/service.ts index 25e354aea9..156222616f 100644 --- a/packages/snaps-controllers/src/test-utils/service.ts +++ b/packages/snaps-controllers/src/test-utils/service.ts @@ -1,5 +1,5 @@ import { ControllerMessenger } from '@metamask/base-controller'; -import { JsonRpcEngine } from 'json-rpc-engine'; +import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { createEngineStream } from 'json-rpc-middleware-stream'; import pump from 'pump'; import { Duplex } from 'stream'; diff --git a/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts b/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts index ac4263464d..1876d04358 100644 --- a/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts +++ b/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts @@ -1,7 +1,9 @@ // eslint-disable-next-line @typescript-eslint/triple-slash-reference, spaced-comment /// +import { createIdRemapMiddleware } from '@metamask/json-rpc-engine'; import { StreamProvider } from '@metamask/providers'; import { RequestArguments } from '@metamask/providers/dist/BaseProvider'; +import { errorCodes, rpcErrors, serializeError } from '@metamask/rpc-errors'; import { SnapsGlobalObject } from '@metamask/rpc-methods'; import { SnapExports, @@ -21,8 +23,6 @@ import { Json, hasProperty, } from '@metamask/utils'; -import { errorCodes, ethErrors, serializeError } from 'eth-rpc-errors'; -import { createIdRemapMiddleware } from 'json-rpc-engine'; import { Duplex } from 'stream'; import { validate } from 'superstruct'; @@ -197,7 +197,7 @@ export class BaseSnapExecutor { if (!hasProperty(EXECUTION_ENVIRONMENT_METHODS, method)) { this.respond(id, { - error: ethErrors.rpc + error: rpcErrors .methodNotFound({ data: { method, @@ -216,7 +216,7 @@ export class BaseSnapExecutor { const [error] = validate(paramsAsArray, methodObject.struct); if (error) { this.respond(id, { - error: ethErrors.rpc + error: rpcErrors .invalidParams({ message: `Invalid parameters for method "${method}": ${error.message}.`, data: { @@ -485,7 +485,7 @@ export class BaseSnapExecutor { (stop = () => reject( // TODO(rekmarks): Specify / standardize error code for this case. - ethErrors.rpc.internal( + rpcErrors.internal( `The snap "${snapName}" has been terminated during execution.`, ), )), diff --git a/packages/snaps-execution-environments/src/common/test-utils/endowments.ts b/packages/snaps-execution-environments/src/common/test-utils/endowments.ts index 61ef0ddf2c..182db4bb6e 100644 --- a/packages/snaps-execution-environments/src/common/test-utils/endowments.ts +++ b/packages/snaps-execution-environments/src/common/test-utils/endowments.ts @@ -1,10 +1,10 @@ // @ts-expect-error Walker has no types yet. import LavaTube from '@lavamoat/lavatube'; +import { createIdRemapMiddleware } from '@metamask/json-rpc-engine'; import ObjectMultiplex from '@metamask/object-multiplex'; import { StreamProvider } from '@metamask/providers'; import { RequestArguments } from '@metamask/providers/dist/BaseProvider'; import { SNAP_STREAM_NAMES } from '@metamask/snaps-utils'; -import { createIdRemapMiddleware } from 'json-rpc-engine'; import { assertEthereumOutboundRequest, diff --git a/packages/snaps-execution-environments/src/common/utils.ts b/packages/snaps-execution-environments/src/common/utils.ts index 6d31caa646..607b727c17 100644 --- a/packages/snaps-execution-environments/src/common/utils.ts +++ b/packages/snaps-execution-environments/src/common/utils.ts @@ -1,7 +1,7 @@ import { StreamProvider } from '@metamask/providers'; import { RequestArguments } from '@metamask/providers/dist/BaseProvider'; +import { rpcErrors } from '@metamask/rpc-errors'; import { assert, assertStruct, JsonStruct } from '@metamask/utils'; -import { ethErrors } from 'eth-rpc-errors'; import { log } from '../logging'; @@ -121,7 +121,7 @@ export function assertSnapOutboundRequest(args: RequestArguments) { ); assert( !BLOCKED_RPC_METHODS.includes(args.method), - ethErrors.rpc.methodNotFound({ + rpcErrors.methodNotFound({ data: { method: args.method, }, @@ -139,7 +139,7 @@ export function assertEthereumOutboundRequest(args: RequestArguments) { // Disallow snaps methods for separation of concerns. assert( !String.prototype.startsWith.call(args.method, 'snap_'), - ethErrors.rpc.methodNotFound({ + rpcErrors.methodNotFound({ data: { method: args.method, }, @@ -147,7 +147,7 @@ export function assertEthereumOutboundRequest(args: RequestArguments) { ); assert( !BLOCKED_RPC_METHODS.includes(args.method), - ethErrors.rpc.methodNotFound({ + rpcErrors.methodNotFound({ data: { method: args.method, }, diff --git a/packages/snaps-utils/src/snaps.ts b/packages/snaps-utils/src/snaps.ts index b30dcfcfa6..68fe75a332 100644 --- a/packages/snaps-utils/src/snaps.ts +++ b/packages/snaps-utils/src/snaps.ts @@ -13,7 +13,6 @@ import { assertStruct, } from '@metamask/utils'; import { base64 } from '@scure/base'; -import { SerializedEthereumRpcError } from 'eth-rpc-errors/dist/classes'; import stableStringify from 'fast-json-stable-stringify'; import { empty, @@ -165,9 +164,7 @@ export type TruncatedSnapFields = */ export type TruncatedSnap = Pick; -export type ProcessSnapResult = - | TruncatedSnap - | { error: SerializedEthereumRpcError }; +export type ProcessSnapResult = TruncatedSnap; export type InstallSnapsResult = Record; diff --git a/yarn.lock b/yarn.lock index dd64781447..351eb922a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10244,7 +10244,7 @@ __metadata: languageName: node linkType: hard -"eth-rpc-errors@npm:^4.0.0, eth-rpc-errors@npm:^4.0.2, eth-rpc-errors@npm:^4.0.3": +"eth-rpc-errors@npm:^4.0.0, eth-rpc-errors@npm:^4.0.2": version: 4.0.3 resolution: "eth-rpc-errors@npm:4.0.3" dependencies: @@ -20101,6 +20101,7 @@ __metadata: "@metamask/eslint-config-jest": ^11.0.0 "@metamask/eslint-config-nodejs": ^11.0.1 "@metamask/eslint-config-typescript": ^11.0.0 + "@metamask/rpc-errors": ^5.0.0 "@metamask/snaps-cli": "workspace:^" "@typescript-eslint/eslint-plugin": ^5.42.1 "@typescript-eslint/parser": ^5.42.1 @@ -20113,7 +20114,6 @@ __metadata: eslint-plugin-jsdoc: ^39.6.2 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^4.2.1 - eth-rpc-errors: ^4.0.3 prettier: ^2.7.1 prettier-plugin-packagejson: ^2.2.11 rimraf: ^4.1.2 From 8478cd912ce16dc34ead47bf44a869f2f8e790d8 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Fri, 14 Apr 2023 12:20:07 +0200 Subject: [PATCH 3/4] Fix a few types --- packages/rpc-methods/src/permitted/middleware.ts | 3 ++- .../src/restricted/caveats/permittedCoinTypes.ts | 4 ++-- .../src/restricted/caveats/permittedDerivationPaths.ts | 4 ++-- packages/rpc-methods/src/restricted/manageState.ts | 9 ++------- .../src/multichain/MultiChainController.ts | 4 ++-- packages/snaps-controllers/src/snaps/SnapController.ts | 2 +- packages/snaps-utils/src/types.ts | 2 +- 7 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/rpc-methods/src/permitted/middleware.ts b/packages/rpc-methods/src/permitted/middleware.ts index f9d6d7233d..c842dec1dd 100644 --- a/packages/rpc-methods/src/permitted/middleware.ts +++ b/packages/rpc-methods/src/permitted/middleware.ts @@ -1,6 +1,7 @@ import { JsonRpcMiddleware } from '@metamask/json-rpc-engine'; import { rpcErrors } from '@metamask/rpc-errors'; import { logError } from '@metamask/snaps-utils'; +import { JsonRpcParams, Json } from '@metamask/utils'; import { selectHooks } from '../utils'; import { methodHandlers } from './handlers'; @@ -15,7 +16,7 @@ import { methodHandlers } from './handlers'; export function createSnapsMethodMiddleware( isSnap: boolean, hooks: Record, -): JsonRpcMiddleware { +): JsonRpcMiddleware { // This is not actually a misused promise, the type is just wrong // eslint-disable-next-line @typescript-eslint/no-misused-promises return async function methodMiddleware(request, response, next, end) { diff --git a/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts b/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts index 6f1568dcd3..a9818c492c 100644 --- a/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts +++ b/packages/rpc-methods/src/restricted/caveats/permittedCoinTypes.ts @@ -3,7 +3,7 @@ import { RestrictedMethodCaveatSpecificationConstraint, Caveat, } from '@metamask/permission-controller'; -import { rpcErrors } from '@metamask/rpc-errors'; +import { rpcErrors, providerErrors } from '@metamask/rpc-errors'; import { SnapCaveatType } from '@metamask/snaps-utils'; import { Json, hasProperty, isPlainObject } from '@metamask/utils'; @@ -101,7 +101,7 @@ export const PermittedCoinTypesCaveatSpecification: Record< ); if (!coinType) { - throw ethErrors.provider.unauthorized({ + throw providerErrors.unauthorized({ message: 'The requested coin type is not permitted. Allowed coin types must be specified in the snap manifest.', }); diff --git a/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts b/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts index 74144b50b9..cfa7dfd9f5 100644 --- a/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts +++ b/packages/rpc-methods/src/restricted/caveats/permittedDerivationPaths.ts @@ -3,7 +3,7 @@ import { PermissionConstraint, RestrictedMethodCaveatSpecificationConstraint, } from '@metamask/permission-controller'; -import { rpcErrors } from '@metamask/rpc-errors'; +import { rpcErrors, providerErrors } from '@metamask/rpc-errors'; import { SnapCaveatType, Bip32Entropy, @@ -96,7 +96,7 @@ export const PermittedDerivationPathsCaveatSpecification: Record< ); if (!path) { - throw ethErrors.provider.unauthorized({ + throw providerErrors.unauthorized({ message: 'The requested path is not permitted. Allowed paths must be specified in the snap manifest.', }); diff --git a/packages/rpc-methods/src/restricted/manageState.ts b/packages/rpc-methods/src/restricted/manageState.ts index 434ee6f452..cef0111d0c 100644 --- a/packages/rpc-methods/src/restricted/manageState.ts +++ b/packages/rpc-methods/src/restricted/manageState.ts @@ -356,7 +356,7 @@ export function getValidatedParams( message: `Invalid ${method} "updateState" parameter: The new state must be a plain object.`, data: { receivedNewState: - typeof newState === 'undefined' ? 'undefined' : newState, + typeof newState === 'undefined' ? 'undefined' : (newState as Json), }, }); } @@ -368,10 +368,6 @@ export function getValidatedParams( } catch { throw rpcErrors.invalidParams({ message: `Invalid ${method} "updateState" parameter: The new state must be JSON serializable.`, - data: { - receivedNewState: - typeof newState === 'undefined' ? 'undefined' : newState, - }, }); } @@ -379,8 +375,7 @@ export function getValidatedParams( throw rpcErrors.invalidParams({ message: `Invalid ${method} "updateState" parameter: The new state must not exceed ${storageSizeLimit} bytes in size.`, data: { - receivedNewState: - typeof newState === 'undefined' ? 'undefined' : newState, + receivedNewState: newState as Json, }, }); } diff --git a/packages/snaps-controllers/src/multichain/MultiChainController.ts b/packages/snaps-controllers/src/multichain/MultiChainController.ts index 2e803d0271..5e5cc8eec4 100644 --- a/packages/snaps-controllers/src/multichain/MultiChainController.ts +++ b/packages/snaps-controllers/src/multichain/MultiChainController.ts @@ -30,7 +30,7 @@ import { Namespaces, logError, } from '@metamask/snaps-utils'; -import { hasProperty, assert } from '@metamask/utils'; +import { hasProperty, assert, Json } from '@metamask/utils'; import { nanoid } from 'nanoid'; import { @@ -393,7 +393,7 @@ export class MultiChainController extends BaseController< snapId: SnapId; origin: string; method: keyof SnapKeyring; - args?: unknown; + args?: Json; }) { return this.messagingSystem.call('SnapController:handleRequest', { snapId, diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index e87ff450c5..579fbf2294 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -2522,7 +2522,7 @@ export class SnapController extends BaseController< } else if (request.jsonrpc !== '2.0') { throw rpcErrors.invalidRequest({ message: 'Invalid "jsonrpc" property. Must be "2.0" if provided.', - data: request.jsonrpc, + data: request.jsonrpc as Json, }); } diff --git a/packages/snaps-utils/src/types.ts b/packages/snaps-utils/src/types.ts index 67769c8dc2..cd5fac2b35 100644 --- a/packages/snaps-utils/src/types.ts +++ b/packages/snaps-utils/src/types.ts @@ -142,7 +142,7 @@ export const SNAP_EXPORT_NAMES = Object.values(HandlerType); export type SnapRpcHookArgs = { origin: string; handler: HandlerType; - request: Record; + request: Record; }; // The snap is the callee From 1f63f6f59f5bf8e8bd1b9fada421f57c22dd7bcf Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Fri, 14 Apr 2023 12:27:28 +0200 Subject: [PATCH 4/4] Update LavaMoat policy --- .../lavamoat/browserify/iframe/policy.json | 61 ++++++++++------- .../browserify/node-process/policy.json | 67 +++++++++++-------- .../browserify/node-thread/policy.json | 67 +++++++++++-------- .../browserify/worker-executor/policy.json | 61 ++++++++++------- .../lavamoat/build-system/policy.json | 2 +- 5 files changed, 155 insertions(+), 103 deletions(-) diff --git a/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json index c2c92a40c6..754bf064fa 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/iframe/policy.json @@ -1,5 +1,12 @@ { "resources": { + "@metamask/json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true + } + }, "@metamask/object-multiplex": { "globals": { "console.warn": true @@ -72,17 +79,25 @@ }, "packages": { "@metamask/object-multiplex": true, + "@metamask/providers>@metamask/safe-event-emitter": true, "@metamask/providers>detect-browser": true, + "@metamask/providers>eth-rpc-errors": true, "@metamask/providers>extension-port-stream": true, "@metamask/providers>fast-deep-equal": true, "@metamask/providers>is-stream": true, + "@metamask/providers>json-rpc-engine": true, "@metamask/providers>json-rpc-middleware-stream": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "json-rpc-engine>@metamask/safe-event-emitter": true, "pump": true } }, + "@metamask/providers>@metamask/safe-event-emitter": { + "globals": { + "setTimeout": true + }, + "packages": { + "browserify>events": true + } + }, "@metamask/providers>detect-browser": { "globals": { "document": true, @@ -92,20 +107,37 @@ "process": true } }, + "@metamask/providers>eth-rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true + } + }, "@metamask/providers>extension-port-stream": { "packages": { "browserify>buffer": true, "stream-browserify": true } }, + "@metamask/providers>json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/providers>eth-rpc-errors": true + } + }, "@metamask/providers>json-rpc-middleware-stream": { "globals": { "console.warn": true, "setTimeout": true }, "packages": { - "browserify>readable-stream": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "@metamask/providers>@metamask/safe-event-emitter": true, + "browserify>readable-stream": true + } + }, + "@metamask/rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true, + "@metamask/utils": true } }, "@metamask/rpc-methods>@noble/hashes": { @@ -543,11 +575,6 @@ "process": true } }, - "eth-rpc-errors": { - "packages": { - "eth-rpc-errors>fast-safe-stringify": true - } - }, "external:../snaps-utils/src/checksum.ts": { "packages": { "@metamask/rpc-methods>@noble/hashes": true, @@ -673,20 +700,6 @@ "external:../snaps-utils/src/virtual-file/VirtualFile.ts": true } }, - "json-rpc-engine": { - "packages": { - "eth-rpc-errors": true, - "json-rpc-engine>@metamask/safe-event-emitter": true - } - }, - "json-rpc-engine>@metamask/safe-event-emitter": { - "globals": { - "setTimeout": true - }, - "packages": { - "browserify>events": true - } - }, "process": { "globals": { "clearTimeout": true, diff --git a/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json index b95eaa86ca..2df7692af0 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/node-process/policy.json @@ -1,5 +1,12 @@ { "resources": { + "@metamask/json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true + } + }, "@metamask/object-multiplex": { "globals": { "console.warn": true @@ -96,17 +103,28 @@ }, "packages": { "@metamask/object-multiplex": true, + "@metamask/providers>@metamask/safe-event-emitter": true, "@metamask/providers>detect-browser": true, + "@metamask/providers>eth-rpc-errors": true, "@metamask/providers>extension-port-stream": true, "@metamask/providers>fast-deep-equal": true, "@metamask/providers>is-stream": true, + "@metamask/providers>json-rpc-engine": true, "@metamask/providers>json-rpc-middleware-stream": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "json-rpc-engine>@metamask/safe-event-emitter": true, "pump": true } }, + "@metamask/providers>@metamask/safe-event-emitter": { + "builtin": { + "events.EventEmitter": true + }, + "globals": { + "setTimeout": true + }, + "packages": { + "events": true + } + }, "@metamask/providers>detect-browser": { "globals": { "document": true, @@ -114,6 +132,11 @@ "process": true } }, + "@metamask/providers>eth-rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true + } + }, "@metamask/providers>extension-port-stream": { "builtin": { "buffer.Buffer": true, @@ -124,14 +147,26 @@ "stream": true } }, + "@metamask/providers>json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/providers>eth-rpc-errors": true + } + }, "@metamask/providers>json-rpc-middleware-stream": { "globals": { "console.warn": true, "setTimeout": true }, "packages": { - "browserify>readable-stream": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "@metamask/providers>@metamask/safe-event-emitter": true, + "browserify>readable-stream": true + } + }, + "@metamask/rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true, + "@metamask/utils": true } }, "@metamask/rpc-methods>@noble/hashes": { @@ -304,11 +339,6 @@ "util": true } }, - "eth-rpc-errors": { - "packages": { - "eth-rpc-errors>fast-safe-stringify": true - } - }, "external:../snaps-utils/src/checksum.ts": { "packages": { "@metamask/rpc-methods>@noble/hashes": true, @@ -439,23 +469,6 @@ "process.argv": true } }, - "json-rpc-engine": { - "packages": { - "eth-rpc-errors": true, - "json-rpc-engine>@metamask/safe-event-emitter": true - } - }, - "json-rpc-engine>@metamask/safe-event-emitter": { - "builtin": { - "events.EventEmitter": true - }, - "globals": { - "setTimeout": true - }, - "packages": { - "events": true - } - }, "pump": { "builtin": { "fs": true diff --git a/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json index b95eaa86ca..2df7692af0 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/node-thread/policy.json @@ -1,5 +1,12 @@ { "resources": { + "@metamask/json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true + } + }, "@metamask/object-multiplex": { "globals": { "console.warn": true @@ -96,17 +103,28 @@ }, "packages": { "@metamask/object-multiplex": true, + "@metamask/providers>@metamask/safe-event-emitter": true, "@metamask/providers>detect-browser": true, + "@metamask/providers>eth-rpc-errors": true, "@metamask/providers>extension-port-stream": true, "@metamask/providers>fast-deep-equal": true, "@metamask/providers>is-stream": true, + "@metamask/providers>json-rpc-engine": true, "@metamask/providers>json-rpc-middleware-stream": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "json-rpc-engine>@metamask/safe-event-emitter": true, "pump": true } }, + "@metamask/providers>@metamask/safe-event-emitter": { + "builtin": { + "events.EventEmitter": true + }, + "globals": { + "setTimeout": true + }, + "packages": { + "events": true + } + }, "@metamask/providers>detect-browser": { "globals": { "document": true, @@ -114,6 +132,11 @@ "process": true } }, + "@metamask/providers>eth-rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true + } + }, "@metamask/providers>extension-port-stream": { "builtin": { "buffer.Buffer": true, @@ -124,14 +147,26 @@ "stream": true } }, + "@metamask/providers>json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/providers>eth-rpc-errors": true + } + }, "@metamask/providers>json-rpc-middleware-stream": { "globals": { "console.warn": true, "setTimeout": true }, "packages": { - "browserify>readable-stream": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "@metamask/providers>@metamask/safe-event-emitter": true, + "browserify>readable-stream": true + } + }, + "@metamask/rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true, + "@metamask/utils": true } }, "@metamask/rpc-methods>@noble/hashes": { @@ -304,11 +339,6 @@ "util": true } }, - "eth-rpc-errors": { - "packages": { - "eth-rpc-errors>fast-safe-stringify": true - } - }, "external:../snaps-utils/src/checksum.ts": { "packages": { "@metamask/rpc-methods>@noble/hashes": true, @@ -439,23 +469,6 @@ "process.argv": true } }, - "json-rpc-engine": { - "packages": { - "eth-rpc-errors": true, - "json-rpc-engine>@metamask/safe-event-emitter": true - } - }, - "json-rpc-engine>@metamask/safe-event-emitter": { - "builtin": { - "events.EventEmitter": true - }, - "globals": { - "setTimeout": true - }, - "packages": { - "events": true - } - }, "pump": { "builtin": { "fs": true diff --git a/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json b/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json index c2c92a40c6..754bf064fa 100644 --- a/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json +++ b/packages/snaps-execution-environments/lavamoat/browserify/worker-executor/policy.json @@ -1,5 +1,12 @@ { "resources": { + "@metamask/json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true + } + }, "@metamask/object-multiplex": { "globals": { "console.warn": true @@ -72,17 +79,25 @@ }, "packages": { "@metamask/object-multiplex": true, + "@metamask/providers>@metamask/safe-event-emitter": true, "@metamask/providers>detect-browser": true, + "@metamask/providers>eth-rpc-errors": true, "@metamask/providers>extension-port-stream": true, "@metamask/providers>fast-deep-equal": true, "@metamask/providers>is-stream": true, + "@metamask/providers>json-rpc-engine": true, "@metamask/providers>json-rpc-middleware-stream": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "json-rpc-engine>@metamask/safe-event-emitter": true, "pump": true } }, + "@metamask/providers>@metamask/safe-event-emitter": { + "globals": { + "setTimeout": true + }, + "packages": { + "browserify>events": true + } + }, "@metamask/providers>detect-browser": { "globals": { "document": true, @@ -92,20 +107,37 @@ "process": true } }, + "@metamask/providers>eth-rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true + } + }, "@metamask/providers>extension-port-stream": { "packages": { "browserify>buffer": true, "stream-browserify": true } }, + "@metamask/providers>json-rpc-engine": { + "packages": { + "@metamask/providers>@metamask/safe-event-emitter": true, + "@metamask/providers>eth-rpc-errors": true + } + }, "@metamask/providers>json-rpc-middleware-stream": { "globals": { "console.warn": true, "setTimeout": true }, "packages": { - "browserify>readable-stream": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "@metamask/providers>@metamask/safe-event-emitter": true, + "browserify>readable-stream": true + } + }, + "@metamask/rpc-errors": { + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true, + "@metamask/utils": true } }, "@metamask/rpc-methods>@noble/hashes": { @@ -543,11 +575,6 @@ "process": true } }, - "eth-rpc-errors": { - "packages": { - "eth-rpc-errors>fast-safe-stringify": true - } - }, "external:../snaps-utils/src/checksum.ts": { "packages": { "@metamask/rpc-methods>@noble/hashes": true, @@ -673,20 +700,6 @@ "external:../snaps-utils/src/virtual-file/VirtualFile.ts": true } }, - "json-rpc-engine": { - "packages": { - "eth-rpc-errors": true, - "json-rpc-engine>@metamask/safe-event-emitter": true - } - }, - "json-rpc-engine>@metamask/safe-event-emitter": { - "globals": { - "setTimeout": true - }, - "packages": { - "browserify>events": true - } - }, "process": { "globals": { "clearTimeout": true, diff --git a/packages/snaps-execution-environments/lavamoat/build-system/policy.json b/packages/snaps-execution-environments/lavamoat/build-system/policy.json index b4e8a45a9b..969c3c6c02 100644 --- a/packages/snaps-execution-environments/lavamoat/build-system/policy.json +++ b/packages/snaps-execution-environments/lavamoat/build-system/policy.json @@ -1665,7 +1665,7 @@ "Buffer.isBuffer": true }, "packages": { - "eth-rpc-errors>fast-safe-stringify": true + "@metamask/rpc-errors>fast-safe-stringify": true } }, "browserify>string_decoder": {