Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/examples/examples/wasm/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions packages/examples/examples/wasm/src/index.js
Original file line number Diff line number Diff line change
@@ -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:
Expand Down Expand Up @@ -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 } });
};
4 changes: 2 additions & 2 deletions packages/rpc-methods/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand All @@ -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",
Expand All @@ -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",
Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -25,12 +25,12 @@ export async function handleInstallSnaps(
installSnaps: InstallSnapsHook,
): Promise<InstallSnapsResult> {
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 },
});
Expand Down
4 changes: 2 additions & 2 deletions packages/rpc-methods/src/permitted/invokeSnapSugar.test.ts
Original file line number Diff line number Diff line change
@@ -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';

Expand Down Expand Up @@ -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.',
}),
);
Expand Down
23 changes: 11 additions & 12 deletions packages/rpc-methods/src/permitted/invokeSnapSugar.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
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<unknown>;
request: JsonRpcRequest;
};

/**
* `wallet_invokeSnap` attempts to invoke an RPC method of the specified Snap.
*/
export const invokeSnapSugarHandler: PermittedHandlerExport<
void,
JsonRpcRequest<unknown>,
JsonRpcRequest,
unknown
> = {
methodNames: ['wallet_invokeSnap'],
Expand All @@ -38,7 +37,7 @@ export const invokeSnapSugarHandler: PermittedHandlerExport<
* @throws If the params are invalid.
*/
export function invokeSnapSugar(
req: JsonRpcRequest<unknown>,
req: JsonRpcRequest,
_res: unknown,
next: JsonRpcEngineNextCallback,
end: JsonRpcEngineEndCallback,
Expand All @@ -64,21 +63,21 @@ 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.',
});
}

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.',
});
}
Expand Down
2 changes: 1 addition & 1 deletion packages/rpc-methods/src/permitted/middleware.test.ts
Original file line number Diff line number Diff line change
@@ -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';

Expand Down
9 changes: 5 additions & 4 deletions packages/rpc-methods/src/permitted/middleware.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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 { JsonRpcParams, Json } from '@metamask/utils';

import { selectHooks } from '../utils';
import { methodHandlers } from './handlers';
Expand All @@ -15,15 +16,15 @@ import { methodHandlers } from './handlers';
export function createSnapsMethodMiddleware(
isSnap: boolean,
hooks: Record<string, unknown>,
): JsonRpcMiddleware<unknown, unknown> {
): JsonRpcMiddleware<JsonRpcParams, Json> {
// 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) {
const handler =
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
Expand Down
2 changes: 1 addition & 1 deletion packages/rpc-methods/src/permitted/requestSnaps.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { JsonRpcEngine } from '@metamask/json-rpc-engine';
import {
RequestedPermissions,
PermissionConstraint,
Expand All @@ -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 {
Expand Down
4 changes: 2 additions & 2 deletions packages/rpc-methods/src/permitted/requestSnaps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
RequestedPermissions,
Caveat,
} from '@metamask/permission-controller';
import { rpcErrors } from '@metamask/rpc-errors';
import {
SnapCaveatType,
SnapsPermissionRequest,
Expand All @@ -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';
Expand Down Expand Up @@ -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.',
}),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import {
RestrictedMethodCaveatSpecificationConstraint,
Caveat,
} from '@metamask/permission-controller';
import { rpcErrors, providerErrors } 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';

Expand Down Expand Up @@ -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.',
});
}
Expand All @@ -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.',
});
Expand All @@ -71,7 +71,7 @@ export function validateBIP44Caveat(caveat: Caveat<string, any>) {
!Array.isArray(caveat.value) ||
caveat.value.length === 0
) {
throw ethErrors.rpc.invalidParams({
throw rpcErrors.invalidParams({
message: 'Expected non-empty array of coin types.',
});
}
Expand Down Expand Up @@ -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.',
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import {
PermissionConstraint,
RestrictedMethodCaveatSpecificationConstraint,
} from '@metamask/permission-controller';
import { rpcErrors, providerErrors } 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';
Expand Down Expand Up @@ -51,7 +51,7 @@ export function validateBIP32Path(
value,
Bip32EntropyStruct,
'Invalid BIP-32 entropy path definition',
ethErrors.rpc.invalidParams,
rpcErrors.invalidParams,
);
}

Expand All @@ -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,
);
}

Expand All @@ -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.',
});
Expand Down
4 changes: 2 additions & 2 deletions packages/rpc-methods/src/restricted/caveats/snapIds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -18,7 +18,7 @@ import { InvokeSnapParams } from '../invokeSnap';
*/
export function validateSnapIdsCaveat(caveat: Caveat<string, any>) {
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.',
});
Expand Down
10 changes: 5 additions & 5 deletions packages/rpc-methods/src/restricted/dialog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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(', ')}.`,
Expand All @@ -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();
}
}
Loading