@metamask/snaps-simulation
Version:
A simulation framework for MetaMask Snaps, enabling headless testing of Snaps in a controlled environment
106 lines • 4.32 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerSnap = exports.getControllers = void 0;
const permission_controller_1 = require("@metamask/permission-controller");
const snaps_controllers_1 = require("@metamask/snaps-controllers");
const snaps_rpc_methods_1 = require("@metamask/snaps-rpc-methods");
const utils_1 = require("@metamask/utils");
const methods_1 = require("./methods/index.cjs");
const constants_1 = require("./methods/constants.cjs");
/**
* Get the controllers for the Snap.
*
* @param options - The options.
* @returns The controllers for the Snap.
*/
function getControllers(options) {
const { controllerMessenger } = options;
const subjectMetadataController = new permission_controller_1.SubjectMetadataController({
messenger: controllerMessenger.getRestricted({
name: 'SubjectMetadataController',
allowedActions: [],
allowedEvents: [],
}),
subjectCacheLimit: 100,
});
const interfaceController = new snaps_controllers_1.SnapInterfaceController({
messenger: controllerMessenger.getRestricted({
name: 'SnapInterfaceController',
allowedActions: [
'PhishingController:testOrigin',
'ApprovalController:hasRequest',
'ApprovalController:acceptRequest',
'AccountsController:getAccountByAddress',
'AccountsController:getSelectedMultichainAccount',
'AccountsController:listMultichainAccounts',
'MultichainAssetsController:getState',
],
allowedEvents: [
'NotificationServicesController:notificationsListUpdated',
],
}),
});
const permissionController = getPermissionController(options);
return {
permissionController,
subjectMetadataController,
interfaceController,
};
}
exports.getControllers = getControllers;
/**
* Get the permission controller for the Snap.
*
* @param options - The options.
* @param options.controllerMessenger - The controller messenger.
* @param options.options - Miscellaneous options.
* @returns The permission controller for the Snap.
*/
function getPermissionController(options) {
const { controllerMessenger } = options;
const permissionSpecifications = (0, methods_1.getPermissionSpecifications)(options);
return new permission_controller_1.PermissionController({
messenger: controllerMessenger.getRestricted({
name: 'PermissionController',
allowedActions: [
`ApprovalController:addRequest`,
`ApprovalController:hasRequest`,
`ApprovalController:acceptRequest`,
`ApprovalController:rejectRequest`,
`SnapController:getPermitted`,
`SnapController:install`,
`SubjectMetadataController:getSubjectMetadata`,
],
allowedEvents: [],
}),
caveatSpecifications: {
...snaps_rpc_methods_1.caveatSpecifications,
...snaps_rpc_methods_1.endowmentCaveatSpecifications,
},
permissionSpecifications,
unrestrictedMethods: constants_1.UNRESTRICTED_METHODS,
});
}
/**
* Register the Snap. This sets up the Snap's permissions and subject metadata.
*
* @param snapId - The ID of the Snap to install.
* @param manifest - The parsed manifest.
* @param controllers - The controllers for the Snap.
* @param controllers.permissionController - The permission controller.
* @param controllers.subjectMetadataController - The subject metadata controller.
*/
async function registerSnap(snapId, manifest, { permissionController, subjectMetadataController, }) {
subjectMetadataController.addSubjectMetadata({
origin: snapId,
subjectType: permission_controller_1.SubjectType.Snap,
});
const approvedPermissions = (0, snaps_rpc_methods_1.processSnapPermissions)((0, utils_1.getSafeJson)(manifest.initialPermissions));
permissionController.grantPermissions({
approvedPermissions,
subject: { origin: snapId },
preserveExistingPermissions: false,
});
}
exports.registerSnap = registerSnap;
//# sourceMappingURL=controllers.cjs.map