@metamask/gator-permissions-controller 0.6.0 → 0.8.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/dist/GatorPermissionsController.cjs +111 -61
  3. package/dist/GatorPermissionsController.cjs.map +1 -1
  4. package/dist/GatorPermissionsController.d.cts +40 -7
  5. package/dist/GatorPermissionsController.d.cts.map +1 -1
  6. package/dist/GatorPermissionsController.d.mts +40 -7
  7. package/dist/GatorPermissionsController.d.mts.map +1 -1
  8. package/dist/GatorPermissionsController.mjs +109 -59
  9. package/dist/GatorPermissionsController.mjs.map +1 -1
  10. package/dist/constants.cjs +9 -0
  11. package/dist/constants.cjs.map +1 -0
  12. package/dist/constants.d.cts +6 -0
  13. package/dist/constants.d.cts.map +1 -0
  14. package/dist/constants.d.mts +6 -0
  15. package/dist/constants.d.mts.map +1 -0
  16. package/dist/constants.mjs +6 -0
  17. package/dist/constants.mjs.map +1 -0
  18. package/dist/decodePermission/decodePermission.cjs +56 -11
  19. package/dist/decodePermission/decodePermission.cjs.map +1 -1
  20. package/dist/decodePermission/decodePermission.d.cts +1 -1
  21. package/dist/decodePermission/decodePermission.d.cts.map +1 -1
  22. package/dist/decodePermission/decodePermission.d.mts +1 -1
  23. package/dist/decodePermission/decodePermission.d.mts.map +1 -1
  24. package/dist/decodePermission/decodePermission.mjs +57 -12
  25. package/dist/decodePermission/decodePermission.mjs.map +1 -1
  26. package/dist/decodePermission/utils.cjs +36 -24
  27. package/dist/decodePermission/utils.cjs.map +1 -1
  28. package/dist/decodePermission/utils.d.cts +5 -4
  29. package/dist/decodePermission/utils.d.cts.map +1 -1
  30. package/dist/decodePermission/utils.d.mts +5 -4
  31. package/dist/decodePermission/utils.d.mts.map +1 -1
  32. package/dist/decodePermission/utils.mjs +36 -24
  33. package/dist/decodePermission/utils.mjs.map +1 -1
  34. package/dist/index.cjs +3 -1
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +2 -1
  37. package/dist/index.d.cts.map +1 -1
  38. package/dist/index.d.mts +2 -1
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +1 -0
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/test/mocks.cjs +5 -5
  43. package/dist/test/mocks.cjs.map +1 -1
  44. package/dist/test/mocks.mjs +5 -5
  45. package/dist/test/mocks.mjs.map +1 -1
  46. package/dist/types.cjs.map +1 -1
  47. package/dist/types.d.cts +6 -3
  48. package/dist/types.d.cts.map +1 -1
  49. package/dist/types.d.mts +6 -3
  50. package/dist/types.d.mts.map +1 -1
  51. package/dist/types.mjs.map +1 -1
  52. package/package.json +4 -8
@@ -6,13 +6,8 @@ import type { SnapId } from "@metamask/snaps-sdk";
6
6
  import type { TransactionControllerTransactionApprovedEvent, TransactionControllerTransactionConfirmedEvent, TransactionControllerTransactionDroppedEvent, TransactionControllerTransactionFailedEvent, TransactionControllerTransactionRejectedEvent } from "@metamask/transaction-controller";
7
7
  import type { Hex, Json } from "@metamask/utils";
8
8
  import type { DecodedPermission } from "./decodePermission/index.cjs";
9
- import { type GatorPermissionsMap, type DelegationDetails, type RevocationParams, type PendingRevocationParams } from "./types.cjs";
9
+ import type { GatorPermissionsMap, DelegationDetails, RevocationParams, PendingRevocationParams } from "./types.cjs";
10
10
  declare const controllerName = "GatorPermissionsController";
11
- /**
12
- * Delegation framework version used to select the correct deployed enforcer
13
- * contract addresses from `@metamask/delegation-deployments`.
14
- */
15
- export declare const DELEGATION_FRAMEWORK_VERSION = "1.3.0";
16
11
  /**
17
12
  * State shape for GatorPermissionsController
18
13
  */
