@metamask-previews/gator-permissions-controller 0.3.0-preview-607c80f8 → 0.4.0-preview-684a40c0

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.
@@ -3,8 +3,10 @@ import { BaseController } from "@metamask/base-controller";
3
3
  import type { Messenger } from "@metamask/messenger";
4
4
  import type { HandleSnapRequest, HasSnap } from "@metamask/snaps-controllers";
5
5
  import type { SnapId } from "@metamask/snaps-sdk";
6
+ import type { TransactionControllerTransactionConfirmedEvent, TransactionControllerTransactionDroppedEvent, TransactionControllerTransactionFailedEvent } from "@metamask/transaction-controller";
7
+ import type { Hex, Json } from "@metamask/utils";
6
8
  import type { DecodedPermission } from "./decodePermission/index.mjs";
7
- import { type GatorPermissionsMap, type DelegationDetails } from "./types.mjs";
9
+ import { type GatorPermissionsMap, type DelegationDetails, type RevocationParams, type PendingRevocationParams } from "./types.mjs";
8
10
  declare const controllerName = "GatorPermissionsController";
9
11
  /**
10
12
  * Delegation framework version used to select the correct deployed enforcer
@@ -33,6 +35,13 @@ export type GatorPermissionsControllerState = {
33
35
  * Default value is `@metamask/gator-permissions-snap`
34
36
  */
35
37
  gatorPermissionsProviderSnapId: SnapId;
38
+ /**
39
+ * List of gator permission pending a revocation transaction
40
+ */
41
+ pendingRevocations: {
42
+ txId: string;
43
+ permissionContext: Hex;
44
+ }[];
36
45
  };
37
46
  /**
38
47
  * Constructs the default {@link GatorPermissionsController} state. This allows
@@ -73,11 +82,25 @@ export type GatorPermissionsControllerDecodePermissionFromPermissionContextForOr
73
82
  type: `${typeof controllerName}:decodePermissionFromPermissionContextForOrigin`;
74
83
  handler: GatorPermissionsController['decodePermissionFromPermissionContextForOrigin'];
75
84
  };
85
+ /**
86
+ * The action which can be used to submit a revocation.
87
+ */
88
+ export type GatorPermissionsControllerSubmitRevocationAction = {
89
+ type: `${typeof controllerName}:submitRevocation`;
90
+ handler: GatorPermissionsController['submitRevocation'];
91
+ };
92
+ /**
93
+ * The action which can be used to add a pending revocation.
94
+ */
95
+ export type GatorPermissionsControllerAddPendingRevocationAction = {
96
+ type: `${typeof controllerName}:addPendingRevocation`;
97
+ handler: GatorPermissionsController['addPendingRevocation'];
98
+ };
76
99
  /**
77
100
  * All actions that {@link GatorPermissionsController} registers, to be called
78
101
  * externally.
79
102
  */
80
- export type GatorPermissionsControllerActions = GatorPermissionsControllerGetStateAction | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction | GatorPermissionsControllerEnableGatorPermissionsAction | GatorPermissionsControllerDisableGatorPermissionsAction | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction;
103
+ export type GatorPermissionsControllerActions = GatorPermissionsControllerGetStateAction | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction | GatorPermissionsControllerEnableGatorPermissionsAction | GatorPermissionsControllerDisableGatorPermissionsAction | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction | GatorPermissionsControllerSubmitRevocationAction | GatorPermissionsControllerAddPendingRevocationAction;
81
104
  /**
82
105
  * All actions that {@link GatorPermissionsController} calls internally.
83
106
  *
@@ -97,7 +120,7 @@ export type GatorPermissionsControllerEvents = GatorPermissionsControllerStateCh
97
120
  /**
98
121
  * Events that {@link GatorPermissionsController} is allowed to subscribe to internally.
99
122
  */
100
- type AllowedEvents = GatorPermissionsControllerStateChangeEvent;
123
+ type AllowedEvents = GatorPermissionsControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent | TransactionControllerTransactionFailedEvent | TransactionControllerTransactionDroppedEvent;
101
124
  /**
102
125
  * Messenger type for the GatorPermissionsController.
103
126
  */
@@ -138,13 +161,23 @@ export default class GatorPermissionsController extends BaseController<typeof co
138
161
  * Clears the gator permissions map and disables the feature.
139
162
  */
140
163
  disableGatorPermissions(): Promise<void>;
164
+ /**
165
+ * Gets the pending revocations list.
166
+ *
167
+ * @returns The pending revocations list.
168
+ */
169
+ get pendingRevocations(): {
170
+ txId: string;
171
+ permissionContext: Hex;
172
+ }[];
141
173
  /**
142
174
  * Fetches the gator permissions from profile sync and updates the state.
143
175
  *
176
+ * @param params - Optional parameters to pass to the snap's getGrantedPermissions method.
144
177
  * @returns A promise that resolves to the gator permissions map.
145
178
  * @throws {GatorPermissionsFetchError} If the gator permissions fetch fails.
146
179
  */
147
- fetchAndUpdateGatorPermissions(): Promise<GatorPermissionsMap>;
180
+ fetchAndUpdateGatorPermissions(params?: Json): Promise<GatorPermissionsMap>;
148
181
  /**
149
182
  * Decodes a permission context into a structured permission for a specific origin.
150
183
  *
@@ -174,6 +207,26 @@ export default class GatorPermissionsController extends BaseController<typeof co
174
207
  };
175
208
  delegation: DelegationDetails;
176
209
  }): DecodedPermission;
210
+ /**
211
+ * Submits a revocation to the gator permissions provider snap.
212
+ *
213
+ * @param revocationParams - The revocation parameters containing the permission context.
214
+ * @returns A promise that resolves when the revocation is submitted successfully.
215
+ * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.
216
+ * @throws {GatorPermissionsProviderError} If the snap request fails.
217
+ */
218
+ submitRevocation(revocationParams: RevocationParams): Promise<void>;
219
+ /**
220
+ * Adds a pending revocation that will be submitted once the transaction is confirmed.
221
+ *
222
+ * This method sets up listeners for terminal transaction states (confirmed, failed, dropped)
223
+ * and includes a timeout safety net to prevent memory leaks if the transaction never
224
+ * reaches a terminal state.
225
+ *
226
+ * @param params - The pending revocation parameters.
227
+ * @returns A promise that resolves when the listener is set up.
228
+ */
229
+ addPendingRevocation(params: PendingRevocationParams): Promise<void>;
177
230
  }
178
231
  export {};
179
232
  //# sourceMappingURL=GatorPermissionsController.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GatorPermissionsController.d.mts","sourceRoot":"","sources":["../src/GatorPermissionsController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GatorPermissionsController.d.mts","sourceRoot":"","sources":["../src/GatorPermissionsController.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3
3
  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");
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
- var _GatorPermissionsController_instances, _GatorPermissionsController_setIsFetchingGatorPermissions, _GatorPermissionsController_setIsGatorPermissionsEnabled, _GatorPermissionsController_registerMessageHandlers, _GatorPermissionsController_assertGatorPermissionsEnabled, _GatorPermissionsController_handleSnapRequestToGatorPermissionsProvider, _GatorPermissionsController_sanitizeStoredGatorPermission, _GatorPermissionsController_categorizePermissionsDataByTypeAndChainId;
6
+ var _GatorPermissionsController_instances, _GatorPermissionsController_setIsFetchingGatorPermissions, _GatorPermissionsController_setIsGatorPermissionsEnabled, _GatorPermissionsController_addPendingRevocationToState, _GatorPermissionsController_removePendingRevocationFromStateByTxId, _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext, _GatorPermissionsController_registerMessageHandlers, _GatorPermissionsController_assertGatorPermissionsEnabled, _GatorPermissionsController_handleSnapRequestToGatorPermissionsProvider, _GatorPermissionsController_sanitizeStoredGatorPermission, _GatorPermissionsController_categorizePermissionsDataByTypeAndChainId;
7
7
  import { BaseController } from "@metamask/base-controller";
8
8
  import { DELEGATOR_CONTRACTS } from "@metamask/delegation-deployments";
9
9
  import { HandlerType } from "@metamask/snaps-utils";
@@ -29,6 +29,11 @@ const defaultGatorPermissionsMap = {
29
29
  * contract addresses from `@metamask/delegation-deployments`.
30
30
  */
31
31
  export const DELEGATION_FRAMEWORK_VERSION = '1.3.0';
32
+ /**
33
+ * Timeout duration for pending revocations (2 hours in milliseconds).
34
+ * After this time, event listeners will be cleaned up to prevent memory leaks.
35
+ */
36
+ const PENDING_REVOCATION_TIMEOUT = 2 * 60 * 60 * 1000;
32
37
  const contractsByChainId = DELEGATOR_CONTRACTS[DELEGATION_FRAMEWORK_VERSION];
33
38
  const gatorPermissionsControllerMetadata = {
34
39
  isGatorPermissionsEnabled: {
@@ -55,6 +60,12 @@ const gatorPermissionsControllerMetadata = {
55
60
  includeInDebugSnapshot: false,
56
61
  usedInUi: false,
57
62
  },
63
+ pendingRevocations: {
64
+ includeInStateLogs: true,
65
+ persist: false,
66
+ includeInDebugSnapshot: false,
67
+ usedInUi: true,
68
+ },
58
69
  };
59
70
  /**
60
71
  * Constructs the default {@link GatorPermissionsController} state. This allows
@@ -70,6 +81,7 @@ export function getDefaultGatorPermissionsControllerState() {
70
81
  gatorPermissionsMapSerialized: serializeGatorPermissionsMap(defaultGatorPermissionsMap),
71
82
  isFetchingGatorPermissions: false,
72
83
  gatorPermissionsProviderSnapId: defaultGatorPermissionsProviderSnapId,
84
+ pendingRevocations: [],
73
85
  };
74
86
  }
75
87
  /**
@@ -128,18 +140,28 @@ class GatorPermissionsController extends BaseController {
128
140
  state.gatorPermissionsMapSerialized = serializeGatorPermissionsMap(defaultGatorPermissionsMap);
129
141
  });
130
142
  }
143
+ /**
144
+ * Gets the pending revocations list.
145
+ *
146
+ * @returns The pending revocations list.
147
+ */
148
+ get pendingRevocations() {
149
+ return this.state.pendingRevocations;
150
+ }
131
151
  /**
132
152
  * Fetches the gator permissions from profile sync and updates the state.
133
153
  *
154
+ * @param params - Optional parameters to pass to the snap's getGrantedPermissions method.
134
155
  * @returns A promise that resolves to the gator permissions map.
135
156
  * @throws {GatorPermissionsFetchError} If the gator permissions fetch fails.
136
157
  */
137
- async fetchAndUpdateGatorPermissions() {
158
+ async fetchAndUpdateGatorPermissions(params) {
138
159
  try {
139
160
  __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_setIsFetchingGatorPermissions).call(this, true);
140
161
  __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_assertGatorPermissionsEnabled).call(this);
141
162
  const permissionsData = await __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_handleSnapRequestToGatorPermissionsProvider).call(this, {
142
163
  snapId: this.state.gatorPermissionsProviderSnapId,
164
+ params,
143
165
  });
144
166
  const gatorPermissionsMap = __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_categorizePermissionsDataByTypeAndChainId).call(this, permissionsData);
145
167
  this.update((state) => {
@@ -217,6 +239,141 @@ class GatorPermissionsController extends BaseController {
217
239
  });
218
240
  }
219
241
  }
