@metamask/snaps-controllers 14.2.2 → 15.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/dist/cronjob/CronjobController.cjs +6 -1
  3. package/dist/cronjob/CronjobController.cjs.map +1 -1
  4. package/dist/cronjob/CronjobController.d.cts.map +1 -1
  5. package/dist/cronjob/CronjobController.d.mts.map +1 -1
  6. package/dist/cronjob/CronjobController.mjs +6 -1
  7. package/dist/cronjob/CronjobController.mjs.map +1 -1
  8. package/dist/insights/SnapInsightsController.cjs +6 -1
  9. package/dist/insights/SnapInsightsController.cjs.map +1 -1
  10. package/dist/insights/SnapInsightsController.d.cts.map +1 -1
  11. package/dist/insights/SnapInsightsController.d.mts.map +1 -1
  12. package/dist/insights/SnapInsightsController.mjs +6 -1
  13. package/dist/insights/SnapInsightsController.mjs.map +1 -1
  14. package/dist/interface/SnapInterfaceController.cjs +7 -5
  15. package/dist/interface/SnapInterfaceController.cjs.map +1 -1
  16. package/dist/interface/SnapInterfaceController.d.cts +2 -2
  17. package/dist/interface/SnapInterfaceController.d.cts.map +1 -1
  18. package/dist/interface/SnapInterfaceController.d.mts +2 -2
  19. package/dist/interface/SnapInterfaceController.d.mts.map +1 -1
  20. package/dist/interface/SnapInterfaceController.mjs +7 -5
  21. package/dist/interface/SnapInterfaceController.mjs.map +1 -1
  22. package/dist/services/AbstractExecutionService.cjs +22 -8
  23. package/dist/services/AbstractExecutionService.cjs.map +1 -1
  24. package/dist/services/AbstractExecutionService.d.cts.map +1 -1
  25. package/dist/services/AbstractExecutionService.d.mts.map +1 -1
  26. package/dist/services/AbstractExecutionService.mjs +24 -10
  27. package/dist/services/AbstractExecutionService.mjs.map +1 -1
  28. package/dist/snaps/SnapController.cjs +133 -75
  29. package/dist/snaps/SnapController.cjs.map +1 -1
  30. package/dist/snaps/SnapController.d.cts +13 -50
  31. package/dist/snaps/SnapController.d.cts.map +1 -1
  32. package/dist/snaps/SnapController.d.mts +13 -50
  33. package/dist/snaps/SnapController.d.mts.map +1 -1
  34. package/dist/snaps/SnapController.mjs +135 -77
  35. package/dist/snaps/SnapController.mjs.map +1 -1
  36. package/dist/snaps/Timer.cjs +5 -5
  37. package/dist/snaps/Timer.cjs.map +1 -1
  38. package/dist/snaps/Timer.d.cts.map +1 -1
  39. package/dist/snaps/Timer.d.mts.map +1 -1
  40. package/dist/snaps/Timer.mjs +5 -5
  41. package/dist/snaps/Timer.mjs.map +1 -1
  42. package/dist/snaps/registry/json.cjs +18 -3
  43. package/dist/snaps/registry/json.cjs.map +1 -1
  44. package/dist/snaps/registry/json.d.cts.map +1 -1
  45. package/dist/snaps/registry/json.d.mts.map +1 -1
  46. package/dist/snaps/registry/json.mjs +18 -3
  47. package/dist/snaps/registry/json.mjs.map +1 -1
  48. package/package.json +11 -9
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SnapController = exports.SNAP_APPROVAL_RESULT = exports.SNAP_APPROVAL_UPDATE = exports.SNAP_APPROVAL_INSTALL = exports.controllerName = void 0;
4
+ const approval_controller_1 = require("@metamask/approval-controller");
4
5
  const base_controller_1 = require("@metamask/base-controller");
5
6
  const permission_controller_1 = require("@metamask/permission-controller");
6
7
  const rpc_errors_1 = require("@metamask/rpc-errors");
