UNPKG

@metamask/snaps-simulation

Version:

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

109 lines 4.31 kB
import { Messenger } from "@metamask/messenger"; import { PermissionController, SubjectMetadataController, SubjectType } from "@metamask/permission-controller"; import { SnapInterfaceController } from "@metamask/snaps-controllers"; import { caveatSpecifications as snapsCaveatsSpecifications, endowmentCaveatSpecifications as snapsEndowmentCaveatSpecifications, processSnapPermissions } from "@metamask/snaps-rpc-methods"; import { getSafeJson } from "@metamask/utils"; import { getPermissionSpecifications } from "./methods/index.mjs"; import { UNRESTRICTED_METHODS } from "./methods/constants.mjs"; /** * Get the controllers for the Snap. * * @param options - The options. * @returns The controllers for the Snap. */ export function getControllers(options) { const { controllerMessenger } = options; const subjectMetadataController = new SubjectMetadataController({ messenger: new Messenger({ namespace: 'SubjectMetadataController', parent: controllerMessenger, }), subjectCacheLimit: 100, }); const interfaceControllerMessenger = new Messenger({ namespace: 'SnapInterfaceController', parent: controllerMessenger, }); controllerMessenger.delegate({ messenger: interfaceControllerMessenger, actions: [ 'PhishingController:testOrigin', 'ApprovalController:hasRequest', 'ApprovalController:acceptRequest', 'AccountsController:getAccountByAddress', 'AccountsController:getSelectedMultichainAccount', 'AccountsController:listMultichainAccounts', 'MultichainAssetsController:getState', 'PermissionController:hasPermission', ], events: ['NotificationServicesController:notificationsListUpdated'], }); const interfaceController = new SnapInterfaceController({ messenger: interfaceControllerMessenger, }); const permissionController = getPermissionController(options); return { permissionController, subjectMetadataController, interfaceController, }; } /** * 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 = getPermissionSpecifications(options); const messenger = new Messenger({ namespace: 'PermissionController', parent: controllerMessenger, }); controllerMessenger.delegate({ messenger, actions: [ `ApprovalController:addRequest`, `ApprovalController:hasRequest`, `ApprovalController:acceptRequest`, `ApprovalController:rejectRequest`, `SnapController:getPermitted`, `SnapController:install`, `SubjectMetadataController:getSubjectMetadata`, ], }); return new PermissionController({ messenger, caveatSpecifications: { ...snapsCaveatsSpecifications, ...snapsEndowmentCaveatSpecifications, }, permissionSpecifications, unrestrictedMethods: 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. */ export async function registerSnap(snapId, manifest, { permissionController, subjectMetadataController, }) { subjectMetadataController.addSubjectMetadata({ origin: snapId, subjectType: SubjectType.Snap, }); const approvedPermissions = processSnapPermissions(getSafeJson(manifest.initialPermissions)); permissionController.grantPermissions({ approvedPermissions, subject: { origin: snapId }, preserveExistingPermissions: false, }); } //# sourceMappingURL=controllers.mjs.map