@@ -96,11 +91,26 @@ export type GatorPermissionsControllerAddPendingRevocationAction = {
96
91
  type: `${typeof controllerName}:addPendingRevocation`;
97
92
  handler: GatorPermissionsController['addPendingRevocation'];
98
93
  };
94
+ /**
95
+ * The action which can be used to submit a revocation directly without requiring
96
+ * an on-chain transaction (for already-disabled delegations).
97
+ */
98
+ export type GatorPermissionsControllerSubmitDirectRevocationAction = {
99
+ type: `${typeof controllerName}:submitDirectRevocation`;
100
+ handler: GatorPermissionsController['submitDirectRevocation'];
101
+ };
102
+ /**
103
+ * The action which can be used to check if a permission context is pending revocation.
104
+ */
105
+ export type GatorPermissionsControllerIsPendingRevocationAction = {
106
+ type: `${typeof controllerName}:isPendingRevocation`;
107
+ handler: GatorPermissionsController['isPendingRevocation'];
108
+ };
99
109
  /**
100
110
  * All actions that {@link GatorPermissionsController} registers, to be called
101
111
  * externally.
102
112
  */
103
- export type GatorPermissionsControllerActions = GatorPermissionsControllerGetStateAction | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction | GatorPermissionsControllerEnableGatorPermissionsAction | GatorPermissionsControllerDisableGatorPermissionsAction | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction | GatorPermissionsControllerSubmitRevocationAction | GatorPermissionsControllerAddPendingRevocationAction;
113
+ export type GatorPermissionsControllerActions = GatorPermissionsControllerGetStateAction | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction | GatorPermissionsControllerEnableGatorPermissionsAction | GatorPermissionsControllerDisableGatorPermissionsAction | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction | GatorPermissionsControllerSubmitRevocationAction | GatorPermissionsControllerAddPendingRevocationAction | GatorPermissionsControllerSubmitDirectRevocationAction | GatorPermissionsControllerIsPendingRevocationAction;
104
114
  /**
105
115
  * All actions that {@link GatorPermissionsController} calls internally.
106
116
  *
@@ -234,6 +244,29 @@ export default class GatorPermissionsController extends BaseController<typeof co
234
244
  * @returns A promise that resolves when the listener is set up.
235
245
  */
236
246
  addPendingRevocation(params: PendingRevocationParams): Promise<void>;
247
+ /**
248
+ * Submits a revocation directly without requiring an on-chain transaction.
249
+ * Used for already-disabled delegations that don't require an on-chain transaction.
250
+ *
251
+ * This method:
252
+ * 1. Adds the permission context to pending revocations state (disables UI button)
253
+ * 2. Immediately calls submitRevocation to remove from snap storage
254
+ * 3. On success, removes from pending revocations state (re-enables UI button)
255
+ * 4. On failure, keeps in pending revocations so UI can show error/retry state
256
+ *
257
+ * @param params - The revocation parameters containing the permission context.
258
+ * @returns A promise that resolves when the revocation is submitted successfully.
259
+ * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.
260
+ * @throws {GatorPermissionsProviderError} If the snap request fails.
261
+ */
262
+ submitDirectRevocation(params: RevocationParams): Promise<void>;
263
+ /**
264
+ * Checks if a permission context is in the pending revocations list.
265
+ *
266
+ * @param permissionContext - The permission context to check.
267
+ * @returns `true` if the permission context is pending revocation, `false` otherwise.
268
+ */
269
+ isPendingRevocation(permissionContext: Hex): boolean;
237
270
  }
238
271
  export {};
239
272
  //# sourceMappingURL=GatorPermissionsController.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GatorPermissionsController.d.cts","sourceRoot":"","sources":["../src/GatorPermissionsController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GatorPermissionsController.d.cts","sourceRoot":"","sources":["../src/GatorPermissionsController.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,8 @@ import type { SnapId } from "@metamask/snaps-sdk";