@@ -87,14 +88,28 @@ class SnapController extends base_controller_1.BaseController {
87
88
  messenger,
88
89
  metadata: {
89
90
  snapStates: {
91
+ includeInStateLogs: false,
90
92
  persist: true,
91
93
  anonymous: false,
94
+ usedInUi: false,
92
95
  },
93
96
  unencryptedSnapStates: {
97
+ includeInStateLogs: false,
94
98
  persist: true,
95
99
  anonymous: false,
100
+ usedInUi: false,
96
101
  },
97
102
  snaps: {
103
+ includeInStateLogs: (snaps) => {
104
+ // Delete larger snap properties
105
+ return Object.values(snaps).reduce((acc, snap) => {
106
+ const snapCopy = { ...snap };
107
+ delete snapCopy.sourceCode;
108
+ delete snapCopy.auxiliaryFiles;
109
+ acc[snap.id] = snapCopy;
110
+ return acc;
111
+ }, {});
112
+ },
98
113
  persist: (snaps) => {
99
114
  return (Object.values(snaps)
100
115
  // We should not persist snaps that are in the installing state,
@@ -113,6 +128,9 @@ class SnapController extends base_controller_1.BaseController {
113
128
  }, {}));
114
129
  },
115
130
  anonymous: false,
131
+ // TODO: Ensure larger snap properties are not sent to the UI
132
+ // Currently these are stripped out manually in the extension
133
+ usedInUi: true,
116
134
  },
117
135
  },
118
136
  name: exports.controllerName,
@@ -255,7 +273,7 @@ class SnapController extends base_controller_1.BaseController {
255
273
  this.messagingSystem.registerActionHandler(`${exports.controllerName}:getSnapState`, async (...args) => this.getSnapState(...args));
256
274
  this.messagingSystem.registerActionHandler(`${exports.controllerName}:handleRequest`, async (...args) => this.handleRequest(...args));
257
275
  this.messagingSystem.registerActionHandler(`${exports.controllerName}:has`, (...args) => this.has(...args));
258
- this.messagingSystem.registerActionHandler(`${exports.controllerName}:updateBlockedSnaps`, async () => this.updateBlockedSnaps());
276
+ this.messagingSystem.registerActionHandler(`${exports.controllerName}:updateRegistry`, async () => this.updateRegistry());
259
277
  this.messagingSystem.registerActionHandler(`${exports.controllerName}:updateSnapState`, async (...args) => this.updateSnapState(...args));
260
278
  this.messagingSystem.registerActionHandler(`${exports.controllerName}:enable`, (...args) => this.enableSnap(...args));
261
279
  this.messagingSystem.registerActionHandler(`${exports.controllerName}:disable`, async (...args) => this.disableSnap(...args));
@@ -361,8 +379,10 @@ class SnapController extends base_controller_1.BaseController {
361
379
  * Checks all installed snaps against the block list and
362
380
  * blocks/unblocks snaps as appropriate. See {@link SnapController.blockSnap}
363
381
  * for more information.
382
+ *
383
+ * Also updates any preinstalled Snaps to the latest allowlisted version.
364
384
  */
365
- async updateBlockedSnaps() {
385
+ async updateRegistry() {
366
386
  this.#assertCanUsePlatform();
367
387
  await this.messagingSystem.call('SnapsRegistry:update');
368
388
  const blockedSnaps = await this.messagingSystem.call('SnapsRegistry:get', Object.values(this.state.snaps).reduce((blockListArg, snap) => {
@@ -378,6 +398,30 @@ class SnapController extends base_controller_1.BaseController {
378
398
  }
379
399
  return this.#unblockSnap(snapId);
380
400
  }));
401
+ if (!this.#featureFlags.autoUpdatePreinstalledSnaps) {
402
+ return;
403
+ }
404
+ const preinstalledVersionRange = '*';
405
+ await Promise.allSettled(Object.values(this.state.snaps)
406
+ .filter((snap) => snap.preinstalled)
407
+ .map(async (snap) => {
408
+ const resolvedVersion = await this.#resolveAllowlistVersion(snap.id, preinstalledVersionRange);
409
+ if (resolvedVersion !== preinstalledVersionRange &&
410
+ (0, utils_1.gtVersion)(resolvedVersion, snap.version)) {
411
+ const location = this.#detectSnapLocation(snap.id, {
412
+ versionRange: resolvedVersion,
413
+ fetch: this.#fetchFunction,
414
+ allowLocal: false,
415
+ });
416
+ await this.#updateSnap({
417
+ origin: approval_controller_1.ORIGIN_METAMASK,
418
+ snapId: snap.id,
419
+ location,
420
+ versionRange: resolvedVersion,
421
+ automaticUpdate: true,
422
+ });
423
+ }
424
+ }));
381
425
  }
382
426
  /**
383
427
  * Blocks an installed snap and prevents it from being started again. Emits
@@ -669,7 +713,7 @@ class SnapController extends base_controller_1.BaseController {
669
713
  */