242
+ /**
243
+ * Submits a revocation to the gator permissions provider snap.
244
+ *
245
+ * @param revocationParams - The revocation parameters containing the permission context.
246
+ * @returns A promise that resolves when the revocation is submitted successfully.
247
+ * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.
248
+ * @throws {GatorPermissionsProviderError} If the snap request fails.
249
+ */
250
+ async submitRevocation(revocationParams) {
251
+ controllerLog('submitRevocation method called', {
252
+ permissionContext: revocationParams.permissionContext,
253
+ });
254
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_assertGatorPermissionsEnabled).call(this);
255
+ try {
256
+ const snapRequest = {
257
+ snapId: this.state.gatorPermissionsProviderSnapId,
258
+ origin: 'metamask',
259
+ handler: HandlerType.OnRpcRequest,
260
+ request: {
261
+ jsonrpc: '2.0',
262
+ method: GatorPermissionsSnapRpcMethod.PermissionProviderSubmitRevocation,
263
+ params: revocationParams,
264
+ },
265
+ };
266
+ const result = await this.messenger.call('SnapController:handleRequest', snapRequest);
267
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext).call(this, revocationParams.permissionContext);
268
+ controllerLog('Successfully submitted revocation', {
269
+ permissionContext: revocationParams.permissionContext,
270
+ result,
271
+ });
272
+ }
273
+ catch (error) {
274
+ controllerLog('Failed to submit revocation', {
275
+ error,
276
+ permissionContext: revocationParams.permissionContext,
277
+ });
278
+ throw new GatorPermissionsProviderError({
279
+ method: GatorPermissionsSnapRpcMethod.PermissionProviderSubmitRevocation,
280
+ cause: error,
281
+ });
282
+ }
283
+ }
284
+ /**
285
+ * Adds a pending revocation that will be submitted once the transaction is confirmed.
286
+ *
287
+ * This method sets up listeners for terminal transaction states (confirmed, failed, dropped)
288
+ * and includes a timeout safety net to prevent memory leaks if the transaction never
289
+ * reaches a terminal state.
290
+ *
291
+ * @param params - The pending revocation parameters.
292
+ * @returns A promise that resolves when the listener is set up.
293
+ */
294
+ async addPendingRevocation(params) {
295
+ const { txId, permissionContext } = params;
296
+ controllerLog('addPendingRevocation method called', {
297
+ txId,
298
+ permissionContext,
299
+ });
300
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_assertGatorPermissionsEnabled).call(this);
301
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_addPendingRevocationToState).call(this, txId, permissionContext);
302
+ // Track handlers and timeout for cleanup
303
+ const handlers = {
304
+ confirmed: undefined,
305
+ failed: undefined,
306
+ dropped: undefined,
307
+ timeoutId: undefined,
308
+ };
309
+ // Cleanup function to unsubscribe from all events and clear timeout
310
+ const cleanup = (txIdToRemove) => {
311
+ if (handlers.confirmed) {
312
+ this.messenger.unsubscribe('TransactionController:transactionConfirmed', handlers.confirmed);
313
+ }
314
+ if (handlers.failed) {
315
+ this.messenger.unsubscribe('TransactionController:transactionFailed', handlers.failed);
316
+ }
317
+ if (handlers.dropped) {
318
+ this.messenger.unsubscribe('TransactionController:transactionDropped', handlers.dropped);
319
+ }
320
+ if (handlers.timeoutId !== undefined) {
321
+ clearTimeout(handlers.timeoutId);
322
+ }
323
+ // Remove the pending revocation from the state
324
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_removePendingRevocationFromStateByTxId).call(this, txIdToRemove);
325
+ };
326
+ // Handle confirmed transaction - submit revocation
327
+ handlers.confirmed = (transactionMeta) => {
328
+ if (transactionMeta.id === txId) {
329
+ controllerLog('Transaction confirmed, submitting revocation', {
330
+ txId,
331
+ permissionContext,
332
+ });
333
+ this.submitRevocation({ permissionContext }).catch((error) => {
334
+ controllerLog('Failed to submit revocation after transaction confirmed', {
335
+ txId,
336
+ permissionContext,
337
+ error,
338
+ });
339
+ });
340
+ cleanup(transactionMeta.id);
341
+ }
342
+ };
343
+ // Handle failed transaction - cleanup without submitting revocation
344
+ handlers.failed = (payload) => {
345
+ if (payload.transactionMeta.id === txId) {
346
+ controllerLog('Transaction failed, cleaning up revocation listener', {
347
+ txId,
348
+ permissionContext,
349
+ error: payload.error,
350
+ });
351
+ cleanup(payload.transactionMeta.id);
352
+ }
353
+ };
354
+ // Handle dropped transaction - cleanup without submitting revocation
355
+ handlers.dropped = (payload) => {
356
+ if (payload.transactionMeta.id === txId) {
357
+ controllerLog('Transaction dropped, cleaning up revocation listener', {
358
+ txId,
359
+ permissionContext,
360
+ });
361
+ cleanup(payload.transactionMeta.id);
362
+ }
363
+ };
364
+ // Subscribe to terminal transaction events
365
+ this.messenger.subscribe('TransactionController:transactionConfirmed', handlers.confirmed);
366
+ this.messenger.subscribe('TransactionController:transactionFailed', handlers.failed);
367
+ this.messenger.subscribe('TransactionController:transactionDropped', handlers.dropped);
368
+ // Set timeout as safety net to prevent memory leaks
369
+ handlers.timeoutId = setTimeout(() => {
370
+ controllerLog('Pending revocation timed out, cleaning up listeners', {
371
+ txId,
372
+ permissionContext,
373
+ });
374
+ cleanup(txId);
375
+ }, PENDING_REVOCATION_TIMEOUT);
376
+ }
220
377
  }