6
6
  import type { TransactionControllerTransactionApprovedEvent, TransactionControllerTransactionConfirmedEvent, TransactionControllerTransactionDroppedEvent, TransactionControllerTransactionFailedEvent, TransactionControllerTransactionRejectedEvent } from "@metamask/transaction-controller";
7
7
  import type { Hex, Json } from "@metamask/utils";
8
8
  import type { DecodedPermission } from "./decodePermission/index.mjs";
9
- import { type GatorPermissionsMap, type DelegationDetails, type RevocationParams, type PendingRevocationParams } from "./types.mjs";
9
+ import type { GatorPermissionsMap, DelegationDetails, RevocationParams, PendingRevocationParams } from "./types.mjs";
10
10
  declare const controllerName = "GatorPermissionsController";
11
- /**
12
- * Delegation framework version used to select the correct deployed enforcer
13
- * contract addresses from `@metamask/delegation-deployments`.
14
- */
15
- export declare const DELEGATION_FRAMEWORK_VERSION = "1.3.0";
16
11
  /**
17
12
  * State shape for GatorPermissionsController
18
13
  */
@@ -96,11 +91,26 @@ export type GatorPermissionsControllerAddPendingRevocationAction = {
96
91
  type: `${typeof controllerName}:addPendingRevocation`;
97
92
  handler: GatorPermissionsController['addPendingRevocation'];
98
93
  };
94
+ /**
95
+ * The action which can be used to submit a revocation directly without requiring
96
+ * an on-chain transaction (for already-disabled delegations).
97
+ */
98
+ export type GatorPermissionsControllerSubmitDirectRevocationAction = {
99
+ type: `${typeof controllerName}:submitDirectRevocation`;
100
+ handler: GatorPermissionsController['submitDirectRevocation'];
101
+ };
102
+ /**
103
+ * The action which can be used to check if a permission context is pending revocation.
104
+ */
105
+ export type GatorPermissionsControllerIsPendingRevocationAction = {
106
+ type: `${typeof controllerName}:isPendingRevocation`;
107
+ handler: GatorPermissionsController['isPendingRevocation'];
108
+ };
99
109
  /**
100
110
  * All actions that {@link GatorPermissionsController} registers, to be called
101
111
  * externally.
102
112
  */
103
- export type GatorPermissionsControllerActions = GatorPermissionsControllerGetStateAction | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction | GatorPermissionsControllerEnableGatorPermissionsAction | GatorPermissionsControllerDisableGatorPermissionsAction | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction | GatorPermissionsControllerSubmitRevocationAction | GatorPermissionsControllerAddPendingRevocationAction;
113
+ export type GatorPermissionsControllerActions = GatorPermissionsControllerGetStateAction | GatorPermissionsControllerFetchAndUpdateGatorPermissionsAction | GatorPermissionsControllerEnableGatorPermissionsAction | GatorPermissionsControllerDisableGatorPermissionsAction | GatorPermissionsControllerDecodePermissionFromPermissionContextForOriginAction | GatorPermissionsControllerSubmitRevocationAction | GatorPermissionsControllerAddPendingRevocationAction | GatorPermissionsControllerSubmitDirectRevocationAction | GatorPermissionsControllerIsPendingRevocationAction;
104
114
  /**
105
115
  * All actions that {@link GatorPermissionsController} calls internally.
106
116
  *
@@ -234,6 +244,29 @@ export default class GatorPermissionsController extends BaseController<typeof co
234
244
  * @returns A promise that resolves when the listener is set up.
235
245
  */
236
246
  addPendingRevocation(params: PendingRevocationParams): Promise<void>;