670
714
  getExpect(snapId) {
671
715
  const snap = this.get(snapId);
672
- (0, utils_1.assert)(snap !== undefined, new Error(`Snap "${snapId}" not found.`));
716
+ (0, utils_1.assert)(snap !== undefined, `Snap "${snapId}" not found.`);
673
717
  return snap;
674
718
  }
675
719
  /**
@@ -1219,7 +1263,7 @@ class SnapController extends base_controller_1.BaseController {
1219
1263
  else if (!isUpdate) {
1220
1264
  pendingInstalls.push(snapId);
1221
1265
  }
1222
- result[snapId] = await this.processRequestedSnap(origin, snapId, location, version);
1266
+ result[snapId] = await this.#processRequestedSnap(origin, snapId, location, version);
1223
1267
  }
1224
1268
  // Once we finish all installs / updates, emit events.
1225
1269
  pendingInstalls.forEach((snapId) => this.messagingSystem.publish(`SnapController:snapInstalled`, this.getTruncatedExpect(snapId), origin, false));
@@ -1248,23 +1292,19 @@ class SnapController extends base_controller_1.BaseController {
1248
1292
  * @param versionRange - The semver range of the snap to install.
1249
1293
  * @returns The resulting snap object, or an error if something went wrong.
1250
1294
  */
1251
- // TODO: Either fix this lint violation or explain why it's necessary to
1252
- // ignore.
1253
- // eslint-disable-next-line no-restricted-syntax
1254
- async processRequestedSnap(origin, snapId, location, versionRange) {
1295
+ async #processRequestedSnap(origin, snapId, location, versionRange) {
1255
1296
  const existingSnap = this.getTruncated(snapId);
1256
1297
  // For devX we always re-install local snaps.
1257
1298
  if (existingSnap && !location.shouldAlwaysReload) {
1258
1299
  if ((0, utils_1.satisfiesVersionRange)(existingSnap.version, versionRange)) {
1259
1300
  return existingSnap;
1260
1301
  }
1261
- return await this.updateSnap(origin, snapId, location, versionRange,
1262
- // Since we are requesting an update from within processRequestedSnap,
1263
- // we disable the emitting of the snapUpdated event and rely on the caller
1264
- // to publish this event after the update is complete.
1265
- // This is necessary as installSnaps may be installing multiple snaps
1266
- // and we don't want to emit events prematurely.
1267
- false);
1302
+ return await this.#updateSnap({
1303
+ origin,
1304
+ snapId,
1305
+ location,
1306
+ versionRange,
1307
+ });
1268
1308
  }
1269
1309
  this.#assertCanInstallSnaps();
1270
1310
  let pendingApproval = this.#createApproval({
@@ -1288,7 +1328,7 @@ class SnapController extends base_controller_1.BaseController {
1288
1328
  location,
1289
1329
  versionRange,
1290
1330
  });
1291
- await this.authorize(snapId, pendingApproval);
1331
+ await this.#authorize(snapId, pendingApproval);
1292
1332
  pendingApproval = this.#createApproval({
1293
1333
  origin,
1294
1334
  snapId,
