@metamask/snaps-controllers 12.0.1 → 12.1.0

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [12.1.0]
11
+
12
+ ### Added
13
+
14
+ - Add support for `wallet_switchEthereumChain` ([#2634](https://github.com/MetaMask/snaps/pull/2634))
15
+ - Add support for SIP-31 `onClientRequest` handler ([#3394](https://github.com/MetaMask/snaps/pull/3394))
16
+
10
17
  ## [12.0.1]
11
18
 
12
19
  ### Fixed
@@ -749,7 +756,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
749
756
  - The version of the package no longer needs to match the version of all other
750
757
  MetaMask Snaps packages.
751
758
 
752
- [Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@12.0.1...HEAD
759
+ [Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@12.1.0...HEAD
760
+ [12.1.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@12.0.1...@metamask/snaps-controllers@12.1.0
753
761
  [12.0.1]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@12.0.0...@metamask/snaps-controllers@12.0.1
754
762
  [12.0.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@11.2.3...@metamask/snaps-controllers@12.0.0
755
763
  [11.2.3]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@11.2.2...@metamask/snaps-controllers@11.2.3
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _SnapController_instances, _SnapController_closeAllConnections, _SnapController_dynamicPermissions, _SnapController_environmentEndowmentPermissions, _SnapController_excludedPermissions, _SnapController_featureFlags, _SnapController_fetchFunction, _SnapController_idleTimeCheckInterval, _SnapController_maxIdleTime, _SnapController_encryptor, _SnapController_getMnemonicSeed, _SnapController_getFeatureFlags, _SnapController_clientCryptography, _SnapController_detectSnapLocation, _SnapController_snapsRuntimeData, _SnapController_rollbackSnapshots, _SnapController_timeoutForLastRequestStatus, _SnapController_statusMachine, _SnapController_preinstalledSnaps, _SnapController_trackEvent, _SnapController_trackSnapExport, _SnapController_initializeStateMachine, _SnapController_registerMessageHandlers, _SnapController_handlePreinstalledSnaps, _SnapController_pollForLastRequestStatus, _SnapController_blockSnap, _SnapController_unblockSnap, _SnapController_assertIsInstallAllowed, _SnapController_assertCanInstallSnaps, _SnapController_assertCanUsePlatform, _SnapController_stopSnapsLastRequestPastMax, _SnapController_transition, _SnapController_terminateSnap, _SnapController_hasCachedEncryptionKey, _SnapController_getSnapEncryptionKey, _SnapController_decryptSnapState, _SnapController_encryptSnapState, _SnapController_getStateToPersist, _SnapController_persistSnapState, _SnapController_handleInitialConnections, _SnapController_addSnapToSubject, _SnapController_removeSnapFromSubjects, _SnapController_revokeAllSnapPermissions, _SnapController_createApproval, _SnapController_updateApproval, _SnapController_resolveAllowlistVersion, _SnapController_add, _SnapController_startSnap, _SnapController_getEndowments, _SnapController_set, _SnapController_validateSnapPermissions, _SnapController_validatePlatformVersion, _SnapController_getExecutionTimeout, _SnapController_getRpcRequestHandler, _SnapController_createInterface, _SnapController_assertInterfaceExists, _SnapController_transformSnapRpcResponse, _SnapController_transformOnAssetsLookupResult, _SnapController_transformOnAssetsConversionResult, _SnapController_transformSnapRpcRequest, _SnapController_assertSnapRpcResponse, _SnapController_recordSnapRpcRequestStart, _SnapController_recordSnapRpcRequestFinish, _SnapController_getRollbackSnapshot, _SnapController_createRollbackSnapshot, _SnapController_rollbackSnap, _SnapController_rollbackSnaps, _SnapController_getRuntime, _SnapController_getRuntimeExpect, _SnapController_setupRuntime, _SnapController_calculatePermissionsChange, _SnapController_isSubjectConnectedToSnap, _SnapController_calculateConnectionsChange, _SnapController_updatePermissions, _SnapController_isValidUpdate, _SnapController_callLifecycleHook, _SnapController_handleLock;
13
+ var _SnapController_instances, _SnapController_closeAllConnections, _SnapController_dynamicPermissions, _SnapController_environmentEndowmentPermissions, _SnapController_excludedPermissions, _SnapController_featureFlags, _SnapController_fetchFunction, _SnapController_idleTimeCheckInterval, _SnapController_maxIdleTime, _SnapController_encryptor, _SnapController_getMnemonicSeed, _SnapController_getFeatureFlags, _SnapController_clientCryptography, _SnapController_detectSnapLocation, _SnapController_snapsRuntimeData, _SnapController_rollbackSnapshots, _SnapController_timeoutForLastRequestStatus, _SnapController_statusMachine, _SnapController_preinstalledSnaps, _SnapController_trackEvent, _SnapController_trackSnapExport, _SnapController_initializeStateMachine, _SnapController_registerMessageHandlers, _SnapController_handlePreinstalledSnaps, _SnapController_pollForLastRequestStatus, _SnapController_blockSnap, _SnapController_unblockSnap, _SnapController_assertIsInstallAllowed, _SnapController_assertCanInstallSnaps, _SnapController_assertCanUsePlatform, _SnapController_stopSnapsLastRequestPastMax, _SnapController_transition, _SnapController_terminateSnap, _SnapController_hasCachedEncryptionKey, _SnapController_getSnapEncryptionKey, _SnapController_decryptSnapState, _SnapController_encryptSnapState, _SnapController_getStateToPersist, _SnapController_persistSnapState, _SnapController_handleInitialConnections, _SnapController_addSnapToSubject, _SnapController_removeSnapFromSubjects, _SnapController_revokeAllSnapPermissions, _SnapController_createApproval, _SnapController_updateApproval, _SnapController_resolveAllowlistVersion, _SnapController_add, _SnapController_startSnap, _SnapController_getEndowments, _SnapController_set, _SnapController_validateSnapPermissions, _SnapController_validatePlatformVersion, _SnapController_getExecutionTimeout, _SnapController_getRpcRequestHandler, _SnapController_createInterface, _SnapController_assertInterfaceExists, _SnapController_transformSnapRpcResponse, _SnapController_transformOnAssetsLookupResult, _SnapController_transformOnAssetsConversionResult, _SnapController_transformSnapRpcRequest, _SnapController_assertSnapRpcResponse, _SnapController_recordSnapRpcRequestStart, _SnapController_recordSnapRpcRequestFinish, _SnapController_getRollbackSnapshot, _SnapController_createRollbackSnapshot, _SnapController_rollbackSnap, _SnapController_rollbackSnaps, _SnapController_getRuntime, _SnapController_getRuntimeExpect, _SnapController_setupRuntime, _SnapController_calculatePermissionsChange, _SnapController_isSubjectConnectedToSnap, _SnapController_calculateConnectionsChange, _SnapController_getPermissionsToGrant, _SnapController_updatePermissions, _SnapController_isValidUpdate, _SnapController_callLifecycleHook, _SnapController_handleLock;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.SnapController = exports.SNAP_APPROVAL_RESULT = exports.SNAP_APPROVAL_UPDATE = exports.SNAP_APPROVAL_INSTALL = exports.controllerName = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
@@ -1031,7 +1031,7 @@ class SnapController extends base_controller_1.BaseController {
1031
1031
  */
1032
1032
  async handleRequest({ snapId, origin, handler: handlerType, request: rawRequest, }) {
1033
1033
  __classPrivateFieldGet(this, _SnapController_instances, "m", _SnapController_assertCanUsePlatform).call(this);
1034
- (0, utils_1.assert)(origin === 'metamask' || (0, snaps_utils_1.isValidUrl)(origin), "'origin' must be a valid URL or 'metamask'.");
1034
+ (0, utils_1.assert)(origin === constants_1.METAMASK_ORIGIN || (0, snaps_utils_1.isValidUrl)(origin), "'origin' must be a valid URL or 'metamask'.");
1035
1035
  const request = {
1036
1036
  jsonrpc: '2.0',
1037
1037
  id: (0, nanoid_1.nanoid)(),
@@ -1061,6 +1061,10 @@ class SnapController extends base_controller_1.BaseController {
1061
1061
  throw new Error(`Snap "${snapId}" is not permitted to handle requests from "${origin}".`);
1062
1062
  }
1063
1063
  }
1064
+ if (origin !== constants_1.METAMASK_ORIGIN &&
1065
+ constants_1.CLIENT_ONLY_HANDLERS.includes(handlerType)) {
1066
+ throw new Error(`"${handlerType}" can only be invoked by MetaMask.`);
1067
+ }
1064
1068
  const handler = __classPrivateFieldGet(this, _SnapController_instances, "m", _SnapController_getRpcRequestHandler).call(this, snapId);
1065
1069
  if (!handler) {
1066
1070
  throw new Error(`Snap RPC message handler not found for snap "${snapId}".`);
@@ -1180,7 +1184,7 @@ _SnapController_closeAllConnections = new WeakMap(), _SnapController_dynamicPerm
1180
1184
  // Add snap to the SnapController state
1181
1185
  __classPrivateFieldGet(this, _SnapController_instances, "m", _SnapController_set).call(this, {
1182
1186
  id: snapId,
1183
- origin: 'metamask',
1187
+ origin: constants_1.METAMASK_ORIGIN,
1184
1188
  files: filesObject,
1185
1189
  removable,
1186
1190
  hidden,
@@ -1201,10 +1205,10 @@ _SnapController_closeAllConnections = new WeakMap(), _SnapController_dynamicPerm
1201
1205
  });
1202
1206
  // Emit events
1203
1207
  if (isUpdate) {
1204
- this.messagingSystem.publish('SnapController:snapUpdated', this.getTruncatedExpect(snapId), existingSnap.version, 'metamask', true);
1208
+ this.messagingSystem.publish('SnapController:snapUpdated', this.getTruncatedExpect(snapId), existingSnap.version, constants_1.METAMASK_ORIGIN, true);
1205
1209
  }
1206
1210
  else {
1207
- this.messagingSystem.publish('SnapController:snapInstalled', this.getTruncatedExpect(snapId), 'metamask', true);
1211
+ this.messagingSystem.publish('SnapController:snapInstalled', this.getTruncatedExpect(snapId), constants_1.METAMASK_ORIGIN, true);
1208
1212
  }
1209
1213
  }
1210
1214
  }, _SnapController_pollForLastRequestStatus = function _SnapController_pollForLastRequestStatus() {
@@ -2052,6 +2056,38 @@ async function _SnapController_rollbackSnaps(snapIds) {
2052
2056
  // oldConnections ∖ (oldConnections ∖ desiredConnectionsSet) ⟺ oldConnections ∩ desiredConnectionsSet
2053
2057
  const approvedConnections = (0, utils_2.setDiff)(filteredOldConnections, unusedConnections);
2054
2058
  return { newConnections, unusedConnections, approvedConnections };
2059
+ }, _SnapController_getPermissionsToGrant = function _SnapController_getPermissionsToGrant(snapId, newPermissions) {
2060
+ if (__classPrivateFieldGet(this, _SnapController_featureFlags, "f").useCaip25Permission &&
2061
+ Object.keys(newPermissions).includes(snaps_rpc_methods_1.SnapEndowments.EthereumProvider)) {
2062
+ // This will return the globally selected network if the Snap doesn't have
2063
+ // one set.
2064
+ const networkClientId = this.messagingSystem.call('SelectedNetworkController:getNetworkClientIdForDomain', snapId);
2065
+ const { configuration } = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId);
2066
+ const chainId = (0, utils_1.hexToNumber)(configuration.chainId);
2067
+ // This needs to be assigned to have proper type inference.
2068
+ const modifiedPermissions = {
2069
+ ...newPermissions,
2070
+ 'endowment:caip25': {
2071
+ caveats: [
2072
+ {
2073
+ type: 'authorizedScopes',
2074
+ value: {
2075
+ requiredScopes: {},
2076
+ optionalScopes: {
2077
+ [`eip155:${chainId}`]: {
2078
+ accounts: [],
2079
+ },
2080
+ },
2081
+ sessionProperties: {},
2082
+ isMultichainOrigin: false,
2083
+ },
2084
+ },
2085
+ ],
2086
+ },
2087
+ };
2088
+ return modifiedPermissions;
2089
+ }
2090
+ return newPermissions;
2055
2091
  }, _SnapController_updatePermissions = function _SnapController_updatePermissions({ snapId, unusedPermissions = {}, newPermissions = {}, requestData, }) {
2056
2092
  const unusedPermissionsKeys = Object.keys(unusedPermissions);
2057
2093
  if ((0, utils_1.isNonEmptyArray)(unusedPermissionsKeys)) {
@@ -2060,8 +2096,9 @@ async function _SnapController_rollbackSnaps(snapIds) {
2060
2096
  });
2061
2097
  }
2062
2098
  if ((0, utils_1.isNonEmptyArray)(Object.keys(newPermissions))) {
2099
+ const approvedPermissions = __classPrivateFieldGet(this, _SnapController_instances, "m", _SnapController_getPermissionsToGrant).call(this, snapId, newPermissions);
2063
2100
  this.messagingSystem.call('PermissionController:grantPermissions', {
2064
- approvedPermissions: newPermissions,
2101
+ approvedPermissions,
2065
2102
  subject: { origin: snapId },
2066
2103
  requestData,
2067
2104
  });