247
+ /**
248
+ * Submits a revocation directly without requiring an on-chain transaction.
249
+ * Used for already-disabled delegations that don't require an on-chain transaction.
250
+ *
251
+ * This method:
252
+ * 1. Adds the permission context to pending revocations state (disables UI button)
253
+ * 2. Immediately calls submitRevocation to remove from snap storage
254
+ * 3. On success, removes from pending revocations state (re-enables UI button)
255
+ * 4. On failure, keeps in pending revocations so UI can show error/retry state
256
+ *
257
+ * @param params - The revocation parameters containing the permission context.
258
+ * @returns A promise that resolves when the revocation is submitted successfully.
259
+ * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.
260
+ * @throws {GatorPermissionsProviderError} If the snap request fails.
261
+ */
262
+ submitDirectRevocation(params: RevocationParams): Promise<void>;
263
+ /**
264
+ * Checks if a permission context is in the pending revocations list.
265
+ *
266
+ * @param permissionContext - The permission context to check.
267
+ * @returns `true` if the permission context is pending revocation, `false` otherwise.
268
+ */
269
+ isPendingRevocation(permissionContext: Hex): boolean;
237
270
  }
238
271
  export {};
239
272
  //# 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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"}
@@ -7,6 +7,7 @@ var _GatorPermissionsController_instances, _GatorPermissionsController_setIsFetc
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";
10
+ import { DELEGATION_FRAMEWORK_VERSION } from "./constants.mjs";
10
11
  import { getPermissionDataAndExpiry, identifyPermissionByEnforcers, reconstructDecodedPermission } from "./decodePermission/index.mjs";
11
12
  import { GatorPermissionsFetchError, GatorPermissionsNotEnabledError, GatorPermissionsProviderError, OriginNotAllowedError, PermissionDecodingError } from "./errors.mjs";
12
13
  import { controllerLog } from "./logger.mjs";
@@ -17,18 +18,16 @@ import { deserializeGatorPermissionsMap, serializeGatorPermissionsMap } from "./
17
18
  const controllerName = 'GatorPermissionsController';
18
19
  // Default value for the gator permissions provider snap id
19
20
  const defaultGatorPermissionsProviderSnapId = 'npm:@metamask/gator-permissions-snap';
