{"version":3,"file":"NotificationServicesController.cjs","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n  ControllerGetStateAction,\n  ControllerStateChangeEvent,\n  StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n  isValidHexAddress,\n  toChecksumHexAddress,\n} from '@metamask/controller-utils';\nimport type {\n  KeyringControllerStateChangeEvent,\n  KeyringControllerGetStateAction,\n  KeyringControllerLockEvent,\n  KeyringControllerUnlockEvent,\n  KeyringControllerState,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport { assert } from '@metamask/utils';\nimport { debounce } from 'lodash';\nimport log from 'loglevel';\n\nimport type { NormalisedAPINotification } from '.';\nimport type {\n  NotificationServicesPushControllerStateChangeEvent,\n  NotificationServicesPushControllerOnNewNotificationEvent,\n} from '../NotificationServicesPushController';\nimport type { NotificationServicesPushControllerMethodActions } from '../NotificationServicesPushController/NotificationServicesPushController-method-action-types';\nimport { TRIGGER_TYPES } from './constants/notification-schema';\nimport type { NotificationServicesControllerMethodActions } from './NotificationServicesController-method-action-types';\nimport {\n  processAndFilterNotifications,\n  safeProcessNotification,\n} from './processors/process-notifications';\nimport type { ENV } from './services/api-notifications';\nimport {\n  getAPINotifications,\n  getNotificationsApiConfigCached,\n  markNotificationsAsRead,\n  updateOnChainNotifications,\n} from './services/api-notifications';\nimport { getFeatureAnnouncementNotifications } from './services/feature-announcements';\nimport { createPerpOrderNotification } from './services/perp-notifications';\nimport type {\n  INotification,\n  MarkAsReadNotificationsParam,\n} from './types/notification/notification';\nimport type { OrderInput } from './types/perps';\n\n// Unique name for the controller\nconst controllerName = 'NotificationServicesController';\n\nexport const ACCOUNTS_UPDATE_DEBOUNCE_TIME_MS = 1000;\n\n/**\n * State shape for NotificationServicesController\n */\nexport type NotificationServicesControllerState = {\n  /**\n   * We store and manage accounts that have been seen/visited through the\n   * account subscription. This allows us to track and add notifications for new accounts and not previous accounts added.\n   */\n  subscriptionAccountsSeen: string[];\n\n  /**\n   * Flag that indicates if the metamask notifications feature has been seen\n   */\n  isMetamaskNotificationsFeatureSeen: boolean;\n\n  /**\n   * Flag that indicates if the metamask notifications are enabled\n   */\n  isNotificationServicesEnabled: boolean;\n\n  /**\n   * Flag that indicates if the feature announcements are enabled\n   */\n  isFeatureAnnouncementsEnabled: boolean;\n\n  /**\n   * List of metamask notifications\n   */\n  metamaskNotificationsList: INotification[];\n\n  /**\n   * List of read metamask notifications\n   */\n  metamaskNotificationsReadList: string[];\n  /**\n   * Flag that indicates that the creating notifications is in progress\n   */\n  isUpdatingMetamaskNotifications: boolean;\n  /**\n   * Flag that indicates that the fetching notifications is in progress\n   * This is used to show a loading spinner in the UI\n   * when fetching notifications\n   */\n  isFetchingMetamaskNotifications: boolean;\n  /**\n   * Flag that indicates that the updating notifications for a specific address is in progress\n   */\n  isUpdatingMetamaskNotificationsAccount: string[];\n  /**\n   * Flag that indicates that the checking accounts presence is in progress\n   */\n  isCheckingAccountsPresence: boolean;\n};\n\nconst metadata: StateMetadata<NotificationServicesControllerState> = {\n  subscriptionAccountsSeen: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n\n  isMetamaskNotificationsFeatureSeen: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  isNotificationServicesEnabled: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  isFeatureAnnouncementsEnabled: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  metamaskNotificationsList: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  metamaskNotificationsReadList: {\n    includeInStateLogs: false,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  isUpdatingMetamaskNotifications: {\n    includeInStateLogs: false,\n    persist: false,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  isFetchingMetamaskNotifications: {\n    includeInStateLogs: false,\n    persist: false,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  isUpdatingMetamaskNotificationsAccount: {\n    includeInStateLogs: false,\n    persist: false,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  isCheckingAccountsPresence: {\n    includeInStateLogs: false,\n    persist: false,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n};\nexport const defaultState: NotificationServicesControllerState = {\n  subscriptionAccountsSeen: [],\n  isMetamaskNotificationsFeatureSeen: false,\n  isNotificationServicesEnabled: false,\n  isFeatureAnnouncementsEnabled: false,\n  metamaskNotificationsList: [],\n  metamaskNotificationsReadList: [],\n  isUpdatingMetamaskNotifications: false,\n  isFetchingMetamaskNotifications: false,\n  isUpdatingMetamaskNotificationsAccount: [],\n  isCheckingAccountsPresence: false,\n};\n\nconst locallyPersistedNotificationTypes = new Set<TRIGGER_TYPES>([\n  TRIGGER_TYPES.SNAP,\n]);\n\nconst MESSENGER_EXPOSED_METHODS = [\n  'init',\n  'enablePushNotifications',\n  'disablePushNotifications',\n  'checkAccountsPresence',\n  'setFeatureAnnouncementsEnabled',\n  'createOnChainTriggers',\n  'enableMetamaskNotifications',\n  'disableNotificationServices',\n  'disableAccounts',\n  'enableAccounts',\n  'fetchAndUpdateMetamaskNotifications',\n  'getNotificationsByType',\n  'deleteNotificationById',\n  'deleteNotificationsById',\n  'markMetamaskNotificationsAsRead',\n  'updateMetamaskNotificationsList',\n  'sendPerpPlaceOrderNotification',\n] as const;\n\nexport type NotificationServicesControllerGetStateAction =\n  ControllerGetStateAction<\n    typeof controllerName,\n    NotificationServicesControllerState\n  >;\n\n// Messenger Actions\nexport type Actions =\n  | NotificationServicesControllerGetStateAction\n  | NotificationServicesControllerMethodActions;\n\n// Allowed Actions\ntype AllowedActions =\n  // Keyring Controller Requests\n  | KeyringControllerGetStateAction\n  // Auth Controller Requests\n  | AuthenticationController.AuthenticationControllerGetBearerTokenAction\n  | AuthenticationController.AuthenticationControllerIsSignedInAction\n  | AuthenticationController.AuthenticationControllerPerformSignInAction\n  // Push Notifications Controller Requests\n  | NotificationServicesPushControllerMethodActions;\n\n// Events\nexport type NotificationServicesControllerStateChangeEvent =\n  ControllerStateChangeEvent<\n    typeof controllerName,\n    NotificationServicesControllerState\n  >;\n\nexport type NotificationListUpdatedEvent = {\n  type: `${typeof controllerName}:notificationsListUpdated`;\n  payload: [INotification[]];\n};\n\nexport type MarkNotificationsAsReadEvent = {\n  type: `${typeof controllerName}:markNotificationsAsRead`;\n  payload: [INotification[]];\n};\n\n// Events\nexport type Events =\n  | NotificationServicesControllerStateChangeEvent\n  | NotificationListUpdatedEvent\n  | MarkNotificationsAsReadEvent;\n\n// Allowed Events\ntype AllowedEvents =\n  // Keyring Events\n  | KeyringControllerStateChangeEvent\n  | KeyringControllerLockEvent\n  | KeyringControllerUnlockEvent\n  // Push Notification Events\n  | NotificationServicesPushControllerOnNewNotificationEvent\n  | NotificationServicesPushControllerStateChangeEvent;\n\n// Type for the messenger of NotificationServicesController\nexport type NotificationServicesControllerMessenger = Messenger<\n  typeof controllerName,\n  Actions | AllowedActions,\n  Events | AllowedEvents\n>;\n\ntype FeatureAnnouncementEnv = {\n  spaceId: string;\n  accessToken: string;\n  platform: 'extension' | 'mobile';\n  platformVersion?: string;\n};\n\n/**\n * Controller that enables wallet notifications and feature announcements\n */\nexport class NotificationServicesController extends BaseController<\n  typeof controllerName,\n  NotificationServicesControllerState,\n  NotificationServicesControllerMessenger\n> {\n  readonly #keyringController = {\n    isUnlocked: false,\n\n    setupLockedStateSubscriptions: (onUnlock: () => Promise<void>): void => {\n      const { isUnlocked } = this.messenger.call('KeyringController:getState');\n      this.#keyringController.isUnlocked = isUnlocked;\n\n      this.messenger.subscribe('KeyringController:unlock', (): void => {\n        this.#keyringController.isUnlocked = true;\n        // messaging system cannot await promises\n        // we don't need to wait for a result on this.\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\n        onUnlock();\n      });\n\n      this.messenger.subscribe('KeyringController:lock', (): void => {\n        this.#keyringController.isUnlocked = false;\n      });\n    },\n  };\n\n  readonly #auth = {\n    getBearerToken: async (): Promise<string | null> => {\n      return await this.messenger.call(\n        'AuthenticationController:getBearerToken',\n      );\n    },\n    isSignedIn: (): boolean => {\n      return this.messenger.call('AuthenticationController:isSignedIn');\n    },\n    signIn: async (): Promise<string[]> => {\n      return await this.messenger.call(\n        'AuthenticationController:performSignIn',\n      );\n    },\n  };\n\n  readonly #pushNotifications = {\n    // Flag to check is notifications have been setup when the browser/extension is initialized.\n    // We want to re-initialize push notifications when the browser/extension is refreshed\n    // To ensure we subscribe to the most up-to-date notifications\n    isSetup: false,\n\n    subscribeToPushNotifications: async (): Promise<void> => {\n      await this.messenger.call(\n        'NotificationServicesPushController:subscribeToPushNotifications',\n      );\n    },\n    enablePushNotifications: async (addresses: string[]): Promise<void> => {\n      try {\n        await this.messenger.call(\n          'NotificationServicesPushController:enablePushNotifications',\n          addresses,\n        );\n      } catch {\n        // Do nothing, failing silently.\n      }\n    },\n    addPushNotificationLinks: async (addresses: string[]): Promise<void> => {\n      try {\n        await this.messenger.call(\n          'NotificationServicesPushController:addPushNotificationLinks',\n          addresses,\n        );\n      } catch {\n        // Do nothing, failing silently.\n      }\n    },\n    disablePushNotifications: async (): Promise<void> => {\n      try {\n        await this.messenger.call(\n          'NotificationServicesPushController:disablePushNotifications',\n        );\n      } catch {\n        // Do nothing, failing silently.\n      }\n    },\n    deletePushNotificationLinks: async (addresses: string[]): Promise<void> => {\n      try {\n        await this.messenger.call(\n          'NotificationServicesPushController:deletePushNotificationLinks',\n          addresses,\n        );\n      } catch {\n        // Do nothing, failing silently.\n      }\n    },\n    subscribe: (): void => {\n      this.messenger.subscribe(\n        'NotificationServicesPushController:onNewNotifications',\n        (notification): void => {\n          // eslint-disable-next-line @typescript-eslint/no-floating-promises\n          this.updateMetamaskNotificationsList(notification);\n        },\n      );\n    },\n    initializePushNotifications: async (): Promise<void> => {\n      if (!this.state.isNotificationServicesEnabled) {\n        return;\n      }\n      if (this.#pushNotifications.isSetup) {\n        return;\n      }\n\n      // If wallet is unlocked, we can create a fresh push subscription\n      // Otherwise we can subscribe to original subscription\n      try {\n        if (!this.#keyringController.isUnlocked) {\n          throw new Error('Keyring is locked');\n        }\n        await this.enablePushNotifications();\n        this.#pushNotifications.isSetup = true;\n      } catch {\n        await this.#pushNotifications\n          .subscribeToPushNotifications()\n          .catch(() => {\n            // do nothing\n          });\n      }\n    },\n  };\n\n  readonly #accounts = {\n    // Flag to ensure we only setup once\n    isNotificationAccountsSetup: false,\n\n    getNotificationAccounts: (): string[] | null => {\n      const { keyrings } = this.messenger.call('KeyringController:getState');\n      const keyringAccounts = [\n        ...new Set(\n          keyrings\n            .flatMap((keyring) => keyring.accounts)\n            .map((address) => {\n              try {\n                return toChecksumHexAddress(address);\n              } catch {\n                return null;\n              }\n            })\n            .filter(\n              (address): address is string =>\n                address !== null && isValidHexAddress(address),\n            ),\n        ),\n      ];\n      return keyringAccounts.length > 0 ? keyringAccounts : null;\n    },\n\n    /**\n     * Used to get list of addresses from keyring (wallet addresses)\n     *\n     * @returns addresses removed, added, and latest list of addresses\n     */\n    listAccounts: (): {\n      accountsAdded: string[];\n      accountsRemoved: string[];\n      accounts: string[];\n    } => {\n      // Get previous and current account sets\n      const nonChecksumAccounts = this.#accounts.getNotificationAccounts();\n      if (!nonChecksumAccounts) {\n        return {\n          accountsAdded: [],\n          accountsRemoved: [],\n          accounts: [],\n        };\n      }\n\n      const accounts = nonChecksumAccounts\n        .map((address) => toChecksumHexAddress(address))\n        .filter((address) => isValidHexAddress(address));\n      const currentAccountsSet = new Set(accounts);\n      const prevAccountsSet = new Set(this.state.subscriptionAccountsSeen);\n\n      // Invalid value you cannot have zero accounts\n      // Only occurs when the Accounts controller is initializing.\n      if (accounts.length === 0) {\n        return {\n          accountsAdded: [],\n          accountsRemoved: [],\n          accounts: [],\n        };\n      }\n\n      // Calculate added and removed addresses\n      const accountsAdded = accounts.filter(\n        (account) => !prevAccountsSet.has(account),\n      );\n      const accountsRemoved = [...prevAccountsSet.values()].filter(\n        (account) => !currentAccountsSet.has(account),\n      );\n\n      // Update accounts seen\n      this.update((state) => {\n        state.subscriptionAccountsSeen = [...currentAccountsSet];\n      });\n\n      return {\n        accountsAdded,\n        accountsRemoved,\n        accounts,\n      };\n    },\n\n    /**\n     * Initializes the cache/previous list. This is handy so we have an accurate in-mem state of the previous list of accounts.\n     */\n    initialize: (): void => {\n      if (\n        this.#keyringController.isUnlocked &&\n        !this.#accounts.isNotificationAccountsSetup\n      ) {\n        this.#accounts.listAccounts();\n        this.#accounts.isNotificationAccountsSetup = true;\n      }\n    },\n\n    /**\n     * Subscription to any state change in the keyring controller (aka wallet accounts).\n     * We can call the `listAccounts` defined above to find out about any accounts added, removed\n     * And call effects to subscribe/unsubscribe to notifications.\n     */\n    subscribe: (): void => {\n      const debouncedUpdateAccountNotifications = debounce(\n        async (\n          totalAccounts?: number,\n          prevTotalAccounts?: number,\n        ): Promise<void> => {\n          const hasTotalAccountsChanged = totalAccounts !== prevTotalAccounts;\n          if (\n            !this.state.isNotificationServicesEnabled ||\n            !hasTotalAccountsChanged\n          ) {\n            return;\n          }\n\n          const { accountsAdded, accountsRemoved } =\n            this.#accounts.listAccounts();\n\n          const promises: Promise<unknown>[] = [];\n          if (accountsAdded.length > 0) {\n            promises.push(this.enableAccounts(accountsAdded));\n          }\n          if (accountsRemoved.length > 0) {\n            promises.push(this.disableAccounts(accountsRemoved));\n          }\n          await Promise.allSettled(promises);\n        },\n        ACCOUNTS_UPDATE_DEBOUNCE_TIME_MS,\n      );\n\n      this.messenger.subscribe(\n        'KeyringController:stateChange',\n        // Using void return for async callback - result is intentionally ignored\n        // eslint-disable-next-line @typescript-eslint/no-misused-promises\n        debouncedUpdateAccountNotifications,\n        (state: KeyringControllerState): number => {\n          return (\n            state?.keyrings?.flatMap?.((keyring) => keyring.accounts)?.length ??\n            0\n          );\n        },\n      );\n    },\n  };\n\n  readonly #locale: () => string;\n\n  readonly #featureAnnouncementEnv: FeatureAnnouncementEnv;\n\n  readonly #env: ENV;\n\n  /**\n   * Creates a NotificationServicesController 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   * @param args.env - environment variables for a given controller.\n   * @param args.env.featureAnnouncements - env variables for feature announcements.\n   * @param args.env.locale - users locale for better dynamic server notifications\n   * @param args.env.env - the environment to use for the controller\n   */\n  constructor({\n    messenger,\n    state,\n    env,\n  }: {\n    messenger: NotificationServicesControllerMessenger;\n    state?: Partial<NotificationServicesControllerState>;\n    env: {\n      featureAnnouncements: FeatureAnnouncementEnv;\n      locale?: () => string;\n      env?: ENV;\n    };\n  }) {\n    super({\n      messenger,\n      metadata,\n      name: controllerName,\n      state: { ...defaultState, ...state },\n    });\n\n    this.#featureAnnouncementEnv = env.featureAnnouncements;\n    this.#locale = env.locale ?? ((): string => 'en');\n    this.#env = env.env ?? 'prd';\n\n    this.messenger.registerMethodActionHandlers(\n      this,\n      MESSENGER_EXPOSED_METHODS,\n    );\n\n    this.#clearLoadingStates();\n  }\n\n  init(): void {\n    this.#keyringController.setupLockedStateSubscriptions(\n      async (): Promise<void> => {\n        this.#accounts.initialize();\n        await this.#pushNotifications.initializePushNotifications();\n      },\n    );\n\n    this.#accounts.initialize();\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.#pushNotifications.initializePushNotifications();\n    this.#accounts.subscribe();\n    this.#pushNotifications.subscribe();\n  }\n\n  #clearLoadingStates(): void {\n    this.update((state) => {\n      state.isUpdatingMetamaskNotifications = false;\n      state.isCheckingAccountsPresence = false;\n      state.isFetchingMetamaskNotifications = false;\n      state.isUpdatingMetamaskNotificationsAccount = [];\n    });\n  }\n\n  #assertAuthEnabled(): void {\n    if (!this.#auth.isSignedIn()) {\n      this.update((state) => {\n        state.isNotificationServicesEnabled = false;\n      });\n      throw new Error('User is not signed in.');\n    }\n  }\n\n  async #enableAuth(): Promise<void> {\n    const isSignedIn = this.#auth.isSignedIn();\n    if (!isSignedIn) {\n      await this.#auth.signIn();\n    }\n  }\n\n  async #getBearerToken(): Promise<{ bearerToken: string }> {\n    this.#assertAuthEnabled();\n\n    const bearerToken = await this.#auth.getBearerToken();\n\n    if (!bearerToken) {\n      throw new Error('Missing BearerToken');\n    }\n\n    return { bearerToken };\n  }\n\n  /**\n   * Sets the state of notification creation process.\n   *\n   * This method updates the `isUpdatingMetamaskNotifications` state, which can be used to indicate\n   * whether the notification creation process is currently active or not. This is useful\n   * for UI elements that need to reflect the state of ongoing operations, such as loading\n   * indicators or disabled buttons during processing.\n   *\n   * @param isUpdatingMetamaskNotifications - A boolean value representing the new state of the notification creation process.\n   */\n  #setIsUpdatingMetamaskNotifications(\n    isUpdatingMetamaskNotifications: boolean,\n  ): void {\n    this.update((state) => {\n      state.isUpdatingMetamaskNotifications = isUpdatingMetamaskNotifications;\n    });\n  }\n\n  /**\n   * Updates the state to indicate whether fetching of MetaMask notifications is in progress.\n   *\n   * This method is used to set the `isFetchingMetamaskNotifications` state, which can be utilized\n   * to show or hide loading indicators in the UI when notifications are being fetched.\n   *\n   * @param isFetchingMetamaskNotifications - A boolean value representing the fetching state.\n   */\n  #setIsFetchingMetamaskNotifications(\n    isFetchingMetamaskNotifications: boolean,\n  ): void {\n    this.update((state) => {\n      state.isFetchingMetamaskNotifications = isFetchingMetamaskNotifications;\n    });\n  }\n\n  /**\n   * Updates the state to indicate that the checking of accounts presence is in progress.\n   *\n   * This method modifies the `isCheckingAccountsPresence` state, which can be used to manage UI elements\n   * that depend on the status of account presence checks, such as displaying loading indicators or disabling\n   * buttons while the check is ongoing.\n   *\n   * @param isCheckingAccountsPresence - A boolean value indicating whether the account presence check is currently active.\n   */\n  #setIsCheckingAccountsPresence(isCheckingAccountsPresence: boolean): void {\n    this.update((state) => {\n      state.isCheckingAccountsPresence = isCheckingAccountsPresence;\n    });\n  }\n\n  /**\n   * Updates the state to indicate that account updates are in progress.\n   * Removes duplicate accounts before updating the state.\n   *\n   * @param accounts - The accounts being updated.\n   */\n  #updateUpdatingAccountsState(accounts: string[]): void {\n    this.update((state) => {\n      const uniqueAccounts = new Set([\n        ...state.isUpdatingMetamaskNotificationsAccount,\n        ...accounts,\n      ]);\n      state.isUpdatingMetamaskNotificationsAccount = Array.from(uniqueAccounts);\n    });\n  }\n\n  /**\n   * Clears the state indicating that account updates are complete.\n   *\n   * @param accounts - The accounts that have finished updating.\n   */\n  #clearUpdatingAccountsState(accounts: string[]): void {\n    this.update((state) => {\n      state.isUpdatingMetamaskNotificationsAccount =\n        state.isUpdatingMetamaskNotificationsAccount.filter(\n          (existingAccount) => !accounts.includes(existingAccount),\n        );\n    });\n  }\n\n  /**\n   * Public method to expose enabling push notifications\n   */\n  public async enablePushNotifications(): Promise<void> {\n    try {\n      const { bearerToken } = await this.#getBearerToken();\n      const { accounts } = this.#accounts.listAccounts();\n      const addressesWithNotifications = await getNotificationsApiConfigCached(\n        bearerToken,\n        accounts,\n        this.#env,\n      );\n      const addresses = addressesWithNotifications\n        .filter((addressConfig) => Boolean(addressConfig.enabled))\n        .map((addressConfig) => addressConfig.address);\n      if (addresses.length > 0) {\n        await this.#pushNotifications.enablePushNotifications(addresses);\n      }\n    } catch {\n      // Do nothing, failing silently.\n    }\n  }\n\n  /**\n   * Public method to expose disabling push notifications\n   */\n  public async disablePushNotifications(): Promise<void> {\n    await this.#pushNotifications.disablePushNotifications();\n  }\n\n  public async checkAccountsPresence(\n    accounts: string[],\n  ): Promise<Record<string, boolean>> {\n    try {\n      this.#setIsCheckingAccountsPresence(true);\n\n      // Retrieve user storage\n      const { bearerToken } = await this.#getBearerToken();\n      const addressesWithNotifications = await getNotificationsApiConfigCached(\n        bearerToken,\n        accounts,\n        this.#env,\n      );\n\n      const result: Record<string, boolean> = {};\n      addressesWithNotifications.forEach((a) => {\n        result[a.address] = a.enabled;\n      });\n      return result;\n    } catch (error) {\n      log.error('Failed to check accounts presence', error);\n      throw error;\n    } finally {\n      this.#setIsCheckingAccountsPresence(false);\n    }\n  }\n\n  /**\n   * Sets the enabled state of feature announcements.\n   *\n   * **Action** - used in the notification settings to enable/disable feature announcements.\n   *\n   * @param featureAnnouncementsEnabled - A boolean value indicating the desired enabled state of the feature announcements.\n   * @async\n   * @throws {Error} If fails to update\n   */\n  public async setFeatureAnnouncementsEnabled(\n    featureAnnouncementsEnabled: boolean,\n  ): Promise<void> {\n    try {\n      this.update((state) => {\n        state.isFeatureAnnouncementsEnabled = featureAnnouncementsEnabled;\n      });\n    } catch (error) {\n      log.error('Unable to toggle feature announcements', error);\n      throw new Error('Unable to toggle feature announcements');\n    }\n  }\n\n  /**\n   * This creates/re-creates on-chain triggers defined in User Storage.\n   *\n   * **Action** - Used during Sign In / Enabling of notifications.\n   *\n   * @param opts - optional options to mutate this functionality\n   * @param opts.resetNotifications - this will not use the users stored preferences, and instead re-create notification triggers\n   * It will help in case uses get into a corrupted state or wants to wipe their notifications.\n   * @returns The updated or newly created user storage.\n   * @throws {Error} Throws an error if unauthenticated or from other operations.\n   */\n  public async createOnChainTriggers(opts?: {\n    resetNotifications?: boolean;\n  }): Promise<void> {\n    try {\n      this.#setIsUpdatingMetamaskNotifications(true);\n\n      const { bearerToken } = await this.#getBearerToken();\n\n      const { accounts } = this.#accounts.listAccounts();\n\n      // 1. See if has enabled notifications before\n      const addressesWithNotifications = await getNotificationsApiConfigCached(\n        bearerToken,\n        accounts,\n        this.#env,\n      );\n\n      // Notifications API can return array with addresses set to false\n      // So assert that at least one address is enabled\n      let accountsWithNotifications = addressesWithNotifications\n        .filter((addressConfig) => Boolean(addressConfig.enabled))\n        .map((addressConfig) => addressConfig.address);\n\n      // 2. Enable Notifications (if no accounts subscribed or we are resetting)\n      if (accountsWithNotifications.length === 0 || opts?.resetNotifications) {\n        await updateOnChainNotifications(\n          bearerToken,\n          accounts.map((address) => ({ address, enabled: true })),\n          this.#env,\n        );\n        accountsWithNotifications = accounts;\n      }\n\n      // 3. Lazily enable push notifications (FCM may take some time, so keeps UI unblocked)\n      this.#pushNotifications\n        .enablePushNotifications(accountsWithNotifications)\n        .catch(() => {\n          // Do Nothing\n        });\n\n      // Update the state of the controller\n      this.update((state) => {\n        // User is re-subscribing (daily resub to get latest notifications)\n        if (state.isNotificationServicesEnabled) {\n          // Keep their existing preferences on re-subscribe\n          // No state updates needed - preserving user's current settings\n        } else {\n          // User is turning on notifications from a disabled state\n          state.isNotificationServicesEnabled = true;\n          state.isFeatureAnnouncementsEnabled = true;\n          state.isMetamaskNotificationsFeatureSeen = true;\n        }\n      });\n    } catch (error) {\n      log.error('Failed to create On Chain triggers', error);\n      throw new Error('Failed to create On Chain triggers');\n    } finally {\n      this.#setIsUpdatingMetamaskNotifications(false);\n    }\n  }\n\n  /**\n   * Enables all MetaMask notifications for the user.\n   * This is identical flow when initializing notifications for the first time.\n   *\n   * @throws {Error} If there is an error during the process of enabling notifications.\n   */\n  public async enableMetamaskNotifications(): Promise<void> {\n    try {\n      this.#setIsUpdatingMetamaskNotifications(true);\n      await this.#enableAuth();\n      await this.createOnChainTriggers();\n    } catch (error) {\n      log.error('Unable to enable notifications', error);\n      throw new Error('Unable to enable notifications');\n    } finally {\n      this.#setIsUpdatingMetamaskNotifications(false);\n    }\n  }\n\n  /**\n   * Disables all MetaMask notifications for the user.\n   * This method ensures that the user is authenticated, retrieves all linked accounts,\n   * and disables on-chain triggers for each account. It also sets the global notification\n   * settings for MetaMask, feature announcements to false.\n   *\n   * @throws {Error} If the user is not authenticated or if there is an error during the process.\n   */\n  public async disableNotificationServices(): Promise<void> {\n    this.#setIsUpdatingMetamaskNotifications(true);\n\n    // Attempt Disable Push Notifications\n    try {\n      await this.#pushNotifications.disablePushNotifications();\n    } catch {\n      // Do nothing\n    }\n\n    // Update State: remove non-permitted notifications & disable flags\n    const snapNotifications = this.state.metamaskNotificationsList.filter(\n      (notification) => notification.type === TRIGGER_TYPES.SNAP,\n    );\n    this.update((state) => {\n      state.isNotificationServicesEnabled = false;\n      state.isFeatureAnnouncementsEnabled = false;\n      // reassigning the notifications list with just snaps\n      // since the disable shouldn't affect snaps notifications\n      state.metamaskNotificationsList = snapNotifications;\n    });\n\n    // Finish Updating State\n    this.#setIsUpdatingMetamaskNotifications(false);\n  }\n\n  /**\n   * Deletes on-chain triggers associated with a specific account/s.\n   * This method performs several key operations:\n   * 1. Validates Auth\n   * 2. Deletes accounts\n   * (note) We do not need to look through push notifications as we've deleted triggers\n   *\n   * **Action** - When a user disables notifications for a given account in settings.\n   *\n   * @param accounts - The account for which on-chain triggers are to be deleted.\n   * @returns A promise that resolves to void or an object containing a success message.\n   * @throws {Error} Throws an error if unauthenticated or from other operations.\n   */\n  public async disableAccounts(accounts: string[]): Promise<void> {\n    try {\n      this.#updateUpdatingAccountsState(accounts);\n      // Get and Validate BearerToken and User Storage Key\n      const { bearerToken } = await this.#getBearerToken();\n\n      // Delete these UUIDs (Mutates User Storage)\n      await updateOnChainNotifications(\n        bearerToken,\n        accounts.map((address) => ({ address, enabled: false })),\n        this.#env,\n      );\n\n      await this.#pushNotifications.deletePushNotificationLinks(accounts);\n    } catch {\n      throw new Error('Failed to delete OnChain triggers');\n    } finally {\n      this.#clearUpdatingAccountsState(accounts);\n    }\n  }\n\n  /**\n   * Updates/Creates on-chain triggers for a specific account.\n   *\n   * This method performs several key operations:\n   * 1. Validates Auth & Storage\n   * 2. Finds and creates any missing triggers associated with the account\n   * 3. Enables any related push notifications\n   * 4. Updates Storage to reflect new state.\n   *\n   * **Action** - When a user enables notifications for an account\n   *\n   * @param accounts - List of accounts you want to update.\n   * @returns A promise that resolves to the updated user storage.\n   * @throws {Error} Throws an error if unauthenticated or from other operations.\n   */\n  public async enableAccounts(accounts: string[]): Promise<void> {\n    try {\n      this.#updateUpdatingAccountsState(accounts);\n\n      const { bearerToken } = await this.#getBearerToken();\n      await updateOnChainNotifications(\n        bearerToken,\n        accounts.map((address) => ({ address, enabled: true })),\n        this.#env,\n      );\n\n      await this.#pushNotifications.addPushNotificationLinks(accounts);\n    } catch (error) {\n      log.error('Failed to update OnChain triggers', error);\n      throw new Error('Failed to update OnChain triggers');\n    } finally {\n      this.#clearUpdatingAccountsState(accounts);\n    }\n  }\n\n  /**\n   * Fetches the list of metamask notifications.\n   * This includes OnChain notifications; Feature Announcements; and Snap Notifications.\n   *\n   * **Action** - When a user views the notification list page/dropdown\n   *\n   * @param previewToken - the preview token to use if needed\n   * @returns A promise that resolves to the list of notifications.\n   * @throws {Error} Throws an error if unauthenticated or from other operations.\n   */\n  public async fetchAndUpdateMetamaskNotifications(\n    previewToken?: string,\n  ): Promise<INotification[]> {\n    try {\n      this.#setIsFetchingMetamaskNotifications(true);\n\n      // This is used by Feature Announcement & On Chain\n      // Not used by Snaps\n      const isGlobalNotifsEnabled = this.state.isNotificationServicesEnabled;\n\n      // Raw Feature Notifications\n      const rawAnnouncements =\n        isGlobalNotifsEnabled && this.state.isFeatureAnnouncementsEnabled\n          ? await getFeatureAnnouncementNotifications(\n              this.#featureAnnouncementEnv,\n              previewToken,\n            ).catch(() => [])\n          : [];\n\n      // Raw On Chain Notifications\n      const rawOnChainNotifications: NormalisedAPINotification[] = [];\n      if (isGlobalNotifsEnabled) {\n        try {\n          const { bearerToken } = await this.#getBearerToken();\n          const { accounts } = this.#accounts.listAccounts();\n          const addressesWithNotifications = (\n            await getNotificationsApiConfigCached(\n              bearerToken,\n              accounts,\n              this.#env,\n            )\n          )\n            .filter((addressConfig) => Boolean(addressConfig.enabled))\n            .map((addressConfig) => addressConfig.address);\n          const notifications = await getAPINotifications(\n            bearerToken,\n            addressesWithNotifications,\n            this.#locale(),\n            this.#featureAnnouncementEnv.platform,\n            this.#env,\n          ).catch(() => []);\n          rawOnChainNotifications.push(...notifications);\n        } catch {\n          // Do nothing\n        }\n      }\n\n      // Snap Notifications (original)\n      // We do not want to remove them\n      const snapNotifications = this.state.metamaskNotificationsList.filter(\n        (notification) => notification.type === TRIGGER_TYPES.SNAP,\n      );\n\n      const readIds = this.state.metamaskNotificationsReadList;\n\n      // Combine Notifications\n      const metamaskNotifications: INotification[] = [\n        ...processAndFilterNotifications(rawAnnouncements, readIds),\n        ...processAndFilterNotifications(rawOnChainNotifications, readIds),\n        ...snapNotifications,\n      ];\n\n      // Sort Notifications\n      metamaskNotifications.sort(\n        (notificationA, notificationB) =>\n          new Date(notificationB.createdAt).getTime() -\n          new Date(notificationA.createdAt).getTime(),\n      );\n\n      // Update State\n      this.update((state) => {\n        state.metamaskNotificationsList = metamaskNotifications;\n      });\n\n      this.messenger.publish(\n        `${controllerName}:notificationsListUpdated`,\n        this.state.metamaskNotificationsList,\n      );\n\n      this.#setIsFetchingMetamaskNotifications(false);\n      return metamaskNotifications;\n    } catch (error) {\n      this.#setIsFetchingMetamaskNotifications(false);\n      log.error('Failed to fetch notifications', error);\n      throw new Error('Failed to fetch notifications');\n    }\n  }\n\n  /**\n   * Gets the specified type of notifications from state.\n   *\n   * @param type - The trigger type.\n   * @returns An array of notifications of the passed in type.\n   * @throws Throws an error if an invalid trigger type is passed.\n   */\n  public getNotificationsByType(type: TRIGGER_TYPES): INotification[] {\n    assert(\n      Object.values(TRIGGER_TYPES).includes(type),\n      'Invalid trigger type.',\n    );\n    return this.state.metamaskNotificationsList.filter(\n      (notification) => notification.type === type,\n    );\n  }\n\n  /**\n   * Used to delete a notification by id.\n   *\n   * Note: This function should only be used for notifications that are stored\n   * in this controller directly, currently only snaps notifications.\n   *\n   * @param id - The id of the notification to delete.\n   */\n  public async deleteNotificationById(id: string): Promise<void> {\n    const fetchedNotification = this.state.metamaskNotificationsList.find(\n      (notification) => notification.id === id,\n    );\n\n    assert(\n      fetchedNotification,\n      'The notification to be deleted does not exist.',\n    );\n\n    assert(\n      locallyPersistedNotificationTypes.has(fetchedNotification.type),\n      `The notification type of \"${\n        // notifications are guaranteed to have type properties which equate to strings\n        fetchedNotification.type as string\n      }\" is not locally persisted, only the following types can use this function: ${[\n        ...locallyPersistedNotificationTypes,\n      ].join(', ')}.`,\n    );\n\n    const newList = this.state.metamaskNotificationsList.filter(\n      (notification) => notification.id !== id,\n    );\n\n    this.update((state) => {\n      state.metamaskNotificationsList = newList;\n    });\n  }\n\n  /**\n   * Used to batch delete notifications by id.\n   *\n   * Note: This function should only be used for notifications that are stored\n   * in this controller directly, currently only snaps notifications.\n   *\n   * @param ids - The ids of the notifications to delete.\n   */\n  public async deleteNotificationsById(ids: string[]): Promise<void> {\n    for (const id of ids) {\n      await this.deleteNotificationById(id);\n    }\n\n    this.messenger.publish(\n      `${controllerName}:notificationsListUpdated`,\n      this.state.metamaskNotificationsList,\n    );\n  }\n\n  /**\n   * Marks specified metamask notifications as read.\n   *\n   * @param notifications - An array of notifications to be marked as read. Each notification should include its type and read status.\n   * @returns A promise that resolves when the operation is complete.\n   */\n  public async markMetamaskNotificationsAsRead(\n    notifications: MarkAsReadNotificationsParam,\n  ): Promise<void> {\n    let onchainNotificationIds: string[] = [];\n    let featureAnnouncementNotificationIds: string[] = [];\n    let snapNotificationIds: string[] = [];\n\n    try {\n      const [\n        onChainNotifications,\n        featureAnnouncementNotifications,\n        snapNotifications,\n      ] = notifications.reduce<\n        [\n          MarkAsReadNotificationsParam,\n          MarkAsReadNotificationsParam,\n          MarkAsReadNotificationsParam,\n        ]\n      >(\n        (allNotifications, notification) => {\n          if (!notification.isRead) {\n            switch (notification.type) {\n              case TRIGGER_TYPES.FEATURES_ANNOUNCEMENT:\n                allNotifications[1].push(notification);\n                break;\n              case TRIGGER_TYPES.SNAP:\n                allNotifications[2].push(notification);\n                break;\n              default:\n                allNotifications[0].push(notification);\n            }\n          }\n          return allNotifications;\n        },\n        [[], [], []],\n      );\n\n      // Mark On-Chain Notifications as Read\n      if (onChainNotifications.length > 0) {\n        const bearerToken = await this.#auth.getBearerToken();\n\n        if (bearerToken) {\n          onchainNotificationIds = onChainNotifications.map(\n            (notification) => notification.id,\n          );\n          await markNotificationsAsRead(\n            bearerToken,\n            onchainNotificationIds,\n            this.#env,\n          ).catch(() => {\n            onchainNotificationIds = [];\n            log.warn('Unable to mark onchain notifications as read');\n          });\n        }\n      }\n\n      // Mark Off-Chain notifications as Read\n      if (featureAnnouncementNotifications.length > 0) {\n        featureAnnouncementNotificationIds =\n          featureAnnouncementNotifications.map(\n            (notification) => notification.id,\n          );\n      }\n\n      if (snapNotifications.length > 0) {\n        snapNotificationIds = snapNotifications.map(\n          (notification) => notification.id,\n        );\n      }\n    } catch (error) {\n      log.warn('Something failed when marking notifications as read', error);\n    }\n\n    // Update the state (state is also used on counter & badge)\n    this.update((state) => {\n      const currentReadList = state.metamaskNotificationsReadList;\n      const newReadIds = [\n        ...featureAnnouncementNotificationIds,\n        ...snapNotificationIds,\n      ];\n      state.metamaskNotificationsReadList = [\n        ...new Set([...currentReadList, ...newReadIds]),\n      ];\n\n      state.metamaskNotificationsList = state.metamaskNotificationsList.map(\n        (notification: INotification) => {\n          if (\n            newReadIds.includes(notification.id) ||\n            onchainNotificationIds.includes(notification.id)\n          ) {\n            if (notification.type === TRIGGER_TYPES.SNAP) {\n              return {\n                ...notification,\n                isRead: true,\n                readDate: new Date().toISOString(),\n              };\n            }\n            return { ...notification, isRead: true };\n          }\n          return notification;\n        },\n      );\n    });\n\n    this.messenger.publish(\n      `${controllerName}:markNotificationsAsRead`,\n      this.state.metamaskNotificationsList,\n    );\n  }\n\n  /**\n   * Updates the list of MetaMask notifications by adding a new notification at the beginning of the list.\n   * This method ensures that the most recent notification is displayed first in the UI.\n   *\n   * @param notification - The new notification object to be added to the list.\n   * @returns A promise that resolves when the notification list has been successfully updated.\n   */\n  public async updateMetamaskNotificationsList(\n    notification: INotification,\n  ): Promise<void> {\n    if (\n      this.state.metamaskNotificationsList.some(\n        (existingNotification) => existingNotification.id === notification.id,\n      )\n    ) {\n      return;\n    }\n\n    const processedNotification = safeProcessNotification(notification);\n\n    if (processedNotification) {\n      this.update((state) => {\n        const existingNotificationIds = new Set(\n          state.metamaskNotificationsList.map(\n            (existingNotification) => existingNotification.id,\n          ),\n        );\n        // Add the new notification only if its ID is not already present in the list\n        if (!existingNotificationIds.has(processedNotification.id)) {\n          state.metamaskNotificationsList = [\n            processedNotification,\n            ...state.metamaskNotificationsList,\n          ];\n        }\n      });\n\n      this.messenger.publish(\n        `${controllerName}:notificationsListUpdated`,\n        this.state.metamaskNotificationsList,\n      );\n    }\n  }\n\n  /**\n   * Creates an perp order notification subscription.\n   * Requires notifications and auth to be enabled to start receiving this notifications\n   *\n   * @param input perp input\n   */\n  public async sendPerpPlaceOrderNotification(\n    input: OrderInput,\n  ): Promise<void> {\n    try {\n      const { bearerToken } = await this.#getBearerToken();\n      await createPerpOrderNotification(bearerToken, input);\n    } catch {\n      // Do Nothing\n    }\n  }\n}\n"]}