@@ -1357,28 +1397,30 @@ class SnapController extends base_controller_1.BaseController {
1357
1397
  * If the original version of the snap was blocked and the update succeeded,
1358
1398
  * the snap will be unblocked and enabled before it is restarted.
1359
1399
  *
1360
- * @param origin - The origin requesting the snap update.
1361
- * @param snapId - The id of the Snap to be updated.
1362
- * @param location - The location implementation of the snap.
1363
- * @param newVersionRange - A semver version range in which the maximum version will be chosen.
1364
- * @param emitEvent - An optional boolean flag to indicate whether this update should emit an event.
1400
+ * @param options - An options bag.
1401
+ * @param options.origin - The origin requesting the snap update.
1402
+ * @param options.snapId - The id of the Snap to be updated.
1403
+ * @param options.location - The location implementation of the snap.
1404
+ * @param options.versionRange - A semver version range in which the maximum version will be chosen.
1405
+ * @param options.automaticUpdate - An optional boolean flag to indicate whether this update should be done
1406
+ * automatically.
1365
1407
  * @returns The snap metadata if updated, `null` otherwise.
1366
1408
  */
1367
- async updateSnap(origin, snapId, location, newVersionRange = snaps_utils_1.DEFAULT_REQUESTED_SNAP_VERSION, emitEvent = true) {
1409
+ async #updateSnap({ origin, snapId, location, versionRange, automaticUpdate = false, }) {
1368
1410
  this.#assertCanInstallSnaps();
1369
1411
  this.#assertCanUsePlatform();
1370
1412
  const snap = this.getExpect(snapId);
1371
- if (snap.preinstalled) {
1413
+ const { preinstalled, removable, hidden, hideSnapBranding } = snap;
1414
+ if (preinstalled && !automaticUpdate) {
1372
1415
  throw new Error('Preinstalled Snaps cannot be manually updated.');
1373
1416
  }
1374
- if (!(0, utils_1.isValidSemVerRange)(newVersionRange)) {
1375
- throw new Error(`Received invalid snap version range: "${newVersionRange}".`);
1376
- }
1377
- let pendingApproval = this.#createApproval({
1378
- origin,
1379
- snapId,
1380
- type: exports.SNAP_APPROVAL_UPDATE,
1381
- });
1417
+ let pendingApproval = automaticUpdate
1418
+ ? null
1419
+ : this.#createApproval({
1420
+ origin,
1421
+ snapId,
1422
+ type: exports.SNAP_APPROVAL_UPDATE,
1423
+ });
1382
1424
  try {
1383
1425
  this.messagingSystem.publish('SnapController:snapInstallStarted', snapId, origin, true);
1384
1426
  const oldManifest = snap.manifest;
@@ -1387,10 +1429,10 @@ class SnapController extends base_controller_1.BaseController {
1387
1429
  const manifest = manifestFile.result;
1388
1430
  const newVersion = manifest.version;
1389
1431
  if (!(0, utils_1.gtVersion)(newVersion, snap.version)) {
1390
- throw rpc_errors_1.rpcErrors.invalidParams(`Snap "${snapId}@${snap.version}" is already installed. Couldn't update to a version inside requested "${newVersionRange}" range.`);
1432
+ throw rpc_errors_1.rpcErrors.invalidParams(`Snap "${snapId}@${snap.version}" is already installed. Couldn't update to a version inside requested "${versionRange}" range.`);
1391
1433
  }
1392
- if (!(0, utils_1.satisfiesVersionRange)(newVersion, newVersionRange)) {
1393
- throw new Error(`Version mismatch. Manifest for "${snapId}" specifies version "${newVersion}" which doesn't satisfy requested version range "${newVersionRange}".`);
1434
+ if (!(0, utils_1.satisfiesVersionRange)(newVersion, versionRange)) {
1435
+ throw new Error(`Version mismatch. Manifest for "${snapId}" specifies version "${newVersion}" which doesn't satisfy requested version range "${versionRange}".`);
1394
1436
  }
1395
1437
  await this.#assertIsInstallAllowed(snapId, {
1396
1438
  version: newVersion,
@@ -1402,23 +1444,33 @@ class SnapController extends base_controller_1.BaseController {
1402
1444
  this.#validateSnapPermissions(processedPermissions);
1403
1445
  const { newPermissions, unusedPermissions, approvedPermissions } = this.#calculatePermissionsChange(snapId, processedPermissions);
1404
1446
  const { newConnections, unusedConnections, approvedConnections } = this.#calculateConnectionsChange(snapId, oldManifest.initialConnections ?? {}, manifest.initialConnections ?? {});
1405
- this.#updateApproval(pendingApproval.id, {
1406
- permissions: newPermissions,
1407
- newVersion: manifest.version,
1408
- newPermissions,
1409
- approvedPermissions,
1410
- unusedPermissions,
1411
- newConnections,
1412
- unusedConnections,
1413
- approvedConnections,
1414
- loading: false,
1415
- });
1416
- const { permissions: approvedNewPermissions, ...requestData } = (await pendingApproval.promise);
1417
- pendingApproval = this.#createApproval({
1418
- origin,
1419
- snapId,
1420
- type: exports.SNAP_APPROVAL_RESULT,
1421
- });
1447
+ let approvedNewPermissions;
1448
+ let requestData;
1449
+ if (pendingApproval) {
1450
+ this.#updateApproval(pendingApproval.id, {
1451
+ permissions: newPermissions,
1452
+ newVersion: manifest.version,
1453
+ newPermissions,
1454
+ approvedPermissions,
1455
+ unusedPermissions,
1456
+ newConnections,
1457
+ unusedConnections,
1458
+ approvedConnections,
1459
+ loading: false,
1460
+ });
1461
+ const { permissions, ...rest } = (await pendingApproval.promise);
1462
+ approvedNewPermissions = permissions;
1463
+ requestData = rest;
1464
+ pendingApproval = this.#createApproval({
1465
+ origin,
1466
+ snapId,
1467
+ type: exports.SNAP_APPROVAL_RESULT,
1468
+ });
1469
+ }
1470
+ else {
1471
+ (0, utils_1.assert)(automaticUpdate);
1472
+ approvedNewPermissions = newPermissions;
1473
+ }
1422
1474
  if (this.isRunning(snapId)) {
1423
1475
  await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
1424
1476
  }