20
- const defaultGatorPermissionsMap = {
21
- 'native-token-stream': {},
22
- 'native-token-periodic': {},
23
- 'erc20-token-stream': {},
24
- 'erc20-token-periodic': {},
25
- other: {},
21
+ const createEmptyGatorPermissionsMap = () => {
22
+ return {
23
+ 'erc20-token-revocation': {},
24
+ 'native-token-stream': {},
25
+ 'native-token-periodic': {},
26
+ 'erc20-token-stream': {},
27
+ 'erc20-token-periodic': {},
28
+ other: {},
29
+ };
26
30
  };
27
- /**
28
- * Delegation framework version used to select the correct deployed enforcer
29
- * contract addresses from `@metamask/delegation-deployments`.
30
- */
31
- export const DELEGATION_FRAMEWORK_VERSION = '1.3.0';
32
31
  /**
33
32
  * Timeout duration for pending revocations (2 hours in milliseconds).
34
33
  * After this time, event listeners will be cleaned up to prevent memory leaks.
@@ -78,7 +77,7 @@ const gatorPermissionsControllerMetadata = {
78
77
  export function getDefaultGatorPermissionsControllerState() {
79
78
  return {
80
79
  isGatorPermissionsEnabled: false,
81
- gatorPermissionsMapSerialized: serializeGatorPermissionsMap(defaultGatorPermissionsMap),
80
+ gatorPermissionsMapSerialized: serializeGatorPermissionsMap(createEmptyGatorPermissionsMap()),
82
81
  isFetchingGatorPermissions: false,
83
82
  gatorPermissionsProviderSnapId: defaultGatorPermissionsProviderSnapId,
84
83
  pendingRevocations: [],
@@ -137,7 +136,7 @@ class GatorPermissionsController extends BaseController {
137
136
  async disableGatorPermissions() {
138
137
  this.update((state) => {
139
138
  state.isGatorPermissionsEnabled = false;
140
- state.gatorPermissionsMapSerialized = serializeGatorPermissionsMap(defaultGatorPermissionsMap);
139
+ state.gatorPermissionsMapSerialized = serializeGatorPermissionsMap(createEmptyGatorPermissionsMap());
141
140
  });
142
141
  }
143
142
  /**
@@ -252,25 +251,39 @@ class GatorPermissionsController extends BaseController {
252
251
  permissionContext: revocationParams.permissionContext,
253
252
  });
254
253
  __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_assertGatorPermissionsEnabled).call(this);
254
+ const snapRequest = {
255
+ snapId: this.state.gatorPermissionsProviderSnapId,
256
+ origin: 'metamask',
257
+ handler: HandlerType.OnRpcRequest,
258
+ request: {
259
+ jsonrpc: '2.0',
260
+ method: GatorPermissionsSnapRpcMethod.PermissionProviderSubmitRevocation,
261
+ params: revocationParams,
262
+ },
263
+ };
255
264
  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
265
  const result = await this.messenger.call('SnapController:handleRequest', snapRequest);
267
- __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext).call(this, revocationParams.permissionContext);
266
+ // Refresh list first (permission removed from list)
267
+ await this.fetchAndUpdateGatorPermissions({ isRevoked: false });
268
268
  controllerLog('Successfully submitted revocation', {
269
269
  permissionContext: revocationParams.permissionContext,
270
270
  result,
271
271
  });
272
272
  }
273
273
  catch (error) {
274
+ // If it's a GatorPermissionsFetchError, revocation succeeded but refresh failed
275
+ if (error instanceof GatorPermissionsFetchError) {
276
+ controllerLog('Revocation submitted successfully but failed to refresh permissions list', {
277
+ error,
278
+ permissionContext: revocationParams.permissionContext,
279
+ });
280
+ // Wrap with a more specific message indicating revocation succeeded
281
+ throw new GatorPermissionsFetchError({
282
+ message: 'Failed to refresh permissions list after successful revocation',
283
+ cause: error,
284
+ });
285
+ }
286
+ // Otherwise, revocation failed - wrap in provider error
274
287
  controllerLog('Failed to submit revocation', {
275
288
  error,
276
289
  permissionContext: revocationParams.permissionContext,
@@ -280,6 +293,9 @@ class GatorPermissionsController extends BaseController {
280
293
  cause: error,
281
294
  });
282
295
  }
296
+ finally {
297
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext).call(this, revocationParams.permissionContext);
298
+ }
283
299
  }
284
300
  /**
285
301
  * Adds a pending revocation that will be submitted once the transaction is confirmed.
@@ -314,6 +330,16 @@ class GatorPermissionsController extends BaseController {
314
330
  dropped: undefined,
315
331
  timeoutId: undefined,
316
332
  };
333
+ // Helper to refresh permissions after transaction state change
334
+ const refreshPermissions = (context) => {
335
+ this.fetchAndUpdateGatorPermissions({ isRevoked: false }).catch((error) => {
336
+ controllerLog(`Failed to refresh permissions after ${context}`, {
337
+ txId,
338
+ permissionContext,
339
+ error,
340
+ });
341
+ });
342
+ };
317
343
  // Helper to unsubscribe from approval/rejection events after decision is made
318
344
  const cleanupApprovalHandlers = () => {
319
345
  if (handlers.approved) {
@@ -375,13 +401,15 @@ class GatorPermissionsController extends BaseController {
375
401
  txId,
376
402
  permissionContext,
377
403
  });
378
- this.submitRevocation({ permissionContext }).catch((error) => {
404
+ this.submitRevocation({ permissionContext })
405
+ .catch((error) => {
379
406
  controllerLog('Failed to submit revocation after transaction confirmed', {
380
407
  txId,
381
408
  permissionContext,
382
409
  error,
383
410
  });
384
- });
411
+ })
412
+ .finally(() => refreshPermissions('transaction confirmed'));
385
413
  cleanup(transactionMeta.id);
386
414
  }
387
415
  };
@@ -394,6 +422,7 @@ class GatorPermissionsController extends BaseController {
394
422
  error: payload.error,
395
423
  });
396
424
  cleanup(payload.transactionMeta.id);
425
+ refreshPermissions('transaction failed');
397
426
  }
398
427
  };
399
428
  // Handle dropped transaction - cleanup without submitting revocation
@@ -404,6 +433,7 @@ class GatorPermissionsController extends BaseController {
404
433
  permissionContext,
405
434
  });
406
435
  cleanup(payload.transactionMeta.id);
436
+ refreshPermissions('transaction dropped');
407
437
  }
408
438
  };
409
439
  // Subscribe to user approval/rejection events
@@ -422,6 +452,40 @@ class GatorPermissionsController extends BaseController {
422
452
  cleanup(txId);
423
453
  }, PENDING_REVOCATION_TIMEOUT);
424
454
  }
455
+ /**
456
+ * Submits a revocation directly without requiring an on-chain transaction.
457
+ * Used for already-disabled delegations that don't require an on-chain transaction.
458
+ *
459
+ * This method:
460
+ * 1. Adds the permission context to pending revocations state (disables UI button)
461
+ * 2. Immediately calls submitRevocation to remove from snap storage
462
+ * 3. On success, removes from pending revocations state (re-enables UI button)
463
+ * 4. On failure, keeps in pending revocations so UI can show error/retry state
464
+ *
465
+ * @param params - The revocation parameters containing the permission context.
466
+ * @returns A promise that resolves when the revocation is submitted successfully.
467
+ * @throws {GatorPermissionsNotEnabledError} If the gator permissions are not enabled.
468
+ * @throws {GatorPermissionsProviderError} If the snap request fails.
469
+ */
470
+ async submitDirectRevocation(params) {
471
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_assertGatorPermissionsEnabled).call(this);
472
+ // Use a placeholder txId that doesn't conflict with real transaction IDs
473
+ const placeholderTxId = `no-tx-${params.permissionContext}`;
474
+ // Add to pending revocations state first (disables UI button immediately)
475
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_addPendingRevocationToState).call(this, placeholderTxId, params.permissionContext);
476
+ // Immediately submit the revocation (will remove from pending on success)
477
+ await this.submitRevocation(params);
478
+ }
479
+ /**
480
+ * Checks if a permission context is in the pending revocations list.
481
+ *
482
+ * @param permissionContext - The permission context to check.
483
+ * @returns `true` if the permission context is pending revocation, `false` otherwise.
484
+ */
485
+ isPendingRevocation(permissionContext) {
486
+ return this.state.pendingRevocations.some((pendingRevocation) => pendingRevocation.permissionContext.toLowerCase() ===
487
+ permissionContext.toLowerCase());
488
+ }
425
489
  }
