@metamask-previews/notification-services-controller 10.0.0-preview-ef0f18a → 10.0.0-preview-53749f1

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 (136) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/NotificationServicesController/NotificationServicesController.cjs +67 -188
  3. package/dist/NotificationServicesController/NotificationServicesController.cjs.map +1 -1
  4. package/dist/NotificationServicesController/NotificationServicesController.d.cts +10 -16
  5. package/dist/NotificationServicesController/NotificationServicesController.d.cts.map +1 -1
  6. package/dist/NotificationServicesController/NotificationServicesController.d.mts +10 -16
  7. package/dist/NotificationServicesController/NotificationServicesController.d.mts.map +1 -1
  8. package/dist/NotificationServicesController/NotificationServicesController.mjs +68 -189
  9. package/dist/NotificationServicesController/NotificationServicesController.mjs.map +1 -1
  10. package/dist/NotificationServicesController/constants/index.cjs +0 -1
  11. package/dist/NotificationServicesController/constants/index.cjs.map +1 -1
  12. package/dist/NotificationServicesController/constants/index.d.cts +0 -1
  13. package/dist/NotificationServicesController/constants/index.d.cts.map +1 -1
  14. package/dist/NotificationServicesController/constants/index.d.mts +0 -1
  15. package/dist/NotificationServicesController/constants/index.d.mts.map +1 -1
  16. package/dist/NotificationServicesController/constants/index.mjs +0 -1
  17. package/dist/NotificationServicesController/constants/index.mjs.map +1 -1
  18. package/dist/NotificationServicesController/mocks/index.cjs +0 -2
  19. package/dist/NotificationServicesController/mocks/index.cjs.map +1 -1
  20. package/dist/NotificationServicesController/mocks/index.d.cts +0 -2
  21. package/dist/NotificationServicesController/mocks/index.d.cts.map +1 -1
  22. package/dist/NotificationServicesController/mocks/index.d.mts +0 -2
  23. package/dist/NotificationServicesController/mocks/index.d.mts.map +1 -1
  24. package/dist/NotificationServicesController/mocks/index.mjs +0 -2
  25. package/dist/NotificationServicesController/mocks/index.mjs.map +1 -1
  26. package/dist/NotificationServicesController/mocks/mockResponses.cjs +9 -9
  27. package/dist/NotificationServicesController/mocks/mockResponses.cjs.map +1 -1
  28. package/dist/NotificationServicesController/mocks/mockResponses.d.cts +7 -4
  29. package/dist/NotificationServicesController/mocks/mockResponses.d.cts.map +1 -1
  30. package/dist/NotificationServicesController/mocks/mockResponses.d.mts +7 -4
  31. package/dist/NotificationServicesController/mocks/mockResponses.d.mts.map +1 -1
  32. package/dist/NotificationServicesController/mocks/mockResponses.mjs +7 -7
  33. package/dist/NotificationServicesController/mocks/mockResponses.mjs.map +1 -1
  34. package/dist/NotificationServicesController/processors/process-notifications.cjs +4 -1
  35. package/dist/NotificationServicesController/processors/process-notifications.cjs.map +1 -1
  36. package/dist/NotificationServicesController/processors/process-notifications.d.cts +623 -0
  37. package/dist/NotificationServicesController/processors/process-notifications.d.cts.map +1 -1
  38. package/dist/NotificationServicesController/processors/process-notifications.d.mts +623 -0
  39. package/dist/NotificationServicesController/processors/process-notifications.d.mts.map +1 -1
  40. package/dist/NotificationServicesController/processors/process-notifications.mjs +2 -0
  41. package/dist/NotificationServicesController/processors/process-notifications.mjs.map +1 -1
  42. package/dist/NotificationServicesController/services/onchain-notifications.cjs +50 -142
  43. package/dist/NotificationServicesController/services/onchain-notifications.cjs.map +1 -1
  44. package/dist/NotificationServicesController/services/onchain-notifications.d.cts +23 -31
  45. package/dist/NotificationServicesController/services/onchain-notifications.d.cts.map +1 -1
  46. package/dist/NotificationServicesController/services/onchain-notifications.d.mts +23 -31
  47. package/dist/NotificationServicesController/services/onchain-notifications.d.mts.map +1 -1
  48. package/dist/NotificationServicesController/services/onchain-notifications.mjs +48 -139
  49. package/dist/NotificationServicesController/services/onchain-notifications.mjs.map +1 -1
  50. package/dist/NotificationServicesController/types/index.cjs.map +1 -1
  51. package/dist/NotificationServicesController/types/index.d.cts +0 -1
  52. package/dist/NotificationServicesController/types/index.d.cts.map +1 -1
  53. package/dist/NotificationServicesController/types/index.d.mts +0 -1
  54. package/dist/NotificationServicesController/types/index.d.mts.map +1 -1
  55. package/dist/NotificationServicesController/types/index.mjs.map +1 -1
  56. package/dist/NotificationServicesController/utils/utils.cjs +1 -350
  57. package/dist/NotificationServicesController/utils/utils.cjs.map +1 -1
  58. package/dist/NotificationServicesController/utils/utils.d.cts +0 -141
  59. package/dist/NotificationServicesController/utils/utils.d.cts.map +1 -1
  60. package/dist/NotificationServicesController/utils/utils.d.mts +0 -141
  61. package/dist/NotificationServicesController/utils/utils.d.mts.map +1 -1
  62. package/dist/NotificationServicesController/utils/utils.mjs +0 -337
  63. package/dist/NotificationServicesController/utils/utils.mjs.map +1 -1
  64. package/dist/NotificationServicesPushController/NotificationServicesPushController.cjs +20 -14
  65. package/dist/NotificationServicesPushController/NotificationServicesPushController.cjs.map +1 -1
  66. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.cts +6 -5
  67. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.cts.map +1 -1
  68. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.mts +6 -5
  69. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.mts.map +1 -1
  70. package/dist/NotificationServicesPushController/NotificationServicesPushController.mjs +21 -15
  71. package/dist/NotificationServicesPushController/NotificationServicesPushController.mjs.map +1 -1
  72. package/dist/NotificationServicesPushController/mocks/mockResponse.cjs +1 -16
  73. package/dist/NotificationServicesPushController/mocks/mockResponse.cjs.map +1 -1
  74. package/dist/NotificationServicesPushController/mocks/mockResponse.d.cts +0 -7
  75. package/dist/NotificationServicesPushController/mocks/mockResponse.d.cts.map +1 -1
  76. package/dist/NotificationServicesPushController/mocks/mockResponse.d.mts +0 -7
  77. package/dist/NotificationServicesPushController/mocks/mockResponse.d.mts.map +1 -1
  78. package/dist/NotificationServicesPushController/mocks/mockResponse.mjs +0 -14
  79. package/dist/NotificationServicesPushController/mocks/mockResponse.mjs.map +1 -1
  80. package/dist/NotificationServicesPushController/services/endpoints.cjs +1 -1
  81. package/dist/NotificationServicesPushController/services/endpoints.cjs.map +1 -1
  82. package/dist/NotificationServicesPushController/services/endpoints.d.cts +1 -1
  83. package/dist/NotificationServicesPushController/services/endpoints.d.cts.map +1 -1
  84. package/dist/NotificationServicesPushController/services/endpoints.d.mts +1 -1
  85. package/dist/NotificationServicesPushController/services/endpoints.d.mts.map +1 -1
  86. package/dist/NotificationServicesPushController/services/endpoints.mjs +1 -1
  87. package/dist/NotificationServicesPushController/services/endpoints.mjs.map +1 -1
  88. package/dist/NotificationServicesPushController/services/services.cjs +18 -41
  89. package/dist/NotificationServicesPushController/services/services.cjs.map +1 -1
  90. package/dist/NotificationServicesPushController/services/services.d.cts +19 -33
  91. package/dist/NotificationServicesPushController/services/services.d.cts.map +1 -1
  92. package/dist/NotificationServicesPushController/services/services.d.mts +19 -33
  93. package/dist/NotificationServicesPushController/services/services.d.mts.map +1 -1
  94. package/dist/NotificationServicesPushController/services/services.mjs +17 -39
  95. package/dist/NotificationServicesPushController/services/services.mjs.map +1 -1
  96. package/package.json +1 -1
  97. package/dist/NotificationServicesController/constants/constants.cjs +0 -7
  98. package/dist/NotificationServicesController/constants/constants.cjs.map +0 -1
  99. package/dist/NotificationServicesController/constants/constants.d.cts +0 -3
  100. package/dist/NotificationServicesController/constants/constants.d.cts.map +0 -1
  101. package/dist/NotificationServicesController/constants/constants.d.mts +0 -3
  102. package/dist/NotificationServicesController/constants/constants.d.mts.map +0 -1
  103. package/dist/NotificationServicesController/constants/constants.mjs +0 -4
  104. package/dist/NotificationServicesController/constants/constants.mjs.map +0 -1
  105. package/dist/NotificationServicesController/mocks/mock-notification-trigger.cjs +0 -22
  106. package/dist/NotificationServicesController/mocks/mock-notification-trigger.cjs.map +0 -1
  107. package/dist/NotificationServicesController/mocks/mock-notification-trigger.d.cts +0 -9
  108. package/dist/NotificationServicesController/mocks/mock-notification-trigger.d.cts.map +0 -1
  109. package/dist/NotificationServicesController/mocks/mock-notification-trigger.d.mts +0 -9
  110. package/dist/NotificationServicesController/mocks/mock-notification-trigger.d.mts.map +0 -1
  111. package/dist/NotificationServicesController/mocks/mock-notification-trigger.mjs +0 -18
  112. package/dist/NotificationServicesController/mocks/mock-notification-trigger.mjs.map +0 -1
  113. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.cjs +0 -82
  114. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.cjs.map +0 -1
  115. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.d.cts +0 -35
  116. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.d.cts.map +0 -1
  117. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.d.mts +0 -35
  118. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.d.mts.map +0 -1
  119. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.mjs +0 -76
  120. package/dist/NotificationServicesController/mocks/mock-notification-user-storage.mjs.map +0 -1
  121. package/dist/NotificationServicesController/types/user-storage/index.cjs +0 -3
  122. package/dist/NotificationServicesController/types/user-storage/index.cjs.map +0 -1
  123. package/dist/NotificationServicesController/types/user-storage/index.d.cts +0 -2
  124. package/dist/NotificationServicesController/types/user-storage/index.d.cts.map +0 -1
  125. package/dist/NotificationServicesController/types/user-storage/index.d.mts +0 -2
  126. package/dist/NotificationServicesController/types/user-storage/index.d.mts.map +0 -1
  127. package/dist/NotificationServicesController/types/user-storage/index.mjs +0 -2
  128. package/dist/NotificationServicesController/types/user-storage/index.mjs.map +0 -1
  129. package/dist/NotificationServicesController/types/user-storage/user-storage.cjs +0 -3
  130. package/dist/NotificationServicesController/types/user-storage/user-storage.cjs.map +0 -1
  131. package/dist/NotificationServicesController/types/user-storage/user-storage.d.cts +0 -26
  132. package/dist/NotificationServicesController/types/user-storage/user-storage.d.cts.map +0 -1
  133. package/dist/NotificationServicesController/types/user-storage/user-storage.d.mts +0 -26
  134. package/dist/NotificationServicesController/types/user-storage/user-storage.d.mts.map +0 -1
  135. package/dist/NotificationServicesController/types/user-storage/user-storage.mjs +0 -2
  136. package/dist/NotificationServicesController/types/user-storage/user-storage.mjs.map +0 -1
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  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");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _NotificationServicesController_instances, _NotificationServicesController_keyringController, _NotificationServicesController_auth, _NotificationServicesController_storage, _NotificationServicesController_pushNotifications, _NotificationServicesController_accounts, _NotificationServicesController_featureAnnouncementEnv, _NotificationServicesController_registerMessageHandlers, _NotificationServicesController_clearLoadingStates, _NotificationServicesController_assertAuthEnabled, _NotificationServicesController_enableAuth, _NotificationServicesController_getValidStorageKeyAndBearerToken, _NotificationServicesController_assertUserStorage, _NotificationServicesController_getUserStorage, _NotificationServicesController_setIsUpdatingMetamaskNotifications, _NotificationServicesController_setIsFetchingMetamaskNotifications, _NotificationServicesController_setIsCheckingAccountsPresence, _NotificationServicesController_updateUpdatingAccountsState, _NotificationServicesController_clearUpdatingAccountsState;
12
+ var _NotificationServicesController_instances, _NotificationServicesController_keyringController, _NotificationServicesController_auth, _NotificationServicesController_pushNotifications, _NotificationServicesController_accounts, _NotificationServicesController_featureAnnouncementEnv, _NotificationServicesController_registerMessageHandlers, _NotificationServicesController_clearLoadingStates, _NotificationServicesController_assertAuthEnabled, _NotificationServicesController_enableAuth, _NotificationServicesController_getBearerToken, _NotificationServicesController_setIsUpdatingMetamaskNotifications, _NotificationServicesController_setIsFetchingMetamaskNotifications, _NotificationServicesController_setIsCheckingAccountsPresence, _NotificationServicesController_updateUpdatingAccountsState, _NotificationServicesController_clearUpdatingAccountsState;
13
13
  function $importDefault(module) {
14
14
  if (module?.__esModule) {
15
15
  return module.default;
@@ -22,12 +22,10 @@ import { KeyringTypes } from "@metamask/keyring-controller";
22
22
  import { assert } from "@metamask/utils";
23
23
  import $log from "loglevel";
24
24
  const log = $importDefault($log);
25
- import { USER_STORAGE_VERSION_KEY } from "./constants/constants.mjs";
26
25
  import { TRIGGER_TYPES } from "./constants/notification-schema.mjs";
27
- import { safeProcessNotification } from "./processors/process-notifications.mjs";
26
+ import { processAndFilterNotifications, safeProcessNotification } from "./processors/process-notifications.mjs";
28
27
  import * as FeatureNotifications from "./services/feature-announcements.mjs";
29
28
  import * as OnChainNotifications from "./services/onchain-notifications.mjs";
30
- import * as Utils from "./utils/utils.mjs";
31
29
  // Unique name for the controller
32
30
  const controllerName = 'NotificationServicesController';
33
31
  const metadata = {
@@ -137,17 +135,6 @@ class NotificationServicesController extends BaseController {
137
135
  return await this.messagingSystem.call('AuthenticationController:performSignIn');
138
136
  },
139
137
  });
140
- _NotificationServicesController_storage.set(this, {
141
- getStorageKey: () => {
142
- return this.messagingSystem.call('UserStorageController:getStorageKey');
143
- },
144
- getNotificationStorage: async () => {
145
- return await this.messagingSystem.call('UserStorageController:performGetStorage', 'notifications.notification_settings');
146
- },
147
- setNotificationStorage: async (state) => {
148
- return await this.messagingSystem.call('UserStorageController:performSetStorage', 'notifications.notification_settings', state);
149
- },
150
- });
151
138
  _NotificationServicesController_pushNotifications.set(this, {
152
139
  // Flag to check is notifications have been setup when the browser/extension is initialized.
153
140
  // We want to re-initialize push notifications when the browser/extension is refreshed
@@ -156,9 +143,9 @@ class NotificationServicesController extends BaseController {
156
143
  subscribeToPushNotifications: async () => {
157
144
  await this.messagingSystem.call('NotificationServicesPushController:subscribeToPushNotifications');
158
145
  },
159
- enablePushNotifications: async (UUIDs) => {
146
+ enablePushNotifications: async (addresses) => {
160
147
  try {
161
- await this.messagingSystem.call('NotificationServicesPushController:enablePushNotifications', UUIDs);
148
+ await this.messagingSystem.call('NotificationServicesPushController:enablePushNotifications', addresses);
162
149
  }
163
150
  catch (e) {
164
151
  log.error('Silently failed to enable push notifications', e);
@@ -172,14 +159,6 @@ class NotificationServicesController extends BaseController {
172
159
  log.error('Silently failed to disable push notifications', e);
173
160
  }
174
161
  },
175
- updatePushNotifications: async (UUIDs) => {
176
- try {
177
- await this.messagingSystem.call('NotificationServicesPushController:updateTriggerPushNotifications', UUIDs);
178
- }
179
- catch (e) {
180
- log.error('Silently failed to update push notifications', e);
181
- }
182
- },
183
162
  subscribe: () => {
184
163
  this.messagingSystem.subscribe('NotificationServicesPushController:onNewNotifications', (notification) => {
185
164
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
@@ -214,7 +193,7 @@ class NotificationServicesController extends BaseController {
214
193
  _NotificationServicesController_accounts.set(this, {
215
194
  // Flag to ensure we only setup once
216
195
  isNotificationAccountsSetup: false,
217
- getNotificationAccounts: async () => {
196
+ getNotificationAccounts: () => {
218
197
  const { keyrings } = this.messagingSystem.call('KeyringController:getState');
219
198
  const firstHDKeyring = keyrings.find((k) => k.type === KeyringTypes.hd.toString());
220
199
  const keyringAccounts = firstHDKeyring?.accounts ?? null;
@@ -225,9 +204,9 @@ class NotificationServicesController extends BaseController {
225
204
  *
226
205
  * @returns addresses removed, added, and latest list of addresses
227
206
  */
228
- listAccounts: async () => {
207
+ listAccounts: () => {
229
208
  // Get previous and current account sets
230
- const nonChecksumAccounts = await __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").getNotificationAccounts();
209
+ const nonChecksumAccounts = __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").getNotificationAccounts();
231
210
  if (!nonChecksumAccounts) {
232
211
  return {
233
212
  accountsAdded: [],
@@ -264,13 +243,11 @@ class NotificationServicesController extends BaseController {
264
243
  },
265
244
  /**
266
245
  * Initializes the cache/previous list. This is handy so we have an accurate in-mem state of the previous list of accounts.
267
- *
268
- * @returns result from list accounts
269
246
  */
270
- initialize: async () => {
247
+ initialize: () => {
271
248
  if (__classPrivateFieldGet(this, _NotificationServicesController_keyringController, "f").isUnlocked &&
272
249
  !__classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").isNotificationAccountsSetup) {
273
- await __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
250
+ __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
274
251
  __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").isNotificationAccountsSetup = true;
275
252
  }
276
253
  },
@@ -286,15 +263,15 @@ class NotificationServicesController extends BaseController {
286
263
  !hasTotalAccountsChanged) {
287
264
  return;
288
265
  }
289
- const { accountsAdded, accountsRemoved } = await __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
266
+ const { accountsAdded, accountsRemoved } = __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
290
267
  const promises = [];
291
268
  if (accountsAdded.length > 0) {
292
- promises.push(this.updateOnChainTriggersByAccount(accountsAdded));
269
+ promises.push(this.enableAccounts(accountsAdded));
293
270
  }
294
271
  if (accountsRemoved.length > 0) {
295
- promises.push(this.deleteOnChainTriggersByAccount(accountsRemoved));
272
+ promises.push(this.disableAccounts(accountsRemoved));
296
273
  }
297
- await Promise.all(promises);
274
+ await Promise.allSettled(promises);
298
275
  }, (state) => {
299
276
  return (state?.keyrings?.flatMap?.((keyring) => keyring.accounts)?.length ??
300
277
  0);
@@ -308,10 +285,9 @@ class NotificationServicesController extends BaseController {
308
285
  }
309
286
  init() {
310
287
  __classPrivateFieldGet(this, _NotificationServicesController_keyringController, "f").setupLockedStateSubscriptions(async () => {
311
- await __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").initialize();
288
+ __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").initialize();
312
289
  await __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").initializePushNotifications();
313
290
  });
314
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
315
291
  __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").initialize();
316
292
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
317
293
  __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").initializePushNotifications();
@@ -322,13 +298,18 @@ class NotificationServicesController extends BaseController {
322
298
  * Public method to expose enabling push notifications
323
299
  */
324
300
  async enablePushNotifications() {
325
- await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_enableAuth).call(this);
326
- const storage = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getUserStorage).call(this);
327
- if (!storage) {
328
- throw new Error('Unable to get triggers');
301
+ try {
302
+ const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
303
+ const { accounts } = __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
304
+ const addressesWithNotifications = await OnChainNotifications.getOnChainNotificationsConfig(bearerToken, accounts);
305
+ const addresses = addressesWithNotifications.map((a) => a.address);
306
+ if (addresses.length > 0) {
307
+ await __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").enablePushNotifications(addresses);
308
+ }
309
+ }
310
+ catch (e) {
311
+ log.error('Failed to enable push notifications', e);
329
312
  }
330
- const uuids = Utils.getAllUUIDs(storage);
331
- await __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").enablePushNotifications(uuids);
332
313
  }
333
314
  /**
334
315
  * Public method to expose disabling push notifications
@@ -340,10 +321,13 @@ class NotificationServicesController extends BaseController {
340
321
  try {
341
322
  __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_setIsCheckingAccountsPresence).call(this, true);
342
323
  // Retrieve user storage
343
- const userStorage = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getUserStorage).call(this);
344
- __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_assertUserStorage).call(this, userStorage);
345
- const presence = Utils.checkAccountsPresence(userStorage, accounts);
346
- return presence;
324
+ const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
325
+ const addressesWithNotifications = await OnChainNotifications.getOnChainNotificationsConfig(bearerToken, accounts);
326
+ const result = {};
327
+ addressesWithNotifications.forEach((a) => {
328
+ result[a.address] = a.enabled;
329
+ });
330
+ return result;
347
331
  }
348
332
  catch (error) {
349
333
  log.error('Failed to check accounts presence', error);
@@ -387,40 +371,26 @@ class NotificationServicesController extends BaseController {
387
371
  async createOnChainTriggers(opts) {
388
372
  try {
389
373
  __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_setIsUpdatingMetamaskNotifications).call(this, true);
390
- const { bearerToken, storageKey } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getValidStorageKeyAndBearerToken).call(this);
391
- const { accounts } = await __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
392
- // Attempt Get User Storage
393
- // Will be null if entry does not exist, or a user is resetting their notifications
394
- // Will be defined if entry exists
395
- // Will throw if fails to get the user storage entry
396
- let userStorage = opts?.resetNotifications
397
- ? null
398
- : await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getUserStorage).call(this);
399
- // If userStorage does not exist, create a new one
400
- // All the triggers created are set as: "disabled"
401
- if (userStorage?.[USER_STORAGE_VERSION_KEY] === undefined) {
402
- userStorage = Utils.initializeUserStorage(accounts.map((account) => ({ address: account })), false);
403
- // Write the userStorage
404
- await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f").setNotificationStorage(JSON.stringify(userStorage));
374
+ const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
375
+ const { accounts } = __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
376
+ // 1. See if has enabled notifications before
377
+ const addressesWithNotifications = await OnChainNotifications.getOnChainNotificationsConfig(bearerToken, accounts);
378
+ // Notifications have been enabled before, so returning early
379
+ if (addressesWithNotifications.length > 0 && !opts?.resetNotifications) {
380
+ return;
405
381
  }
406
- // Create the triggers
407
- const triggers = Utils.traverseUserStorageTriggers(userStorage);
408
- await OnChainNotifications.createOnChainTriggers(userStorage, storageKey, bearerToken, triggers);
409
- // Create push notifications triggers in background
410
- const allUUIDS = Utils.getAllUUIDs(userStorage);
411
- // We do not want to wait for this request as it may take a while (e.g. for Firebase to setup)
412
- __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").enablePushNotifications(allUUIDS).catch(() => {
382
+ // 2. Create Notifications
383
+ await OnChainNotifications.updateOnChainNotifications(bearerToken, accounts.map((address) => ({ address, enabled: true })));
384
+ // 3. Lazily enable push notifications (FCM may take some time, so keeps UI unblocked)
385
+ __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").enablePushNotifications(accounts).catch(() => {
413
386
  // Do Nothing
414
387
  });
415
- // Write the new userStorage (triggers are now "enabled")
416
- await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f").setNotificationStorage(JSON.stringify(userStorage));
417
388
  // Update the state of the controller
418
389
  this.update((state) => {
419
390
  state.isNotificationServicesEnabled = true;
420
391
  state.isFeatureAnnouncementsEnabled = true;
421
392
  state.isMetamaskNotificationsFeatureSeen = true;
422
393
  });
423
- return userStorage;
424
394
  }
425
395
  catch (err) {
426
396
  log.error('Failed to create On Chain triggers', err);
@@ -433,10 +403,6 @@ class NotificationServicesController extends BaseController {
433
403
  /**
434
404
  * Enables all MetaMask notifications for the user.
435
405
  * This is identical flow when initializing notifications for the first time.
436
- * 1. Enable Profile Syncing
437
- * 2. Get or Create Notification User Storage
438
- * 3. Upsert Triggers
439
- * 4. Update Push notifications
440
406
  *
441
407
  * @throws {Error} If there is an error during the process of enabling notifications.
442
408
  */
@@ -484,12 +450,11 @@ class NotificationServicesController extends BaseController {
484
450
  __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_setIsUpdatingMetamaskNotifications).call(this, false);
485
451
  }
486
452
  /**
487
- * Deletes on-chain triggers associated with a specific account.
453
+ * Deletes on-chain triggers associated with a specific account/s.
488
454
  * This method performs several key operations:
489
- * 1. Validates Auth & Storage
490
- * 2. Finds and deletes all triggers associated with the account
491
- * 3. Disables any related push notifications
492
- * 4. Updates Storage to reflect new state.
455
+ * 1. Validates Auth
456
+ * 2. Deletes accounts
457
+ * (note) We do not need to look through push notifications as we've deleted triggers
493
458
  *
494
459
  * **Action** - When a user disables notifications for a given account in settings.
495
460
  *
@@ -497,29 +462,13 @@ class NotificationServicesController extends BaseController {
497
462
  * @returns A promise that resolves to void or an object containing a success message.
498
463
  * @throws {Error} Throws an error if unauthenticated or from other operations.
499
464
  */
500
- async deleteOnChainTriggersByAccount(accounts) {
465
+ async disableAccounts(accounts) {
501
466
  try {
502
467
  __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_updateUpdatingAccountsState).call(this, accounts);
503
468
  // Get and Validate BearerToken and User Storage Key
504
- const { bearerToken, storageKey } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getValidStorageKeyAndBearerToken).call(this);
505
- // Get & Validate User Storage
506
- const userStorage = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getUserStorage).call(this);
507
- __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_assertUserStorage).call(this, userStorage);
508
- // Get the UUIDs to delete
509
- const UUIDs = accounts
510
- .map((a) => Utils.getUUIDsForAccount(userStorage, a.toLowerCase()))
511
- .flat();
512
- if (UUIDs.length === 0) {
513
- return userStorage;
514
- }
469
+ const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
515
470
  // Delete these UUIDs (Mutates User Storage)
516
- await OnChainNotifications.deleteOnChainTriggers(userStorage, storageKey, bearerToken, UUIDs);
517
- // Update Push Notifications with new list of IDs
518
- const remainingTriggerIds = Utils.getAllUUIDs(userStorage);
519
- await __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").updatePushNotifications(remainingTriggerIds);
520
- // Update User Storage
521
- await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f").setNotificationStorage(JSON.stringify(userStorage));
522
- return userStorage;
471
+ await OnChainNotifications.updateOnChainNotifications(bearerToken, accounts.map((address) => ({ address, enabled: false })));
523
472
  }
524
473
  catch (err) {
525
474
  log.error('Failed to delete OnChain triggers', err);
@@ -544,45 +493,11 @@ class NotificationServicesController extends BaseController {
544
493
  * @returns A promise that resolves to the updated user storage.
545
494
  * @throws {Error} Throws an error if unauthenticated or from other operations.
546
495
  */
547
- async updateOnChainTriggersByAccount(accounts) {
496
+ async enableAccounts(accounts) {
548
497
  try {
549
498
  __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_updateUpdatingAccountsState).call(this, accounts);
550
- // Get and Validate BearerToken and User Storage Key
551
- const { bearerToken, storageKey } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getValidStorageKeyAndBearerToken).call(this);
552
- // Get & Validate User Storage
553
- const userStorage = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getUserStorage).call(this);
554
- __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_assertUserStorage).call(this, userStorage);
555
- // Add any missing triggers
556
- accounts.forEach((a) => Utils.upsertAddressTriggers(a, userStorage));
557
- const newTriggers = Utils.traverseUserStorageTriggers(userStorage, {
558
- mapTrigger: (t) => {
559
- if (!t.enabled) {
560
- return t;
561
- }
562
- return undefined;
563
- },
564
- });
565
- // Create any missing triggers.
566
- if (newTriggers.length > 0) {
567
- // Write te updated userStorage (where triggers are disabled)
568
- await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f").setNotificationStorage(JSON.stringify(userStorage));
569
- // Create the triggers
570
- const triggers = Utils.traverseUserStorageTriggers(userStorage, {
571
- mapTrigger: (t) => {
572
- if (accounts.some((a) => a.toLowerCase() === t.address.toLowerCase())) {
573
- return t;
574
- }
575
- return undefined;
576
- },
577
- });
578
- await OnChainNotifications.createOnChainTriggers(userStorage, storageKey, bearerToken, triggers);
579
- }
580
- // Update Push Notifications Triggers
581
- const UUIDs = Utils.getAllUUIDs(userStorage);
582
- await __classPrivateFieldGet(this, _NotificationServicesController_pushNotifications, "f").updatePushNotifications(UUIDs);
583
- // Update the userStorage (where triggers are enabled)
584
- await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f").setNotificationStorage(JSON.stringify(userStorage));
585
- return userStorage;
499
+ const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
500
+ await OnChainNotifications.updateOnChainNotifications(bearerToken, accounts.map((address) => ({ address, enabled: true })));
586
501
  }
587
502
  catch (err) {
588
503
  log.error('Failed to update OnChain triggers', err);
@@ -609,37 +524,30 @@ class NotificationServicesController extends BaseController {
609
524
  // Not used by Snaps
610
525
  const isGlobalNotifsEnabled = this.state.isNotificationServicesEnabled;
611
526
  // Raw Feature Notifications
612
- const rawFeatureAnnouncementNotifications = isGlobalNotifsEnabled && this.state.isFeatureAnnouncementsEnabled
527
+ const rawAnnouncements = isGlobalNotifsEnabled && this.state.isFeatureAnnouncementsEnabled
613
528
  ? await FeatureNotifications.getFeatureAnnouncementNotifications(__classPrivateFieldGet(this, _NotificationServicesController_featureAnnouncementEnv, "f"), previewToken).catch(() => [])
614
529
  : [];
615
530
  // Raw On Chain Notifications
616
531
  const rawOnChainNotifications = [];
617
532
  if (isGlobalNotifsEnabled) {
618
- const userStorage = await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f")
619
- .getNotificationStorage()
620
- .then((s) => s && JSON.parse(s))
621
- .catch(() => null);
622
- const bearerToken = await __classPrivateFieldGet(this, _NotificationServicesController_auth, "f").getBearerToken().catch(() => null);
623
- if (userStorage && bearerToken) {
624
- const notifications = await OnChainNotifications.getOnChainNotifications(userStorage, bearerToken).catch(() => []);
533
+ try {
534
+ const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
535
+ const { accounts } = __classPrivateFieldGet(this, _NotificationServicesController_accounts, "f").listAccounts();
536
+ const notifications = await OnChainNotifications.getOnChainNotifications(bearerToken, accounts).catch(() => []);
625
537
  rawOnChainNotifications.push(...notifications);
626
538
  }
539
+ catch {
540
+ // Do nothing
541
+ }
627
542
  }
628
543
  // Snap Notifications (original)
629
544
  // We do not want to remove them
630
545
  const snapNotifications = this.state.metamaskNotificationsList.filter((notification) => notification.type === TRIGGER_TYPES.SNAP);
631
- // Process Notifications
632
546
  const readIds = this.state.metamaskNotificationsReadList;
633
- const isNotUndefined = (t) => Boolean(t);
634
- const processAndFilter = (ns) => ns
635
- .map((n) => safeProcessNotification(n, readIds))
636
- .filter(isNotUndefined);
637
- const featureAnnouncementNotifications = processAndFilter(rawFeatureAnnouncementNotifications);
638
- const onChainNotifications = processAndFilter(rawOnChainNotifications);
639
547
  // Combine Notifications
640
548
  const metamaskNotifications = [
641
- ...featureAnnouncementNotifications,
642
- ...onChainNotifications,
549
+ ...processAndFilterNotifications(rawAnnouncements, readIds),
550
+ ...processAndFilterNotifications(rawOnChainNotifications, readIds),
643
551
  ...snapNotifications,
644
552
  ];
645
553
  // Sort Notifications
@@ -807,7 +715,7 @@ class NotificationServicesController extends BaseController {
807
715
  }
808
716
  }
809
717
  }
810
- _NotificationServicesController_keyringController = new WeakMap(), _NotificationServicesController_auth = new WeakMap(), _NotificationServicesController_storage = new WeakMap(), _NotificationServicesController_pushNotifications = new WeakMap(), _NotificationServicesController_accounts = new WeakMap(), _NotificationServicesController_featureAnnouncementEnv = new WeakMap(), _NotificationServicesController_instances = new WeakSet(), _NotificationServicesController_registerMessageHandlers = function _NotificationServicesController_registerMessageHandlers() {
718
+ _NotificationServicesController_keyringController = new WeakMap(), _NotificationServicesController_auth = new WeakMap(), _NotificationServicesController_pushNotifications = new WeakMap(), _NotificationServicesController_accounts = new WeakMap(), _NotificationServicesController_featureAnnouncementEnv = new WeakMap(), _NotificationServicesController_instances = new WeakSet(), _NotificationServicesController_registerMessageHandlers = function _NotificationServicesController_registerMessageHandlers() {
811
719
  this.messagingSystem.registerActionHandler(`${controllerName}:updateMetamaskNotificationsList`, this.updateMetamaskNotificationsList.bind(this));
812
720
  this.messagingSystem.registerActionHandler(`${controllerName}:disableNotificationServices`, this.disableNotificationServices.bind(this));
813
721
  this.messagingSystem.registerActionHandler(`${controllerName}:getNotificationsByType`, this.getNotificationsByType.bind(this));
@@ -831,42 +739,13 @@ _NotificationServicesController_keyringController = new WeakMap(), _Notification
831
739
  if (!isSignedIn) {
832
740
  await __classPrivateFieldGet(this, _NotificationServicesController_auth, "f").signIn();
833
741
  }
834
- }, _NotificationServicesController_getValidStorageKeyAndBearerToken = async function _NotificationServicesController_getValidStorageKeyAndBearerToken() {
742
+ }, _NotificationServicesController_getBearerToken = async function _NotificationServicesController_getBearerToken() {
835
743
  __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_assertAuthEnabled).call(this);
836
744
  const bearerToken = await __classPrivateFieldGet(this, _NotificationServicesController_auth, "f").getBearerToken();
837
- const storageKey = await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f").getStorageKey();
838
- if (!bearerToken || !storageKey) {
839
- throw new Error('Missing BearerToken or storage key');
840
- }
841
- return { bearerToken, storageKey };
842
- }, _NotificationServicesController_assertUserStorage = function _NotificationServicesController_assertUserStorage(storage) {
843
- if (!storage) {
844
- throw new Error('User Storage does not exist');
845
- }
846
- }, _NotificationServicesController_getUserStorage =
847
- /**
848
- * Retrieves and parses the user storage from the storage key.
849
- *
850
- * This method attempts to retrieve the user storage using the specified storage key,
851
- * then parses the JSON string to an object. If the storage is not found or cannot be parsed,
852
- * it throws an error.
853
- *
854
- * @returns The parsed user storage object or null
855
- */
856
- async function _NotificationServicesController_getUserStorage() {
857
- const userStorageString = await __classPrivateFieldGet(this, _NotificationServicesController_storage, "f").getNotificationStorage();
858
- if (!userStorageString) {
859
- return null;
860
- }
861
- try {
862
- const userStorage = JSON.parse(userStorageString);
863
- Utils.cleanUserStorage(userStorage);
864
- return userStorage;
865
- }
866
- catch {
867
- log.error('Unable to parse User Storage');
868
- return null;
745
+ if (!bearerToken) {
746
+ throw new Error('Missing BearerToken');
869
747
  }
748
+ return { bearerToken };
870
749
  }, _NotificationServicesController_setIsUpdatingMetamaskNotifications = function _NotificationServicesController_setIsUpdatingMetamaskNotifications(isUpdatingMetamaskNotifications) {
871
750
  this.update((state) => {
872
751
  state.isUpdatingMetamaskNotifications = isUpdatingMetamaskNotifications;