221
378
  _GatorPermissionsController_instances = new WeakSet(), _GatorPermissionsController_setIsFetchingGatorPermissions = function _GatorPermissionsController_setIsFetchingGatorPermissions(isFetchingGatorPermissions) {
222
379
  this.update((state) => {
@@ -226,11 +383,29 @@ _GatorPermissionsController_instances = new WeakSet(), _GatorPermissionsControll
226
383
  this.update((state) => {
227
384
  state.isGatorPermissionsEnabled = isGatorPermissionsEnabled;
228
385
  });
386
+ }, _GatorPermissionsController_addPendingRevocationToState = function _GatorPermissionsController_addPendingRevocationToState(txId, permissionContext) {
387
+ this.update((state) => {
388
+ state.pendingRevocations = [
389
+ ...state.pendingRevocations,
390
+ { txId, permissionContext },
391
+ ];
392
+ });
393
+ }, _GatorPermissionsController_removePendingRevocationFromStateByTxId = function _GatorPermissionsController_removePendingRevocationFromStateByTxId(txId) {
394
+ this.update((state) => {
395
+ state.pendingRevocations = state.pendingRevocations.filter((pendingRevocations) => pendingRevocations.txId !== txId);
396
+ });
397
+ }, _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext = function _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext(permissionContext) {
398
+ this.update((state) => {
399
+ state.pendingRevocations = state.pendingRevocations.filter((pendingRevocations) => pendingRevocations.permissionContext !== permissionContext);
400
+ });
229
401
  }, _GatorPermissionsController_registerMessageHandlers = function _GatorPermissionsController_registerMessageHandlers() {
230
402
  this.messenger.registerActionHandler(`${controllerName}:fetchAndUpdateGatorPermissions`, this.fetchAndUpdateGatorPermissions.bind(this));
231
403
  this.messenger.registerActionHandler(`${controllerName}:enableGatorPermissions`, this.enableGatorPermissions.bind(this));
232
404
  this.messenger.registerActionHandler(`${controllerName}:disableGatorPermissions`, this.disableGatorPermissions.bind(this));
233
405
  this.messenger.registerActionHandler(`${controllerName}:decodePermissionFromPermissionContextForOrigin`, this.decodePermissionFromPermissionContextForOrigin.bind(this));
406
+ const submitRevocationAction = `${controllerName}:submitRevocation`;
407
+ this.messenger.registerActionHandler(submitRevocationAction, this.submitRevocation.bind(this));
408
+ this.messenger.registerActionHandler(`${controllerName}:addPendingRevocation`, this.addPendingRevocation.bind(this));
234
409
  }, _GatorPermissionsController_assertGatorPermissionsEnabled = function _GatorPermissionsController_assertGatorPermissionsEnabled() {
235
410
  if (!this.state.isGatorPermissionsEnabled) {
236
411
  throw new GatorPermissionsNotEnabledError();
@@ -241,9 +416,10 @@ _GatorPermissionsController_instances = new WeakSet(), _GatorPermissionsControll
241
416
  *
242
417
  * @param args - The request parameters.
243
418
  * @param args.snapId - The ID of the Snap of the gator permissions provider snap.
419
+ * @param args.params - Optional parameters to pass to the snap method.
244
420
  * @returns A promise that resolves with the gator permissions.
245
421
  */
246
- async function _GatorPermissionsController_handleSnapRequestToGatorPermissionsProvider({ snapId, }) {
422
+ async function _GatorPermissionsController_handleSnapRequestToGatorPermissionsProvider({ snapId, params, }) {
247
423
  try {
248
424
  const response = (await this.messenger.call('SnapController:handleRequest', {
249
425
  snapId,
@@ -252,6 +428,7 @@ async function _GatorPermissionsController_handleSnapRequestToGatorPermissionsPr
252
428
  request: {
253
429
  jsonrpc: '2.0',
254
430
  method: GatorPermissionsSnapRpcMethod.PermissionProviderGetGrantedPermissions,
431
+ ...(params !== undefined && { params }),
255
432
  },
256
433
  }));
257
434
  return response;
@@ -1 +1 @@
1
- {"version":3,"file":"GatorPermissionsController.mjs","sourceRoot":"","sources":["../src/GatorPermissionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Signer } from '@metamask/7715-permission-types';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { DELEGATOR_CONTRACTS } from '@metamask/delegation-deployments';\nimport type { Messenger } from '@metamask/messenger';\nimport type { HandleSnapRequest, HasSnap } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\n\nimport type { DecodedPermission } from './decodePermission';\nimport {\n getPermissionDataAndExpiry,\n identifyPermissionByEnforcers,\n reconstructDecodedPermission,\n} from './decodePermission';\nimport {\n GatorPermissionsFetchError,\n GatorPermissionsNotEnabledError,\n GatorPermissionsProviderError,\n OriginNotAllowedError,\n PermissionDecodingError,\n} from './errors';\nimport { controllerLog } from './logger';\nimport type { StoredGatorPermissionSanitized } from './types';\nimport {\n GatorPermissionsSnapRpcMethod,\n type GatorPermissionsMap,\n type PermissionTypesWithCustom,\n type StoredGatorPermission,\n type DelegationDetails,\n} from './types';\nimport {\n deserializeGatorPermissionsMap,\n serializeGatorPermissionsMap,\n} from './utils';\n\n// === GENERAL ===\n\n// Unique name for the controller\nconst controllerName = 'GatorPermissionsController';\n\n// Default value for the gator permissions provider snap id\nconst defaultGatorPermissionsProviderSnapId =\n 'npm:@metamask/gator-permissions-snap' as SnapId;\n\nconst defaultGatorPermissionsMap: GatorPermissionsMap = {\n 'native-token-stream': {},\n 'native-token-periodic': {},\n 'erc20-token-stream': {},\n 'erc20-token-periodic': {},\n other: {},\n};\n\n/**\n * Delegation framework version used to select the correct deployed enforcer\n * contract addresses from `@metamask/delegation-deployments`.\n */\nexport const DELEGATION_FRAMEWORK_VERSION = '1.3.0';\n\nconst contractsByChainId = DELEGATOR_CONTRACTS[DELEGATION_FRAMEWORK_VERSION];\n\n// === STATE ===\n\n/**\n * State shape for GatorPermissionsController\n */\nexport type GatorPermissionsControllerState = {\n /**\n * Flag that indicates if the gator permissions feature is enabled\n */\n isGatorPermissionsEnabled: boolean;\n\n /**\n * JSON serialized object containing gator permissions fetched from profile sync\n */\n gatorPermissionsMapSerialized: string;\n\n /**\n * Flag that indicates that fetching permissions is in progress\n * This is used to show a loading spinner in the UI\n */\n isFetchingGatorPermissions: boolean;\n\n /**\n * The ID of the Snap of the gator permissions provider snap\n * Default value is `@metamask/gator-permissions-snap`\n */\n gatorPermissionsProviderSnapId: SnapId;\n};\n\nconst gatorPermissionsControllerMetadata: StateMetadata<GatorPermissionsControllerState> =\n {\n isGatorPermissionsEnabled: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n gatorPermissionsMapSerialized: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isFetchingGatorPermissions: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n gatorPermissionsProviderSnapId: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n } satisfies StateMetadata<GatorPermissionsControllerState>;\n\n/**\n * Constructs the default {@link GatorPermissionsController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link GatorPermissionsController} state.\n */\nexport function getDefaultGatorPermissionsControllerState(): GatorPermissionsControllerState {\n return {\n isGatorPermissionsEnabled: false,\n gatorPermissionsMapSerialized: serializeGatorPermissionsMap(\n defaultGatorPermissionsMap,\n ),\n isFetchingGatorPermissions: false,\n gatorPermissionsProviderSnapId: defaultGatorPermissionsProviderSnapId,\n };\n}\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link GatorPermissionsController}.\n */\nexport type GatorPermissionsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n GatorPermissionsControllerState\n>;\n\n/**\n * The action which can be used to fetch and update gator permissions.\n */\nexport type GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction = {\n type: `${typeof controllerName}:fetchAndUpdateGatorPermissions`;\n handler: GatorPermissionsController['fetchAndUpdateGatorPermissions'];\n};\n\n/**\n * The action which can be used to enable gator permissions.\n */\nexport type GatorPermissionsControllerEnableGatorPermissionsAction = {\n type: `${typeof controllerName}:enableGatorPermissions`;\n handler: GatorPermissionsController['enableGatorPermissions'];\n};\n\n/**\n * The action which can be used to disable gator permissions.\n */\nexport type GatorPermissionsControllerDisableGatorPermissionsAction = {\n type: `${typeof controllerName}:disableGatorPermissions`;\n handler: GatorPermissionsController['disableGatorPermissions'];\n};\n\nexport type GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction =\n {\n type: `${typeof controllerName}:decodePermissionFromPermissionContextForOrigin`;\n handler: GatorPermissionsController['decodePermissionFromPermissionContextForOrigin'];\n };\n\n/**\n * All actions that {@link GatorPermissionsController} registers, to be called\n * externally.\n */\nexport type GatorPermissionsControllerActions =\n | GatorPermissionsControllerGetStateAction\n | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction\n | GatorPermissionsControllerEnableGatorPermissionsAction\n | GatorPermissionsControllerDisableGatorPermissionsAction\n | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction;\n\n/**\n * All actions that {@link GatorPermissionsController} calls internally.\n *\n * SnapsController:handleRequest and SnapsController:has are allowed to be called\n * internally because they are used to fetch gator permissions from the Snap.\n */\ntype AllowedActions = HandleSnapRequest | HasSnap;\n\n/**\n * The event that {@link GatorPermissionsController} publishes when updating state.\n */\nexport type GatorPermissionsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n GatorPermissionsControllerState\n >;\n\n/**\n * All events that {@link GatorPermissionsController} publishes, to be subscribed to\n * externally.\n */\nexport type GatorPermissionsControllerEvents =\n GatorPermissionsControllerStateChangeEvent;\n\n/**\n * Events that {@link GatorPermissionsController} is allowed to subscribe to internally.\n */\ntype AllowedEvents = GatorPermissionsControllerStateChangeEvent;\n\n/**\n * Messenger type for the GatorPermissionsController.\n */\nexport type GatorPermissionsControllerMessenger = Messenger<\n typeof controllerName,\n GatorPermissionsControllerActions | AllowedActions,\n GatorPermissionsControllerEvents | AllowedEvents\n>;\n\n/**\n * Controller that manages gator permissions by reading from profile sync\n */\nexport default class GatorPermissionsController extends BaseController<\n typeof controllerName,\n GatorPermissionsControllerState,\n GatorPermissionsControllerMessenger\n> {\n /**\n * Creates a GatorPermissionsController instance.\n *\n * @param args - The arguments to this function.\n * @param args.messenger - Messenger used to communicate with BaseV2 controller.\n * @param args.state - Initial state to set on this controller.\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: GatorPermissionsControllerMessenger;\n state?: Partial<GatorPermissionsControllerState>;\n }) {\n super({\n name: controllerName,\n metadata: gatorPermissionsControllerMetadata,\n messenger,\n state: {\n ...getDefaultGatorPermissionsControllerState(),\n ...state,\n isFetchingGatorPermissions: false,\n },\n });\n\n this.#registerMessageHandlers();\n }\n\n #setIsFetchingGatorPermissions(isFetchingGatorPermissions: boolean) {\n this.update((state) => {\n state.isFetchingGatorPermissions = isFetchingGatorPermissions;\n });\n }\n\n #setIsGatorPermissionsEnabled(isGatorPermissionsEnabled: boolean) {\n this.update((state) => {\n state.isGatorPermissionsEnabled = isGatorPermissionsEnabled;\n });\n }\n\n #registerMessageHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:fetchAndUpdateGatorPermissions`,\n this.fetchAndUpdateGatorPermissions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:enableGatorPermissions`,\n this.enableGatorPermissions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:disableGatorPermissions`,\n this.disableGatorPermissions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:decodePermissionFromPermissionContextForOrigin`,\n this.decodePermissionFromPermissionContextForOrigin.bind(this),\n );\n }\n\n /**\n * Asserts that the gator permissions are enabled.\n *\n * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.\n */\n #assertGatorPermissionsEnabled() {\n if (!this.state.isGatorPermissionsEnabled) {\n throw new GatorPermissionsNotEnabledError();\n }\n }\n\n /**\n * Forwards a Snap request to the SnapController.\n *\n * @param args - The request parameters.\n * @param args.snapId - The ID of the Snap of the gator permissions provider snap.\n * @returns A promise that resolves with the gator permissions.\n */\n async #handleSnapRequestToGatorPermissionsProvider({\n snapId,\n }: {\n snapId: SnapId;\n }): Promise<\n StoredGatorPermission<Signer, PermissionTypesWithCustom>[] | null\n > {\n try {\n const response = (await this.messenger.call(\n 'SnapController:handleRequest',\n {\n snapId,\n origin: 'metamask',\n handler: HandlerType.OnRpcRequest,\n request: {\n jsonrpc: '2.0',\n method:\n GatorPermissionsSnapRpcMethod.PermissionProviderGetGrantedPermissions,\n },\n },\n )) as StoredGatorPermission<Signer, PermissionTypesWithCustom>[] | null;\n\n return response;\n } catch (error) {\n controllerLog(\n 'Failed to handle snap request to gator permissions provider',\n error,\n );\n throw new GatorPermissionsProviderError({\n method:\n GatorPermissionsSnapRpcMethod.PermissionProviderGetGrantedPermissions,\n cause: error as Error,\n });\n }\n }\n\n /**\n * Sanitizes a stored gator permission by removing the fields that are not expose to MetaMask client.\n *\n * @param storedGatorPermission - The stored gator permission to sanitize.\n * @returns The sanitized stored gator permission.\n */\n #sanitizeStoredGatorPermission(\n storedGatorPermission: StoredGatorPermission<\n Signer,\n PermissionTypesWithCustom\n >,\n ): StoredGatorPermissionSanitized<Signer, PermissionTypesWithCustom> {\n const { permissionResponse } = storedGatorPermission;\n const { rules, dependencyInfo, signer, ...rest } = permissionResponse;\n return {\n ...storedGatorPermission,\n permissionResponse: {\n ...rest,\n },\n };\n }\n\n /**\n * Categorizes stored gator permissions by type and chainId.\n *\n * @param storedGatorPermissions - An array of stored gator permissions.\n * @returns The gator permissions map.\n */\n #categorizePermissionsDataByTypeAndChainId(\n storedGatorPermissions:\n | StoredGatorPermission<Signer, PermissionTypesWithCustom>[]\n | null,\n ): GatorPermissionsMap {\n if (!storedGatorPermissions) {\n return defaultGatorPermissionsMap;\n }\n\n return storedGatorPermissions.reduce(\n (gatorPermissionsMap, storedGatorPermission) => {\n const { permissionResponse } = storedGatorPermission;\n const permissionType = permissionResponse.permission.type;\n const { chainId } = permissionResponse;\n\n const sanitizedStoredGatorPermission =\n this.#sanitizeStoredGatorPermission(storedGatorPermission);\n\n switch (permissionType) {\n case 'native-token-stream':\n case 'native-token-periodic':\n case 'erc20-token-stream':\n case 'erc20-token-periodic':\n if (!gatorPermissionsMap[permissionType][chainId]) {\n gatorPermissionsMap[permissionType][chainId] = [];\n }\n\n (\n gatorPermissionsMap[permissionType][\n chainId\n ] as StoredGatorPermissionSanitized<\n Signer,\n PermissionTypesWithCustom\n >[]\n ).push(sanitizedStoredGatorPermission);\n break;\n default:\n if (!gatorPermissionsMap.other[chainId]) {\n gatorPermissionsMap.other[chainId] = [];\n }\n\n (\n gatorPermissionsMap.other[\n chainId\n ] as StoredGatorPermissionSanitized<\n Signer,\n PermissionTypesWithCustom\n >[]\n ).push(sanitizedStoredGatorPermission);\n break;\n }\n\n return gatorPermissionsMap;\n },\n {\n 'native-token-stream': {},\n 'native-token-periodic': {},\n 'erc20-token-stream': {},\n 'erc20-token-periodic': {},\n other: {},\n } as GatorPermissionsMap,\n );\n }\n\n /**\n * Gets the gator permissions map from the state.\n *\n * @returns The gator permissions map.\n */\n get gatorPermissionsMap(): GatorPermissionsMap {\n return deserializeGatorPermissionsMap(\n this.state.gatorPermissionsMapSerialized,\n );\n }\n\n /**\n * Gets the gator permissions provider snap id that is used to fetch gator permissions.\n *\n * @returns The gator permissions provider snap id.\n */\n get permissionsProviderSnapId(): SnapId {\n return this.state.gatorPermissionsProviderSnapId;\n }\n\n /**\n * Enables gator permissions for the user.\n */\n public async enableGatorPermissions() {\n this.#setIsGatorPermissionsEnabled(true);\n }\n\n /**\n * Clears the gator permissions map and disables the feature.\n */\n public async disableGatorPermissions() {\n this.update((state) => {\n state.isGatorPermissionsEnabled = false;\n state.gatorPermissionsMapSerialized = serializeGatorPermissionsMap(\n defaultGatorPermissionsMap,\n );\n });\n }\n\n /**\n * Fetches the gator permissions from profile sync and updates the state.\n *\n * @returns A promise that resolves to the gator permissions map.\n * @throws {GatorPermissionsFetchError} If the gator permissions fetch fails.\n */\n public async fetchAndUpdateGatorPermissions(): Promise<GatorPermissionsMap> {\n try {\n this.#setIsFetchingGatorPermissions(true);\n this.#assertGatorPermissionsEnabled();\n\n const permissionsData =\n await this.#handleSnapRequestToGatorPermissionsProvider({\n snapId: this.state.gatorPermissionsProviderSnapId,\n });\n\n const gatorPermissionsMap =\n this.#categorizePermissionsDataByTypeAndChainId(permissionsData);\n\n this.update((state) => {\n state.gatorPermissionsMapSerialized =\n serializeGatorPermissionsMap(gatorPermissionsMap);\n });\n\n return gatorPermissionsMap;\n } catch (error) {\n controllerLog('Failed to fetch gator permissions', error);\n throw new GatorPermissionsFetchError({\n message: 'Failed to fetch gator permissions',\n cause: error as Error,\n });\n } finally {\n this.#setIsFetchingGatorPermissions(false);\n }\n }\n\n /**\n * Decodes a permission context into a structured permission for a specific origin.\n *\n * This method validates the caller origin, decodes the provided `permissionContext`\n * into delegations, identifies the permission type from the caveat enforcers,\n * extracts the permission-specific data and expiry, and reconstructs a\n * {@link DecodedPermission} containing chainId, account addresses, signer, type and data.\n *\n * @param args - The arguments to this function.\n * @param args.origin - The caller's origin; must match the configured permissions provider Snap id.\n * @param args.chainId - Numeric EIP-155 chain id used for resolving enforcer contracts and encoding.\n * @param args.delegation - delegation representing the permission.\n * @param args.metadata - metadata included in the request.\n * @param args.metadata.justification - the justification as specified in the request metadata.\n * @param args.metadata.origin - the origin as specified in the request metadata.\n *\n * @returns A decoded permission object suitable for UI consumption and follow-up actions.\n * @throws If the origin is not allowed, the context cannot be decoded into exactly one delegation,\n * or the enforcers/terms do not match a supported permission type.\n */\n public decodePermissionFromPermissionContextForOrigin({\n origin,\n chainId,\n delegation: { caveats, delegator, delegate, authority },\n metadata: { justification, origin: specifiedOrigin },\n }: {\n origin: string;\n chainId: number;\n metadata: {\n justification: string;\n origin: string;\n };\n delegation: DelegationDetails;\n }): DecodedPermission {\n if (origin !== this.permissionsProviderSnapId) {\n throw new OriginNotAllowedError({ origin });\n }\n\n const contracts = contractsByChainId[chainId];\n\n if (!contracts) {\n throw new Error(`Contracts not found for chainId: ${chainId}`);\n }\n\n try {\n const enforcers = caveats.map((caveat) => caveat.enforcer);\n\n const permissionType = identifyPermissionByEnforcers({\n enforcers,\n contracts,\n });\n\n const { expiry, data } = getPermissionDataAndExpiry({\n contracts,\n caveats,\n permissionType,\n });\n\n const permission = reconstructDecodedPermission({\n chainId,\n permissionType,\n delegator,\n delegate,\n authority,\n expiry,\n data,\n justification,\n specifiedOrigin,\n });\n\n return permission;\n } catch (error) {\n throw new PermissionDecodingError({\n cause: error as Error,\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"GatorPermissionsController.mjs","sourceRoot":"","sources":["../src/GatorPermissionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Signer } from '@metamask/7715-permission-types';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { DELEGATOR_CONTRACTS } from '@metamask/delegation-deployments';\nimport type { Messenger } from '@metamask/messenger';\nimport type { HandleSnapRequest, HasSnap } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport type {\n TransactionControllerTransactionConfirmedEvent,\n TransactionControllerTransactionDroppedEvent,\n TransactionControllerTransactionFailedEvent,\n} from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\n\nimport type { DecodedPermission } from './decodePermission';\nimport {\n getPermissionDataAndExpiry,\n identifyPermissionByEnforcers,\n reconstructDecodedPermission,\n} from './decodePermission';\nimport {\n GatorPermissionsFetchError,\n GatorPermissionsNotEnabledError,\n GatorPermissionsProviderError,\n OriginNotAllowedError,\n PermissionDecodingError,\n} from './errors';\nimport { controllerLog } from './logger';\nimport type { StoredGatorPermissionSanitized } from './types';\nimport {\n GatorPermissionsSnapRpcMethod,\n type GatorPermissionsMap,\n type PermissionTypesWithCustom,\n type StoredGatorPermission,\n type DelegationDetails,\n type RevocationParams,\n type PendingRevocationParams,\n} from './types';\nimport {\n deserializeGatorPermissionsMap,\n serializeGatorPermissionsMap,\n} from './utils';\n\n// === GENERAL ===\n\n// Unique name for the controller\nconst controllerName = 'GatorPermissionsController';\n\n// Default value for the gator permissions provider snap id\nconst defaultGatorPermissionsProviderSnapId =\n 'npm:@metamask/gator-permissions-snap' as SnapId;\n\nconst defaultGatorPermissionsMap: GatorPermissionsMap = {\n 'native-token-stream': {},\n 'native-token-periodic': {},\n 'erc20-token-stream': {},\n 'erc20-token-periodic': {},\n other: {},\n};\n\n/**\n * Delegation framework version used to select the correct deployed enforcer\n * contract addresses from `@metamask/delegation-deployments`.\n */\nexport const DELEGATION_FRAMEWORK_VERSION = '1.3.0';\n\n/**\n * Timeout duration for pending revocations (2 hours in milliseconds).\n * After this time, event listeners will be cleaned up to prevent memory leaks.\n */\nconst PENDING_REVOCATION_TIMEOUT = 2 * 60 * 60 * 1000;\n\nconst contractsByChainId = DELEGATOR_CONTRACTS[DELEGATION_FRAMEWORK_VERSION];\n\n// === STATE ===\n\n/**\n * State shape for GatorPermissionsController\n */\nexport type GatorPermissionsControllerState = {\n /**\n * Flag that indicates if the gator permissions feature is enabled\n */\n isGatorPermissionsEnabled: boolean;\n\n /**\n * JSON serialized object containing gator permissions fetched from profile sync\n */\n gatorPermissionsMapSerialized: string;\n\n /**\n * Flag that indicates that fetching permissions is in progress\n * This is used to show a loading spinner in the UI\n */\n isFetchingGatorPermissions: boolean;\n\n /**\n * The ID of the Snap of the gator permissions provider snap\n * Default value is `@metamask/gator-permissions-snap`\n */\n gatorPermissionsProviderSnapId: SnapId;\n\n /**\n * List of gator permission pending a revocation transaction\n */\n pendingRevocations: {\n txId: string;\n permissionContext: Hex;\n }[];\n};\n\nconst gatorPermissionsControllerMetadata: StateMetadata<GatorPermissionsControllerState> =\n {\n isGatorPermissionsEnabled: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n gatorPermissionsMapSerialized: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isFetchingGatorPermissions: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n gatorPermissionsProviderSnapId: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n pendingRevocations: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n } satisfies StateMetadata<GatorPermissionsControllerState>;\n\n/**\n * Constructs the default {@link GatorPermissionsController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link GatorPermissionsController} state.\n */\nexport function getDefaultGatorPermissionsControllerState(): GatorPermissionsControllerState {\n return {\n isGatorPermissionsEnabled: false,\n gatorPermissionsMapSerialized: serializeGatorPermissionsMap(\n defaultGatorPermissionsMap,\n ),\n isFetchingGatorPermissions: false,\n gatorPermissionsProviderSnapId: defaultGatorPermissionsProviderSnapId,\n pendingRevocations: [],\n };\n}\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link GatorPermissionsController}.\n */\nexport type GatorPermissionsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n GatorPermissionsControllerState\n>;\n\n/**\n * The action which can be used to fetch and update gator permissions.\n */\nexport type GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction = {\n type: `${typeof controllerName}:fetchAndUpdateGatorPermissions`;\n handler: GatorPermissionsController['fetchAndUpdateGatorPermissions'];\n};\n\n/**\n * The action which can be used to enable gator permissions.\n */\nexport type GatorPermissionsControllerEnableGatorPermissionsAction = {\n type: `${typeof controllerName}:enableGatorPermissions`;\n handler: GatorPermissionsController['enableGatorPermissions'];\n};\n\n/**\n * The action which can be used to disable gator permissions.\n */\nexport type GatorPermissionsControllerDisableGatorPermissionsAction = {\n type: `${typeof controllerName}:disableGatorPermissions`;\n handler: GatorPermissionsController['disableGatorPermissions'];\n};\n\nexport type GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction =\n {\n type: `${typeof controllerName}:decodePermissionFromPermissionContextForOrigin`;\n handler: GatorPermissionsController['decodePermissionFromPermissionContextForOrigin'];\n };\n\n/**\n * The action which can be used to submit a revocation.\n */\nexport type GatorPermissionsControllerSubmitRevocationAction = {\n type: `${typeof controllerName}:submitRevocation`;\n handler: GatorPermissionsController['submitRevocation'];\n};\n\n/**\n * The action which can be used to add a pending revocation.\n */\nexport type GatorPermissionsControllerAddPendingRevocationAction = {\n type: `${typeof controllerName}:addPendingRevocation`;\n handler: GatorPermissionsController['addPendingRevocation'];\n};\n\n/**\n * All actions that {@link GatorPermissionsController} registers, to be called\n * externally.\n */\nexport type GatorPermissionsControllerActions =\n | GatorPermissionsControllerGetStateAction\n | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction\n | GatorPermissionsControllerEnableGatorPermissionsAction\n | GatorPermissionsControllerDisableGatorPermissionsAction\n | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction\n | GatorPermissionsControllerSubmitRevocationAction\n | GatorPermissionsControllerAddPendingRevocationAction;\n\n/**\n * All actions that {@link GatorPermissionsController} calls internally.\n *\n * SnapsController:handleRequest and SnapsController:has are allowed to be called\n * internally because they are used to fetch gator permissions from the Snap.\n */\ntype AllowedActions = HandleSnapRequest | HasSnap;\n\n/**\n * The event that {@link GatorPermissionsController} publishes when updating state.\n */\nexport type GatorPermissionsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n GatorPermissionsControllerState\n >;\n\n/**\n * All events that {@link GatorPermissionsController} publishes, to be subscribed to\n * externally.\n */\nexport type GatorPermissionsControllerEvents =\n GatorPermissionsControllerStateChangeEvent;\n\n/**\n * Events that {@link GatorPermissionsController} is allowed to subscribe to internally.\n */\ntype AllowedEvents =\n | GatorPermissionsControllerStateChangeEvent\n | TransactionControllerTransactionConfirmedEvent\n | TransactionControllerTransactionFailedEvent\n | TransactionControllerTransactionDroppedEvent;\n\n/**\n * Messenger type for the GatorPermissionsController.\n */\nexport type GatorPermissionsControllerMessenger = Messenger<\n typeof controllerName,\n GatorPermissionsControllerActions | AllowedActions,\n GatorPermissionsControllerEvents | AllowedEvents\n>;\n\n/**\n * Controller that manages gator permissions by reading from profile sync\n */\nexport default class GatorPermissionsController extends BaseController<\n typeof controllerName,\n GatorPermissionsControllerState,\n GatorPermissionsControllerMessenger\n> {\n /**\n * Creates a GatorPermissionsController instance.\n *\n * @param args - The arguments to this function.\n * @param args.messenger - Messenger used to communicate with BaseV2 controller.\n * @param args.state - Initial state to set on this controller.\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: GatorPermissionsControllerMessenger;\n state?: Partial<GatorPermissionsControllerState>;\n }) {\n super({\n name: controllerName,\n metadata: gatorPermissionsControllerMetadata,\n messenger,\n state: {\n ...getDefaultGatorPermissionsControllerState(),\n ...state,\n isFetchingGatorPermissions: false,\n },\n });\n\n this.#registerMessageHandlers();\n }\n\n #setIsFetchingGatorPermissions(isFetchingGatorPermissions: boolean) {\n this.update((state) => {\n state.isFetchingGatorPermissions = isFetchingGatorPermissions;\n });\n }\n\n #setIsGatorPermissionsEnabled(isGatorPermissionsEnabled: boolean) {\n this.update((state) => {\n state.isGatorPermissionsEnabled = isGatorPermissionsEnabled;\n });\n }\n\n #addPendingRevocationToState(txId: string, permissionContext: Hex) {\n this.update((state) => {\n state.pendingRevocations = [\n ...state.pendingRevocations,\n { txId, permissionContext },\n ];\n });\n }\n\n #removePendingRevocationFromStateByTxId(txId: string) {\n this.update((state) => {\n state.pendingRevocations = state.pendingRevocations.filter(\n (pendingRevocations) => pendingRevocations.txId !== txId,\n );\n });\n }\n\n #removePendingRevocationFromStateByPermissionContext(permissionContext: Hex) {\n this.update((state) => {\n state.pendingRevocations = state.pendingRevocations.filter(\n (pendingRevocations) =>\n pendingRevocations.permissionContext !== permissionContext,\n );\n });\n }\n\n #registerMessageHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:fetchAndUpdateGatorPermissions`,\n this.fetchAndUpdateGatorPermissions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:enableGatorPermissions`,\n this.enableGatorPermissions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:disableGatorPermissions`,\n this.disableGatorPermissions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:decodePermissionFromPermissionContextForOrigin`,\n this.decodePermissionFromPermissionContextForOrigin.bind(this),\n );\n\n const submitRevocationAction = `${controllerName}:submitRevocation`;\n\n this.messenger.registerActionHandler(\n submitRevocationAction,\n this.submitRevocation.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:addPendingRevocation`,\n this.addPendingRevocation.bind(this),\n );\n }\n\n /**\n * Asserts that the gator permissions are enabled.\n *\n * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.\n */\n #assertGatorPermissionsEnabled() {\n if (!this.state.isGatorPermissionsEnabled) {\n throw new GatorPermissionsNotEnabledError();\n }\n }\n\n /**\n * Forwards a Snap request to the SnapController.\n *\n * @param args - The request parameters.\n * @param args.snapId - The ID of the Snap of the gator permissions provider snap.\n * @param args.params - Optional parameters to pass to the snap method.\n * @returns A promise that resolves with the gator permissions.\n */\n async #handleSnapRequestToGatorPermissionsProvider({\n snapId,\n params,\n }: {\n snapId: SnapId;\n params?: Json;\n }): Promise<\n StoredGatorPermission<Signer, PermissionTypesWithCustom>[] | null\n > {\n try {\n const response = (await this.messenger.call(\n 'SnapController:handleRequest',\n {\n snapId,\n origin: 'metamask',\n handler: HandlerType.OnRpcRequest,\n request: {\n jsonrpc: '2.0',\n method:\n GatorPermissionsSnapRpcMethod.PermissionProviderGetGrantedPermissions,\n ...(params !== undefined && { params }),\n },\n },\n )) as StoredGatorPermission<Signer, PermissionTypesWithCustom>[] | null;\n\n return response;\n } catch (error) {\n controllerLog(\n 'Failed to handle snap request to gator permissions provider',\n error,\n );\n throw new GatorPermissionsProviderError({\n method:\n GatorPermissionsSnapRpcMethod.PermissionProviderGetGrantedPermissions,\n cause: error as Error,\n });\n }\n }\n\n /**\n * Sanitizes a stored gator permission by removing the fields that are not expose to MetaMask client.\n *\n * @param storedGatorPermission - The stored gator permission to sanitize.\n * @returns The sanitized stored gator permission.\n */\n #sanitizeStoredGatorPermission(\n storedGatorPermission: StoredGatorPermission<\n Signer,\n PermissionTypesWithCustom\n >,\n ): StoredGatorPermissionSanitized<Signer, PermissionTypesWithCustom> {\n const { permissionResponse } = storedGatorPermission;\n const { rules, dependencyInfo, signer, ...rest } = permissionResponse;\n return {\n ...storedGatorPermission,\n permissionResponse: {\n ...rest,\n },\n };\n }\n\n /**\n * Categorizes stored gator permissions by type and chainId.\n *\n * @param storedGatorPermissions - An array of stored gator permissions.\n * @returns The gator permissions map.\n */\n #categorizePermissionsDataByTypeAndChainId(\n storedGatorPermissions:\n | StoredGatorPermission<Signer, PermissionTypesWithCustom>[]\n | null,\n ): GatorPermissionsMap {\n if (!storedGatorPermissions) {\n return defaultGatorPermissionsMap;\n }\n\n return storedGatorPermissions.reduce(\n (gatorPermissionsMap, storedGatorPermission) => {\n const { permissionResponse } = storedGatorPermission;\n const permissionType = permissionResponse.permission.type;\n const { chainId } = permissionResponse;\n\n const sanitizedStoredGatorPermission =\n this.#sanitizeStoredGatorPermission(storedGatorPermission);\n\n switch (permissionType) {\n case 'native-token-stream':\n case 'native-token-periodic':\n case 'erc20-token-stream':\n case 'erc20-token-periodic':\n if (!gatorPermissionsMap[permissionType][chainId]) {\n gatorPermissionsMap[permissionType][chainId] = [];\n }\n\n (\n gatorPermissionsMap[permissionType][\n chainId\n ] as StoredGatorPermissionSanitized<\n Signer,\n PermissionTypesWithCustom\n >[]\n ).push(sanitizedStoredGatorPermission);\n break;\n default:\n if (!gatorPermissionsMap.other[chainId]) {\n gatorPermissionsMap.other[chainId] = [];\n }\n\n (\n gatorPermissionsMap.other[\n chainId\n ] as StoredGatorPermissionSanitized<\n Signer,\n PermissionTypesWithCustom\n >[]\n ).push(sanitizedStoredGatorPermission);\n break;\n }\n\n return gatorPermissionsMap;\n },\n {\n 'native-token-stream': {},\n 'native-token-periodic': {},\n 'erc20-token-stream': {},\n 'erc20-token-periodic': {},\n other: {},\n } as GatorPermissionsMap,\n );\n }\n\n /**\n * Gets the gator permissions map from the state.\n *\n * @returns The gator permissions map.\n */\n get gatorPermissionsMap(): GatorPermissionsMap {\n return deserializeGatorPermissionsMap(\n this.state.gatorPermissionsMapSerialized,\n );\n }\n\n /**\n * Gets the gator permissions provider snap id that is used to fetch gator permissions.\n *\n * @returns The gator permissions provider snap id.\n */\n get permissionsProviderSnapId(): SnapId {\n return this.state.gatorPermissionsProviderSnapId;\n }\n\n /**\n * Enables gator permissions for the user.\n */\n public async enableGatorPermissions() {\n this.#setIsGatorPermissionsEnabled(true);\n }\n\n /**\n * Clears the gator permissions map and disables the feature.\n */\n public async disableGatorPermissions() {\n this.update((state) => {\n state.isGatorPermissionsEnabled = false;\n state.gatorPermissionsMapSerialized = serializeGatorPermissionsMap(\n defaultGatorPermissionsMap,\n );\n });\n }\n\n /**\n * Gets the pending revocations list.\n *\n * @returns The pending revocations list.\n */\n get pendingRevocations(): { txId: string; permissionContext: Hex }[] {\n return this.state.pendingRevocations;\n }\n\n /**\n * Fetches the gator permissions from profile sync and updates the state.\n *\n * @param params - Optional parameters to pass to the snap's getGrantedPermissions method.\n * @returns A promise that resolves to the gator permissions map.\n * @throws {GatorPermissionsFetchError} If the gator permissions fetch fails.\n */\n public async fetchAndUpdateGatorPermissions(\n params?: Json,\n ): Promise<GatorPermissionsMap> {\n try {\n this.#setIsFetchingGatorPermissions(true);\n this.#assertGatorPermissionsEnabled();\n\n const permissionsData =\n await this.#handleSnapRequestToGatorPermissionsProvider({\n snapId: this.state.gatorPermissionsProviderSnapId,\n params,\n });\n\n const gatorPermissionsMap =\n this.#categorizePermissionsDataByTypeAndChainId(permissionsData);\n\n this.update((state) => {\n state.gatorPermissionsMapSerialized =\n serializeGatorPermissionsMap(gatorPermissionsMap);\n });\n\n return gatorPermissionsMap;\n } catch (error) {\n controllerLog('Failed to fetch gator permissions', error);\n throw new GatorPermissionsFetchError({\n message: 'Failed to fetch gator permissions',\n cause: error as Error,\n });\n } finally {\n this.#setIsFetchingGatorPermissions(false);\n }\n }\n\n /**\n * Decodes a permission context into a structured permission for a specific origin.\n *\n * This method validates the caller origin, decodes the provided `permissionContext`\n * into delegations, identifies the permission type from the caveat enforcers,\n * extracts the permission-specific data and expiry, and reconstructs a\n * {@link DecodedPermission} containing chainId, account addresses, signer, type and data.\n *\n * @param args - The arguments to this function.\n * @param args.origin - The caller's origin; must match the configured permissions provider Snap id.\n * @param args.chainId - Numeric EIP-155 chain id used for resolving enforcer contracts and encoding.\n * @param args.delegation - delegation representing the permission.\n * @param args.metadata - metadata included in the request.\n * @param args.metadata.justification - the justification as specified in the request metadata.\n * @param args.metadata.origin - the origin as specified in the request metadata.\n *\n * @returns A decoded permission object suitable for UI consumption and follow-up actions.\n * @throws If the origin is not allowed, the context cannot be decoded into exactly one delegation,\n * or the enforcers/terms do not match a supported permission type.\n */\n public decodePermissionFromPermissionContextForOrigin({\n origin,\n chainId,\n delegation: { caveats, delegator, delegate, authority },\n metadata: { justification, origin: specifiedOrigin },\n }: {\n origin: string;\n chainId: number;\n metadata: {\n justification: string;\n origin: string;\n };\n delegation: DelegationDetails;\n }): DecodedPermission {\n if (origin !== this.permissionsProviderSnapId) {\n throw new OriginNotAllowedError({ origin });\n }\n\n const contracts = contractsByChainId[chainId];\n\n if (!contracts) {\n throw new Error(`Contracts not found for chainId: ${chainId}`);\n }\n\n try {\n const enforcers = caveats.map((caveat) => caveat.enforcer);\n\n const permissionType = identifyPermissionByEnforcers({\n enforcers,\n contracts,\n });\n\n const { expiry, data } = getPermissionDataAndExpiry({\n contracts,\n caveats,\n permissionType,\n });\n\n const permission = reconstructDecodedPermission({\n chainId,\n permissionType,\n delegator,\n delegate,\n authority,\n expiry,\n data,\n justification,\n specifiedOrigin,\n });\n\n return permission;\n } catch (error) {\n throw new PermissionDecodingError({\n cause: error as Error,\n });\n }\n }\n\n /**\n * Submits a revocation to the gator permissions provider snap.\n *\n * @param revocationParams - The revocation parameters containing the permission context.\n * @returns A promise that resolves when the revocation is submitted successfully.\n * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.\n * @throws {GatorPermissionsProviderError} If the snap request fails.\n */\n public async submitRevocation(\n revocationParams: RevocationParams,\n ): Promise<void> {\n controllerLog('submitRevocation method called', {\n permissionContext: revocationParams.permissionContext,\n });\n\n this.#assertGatorPermissionsEnabled();\n\n try {\n const snapRequest = {\n snapId: this.state.gatorPermissionsProviderSnapId,\n origin: 'metamask',\n handler: HandlerType.OnRpcRequest,\n request: {\n jsonrpc: '2.0',\n method:\n GatorPermissionsSnapRpcMethod.PermissionProviderSubmitRevocation,\n params: revocationParams,\n },\n };\n\n const result = await this.messenger.call(\n 'SnapController:handleRequest',\n snapRequest,\n );\n\n this.#removePendingRevocationFromStateByPermissionContext(\n revocationParams.permissionContext,\n );\n\n controllerLog('Successfully submitted revocation', {\n permissionContext: revocationParams.permissionContext,\n result,\n });\n } catch (error) {\n controllerLog('Failed to submit revocation', {\n error,\n permissionContext: revocationParams.permissionContext,\n });\n\n throw new GatorPermissionsProviderError({\n method:\n GatorPermissionsSnapRpcMethod.PermissionProviderSubmitRevocation,\n cause: error as Error,\n });\n }\n }\n\n /**\n * Adds a pending revocation that will be submitted once the transaction is confirmed.\n *\n * This method sets up listeners for terminal transaction states (confirmed, failed, dropped)\n * and includes a timeout safety net to prevent memory leaks if the transaction never\n * reaches a terminal state.\n *\n * @param params - The pending revocation parameters.\n * @returns A promise that resolves when the listener is set up.\n */\n public async addPendingRevocation(\n params: PendingRevocationParams,\n ): Promise<void> {\n const { txId, permissionContext } = params;\n\n controllerLog('addPendingRevocation method called', {\n txId,\n permissionContext,\n });\n\n this.#assertGatorPermissionsEnabled();\n this.#addPendingRevocationToState(txId, permissionContext);\n\n type PendingRevocationHandlers = {\n confirmed?: (\n ...args: TransactionControllerTransactionConfirmedEvent['payload']\n ) => void;\n failed?: (\n ...args: TransactionControllerTransactionFailedEvent['payload']\n ) => void;\n dropped?: (\n ...args: TransactionControllerTransactionDroppedEvent['payload']\n ) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n };\n\n // Track handlers and timeout for cleanup\n const handlers: PendingRevocationHandlers = {\n confirmed: undefined,\n failed: undefined,\n dropped: undefined,\n timeoutId: undefined,\n };\n\n // Cleanup function to unsubscribe from all events and clear timeout\n const cleanup = (txIdToRemove: string) => {\n if (handlers.confirmed) {\n this.messenger.unsubscribe(\n 'TransactionController:transactionConfirmed',\n handlers.confirmed,\n );\n }\n if (handlers.failed) {\n this.messenger.unsubscribe(\n 'TransactionController:transactionFailed',\n handlers.failed,\n );\n }\n if (handlers.dropped) {\n this.messenger.unsubscribe(\n 'TransactionController:transactionDropped',\n handlers.dropped,\n );\n }\n if (handlers.timeoutId !== undefined) {\n clearTimeout(handlers.timeoutId);\n }\n\n // Remove the pending revocation from the state\n this.#removePendingRevocationFromStateByTxId(txIdToRemove);\n };\n\n // Handle confirmed transaction - submit revocation\n handlers.confirmed = (transactionMeta) => {\n if (transactionMeta.id === txId) {\n controllerLog('Transaction confirmed, submitting revocation', {\n txId,\n permissionContext,\n });\n\n this.submitRevocation({ permissionContext }).catch((error) => {\n controllerLog(\n 'Failed to submit revocation after transaction confirmed',\n {\n txId,\n permissionContext,\n error,\n },\n );\n });\n\n cleanup(transactionMeta.id);\n }\n };\n\n // Handle failed transaction - cleanup without submitting revocation\n handlers.failed = (payload) => {\n if (payload.transactionMeta.id === txId) {\n controllerLog('Transaction failed, cleaning up revocation listener', {\n txId,\n permissionContext,\n error: payload.error,\n });\n\n cleanup(payload.transactionMeta.id);\n }\n };\n\n // Handle dropped transaction - cleanup without submitting revocation\n handlers.dropped = (payload) => {\n if (payload.transactionMeta.id === txId) {\n controllerLog('Transaction dropped, cleaning up revocation listener', {\n txId,\n permissionContext,\n });\n\n cleanup(payload.transactionMeta.id);\n }\n };\n\n // Subscribe to terminal transaction events\n this.messenger.subscribe(\n 'TransactionController:transactionConfirmed',\n handlers.confirmed,\n );\n this.messenger.subscribe(\n 'TransactionController:transactionFailed',\n handlers.failed,\n );\n this.messenger.subscribe(\n 'TransactionController:transactionDropped',\n handlers.dropped,\n );\n\n // Set timeout as safety net to prevent memory leaks\n handlers.timeoutId = setTimeout(() => {\n controllerLog('Pending revocation timed out, cleaning up listeners', {\n txId,\n permissionContext,\n });\n cleanup(txId);\n }, PENDING_REVOCATION_TIMEOUT);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,+EAAqF;AAA5E,yJAAA,OAAO,OAA8B;AAC9C,qCAGiB;AAFf,qHAAA,4BAA4B,OAAA;AAC5B,uHAAA,8BAA8B,OAAA","sourcesContent":["export { default as GatorPermissionsController } from './GatorPermissionsController';\nexport {\n serializeGatorPermissionsMap,\n deserializeGatorPermissionsMap,\n} from './utils';\nexport type {\n GatorPermissionsControllerState,\n GatorPermissionsControllerMessenger,\n GatorPermissionsControllerGetStateAction,\n GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction,\n GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction,\n GatorPermissionsControllerEnableGatorPermissionsAction,\n GatorPermissionsControllerDisableGatorPermissionsAction,\n GatorPermissionsControllerActions,\n GatorPermissionsControllerEvents,\n GatorPermissionsControllerStateChangeEvent,\n} from './GatorPermissionsController';\nexport type { DecodedPermission } from './decodePermission';\nexport type {\n GatorPermissionsControllerErrorCode,\n GatorPermissionsSnapRpcMethod,\n CustomPermission,\n PermissionTypesWithCustom,\n PermissionRequest,\n PermissionResponse,\n PermissionResponseSanitized,\n StoredGatorPermission,\n StoredGatorPermissionSanitized,\n GatorPermissionsMap,\n SupportedGatorPermissionType,\n GatorPermissionsMapByPermissionType,\n GatorPermissionsListByPermissionTypeAndChainId,\n DelegationDetails,\n} from './types';\n\nexport type {\n NativeTokenStreamPermission,\n NativeTokenPeriodicPermission,\n Erc20TokenStreamPermission,\n Erc20TokenPeriodicPermission,\n AccountSigner,\n WalletSigner,\n Signer,\n MetaMaskBasePermissionData,\n} from '@metamask/7715-permission-types';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,+EAAqF;AAA5E,yJAAA,OAAO,OAA8B;AAC9C,qCAGiB;AAFf,qHAAA,4BAA4B,OAAA;AAC5B,uHAAA,8BAA8B,OAAA","sourcesContent":["export { default as GatorPermissionsController } from './GatorPermissionsController';\nexport {\n serializeGatorPermissionsMap,\n deserializeGatorPermissionsMap,\n} from './utils';\nexport type {\n GatorPermissionsControllerState,\n GatorPermissionsControllerMessenger,\n GatorPermissionsControllerGetStateAction,\n GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction,\n GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction,\n GatorPermissionsControllerEnableGatorPermissionsAction,\n GatorPermissionsControllerDisableGatorPermissionsAction,\n GatorPermissionsControllerSubmitRevocationAction,\n GatorPermissionsControllerAddPendingRevocationAction,\n GatorPermissionsControllerActions,\n GatorPermissionsControllerEvents,\n GatorPermissionsControllerStateChangeEvent,\n} from './GatorPermissionsController';\nexport type { DecodedPermission } from './decodePermission';\nexport type {\n GatorPermissionsControllerErrorCode,\n GatorPermissionsSnapRpcMethod,\n CustomPermission,\n PermissionTypesWithCustom,\n PermissionRequest,\n PermissionResponse,\n PermissionResponseSanitized,\n StoredGatorPermission,\n StoredGatorPermissionSanitized,\n GatorPermissionsMap,\n SupportedGatorPermissionType,\n GatorPermissionsMapByPermissionType,\n GatorPermissionsListByPermissionTypeAndChainId,\n DelegationDetails,\n RevocationParams,\n} from './types';\n\nexport type {\n NativeTokenStreamPermission,\n NativeTokenPeriodicPermission,\n Erc20TokenStreamPermission,\n Erc20TokenPeriodicPermission,\n AccountSigner,\n WalletSigner,\n Signer,\n MetaMaskBasePermissionData,\n} from '@metamask/7715-permission-types';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { default as GatorPermissionsController } from "./GatorPermissionsController.cjs";
2
2
  export { serializeGatorPermissionsMap, deserializeGatorPermissionsMap, } from "./utils.cjs";
3
- export type { GatorPermissionsControllerState, GatorPermissionsControllerMessenger, GatorPermissionsControllerGetStateAction, GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction, GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction, GatorPermissionsControllerEnableGatorPermissionsAction, GatorPermissionsControllerDisableGatorPermissionsAction, GatorPermissionsControllerActions, GatorPermissionsControllerEvents, GatorPermissionsControllerStateChangeEvent, } from "./GatorPermissionsController.cjs";
3
+ export type { GatorPermissionsControllerState, GatorPermissionsControllerMessenger, GatorPermissionsControllerGetStateAction, GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction, GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction, GatorPermissionsControllerEnableGatorPermissionsAction, GatorPermissionsControllerDisableGatorPermissionsAction, GatorPermissionsControllerSubmitRevocationAction, GatorPermissionsControllerAddPendingRevocationAction, GatorPermissionsControllerActions, GatorPermissionsControllerEvents, GatorPermissionsControllerStateChangeEvent, } from "./GatorPermissionsController.cjs";
4
4
  export type { DecodedPermission } from "./decodePermission/index.cjs";
5
- export type { GatorPermissionsControllerErrorCode, GatorPermissionsSnapRpcMethod, CustomPermission, PermissionTypesWithCustom, PermissionRequest, PermissionResponse, PermissionResponseSanitized, StoredGatorPermission, StoredGatorPermissionSanitized, GatorPermissionsMap, SupportedGatorPermissionType, GatorPermissionsMapByPermissionType, GatorPermissionsListByPermissionTypeAndChainId, DelegationDetails, } from "./types.cjs";
5
+ export type { GatorPermissionsControllerErrorCode, GatorPermissionsSnapRpcMethod, CustomPermission, PermissionTypesWithCustom, PermissionRequest, PermissionResponse, PermissionResponseSanitized, StoredGatorPermission, StoredGatorPermissionSanitized, GatorPermissionsMap, SupportedGatorPermissionType, GatorPermissionsMapByPermissionType, GatorPermissionsListByPermissionTypeAndChainId, DelegationDetails, RevocationParams, } from "./types.cjs";
6
6
  export type { NativeTokenStreamPermission, NativeTokenPeriodicPermission, Erc20TokenStreamPermission, Erc20TokenPeriodicPermission, AccountSigner, WalletSigner, Signer, MetaMaskBasePermissionData, } from "@metamask/7715-permission-types";
7
7
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,yCAAqC;AACrF,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAC/B,oBAAgB;AACjB,YAAY,EACV,+BAA+B,EAC/B,mCAAmC,EACnC,wCAAwC,EACxC,8EAA8E,EAC9E,8DAA8D,EAC9D,sDAAsD,EACtD,uDAAuD,EACvD,iCAAiC,EACjC,gCAAgC,EAChC,0CAA0C,GAC3C,yCAAqC;AACtC,YAAY,EAAE,iBAAiB,EAAE,qCAA2B;AAC5D,YAAY,EACV,mCAAmC,EACnC,6BAA6B,EAC7B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,mBAAmB,EACnB,4BAA4B,EAC5B,mCAAmC,EACnC,8CAA8C,EAC9C,iBAAiB,GAClB,oBAAgB;AAEjB,YAAY,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAC5B,aAAa,EACb,YAAY,EACZ,MAAM,EACN,0BAA0B,GAC3B,wCAAwC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,yCAAqC;AACrF,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAC/B,oBAAgB;AACjB,YAAY,EACV,+BAA+B,EAC/B,mCAAmC,EACnC,wCAAwC,EACxC,8EAA8E,EAC9E,8DAA8D,EAC9D,sDAAsD,EACtD,uDAAuD,EACvD,gDAAgD,EAChD,oDAAoD,EACpD,iCAAiC,EACjC,gCAAgC,EAChC,0CAA0C,GAC3C,yCAAqC;AACtC,YAAY,EAAE,iBAAiB,EAAE,qCAA2B;AAC5D,YAAY,EACV,mCAAmC,EACnC,6BAA6B,EAC7B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,mBAAmB,EACnB,4BAA4B,EAC5B,mCAAmC,EACnC,8CAA8C,EAC9C,iBAAiB,EACjB,gBAAgB,GACjB,oBAAgB;AAEjB,YAAY,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAC5B,aAAa,EACb,YAAY,EACZ,MAAM,EACN,0BAA0B,GAC3B,wCAAwC"}
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { default as GatorPermissionsController } from "./GatorPermissionsController.mjs";
2
2
  export { serializeGatorPermissionsMap, deserializeGatorPermissionsMap, } from "./utils.mjs";
3
- export type { GatorPermissionsControllerState, GatorPermissionsControllerMessenger, GatorPermissionsControllerGetStateAction, GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction, GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction, GatorPermissionsControllerEnableGatorPermissionsAction, GatorPermissionsControllerDisableGatorPermissionsAction, GatorPermissionsControllerActions, GatorPermissionsControllerEvents, GatorPermissionsControllerStateChangeEvent, } from "./GatorPermissionsController.mjs";
3
+ export type { GatorPermissionsControllerState, GatorPermissionsControllerMessenger, GatorPermissionsControllerGetStateAction, GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction, GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction, GatorPermissionsControllerEnableGatorPermissionsAction, GatorPermissionsControllerDisableGatorPermissionsAction, GatorPermissionsControllerSubmitRevocationAction, GatorPermissionsControllerAddPendingRevocationAction, GatorPermissionsControllerActions, GatorPermissionsControllerEvents, GatorPermissionsControllerStateChangeEvent, } from "./GatorPermissionsController.mjs";
4
4
  export type { DecodedPermission } from "./decodePermission/index.mjs";
5
- export type { GatorPermissionsControllerErrorCode, GatorPermissionsSnapRpcMethod, CustomPermission, PermissionTypesWithCustom, PermissionRequest, PermissionResponse, PermissionResponseSanitized, StoredGatorPermission, StoredGatorPermissionSanitized, GatorPermissionsMap, SupportedGatorPermissionType, GatorPermissionsMapByPermissionType, GatorPermissionsListByPermissionTypeAndChainId, DelegationDetails, } from "./types.mjs";
5
+ export type { GatorPermissionsControllerErrorCode, GatorPermissionsSnapRpcMethod, CustomPermission, PermissionTypesWithCustom, PermissionRequest, PermissionResponse, PermissionResponseSanitized, StoredGatorPermission, StoredGatorPermissionSanitized, GatorPermissionsMap, SupportedGatorPermissionType, GatorPermissionsMapByPermissionType, GatorPermissionsListByPermissionTypeAndChainId, DelegationDetails, RevocationParams, } from "./types.mjs";
6
6
  export type { NativeTokenStreamPermission, NativeTokenPeriodicPermission, Erc20TokenStreamPermission, Erc20TokenPeriodicPermission, AccountSigner, WalletSigner, Signer, MetaMaskBasePermissionData, } from "@metamask/7715-permission-types";
7
7
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,yCAAqC;AACrF,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAC/B,oBAAgB;AACjB,YAAY,EACV,+BAA+B,EAC/B,mCAAmC,EACnC,wCAAwC,EACxC,8EAA8E,EAC9E,8DAA8D,EAC9D,sDAAsD,EACtD,uDAAuD,EACvD,iCAAiC,EACjC,gCAAgC,EAChC,0CAA0C,GAC3C,yCAAqC;AACtC,YAAY,EAAE,iBAAiB,EAAE,qCAA2B;AAC5D,YAAY,EACV,mCAAmC,EACnC,6BAA6B,EAC7B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,mBAAmB,EACnB,4BAA4B,EAC5B,mCAAmC,EACnC,8CAA8C,EAC9C,iBAAiB,GAClB,oBAAgB;AAEjB,YAAY,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAC5B,aAAa,EACb,YAAY,EACZ,MAAM,EACN,0BAA0B,GAC3B,wCAAwC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,yCAAqC;AACrF,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAC/B,oBAAgB;AACjB,YAAY,EACV,+BAA+B,EAC/B,mCAAmC,EACnC,wCAAwC,EACxC,8EAA8E,EAC9E,8DAA8D,EAC9D,sDAAsD,EACtD,uDAAuD,EACvD,gDAAgD,EAChD,oDAAoD,EACpD,iCAAiC,EACjC,gCAAgC,EAChC,0CAA0C,GAC3C,yCAAqC;AACtC,YAAY,EAAE,iBAAiB,EAAE,qCAA2B;AAC5D,YAAY,EACV,mCAAmC,EACnC,6BAA6B,EAC7B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,mBAAmB,EACnB,4BAA4B,EAC5B,mCAAmC,EACnC,8CAA8C,EAC9C,iBAAiB,EACjB,gBAAgB,GACjB,oBAAgB;AAEjB,YAAY,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAC5B,aAAa,EACb,YAAY,EACZ,MAAM,EACN,0BAA0B,GAC3B,wCAAwC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,yCAAqC;AACrF,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC/B,oBAAgB","sourcesContent":["export { default as GatorPermissionsController } from './GatorPermissionsController';\nexport {\n serializeGatorPermissionsMap,\n deserializeGatorPermissionsMap,\n} from './utils';\nexport type {\n GatorPermissionsControllerState,\n GatorPermissionsControllerMessenger,\n GatorPermissionsControllerGetStateAction,\n GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction,\n GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction,\n GatorPermissionsControllerEnableGatorPermissionsAction,\n GatorPermissionsControllerDisableGatorPermissionsAction,\n GatorPermissionsControllerActions,\n GatorPermissionsControllerEvents,\n GatorPermissionsControllerStateChangeEvent,\n} from './GatorPermissionsController';\nexport type { DecodedPermission } from './decodePermission';\nexport type {\n GatorPermissionsControllerErrorCode,\n GatorPermissionsSnapRpcMethod,\n CustomPermission,\n PermissionTypesWithCustom,\n PermissionRequest,\n PermissionResponse,\n PermissionResponseSanitized,\n StoredGatorPermission,\n StoredGatorPermissionSanitized,\n GatorPermissionsMap,\n SupportedGatorPermissionType,\n GatorPermissionsMapByPermissionType,\n GatorPermissionsListByPermissionTypeAndChainId,\n DelegationDetails,\n} from './types';\n\nexport type {\n NativeTokenStreamPermission,\n NativeTokenPeriodicPermission,\n Erc20TokenStreamPermission,\n Erc20TokenPeriodicPermission,\n AccountSigner,\n WalletSigner,\n Signer,\n MetaMaskBasePermissionData,\n} from '@metamask/7715-permission-types';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,yCAAqC;AACrF,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC/B,oBAAgB","sourcesContent":["export { default as GatorPermissionsController } from './GatorPermissionsController';\nexport {\n serializeGatorPermissionsMap,\n deserializeGatorPermissionsMap,\n} from './utils';\nexport type {\n GatorPermissionsControllerState,\n GatorPermissionsControllerMessenger,\n GatorPermissionsControllerGetStateAction,\n GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction,\n GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction,\n GatorPermissionsControllerEnableGatorPermissionsAction,\n GatorPermissionsControllerDisableGatorPermissionsAction,\n GatorPermissionsControllerSubmitRevocationAction,\n GatorPermissionsControllerAddPendingRevocationAction,\n GatorPermissionsControllerActions,\n GatorPermissionsControllerEvents,\n GatorPermissionsControllerStateChangeEvent,\n} from './GatorPermissionsController';\nexport type { DecodedPermission } from './decodePermission';\nexport type {\n GatorPermissionsControllerErrorCode,\n GatorPermissionsSnapRpcMethod,\n CustomPermission,\n PermissionTypesWithCustom,\n PermissionRequest,\n PermissionResponse,\n PermissionResponseSanitized,\n StoredGatorPermission,\n StoredGatorPermissionSanitized,\n GatorPermissionsMap,\n SupportedGatorPermissionType,\n GatorPermissionsMapByPermissionType,\n GatorPermissionsListByPermissionTypeAndChainId,\n DelegationDetails,\n RevocationParams,\n} from './types';\n\nexport type {\n NativeTokenStreamPermission,\n NativeTokenPeriodicPermission,\n Erc20TokenStreamPermission,\n Erc20TokenPeriodicPermission,\n AccountSigner,\n WalletSigner,\n Signer,\n MetaMaskBasePermissionData,\n} from '@metamask/7715-permission-types';\n"]}