Skip to content

Commit

Permalink
BREAKING: Remove wallet_enable and wallet_installSnaps in favor o…
Browse files Browse the repository at this point in the history
…f `wallet_requestSnaps` (#909)

* Remove wallet_enable in favor of wallet_installSnaps

* Rename to wallet_requestSnaps

* Fix build

* Fix typing issues
  • Loading branch information
FrederikBolding committed Nov 9, 2022
1 parent 2407423 commit 47e738f
Show file tree
Hide file tree
Showing 9 changed files with 310 additions and 361 deletions.
8 changes: 4 additions & 4 deletions packages/rpc-methods/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ module.exports = deepmerge(baseConfig, {
coveragePathIgnorePatterns: ['./src/index.ts'],
coverageThreshold: {
global: {
branches: 89.47,
functions: 73.33,
lines: 47.42,
statements: 47.42,
branches: 85.82,
functions: 80,
lines: 60.24,
statements: 60.24,
},
},
testTimeout: 2500,
Expand Down
1 change: 1 addition & 0 deletions packages/rpc-methods/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"eslint-plugin-prettier": "^3.4.0",
"jest": "^29.0.2",
"jest-it-up": "^2.0.0",
"json-rpc-engine": "^6.1.0",
"prettier": "^2.3.2",
"prettier-plugin-packagejson": "^2.2.11",
"rimraf": "^3.0.2",
Expand Down
63 changes: 1 addition & 62 deletions packages/rpc-methods/src/permitted/common/snapInstallation.ts
Original file line number Diff line number Diff line change
@@ -1,75 +1,14 @@
import { ethErrors } from 'eth-rpc-errors';
import { RequestedPermissions } from '@metamask/controllers';
import { isObject } from '@metamask/utils';
import { InstallSnapsResult, SNAP_PREFIX } from '@metamask/snap-utils';
import { InstallSnapsResult } from '@metamask/snap-utils';

export { InstallSnapsResult } from '@metamask/snap-utils';

export type InstallSnapsHook = (
requestedSnaps: RequestedPermissions,
) => Promise<InstallSnapsResult>;

/**
* Preprocesses requested permissions to support `wallet_snap` syntactic sugar. This is done by
* replacing instances of `wallet_snap` with `wallet_snap_${snapId}`.
*
* @param requestedPermissions - The existing permissions object.
* @returns The modified permissions request.
*/
export function preprocessRequestedPermissions(
requestedPermissions: RequestedPermissions,
): RequestedPermissions {
if (!isObject(requestedPermissions)) {
throw ethErrors.rpc.invalidRequest({ data: { requestedPermissions } });
}

// passthrough if 'wallet_snap' is not requested
if (!requestedPermissions.wallet_snap) {
return requestedPermissions;
}

// rewrite permissions request parameter by destructuring snaps into
// proper permissions prefixed with 'wallet_snap_'
return Object.keys(requestedPermissions).reduce(
(newRequestedPermissions, permName) => {
if (permName === 'wallet_snap') {
if (!isObject(requestedPermissions[permName])) {
throw ethErrors.rpc.invalidParams({
message: `Invalid params to 'wallet_requestPermissions'`,
data: { requestedPermissions },
});
}

const requestedSnaps = requestedPermissions[
permName
] as RequestedPermissions;

// destructure 'wallet_snap' object
Object.keys(requestedSnaps).forEach((snapId) => {
const snapKey = SNAP_PREFIX + snapId;

// disallow requesting a snap X under 'wallet_snaps' and
// directly as 'wallet_snap_X'
if (requestedPermissions[snapKey]) {
throw ethErrors.rpc.invalidParams({
message: `Snap '${snapId}' requested both as direct permission and under 'wallet_snap'. We recommend using 'wallet_snap' only.`,
data: { requestedPermissions },
});
}

newRequestedPermissions[snapKey] = requestedSnaps[snapId];
});
} else {
// otherwise, leave things as we found them
newRequestedPermissions[permName] = requestedPermissions[permName];
}

return newRequestedPermissions;
},
{} as RequestedPermissions,
);
}

/**
* Typechecks the requested snaps and passes them to the permissions
* controller for installation.
Expand Down
216 changes: 0 additions & 216 deletions packages/rpc-methods/src/permitted/enable.ts

This file was deleted.

11 changes: 4 additions & 7 deletions packages/rpc-methods/src/permitted/index.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
import { enableWalletHandler, EnableWalletHooks } from './enable';
import { getAppKeyHandler, GetAppKeyHooks } from './getAppKey';
import { getSnapsHandler, GetSnapsHooks } from './getSnaps';
import { installSnapsHandler, InstallSnapsHooks } from './installSnaps';
import { requestSnapsHandler, RequestSnapsHooks } from './requestSnaps';
import { invokeSnapSugarHandler } from './invokeSnapSugar';

export type PermittedRpcMethodHooks = EnableWalletHooks &
GetAppKeyHooks &
export type PermittedRpcMethodHooks = GetAppKeyHooks &
GetSnapsHooks &
InstallSnapsHooks;
RequestSnapsHooks;

export const handlers = [
enableWalletHandler,
getAppKeyHandler,
getSnapsHandler,
installSnapsHandler,
requestSnapsHandler,
invokeSnapSugarHandler,
];

0 comments on commit 47e738f

Please sign in to comment.