@@ -1427,6 +1479,10 @@ class SnapController extends base_controller_1.BaseController {
1427
1479
  origin,
1428
1480
  id: snapId,
1429
1481
  files: newSnap,
1482
+ removable,
1483
+ preinstalled,
1484
+ hidden,
1485
+ hideSnapBranding,
1430
1486
  isUpdate: true,
1431
1487
  });
1432
1488
  this.#updatePermissions({
@@ -1435,14 +1491,17 @@ class SnapController extends base_controller_1.BaseController {
1435
1491
  newPermissions: approvedNewPermissions,
1436
1492
  requestData,
1437
1493
  });
1438
- if (manifest.initialConnections) {
1439
- this.#handleInitialConnections(snapId, oldManifest.initialConnections ?? null, manifest.initialConnections);
1440
- }
1494
+ const previousInitialConnections = oldManifest.initialConnections ?? null;
1495
+ const newInitialConnections = manifest.initialConnections ?? {};
1496
+ this.#handleInitialConnections(snapId, previousInitialConnections, newInitialConnections);
1441
1497
  const rollbackSnapshot = this.#getRollbackSnapshot(snapId);
1442
1498
  if (rollbackSnapshot !== undefined) {
1443
1499
  rollbackSnapshot.permissions.revoked = unusedPermissions;
1444
1500
  rollbackSnapshot.permissions.granted = approvedNewPermissions;
1445
1501
  rollbackSnapshot.permissions.requestData = requestData;
1502
+ rollbackSnapshot.previousInitialConnections =
1503
+ previousInitialConnections;
1504
+ rollbackSnapshot.newInitialConnections = newInitialConnections;
1446
1505
  }
1447
1506
  const sourceCode = sourceCodeFile.toString();
1448
1507
  (0, utils_1.assert)(typeof sourceCode === 'string' && sourceCode.length > 0, `Invalid source code for snap "${snapId}".`);
@@ -1453,23 +1512,24 @@ class SnapController extends base_controller_1.BaseController {
1453
1512
  throw new Error(`Snap ${snapId} crashed with updated source code.`);
1454
1513
  }
1455
1514
  const truncatedSnap = this.getTruncatedExpect(snapId);
1456
- if (emitEvent) {
1457
- this.messagingSystem.publish('SnapController:snapUpdated', truncatedSnap, snap.version, origin, false);
1515
+ if (pendingApproval) {
1516
+ this.#updateApproval(pendingApproval.id, {
1517
+ loading: false,
1518
+ type: exports.SNAP_APPROVAL_UPDATE,
1519
+ });
1458
1520
  }
1459
- this.#updateApproval(pendingApproval.id, {
1460
- loading: false,
1461
- type: exports.SNAP_APPROVAL_UPDATE,
1462
- });
1463
1521
  return truncatedSnap;
1464
1522
  }
1465
1523
  catch (error) {
1466
1524
  (0, snaps_utils_1.logError)(`Error when updating ${snapId},`, error);
1467
1525
  const errorString = error instanceof Error ? error.message : error.toString();
1468
- this.#updateApproval(pendingApproval.id, {
1469
- loading: false,
1470
- error: errorString,
1471
- type: exports.SNAP_APPROVAL_UPDATE,
1472
- });
1526
+ if (pendingApproval) {
1527
+ this.#updateApproval(pendingApproval.id, {
1528
+ loading: false,
1529
+ error: errorString,
1530
+ type: exports.SNAP_APPROVAL_UPDATE,
1531
+ });
1532
+ }
1473
1533
  this.messagingSystem.publish('SnapController:snapInstallFailed', snapId, origin, true, errorString);
1474
1534
  throw error;
1475
1535
  }
