UNPKG

@metamask/snaps-simulation

Version:

A simulation framework for MetaMask Snaps, enabling headless testing of Snaps in a controlled environment

106 lines 4.32 kB
"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