@metamask-previews/notification-services-controller 24.1.0-preview-e7c25d6b8 → 24.1.1-preview-0691d2c35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/dist/NotificationServicesController/NotificationServicesController.cjs +8 -3
- package/dist/NotificationServicesController/NotificationServicesController.cjs.map +1 -1
- package/dist/NotificationServicesController/NotificationServicesController.d.cts.map +1 -1
- package/dist/NotificationServicesController/NotificationServicesController.d.mts.map +1 -1
- package/dist/NotificationServicesController/NotificationServicesController.mjs +8 -3
- package/dist/NotificationServicesController/NotificationServicesController.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [24.1.1]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Fetch feature announcements based on AUS `marketing.inAppNotificationsEnabled` preferences instead of the deprecated `isFeatureAnnouncementsEnabled` controller state. ([#8861](https://github.com/MetaMask/core/pull/8861))
|
|
15
|
+
|
|
10
16
|
## [24.1.0]
|
|
11
17
|
|
|
12
18
|
### Added
|
|
@@ -750,7 +756,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
750
756
|
|
|
751
757
|
- Initial release
|
|
752
758
|
|
|
753
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@24.1.
|
|
759
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@24.1.1...HEAD
|
|
760
|
+
[24.1.1]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@24.1.0...@metamask/notification-services-controller@24.1.1
|
|
754
761
|
[24.1.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@24.0.0...@metamask/notification-services-controller@24.1.0
|
|
755
762
|
[24.0.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@23.1.1...@metamask/notification-services-controller@24.0.0
|
|
756
763
|
[23.1.1]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@23.1.0...@metamask/notification-services-controller@23.1.1
|
|
@@ -708,8 +708,14 @@ class NotificationServicesController extends base_controller_1.BaseController {
|
|
|
708
708
|
// This is used by Feature Announcement & On Chain
|
|
709
709
|
// Not used by Snaps
|
|
710
710
|
const isGlobalNotifsEnabled = this.state.isNotificationServicesEnabled;
|
|
711
|
+
const notificationPreferences = isGlobalNotifsEnabled
|
|
712
|
+
? await this.messenger
|
|
713
|
+
.call('AuthenticatedUserStorageService:getNotificationPreferences')
|
|
714
|
+
.catch(() => null)
|
|
715
|
+
: null;
|
|
711
716
|
// Raw Feature Notifications
|
|
712
|
-
const rawAnnouncements = isGlobalNotifsEnabled &&
|
|
717
|
+
const rawAnnouncements = isGlobalNotifsEnabled &&
|
|
718
|
+
notificationPreferences?.marketing.inAppNotificationsEnabled
|
|
713
719
|
? await (0, feature_announcements_1.getFeatureAnnouncementNotifications)(__classPrivateFieldGet(this, _NotificationServicesController_featureAnnouncementEnv, "f"), previewToken).catch(() => [])
|
|
714
720
|
: [];
|
|
715
721
|
// Raw On Chain Notifications
|
|
@@ -717,8 +723,7 @@ class NotificationServicesController extends base_controller_1.BaseController {
|
|
|
717
723
|
if (isGlobalNotifsEnabled) {
|
|
718
724
|
try {
|
|
719
725
|
const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
|
|
720
|
-
const
|
|
721
|
-
const addressesWithNotifications = (preferences?.walletActivity.accounts ?? [])
|
|
726
|
+
const addressesWithNotifications = (notificationPreferences?.walletActivity.accounts ?? [])
|
|
722
727
|
.filter((account) => account.enabled)
|
|
723
728
|
.map((account) => account.address);
|
|
724
729
|
const notifications = await (0, api_notifications_1.getAPINotifications)(bearerToken, addressesWithNotifications, __classPrivateFieldGet(this, _NotificationServicesController_locale, "f").call(this), __classPrivateFieldGet(this, _NotificationServicesController_featureAnnouncementEnv, "f").platform, __classPrivateFieldGet(this, _NotificationServicesController_env, "f")).catch(() => []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationServicesController.cjs","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AuthenticatedUserStorageServiceGetNotificationPreferencesAction,\n AuthenticatedUserStorageServicePutNotificationPreferencesAction,\n NotificationPreferences,\n PerpsPreference,\n SocialAIPreference,\n WalletActivityAccount,\n} from '@metamask/authenticated-user-storage';\nimport 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 type { Hex } from '@metamask/utils';\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} 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\nexport type NotificationServicesControllerEnableNotificationsOptions = {\n /**\n * Whether the user has consented to marketing notifications. Used only when\n * notification preferences are being initialized for the first time to seed\n * marketing push notifications.\n */\n hasMarketingConsent?: boolean;\n /**\n * Whether product announcements are enabled. Used only when notification\n * preferences are being initialized for the first time to seed marketing\n * in-app notifications.\n */\n productAnnouncementEnabled?: boolean;\n /**\n * Whether to attempt FCM/device push registration after notification\n * preferences are initialized or refreshed. This does not request OS push\n * permission.\n *\n * @default true\n */\n registerPushNotifications?: boolean;\n};\n\nexport type NotificationServicesControllerCreateOnChainTriggersOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nexport type NotificationServicesControllerEnableMetamaskNotificationsOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nconst locallyPersistedNotificationTypes = new Set<TRIGGER_TYPES>([\n TRIGGER_TYPES.SNAP,\n]);\n\n/**\n * Hardcoded default Perps notification preferences. Applied when notification\n * preferences are initialized for the first time.\n */\nexport const DEFAULT_PERPS_PREFERENCES: PerpsPreference = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n};\n\n/**\n * Hardcoded default Social AI notification preferences. Applied when\n * notification preferences are initialized for the first time.\n */\nexport const DEFAULT_SOCIAL_AI_PREFERENCES: Required<SocialAIPreference> = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n txAmountLimit: 500,\n mutedTraderProfileIds: [],\n};\n\n/**\n * Builds wallet-activity preferences from the keyring's current accounts.\n *\n * @param accounts - The keyring accounts to build wallet-activity entries for.\n * @returns An array of wallet-activity account entries (lower-cased addresses).\n */\nconst buildWalletActivityAccounts = (\n accounts: { address: string; enabled: boolean }[],\n): WalletActivityAccount[] =>\n accounts.map(({ address, enabled }) => {\n const lowercased = address.toLowerCase();\n return {\n address: lowercased as Hex,\n enabled,\n };\n });\n\n/**\n * Builds wallet-activity initialization from the Trigger API. If Trigger has no\n * enabled entries for the current keyring accounts, this is a first-time\n * notification setup and all current accounts should start enabled.\n *\n * @param bearerToken - JWT used to query Trigger API.\n * @param accounts - The keyring accounts to initialize.\n * @param env - The environment to use for the Trigger API call.\n * @returns Wallet-activity account initialization entries.\n */\nconst buildWalletActivityAccountsFromTriggerConfig = async (\n bearerToken: string,\n accounts: string[],\n env: ENV,\n): Promise<{ address: string; enabled: boolean }[]> => {\n const triggerConfig = await getNotificationsApiConfigCached(\n bearerToken,\n accounts,\n env,\n );\n const triggerConfigByAddress = new Map(\n triggerConfig.map(({ address, enabled }) => [\n address.toLowerCase(),\n enabled,\n ]),\n );\n const hasEnabledTriggerAccount = accounts.some(\n (address) => triggerConfigByAddress.get(address.toLowerCase()) === true,\n );\n\n return accounts.map((address) => ({\n address,\n enabled: hasEnabledTriggerAccount\n ? (triggerConfigByAddress.get(address.toLowerCase()) ?? false)\n : true,\n }));\n};\n\n/**\n * Builds a fresh `NotificationPreferences` blob using hardcoded defaults for\n * Perps and Social AI, the supplied wallet-activity accounts and the user's\n * marketing/product-announcement flags.\n *\n * @param walletActivityAccounts - The wallet-activity account config to initialize.\n * @param hasMarketingConsent - Whether marketing push notifications should be enabled.\n * @param productAnnouncementEnabled - Whether marketing in-app notifications should be enabled.\n * @returns A complete `NotificationPreferences` object.\n */\nconst buildFreshPreferences = (\n walletActivityAccounts: { address: string; enabled: boolean }[],\n hasMarketingConsent: boolean,\n productAnnouncementEnabled: boolean,\n): NotificationPreferences => ({\n walletActivity: {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n accounts: buildWalletActivityAccounts(walletActivityAccounts),\n },\n marketing: {\n inAppNotificationsEnabled: productAnnouncementEnabled,\n pushNotificationsEnabled: hasMarketingConsent,\n },\n perps: { ...DEFAULT_PERPS_PREFERENCES },\n socialAI: { ...DEFAULT_SOCIAL_AI_PREFERENCES },\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 // Authenticated User Storage Requests\n | AuthenticatedUserStorageServiceGetNotificationPreferencesAction\n | AuthenticatedUserStorageServicePutNotificationPreferencesAction\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 * Updates the `walletActivity.accounts` entries in the user's\n * notification-preferences blob in {@link AuthenticatedUserStorageService}.\n *\n * `putNotificationPreferences` replaces the entire blob, so we read the\n * current preferences, merge the supplied updates into\n * `walletActivity.accounts`, and write the result back. This helper is only\n * meant to be used for incremental updates (enable/disable individual\n * accounts) after the preferences blob has already been initialized via\n * {@link createOnChainTriggers}; callers should not rely on it to perform\n * first-time initialization.\n *\n * @param updates - Addresses to register, each with the desired `enabled` flag\n */\n async #registerWalletActivityAddresses(\n updates: { address: string; enabled: boolean }[],\n ): Promise<void> {\n if (updates.length === 0) {\n return;\n }\n\n const currentPreferences = await this.messenger\n .call('AuthenticatedUserStorageService:getNotificationPreferences')\n .catch((error) => {\n log.error(\n 'Failed to get notification preferences. Re-initializing them instead.',\n error,\n );\n // TODO: return null once validation error captured\n // return null;\n throw error;\n });\n\n if (!currentPreferences) {\n log.warn(\n 'Preferences blob not yet initialized; run `createOnChainTriggers` first.',\n );\n return;\n }\n\n const accountsByAddress = new Map(\n currentPreferences.walletActivity.accounts.map((account) => [\n account.address.toLowerCase(),\n { ...account, address: account.address.toLowerCase() as Hex },\n ]),\n );\n for (const update of updates) {\n const address = update.address.toLowerCase() as Hex;\n accountsByAddress.set(address, { address, enabled: update.enabled });\n }\n\n const nextPreferences: NotificationPreferences = {\n ...currentPreferences,\n walletActivity: {\n ...currentPreferences.walletActivity,\n accounts: [...accountsByAddress.values()],\n },\n };\n\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\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 preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledAddresses = (preferences?.walletActivity.accounts ?? [])\n .filter((account) => account.enabled)\n .map((account) => account.address);\n if (enabledAddresses.length > 0) {\n await this.#pushNotifications.enablePushNotifications(enabledAddresses);\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 const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledByAddress = new Map(\n (preferences?.walletActivity.accounts ?? []).map((account) => [\n account.address.toLowerCase(),\n account.enabled,\n ]),\n );\n\n const result: Record<string, boolean> = {};\n for (const address of accounts) {\n result[address] = enabledByAddress.get(address.toLowerCase()) ?? false;\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 * Notification preferences are initialized only when\n * {@link AuthenticatedUserStorageService} has no stored preferences yet.\n * Existing preferences are left as-is.\n *\n * @param opts - optional options to mutate this functionality\n * @param opts.hasMarketingConsent - The user's marketing-consent flag.\n * Used only during initialization to seed marketing push notifications.\n * @param opts.productAnnouncementEnabled - The user's product-announcement flag.\n * Used only during initialization to seed marketing in-app notifications.\n * @param opts.registerPushNotifications - Whether to attempt FCM/device push registration.\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(\n opts: NotificationServicesControllerCreateOnChainTriggersOptions = {},\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. Read existing AUS notification preferences and initialize only if absent.\n const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n const hasMarketingConsent = Boolean(opts?.hasMarketingConsent);\n const productAnnouncementEnabled = Boolean(\n opts?.productAnnouncementEnabled,\n );\n let nextPreferences: NotificationPreferences | undefined;\n\n if (preferences === null) {\n const walletActivityAccounts =\n await buildWalletActivityAccountsFromTriggerConfig(\n bearerToken,\n accounts,\n this.#env,\n );\n\n nextPreferences = buildFreshPreferences(\n walletActivityAccounts,\n hasMarketingConsent,\n productAnnouncementEnabled,\n );\n }\n\n if (nextPreferences) {\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\n }\n\n const effectivePreferences = nextPreferences ?? preferences;\n const accountsWithNotifications = (\n effectivePreferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.address);\n\n if (opts.registerPushNotifications ?? true) {\n // Attempt FCM/device registration only; clients must request OS permission separately.\n this.#pushNotifications\n .enablePushNotifications(accountsWithNotifications)\n .catch(() => {\n // Do Nothing\n });\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 * @param opts - Optional options to mutate this functionality.\n * @throws {Error} If there is an error during the process of enabling notifications.\n */\n public async enableMetamaskNotifications(\n opts: NotificationServicesControllerEnableMetamaskNotificationsOptions = {},\n ): Promise<void> {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n await this.#enableAuth();\n await this.createOnChainTriggers(opts);\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 // Sign-in gate.\n await this.#getBearerToken();\n\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: false })),\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 // Sign-in gate.\n await this.#getBearerToken();\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: true })),\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 preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const addressesWithNotifications = (\n preferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.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"]}
|
|
1
|
+
{"version":3,"file":"NotificationServicesController.cjs","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AuthenticatedUserStorageServiceGetNotificationPreferencesAction,\n AuthenticatedUserStorageServicePutNotificationPreferencesAction,\n NotificationPreferences,\n PerpsPreference,\n SocialAIPreference,\n WalletActivityAccount,\n} from '@metamask/authenticated-user-storage';\nimport 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 type { Hex } from '@metamask/utils';\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} 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\nexport type NotificationServicesControllerEnableNotificationsOptions = {\n /**\n * Whether the user has consented to marketing notifications. Used only when\n * notification preferences are being initialized for the first time to seed\n * marketing push notifications.\n */\n hasMarketingConsent?: boolean;\n /**\n * Whether product announcements are enabled. Used only when notification\n * preferences are being initialized for the first time to seed marketing\n * in-app notifications.\n */\n productAnnouncementEnabled?: boolean;\n /**\n * Whether to attempt FCM/device push registration after notification\n * preferences are initialized or refreshed. This does not request OS push\n * permission.\n *\n * @default true\n */\n registerPushNotifications?: boolean;\n};\n\nexport type NotificationServicesControllerCreateOnChainTriggersOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nexport type NotificationServicesControllerEnableMetamaskNotificationsOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nconst locallyPersistedNotificationTypes = new Set<TRIGGER_TYPES>([\n TRIGGER_TYPES.SNAP,\n]);\n\n/**\n * Hardcoded default Perps notification preferences. Applied when notification\n * preferences are initialized for the first time.\n */\nexport const DEFAULT_PERPS_PREFERENCES: PerpsPreference = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n};\n\n/**\n * Hardcoded default Social AI notification preferences. Applied when\n * notification preferences are initialized for the first time.\n */\nexport const DEFAULT_SOCIAL_AI_PREFERENCES: Required<SocialAIPreference> = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n txAmountLimit: 500,\n mutedTraderProfileIds: [],\n};\n\n/**\n * Builds wallet-activity preferences from the keyring's current accounts.\n *\n * @param accounts - The keyring accounts to build wallet-activity entries for.\n * @returns An array of wallet-activity account entries (lower-cased addresses).\n */\nconst buildWalletActivityAccounts = (\n accounts: { address: string; enabled: boolean }[],\n): WalletActivityAccount[] =>\n accounts.map(({ address, enabled }) => {\n const lowercased = address.toLowerCase();\n return {\n address: lowercased as Hex,\n enabled,\n };\n });\n\n/**\n * Builds wallet-activity initialization from the Trigger API. If Trigger has no\n * enabled entries for the current keyring accounts, this is a first-time\n * notification setup and all current accounts should start enabled.\n *\n * @param bearerToken - JWT used to query Trigger API.\n * @param accounts - The keyring accounts to initialize.\n * @param env - The environment to use for the Trigger API call.\n * @returns Wallet-activity account initialization entries.\n */\nconst buildWalletActivityAccountsFromTriggerConfig = async (\n bearerToken: string,\n accounts: string[],\n env: ENV,\n): Promise<{ address: string; enabled: boolean }[]> => {\n const triggerConfig = await getNotificationsApiConfigCached(\n bearerToken,\n accounts,\n env,\n );\n const triggerConfigByAddress = new Map(\n triggerConfig.map(({ address, enabled }) => [\n address.toLowerCase(),\n enabled,\n ]),\n );\n const hasEnabledTriggerAccount = accounts.some(\n (address) => triggerConfigByAddress.get(address.toLowerCase()) === true,\n );\n\n return accounts.map((address) => ({\n address,\n enabled: hasEnabledTriggerAccount\n ? (triggerConfigByAddress.get(address.toLowerCase()) ?? false)\n : true,\n }));\n};\n\n/**\n * Builds a fresh `NotificationPreferences` blob using hardcoded defaults for\n * Perps and Social AI, the supplied wallet-activity accounts and the user's\n * marketing/product-announcement flags.\n *\n * @param walletActivityAccounts - The wallet-activity account config to initialize.\n * @param hasMarketingConsent - Whether marketing push notifications should be enabled.\n * @param productAnnouncementEnabled - Whether marketing in-app notifications should be enabled.\n * @returns A complete `NotificationPreferences` object.\n */\nconst buildFreshPreferences = (\n walletActivityAccounts: { address: string; enabled: boolean }[],\n hasMarketingConsent: boolean,\n productAnnouncementEnabled: boolean,\n): NotificationPreferences => ({\n walletActivity: {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n accounts: buildWalletActivityAccounts(walletActivityAccounts),\n },\n marketing: {\n inAppNotificationsEnabled: productAnnouncementEnabled,\n pushNotificationsEnabled: hasMarketingConsent,\n },\n perps: { ...DEFAULT_PERPS_PREFERENCES },\n socialAI: { ...DEFAULT_SOCIAL_AI_PREFERENCES },\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 // Authenticated User Storage Requests\n | AuthenticatedUserStorageServiceGetNotificationPreferencesAction\n | AuthenticatedUserStorageServicePutNotificationPreferencesAction\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 * Updates the `walletActivity.accounts` entries in the user's\n * notification-preferences blob in {@link AuthenticatedUserStorageService}.\n *\n * `putNotificationPreferences` replaces the entire blob, so we read the\n * current preferences, merge the supplied updates into\n * `walletActivity.accounts`, and write the result back. This helper is only\n * meant to be used for incremental updates (enable/disable individual\n * accounts) after the preferences blob has already been initialized via\n * {@link createOnChainTriggers}; callers should not rely on it to perform\n * first-time initialization.\n *\n * @param updates - Addresses to register, each with the desired `enabled` flag\n */\n async #registerWalletActivityAddresses(\n updates: { address: string; enabled: boolean }[],\n ): Promise<void> {\n if (updates.length === 0) {\n return;\n }\n\n const currentPreferences = await this.messenger\n .call('AuthenticatedUserStorageService:getNotificationPreferences')\n .catch((error) => {\n log.error(\n 'Failed to get notification preferences. Re-initializing them instead.',\n error,\n );\n // TODO: return null once validation error captured\n // return null;\n throw error;\n });\n\n if (!currentPreferences) {\n log.warn(\n 'Preferences blob not yet initialized; run `createOnChainTriggers` first.',\n );\n return;\n }\n\n const accountsByAddress = new Map(\n currentPreferences.walletActivity.accounts.map((account) => [\n account.address.toLowerCase(),\n { ...account, address: account.address.toLowerCase() as Hex },\n ]),\n );\n for (const update of updates) {\n const address = update.address.toLowerCase() as Hex;\n accountsByAddress.set(address, { address, enabled: update.enabled });\n }\n\n const nextPreferences: NotificationPreferences = {\n ...currentPreferences,\n walletActivity: {\n ...currentPreferences.walletActivity,\n accounts: [...accountsByAddress.values()],\n },\n };\n\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\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 preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledAddresses = (preferences?.walletActivity.accounts ?? [])\n .filter((account) => account.enabled)\n .map((account) => account.address);\n if (enabledAddresses.length > 0) {\n await this.#pushNotifications.enablePushNotifications(enabledAddresses);\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 const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledByAddress = new Map(\n (preferences?.walletActivity.accounts ?? []).map((account) => [\n account.address.toLowerCase(),\n account.enabled,\n ]),\n );\n\n const result: Record<string, boolean> = {};\n for (const address of accounts) {\n result[address] = enabledByAddress.get(address.toLowerCase()) ?? false;\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 * Notification preferences are initialized only when\n * {@link AuthenticatedUserStorageService} has no stored preferences yet.\n * Existing preferences are left as-is.\n *\n * @param opts - optional options to mutate this functionality\n * @param opts.hasMarketingConsent - The user's marketing-consent flag.\n * Used only during initialization to seed marketing push notifications.\n * @param opts.productAnnouncementEnabled - The user's product-announcement flag.\n * Used only during initialization to seed marketing in-app notifications.\n * @param opts.registerPushNotifications - Whether to attempt FCM/device push registration.\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(\n opts: NotificationServicesControllerCreateOnChainTriggersOptions = {},\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. Read existing AUS notification preferences and initialize only if absent.\n const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n const hasMarketingConsent = Boolean(opts?.hasMarketingConsent);\n const productAnnouncementEnabled = Boolean(\n opts?.productAnnouncementEnabled,\n );\n let nextPreferences: NotificationPreferences | undefined;\n\n if (preferences === null) {\n const walletActivityAccounts =\n await buildWalletActivityAccountsFromTriggerConfig(\n bearerToken,\n accounts,\n this.#env,\n );\n\n nextPreferences = buildFreshPreferences(\n walletActivityAccounts,\n hasMarketingConsent,\n productAnnouncementEnabled,\n );\n }\n\n if (nextPreferences) {\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\n }\n\n const effectivePreferences = nextPreferences ?? preferences;\n const accountsWithNotifications = (\n effectivePreferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.address);\n\n if (opts.registerPushNotifications ?? true) {\n // Attempt FCM/device registration only; clients must request OS permission separately.\n this.#pushNotifications\n .enablePushNotifications(accountsWithNotifications)\n .catch(() => {\n // Do Nothing\n });\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 * @param opts - Optional options to mutate this functionality.\n * @throws {Error} If there is an error during the process of enabling notifications.\n */\n public async enableMetamaskNotifications(\n opts: NotificationServicesControllerEnableMetamaskNotificationsOptions = {},\n ): Promise<void> {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n await this.#enableAuth();\n await this.createOnChainTriggers(opts);\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 // Sign-in gate.\n await this.#getBearerToken();\n\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: false })),\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 // Sign-in gate.\n await this.#getBearerToken();\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: true })),\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 const notificationPreferences = isGlobalNotifsEnabled\n ? await this.messenger\n .call('AuthenticatedUserStorageService:getNotificationPreferences')\n .catch(() => null)\n : null;\n\n // Raw Feature Notifications\n const rawAnnouncements =\n isGlobalNotifsEnabled &&\n notificationPreferences?.marketing.inAppNotificationsEnabled\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 addressesWithNotifications = (\n notificationPreferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationServicesController.d.cts","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,+DAA+D,EAC/D,+DAA+D,EAE/D,eAAe,EACf,kBAAkB,EAEnB,6CAA6C;AAC9C,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAK3D,OAAO,KAAK,EACV,iCAAiC,EACjC,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,EAE7B,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,0CAA0C;AAOlF,OAAO,KAAK,EACV,kDAAkD,EAClD,wDAAwD,EACzD,wDAA8C;AAC/C,OAAO,KAAK,EAAE,+CAA+C,EAAE,yGAAqG;AACpK,OAAO,EAAE,aAAa,EAAE,4CAAwC;AAChE,OAAO,KAAK,EAAE,2CAA2C,EAAE,iEAA6D;AAKxH,OAAO,KAAK,EAAE,GAAG,EAAE,yCAAqC;AAQxD,OAAO,KAAK,EACV,aAAa,EACb,4BAA4B,EAC7B,8CAA0C;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,gCAAsB;AAGhD,QAAA,MAAM,cAAc,mCAAmC,CAAC;AAExD,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD;;;OAGG;IACH,wBAAwB,EAAE,MAAM,EAAE,CAAC;IAEnC;;OAEG;IACH,kCAAkC,EAAE,OAAO,CAAC;IAE5C;;OAEG;IACH,6BAA6B,EAAE,OAAO,CAAC;IAEvC;;OAEG;IACH,6BAA6B,EAAE,OAAO,CAAC;IAEvC;;OAEG;IACH,yBAAyB,EAAE,aAAa,EAAE,CAAC;IAE3C;;OAEG;IACH,6BAA6B,EAAE,MAAM,EAAE,CAAC;IACxC;;OAEG;IACH,+BAA+B,EAAE,OAAO,CAAC;IACzC;;;;OAIG;IACH,+BAA+B,EAAE,OAAO,CAAC;IACzC;;OAEG;IACH,sCAAsC,EAAE,MAAM,EAAE,CAAC;IACjD;;OAEG;IACH,0BAA0B,EAAE,OAAO,CAAC;CACrC,CAAC;AAiEF,eAAO,MAAM,YAAY,EAAE,mCAW1B,CAAC;AAEF,MAAM,MAAM,wDAAwD,GAAG;IACrE;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,0DAA0D,GACpE,wDAAwD,CAAC;AAE3D,MAAM,MAAM,gEAAgE,GAC1E,wDAAwD,CAAC;AAM3D;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,eAGvC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,kBAAkB,CAKtE,CAAC;AAyGF,MAAM,MAAM,4CAA4C,GACtD,wBAAwB,CACtB,OAAO,cAAc,EACrB,mCAAmC,CACpC,CAAC;AAGJ,MAAM,MAAM,OAAO,GACf,4CAA4C,GAC5C,2CAA2C,CAAC;AAGhD,KAAK,cAAc,GAEf,+BAA+B,GAE/B,wBAAwB,CAAC,4CAA4C,GACrE,wBAAwB,CAAC,wCAAwC,GACjE,wBAAwB,CAAC,2CAA2C,GAEpE,+DAA+D,GAC/D,+DAA+D,GAE/D,+CAA+C,CAAC;AAGpD,MAAM,MAAM,8CAA8C,GACxD,0BAA0B,CACxB,OAAO,cAAc,EACrB,mCAAmC,CACpC,CAAC;AAEJ,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,0BAA0B,CAAC;IACzD,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;CAC5B,CAAC;AAGF,MAAM,MAAM,MAAM,GACd,8CAA8C,GAC9C,4BAA4B,GAC5B,4BAA4B,CAAC;AAGjC,KAAK,aAAa,GAEd,iCAAiC,GACjC,0BAA0B,GAC1B,4BAA4B,GAE5B,wDAAwD,GACxD,kDAAkD,CAAC;AAGvD,MAAM,MAAM,uCAAuC,GAAG,SAAS,CAC7D,OAAO,cAAc,EACrB,OAAO,GAAG,cAAc,EACxB,MAAM,GAAG,aAAa,CACvB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,cAAc,CAChE,OAAO,cAAc,EACrB,mCAAmC,EACnC,uCAAuC,CACxC;;IAiRC;;;;;;;;;;OAUG;gBACS,EACV,SAAS,EACT,KAAK,EACL,GAAG,GACJ,EAAE;QACD,SAAS,EAAE,uCAAuC,CAAC;QACnD,KAAK,CAAC,EAAE,OAAO,CAAC,mCAAmC,CAAC,CAAC;QACrD,GAAG,EAAE;YACH,oBAAoB,EAAE,sBAAsB,CAAC;YAC7C,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;YACtB,GAAG,CAAC,EAAE,GAAG,CAAC;SACX,CAAC;KACH;IAoBD,IAAI,IAAI,IAAI;IAqMZ;;OAEG;IACU,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrD;;OAEG;IACU,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC,qBAAqB,CAChC,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA2BnC;;;;;;;;OAQG;IACU,8BAA8B,CACzC,2BAA2B,EAAE,OAAO,GACnC,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;;;;;;;;;;;;;OAiBG;IACU,qBAAqB,CAChC,IAAI,GAAE,0DAA+D,GACpE,OAAO,CAAC,IAAI,CAAC;IA+EhB;;;;;;OAMG;IACU,2BAA2B,CACtC,IAAI,GAAE,gEAAqE,GAC1E,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;;;OAOG;IACU,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BzD;;;;;;;;;;;;OAYG;IACU,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/D;;;;;;;;;;;;;;OAcG;IACU,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9D;;;;;;;;;OASG;IACU,mCAAmC,CAC9C,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"NotificationServicesController.d.cts","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationServicesController.d.mts","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"NotificationServicesController.d.mts","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -710,8 +710,14 @@ export class NotificationServicesController extends BaseController {
|
|
|
710
710
|
// This is used by Feature Announcement & On Chain
|
|
711
711
|
// Not used by Snaps
|
|
712
712
|
const isGlobalNotifsEnabled = this.state.isNotificationServicesEnabled;
|
|
713
|
+
const notificationPreferences = isGlobalNotifsEnabled
|
|
714
|
+
? await this.messenger
|
|
715
|
+
.call('AuthenticatedUserStorageService:getNotificationPreferences')
|
|
716
|
+
.catch(() => null)
|
|
717
|
+
: null;
|
|
713
718
|
// Raw Feature Notifications
|
|
714
|
-
const rawAnnouncements = isGlobalNotifsEnabled &&
|
|
719
|
+
const rawAnnouncements = isGlobalNotifsEnabled &&
|
|
720
|
+
notificationPreferences?.marketing.inAppNotificationsEnabled
|
|
715
721
|
? await getFeatureAnnouncementNotifications(__classPrivateFieldGet(this, _NotificationServicesController_featureAnnouncementEnv, "f"), previewToken).catch(() => [])
|
|
716
722
|
: [];
|
|
717
723
|
// Raw On Chain Notifications
|
|
@@ -719,8 +725,7 @@ export class NotificationServicesController extends BaseController {
|
|
|
719
725
|
if (isGlobalNotifsEnabled) {
|
|
720
726
|
try {
|
|
721
727
|
const { bearerToken } = await __classPrivateFieldGet(this, _NotificationServicesController_instances, "m", _NotificationServicesController_getBearerToken).call(this);
|
|
722
|
-
const
|
|
723
|
-
const addressesWithNotifications = (preferences?.walletActivity.accounts ?? [])
|
|
728
|
+
const addressesWithNotifications = (notificationPreferences?.walletActivity.accounts ?? [])
|
|
724
729
|
.filter((account) => account.enabled)
|
|
725
730
|
.map((account) => account.address);
|
|
726
731
|
const notifications = await getAPINotifications(bearerToken, addressesWithNotifications, __classPrivateFieldGet(this, _NotificationServicesController_locale, "f").call(this), __classPrivateFieldGet(this, _NotificationServicesController_featureAnnouncementEnv, "f").platform, __classPrivateFieldGet(this, _NotificationServicesController_env, "f")).catch(() => []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationServicesController.mjs","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AuthenticatedUserStorageServiceGetNotificationPreferencesAction,\n AuthenticatedUserStorageServicePutNotificationPreferencesAction,\n NotificationPreferences,\n PerpsPreference,\n SocialAIPreference,\n WalletActivityAccount,\n} from '@metamask/authenticated-user-storage';\nimport 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 type { Hex } from '@metamask/utils';\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} 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\nexport type NotificationServicesControllerEnableNotificationsOptions = {\n /**\n * Whether the user has consented to marketing notifications. Used only when\n * notification preferences are being initialized for the first time to seed\n * marketing push notifications.\n */\n hasMarketingConsent?: boolean;\n /**\n * Whether product announcements are enabled. Used only when notification\n * preferences are being initialized for the first time to seed marketing\n * in-app notifications.\n */\n productAnnouncementEnabled?: boolean;\n /**\n * Whether to attempt FCM/device push registration after notification\n * preferences are initialized or refreshed. This does not request OS push\n * permission.\n *\n * @default true\n */\n registerPushNotifications?: boolean;\n};\n\nexport type NotificationServicesControllerCreateOnChainTriggersOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nexport type NotificationServicesControllerEnableMetamaskNotificationsOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nconst locallyPersistedNotificationTypes = new Set<TRIGGER_TYPES>([\n TRIGGER_TYPES.SNAP,\n]);\n\n/**\n * Hardcoded default Perps notification preferences. Applied when notification\n * preferences are initialized for the first time.\n */\nexport const DEFAULT_PERPS_PREFERENCES: PerpsPreference = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n};\n\n/**\n * Hardcoded default Social AI notification preferences. Applied when\n * notification preferences are initialized for the first time.\n */\nexport const DEFAULT_SOCIAL_AI_PREFERENCES: Required<SocialAIPreference> = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n txAmountLimit: 500,\n mutedTraderProfileIds: [],\n};\n\n/**\n * Builds wallet-activity preferences from the keyring's current accounts.\n *\n * @param accounts - The keyring accounts to build wallet-activity entries for.\n * @returns An array of wallet-activity account entries (lower-cased addresses).\n */\nconst buildWalletActivityAccounts = (\n accounts: { address: string; enabled: boolean }[],\n): WalletActivityAccount[] =>\n accounts.map(({ address, enabled }) => {\n const lowercased = address.toLowerCase();\n return {\n address: lowercased as Hex,\n enabled,\n };\n });\n\n/**\n * Builds wallet-activity initialization from the Trigger API. If Trigger has no\n * enabled entries for the current keyring accounts, this is a first-time\n * notification setup and all current accounts should start enabled.\n *\n * @param bearerToken - JWT used to query Trigger API.\n * @param accounts - The keyring accounts to initialize.\n * @param env - The environment to use for the Trigger API call.\n * @returns Wallet-activity account initialization entries.\n */\nconst buildWalletActivityAccountsFromTriggerConfig = async (\n bearerToken: string,\n accounts: string[],\n env: ENV,\n): Promise<{ address: string; enabled: boolean }[]> => {\n const triggerConfig = await getNotificationsApiConfigCached(\n bearerToken,\n accounts,\n env,\n );\n const triggerConfigByAddress = new Map(\n triggerConfig.map(({ address, enabled }) => [\n address.toLowerCase(),\n enabled,\n ]),\n );\n const hasEnabledTriggerAccount = accounts.some(\n (address) => triggerConfigByAddress.get(address.toLowerCase()) === true,\n );\n\n return accounts.map((address) => ({\n address,\n enabled: hasEnabledTriggerAccount\n ? (triggerConfigByAddress.get(address.toLowerCase()) ?? false)\n : true,\n }));\n};\n\n/**\n * Builds a fresh `NotificationPreferences` blob using hardcoded defaults for\n * Perps and Social AI, the supplied wallet-activity accounts and the user's\n * marketing/product-announcement flags.\n *\n * @param walletActivityAccounts - The wallet-activity account config to initialize.\n * @param hasMarketingConsent - Whether marketing push notifications should be enabled.\n * @param productAnnouncementEnabled - Whether marketing in-app notifications should be enabled.\n * @returns A complete `NotificationPreferences` object.\n */\nconst buildFreshPreferences = (\n walletActivityAccounts: { address: string; enabled: boolean }[],\n hasMarketingConsent: boolean,\n productAnnouncementEnabled: boolean,\n): NotificationPreferences => ({\n walletActivity: {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n accounts: buildWalletActivityAccounts(walletActivityAccounts),\n },\n marketing: {\n inAppNotificationsEnabled: productAnnouncementEnabled,\n pushNotificationsEnabled: hasMarketingConsent,\n },\n perps: { ...DEFAULT_PERPS_PREFERENCES },\n socialAI: { ...DEFAULT_SOCIAL_AI_PREFERENCES },\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 // Authenticated User Storage Requests\n | AuthenticatedUserStorageServiceGetNotificationPreferencesAction\n | AuthenticatedUserStorageServicePutNotificationPreferencesAction\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 * Updates the `walletActivity.accounts` entries in the user's\n * notification-preferences blob in {@link AuthenticatedUserStorageService}.\n *\n * `putNotificationPreferences` replaces the entire blob, so we read the\n * current preferences, merge the supplied updates into\n * `walletActivity.accounts`, and write the result back. This helper is only\n * meant to be used for incremental updates (enable/disable individual\n * accounts) after the preferences blob has already been initialized via\n * {@link createOnChainTriggers}; callers should not rely on it to perform\n * first-time initialization.\n *\n * @param updates - Addresses to register, each with the desired `enabled` flag\n */\n async #registerWalletActivityAddresses(\n updates: { address: string; enabled: boolean }[],\n ): Promise<void> {\n if (updates.length === 0) {\n return;\n }\n\n const currentPreferences = await this.messenger\n .call('AuthenticatedUserStorageService:getNotificationPreferences')\n .catch((error) => {\n log.error(\n 'Failed to get notification preferences. Re-initializing them instead.',\n error,\n );\n // TODO: return null once validation error captured\n // return null;\n throw error;\n });\n\n if (!currentPreferences) {\n log.warn(\n 'Preferences blob not yet initialized; run `createOnChainTriggers` first.',\n );\n return;\n }\n\n const accountsByAddress = new Map(\n currentPreferences.walletActivity.accounts.map((account) => [\n account.address.toLowerCase(),\n { ...account, address: account.address.toLowerCase() as Hex },\n ]),\n );\n for (const update of updates) {\n const address = update.address.toLowerCase() as Hex;\n accountsByAddress.set(address, { address, enabled: update.enabled });\n }\n\n const nextPreferences: NotificationPreferences = {\n ...currentPreferences,\n walletActivity: {\n ...currentPreferences.walletActivity,\n accounts: [...accountsByAddress.values()],\n },\n };\n\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\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 preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledAddresses = (preferences?.walletActivity.accounts ?? [])\n .filter((account) => account.enabled)\n .map((account) => account.address);\n if (enabledAddresses.length > 0) {\n await this.#pushNotifications.enablePushNotifications(enabledAddresses);\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 const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledByAddress = new Map(\n (preferences?.walletActivity.accounts ?? []).map((account) => [\n account.address.toLowerCase(),\n account.enabled,\n ]),\n );\n\n const result: Record<string, boolean> = {};\n for (const address of accounts) {\n result[address] = enabledByAddress.get(address.toLowerCase()) ?? false;\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 * Notification preferences are initialized only when\n * {@link AuthenticatedUserStorageService} has no stored preferences yet.\n * Existing preferences are left as-is.\n *\n * @param opts - optional options to mutate this functionality\n * @param opts.hasMarketingConsent - The user's marketing-consent flag.\n * Used only during initialization to seed marketing push notifications.\n * @param opts.productAnnouncementEnabled - The user's product-announcement flag.\n * Used only during initialization to seed marketing in-app notifications.\n * @param opts.registerPushNotifications - Whether to attempt FCM/device push registration.\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(\n opts: NotificationServicesControllerCreateOnChainTriggersOptions = {},\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. Read existing AUS notification preferences and initialize only if absent.\n const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n const hasMarketingConsent = Boolean(opts?.hasMarketingConsent);\n const productAnnouncementEnabled = Boolean(\n opts?.productAnnouncementEnabled,\n );\n let nextPreferences: NotificationPreferences | undefined;\n\n if (preferences === null) {\n const walletActivityAccounts =\n await buildWalletActivityAccountsFromTriggerConfig(\n bearerToken,\n accounts,\n this.#env,\n );\n\n nextPreferences = buildFreshPreferences(\n walletActivityAccounts,\n hasMarketingConsent,\n productAnnouncementEnabled,\n );\n }\n\n if (nextPreferences) {\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\n }\n\n const effectivePreferences = nextPreferences ?? preferences;\n const accountsWithNotifications = (\n effectivePreferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.address);\n\n if (opts.registerPushNotifications ?? true) {\n // Attempt FCM/device registration only; clients must request OS permission separately.\n this.#pushNotifications\n .enablePushNotifications(accountsWithNotifications)\n .catch(() => {\n // Do Nothing\n });\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 * @param opts - Optional options to mutate this functionality.\n * @throws {Error} If there is an error during the process of enabling notifications.\n */\n public async enableMetamaskNotifications(\n opts: NotificationServicesControllerEnableMetamaskNotificationsOptions = {},\n ): Promise<void> {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n await this.#enableAuth();\n await this.createOnChainTriggers(opts);\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 // Sign-in gate.\n await this.#getBearerToken();\n\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: false })),\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 // Sign-in gate.\n await this.#getBearerToken();\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: true })),\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 preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const addressesWithNotifications = (\n preferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.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"]}
|
|
1
|
+
{"version":3,"file":"NotificationServicesController.mjs","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAaA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACrB,mCAAmC;AAWpC,OAAO,EAAE,MAAM,EAAE,wBAAwB;;;AAEzC,OAAO,IAAG,iBAAiB;;AAQ3B,OAAO,EAAE,aAAa,EAAE,4CAAwC;AAEhE,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACxB,+CAA2C;AAE5C,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,uBAAuB,EACxB,yCAAqC;AACtC,OAAO,EAAE,mCAAmC,EAAE,6CAAyC;AACvF,OAAO,EAAE,2BAA2B,EAAE,0CAAsC;AAO5E,iCAAiC;AACjC,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAwDrD,MAAM,QAAQ,GAAuD;IACnE,wBAAwB,EAAE;QACxB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,IAAI;QAC5B,QAAQ,EAAE,IAAI;KACf;IAED,kCAAkC,EAAE;QAClC,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,6BAA6B,EAAE;QAC7B,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,6BAA6B,EAAE;QAC7B,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,yBAAyB,EAAE;QACzB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,IAAI;QAC5B,QAAQ,EAAE,IAAI;KACf;IACD,6BAA6B,EAAE;QAC7B,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,IAAI;QAC5B,QAAQ,EAAE,IAAI;KACf;IACD,+BAA+B,EAAE;QAC/B,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,+BAA+B,EAAE;QAC/B,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,sCAAsC,EAAE;QACtC,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,0BAA0B,EAAE;QAC1B,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAwC;IAC/D,wBAAwB,EAAE,EAAE;IAC5B,kCAAkC,EAAE,KAAK;IACzC,6BAA6B,EAAE,KAAK;IACpC,6BAA6B,EAAE,KAAK;IACpC,yBAAyB,EAAE,EAAE;IAC7B,6BAA6B,EAAE,EAAE;IACjC,+BAA+B,EAAE,KAAK;IACtC,+BAA+B,EAAE,KAAK;IACtC,sCAAsC,EAAE,EAAE;IAC1C,0BAA0B,EAAE,KAAK;CAClC,CAAC;AA+BF,MAAM,iCAAiC,GAAG,IAAI,GAAG,CAAgB;IAC/D,aAAa,CAAC,IAAI;CACnB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAoB;IACxD,yBAAyB,EAAE,IAAI;IAC/B,wBAAwB,EAAE,IAAI;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAiC;IACzE,yBAAyB,EAAE,IAAI;IAC/B,wBAAwB,EAAE,IAAI;IAC9B,aAAa,EAAE,GAAG;IAClB,qBAAqB,EAAE,EAAE;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,2BAA2B,GAAG,CAClC,QAAiD,EACxB,EAAE,CAC3B,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO;QACL,OAAO,EAAE,UAAiB;QAC1B,OAAO;KACR,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL;;;;;;;;;GASG;AACH,MAAM,4CAA4C,GAAG,KAAK,EACxD,WAAmB,EACnB,QAAkB,EAClB,GAAQ,EAC0C,EAAE;IACpD,MAAM,aAAa,GAAG,MAAM,+BAA+B,CACzD,WAAW,EACX,QAAQ,EACR,GAAG,CACJ,CAAC;IACF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CACpC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC1C,OAAO,CAAC,WAAW,EAAE;QACrB,OAAO;KACR,CAAC,CACH,CAAC;IACF,MAAM,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,IAAI,CACxE,CAAC;IAEF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO;QACP,OAAO,EAAE,wBAAwB;YAC/B,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC;YAC9D,CAAC,CAAC,IAAI;KACT,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,qBAAqB,GAAG,CAC5B,sBAA+D,EAC/D,mBAA4B,EAC5B,0BAAmC,EACV,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE;QACd,yBAAyB,EAAE,IAAI;QAC/B,wBAAwB,EAAE,IAAI;QAC9B,QAAQ,EAAE,2BAA2B,CAAC,sBAAsB,CAAC;KAC9D;IACD,SAAS,EAAE;QACT,yBAAyB,EAAE,0BAA0B;QACrD,wBAAwB,EAAE,mBAAmB;KAC9C;IACD,KAAK,EAAE,EAAE,GAAG,yBAAyB,EAAE;IACvC,QAAQ,EAAE,EAAE,GAAG,6BAA6B,EAAE;CAC/C,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG;IAChC,MAAM;IACN,yBAAyB;IACzB,0BAA0B;IAC1B,uBAAuB;IACvB,gCAAgC;IAChC,uBAAuB;IACvB,6BAA6B;IAC7B,6BAA6B;IAC7B,iBAAiB;IACjB,gBAAgB;IAChB,qCAAqC;IACrC,wBAAwB;IACxB,wBAAwB;IACxB,yBAAyB;IACzB,iCAAiC;IACjC,iCAAiC;IACjC,gCAAgC;CACxB,CAAC;AA0EX;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,cAInD;IAiRC;;;;;;;;;;OAUG;IACH,YAAY,EACV,SAAS,EACT,KAAK,EACL,GAAG,GASJ;QACC,KAAK,CAAC;YACJ,SAAS;YACT,QAAQ;YACR,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE;SACrC,CAAC,CAAC;;QA7SI,4DAAqB;YAC5B,UAAU,EAAE,KAAK;YAEjB,6BAA6B,EAAE,CAAC,QAA6B,EAAQ,EAAE;gBACrE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACzE,uBAAA,IAAI,yDAAmB,CAAC,UAAU,GAAG,UAAU,CAAC;gBAEhD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,EAAE,GAAS,EAAE;oBAC9D,uBAAA,IAAI,yDAAmB,CAAC,UAAU,GAAG,IAAI,CAAC;oBAC1C,yCAAyC;oBACzC,8CAA8C;oBAC9C,mEAAmE;oBACnE,QAAQ,EAAE,CAAC;gBACb,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,wBAAwB,EAAE,GAAS,EAAE;oBAC5D,uBAAA,IAAI,yDAAmB,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC7C,CAAC,CAAC,CAAC;YACL,CAAC;SACF,EAAC;QAEO,+CAAQ;YACf,cAAc,EAAE,KAAK,IAA4B,EAAE;gBACjD,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9B,yCAAyC,CAC1C,CAAC;YACJ,CAAC;YACD,UAAU,EAAE,GAAY,EAAE;gBACxB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,EAAE,KAAK,IAAuB,EAAE;gBACpC,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9B,wCAAwC,CACzC,CAAC;YACJ,CAAC;SACF,EAAC;QAEO,4DAAqB;YAC5B,4FAA4F;YAC5F,sFAAsF;YACtF,8DAA8D;YAC9D,OAAO,EAAE,KAAK;YAEd,4BAA4B,EAAE,KAAK,IAAmB,EAAE;gBACtD,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,iEAAiE,CAClE,CAAC;YACJ,CAAC;YACD,uBAAuB,EAAE,KAAK,EAAE,SAAmB,EAAiB,EAAE;gBACpE,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,4DAA4D,EAC5D,SAAS,CACV,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC;YACD,wBAAwB,EAAE,KAAK,EAAE,SAAmB,EAAiB,EAAE;gBACrE,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,6DAA6D,EAC7D,SAAS,CACV,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC;YACD,wBAAwB,EAAE,KAAK,IAAmB,EAAE;gBAClD,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,6DAA6D,CAC9D,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC;YACD,2BAA2B,EAAE,KAAK,EAAE,SAAmB,EAAiB,EAAE;gBACxE,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,gEAAgE,EAChE,SAAS,CACV,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC;YACD,SAAS,EAAE,GAAS,EAAE;gBACpB,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,uDAAuD,EACvD,CAAC,YAAY,EAAQ,EAAE;oBACrB,mEAAmE;oBACnE,IAAI,CAAC,+BAA+B,CAAC,YAAY,CAAC,CAAC;gBACrD,CAAC,CACF,CAAC;YACJ,CAAC;YACD,2BAA2B,EAAE,KAAK,IAAmB,EAAE;gBACrD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC;oBAC9C,OAAO;gBACT,CAAC;gBACD,IAAI,uBAAA,IAAI,yDAAmB,CAAC,OAAO,EAAE,CAAC;oBACpC,OAAO;gBACT,CAAC;gBAED,iEAAiE;gBACjE,sDAAsD;gBACtD,IAAI,CAAC;oBACH,IAAI,CAAC,uBAAA,IAAI,yDAAmB,CAAC,UAAU,EAAE,CAAC;wBACxC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBACvC,CAAC;oBACD,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACrC,uBAAA,IAAI,yDAAmB,CAAC,OAAO,GAAG,IAAI,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,uBAAA,IAAI,yDAAmB;yBAC1B,4BAA4B,EAAE;yBAC9B,KAAK,CAAC,GAAG,EAAE;wBACV,aAAa;oBACf,CAAC,CAAC,CAAC;gBACP,CAAC;YACH,CAAC;SACF,EAAC;QAEO,mDAAY;YACnB,oCAAoC;YACpC,2BAA2B,EAAE,KAAK;YAElC,uBAAuB,EAAE,GAAoB,EAAE;gBAC7C,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACvE,MAAM,eAAe,GAAG;oBACtB,GAAG,IAAI,GAAG,CACR,QAAQ;yBACL,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;yBACtC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;wBACf,IAAI,CAAC;4BACH,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;wBACvC,CAAC;wBAAC,MAAM,CAAC;4BACP,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC,CAAC;yBACD,MAAM,CACL,CAAC,OAAO,EAAqB,EAAE,CAC7B,OAAO,KAAK,IAAI,IAAI,iBAAiB,CAAC,OAAO,CAAC,CACjD,CACJ;iBACF,CAAC;gBACF,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,CAAC;YAED;;;;eAIG;YACH,YAAY,EAAE,GAIZ,EAAE;gBACF,wCAAwC;gBACxC,MAAM,mBAAmB,GAAG,uBAAA,IAAI,gDAAU,CAAC,uBAAuB,EAAE,CAAC;gBACrE,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACzB,OAAO;wBACL,aAAa,EAAE,EAAE;wBACjB,eAAe,EAAE,EAAE;wBACnB,QAAQ,EAAE,EAAE;qBACb,CAAC;gBACJ,CAAC;gBAED,MAAM,QAAQ,GAAG,mBAAmB;qBACjC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;qBAC/C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAErE,8CAA8C;gBAC9C,4DAA4D;gBAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,OAAO;wBACL,aAAa,EAAE,EAAE;wBACjB,eAAe,EAAE,EAAE;wBACnB,QAAQ,EAAE,EAAE;qBACb,CAAC;gBACJ,CAAC;gBAED,wCAAwC;gBACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CACnC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAC3C,CAAC;gBACF,MAAM,eAAe,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC1D,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAC9C,CAAC;gBAEF,uBAAuB;gBACvB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,wBAAwB,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;gBAC3D,CAAC,CAAC,CAAC;gBAEH,OAAO;oBACL,aAAa;oBACb,eAAe;oBACf,QAAQ;iBACT,CAAC;YACJ,CAAC;YAED;;eAEG;YACH,UAAU,EAAE,GAAS,EAAE;gBACrB,IACE,uBAAA,IAAI,yDAAmB,CAAC,UAAU;oBAClC,CAAC,uBAAA,IAAI,gDAAU,CAAC,2BAA2B,EAC3C,CAAC;oBACD,uBAAA,IAAI,gDAAU,CAAC,YAAY,EAAE,CAAC;oBAC9B,uBAAA,IAAI,gDAAU,CAAC,2BAA2B,GAAG,IAAI,CAAC;gBACpD,CAAC;YACH,CAAC;YAED;;;;eAIG;YACH,SAAS,EAAE,GAAS,EAAE;gBACpB,MAAM,mCAAmC,GAAG,QAAQ,CAClD,KAAK,EACH,aAAsB,EACtB,iBAA0B,EACX,EAAE;oBACjB,MAAM,uBAAuB,GAAG,aAAa,KAAK,iBAAiB,CAAC;oBACpE,IACE,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B;wBACzC,CAAC,uBAAuB,EACxB,CAAC;wBACD,OAAO;oBACT,CAAC;oBAED,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GACtC,uBAAA,IAAI,gDAAU,CAAC,YAAY,EAAE,CAAC;oBAEhC,MAAM,QAAQ,GAAuB,EAAE,CAAC;oBACxC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;oBACpD,CAAC;oBACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;oBACvD,CAAC;oBACD,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACrC,CAAC,EACD,gCAAgC,CACjC,CAAC;gBAEF,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,+BAA+B;gBAC/B,yEAAyE;gBACzE,kEAAkE;gBAClE,mCAAmC,EACnC,CAAC,KAA6B,EAAU,EAAE;oBACxC,OAAO,CACL,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM;wBACjE,CAAC,CACF,CAAC;gBACJ,CAAC,CACF,CAAC;YACJ,CAAC;SACF,EAAC;QAEO,yDAAsB;QAEtB,yEAAgD;QAEhD,sDAAU;QAiCjB,uBAAA,IAAI,0DAA2B,GAAG,CAAC,oBAAoB,MAAA,CAAC;QACxD,uBAAA,IAAI,0CAAW,GAAG,CAAC,MAAM,IAAI,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QAClD,uBAAA,IAAI,uCAAQ,GAAG,CAAC,GAAG,IAAI,KAAK,MAAA,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;QAEF,uBAAA,IAAI,qGAAoB,MAAxB,IAAI,CAAsB,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,uBAAA,IAAI,yDAAmB,CAAC,6BAA6B,CACnD,KAAK,IAAmB,EAAE;YACxB,uBAAA,IAAI,gDAAU,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,uBAAA,IAAI,yDAAmB,CAAC,2BAA2B,EAAE,CAAC;QAC9D,CAAC,CACF,CAAC;QAEF,uBAAA,IAAI,gDAAU,CAAC,UAAU,EAAE,CAAC;QAC5B,mEAAmE;QACnE,uBAAA,IAAI,yDAAmB,CAAC,2BAA2B,EAAE,CAAC;QACtD,uBAAA,IAAI,gDAAU,CAAC,SAAS,EAAE,CAAC;QAC3B,uBAAA,IAAI,yDAAmB,CAAC,SAAS,EAAE,CAAC;IACtC,CAAC;IAwLD;;OAEG;IACI,KAAK,CAAC,uBAAuB;QAClC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3C,4DAA4D,CAC7D,CAAC;YACF,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,QAAQ,IAAI,EAAE,CAAC;iBAClE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;iBACpC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,uBAAA,IAAI,yDAAmB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,wBAAwB;QACnC,MAAM,uBAAA,IAAI,yDAAmB,CAAC,wBAAwB,EAAE,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,QAAkB;QAElB,IAAI,CAAC;YACH,uBAAA,IAAI,gHAA+B,MAAnC,IAAI,EAAgC,IAAI,CAAC,CAAC;YAE1C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3C,4DAA4D,CAC7D,CAAC;YACF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,CAAC,WAAW,EAAE,cAAc,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5D,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;gBAC7B,OAAO,CAAC,OAAO;aAChB,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC;YACzE,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,uBAAA,IAAI,gHAA+B,MAAnC,IAAI,EAAgC,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,8BAA8B,CACzC,2BAAoC;QAEpC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,6BAA6B,GAAG,2BAA2B,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACI,KAAK,CAAC,qBAAqB,CAChC,OAAmE,EAAE;QAErE,IAAI,CAAC;YACH,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,IAAI,CAAC,CAAC;YAE/C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,iGAAgB,MAApB,IAAI,CAAkB,CAAC;YAErD,MAAM,EAAE,QAAQ,EAAE,GAAG,uBAAA,IAAI,gDAAU,CAAC,YAAY,EAAE,CAAC;YAEnD,+EAA+E;YAC/E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3C,4DAA4D,CAC7D,CAAC;YAEF,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;YAC/D,MAAM,0BAA0B,GAAG,OAAO,CACxC,IAAI,EAAE,0BAA0B,CACjC,CAAC;YACF,IAAI,eAAoD,CAAC;YAEzD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,MAAM,sBAAsB,GAC1B,MAAM,4CAA4C,CAChD,WAAW,EACX,QAAQ,EACR,uBAAA,IAAI,2CAAK,CACV,CAAC;gBAEJ,eAAe,GAAG,qBAAqB,CACrC,sBAAsB,EACtB,mBAAmB,EACnB,0BAA0B,CAC3B,CAAC;YACJ,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,4DAA4D,EAC5D,eAAe,EACf,uBAAA,IAAI,8DAAwB,CAAC,QAAQ,CACtC,CAAC;YACJ,CAAC;YAED,MAAM,oBAAoB,GAAG,eAAe,IAAI,WAAW,CAAC;YAC5D,MAAM,yBAAyB,GAAG,CAChC,oBAAoB,EAAE,cAAc,CAAC,QAAQ,IAAI,EAAE,CACpD;iBACE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;iBACpC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAErC,IAAI,IAAI,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;gBAC3C,uFAAuF;gBACvF,uBAAA,IAAI,yDAAmB;qBACpB,uBAAuB,CAAC,yBAAyB,CAAC;qBAClD,KAAK,CAAC,GAAG,EAAE;oBACV,aAAa;gBACf,CAAC,CAAC,CAAC;YACP,CAAC;YAED,qCAAqC;YACrC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,mEAAmE;gBACnE,IAAI,KAAK,CAAC,6BAA6B,EAAE,CAAC;oBACxC,kDAAkD;oBAClD,+DAA+D;gBACjE,CAAC;qBAAM,CAAC;oBACN,yDAAyD;oBACzD,KAAK,CAAC,6BAA6B,GAAG,IAAI,CAAC;oBAC3C,KAAK,CAAC,6BAA6B,GAAG,IAAI,CAAC;oBAC3C,KAAK,CAAC,kCAAkC,GAAG,IAAI,CAAC;gBAClD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,2BAA2B,CACtC,OAAyE,EAAE;QAE3E,IAAI,CAAC;YACH,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,IAAI,CAAC,CAAC;YAC/C,MAAM,uBAAA,IAAI,6FAAY,MAAhB,IAAI,CAAc,CAAC;YACzB,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;gBAAS,CAAC;YACT,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,2BAA2B;QACtC,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,IAAI,CAAC,CAAC;QAE/C,qCAAqC;QACrC,IAAI,CAAC;YACH,MAAM,uBAAA,IAAI,yDAAmB,CAAC,wBAAwB,EAAE,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QAED,mEAAmE;QACnE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CACnE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAC3D,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,6BAA6B,GAAG,KAAK,CAAC;YAC5C,KAAK,CAAC,6BAA6B,GAAG,KAAK,CAAC;YAC5C,qDAAqD;YACrD,yDAAyD;YACzD,KAAK,CAAC,yBAAyB,GAAG,iBAAiB,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,KAAK,CAAC,eAAe,CAAC,QAAkB;QAC7C,IAAI,CAAC;YACH,uBAAA,IAAI,8GAA6B,MAAjC,IAAI,EAA8B,QAAQ,CAAC,CAAC;YAC5C,gBAAgB;YAChB,MAAM,uBAAA,IAAI,iGAAgB,MAApB,IAAI,CAAkB,CAAC;YAE7B,MAAM,uBAAA,IAAI,kHAAiC,MAArC,IAAI,EACR,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CACzD,CAAC;YAEF,MAAM,uBAAA,IAAI,yDAAmB,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,uBAAA,IAAI,6GAA4B,MAAhC,IAAI,EAA6B,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,KAAK,CAAC,cAAc,CAAC,QAAkB;QAC5C,IAAI,CAAC;YACH,uBAAA,IAAI,8GAA6B,MAAjC,IAAI,EAA8B,QAAQ,CAAC,CAAC;YAE5C,gBAAgB;YAChB,MAAM,uBAAA,IAAI,iGAAgB,MAApB,IAAI,CAAkB,CAAC;YAC7B,MAAM,uBAAA,IAAI,kHAAiC,MAArC,IAAI,EACR,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CACxD,CAAC;YAEF,MAAM,uBAAA,IAAI,yDAAmB,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,uBAAA,IAAI,6GAA4B,MAAhC,IAAI,EAA6B,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,mCAAmC,CAC9C,YAAqB;QAErB,IAAI,CAAC;YACH,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,IAAI,CAAC,CAAC;YAE/C,kDAAkD;YAClD,oBAAoB;YACpB,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC;YACvE,MAAM,uBAAuB,GAAG,qBAAqB;gBACnD,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS;qBACjB,IAAI,CAAC,4DAA4D,CAAC;qBAClE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBACtB,CAAC,CAAC,IAAI,CAAC;YAET,4BAA4B;YAC5B,MAAM,gBAAgB,GACpB,qBAAqB;gBACrB,uBAAuB,EAAE,SAAS,CAAC,yBAAyB;gBAC1D,CAAC,CAAC,MAAM,mCAAmC,CACvC,uBAAA,IAAI,8DAAwB,EAC5B,YAAY,CACb,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBACnB,CAAC,CAAC,EAAE,CAAC;YAET,6BAA6B;YAC7B,MAAM,uBAAuB,GAAgC,EAAE,CAAC;YAChE,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,iGAAgB,MAApB,IAAI,CAAkB,CAAC;oBACrD,MAAM,0BAA0B,GAAG,CACjC,uBAAuB,EAAE,cAAc,CAAC,QAAQ,IAAI,EAAE,CACvD;yBACE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;yBACpC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACrC,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAC7C,WAAW,EACX,0BAA0B,EAC1B,uBAAA,IAAI,8CAAQ,MAAZ,IAAI,CAAU,EACd,uBAAA,IAAI,8DAAwB,CAAC,QAAQ,EACrC,uBAAA,IAAI,2CAAK,CACV,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBAClB,uBAAuB,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;gBACjD,CAAC;gBAAC,MAAM,CAAC;oBACP,aAAa;gBACf,CAAC;YACH,CAAC;YAED,gCAAgC;YAChC,gCAAgC;YAChC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CACnE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAC3D,CAAC;YAEF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC;YAEzD,wBAAwB;YACxB,MAAM,qBAAqB,GAAoB;gBAC7C,GAAG,6BAA6B,CAAC,gBAAgB,EAAE,OAAO,CAAC;gBAC3D,GAAG,6BAA6B,CAAC,uBAAuB,EAAE,OAAO,CAAC;gBAClE,GAAG,iBAAiB;aACrB,CAAC;YAEF,qBAAqB;YACrB,qBAAqB,CAAC,IAAI,CACxB,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,CAC/B,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;gBAC3C,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAC9C,CAAC;YAEF,eAAe;YACf,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,yBAAyB,GAAG,qBAAqB,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,GAAG,cAAc,2BAA2B,EAC5C,IAAI,CAAC,KAAK,CAAC,yBAAyB,CACrC,CAAC;YAEF,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,KAAK,CAAC,CAAC;YAChD,OAAO,qBAAqB,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,qHAAoC,MAAxC,IAAI,EAAqC,KAAK,CAAC,CAAC;YAChD,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,sBAAsB,CAAC,IAAmB;QAC/C,MAAM,CACJ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC3C,uBAAuB,CACxB,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAChD,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,IAAI,CAC7C,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,sBAAsB,CAAC,EAAU;QAC5C,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,CACnE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CACzC,CAAC;QAEF,MAAM,CACJ,mBAAmB,EACnB,gDAAgD,CACjD,CAAC;QAEF,MAAM,CACJ,iCAAiC,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAC/D,6BAA6B;QAC3B,+EAA+E;QAC/E,mBAAmB,CAAC,IACtB,+EAA+E;YAC7E,GAAG,iCAAiC;SACrC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAChB,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CACzD,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CACzC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,yBAAyB,GAAG,OAAO,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,uBAAuB,CAAC,GAAa;QAChD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,GAAG,cAAc,2BAA2B,EAC5C,IAAI,CAAC,KAAK,CAAC,yBAAyB,CACrC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,+BAA+B,CAC1C,aAA2C;QAE3C,IAAI,sBAAsB,GAAa,EAAE,CAAC;QAC1C,IAAI,kCAAkC,GAAa,EAAE,CAAC;QACtD,IAAI,mBAAmB,GAAa,EAAE,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,CACJ,oBAAoB,EACpB,gCAAgC,EAChC,iBAAiB,EAClB,GAAG,aAAa,CAAC,MAAM,CAOtB,CAAC,gBAAgB,EAAE,YAAY,EAAE,EAAE;gBACjC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;oBACzB,QAAQ,YAAY,CAAC,IAAI,EAAE,CAAC;wBAC1B,KAAK,aAAa,CAAC,qBAAqB;4BACtC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;4BACvC,MAAM;wBACR,KAAK,aAAa,CAAC,IAAI;4BACrB,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;4BACvC,MAAM;wBACR;4BACE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBACD,OAAO,gBAAgB,CAAC;YAC1B,CAAC,EACD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CACb,CAAC;YAEF,sCAAsC;YACtC,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,4CAAM,CAAC,cAAc,EAAE,CAAC;gBAEtD,IAAI,WAAW,EAAE,CAAC;oBAChB,sBAAsB,GAAG,oBAAoB,CAAC,GAAG,CAC/C,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAClC,CAAC;oBACF,MAAM,uBAAuB,CAC3B,WAAW,EACX,sBAAsB,EACtB,uBAAA,IAAI,2CAAK,CACV,CAAC,KAAK,CAAC,GAAG,EAAE;wBACX,sBAAsB,GAAG,EAAE,CAAC;wBAC5B,GAAG,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;oBAC3D,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,IAAI,gCAAgC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,kCAAkC;oBAChC,gCAAgC,CAAC,GAAG,CAClC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAClC,CAAC;YACN,CAAC;YAED,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,mBAAmB,GAAG,iBAAiB,CAAC,GAAG,CACzC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAClC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,MAAM,eAAe,GAAG,KAAK,CAAC,6BAA6B,CAAC;YAC5D,MAAM,UAAU,GAAG;gBACjB,GAAG,kCAAkC;gBACrC,GAAG,mBAAmB;aACvB,CAAC;YACF,KAAK,CAAC,6BAA6B,GAAG;gBACpC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,UAAU,CAAC,CAAC;aAChD,CAAC;YAEF,KAAK,CAAC,yBAAyB,GAAG,KAAK,CAAC,yBAAyB,CAAC,GAAG,CACnE,CAAC,YAA2B,EAAE,EAAE;gBAC9B,IACE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACpC,sBAAsB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,EAChD,CAAC;oBACD,IAAI,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;wBAC7C,OAAO;4BACL,GAAG,YAAY;4BACf,MAAM,EAAE,IAAI;4BACZ,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;yBACnC,CAAC;oBACJ,CAAC;oBACD,OAAO,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBAC3C,CAAC;gBACD,OAAO,YAAY,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,GAAG,cAAc,0BAA0B,EAC3C,IAAI,CAAC,KAAK,CAAC,yBAAyB,CACrC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,+BAA+B,CAC1C,YAA2B;QAE3B,IACE,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,CACvC,CAAC,oBAAoB,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CACtE,EACD,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAEpE,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,MAAM,uBAAuB,GAAG,IAAI,GAAG,CACrC,KAAK,CAAC,yBAAyB,CAAC,GAAG,CACjC,CAAC,oBAAoB,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAClD,CACF,CAAC;gBACF,6EAA6E;gBAC7E,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC3D,KAAK,CAAC,yBAAyB,GAAG;wBAChC,qBAAqB;wBACrB,GAAG,KAAK,CAAC,yBAAyB;qBACnC,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,GAAG,cAAc,2BAA2B,EAC5C,IAAI,CAAC,KAAK,CAAC,yBAAyB,CACrC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,8BAA8B,CACzC,KAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,iGAAgB,MAApB,IAAI,CAAkB,CAAC;YACrD,MAAM,2BAA2B,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC;CACF;;IAzzBG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,+BAA+B,GAAG,KAAK,CAAC;QAC9C,KAAK,CAAC,0BAA0B,GAAG,KAAK,CAAC;QACzC,KAAK,CAAC,+BAA+B,GAAG,KAAK,CAAC;QAC9C,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;IAGC,IAAI,CAAC,uBAAA,IAAI,4CAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,6BAA6B,GAAG,KAAK,CAAC;QAC9C,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,+CAED,KAAK;IACH,MAAM,UAAU,GAAG,uBAAA,IAAI,4CAAM,CAAC,UAAU,EAAE,CAAC;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,uBAAA,IAAI,4CAAM,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC,mDAED,KAAK;IACH,uBAAA,IAAI,oGAAmB,MAAvB,IAAI,CAAqB,CAAC;IAE1B,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,4CAAM,CAAC,cAAc,EAAE,CAAC;IAEtD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,0EACH,OAAgD;IAEhD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,SAAS;SAC5C,IAAI,CAAC,4DAA4D,CAAC;SAClE,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,GAAG,CAAC,KAAK,CACP,uEAAuE,EACvE,KAAK,CACN,CAAC;QACF,mDAAmD;QACnD,eAAe;QACf,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CACN,0EAA0E,CAC3E,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,kBAAkB,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;QAC7B,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAS,EAAE;KAC9D,CAAC,CACH,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAS,CAAC;QACpD,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,eAAe,GAA4B;QAC/C,GAAG,kBAAkB;QACrB,cAAc,EAAE;YACd,GAAG,kBAAkB,CAAC,cAAc;YACpC,QAAQ,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC;SAC1C;KACF,CAAC;IAEF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,4DAA4D,EAC5D,eAAe,EACf,uBAAA,IAAI,8DAAwB,CAAC,QAAQ,CACtC,CAAC;AACJ,CAAC,mJAaC,+BAAwC;IAExC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,+BAA+B,GAAG,+BAA+B,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,mJAWC,+BAAwC;IAExC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,+BAA+B,GAAG,+BAA+B,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,yIAW8B,0BAAmC;IAChE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,0BAA0B,GAAG,0BAA0B,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,qIAQ4B,QAAkB;IAC7C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;YAC7B,GAAG,KAAK,CAAC,sCAAsC;YAC/C,GAAG,QAAQ;SACZ,CAAC,CAAC;QACH,KAAK,CAAC,sCAAsC,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,mIAO2B,QAAkB;IAC5C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,sCAAsC;YAC1C,KAAK,CAAC,sCAAsC,CAAC,MAAM,CACjD,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CACzD,CAAC;IACN,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type {\n AuthenticatedUserStorageServiceGetNotificationPreferencesAction,\n AuthenticatedUserStorageServicePutNotificationPreferencesAction,\n NotificationPreferences,\n PerpsPreference,\n SocialAIPreference,\n WalletActivityAccount,\n} from '@metamask/authenticated-user-storage';\nimport 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 type { Hex } from '@metamask/utils';\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} 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\nexport type NotificationServicesControllerEnableNotificationsOptions = {\n /**\n * Whether the user has consented to marketing notifications. Used only when\n * notification preferences are being initialized for the first time to seed\n * marketing push notifications.\n */\n hasMarketingConsent?: boolean;\n /**\n * Whether product announcements are enabled. Used only when notification\n * preferences are being initialized for the first time to seed marketing\n * in-app notifications.\n */\n productAnnouncementEnabled?: boolean;\n /**\n * Whether to attempt FCM/device push registration after notification\n * preferences are initialized or refreshed. This does not request OS push\n * permission.\n *\n * @default true\n */\n registerPushNotifications?: boolean;\n};\n\nexport type NotificationServicesControllerCreateOnChainTriggersOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nexport type NotificationServicesControllerEnableMetamaskNotificationsOptions =\n NotificationServicesControllerEnableNotificationsOptions;\n\nconst locallyPersistedNotificationTypes = new Set<TRIGGER_TYPES>([\n TRIGGER_TYPES.SNAP,\n]);\n\n/**\n * Hardcoded default Perps notification preferences. Applied when notification\n * preferences are initialized for the first time.\n */\nexport const DEFAULT_PERPS_PREFERENCES: PerpsPreference = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n};\n\n/**\n * Hardcoded default Social AI notification preferences. Applied when\n * notification preferences are initialized for the first time.\n */\nexport const DEFAULT_SOCIAL_AI_PREFERENCES: Required<SocialAIPreference> = {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n txAmountLimit: 500,\n mutedTraderProfileIds: [],\n};\n\n/**\n * Builds wallet-activity preferences from the keyring's current accounts.\n *\n * @param accounts - The keyring accounts to build wallet-activity entries for.\n * @returns An array of wallet-activity account entries (lower-cased addresses).\n */\nconst buildWalletActivityAccounts = (\n accounts: { address: string; enabled: boolean }[],\n): WalletActivityAccount[] =>\n accounts.map(({ address, enabled }) => {\n const lowercased = address.toLowerCase();\n return {\n address: lowercased as Hex,\n enabled,\n };\n });\n\n/**\n * Builds wallet-activity initialization from the Trigger API. If Trigger has no\n * enabled entries for the current keyring accounts, this is a first-time\n * notification setup and all current accounts should start enabled.\n *\n * @param bearerToken - JWT used to query Trigger API.\n * @param accounts - The keyring accounts to initialize.\n * @param env - The environment to use for the Trigger API call.\n * @returns Wallet-activity account initialization entries.\n */\nconst buildWalletActivityAccountsFromTriggerConfig = async (\n bearerToken: string,\n accounts: string[],\n env: ENV,\n): Promise<{ address: string; enabled: boolean }[]> => {\n const triggerConfig = await getNotificationsApiConfigCached(\n bearerToken,\n accounts,\n env,\n );\n const triggerConfigByAddress = new Map(\n triggerConfig.map(({ address, enabled }) => [\n address.toLowerCase(),\n enabled,\n ]),\n );\n const hasEnabledTriggerAccount = accounts.some(\n (address) => triggerConfigByAddress.get(address.toLowerCase()) === true,\n );\n\n return accounts.map((address) => ({\n address,\n enabled: hasEnabledTriggerAccount\n ? (triggerConfigByAddress.get(address.toLowerCase()) ?? false)\n : true,\n }));\n};\n\n/**\n * Builds a fresh `NotificationPreferences` blob using hardcoded defaults for\n * Perps and Social AI, the supplied wallet-activity accounts and the user's\n * marketing/product-announcement flags.\n *\n * @param walletActivityAccounts - The wallet-activity account config to initialize.\n * @param hasMarketingConsent - Whether marketing push notifications should be enabled.\n * @param productAnnouncementEnabled - Whether marketing in-app notifications should be enabled.\n * @returns A complete `NotificationPreferences` object.\n */\nconst buildFreshPreferences = (\n walletActivityAccounts: { address: string; enabled: boolean }[],\n hasMarketingConsent: boolean,\n productAnnouncementEnabled: boolean,\n): NotificationPreferences => ({\n walletActivity: {\n inAppNotificationsEnabled: true,\n pushNotificationsEnabled: true,\n accounts: buildWalletActivityAccounts(walletActivityAccounts),\n },\n marketing: {\n inAppNotificationsEnabled: productAnnouncementEnabled,\n pushNotificationsEnabled: hasMarketingConsent,\n },\n perps: { ...DEFAULT_PERPS_PREFERENCES },\n socialAI: { ...DEFAULT_SOCIAL_AI_PREFERENCES },\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 // Authenticated User Storage Requests\n | AuthenticatedUserStorageServiceGetNotificationPreferencesAction\n | AuthenticatedUserStorageServicePutNotificationPreferencesAction\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 * Updates the `walletActivity.accounts` entries in the user's\n * notification-preferences blob in {@link AuthenticatedUserStorageService}.\n *\n * `putNotificationPreferences` replaces the entire blob, so we read the\n * current preferences, merge the supplied updates into\n * `walletActivity.accounts`, and write the result back. This helper is only\n * meant to be used for incremental updates (enable/disable individual\n * accounts) after the preferences blob has already been initialized via\n * {@link createOnChainTriggers}; callers should not rely on it to perform\n * first-time initialization.\n *\n * @param updates - Addresses to register, each with the desired `enabled` flag\n */\n async #registerWalletActivityAddresses(\n updates: { address: string; enabled: boolean }[],\n ): Promise<void> {\n if (updates.length === 0) {\n return;\n }\n\n const currentPreferences = await this.messenger\n .call('AuthenticatedUserStorageService:getNotificationPreferences')\n .catch((error) => {\n log.error(\n 'Failed to get notification preferences. Re-initializing them instead.',\n error,\n );\n // TODO: return null once validation error captured\n // return null;\n throw error;\n });\n\n if (!currentPreferences) {\n log.warn(\n 'Preferences blob not yet initialized; run `createOnChainTriggers` first.',\n );\n return;\n }\n\n const accountsByAddress = new Map(\n currentPreferences.walletActivity.accounts.map((account) => [\n account.address.toLowerCase(),\n { ...account, address: account.address.toLowerCase() as Hex },\n ]),\n );\n for (const update of updates) {\n const address = update.address.toLowerCase() as Hex;\n accountsByAddress.set(address, { address, enabled: update.enabled });\n }\n\n const nextPreferences: NotificationPreferences = {\n ...currentPreferences,\n walletActivity: {\n ...currentPreferences.walletActivity,\n accounts: [...accountsByAddress.values()],\n },\n };\n\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\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 preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledAddresses = (preferences?.walletActivity.accounts ?? [])\n .filter((account) => account.enabled)\n .map((account) => account.address);\n if (enabledAddresses.length > 0) {\n await this.#pushNotifications.enablePushNotifications(enabledAddresses);\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 const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n const enabledByAddress = new Map(\n (preferences?.walletActivity.accounts ?? []).map((account) => [\n account.address.toLowerCase(),\n account.enabled,\n ]),\n );\n\n const result: Record<string, boolean> = {};\n for (const address of accounts) {\n result[address] = enabledByAddress.get(address.toLowerCase()) ?? false;\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 * Notification preferences are initialized only when\n * {@link AuthenticatedUserStorageService} has no stored preferences yet.\n * Existing preferences are left as-is.\n *\n * @param opts - optional options to mutate this functionality\n * @param opts.hasMarketingConsent - The user's marketing-consent flag.\n * Used only during initialization to seed marketing push notifications.\n * @param opts.productAnnouncementEnabled - The user's product-announcement flag.\n * Used only during initialization to seed marketing in-app notifications.\n * @param opts.registerPushNotifications - Whether to attempt FCM/device push registration.\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(\n opts: NotificationServicesControllerCreateOnChainTriggersOptions = {},\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. Read existing AUS notification preferences and initialize only if absent.\n const preferences = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n const hasMarketingConsent = Boolean(opts?.hasMarketingConsent);\n const productAnnouncementEnabled = Boolean(\n opts?.productAnnouncementEnabled,\n );\n let nextPreferences: NotificationPreferences | undefined;\n\n if (preferences === null) {\n const walletActivityAccounts =\n await buildWalletActivityAccountsFromTriggerConfig(\n bearerToken,\n accounts,\n this.#env,\n );\n\n nextPreferences = buildFreshPreferences(\n walletActivityAccounts,\n hasMarketingConsent,\n productAnnouncementEnabled,\n );\n }\n\n if (nextPreferences) {\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPreferences,\n this.#featureAnnouncementEnv.platform,\n );\n }\n\n const effectivePreferences = nextPreferences ?? preferences;\n const accountsWithNotifications = (\n effectivePreferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.address);\n\n if (opts.registerPushNotifications ?? true) {\n // Attempt FCM/device registration only; clients must request OS permission separately.\n this.#pushNotifications\n .enablePushNotifications(accountsWithNotifications)\n .catch(() => {\n // Do Nothing\n });\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 * @param opts - Optional options to mutate this functionality.\n * @throws {Error} If there is an error during the process of enabling notifications.\n */\n public async enableMetamaskNotifications(\n opts: NotificationServicesControllerEnableMetamaskNotificationsOptions = {},\n ): Promise<void> {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n await this.#enableAuth();\n await this.createOnChainTriggers(opts);\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 // Sign-in gate.\n await this.#getBearerToken();\n\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: false })),\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 // Sign-in gate.\n await this.#getBearerToken();\n await this.#registerWalletActivityAddresses(\n accounts.map((address) => ({ address, enabled: true })),\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 const notificationPreferences = isGlobalNotifsEnabled\n ? await this.messenger\n .call('AuthenticatedUserStorageService:getNotificationPreferences')\n .catch(() => null)\n : null;\n\n // Raw Feature Notifications\n const rawAnnouncements =\n isGlobalNotifsEnabled &&\n notificationPreferences?.marketing.inAppNotificationsEnabled\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 addressesWithNotifications = (\n notificationPreferences?.walletActivity.accounts ?? []\n )\n .filter((account) => account.enabled)\n .map((account) => account.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"]}
|
package/package.json
CHANGED