426
490
  _GatorPermissionsController_instances = new WeakSet(), _GatorPermissionsController_setIsFetchingGatorPermissions = function _GatorPermissionsController_setIsFetchingGatorPermissions(isFetchingGatorPermissions) {
427
491
  this.update((state) => {
@@ -444,7 +508,8 @@ _GatorPermissionsController_instances = new WeakSet(), _GatorPermissionsControll
444
508
  });
445
509
  }, _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext = function _GatorPermissionsController_removePendingRevocationFromStateByPermissionContext(permissionContext) {
446
510
  this.update((state) => {
447
- state.pendingRevocations = state.pendingRevocations.filter((pendingRevocations) => pendingRevocations.permissionContext !== permissionContext);
511
+ state.pendingRevocations = state.pendingRevocations.filter((pendingRevocations) => pendingRevocations.permissionContext.toLowerCase() !==
512
+ permissionContext.toLowerCase());
448
513
  });
449
514
  }, _GatorPermissionsController_registerMessageHandlers = function _GatorPermissionsController_registerMessageHandlers() {
450
515
  this.messenger.registerActionHandler(`${controllerName}:fetchAndUpdateGatorPermissions`, this.fetchAndUpdateGatorPermissions.bind(this));
@@ -454,6 +519,8 @@ _GatorPermissionsController_instances = new WeakSet(), _GatorPermissionsControll
454
519
  const submitRevocationAction = `${controllerName}:submitRevocation`;
455
520
  this.messenger.registerActionHandler(submitRevocationAction, this.submitRevocation.bind(this));
456
521
  this.messenger.registerActionHandler(`${controllerName}:addPendingRevocation`, this.addPendingRevocation.bind(this));
522
+ this.messenger.registerActionHandler(`${controllerName}:submitDirectRevocation`, this.submitDirectRevocation.bind(this));
523
+ this.messenger.registerActionHandler(`${controllerName}:isPendingRevocation`, this.isPendingRevocation.bind(this));
457
524
  }, _GatorPermissionsController_assertGatorPermissionsEnabled = function _GatorPermissionsController_assertGatorPermissionsEnabled() {
458
525
  if (!this.state.isGatorPermissionsEnabled) {
459
526
  throw new GatorPermissionsNotEnabledError();
@@ -490,7 +557,7 @@ async function _GatorPermissionsController_handleSnapRequestToGatorPermissionsPr
490
557
  }
491
558
  }, _GatorPermissionsController_sanitizeStoredGatorPermission = function _GatorPermissionsController_sanitizeStoredGatorPermission(storedGatorPermission) {
492
559
  const { permissionResponse } = storedGatorPermission;
493
- const { rules, dependencyInfo, signer, ...rest } = permissionResponse;
560
+ const { dependencyInfo, signer, ...rest } = permissionResponse;
494
561
  return {
495
562
  ...storedGatorPermission,
496
563
  permissionResponse: {
@@ -498,39 +565,22 @@ async function _GatorPermissionsController_handleSnapRequestToGatorPermissionsPr
498
565
  },
499
566
  };
500
567
  }, _GatorPermissionsController_categorizePermissionsDataByTypeAndChainId = function _GatorPermissionsController_categorizePermissionsDataByTypeAndChainId(storedGatorPermissions) {
568
+ const gatorPermissionsMap = createEmptyGatorPermissionsMap();
501
569
  if (!storedGatorPermissions) {
502
- return defaultGatorPermissionsMap;
503
- }
504
- return storedGatorPermissions.reduce((gatorPermissionsMap, storedGatorPermission) => {
505
- const { permissionResponse } = storedGatorPermission;
506
- const permissionType = permissionResponse.permission.type;
507
- const { chainId } = permissionResponse;
508
- const sanitizedStoredGatorPermission = __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_sanitizeStoredGatorPermission).call(this, storedGatorPermission);
509
- switch (permissionType) {
510
- case 'native-token-stream':
511
- case 'native-token-periodic':
512
- case 'erc20-token-stream':
513
- case 'erc20-token-periodic':
514
- if (!gatorPermissionsMap[permissionType][chainId]) {
515
- gatorPermissionsMap[permissionType][chainId] = [];
516
- }
517
- gatorPermissionsMap[permissionType][chainId].push(sanitizedStoredGatorPermission);
518
- break;
519
- default:
520
- if (!gatorPermissionsMap.other[chainId]) {
521
- gatorPermissionsMap.other[chainId] = [];
522
- }
523
- gatorPermissionsMap.other[chainId].push(sanitizedStoredGatorPermission);
524
- break;
525
- }
526
570
  return gatorPermissionsMap;
527
- }, {
528
- 'native-token-stream': {},
529
- 'native-token-periodic': {},
530
- 'erc20-token-stream': {},
531
- 'erc20-token-periodic': {},
532
- other: {},
533
- });
571
+ }
572
+ for (const storedGatorPermission of storedGatorPermissions) {
573
+ const { permissionResponse: { permission: { type: permissionType }, chainId, }, } = storedGatorPermission;
574
+ const isPermissionTypeKnown = Object.prototype.hasOwnProperty.call(gatorPermissionsMap, permissionType);
575
+ const permissionTypeKey = isPermissionTypeKnown
576
+ ? permissionType
577
+ : 'other';
578
+ gatorPermissionsMap[permissionTypeKey][chainId] = [
579
+ ...(gatorPermissionsMap[permissionTypeKey][chainId] || []),
580
+ __classPrivateFieldGet(this, _GatorPermissionsController_instances, "m", _GatorPermissionsController_sanitizeStoredGatorPermission).call(this, storedGatorPermission),
581
+ ];
582
+ }
583
+ return gatorPermissionsMap;
534
584
  };
535
585
  export default GatorPermissionsController;
536
586
  //# sourceMappingURL=GatorPermissionsController.mjs.map