@@ -1715,14 +1775,11 @@ class SnapController extends base_controller_1.BaseController {
1715
1775
  * Initiates a request for the given snap's initial permissions.
1716
1776
  * Must be called in order. See processRequestedSnap.
1717
1777
  *
1718
- * This function is not hash private yet because of tests.
1719
- *
1720
1778
  * @param snapId - The id of the Snap.
1721
1779
  * @param pendingApproval - Pending approval to update.
1722
1780
  * @returns The snap's approvedPermissions.
1723
1781
  */
1724
- // eslint-disable-next-line no-restricted-syntax
1725
- async authorize(snapId, pendingApproval) {
1782
+ async #authorize(snapId, pendingApproval) {
1726
1783
  (0, logging_1.log)(`Authorizing snap: ${snapId}`);
1727
1784
  const snapsState = this.state.snaps;
1728
1785
  const snap = snapsState[snapId];
@@ -2144,14 +2201,14 @@ class SnapController extends base_controller_1.BaseController {
2144
2201
  * @returns A `RollbackSnapshot`.
2145
2202
  */
2146
2203
  #createRollbackSnapshot(snapId) {
2147
- (0, utils_1.assert)(this.#rollbackSnapshots.get(snapId) === undefined, new Error(`Snap "${snapId}" rollback snapshot already exists.`));
2204
+ (0, utils_1.assert)(this.#rollbackSnapshots.get(snapId) === undefined, `Snap "${snapId}" rollback snapshot already exists.`);
2148
2205
  this.#rollbackSnapshots.set(snapId, {
2149
2206
  statePatches: [],
2150
2207
  permissions: {},
2151
2208
  newVersion: '',
2152
2209
  });
2153
2210
  const newRollbackSnapshot = this.#rollbackSnapshots.get(snapId);
2154
- (0, utils_1.assert)(newRollbackSnapshot !== undefined, new Error(`Snapshot creation failed for ${snapId}.`));
2211
+ (0, utils_1.assert)(newRollbackSnapshot !== undefined, `Snapshot creation failed for ${snapId}.`);
2155
2212
  return newRollbackSnapshot;
2156
2213
  }
2157
2214
  /**
@@ -2175,7 +2232,7 @@ class SnapController extends base_controller_1.BaseController {
2175
2232
  if (this.get(snapId)?.status !== snaps_utils_1.SnapStatus.Stopped) {
2176
2233
  this.#transition(snapId, snaps_utils_1.SnapStatusEvents.Stop);
2177
2234
  }
2178
- const { statePatches, permissions } = rollbackSnapshot;
2235
+ const { statePatches, permissions, previousInitialConnections, newInitialConnections, } = rollbackSnapshot;
2179
2236
  if (statePatches?.length) {
2180
2237
  this.applyPatches(statePatches);
2181
2238
  }
@@ -2192,6 +2249,8 @@ class SnapController extends base_controller_1.BaseController {
2192
2249
  newPermissions: permissions.revoked,
2193
2250
  requestData: permissions.requestData,
2194
2251
  });
2252
+ // Calling this in reverse order to undo the changes
2253
+ this.#handleInitialConnections(snapId, newInitialConnections ?? null, previousInitialConnections ?? {});
2195
2254
  const truncatedSnap = this.getTruncatedExpect(snapId);
2196
2255
  this.messagingSystem.publish('SnapController:snapRolledback', truncatedSnap, rollbackSnapshot.newVersion);
2197
2256
  this.#rollbackSnapshots.delete(snapId);
@@ -2212,7 +2271,7 @@ class SnapController extends base_controller_1.BaseController {
2212
2271
  }
2213
2272
  #getRuntimeExpect(snapId) {
2214
2273
  const runtime = this.#getRuntime(snapId);
2215
- (0, utils_1.assert)(runtime !== undefined, new Error(`Snap "${snapId}" runtime data not found`));
2274
+ (0, utils_1.assert)(runtime !== undefined, `Snap "${snapId}" runtime data not found`);
2216
2275
  return runtime;
2217
2276
  }
2218
2277
  #setupRuntime(snapId) {
@@ -2283,8 +2342,7 @@ class SnapController extends base_controller_1.BaseController {
2283
2342
  * @returns The permissions to grant to the Snap.
2284
2343
  */
2285
2344
  #getPermissionsToGrant(snapId, newPermissions) {
2286
- if (this.#featureFlags.useCaip25Permission &&
2287
- Object.keys(newPermissions).includes(snaps_rpc_methods_1.SnapEndowments.EthereumProvider)) {
2345
+ if (Object.keys(newPermissions).includes(snaps_rpc_methods_1.SnapEndowments.EthereumProvider)) {
2288
2346
  // This will return the globally selected network if the Snap doesn't have
2289
2347
  // one set.
2290
2348
  const networkClientId = this.messagingSystem.call('SelectedNetworkController:getNetworkClientIdForDomain', snapId);