@metamask-previews/notification-services-controller 0.0.0-preview-e751859 → 0.0.0-preview-bc4ac8fa

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/NotificationServicesController/NotificationServicesController.js +3 -3
  2. package/dist/NotificationServicesController/NotificationServicesController.mjs +2 -2
  3. package/dist/NotificationServicesController/index.js +4 -4
  4. package/dist/NotificationServicesController/index.mjs +3 -3
  5. package/dist/NotificationServicesController/services/onchain-notifications.js +2 -2
  6. package/dist/NotificationServicesController/services/onchain-notifications.mjs +1 -1
  7. package/dist/NotificationServicesPushController/NotificationServicesPushController.js +3 -3
  8. package/dist/NotificationServicesPushController/NotificationServicesPushController.mjs +3 -3
  9. package/dist/NotificationServicesPushController/index.js +5 -5
  10. package/dist/NotificationServicesPushController/index.mjs +4 -4
  11. package/dist/NotificationServicesPushController/services/push/push-web.js +3 -3
  12. package/dist/NotificationServicesPushController/services/push/push-web.mjs +3 -3
  13. package/dist/NotificationServicesPushController/services/services.js +3 -3
  14. package/dist/NotificationServicesPushController/services/services.mjs +3 -3
  15. package/dist/NotificationServicesPushController/utils/get-notification-message.js +3 -3
  16. package/dist/NotificationServicesPushController/utils/get-notification-message.mjs +3 -3
  17. package/dist/NotificationServicesPushController/utils/index.js +3 -3
  18. package/dist/NotificationServicesPushController/utils/index.mjs +3 -3
  19. package/dist/{chunk-VNTBP7AI.mjs → chunk-3F4M3OUO.mjs} +2 -2
  20. package/dist/{chunk-4QS664EH.mjs → chunk-5OYPOYXZ.mjs} +2 -2
  21. package/dist/{chunk-WYAE7RGD.js → chunk-6B5FOWRH.js} +3 -3
  22. package/dist/{chunk-3O5NGZWB.js → chunk-DNTK4U5M.js} +892 -2266
  23. package/dist/chunk-DNTK4U5M.js.map +1 -0
  24. package/dist/{chunk-IG3CMJBW.mjs → chunk-KTQP5UDT.mjs} +898 -2272
  25. package/dist/chunk-KTQP5UDT.mjs.map +1 -0
  26. package/dist/chunk-UIRZIKC3.mjs +187 -0
  27. package/dist/chunk-UIRZIKC3.mjs.map +1 -0
  28. package/dist/chunk-VOZ7Y2OO.js +187 -0
  29. package/dist/chunk-VOZ7Y2OO.js.map +1 -0
  30. package/dist/{chunk-LJ533Y4L.js → chunk-XNBTOK6G.js} +7 -7
  31. package/dist/index.js +5 -5
  32. package/dist/index.mjs +4 -4
  33. package/dist/tsconfig.build.tsbuildinfo +1 -1
  34. package/package.json +4 -2
  35. package/dist/chunk-3M76IZD5.js +0 -965
  36. package/dist/chunk-3M76IZD5.js.map +0 -1
  37. package/dist/chunk-3O5NGZWB.js.map +0 -1
  38. package/dist/chunk-IG3CMJBW.mjs.map +0 -1
  39. package/dist/chunk-Y7CUC6PM.mjs +0 -965
  40. package/dist/chunk-Y7CUC6PM.mjs.map +0 -1
  41. /package/dist/{chunk-VNTBP7AI.mjs.map → chunk-3F4M3OUO.mjs.map} +0 -0
  42. /package/dist/{chunk-4QS664EH.mjs.map → chunk-5OYPOYXZ.mjs.map} +0 -0
  43. /package/dist/{chunk-WYAE7RGD.js.map → chunk-6B5FOWRH.js.map} +0 -0
  44. /package/dist/{chunk-LJ533Y4L.js.map → chunk-XNBTOK6G.js.map} +0 -0
@@ -1,14 +1,33 @@
1
1
  import {
2
- makeApiCall,
3
- toggleUserStorageTriggerStatus,
4
- traverseUserStorageTriggers
2
+ processors_exports
3
+ } from "./chunk-QTK2RMF7.mjs";
4
+ import {
5
+ types_exports
6
+ } from "./chunk-B4ECJJ5C.mjs";
7
+ import {
8
+ NotificationServicesController,
9
+ defaultState
10
+ } from "./chunk-5OYPOYXZ.mjs";
11
+ import {
12
+ FEATURE_ANNOUNCEMENT_API
13
+ } from "./chunk-EQWVJX6K.mjs";
14
+ import {
15
+ NOTIFICATION_API_LIST_ENDPOINT,
16
+ NOTIFICATION_API_MARK_ALL_AS_READ_ENDPOINT,
17
+ TRIGGER_API_BATCH_ENDPOINT
18
+ } from "./chunk-UIRZIKC3.mjs";
19
+ import {
20
+ initializeUserStorage
5
21
  } from "./chunk-SMKJEA45.mjs";
22
+ import {
23
+ constants_exports
24
+ } from "./chunk-VE4DTN4R.mjs";
25
+ import {
26
+ USER_STORAGE_VERSION_KEY
27
+ } from "./chunk-6ZDVTRRT.mjs";
6
28
  import {
7
29
  __commonJS,
8
30
  __export,
9
- __privateAdd,
10
- __privateGet,
11
- __privateMethod,
12
31
  __require,
13
32
  __toESM
14
33
  } from "./chunk-26CCETCM.mjs";
@@ -150,12 +169,12 @@ var require_common = __commonJS({
150
169
  createDebug.skips = [];
151
170
  createDebug.formatters = {};
152
171
  function selectColor(namespace) {
153
- let hash2 = 0;
172
+ let hash = 0;
154
173
  for (let i = 0; i < namespace.length; i++) {
155
- hash2 = (hash2 << 5) - hash2 + namespace.charCodeAt(i);
156
- hash2 |= 0;
174
+ hash = (hash << 5) - hash + namespace.charCodeAt(i);
175
+ hash |= 0;
157
176
  }
158
- return createDebug.colors[Math.abs(hash2) % createDebug.colors.length];
177
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
159
178
  }
160
179
  createDebug.selectColor = selectColor;
161
180
  function createDebug(namespace) {
@@ -559,15 +578,15 @@ var require_common2 = __commonJS({
559
578
  function stringifyRequest(options, body) {
560
579
  const { method = "GET", path = "", port } = options;
561
580
  const origin = normalizeOrigin(options.proto, options.hostname, port);
562
- const log3 = {
581
+ const log = {
563
582
  method,
564
583
  url: `${origin}${path}`,
565
584
  headers: options.headers
566
585
  };
567
586
  if (body) {
568
- log3.body = body;
587
+ log.body = body;
569
588
  }
570
- return JSON.stringify(log3, null, 2);
589
+ return JSON.stringify(log, null, 2);
571
590
  }
572
591
  function isContentEncoded(headers) {
573
592
  const contentEncoding2 = headers["content-encoding"];
@@ -1672,7 +1691,7 @@ var require_interceptor = __commonJS({
1672
1691
  "use strict";
1673
1692
  var stringify = require_stringify();
1674
1693
  var querystring = __require("querystring");
1675
- var { URL: URL2, URLSearchParams } = __require("url");
1694
+ var { URL, URLSearchParams } = __require("url");
1676
1695
  var common = require_common2();
1677
1696
  var { remove } = require_intercept();
1678
1697
  var matchBody = require_match_body();
@@ -1726,7 +1745,7 @@ var require_interceptor = __commonJS({
1726
1745
  this.delayConnectionInMs = 0;
1727
1746
  this.optional = false;
1728
1747
  if (uriIsStr && uri.includes("?")) {
1729
- const parsedURL = new URL2(this.path, "http://localhost");
1748
+ const parsedURL = new URL(this.path, "http://localhost");
1730
1749
  this.path = parsedURL.pathname;
1731
1750
  this.query(parsedURL.searchParams);
1732
1751
  this._key = `${this.method} ${scope.basePath}${this.path}`;
@@ -2723,18 +2742,18 @@ var require_scope = __commonJS({
2723
2742
  var debug = require_browser()("nock.scope");
2724
2743
  var { EventEmitter } = __require("events");
2725
2744
  var Interceptor = require_interceptor();
2726
- var { URL: URL2, Url: LegacyUrl } = url;
2745
+ var { URL, Url: LegacyUrl } = url;
2727
2746
  var fs;
2728
2747
  try {
2729
2748
  fs = __require("fs");
2730
2749
  } catch (err) {
2731
2750
  }
2732
2751
  function normalizeUrl(u) {
2733
- if (!(u instanceof URL2)) {
2752
+ if (!(u instanceof URL)) {
2734
2753
  if (u instanceof LegacyUrl) {
2735
- return normalizeUrl(new URL2(url.format(u)));
2754
+ return normalizeUrl(new URL(url.format(u)));
2736
2755
  }
2737
- return normalizeUrl(new URL2(u));
2756
+ return normalizeUrl(new URL(u));
2738
2757
  }
2739
2758
  if (!/https?:/.test(u.protocol)) {
2740
2759
  throw new TypeError(
@@ -3280,13 +3299,13 @@ var require_back = __commonJS({
3280
3299
  lockdown
3281
3300
  // use recorded nocks, disables all http calls even when not nocked, doesnt record
3282
3301
  };
3283
- Back.setMode = function(mode2) {
3284
- if (!(mode2 in Modes)) {
3285
- throw new Error(`Unknown mode: ${mode2}`);
3302
+ Back.setMode = function(mode) {
3303
+ if (!(mode in Modes)) {
3304
+ throw new Error(`Unknown mode: ${mode}`);
3286
3305
  }
3287
- Back.currentMode = mode2;
3306
+ Back.currentMode = mode;
3288
3307
  debug("New nock back mode:", Back.currentMode);
3289
- _mode = Modes[mode2];
3308
+ _mode = Modes[mode];
3290
3309
  _mode.setup();
3291
3310
  };
3292
3311
  Back.fixtures = null;
@@ -3346,2329 +3365,936 @@ var require_nock = __commonJS({
3346
3365
  }
3347
3366
  });
3348
3367
 
3349
- // ../profile-sync-controller/src/sdk/env.ts
3350
- var ENV_URLS = {
3351
- dev: {
3352
- authApiUrl: "https://authentication.dev-api.cx.metamask.io",
3353
- oidcApiUrl: "https://oidc.dev-api.cx.metamask.io",
3354
- userStorageApiUrl: "https://user-storage.dev-api.cx.metamask.io"
3355
- },
3356
- uat: {
3357
- authApiUrl: "https://authentication.uat-api.cx.metamask.io",
3358
- oidcApiUrl: "https://oidc.uat-api.cx.metamask.io",
3359
- userStorageApiUrl: "https://user-storage.uat-api.cx.metamask.io"
3360
- },
3361
- prd: {
3362
- authApiUrl: "https://authentication.api.cx.metamask.io",
3363
- oidcApiUrl: "https://oidc.api.cx.metamask.io",
3364
- userStorageApiUrl: "https://user-storage.api.cx.metamask.io"
3365
- }
3366
- };
3367
- function getEnvUrls(env) {
3368
- if (!ENV_URLS[env]) {
3369
- throw new Error("invalid environment configuration");
3370
- }
3371
- return ENV_URLS[env];
3372
- }
3373
-
3374
- // ../../node_modules/@noble/ciphers/esm/_assert.js
3375
- function isBytes(a) {
3376
- return a instanceof Uint8Array || a != null && typeof a === "object" && a.constructor.name === "Uint8Array";
3377
- }
3378
- function bytes(b, ...lengths) {
3379
- if (!isBytes(b))
3380
- throw new Error("Uint8Array expected");
3381
- if (lengths.length > 0 && !lengths.includes(b.length))
3382
- throw new Error(`Uint8Array expected of length ${lengths}, not of length=${b.length}`);
3383
- }
3384
- function exists(instance, checkFinished = true) {
3385
- if (instance.destroyed)
3386
- throw new Error("Hash instance has been destroyed");
3387
- if (checkFinished && instance.finished)
3388
- throw new Error("Hash#digest() has already been called");
3389
- }
3390
- function output(out, instance) {
3391
- bytes(out);
3392
- const min = instance.outputLen;
3393
- if (out.length < min) {
3394
- throw new Error(`digestInto() expects output buffer of length at least ${min}`);
3395
- }
3396
- }
3368
+ // src/NotificationServicesController/index.ts
3369
+ var NotificationServicesController_exports = {};
3370
+ __export(NotificationServicesController_exports, {
3371
+ Constants: () => constants_exports,
3372
+ Mocks: () => fixtures_exports,
3373
+ NotificationServicesController: () => NotificationServicesController,
3374
+ Processors: () => processors_exports,
3375
+ Types: () => types_exports,
3376
+ defaultState: () => defaultState
3377
+ });
3397
3378
 
3398
- // ../../node_modules/@noble/ciphers/esm/utils.js
3399
- var u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);
3400
- var u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
3401
- var createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
3402
- var isLE = new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68;
3403
- if (!isLE)
3404
- throw new Error("Non little-endian hardware is not supported");
3405
- function utf8ToBytes(str) {
3406
- if (typeof str !== "string")
3407
- throw new Error(`string expected, got ${typeof str}`);
3408
- return new Uint8Array(new TextEncoder().encode(str));
3409
- }
3410
- function toBytes(data) {
3411
- if (typeof data === "string")
3412
- data = utf8ToBytes(data);
3413
- else if (isBytes(data))
3414
- data = data.slice();
3415
- else
3416
- throw new Error(`Uint8Array expected, got ${typeof data}`);
3417
- return data;
3418
- }
3419
- function equalBytes(a, b) {
3420
- if (a.length !== b.length)
3421
- return false;
3422
- let diff = 0;
3423
- for (let i = 0; i < a.length; i++)
3424
- diff |= a[i] ^ b[i];
3425
- return diff === 0;
3426
- }
3427
- var wrapCipher = /* @__NO_SIDE_EFFECTS__ */ (params, c) => {
3428
- Object.assign(c, params);
3429
- return c;
3430
- };
3431
- function setBigUint64(view, byteOffset, value, isLE3) {
3432
- if (typeof view.setBigUint64 === "function")
3433
- return view.setBigUint64(byteOffset, value, isLE3);
3434
- const _32n = BigInt(32);
3435
- const _u32_max = BigInt(4294967295);
3436
- const wh = Number(value >> _32n & _u32_max);
3437
- const wl = Number(value & _u32_max);
3438
- const h = isLE3 ? 4 : 0;
3439
- const l = isLE3 ? 0 : 4;
3440
- view.setUint32(byteOffset + h, wh, isLE3);
3441
- view.setUint32(byteOffset + l, wl, isLE3);
3442
- }
3379
+ // src/NotificationServicesController/__fixtures__/index.ts
3380
+ var fixtures_exports = {};
3381
+ __export(fixtures_exports, {
3382
+ CONTENTFUL_RESPONSE: () => CONTENTFUL_RESPONSE,
3383
+ MOCK_RAW_ON_CHAIN_NOTIFICATIONS: () => MOCK_RAW_ON_CHAIN_NOTIFICATIONS,
3384
+ MOCK_USER_STORAGE_ACCOUNT: () => MOCK_USER_STORAGE_ACCOUNT,
3385
+ MOCK_USER_STORAGE_CHAIN: () => MOCK_USER_STORAGE_CHAIN,
3386
+ createMockFeatureAnnouncementAPIResult: () => createMockFeatureAnnouncementAPIResult,
3387
+ createMockFeatureAnnouncementRaw: () => createMockFeatureAnnouncementRaw,
3388
+ createMockFullUserStorage: () => createMockFullUserStorage,
3389
+ createMockNotificationERC1155Received: () => createMockNotificationERC1155Received,
3390
+ createMockNotificationERC1155Sent: () => createMockNotificationERC1155Sent,
3391
+ createMockNotificationERC20Received: () => createMockNotificationERC20Received,
3392
+ createMockNotificationERC20Sent: () => createMockNotificationERC20Sent,
3393
+ createMockNotificationERC721Received: () => createMockNotificationERC721Received,
3394
+ createMockNotificationERC721Sent: () => createMockNotificationERC721Sent,
3395
+ createMockNotificationEthReceived: () => createMockNotificationEthReceived,
3396
+ createMockNotificationEthSent: () => createMockNotificationEthSent,
3397
+ createMockNotificationLidoReadyToBeWithdrawn: () => createMockNotificationLidoReadyToBeWithdrawn,
3398
+ createMockNotificationLidoStakeCompleted: () => createMockNotificationLidoStakeCompleted,
3399
+ createMockNotificationLidoWithdrawalCompleted: () => createMockNotificationLidoWithdrawalCompleted,
3400
+ createMockNotificationLidoWithdrawalRequested: () => createMockNotificationLidoWithdrawalRequested,
3401
+ createMockNotificationMetaMaskSwapsCompleted: () => createMockNotificationMetaMaskSwapsCompleted,
3402
+ createMockNotificationRocketPoolStakeCompleted: () => createMockNotificationRocketPoolStakeCompleted,
3403
+ createMockNotificationRocketPoolUnStakeCompleted: () => createMockNotificationRocketPoolUnStakeCompleted,
3404
+ createMockNotificationTrigger: () => createMockNotificationTrigger,
3405
+ createMockRawOnChainNotifications: () => createMockRawOnChainNotifications,
3406
+ createMockUserStorage: () => createMockUserStorage,
3407
+ createMockUserStorageWithTriggers: () => createMockUserStorageWithTriggers,
3408
+ getMockBatchCreateTriggersResponse: () => getMockBatchCreateTriggersResponse,
3409
+ getMockBatchDeleteTriggersResponse: () => getMockBatchDeleteTriggersResponse,
3410
+ getMockFeatureAnnouncementResponse: () => getMockFeatureAnnouncementResponse,
3411
+ getMockListNotificationsResponse: () => getMockListNotificationsResponse,
3412
+ getMockMarkNotificationsAsReadResponse: () => getMockMarkNotificationsAsReadResponse,
3413
+ mockBatchCreateTriggers: () => mockBatchCreateTriggers,
3414
+ mockBatchDeleteTriggers: () => mockBatchDeleteTriggers,
3415
+ mockFetchFeatureAnnouncementNotifications: () => mockFetchFeatureAnnouncementNotifications,
3416
+ mockListNotifications: () => mockListNotifications,
3417
+ mockMarkNotificationsAsRead: () => mockMarkNotificationsAsRead
3418
+ });
3443
3419
 
3444
- // ../../node_modules/@noble/ciphers/esm/_polyval.js
3445
- var BLOCK_SIZE = 16;
3446
- var ZEROS16 = /* @__PURE__ */ new Uint8Array(16);
3447
- var ZEROS32 = u32(ZEROS16);
3448
- var POLY = 225;
3449
- var mul2 = (s0, s1, s2, s3) => {
3450
- const hiBit = s3 & 1;
3420
+ // src/NotificationServicesController/__fixtures__/mock-feature-announcements.ts
3421
+ function createMockFeatureAnnouncementAPIResult() {
3451
3422
  return {
3452
- s3: s2 << 31 | s3 >>> 1,
3453
- s2: s1 << 31 | s2 >>> 1,
3454
- s1: s0 << 31 | s1 >>> 1,
3455
- s0: s0 >>> 1 ^ POLY << 24 & -(hiBit & 1)
3456
- // reduce % poly
3457
- };
3458
- };
3459
- var swapLE = (n) => (n >>> 0 & 255) << 24 | (n >>> 8 & 255) << 16 | (n >>> 16 & 255) << 8 | n >>> 24 & 255 | 0;
3460
- function _toGHASHKey(k) {
3461
- k.reverse();
3462
- const hiBit = k[15] & 1;
3463
- let carry = 0;
3464
- for (let i = 0; i < k.length; i++) {
3465
- const t = k[i];
3466
- k[i] = t >>> 1 | carry;
3467
- carry = (t & 1) << 7;
3468
- }
3469
- k[0] ^= -hiBit & 225;
3470
- return k;
3471
- }
3472
- var estimateWindow = (bytes3) => {
3473
- if (bytes3 > 64 * 1024)
3474
- return 8;
3475
- if (bytes3 > 1024)
3476
- return 4;
3477
- return 2;
3478
- };
3479
- var GHASH = class {
3480
- // We select bits per window adaptively based on expectedLength
3481
- constructor(key, expectedLength) {
3482
- this.blockLen = BLOCK_SIZE;
3483
- this.outputLen = BLOCK_SIZE;
3484
- this.s0 = 0;
3485
- this.s1 = 0;
3486
- this.s2 = 0;
3487
- this.s3 = 0;
3488
- this.finished = false;
3489
- key = toBytes(key);
3490
- bytes(key, 16);
3491
- const kView = createView(key);
3492
- let k0 = kView.getUint32(0, false);
3493
- let k1 = kView.getUint32(4, false);
3494
- let k2 = kView.getUint32(8, false);
3495
- let k3 = kView.getUint32(12, false);
3496
- const doubles = [];
3497
- for (let i = 0; i < 128; i++) {
3498
- doubles.push({ s0: swapLE(k0), s1: swapLE(k1), s2: swapLE(k2), s3: swapLE(k3) });
3499
- ({ s0: k0, s1: k1, s2: k2, s3: k3 } = mul2(k0, k1, k2, k3));
3500
- }
3501
- const W = estimateWindow(expectedLength || 1024);
3502
- if (![1, 2, 4, 8].includes(W))
3503
- throw new Error(`ghash: wrong window size=${W}, should be 2, 4 or 8`);
3504
- this.W = W;
3505
- const bits = 128;
3506
- const windows = bits / W;
3507
- const windowSize = this.windowSize = 2 ** W;
3508
- const items = [];
3509
- for (let w = 0; w < windows; w++) {
3510
- for (let byte = 0; byte < windowSize; byte++) {
3511
- let s0 = 0, s1 = 0, s2 = 0, s3 = 0;
3512
- for (let j = 0; j < W; j++) {
3513
- const bit = byte >>> W - j - 1 & 1;
3514
- if (!bit)
3515
- continue;
3516
- const { s0: d0, s1: d1, s2: d2, s3: d3 } = doubles[W * w + j];
3517
- s0 ^= d0, s1 ^= d1, s2 ^= d2, s3 ^= d3;
3423
+ sys: {
3424
+ type: "Array"
3425
+ },
3426
+ total: 17,
3427
+ skip: 0,
3428
+ limit: 1,
3429
+ items: [
3430
+ {
3431
+ metadata: {
3432
+ tags: []
3433
+ },
3434
+ sys: {
3435
+ space: {
3436
+ sys: {
3437
+ type: "Link",
3438
+ linkType: "Space",
3439
+ id: "jdkgyfmyd9sw"
3440
+ }
3441
+ },
3442
+ id: "1ABRmHaNCgmxROKXXLXsMu",
3443
+ type: "Entry",
3444
+ createdAt: "2024-04-09T13:24:01.872Z",
3445
+ updatedAt: "2024-04-09T13:24:01.872Z",
3446
+ environment: {
3447
+ sys: {
3448
+ id: "master",
3449
+ type: "Link",
3450
+ linkType: "Environment"
3451
+ }
3452
+ },
3453
+ revision: 1,
3454
+ contentType: {
3455
+ sys: {
3456
+ type: "Link",
3457
+ linkType: "ContentType",
3458
+ id: "productAnnouncement"
3459
+ }
3460
+ },
3461
+ locale: "en-US"
3462
+ },
3463
+ fields: {
3464
+ title: "Don\u2019t miss out on airdrops and new NFT mints!",
3465
+ id: "dont-miss-out-on-airdrops-and-new-nft-mints",
3466
+ category: "ANNOUNCEMENT",
3467
+ shortDescription: "Check your airdrop eligibility and see trending NFT drops. Head over to the Explore tab to get started. ",
3468
+ image: {
3469
+ sys: {
3470
+ type: "Link",
3471
+ linkType: "Asset",
3472
+ id: "5jqq8sFeLc6XEoeWlpI3aB"
3473
+ }
3474
+ },
3475
+ longDescription: {
3476
+ data: {},
3477
+ content: [
3478
+ {
3479
+ data: {},
3480
+ content: [
3481
+ {
3482
+ data: {},
3483
+ marks: [],
3484
+ value: "You can now verify if any of your connected addresses are eligible for airdrops and other ERC-20 claims in a secure and convenient way. We\u2019ve also added trending NFT mints based on creators you\u2019ve minted from before or other tokens you hold. Head over to the Explore tab to get started. \n",
3485
+ nodeType: "text"
3486
+ }
3487
+ ],
3488
+ nodeType: "paragraph"
3489
+ }
3490
+ ],
3491
+ nodeType: "document"
3492
+ },
3493
+ link: {
3494
+ sys: {
3495
+ type: "Link",
3496
+ linkType: "Entry",
3497
+ id: "62xKYM2ydo4F1mS5q97K5q"
3498
+ }
3499
+ }
3518
3500
  }
3519
- items.push({ s0, s1, s2, s3 });
3520
3501
  }
3521
- }
3522
- this.t = items;
3523
- }
3524
- _updateBlock(s0, s1, s2, s3) {
3525
- s0 ^= this.s0, s1 ^= this.s1, s2 ^= this.s2, s3 ^= this.s3;
3526
- const { W, t, windowSize } = this;
3527
- let o0 = 0, o1 = 0, o2 = 0, o3 = 0;
3528
- const mask = (1 << W) - 1;
3529
- let w = 0;
3530
- for (const num of [s0, s1, s2, s3]) {
3531
- for (let bytePos = 0; bytePos < 4; bytePos++) {
3532
- const byte = num >>> 8 * bytePos & 255;
3533
- for (let bitPos = 8 / W - 1; bitPos >= 0; bitPos--) {
3534
- const bit = byte >>> W * bitPos & mask;
3535
- const { s0: e0, s1: e1, s2: e2, s3: e3 } = t[w * windowSize + bit];
3536
- o0 ^= e0, o1 ^= e1, o2 ^= e2, o3 ^= e3;
3537
- w += 1;
3502
+ ],
3503
+ includes: {
3504
+ Entry: [
3505
+ {
3506
+ metadata: {
3507
+ tags: []
3508
+ },
3509
+ sys: {
3510
+ space: {
3511
+ sys: {
3512
+ type: "Link",
3513
+ linkType: "Space",
3514
+ id: "jdkgyfmyd9sw"
3515
+ }
3516
+ },
3517
+ id: "62xKYM2ydo4F1mS5q97K5q",
3518
+ type: "Entry",
3519
+ createdAt: "2024-04-09T13:23:03.636Z",
3520
+ updatedAt: "2024-04-09T13:23:03.636Z",
3521
+ environment: {
3522
+ sys: {
3523
+ id: "master",
3524
+ type: "Link",
3525
+ linkType: "Environment"
3526
+ }
3527
+ },
3528
+ revision: 1,
3529
+ contentType: {
3530
+ sys: {
3531
+ type: "Link",
3532
+ linkType: "ContentType",
3533
+ id: "link"
3534
+ }
3535
+ },
3536
+ locale: "en-US"
3537
+ },
3538
+ fields: {
3539
+ extensionLinkText: "Try now",
3540
+ extensionLinkRoute: "home.html"
3541
+ }
3538
3542
  }
3539
- }
3540
- }
3541
- this.s0 = o0;
3542
- this.s1 = o1;
3543
- this.s2 = o2;
3544
- this.s3 = o3;
3545
- }
3546
- update(data) {
3547
- data = toBytes(data);
3548
- exists(this);
3549
- const b32 = u32(data);
3550
- const blocks = Math.floor(data.length / BLOCK_SIZE);
3551
- const left = data.length % BLOCK_SIZE;
3552
- for (let i = 0; i < blocks; i++) {
3553
- this._updateBlock(b32[i * 4 + 0], b32[i * 4 + 1], b32[i * 4 + 2], b32[i * 4 + 3]);
3554
- }
3555
- if (left) {
3556
- ZEROS16.set(data.subarray(blocks * BLOCK_SIZE));
3557
- this._updateBlock(ZEROS32[0], ZEROS32[1], ZEROS32[2], ZEROS32[3]);
3558
- ZEROS32.fill(0);
3559
- }
3560
- return this;
3561
- }
3562
- destroy() {
3563
- const { t } = this;
3564
- for (const elm of t) {
3565
- elm.s0 = 0, elm.s1 = 0, elm.s2 = 0, elm.s3 = 0;
3566
- }
3567
- }
3568
- digestInto(out) {
3569
- exists(this);
3570
- output(out, this);
3571
- this.finished = true;
3572
- const { s0, s1, s2, s3 } = this;
3573
- const o32 = u32(out);
3574
- o32[0] = s0;
3575
- o32[1] = s1;
3576
- o32[2] = s2;
3577
- o32[3] = s3;
3578
- return out;
3579
- }
3580
- digest() {
3581
- const res = new Uint8Array(BLOCK_SIZE);
3582
- this.digestInto(res);
3583
- this.destroy();
3584
- return res;
3585
- }
3586
- };
3587
- var Polyval = class extends GHASH {
3588
- constructor(key, expectedLength) {
3589
- key = toBytes(key);
3590
- const ghKey = _toGHASHKey(key.slice());
3591
- super(ghKey, expectedLength);
3592
- ghKey.fill(0);
3593
- }
3594
- update(data) {
3595
- data = toBytes(data);
3596
- exists(this);
3597
- const b32 = u32(data);
3598
- const left = data.length % BLOCK_SIZE;
3599
- const blocks = Math.floor(data.length / BLOCK_SIZE);
3600
- for (let i = 0; i < blocks; i++) {
3601
- this._updateBlock(swapLE(b32[i * 4 + 3]), swapLE(b32[i * 4 + 2]), swapLE(b32[i * 4 + 1]), swapLE(b32[i * 4 + 0]));
3602
- }
3603
- if (left) {
3604
- ZEROS16.set(data.subarray(blocks * BLOCK_SIZE));
3605
- this._updateBlock(swapLE(ZEROS32[3]), swapLE(ZEROS32[2]), swapLE(ZEROS32[1]), swapLE(ZEROS32[0]));
3606
- ZEROS32.fill(0);
3607
- }
3608
- return this;
3609
- }
3610
- digestInto(out) {
3611
- exists(this);
3612
- output(out, this);
3613
- this.finished = true;
3614
- const { s0, s1, s2, s3 } = this;
3615
- const o32 = u32(out);
3616
- o32[0] = s0;
3617
- o32[1] = s1;
3618
- o32[2] = s2;
3619
- o32[3] = s3;
3620
- return out.reverse();
3621
- }
3622
- };
3623
- function wrapConstructorWithKey(hashCons) {
3624
- const hashC = (msg, key) => hashCons(key, msg.length).update(toBytes(msg)).digest();
3625
- const tmp = hashCons(new Uint8Array(16), 0);
3626
- hashC.outputLen = tmp.outputLen;
3627
- hashC.blockLen = tmp.blockLen;
3628
- hashC.create = (key, expectedLength) => hashCons(key, expectedLength);
3629
- return hashC;
3630
- }
3631
- var ghash = wrapConstructorWithKey((key, expectedLength) => new GHASH(key, expectedLength));
3632
- var polyval = wrapConstructorWithKey((key, expectedLength) => new Polyval(key, expectedLength));
3633
-
3634
- // ../../node_modules/@noble/ciphers/esm/aes.js
3635
- var BLOCK_SIZE2 = 16;
3636
- var BLOCK_SIZE32 = 4;
3637
- var EMPTY_BLOCK = new Uint8Array(BLOCK_SIZE2);
3638
- var POLY2 = 283;
3639
- function mul22(n) {
3640
- return n << 1 ^ POLY2 & -(n >> 7);
3641
- }
3642
- function mul(a, b) {
3643
- let res = 0;
3644
- for (; b > 0; b >>= 1) {
3645
- res ^= a & -(b & 1);
3646
- a = mul22(a);
3647
- }
3648
- return res;
3649
- }
3650
- var sbox = /* @__PURE__ */ (() => {
3651
- let t = new Uint8Array(256);
3652
- for (let i = 0, x = 1; i < 256; i++, x ^= mul22(x))
3653
- t[i] = x;
3654
- const box = new Uint8Array(256);
3655
- box[0] = 99;
3656
- for (let i = 0; i < 255; i++) {
3657
- let x = t[255 - i];
3658
- x |= x << 8;
3659
- box[t[i]] = (x ^ x >> 4 ^ x >> 5 ^ x >> 6 ^ x >> 7 ^ 99) & 255;
3660
- }
3661
- return box;
3662
- })();
3663
- var invSbox = /* @__PURE__ */ sbox.map((_, j) => sbox.indexOf(j));
3664
- var rotr32_8 = (n) => n << 24 | n >>> 8;
3665
- var rotl32_8 = (n) => n << 8 | n >>> 24;
3666
- function genTtable(sbox2, fn) {
3667
- if (sbox2.length !== 256)
3668
- throw new Error("Wrong sbox length");
3669
- const T0 = new Uint32Array(256).map((_, j) => fn(sbox2[j]));
3670
- const T1 = T0.map(rotl32_8);
3671
- const T2 = T1.map(rotl32_8);
3672
- const T3 = T2.map(rotl32_8);
3673
- const T01 = new Uint32Array(256 * 256);
3674
- const T23 = new Uint32Array(256 * 256);
3675
- const sbox22 = new Uint16Array(256 * 256);
3676
- for (let i = 0; i < 256; i++) {
3677
- for (let j = 0; j < 256; j++) {
3678
- const idx = i * 256 + j;
3679
- T01[idx] = T0[i] ^ T1[j];
3680
- T23[idx] = T2[i] ^ T3[j];
3681
- sbox22[idx] = sbox2[i] << 8 | sbox2[j];
3682
- }
3683
- }
3684
- return { sbox: sbox2, sbox2: sbox22, T0, T1, T2, T3, T01, T23 };
3685
- }
3686
- var tableEncoding = /* @__PURE__ */ genTtable(sbox, (s) => mul(s, 3) << 24 | s << 16 | s << 8 | mul(s, 2));
3687
- var tableDecoding = /* @__PURE__ */ genTtable(invSbox, (s) => mul(s, 11) << 24 | mul(s, 13) << 16 | mul(s, 9) << 8 | mul(s, 14));
3688
- var xPowers = /* @__PURE__ */ (() => {
3689
- const p = new Uint8Array(16);
3690
- for (let i = 0, x = 1; i < 16; i++, x = mul22(x))
3691
- p[i] = x;
3692
- return p;
3693
- })();
3694
- function expandKeyLE(key) {
3695
- bytes(key);
3696
- const len = key.length;
3697
- if (![16, 24, 32].includes(len))
3698
- throw new Error(`aes: wrong key size: should be 16, 24 or 32, got: ${len}`);
3699
- const { sbox2 } = tableEncoding;
3700
- const k32 = u32(key);
3701
- const Nk = k32.length;
3702
- const subByte = (n) => applySbox(sbox2, n, n, n, n);
3703
- const xk = new Uint32Array(len + 28);
3704
- xk.set(k32);
3705
- for (let i = Nk; i < xk.length; i++) {
3706
- let t = xk[i - 1];
3707
- if (i % Nk === 0)
3708
- t = subByte(rotr32_8(t)) ^ xPowers[i / Nk - 1];
3709
- else if (Nk > 6 && i % Nk === 4)
3710
- t = subByte(t);
3711
- xk[i] = xk[i - Nk] ^ t;
3712
- }
3713
- return xk;
3714
- }
3715
- function expandKeyDecLE(key) {
3716
- const encKey = expandKeyLE(key);
3717
- const xk = encKey.slice();
3718
- const Nk = encKey.length;
3719
- const { sbox2 } = tableEncoding;
3720
- const { T0, T1, T2, T3 } = tableDecoding;
3721
- for (let i = 0; i < Nk; i += 4) {
3722
- for (let j = 0; j < 4; j++)
3723
- xk[i + j] = encKey[Nk - i - 4 + j];
3724
- }
3725
- encKey.fill(0);
3726
- for (let i = 4; i < Nk - 4; i++) {
3727
- const x = xk[i];
3728
- const w = applySbox(sbox2, x, x, x, x);
3729
- xk[i] = T0[w & 255] ^ T1[w >>> 8 & 255] ^ T2[w >>> 16 & 255] ^ T3[w >>> 24];
3730
- }
3731
- return xk;
3732
- }
3733
- function apply0123(T01, T23, s0, s1, s2, s3) {
3734
- return T01[s0 << 8 & 65280 | s1 >>> 8 & 255] ^ T23[s2 >>> 8 & 65280 | s3 >>> 24 & 255];
3735
- }
3736
- function applySbox(sbox2, s0, s1, s2, s3) {
3737
- return sbox2[s0 & 255 | s1 & 65280] | sbox2[s2 >>> 16 & 255 | s3 >>> 16 & 65280] << 16;
3738
- }
3739
- function encrypt(xk, s0, s1, s2, s3) {
3740
- const { sbox2, T01, T23 } = tableEncoding;
3741
- let k = 0;
3742
- s0 ^= xk[k++], s1 ^= xk[k++], s2 ^= xk[k++], s3 ^= xk[k++];
3743
- const rounds = xk.length / 4 - 2;
3744
- for (let i = 0; i < rounds; i++) {
3745
- const t02 = xk[k++] ^ apply0123(T01, T23, s0, s1, s2, s3);
3746
- const t12 = xk[k++] ^ apply0123(T01, T23, s1, s2, s3, s0);
3747
- const t22 = xk[k++] ^ apply0123(T01, T23, s2, s3, s0, s1);
3748
- const t32 = xk[k++] ^ apply0123(T01, T23, s3, s0, s1, s2);
3749
- s0 = t02, s1 = t12, s2 = t22, s3 = t32;
3750
- }
3751
- const t0 = xk[k++] ^ applySbox(sbox2, s0, s1, s2, s3);
3752
- const t1 = xk[k++] ^ applySbox(sbox2, s1, s2, s3, s0);
3753
- const t2 = xk[k++] ^ applySbox(sbox2, s2, s3, s0, s1);
3754
- const t3 = xk[k++] ^ applySbox(sbox2, s3, s0, s1, s2);
3755
- return { s0: t0, s1: t1, s2: t2, s3: t3 };
3756
- }
3757
- function decrypt(xk, s0, s1, s2, s3) {
3758
- const { sbox2, T01, T23 } = tableDecoding;
3759
- let k = 0;
3760
- s0 ^= xk[k++], s1 ^= xk[k++], s2 ^= xk[k++], s3 ^= xk[k++];
3761
- const rounds = xk.length / 4 - 2;
3762
- for (let i = 0; i < rounds; i++) {
3763
- const t02 = xk[k++] ^ apply0123(T01, T23, s0, s3, s2, s1);
3764
- const t12 = xk[k++] ^ apply0123(T01, T23, s1, s0, s3, s2);
3765
- const t22 = xk[k++] ^ apply0123(T01, T23, s2, s1, s0, s3);
3766
- const t32 = xk[k++] ^ apply0123(T01, T23, s3, s2, s1, s0);
3767
- s0 = t02, s1 = t12, s2 = t22, s3 = t32;
3768
- }
3769
- const t0 = xk[k++] ^ applySbox(sbox2, s0, s3, s2, s1);
3770
- const t1 = xk[k++] ^ applySbox(sbox2, s1, s0, s3, s2);
3771
- const t2 = xk[k++] ^ applySbox(sbox2, s2, s1, s0, s3);
3772
- const t3 = xk[k++] ^ applySbox(sbox2, s3, s2, s1, s0);
3773
- return { s0: t0, s1: t1, s2: t2, s3: t3 };
3774
- }
3775
- function getDst(len, dst) {
3776
- if (!dst)
3777
- return new Uint8Array(len);
3778
- bytes(dst);
3779
- if (dst.length < len)
3780
- throw new Error(`aes: wrong destination length, expected at least ${len}, got: ${dst.length}`);
3781
- return dst;
3782
- }
3783
- function ctrCounter(xk, nonce, src, dst) {
3784
- bytes(nonce, BLOCK_SIZE2);
3785
- bytes(src);
3786
- const srcLen = src.length;
3787
- dst = getDst(srcLen, dst);
3788
- const ctr4 = nonce;
3789
- const c32 = u32(ctr4);
3790
- let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);
3791
- const src32 = u32(src);
3792
- const dst32 = u32(dst);
3793
- for (let i = 0; i + 4 <= src32.length; i += 4) {
3794
- dst32[i + 0] = src32[i + 0] ^ s0;
3795
- dst32[i + 1] = src32[i + 1] ^ s1;
3796
- dst32[i + 2] = src32[i + 2] ^ s2;
3797
- dst32[i + 3] = src32[i + 3] ^ s3;
3798
- let carry = 1;
3799
- for (let i2 = ctr4.length - 1; i2 >= 0; i2--) {
3800
- carry = carry + (ctr4[i2] & 255) | 0;
3801
- ctr4[i2] = carry & 255;
3802
- carry >>>= 8;
3543
+ ],
3544
+ Asset: [
3545
+ {
3546
+ metadata: {
3547
+ tags: []
3548
+ },
3549
+ sys: {
3550
+ space: {
3551
+ sys: {
3552
+ type: "Link",
3553
+ linkType: "Space",
3554
+ id: "jdkgyfmyd9sw"
3555
+ }
3556
+ },
3557
+ id: "5jqq8sFeLc6XEoeWlpI3aB",
3558
+ type: "Asset",
3559
+ createdAt: "2024-04-09T13:23:13.327Z",
3560
+ updatedAt: "2024-04-09T13:23:13.327Z",
3561
+ environment: {
3562
+ sys: {
3563
+ id: "master",
3564
+ type: "Link",
3565
+ linkType: "Environment"
3566
+ }
3567
+ },
3568
+ revision: 1,
3569
+ locale: "en-US"
3570
+ },
3571
+ fields: {
3572
+ title: "PDAPP notification image Airdrops & NFT mints",
3573
+ description: "",
3574
+ file: {
3575
+ url: "//images.ctfassets.net/jdkgyfmyd9sw/5jqq8sFeLc6XEoeWlpI3aB/73ee0f1afa9916c3a7538b0bbee09c26/PDAPP_notification_image_Airdrops___NFT_mints.png",
3576
+ details: {
3577
+ size: 797731,
3578
+ image: {
3579
+ width: 2880,
3580
+ height: 1921
3581
+ }
3582
+ },
3583
+ fileName: "PDAPP notification image_Airdrops & NFT mints.png",
3584
+ contentType: "image/png"
3585
+ }
3586
+ }
3587
+ }
3588
+ ]
3803
3589
  }
3804
- ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));
3805
- }
3806
- const start = BLOCK_SIZE2 * Math.floor(src32.length / BLOCK_SIZE32);
3807
- if (start < srcLen) {
3808
- const b32 = new Uint32Array([s0, s1, s2, s3]);
3809
- const buf = u8(b32);
3810
- for (let i = start, pos = 0; i < srcLen; i++, pos++)
3811
- dst[i] = src[i] ^ buf[pos];
3812
- }
3813
- return dst;
3814
- }
3815
- function ctr32(xk, isLE3, nonce, src, dst) {
3816
- bytes(nonce, BLOCK_SIZE2);
3817
- bytes(src);
3818
- dst = getDst(src.length, dst);
3819
- const ctr4 = nonce;
3820
- const c32 = u32(ctr4);
3821
- const view = createView(ctr4);
3822
- const src32 = u32(src);
3823
- const dst32 = u32(dst);
3824
- const ctrPos = isLE3 ? 0 : 12;
3825
- const srcLen = src.length;
3826
- let ctrNum = view.getUint32(ctrPos, isLE3);
3827
- let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);
3828
- for (let i = 0; i + 4 <= src32.length; i += 4) {
3829
- dst32[i + 0] = src32[i + 0] ^ s0;
3830
- dst32[i + 1] = src32[i + 1] ^ s1;
3831
- dst32[i + 2] = src32[i + 2] ^ s2;
3832
- dst32[i + 3] = src32[i + 3] ^ s3;
3833
- ctrNum = ctrNum + 1 >>> 0;
3834
- view.setUint32(ctrPos, ctrNum, isLE3);
3835
- ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));
3836
- }
3837
- const start = BLOCK_SIZE2 * Math.floor(src32.length / BLOCK_SIZE32);
3838
- if (start < srcLen) {
3839
- const b32 = new Uint32Array([s0, s1, s2, s3]);
3840
- const buf = u8(b32);
3841
- for (let i = start, pos = 0; i < srcLen; i++, pos++)
3842
- dst[i] = src[i] ^ buf[pos];
3843
- }
3844
- return dst;
3845
- }
3846
- var ctr = wrapCipher({ blockSize: 16, nonceLength: 16 }, function ctr2(key, nonce) {
3847
- bytes(key);
3848
- bytes(nonce, BLOCK_SIZE2);
3849
- function processCtr(buf, dst) {
3850
- const xk = expandKeyLE(key);
3851
- const n = nonce.slice();
3852
- const out = ctrCounter(xk, n, buf, dst);
3853
- xk.fill(0);
3854
- n.fill(0);
3855
- return out;
3856
- }
3857
- return {
3858
- encrypt: (plaintext, dst) => processCtr(plaintext, dst),
3859
- decrypt: (ciphertext, dst) => processCtr(ciphertext, dst)
3860
3590
  };
3861
- });
3862
- function validateBlockDecrypt(data) {
3863
- bytes(data);
3864
- if (data.length % BLOCK_SIZE2 !== 0) {
3865
- throw new Error(`aes/(cbc-ecb).decrypt ciphertext should consist of blocks with size ${BLOCK_SIZE2}`);
3866
- }
3867
- }
3868
- function validateBlockEncrypt(plaintext, pcks5, dst) {
3869
- let outLen = plaintext.length;
3870
- const remaining = outLen % BLOCK_SIZE2;
3871
- if (!pcks5 && remaining !== 0)
3872
- throw new Error("aec/(cbc-ecb): unpadded plaintext with disabled padding");
3873
- const b = u32(plaintext);
3874
- if (pcks5) {
3875
- let left = BLOCK_SIZE2 - remaining;
3876
- if (!left)
3877
- left = BLOCK_SIZE2;
3878
- outLen = outLen + left;
3879
- }
3880
- const out = getDst(outLen, dst);
3881
- const o = u32(out);
3882
- return { b, o, out };
3883
3591
  }
3884
- function validatePCKS(data, pcks5) {
3885
- if (!pcks5)
3886
- return data;
3887
- const len = data.length;
3888
- if (!len)
3889
- throw new Error(`aes/pcks5: empty ciphertext not allowed`);
3890
- const lastByte = data[len - 1];
3891
- if (lastByte <= 0 || lastByte > 16)
3892
- throw new Error(`aes/pcks5: wrong padding byte: ${lastByte}`);
3893
- const out = data.subarray(0, -lastByte);
3894
- for (let i = 0; i < lastByte; i++)
3895
- if (data[len - i - 1] !== lastByte)
3896
- throw new Error(`aes/pcks5: wrong padding`);
3897
- return out;
3898
- }
3899
- function padPCKS(left) {
3900
- const tmp = new Uint8Array(16);
3901
- const tmp32 = u32(tmp);
3902
- tmp.set(left);
3903
- const paddingByte = BLOCK_SIZE2 - left.length;
3904
- for (let i = BLOCK_SIZE2 - paddingByte; i < BLOCK_SIZE2; i++)
3905
- tmp[i] = paddingByte;
3906
- return tmp32;
3907
- }
3908
- var ecb = wrapCipher({ blockSize: 16 }, function ecb2(key, opts = {}) {
3909
- bytes(key);
3910
- const pcks5 = !opts.disablePadding;
3911
- return {
3912
- encrypt: (plaintext, dst) => {
3913
- bytes(plaintext);
3914
- const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);
3915
- const xk = expandKeyLE(key);
3916
- let i = 0;
3917
- for (; i + 4 <= b.length; ) {
3918
- const { s0, s1, s2, s3 } = encrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);
3919
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
3920
- }
3921
- if (pcks5) {
3922
- const tmp32 = padPCKS(plaintext.subarray(i * 4));
3923
- const { s0, s1, s2, s3 } = encrypt(xk, tmp32[0], tmp32[1], tmp32[2], tmp32[3]);
3924
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
3925
- }
3926
- xk.fill(0);
3927
- return _out;
3928
- },
3929
- decrypt: (ciphertext, dst) => {
3930
- validateBlockDecrypt(ciphertext);
3931
- const xk = expandKeyDecLE(key);
3932
- const out = getDst(ciphertext.length, dst);
3933
- const b = u32(ciphertext);
3934
- const o = u32(out);
3935
- for (let i = 0; i + 4 <= b.length; ) {
3936
- const { s0, s1, s2, s3 } = decrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);
3937
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
3938
- }
3939
- xk.fill(0);
3940
- return validatePCKS(out, pcks5);
3941
- }
3942
- };
3943
- });
3944
- var cbc = wrapCipher({ blockSize: 16, nonceLength: 16 }, function cbc2(key, iv, opts = {}) {
3945
- bytes(key);
3946
- bytes(iv, 16);
3947
- const pcks5 = !opts.disablePadding;
3592
+ function createMockFeatureAnnouncementRaw() {
3948
3593
  return {
3949
- encrypt: (plaintext, dst) => {
3950
- const xk = expandKeyLE(key);
3951
- const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);
3952
- const n32 = u32(iv);
3953
- let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];
3954
- let i = 0;
3955
- for (; i + 4 <= b.length; ) {
3956
- s0 ^= b[i + 0], s1 ^= b[i + 1], s2 ^= b[i + 2], s3 ^= b[i + 3];
3957
- ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));
3958
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
3959
- }
3960
- if (pcks5) {
3961
- const tmp32 = padPCKS(plaintext.subarray(i * 4));
3962
- s0 ^= tmp32[0], s1 ^= tmp32[1], s2 ^= tmp32[2], s3 ^= tmp32[3];
3963
- ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));
3964
- o[i++] = s0, o[i++] = s1, o[i++] = s2, o[i++] = s3;
3965
- }
3966
- xk.fill(0);
3967
- return _out;
3968
- },
3969
- decrypt: (ciphertext, dst) => {
3970
- validateBlockDecrypt(ciphertext);
3971
- const xk = expandKeyDecLE(key);
3972
- const n32 = u32(iv);
3973
- const out = getDst(ciphertext.length, dst);
3974
- const b = u32(ciphertext);
3975
- const o = u32(out);
3976
- let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];
3977
- for (let i = 0; i + 4 <= b.length; ) {
3978
- const ps0 = s0, ps1 = s1, ps2 = s2, ps3 = s3;
3979
- s0 = b[i + 0], s1 = b[i + 1], s2 = b[i + 2], s3 = b[i + 3];
3980
- const { s0: o0, s1: o1, s2: o2, s3: o3 } = decrypt(xk, s0, s1, s2, s3);
3981
- o[i++] = o0 ^ ps0, o[i++] = o1 ^ ps1, o[i++] = o2 ^ ps2, o[i++] = o3 ^ ps3;
3982
- }
3983
- xk.fill(0);
3984
- return validatePCKS(out, pcks5);
3594
+ type: "features_announcement" /* FEATURES_ANNOUNCEMENT */,
3595
+ createdAt: "2999-04-09T13:24:01.872Z",
3596
+ data: {
3597
+ id: "dont-miss-out-on-airdrops-and-new-nft-mints",
3598
+ category: "ANNOUNCEMENT",
3599
+ title: "Don\u2019t miss out on airdrops and new NFT mints!",
3600
+ longDescription: `<p>You can now verify if any of your connected addresses are eligible for airdrops and other ERC-20 claims in a secure and convenient way. We\u2019ve also added trending NFT mints based on creators you\u2019ve minted from before or other tokens you hold. Head over to the Explore tab to get started.</p>`,
3601
+ shortDescription: "Check your airdrop eligibility and see trending NFT drops. Head over to the Explore tab to get started.",
3602
+ image: {
3603
+ title: "PDAPP notification image Airdrops & NFT mints",
3604
+ description: "",
3605
+ url: "//images.ctfassets.net/jdkgyfmyd9sw/5jqq8sFeLc6XEoeWlpI3aB/73ee0f1afa9916c3a7538b0bbee09c26/PDAPP_notification_image_Airdrops___NFT_mints.png"
3606
+ },
3607
+ extensionLink: {
3608
+ extensionLinkText: "Try now",
3609
+ extensionLinkRoute: "home.html"
3610
+ }
3985
3611
  }
3986
3612
  };
3987
- });
3988
- var cfb = wrapCipher({ blockSize: 16, nonceLength: 16 }, function cfb2(key, iv) {
3989
- bytes(key);
3990
- bytes(iv, 16);
3991
- function processCfb(src, isEncrypt, dst) {
3992
- const xk = expandKeyLE(key);
3993
- const srcLen = src.length;
3994
- dst = getDst(srcLen, dst);
3995
- const src32 = u32(src);
3996
- const dst32 = u32(dst);
3997
- const next32 = isEncrypt ? dst32 : src32;
3998
- const n32 = u32(iv);
3999
- let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];
4000
- for (let i = 0; i + 4 <= src32.length; ) {
4001
- const { s0: e0, s1: e1, s2: e2, s3: e3 } = encrypt(xk, s0, s1, s2, s3);
4002
- dst32[i + 0] = src32[i + 0] ^ e0;
4003
- dst32[i + 1] = src32[i + 1] ^ e1;
4004
- dst32[i + 2] = src32[i + 2] ^ e2;
4005
- dst32[i + 3] = src32[i + 3] ^ e3;
4006
- s0 = next32[i++], s1 = next32[i++], s2 = next32[i++], s3 = next32[i++];
4007
- }
4008
- const start = BLOCK_SIZE2 * Math.floor(src32.length / BLOCK_SIZE32);
4009
- if (start < srcLen) {
4010
- ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));
4011
- const buf = u8(new Uint32Array([s0, s1, s2, s3]));
4012
- for (let i = start, pos = 0; i < srcLen; i++, pos++)
4013
- dst[i] = src[i] ^ buf[pos];
4014
- buf.fill(0);
4015
- }
4016
- xk.fill(0);
4017
- return dst;
4018
- }
3613
+ }
3614
+
3615
+ // src/NotificationServicesController/__fixtures__/mock-notification-trigger.ts
3616
+ import { v4 as uuidv4 } from "uuid";
3617
+ function createMockNotificationTrigger(override) {
4019
3618
  return {
4020
- encrypt: (plaintext, dst) => processCfb(plaintext, true, dst),
4021
- decrypt: (ciphertext, dst) => processCfb(ciphertext, false, dst)
3619
+ id: uuidv4(),
3620
+ address: "0xFAKE_ADDRESS",
3621
+ chainId: "1",
3622
+ kind: "eth_sent",
3623
+ enabled: true,
3624
+ ...override
4022
3625
  };
4023
- });
4024
- function computeTag(fn, isLE3, key, data, AAD) {
4025
- const h = fn.create(key, data.length + (AAD?.length || 0));
4026
- if (AAD)
4027
- h.update(AAD);
4028
- h.update(data);
4029
- const num = new Uint8Array(16);
4030
- const view = createView(num);
4031
- if (AAD)
4032
- setBigUint64(view, 0, BigInt(AAD.length * 8), isLE3);
4033
- setBigUint64(view, 8, BigInt(data.length * 8), isLE3);
4034
- h.update(num);
4035
- return h.digest();
4036
3626
  }
4037
- var gcm = wrapCipher({ blockSize: 16, nonceLength: 12, tagLength: 16 }, function gcm2(key, nonce, AAD) {
4038
- bytes(nonce);
4039
- if (nonce.length === 0)
4040
- throw new Error("aes/gcm: empty nonce");
4041
- const tagLength = 16;
4042
- function _computeTag(authKey, tagMask, data) {
4043
- const tag = computeTag(ghash, false, authKey, data, AAD);
4044
- for (let i = 0; i < tagMask.length; i++)
4045
- tag[i] ^= tagMask[i];
4046
- return tag;
4047
- }
4048
- function deriveKeys() {
4049
- const xk = expandKeyLE(key);
4050
- const authKey = EMPTY_BLOCK.slice();
4051
- const counter = EMPTY_BLOCK.slice();
4052
- ctr32(xk, false, counter, counter, authKey);
4053
- if (nonce.length === 12) {
4054
- counter.set(nonce);
4055
- } else {
4056
- const nonceLen = EMPTY_BLOCK.slice();
4057
- const view = createView(nonceLen);
4058
- setBigUint64(view, 8, BigInt(nonce.length * 8), false);
4059
- ghash.create(authKey).update(nonce).update(nonceLen).digestInto(counter);
4060
- }
4061
- const tagMask = ctr32(xk, false, counter, EMPTY_BLOCK);
4062
- return { xk, authKey, counter, tagMask };
4063
- }
3627
+
3628
+ // src/NotificationServicesController/__fixtures__/mock-notification-user-storage.ts
3629
+ var MOCK_USER_STORAGE_ACCOUNT = "0x0000000000000000000000000000000000000000";
3630
+ var MOCK_USER_STORAGE_CHAIN = "1";
3631
+ function createMockUserStorage(override) {
4064
3632
  return {
4065
- encrypt: (plaintext) => {
4066
- bytes(plaintext);
4067
- const { xk, authKey, counter, tagMask } = deriveKeys();
4068
- const out = new Uint8Array(plaintext.length + tagLength);
4069
- ctr32(xk, false, counter, plaintext, out);
4070
- const tag = _computeTag(authKey, tagMask, out.subarray(0, out.length - tagLength));
4071
- out.set(tag, plaintext.length);
4072
- xk.fill(0);
4073
- return out;
4074
- },
4075
- decrypt: (ciphertext) => {
4076
- bytes(ciphertext);
4077
- if (ciphertext.length < tagLength)
4078
- throw new Error(`aes/gcm: ciphertext less than tagLen (${tagLength})`);
4079
- const { xk, authKey, counter, tagMask } = deriveKeys();
4080
- const data = ciphertext.subarray(0, -tagLength);
4081
- const passedTag = ciphertext.subarray(-tagLength);
4082
- const tag = _computeTag(authKey, tagMask, data);
4083
- if (!equalBytes(tag, passedTag))
4084
- throw new Error("aes/gcm: invalid ghash tag");
4085
- const out = ctr32(xk, false, counter, data);
4086
- authKey.fill(0);
4087
- tagMask.fill(0);
4088
- xk.fill(0);
4089
- return out;
4090
- }
4091
- };
4092
- });
4093
- var limit = (name, min, max) => (value) => {
4094
- if (!Number.isSafeInteger(value) || min > value || value > max)
4095
- throw new Error(`${name}: invalid value=${value}, must be [${min}..${max}]`);
4096
- };
4097
- var siv = wrapCipher({ blockSize: 16, nonceLength: 12, tagLength: 16 }, function siv2(key, nonce, AAD) {
4098
- const tagLength = 16;
4099
- const AAD_LIMIT = limit("AAD", 0, 2 ** 36);
4100
- const PLAIN_LIMIT = limit("plaintext", 0, 2 ** 36);
4101
- const NONCE_LIMIT = limit("nonce", 12, 12);
4102
- const CIPHER_LIMIT = limit("ciphertext", 16, 2 ** 36 + 16);
4103
- bytes(nonce);
4104
- NONCE_LIMIT(nonce.length);
4105
- if (AAD) {
4106
- bytes(AAD);
4107
- AAD_LIMIT(AAD.length);
4108
- }
4109
- function deriveKeys() {
4110
- const len = key.length;
4111
- if (len !== 16 && len !== 24 && len !== 32)
4112
- throw new Error(`key length must be 16, 24 or 32 bytes, got: ${len} bytes`);
4113
- const xk = expandKeyLE(key);
4114
- const encKey = new Uint8Array(len);
4115
- const authKey = new Uint8Array(16);
4116
- const n32 = u32(nonce);
4117
- let s0 = 0, s1 = n32[0], s2 = n32[1], s3 = n32[2];
4118
- let counter = 0;
4119
- for (const derivedKey of [authKey, encKey].map(u32)) {
4120
- const d32 = u32(derivedKey);
4121
- for (let i = 0; i < d32.length; i += 2) {
4122
- const { s0: o0, s1: o1 } = encrypt(xk, s0, s1, s2, s3);
4123
- d32[i + 0] = o0;
4124
- d32[i + 1] = o1;
4125
- s0 = ++counter;
3633
+ [USER_STORAGE_VERSION_KEY]: "1",
3634
+ [MOCK_USER_STORAGE_ACCOUNT]: {
3635
+ [MOCK_USER_STORAGE_CHAIN]: {
3636
+ "111-111-111-111": {
3637
+ k: "erc20_received" /* ERC20_RECEIVED */,
3638
+ e: true
3639
+ },
3640
+ "222-222-222-222": {
3641
+ k: "erc20_sent" /* ERC20_SENT */,
3642
+ e: true
3643
+ }
4126
3644
  }
4127
- }
4128
- xk.fill(0);
4129
- return { authKey, encKey: expandKeyLE(encKey) };
4130
- }
4131
- function _computeTag(encKey, authKey, data) {
4132
- const tag = computeTag(polyval, true, authKey, data, AAD);
4133
- for (let i = 0; i < 12; i++)
4134
- tag[i] ^= nonce[i];
4135
- tag[15] &= 127;
4136
- const t32 = u32(tag);
4137
- let s0 = t32[0], s1 = t32[1], s2 = t32[2], s3 = t32[3];
4138
- ({ s0, s1, s2, s3 } = encrypt(encKey, s0, s1, s2, s3));
4139
- t32[0] = s0, t32[1] = s1, t32[2] = s2, t32[3] = s3;
4140
- return tag;
4141
- }
4142
- function processSiv(encKey, tag, input) {
4143
- let block = tag.slice();
4144
- block[15] |= 128;
4145
- return ctr32(encKey, true, block, input);
4146
- }
4147
- return {
4148
- encrypt: (plaintext) => {
4149
- bytes(plaintext);
4150
- PLAIN_LIMIT(plaintext.length);
4151
- const { encKey, authKey } = deriveKeys();
4152
- const tag = _computeTag(encKey, authKey, plaintext);
4153
- const out = new Uint8Array(plaintext.length + tagLength);
4154
- out.set(tag, plaintext.length);
4155
- out.set(processSiv(encKey, tag, plaintext));
4156
- encKey.fill(0);
4157
- authKey.fill(0);
4158
- return out;
4159
3645
  },
4160
- decrypt: (ciphertext) => {
4161
- bytes(ciphertext);
4162
- CIPHER_LIMIT(ciphertext.length);
4163
- const tag = ciphertext.subarray(-tagLength);
4164
- const { encKey, authKey } = deriveKeys();
4165
- const plaintext = processSiv(encKey, tag, ciphertext.subarray(0, -tagLength));
4166
- const expectedTag = _computeTag(encKey, authKey, plaintext);
4167
- encKey.fill(0);
4168
- authKey.fill(0);
4169
- if (!equalBytes(tag, expectedTag))
4170
- throw new Error("invalid polyval tag");
4171
- return plaintext;
3646
+ ...override
3647
+ };
3648
+ }
3649
+ function createMockUserStorageWithTriggers(triggers) {
3650
+ const userStorage = {
3651
+ [USER_STORAGE_VERSION_KEY]: "1",
3652
+ [MOCK_USER_STORAGE_ACCOUNT]: {
3653
+ [MOCK_USER_STORAGE_CHAIN]: {}
4172
3654
  }
4173
3655
  };
4174
- });
4175
-
4176
- // ../../node_modules/@noble/ciphers/esm/crypto.js
4177
- var cr = typeof globalThis === "object" && "crypto" in globalThis ? globalThis.crypto : void 0;
4178
- function randomBytes(bytesLength = 32) {
4179
- if (cr && typeof cr.getRandomValues === "function")
4180
- return cr.getRandomValues(new Uint8Array(bytesLength));
4181
- throw new Error("crypto.getRandomValues must be defined");
3656
+ triggers.forEach((t) => {
3657
+ let tId;
3658
+ let e;
3659
+ let k;
3660
+ if (typeof t === "string") {
3661
+ tId = t;
3662
+ e = true;
3663
+ k = "erc20_received" /* ERC20_RECEIVED */;
3664
+ } else {
3665
+ tId = t.id;
3666
+ e = t.e;
3667
+ k = t.k ?? "erc20_received" /* ERC20_RECEIVED */;
3668
+ }
3669
+ userStorage[MOCK_USER_STORAGE_ACCOUNT][MOCK_USER_STORAGE_CHAIN][tId] = {
3670
+ k,
3671
+ e
3672
+ };
3673
+ });
3674
+ return userStorage;
4182
3675
  }
4183
- function getWebcryptoSubtle() {
4184
- if (cr && typeof cr.subtle === "object" && cr.subtle != null)
4185
- return cr.subtle;
4186
- throw new Error("crypto.subtle must be defined");
3676
+ function createMockFullUserStorage(props = {}) {
3677
+ return initializeUserStorage(
3678
+ [{ address: props.address ?? MOCK_USER_STORAGE_ACCOUNT }],
3679
+ props.triggersEnabled ?? true
3680
+ );
4187
3681
  }
4188
3682
 
4189
- // ../../node_modules/@noble/ciphers/esm/webcrypto.js
4190
- var utils = {
4191
- async encrypt(key, keyParams, cryptParams, plaintext) {
4192
- const cr2 = getWebcryptoSubtle();
4193
- const iKey = await cr2.importKey("raw", key, keyParams, true, ["encrypt"]);
4194
- const ciphertext = await cr2.encrypt(cryptParams, iKey, plaintext);
4195
- return new Uint8Array(ciphertext);
4196
- },
4197
- async decrypt(key, keyParams, cryptParams, ciphertext) {
4198
- const cr2 = getWebcryptoSubtle();
4199
- const iKey = await cr2.importKey("raw", key, keyParams, true, ["decrypt"]);
4200
- const plaintext = await cr2.decrypt(cryptParams, iKey, ciphertext);
4201
- return new Uint8Array(plaintext);
4202
- }
4203
- };
4204
- var mode = {
4205
- CBC: "AES-CBC",
4206
- CTR: "AES-CTR",
4207
- GCM: "AES-GCM"
4208
- };
4209
- function getCryptParams(algo, nonce, AAD) {
4210
- if (algo === mode.CBC)
4211
- return { name: mode.CBC, iv: nonce };
4212
- if (algo === mode.CTR)
4213
- return { name: mode.CTR, counter: nonce, length: 64 };
4214
- if (algo === mode.GCM)
4215
- return { name: mode.GCM, iv: nonce, additionalData: AAD };
4216
- throw new Error("unknown aes block mode");
4217
- }
4218
- function generate(algo) {
4219
- return (key, nonce, AAD) => {
4220
- bytes(key);
4221
- bytes(nonce);
4222
- const keyParams = { name: algo, length: key.length * 8 };
4223
- const cryptParams = getCryptParams(algo, nonce, AAD);
4224
- return {
4225
- // keyLength,
4226
- encrypt(plaintext) {
4227
- bytes(plaintext);
4228
- return utils.encrypt(key, keyParams, cryptParams, plaintext);
3683
+ // src/NotificationServicesController/__fixtures__/mock-raw-notifications.ts
3684
+ function createMockNotificationEthSent() {
3685
+ const mockNotification = {
3686
+ type: "eth_sent" /* ETH_SENT */,
3687
+ id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3688
+ trigger_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3689
+ chain_id: 1,
3690
+ block_number: 17485840,
3691
+ block_timestamp: "2022-03-01T00:00:00Z",
3692
+ tx_hash: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3693
+ unread: true,
3694
+ created_at: "2022-03-01T00:00:00Z",
3695
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3696
+ data: {
3697
+ kind: "eth_sent",
3698
+ network_fee: {
3699
+ gas_price: "207806259583",
3700
+ native_token_price_in_usd: "0.83"
4229
3701
  },
4230
- decrypt(ciphertext) {
4231
- bytes(ciphertext);
4232
- return utils.decrypt(key, keyParams, cryptParams, ciphertext);
3702
+ from: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3703
+ to: "0x881D40237659C251811CEC9c364ef91dC08D300D",
3704
+ amount: {
3705
+ usd: "670.64",
3706
+ eth: "0.005"
4233
3707
  }
4234
- };
4235
- };
4236
- }
4237
- var cbc3 = generate(mode.CBC);
4238
- var ctr3 = generate(mode.CTR);
4239
- var gcm3 = generate(mode.GCM);
4240
-
4241
- // ../../node_modules/@noble/hashes/esm/_assert.js
4242
- function number2(n) {
4243
- if (!Number.isSafeInteger(n) || n < 0)
4244
- throw new Error(`positive integer expected, not ${n}`);
4245
- }
4246
- function isBytes2(a) {
4247
- return a instanceof Uint8Array || a != null && typeof a === "object" && a.constructor.name === "Uint8Array";
4248
- }
4249
- function bytes2(b, ...lengths) {
4250
- if (!isBytes2(b))
4251
- throw new Error("Uint8Array expected");
4252
- if (lengths.length > 0 && !lengths.includes(b.length))
4253
- throw new Error(`Uint8Array expected of length ${lengths}, not of length=${b.length}`);
4254
- }
4255
- function hash(h) {
4256
- if (typeof h !== "function" || typeof h.create !== "function")
4257
- throw new Error("Hash should be wrapped by utils.wrapConstructor");
4258
- number2(h.outputLen);
4259
- number2(h.blockLen);
4260
- }
4261
- function exists2(instance, checkFinished = true) {
4262
- if (instance.destroyed)
4263
- throw new Error("Hash instance has been destroyed");
4264
- if (checkFinished && instance.finished)
4265
- throw new Error("Hash#digest() has already been called");
4266
- }
4267
- function output2(out, instance) {
4268
- bytes2(out);
4269
- const min = instance.outputLen;
4270
- if (out.length < min) {
4271
- throw new Error(`digestInto() expects output buffer of length at least ${min}`);
4272
- }
4273
- }
4274
-
4275
- // ../../node_modules/@noble/hashes/esm/utils.js
4276
- var u322 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
4277
- var createView2 = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
4278
- var rotr = (word, shift) => word << 32 - shift | word >>> shift;
4279
- var rotl = (word, shift) => word << shift | word >>> 32 - shift >>> 0;
4280
- var isLE2 = new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68;
4281
- var byteSwap = (word) => word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
4282
- function byteSwap32(arr) {
4283
- for (let i = 0; i < arr.length; i++) {
4284
- arr[i] = byteSwap(arr[i]);
4285
- }
4286
- }
4287
- var hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0"));
4288
- function bytesToHex(bytes3) {
4289
- bytes2(bytes3);
4290
- let hex = "";
4291
- for (let i = 0; i < bytes3.length; i++) {
4292
- hex += hexes[bytes3[i]];
4293
- }
4294
- return hex;
4295
- }
4296
- function utf8ToBytes2(str) {
4297
- if (typeof str !== "string")
4298
- throw new Error(`utf8ToBytes expected string, got ${typeof str}`);
4299
- return new Uint8Array(new TextEncoder().encode(str));
4300
- }
4301
- function toBytes2(data) {
4302
- if (typeof data === "string")
4303
- data = utf8ToBytes2(data);
4304
- bytes2(data);
4305
- return data;
4306
- }
4307
- function concatBytes(...arrays) {
4308
- let sum = 0;
4309
- for (let i = 0; i < arrays.length; i++) {
4310
- const a = arrays[i];
4311
- bytes2(a);
4312
- sum += a.length;
4313
- }
4314
- const res = new Uint8Array(sum);
4315
- for (let i = 0, pad = 0; i < arrays.length; i++) {
4316
- const a = arrays[i];
4317
- res.set(a, pad);
4318
- pad += a.length;
4319
- }
4320
- return res;
4321
- }
4322
- var Hash = class {
4323
- // Safe version that clones internal state
4324
- clone() {
4325
- return this._cloneInto();
4326
- }
4327
- };
4328
- var toStr = {}.toString;
4329
- function checkOpts(defaults, opts) {
4330
- if (opts !== void 0 && toStr.call(opts) !== "[object Object]")
4331
- throw new Error("Options should be object or undefined");
4332
- const merged = Object.assign(defaults, opts);
4333
- return merged;
4334
- }
4335
- function wrapConstructor(hashCons) {
4336
- const hashC = (msg) => hashCons().update(toBytes2(msg)).digest();
4337
- const tmp = hashCons();
4338
- hashC.outputLen = tmp.outputLen;
4339
- hashC.blockLen = tmp.blockLen;
4340
- hashC.create = () => hashCons();
4341
- return hashC;
4342
- }
4343
-
4344
- // ../../node_modules/@noble/hashes/esm/hmac.js
4345
- var HMAC = class extends Hash {
4346
- constructor(hash2, _key) {
4347
- super();
4348
- this.finished = false;
4349
- this.destroyed = false;
4350
- hash(hash2);
4351
- const key = toBytes2(_key);
4352
- this.iHash = hash2.create();
4353
- if (typeof this.iHash.update !== "function")
4354
- throw new Error("Expected instance of class which extends utils.Hash");
4355
- this.blockLen = this.iHash.blockLen;
4356
- this.outputLen = this.iHash.outputLen;
4357
- const blockLen = this.blockLen;
4358
- const pad = new Uint8Array(blockLen);
4359
- pad.set(key.length > blockLen ? hash2.create().update(key).digest() : key);
4360
- for (let i = 0; i < pad.length; i++)
4361
- pad[i] ^= 54;
4362
- this.iHash.update(pad);
4363
- this.oHash = hash2.create();
4364
- for (let i = 0; i < pad.length; i++)
4365
- pad[i] ^= 54 ^ 92;
4366
- this.oHash.update(pad);
4367
- pad.fill(0);
4368
- }
4369
- update(buf) {
4370
- exists2(this);
4371
- this.iHash.update(buf);
4372
- return this;
4373
- }
4374
- digestInto(out) {
4375
- exists2(this);
4376
- bytes2(out, this.outputLen);
4377
- this.finished = true;
4378
- this.iHash.digestInto(out);
4379
- this.oHash.update(out);
4380
- this.oHash.digestInto(out);
4381
- this.destroy();
4382
- }
4383
- digest() {
4384
- const out = new Uint8Array(this.oHash.outputLen);
4385
- this.digestInto(out);
4386
- return out;
4387
- }
4388
- _cloneInto(to) {
4389
- to || (to = Object.create(Object.getPrototypeOf(this), {}));
4390
- const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;
4391
- to = to;
4392
- to.finished = finished;
4393
- to.destroyed = destroyed;
4394
- to.blockLen = blockLen;
4395
- to.outputLen = outputLen;
4396
- to.oHash = oHash._cloneInto(to.oHash);
4397
- to.iHash = iHash._cloneInto(to.iHash);
4398
- return to;
4399
- }
4400
- destroy() {
4401
- this.destroyed = true;
4402
- this.oHash.destroy();
4403
- this.iHash.destroy();
4404
- }
4405
- };
4406
- var hmac = (hash2, key, message) => new HMAC(hash2, key).update(message).digest();
4407
- hmac.create = (hash2, key) => new HMAC(hash2, key);
4408
-
4409
- // ../../node_modules/@noble/hashes/esm/pbkdf2.js
4410
- function pbkdf2Init(hash2, _password, _salt, _opts) {
4411
- hash(hash2);
4412
- const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);
4413
- const { c, dkLen, asyncTick } = opts;
4414
- number2(c);
4415
- number2(dkLen);
4416
- number2(asyncTick);
4417
- if (c < 1)
4418
- throw new Error("PBKDF2: iterations (c) should be >= 1");
4419
- const password = toBytes2(_password);
4420
- const salt = toBytes2(_salt);
4421
- const DK = new Uint8Array(dkLen);
4422
- const PRF = hmac.create(hash2, password);
4423
- const PRFSalt = PRF._cloneInto().update(salt);
4424
- return { c, dkLen, asyncTick, DK, PRF, PRFSalt };
4425
- }
4426
- function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) {
4427
- PRF.destroy();
4428
- PRFSalt.destroy();
4429
- if (prfW)
4430
- prfW.destroy();
4431
- u.fill(0);
4432
- return DK;
4433
- }
4434
- function pbkdf2(hash2, password, salt, opts) {
4435
- const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash2, password, salt, opts);
4436
- let prfW;
4437
- const arr = new Uint8Array(4);
4438
- const view = createView2(arr);
4439
- const u = new Uint8Array(PRF.outputLen);
4440
- for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {
4441
- const Ti = DK.subarray(pos, pos + PRF.outputLen);
4442
- view.setInt32(0, ti, false);
4443
- (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);
4444
- Ti.set(u.subarray(0, Ti.length));
4445
- for (let ui = 1; ui < c; ui++) {
4446
- PRF._cloneInto(prfW).update(u).digestInto(u);
4447
- for (let i = 0; i < Ti.length; i++)
4448
- Ti[i] ^= u[i];
4449
3708
  }
4450
- }
4451
- return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);
4452
- }
4453
-
4454
- // ../../node_modules/@noble/hashes/esm/_md.js
4455
- function setBigUint642(view, byteOffset, value, isLE3) {
4456
- if (typeof view.setBigUint64 === "function")
4457
- return view.setBigUint64(byteOffset, value, isLE3);
4458
- const _32n = BigInt(32);
4459
- const _u32_max = BigInt(4294967295);
4460
- const wh = Number(value >> _32n & _u32_max);
4461
- const wl = Number(value & _u32_max);
4462
- const h = isLE3 ? 4 : 0;
4463
- const l = isLE3 ? 0 : 4;
4464
- view.setUint32(byteOffset + h, wh, isLE3);
4465
- view.setUint32(byteOffset + l, wl, isLE3);
3709
+ };
3710
+ return mockNotification;
4466
3711
  }
4467
- var Chi = (a, b, c) => a & b ^ ~a & c;
4468
- var Maj = (a, b, c) => a & b ^ a & c ^ b & c;
4469
- var HashMD = class extends Hash {
4470
- constructor(blockLen, outputLen, padOffset, isLE3) {
4471
- super();
4472
- this.blockLen = blockLen;
4473
- this.outputLen = outputLen;
4474
- this.padOffset = padOffset;
4475
- this.isLE = isLE3;
4476
- this.finished = false;
4477
- this.length = 0;
4478
- this.pos = 0;
4479
- this.destroyed = false;
4480
- this.buffer = new Uint8Array(blockLen);
4481
- this.view = createView2(this.buffer);
4482
- }
4483
- update(data) {
4484
- exists2(this);
4485
- const { view, buffer, blockLen } = this;
4486
- data = toBytes2(data);
4487
- const len = data.length;
4488
- for (let pos = 0; pos < len; ) {
4489
- const take = Math.min(blockLen - this.pos, len - pos);
4490
- if (take === blockLen) {
4491
- const dataView = createView2(data);
4492
- for (; blockLen <= len - pos; pos += blockLen)
4493
- this.process(dataView, pos);
4494
- continue;
4495
- }
4496
- buffer.set(data.subarray(pos, pos + take), this.pos);
4497
- this.pos += take;
4498
- pos += take;
4499
- if (this.pos === blockLen) {
4500
- this.process(view, 0);
4501
- this.pos = 0;
3712
+ function createMockNotificationEthReceived() {
3713
+ const mockNotification = {
3714
+ type: "eth_received" /* ETH_RECEIVED */,
3715
+ id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3716
+ trigger_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3717
+ chain_id: 1,
3718
+ block_number: 17485840,
3719
+ block_timestamp: "2022-03-01T00:00:00Z",
3720
+ tx_hash: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3721
+ unread: true,
3722
+ created_at: "2022-03-01T00:00:00Z",
3723
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3724
+ data: {
3725
+ kind: "eth_received",
3726
+ network_fee: {
3727
+ gas_price: "207806259583",
3728
+ native_token_price_in_usd: "0.83"
3729
+ },
3730
+ from: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3731
+ to: "0x881D40237659C251811CEC9c364ef91dC08D300D",
3732
+ amount: {
3733
+ usd: "670.64",
3734
+ eth: "808.000000000000000000"
4502
3735
  }
4503
3736
  }
4504
- this.length += data.length;
4505
- this.roundClean();
4506
- return this;
4507
- }
4508
- digestInto(out) {
4509
- exists2(this);
4510
- output2(out, this);
4511
- this.finished = true;
4512
- const { buffer, view, blockLen, isLE: isLE3 } = this;
4513
- let { pos } = this;
4514
- buffer[pos++] = 128;
4515
- this.buffer.subarray(pos).fill(0);
4516
- if (this.padOffset > blockLen - pos) {
4517
- this.process(view, 0);
4518
- pos = 0;
4519
- }
4520
- for (let i = pos; i < blockLen; i++)
4521
- buffer[i] = 0;
4522
- setBigUint642(view, blockLen - 8, BigInt(this.length * 8), isLE3);
4523
- this.process(view, 0);
4524
- const oview = createView2(out);
4525
- const len = this.outputLen;
4526
- if (len % 4)
4527
- throw new Error("_sha2: outputLen should be aligned to 32bit");
4528
- const outLen = len / 4;
4529
- const state = this.get();
4530
- if (outLen > state.length)
4531
- throw new Error("_sha2: outputLen bigger than state");
4532
- for (let i = 0; i < outLen; i++)
4533
- oview.setUint32(4 * i, state[i], isLE3);
4534
- }
4535
- digest() {
4536
- const { buffer, outputLen } = this;
4537
- this.digestInto(buffer);
4538
- const res = buffer.slice(0, outputLen);
4539
- this.destroy();
4540
- return res;
4541
- }
4542
- _cloneInto(to) {
4543
- to || (to = new this.constructor());
4544
- to.set(...this.get());
4545
- const { blockLen, buffer, length, finished, destroyed, pos } = this;
4546
- to.length = length;
4547
- to.pos = pos;
4548
- to.finished = finished;
4549
- to.destroyed = destroyed;
4550
- if (length % blockLen)
4551
- to.buffer.set(buffer);
4552
- return to;
4553
- }
4554
- };
4555
-
4556
- // ../../node_modules/@noble/hashes/esm/sha256.js
4557
- var SHA256_K = /* @__PURE__ */ new Uint32Array([
4558
- 1116352408,
4559
- 1899447441,
4560
- 3049323471,
4561
- 3921009573,
4562
- 961987163,
4563
- 1508970993,
4564
- 2453635748,
4565
- 2870763221,
4566
- 3624381080,
4567
- 310598401,
4568
- 607225278,
4569
- 1426881987,
4570
- 1925078388,
4571
- 2162078206,
4572
- 2614888103,
4573
- 3248222580,
4574
- 3835390401,
4575
- 4022224774,
4576
- 264347078,
4577
- 604807628,
4578
- 770255983,
4579
- 1249150122,
4580
- 1555081692,
4581
- 1996064986,
4582
- 2554220882,
4583
- 2821834349,
4584
- 2952996808,
4585
- 3210313671,
4586
- 3336571891,
4587
- 3584528711,
4588
- 113926993,
4589
- 338241895,
4590
- 666307205,
4591
- 773529912,
4592
- 1294757372,
4593
- 1396182291,
4594
- 1695183700,
4595
- 1986661051,
4596
- 2177026350,
4597
- 2456956037,
4598
- 2730485921,
4599
- 2820302411,
4600
- 3259730800,
4601
- 3345764771,
4602
- 3516065817,
4603
- 3600352804,
4604
- 4094571909,
4605
- 275423344,
4606
- 430227734,
4607
- 506948616,
4608
- 659060556,
4609
- 883997877,
4610
- 958139571,
4611
- 1322822218,
4612
- 1537002063,
4613
- 1747873779,
4614
- 1955562222,
4615
- 2024104815,
4616
- 2227730452,
4617
- 2361852424,
4618
- 2428436474,
4619
- 2756734187,
4620
- 3204031479,
4621
- 3329325298
4622
- ]);
4623
- var SHA256_IV = /* @__PURE__ */ new Uint32Array([
4624
- 1779033703,
4625
- 3144134277,
4626
- 1013904242,
4627
- 2773480762,
4628
- 1359893119,
4629
- 2600822924,
4630
- 528734635,
4631
- 1541459225
4632
- ]);
4633
- var SHA256_W = /* @__PURE__ */ new Uint32Array(64);
4634
- var SHA256 = class extends HashMD {
4635
- constructor() {
4636
- super(64, 32, 8, false);
4637
- this.A = SHA256_IV[0] | 0;
4638
- this.B = SHA256_IV[1] | 0;
4639
- this.C = SHA256_IV[2] | 0;
4640
- this.D = SHA256_IV[3] | 0;
4641
- this.E = SHA256_IV[4] | 0;
4642
- this.F = SHA256_IV[5] | 0;
4643
- this.G = SHA256_IV[6] | 0;
4644
- this.H = SHA256_IV[7] | 0;
4645
- }
4646
- get() {
4647
- const { A, B, C, D, E, F, G, H } = this;
4648
- return [A, B, C, D, E, F, G, H];
4649
- }
4650
- // prettier-ignore
4651
- set(A, B, C, D, E, F, G, H) {
4652
- this.A = A | 0;
4653
- this.B = B | 0;
4654
- this.C = C | 0;
4655
- this.D = D | 0;
4656
- this.E = E | 0;
4657
- this.F = F | 0;
4658
- this.G = G | 0;
4659
- this.H = H | 0;
4660
- }
4661
- process(view, offset) {
4662
- for (let i = 0; i < 16; i++, offset += 4)
4663
- SHA256_W[i] = view.getUint32(offset, false);
4664
- for (let i = 16; i < 64; i++) {
4665
- const W15 = SHA256_W[i - 15];
4666
- const W2 = SHA256_W[i - 2];
4667
- const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3;
4668
- const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10;
4669
- SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0;
4670
- }
4671
- let { A, B, C, D, E, F, G, H } = this;
4672
- for (let i = 0; i < 64; i++) {
4673
- const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);
4674
- const T1 = H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i] | 0;
4675
- const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);
4676
- const T2 = sigma0 + Maj(A, B, C) | 0;
4677
- H = G;
4678
- G = F;
4679
- F = E;
4680
- E = D + T1 | 0;
4681
- D = C;
4682
- C = B;
4683
- B = A;
4684
- A = T1 + T2 | 0;
4685
- }
4686
- A = A + this.A | 0;
4687
- B = B + this.B | 0;
4688
- C = C + this.C | 0;
4689
- D = D + this.D | 0;
4690
- E = E + this.E | 0;
4691
- F = F + this.F | 0;
4692
- G = G + this.G | 0;
4693
- H = H + this.H | 0;
4694
- this.set(A, B, C, D, E, F, G, H);
4695
- }
4696
- roundClean() {
4697
- SHA256_W.fill(0);
4698
- }
4699
- destroy() {
4700
- this.set(0, 0, 0, 0, 0, 0, 0, 0);
4701
- this.buffer.fill(0);
4702
- }
4703
- };
4704
- var sha256 = /* @__PURE__ */ wrapConstructor(() => new SHA256());
4705
-
4706
- // ../../node_modules/@metamask/snaps-utils/dist/chunk-5R7UF7KM.mjs
4707
- var HandlerType = /* @__PURE__ */ ((HandlerType2) => {
4708
- HandlerType2["OnRpcRequest"] = "onRpcRequest";
4709
- HandlerType2["OnSignature"] = "onSignature";
4710
- HandlerType2["OnTransaction"] = "onTransaction";
4711
- HandlerType2["OnCronjob"] = "onCronjob";
4712
- HandlerType2["OnInstall"] = "onInstall";
4713
- HandlerType2["OnUpdate"] = "onUpdate";
4714
- HandlerType2["OnNameLookup"] = "onNameLookup";
4715
- HandlerType2["OnKeyringRequest"] = "onKeyringRequest";
4716
- HandlerType2["OnHomePage"] = "onHomePage";
4717
- HandlerType2["OnUserInput"] = "onUserInput";
4718
- return HandlerType2;
4719
- })(HandlerType || {});
4720
- var SNAP_EXPORT_NAMES = Object.values(HandlerType);
4721
-
4722
- // ../profile-sync-controller/src/controllers/authentication/auth-snap-requests.ts
4723
- var snapId = "npm:@metamask/message-signing-snap";
4724
- function createSnapSignMessageRequest(message) {
4725
- return {
4726
- snapId,
4727
- origin: "",
4728
- handler: HandlerType.OnRpcRequest,
4729
- request: {
4730
- method: "signMessage",
4731
- params: { message }
4732
- }
4733
3737
  };
3738
+ return mockNotification;
4734
3739
  }
4735
-
4736
- // ../profile-sync-controller/src/controllers/user-storage/index.ts
4737
- var user_storage_exports = {};
4738
- __export(user_storage_exports, {
4739
- Controller: () => UserStorageController,
4740
- Encryption: () => encryption_default,
4741
- Mocks: () => fixtures_exports,
4742
- createSHA256Hash: () => createSHA256Hash
4743
- });
4744
-
4745
- // ../profile-sync-controller/src/controllers/user-storage/UserStorageController.ts
4746
- import { BaseController } from "@metamask/base-controller";
4747
-
4748
- // ../../node_modules/@noble/hashes/esm/scrypt.js
4749
- function XorAndSalsa(prev, pi, input, ii, out, oi) {
4750
- let y00 = prev[pi++] ^ input[ii++], y01 = prev[pi++] ^ input[ii++];
4751
- let y02 = prev[pi++] ^ input[ii++], y03 = prev[pi++] ^ input[ii++];
4752
- let y04 = prev[pi++] ^ input[ii++], y05 = prev[pi++] ^ input[ii++];
4753
- let y06 = prev[pi++] ^ input[ii++], y07 = prev[pi++] ^ input[ii++];
4754
- let y08 = prev[pi++] ^ input[ii++], y09 = prev[pi++] ^ input[ii++];
4755
- let y10 = prev[pi++] ^ input[ii++], y11 = prev[pi++] ^ input[ii++];
4756
- let y12 = prev[pi++] ^ input[ii++], y13 = prev[pi++] ^ input[ii++];
4757
- let y14 = prev[pi++] ^ input[ii++], y15 = prev[pi++] ^ input[ii++];
4758
- let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15;
4759
- for (let i = 0; i < 8; i += 2) {
4760
- x04 ^= rotl(x00 + x12 | 0, 7);
4761
- x08 ^= rotl(x04 + x00 | 0, 9);
4762
- x12 ^= rotl(x08 + x04 | 0, 13);
4763
- x00 ^= rotl(x12 + x08 | 0, 18);
4764
- x09 ^= rotl(x05 + x01 | 0, 7);
4765
- x13 ^= rotl(x09 + x05 | 0, 9);
4766
- x01 ^= rotl(x13 + x09 | 0, 13);
4767
- x05 ^= rotl(x01 + x13 | 0, 18);
4768
- x14 ^= rotl(x10 + x06 | 0, 7);
4769
- x02 ^= rotl(x14 + x10 | 0, 9);
4770
- x06 ^= rotl(x02 + x14 | 0, 13);
4771
- x10 ^= rotl(x06 + x02 | 0, 18);
4772
- x03 ^= rotl(x15 + x11 | 0, 7);
4773
- x07 ^= rotl(x03 + x15 | 0, 9);
4774
- x11 ^= rotl(x07 + x03 | 0, 13);
4775
- x15 ^= rotl(x11 + x07 | 0, 18);
4776
- x01 ^= rotl(x00 + x03 | 0, 7);
4777
- x02 ^= rotl(x01 + x00 | 0, 9);
4778
- x03 ^= rotl(x02 + x01 | 0, 13);
4779
- x00 ^= rotl(x03 + x02 | 0, 18);
4780
- x06 ^= rotl(x05 + x04 | 0, 7);
4781
- x07 ^= rotl(x06 + x05 | 0, 9);
4782
- x04 ^= rotl(x07 + x06 | 0, 13);
4783
- x05 ^= rotl(x04 + x07 | 0, 18);
4784
- x11 ^= rotl(x10 + x09 | 0, 7);
4785
- x08 ^= rotl(x11 + x10 | 0, 9);
4786
- x09 ^= rotl(x08 + x11 | 0, 13);
4787
- x10 ^= rotl(x09 + x08 | 0, 18);
4788
- x12 ^= rotl(x15 + x14 | 0, 7);
4789
- x13 ^= rotl(x12 + x15 | 0, 9);
4790
- x14 ^= rotl(x13 + x12 | 0, 13);
4791
- x15 ^= rotl(x14 + x13 | 0, 18);
4792
- }
4793
- out[oi++] = y00 + x00 | 0;
4794
- out[oi++] = y01 + x01 | 0;
4795
- out[oi++] = y02 + x02 | 0;
4796
- out[oi++] = y03 + x03 | 0;
4797
- out[oi++] = y04 + x04 | 0;
4798
- out[oi++] = y05 + x05 | 0;
4799
- out[oi++] = y06 + x06 | 0;
4800
- out[oi++] = y07 + x07 | 0;
4801
- out[oi++] = y08 + x08 | 0;
4802
- out[oi++] = y09 + x09 | 0;
4803
- out[oi++] = y10 + x10 | 0;
4804
- out[oi++] = y11 + x11 | 0;
4805
- out[oi++] = y12 + x12 | 0;
4806
- out[oi++] = y13 + x13 | 0;
4807
- out[oi++] = y14 + x14 | 0;
4808
- out[oi++] = y15 + x15 | 0;
4809
- }
4810
- function BlockMix(input, ii, out, oi, r) {
4811
- let head = oi + 0;
4812
- let tail = oi + 16 * r;
4813
- for (let i = 0; i < 16; i++)
4814
- out[tail + i] = input[ii + (2 * r - 1) * 16 + i];
4815
- for (let i = 0; i < r; i++, head += 16, ii += 16) {
4816
- XorAndSalsa(out, tail, input, ii, out, head);
4817
- if (i > 0)
4818
- tail += 16;
4819
- XorAndSalsa(out, head, input, ii += 16, out, tail);
4820
- }
4821
- }
4822
- function scryptInit(password, salt, _opts) {
4823
- const opts = checkOpts({
4824
- dkLen: 32,
4825
- asyncTick: 10,
4826
- maxmem: 1024 ** 3 + 1024
4827
- }, _opts);
4828
- const { N, r, p, dkLen, asyncTick, maxmem, onProgress } = opts;
4829
- number2(N);
4830
- number2(r);
4831
- number2(p);
4832
- number2(dkLen);
4833
- number2(asyncTick);
4834
- number2(maxmem);
4835
- if (onProgress !== void 0 && typeof onProgress !== "function")
4836
- throw new Error("progressCb should be function");
4837
- const blockSize = 128 * r;
4838
- const blockSize32 = blockSize / 4;
4839
- if (N <= 1 || (N & N - 1) !== 0 || N >= 2 ** (blockSize / 8) || N > 2 ** 32) {
4840
- throw new Error("Scrypt: N must be larger than 1, a power of 2, less than 2^(128 * r / 8) and less than 2^32");
4841
- }
4842
- if (p < 0 || p > (2 ** 32 - 1) * 32 / blockSize) {
4843
- throw new Error("Scrypt: p must be a positive integer less than or equal to ((2^32 - 1) * 32) / (128 * r)");
4844
- }
4845
- if (dkLen < 0 || dkLen > (2 ** 32 - 1) * 32) {
4846
- throw new Error("Scrypt: dkLen should be positive integer less than or equal to (2^32 - 1) * 32");
4847
- }
4848
- const memUsed = blockSize * (N + p);
4849
- if (memUsed > maxmem) {
4850
- throw new Error(`Scrypt: parameters too large, ${memUsed} (128 * r * (N + p)) > ${maxmem} (maxmem)`);
4851
- }
4852
- const B = pbkdf2(sha256, password, salt, { c: 1, dkLen: blockSize * p });
4853
- const B32 = u322(B);
4854
- const V = u322(new Uint8Array(blockSize * N));
4855
- const tmp = u322(new Uint8Array(blockSize));
4856
- let blockMixCb = () => {
3740
+ function createMockNotificationERC20Sent() {
3741
+ const mockNotification = {
3742
+ type: "erc20_sent" /* ERC20_SENT */,
3743
+ id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3744
+ trigger_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3745
+ chain_id: 1,
3746
+ block_number: 17485840,
3747
+ block_timestamp: "2022-03-01T00:00:00Z",
3748
+ tx_hash: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3749
+ unread: true,
3750
+ created_at: "2022-03-01T00:00:00Z",
3751
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3752
+ data: {
3753
+ kind: "erc20_sent",
3754
+ network_fee: {
3755
+ gas_price: "207806259583",
3756
+ native_token_price_in_usd: "0.83"
3757
+ },
3758
+ to: "0xecc19e177d24551aa7ed6bc6fe566eca726cc8a9",
3759
+ from: "0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae",
3760
+ token: {
3761
+ usd: "1.00",
3762
+ name: "USDC",
3763
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/usdc.svg",
3764
+ amount: "4956250000",
3765
+ symbol: "USDC",
3766
+ address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
3767
+ decimals: "6"
3768
+ }
3769
+ }
4857
3770
  };
4858
- if (onProgress) {
4859
- const totalBlockMix = 2 * N * p;
4860
- const callbackPer = Math.max(Math.floor(totalBlockMix / 1e4), 1);
4861
- let blockMixCnt = 0;
4862
- blockMixCb = () => {
4863
- blockMixCnt++;
4864
- if (onProgress && (!(blockMixCnt % callbackPer) || blockMixCnt === totalBlockMix))
4865
- onProgress(blockMixCnt / totalBlockMix);
4866
- };
4867
- }
4868
- return { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick };
3771
+ return mockNotification;
4869
3772
  }
4870
- function scryptOutput(password, dkLen, B, V, tmp) {
4871
- const res = pbkdf2(sha256, password, B, { c: 1, dkLen });
4872
- B.fill(0);
4873
- V.fill(0);
4874
- tmp.fill(0);
4875
- return res;
4876
- }
4877
- function scrypt(password, salt, opts) {
4878
- const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb } = scryptInit(password, salt, opts);
4879
- if (!isLE2)
4880
- byteSwap32(B32);
4881
- for (let pi = 0; pi < p; pi++) {
4882
- const Pi = blockSize32 * pi;
4883
- for (let i = 0; i < blockSize32; i++)
4884
- V[i] = B32[Pi + i];
4885
- for (let i = 0, pos = 0; i < N - 1; i++) {
4886
- BlockMix(V, pos, V, pos += blockSize32, r);
4887
- blockMixCb();
4888
- }
4889
- BlockMix(V, (N - 1) * blockSize32, B32, Pi, r);
4890
- blockMixCb();
4891
- for (let i = 0; i < N; i++) {
4892
- const j = B32[Pi + blockSize32 - 16] % N;
4893
- for (let k = 0; k < blockSize32; k++)
4894
- tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k];
4895
- BlockMix(tmp, 0, B32, Pi, r);
4896
- blockMixCb();
3773
+ function createMockNotificationERC20Received() {
3774
+ const mockNotification = {
3775
+ type: "erc20_received" /* ERC20_RECEIVED */,
3776
+ id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3777
+ trigger_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
3778
+ chain_id: 1,
3779
+ block_number: 17485840,
3780
+ block_timestamp: "2022-03-01T00:00:00Z",
3781
+ tx_hash: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3782
+ unread: true,
3783
+ created_at: "2022-03-01T00:00:00Z",
3784
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3785
+ data: {
3786
+ kind: "erc20_received",
3787
+ network_fee: {
3788
+ gas_price: "207806259583",
3789
+ native_token_price_in_usd: "0.83"
3790
+ },
3791
+ to: "0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4",
3792
+ from: "0x51c72848c68a965f66fa7a88855f9f7784502a7f",
3793
+ token: {
3794
+ usd: "0.00",
3795
+ name: "SHIBA INU",
3796
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/shib.svg",
3797
+ amount: "8382798736999999457296646144",
3798
+ symbol: "SHIB",
3799
+ address: "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce",
3800
+ decimals: "18"
3801
+ }
4897
3802
  }
4898
- }
4899
- if (!isLE2)
4900
- byteSwap32(B32);
4901
- return scryptOutput(password, dkLen, B, V, tmp);
4902
- }
4903
-
4904
- // ../profile-sync-controller/src/controllers/user-storage/encryption/utils.ts
4905
- var byteArrayToBase64 = (byteArray) => {
4906
- return Buffer.from(byteArray).toString("base64");
4907
- };
4908
- var base64ToByteArray = (base64) => {
4909
- return new Uint8Array(Buffer.from(base64, "base64"));
4910
- };
4911
- var bytesToUtf8 = (byteArray) => {
4912
- const decoder = new TextDecoder("utf-8");
4913
- return decoder.decode(byteArray);
4914
- };
4915
-
4916
- // ../profile-sync-controller/src/controllers/user-storage/encryption/cache.ts
4917
- var MAX_PASSWORD_CACHES = 3;
4918
- var MAX_SALT_CACHES = 10;
4919
- var inMemCachedKDF = {};
4920
- var getPasswordCache = (hashedPassword) => {
4921
- inMemCachedKDF[hashedPassword] ?? (inMemCachedKDF[hashedPassword] = /* @__PURE__ */ new Map());
4922
- return inMemCachedKDF[hashedPassword];
4923
- };
4924
- function getCachedKeyBySalt(hashedPassword, salt) {
4925
- const cache = getPasswordCache(hashedPassword);
4926
- const base64Salt = byteArrayToBase64(salt);
4927
- const cachedKey = cache.get(base64Salt);
4928
- if (!cachedKey) {
4929
- return void 0;
4930
- }
4931
- return {
4932
- salt,
4933
- base64Salt,
4934
- key: cachedKey
4935
3803
  };
3804
+ return mockNotification;
4936
3805
  }
4937
- function getAnyCachedKey(hashedPassword) {
4938
- const cache = getPasswordCache(hashedPassword);
4939
- const cachedEntry = cache.entries().next().value;
4940
- if (!cachedEntry) {
4941
- return void 0;
4942
- }
4943
- const base64Salt = cachedEntry[0];
4944
- const bytesSalt = base64ToByteArray(base64Salt);
4945
- return {
4946
- salt: bytesSalt,
4947
- base64Salt,
4948
- key: cachedEntry[1]
3806
+ function createMockNotificationERC721Sent() {
3807
+ const mockNotification = {
3808
+ type: "erc721_sent" /* ERC721_SENT */,
3809
+ block_number: 18576643,
3810
+ block_timestamp: "1700043467",
3811
+ chain_id: 1,
3812
+ created_at: "2023-11-15T11:08:17.895407Z",
3813
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3814
+ data: {
3815
+ to: "0xf47f628fe3bd2595e9ab384bfffc3859b448e451",
3816
+ nft: {
3817
+ name: "Captainz #8680",
3818
+ image: "https://i.seadn.io/s/raw/files/ae0fc06714ff7fb40217340d8a242c0e.gif?w=500&auto=format",
3819
+ token_id: "8680",
3820
+ collection: {
3821
+ name: "The Captainz",
3822
+ image: "https://i.seadn.io/gcs/files/6df4d75778066bce740050615bc84e21.png?w=500&auto=format",
3823
+ symbol: "Captainz",
3824
+ address: "0x769272677fab02575e84945f03eca517acc544cc"
3825
+ }
3826
+ },
3827
+ from: "0x24a0bb54b7e7a8e406e9b28058a9fd6c49e6df4f",
3828
+ kind: "erc721_sent",
3829
+ network_fee: {
3830
+ gas_price: "24550653274",
3831
+ native_token_price_in_usd: "1986.61"
3832
+ }
3833
+ },
3834
+ id: "a4193058-9814-537e-9df4-79dcac727fb6",
3835
+ trigger_id: "028485be-b994-422b-a93b-03fcc01ab715",
3836
+ tx_hash: "0x0833c69fb41cf972a0f031fceca242939bc3fcf82b964b74606649abcad371bd",
3837
+ unread: true
4949
3838
  };
3839
+ return mockNotification;
4950
3840
  }
4951
- function setCachedKey(hashedPassword, salt, key) {
4952
- if (Object.keys(inMemCachedKDF).length > MAX_PASSWORD_CACHES) {
4953
- inMemCachedKDF = {};
4954
- }
4955
- const cache = getPasswordCache(hashedPassword);
4956
- const base64Salt = byteArrayToBase64(salt);
4957
- if (cache.size > MAX_SALT_CACHES) {
4958
- cache.clear();
4959
- }
4960
- cache.set(base64Salt, key);
3841
+ function createMockNotificationERC721Received() {
3842
+ const mockNotification = {
3843
+ type: "erc721_received" /* ERC721_RECEIVED */,
3844
+ block_number: 18571446,
3845
+ block_timestamp: "1699980623",
3846
+ chain_id: 1,
3847
+ created_at: "2023-11-14T17:40:52.319281Z",
3848
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3849
+ data: {
3850
+ to: "0xba7f3daa8adfdad686574406ab9bd5d2f0a49d2e",
3851
+ nft: {
3852
+ name: "The Plague #2722",
3853
+ image: "https://i.seadn.io/s/raw/files/a96f90ec8ebf55a2300c66a0c46d6a16.png?w=500&auto=format",
3854
+ token_id: "2722",
3855
+ collection: {
3856
+ name: "The Plague NFT",
3857
+ image: "https://i.seadn.io/gcs/files/4577987a5ca45ca5118b2e31559ee4d1.jpg?w=500&auto=format",
3858
+ symbol: "FROG",
3859
+ address: "0xc379e535caff250a01caa6c3724ed1359fe5c29b"
3860
+ }
3861
+ },
3862
+ from: "0x24a0bb54b7e7a8e406e9b28058a9fd6c49e6df4f",
3863
+ kind: "erc721_received",
3864
+ network_fee: {
3865
+ gas_price: "53701898538",
3866
+ native_token_price_in_usd: "2047.01"
3867
+ }
3868
+ },
3869
+ id: "00a79d24-befa-57ed-a55a-9eb8696e1654",
3870
+ trigger_id: "d24ac26a-8579-49ec-9947-d04d63592ebd",
3871
+ tx_hash: "0xe554c9e29e6eeca8ba94da4d047334ba08b8eb9ca3b801dd69cec08dfdd4ae43",
3872
+ unread: true
3873
+ };
3874
+ return mockNotification;
4961
3875
  }
4962
-
4963
- // ../profile-sync-controller/src/controllers/user-storage/encryption/encryption.ts
4964
- var ALGORITHM_NONCE_SIZE = 12;
4965
- var ALGORITHM_KEY_SIZE = 16;
4966
- var SCRYPT_SALT_SIZE = 16;
4967
- var SCRYPT_N = 2 ** 17;
4968
- var SCRYPT_r = 8;
4969
- var SCRYPT_p = 1;
4970
- var _encryptStringV1, encryptStringV1_fn, _decryptStringV1, decryptStringV1_fn, _encrypt, encrypt_fn, _decrypt, decrypt_fn, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn;
4971
- var EncryptorDecryptor = class {
4972
- constructor() {
4973
- __privateAdd(this, _encryptStringV1);
4974
- __privateAdd(this, _decryptStringV1);
4975
- __privateAdd(this, _encrypt);
4976
- __privateAdd(this, _decrypt);
4977
- __privateAdd(this, _getOrGenerateScryptKey);
4978
- }
4979
- encryptString(plaintext, password) {
4980
- try {
4981
- return __privateMethod(this, _encryptStringV1, encryptStringV1_fn).call(this, plaintext, password);
4982
- } catch (e) {
4983
- const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
4984
- throw new Error(`Unable to encrypt string - ${errorMessage}`);
4985
- }
4986
- }
4987
- decryptString(encryptedDataStr, password) {
4988
- try {
4989
- const encryptedData = JSON.parse(encryptedDataStr);
4990
- if (encryptedData.v === "1") {
4991
- if (encryptedData.t === "scrypt") {
4992
- return __privateMethod(this, _decryptStringV1, decryptStringV1_fn).call(this, encryptedData, password);
3876
+ function createMockNotificationERC1155Sent() {
3877
+ const mockNotification = {
3878
+ type: "erc1155_sent" /* ERC1155_SENT */,
3879
+ block_number: 18615206,
3880
+ block_timestamp: "1700510003",
3881
+ chain_id: 1,
3882
+ created_at: "2023-11-20T20:44:10.110706Z",
3883
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3884
+ data: {
3885
+ to: "0x15bd77ccacf2da39b84f0c31fee2e451225bb190",
3886
+ nft: {
3887
+ name: "IlluminatiNFT DAO",
3888
+ image: "https://i.seadn.io/gcs/files/79a77cb37c7b2f1069f752645d29fea7.jpg?w=500&auto=format",
3889
+ token_id: "1",
3890
+ collection: {
3891
+ name: "IlluminatiNFT DAO",
3892
+ image: "https://i.seadn.io/gae/LTKz3om2eCQfn3M6PkqEmY7KhLtdMCOm0QVch2318KJq7-KyToCH7NBTMo4UuJ0AZI-oaBh1HcgrAEIEWYbXY3uMcYpuGXunaXEh?w=500&auto=format",
3893
+ symbol: "TRUTH",
3894
+ address: "0xe25f0fe686477f9df3c2876c4902d3b85f75f33a"
4993
3895
  }
3896
+ },
3897
+ from: "0x0000000000000000000000000000000000000000",
3898
+ kind: "erc1155_sent",
3899
+ network_fee: {
3900
+ gas_price: "33571446596",
3901
+ native_token_price_in_usd: "2038.88"
4994
3902
  }
4995
- throw new Error(
4996
- `Unsupported encrypted data payload - ${encryptedDataStr}`
4997
- );
4998
- } catch (e) {
4999
- const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
5000
- throw new Error(`Unable to decrypt string - ${errorMessage}`);
5001
- }
5002
- }
5003
- };
5004
- _encryptStringV1 = new WeakSet();
5005
- encryptStringV1_fn = function(plaintext, password) {
5006
- const { key, salt } = __privateMethod(this, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn).call(this, password, {
5007
- N: SCRYPT_N,
5008
- r: SCRYPT_r,
5009
- p: SCRYPT_p,
5010
- dkLen: ALGORITHM_KEY_SIZE
5011
- });
5012
- const plaintextRaw = utf8ToBytes2(plaintext);
5013
- const ciphertextAndNonceAndSalt = concatBytes(
5014
- salt,
5015
- __privateMethod(this, _encrypt, encrypt_fn).call(this, plaintextRaw, key)
5016
- );
5017
- const encryptedData = byteArrayToBase64(ciphertextAndNonceAndSalt);
5018
- const encryptedPayload = {
5019
- v: "1",
5020
- t: "scrypt",
5021
- d: encryptedData,
5022
- o: {
5023
- N: SCRYPT_N,
5024
- r: SCRYPT_r,
5025
- p: SCRYPT_p,
5026
- dkLen: ALGORITHM_KEY_SIZE
5027
3903
  },
5028
- saltLen: SCRYPT_SALT_SIZE
3904
+ id: "a09ff9d1-623a-52ab-a3d4-c7c8c9a58362",
3905
+ trigger_id: "e2130f7d-78b8-4c34-999a-3f3d3bb5b03c",
3906
+ tx_hash: "0x03381aba290facbaf71c123e263c8dc3dd550aac00ef589cce395182eaeff76f",
3907
+ unread: true
5029
3908
  };
5030
- return JSON.stringify(encryptedPayload);
5031
- };
5032
- _decryptStringV1 = new WeakSet();
5033
- decryptStringV1_fn = function(data, password) {
5034
- const { o, d: base64CiphertextAndNonceAndSalt, saltLen } = data;
5035
- const ciphertextAndNonceAndSalt = base64ToByteArray(
5036
- base64CiphertextAndNonceAndSalt
5037
- );
5038
- const salt = ciphertextAndNonceAndSalt.slice(0, saltLen);
5039
- const ciphertextAndNonce = ciphertextAndNonceAndSalt.slice(
5040
- saltLen,
5041
- ciphertextAndNonceAndSalt.length
5042
- );
5043
- const { key } = __privateMethod(this, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn).call(this, password, {
5044
- N: o.N,
5045
- r: o.r,
5046
- p: o.p,
5047
- dkLen: o.dkLen
5048
- }, salt);
5049
- return bytesToUtf8(__privateMethod(this, _decrypt, decrypt_fn).call(this, ciphertextAndNonce, key));
5050
- };
5051
- _encrypt = new WeakSet();
5052
- encrypt_fn = function(plaintext, key) {
5053
- const nonce = randomBytes(ALGORITHM_NONCE_SIZE);
5054
- const ciphertext = gcm(key, nonce).encrypt(plaintext);
5055
- return concatBytes(nonce, ciphertext);
5056
- };
5057
- _decrypt = new WeakSet();
5058
- decrypt_fn = function(ciphertextAndNonce, key) {
5059
- const nonce = ciphertextAndNonce.slice(0, ALGORITHM_NONCE_SIZE);
5060
- const ciphertext = ciphertextAndNonce.slice(
5061
- ALGORITHM_NONCE_SIZE,
5062
- ciphertextAndNonce.length
5063
- );
5064
- return gcm(key, nonce).decrypt(ciphertext);
5065
- };
5066
- _getOrGenerateScryptKey = new WeakSet();
5067
- getOrGenerateScryptKey_fn = function(password, o, salt) {
5068
- const hashedPassword = createSHA256Hash(password);
5069
- const cachedKey = salt ? getCachedKeyBySalt(hashedPassword, salt) : getAnyCachedKey(hashedPassword);
5070
- if (cachedKey) {
5071
- return {
5072
- key: cachedKey.key,
5073
- salt: cachedKey.salt
5074
- };
5075
- }
5076
- const newSalt = salt ?? randomBytes(SCRYPT_SALT_SIZE);
5077
- const newKey = scrypt(password, newSalt, {
5078
- N: o.N,
5079
- r: o.r,
5080
- p: o.p,
5081
- dkLen: o.dkLen
5082
- });
5083
- setCachedKey(hashedPassword, newSalt, newKey);
5084
- return {
5085
- key: newKey,
5086
- salt: newSalt
3909
+ return mockNotification;
3910
+ }
3911
+ function createMockNotificationERC1155Received() {
3912
+ const mockNotification = {
3913
+ type: "erc1155_received" /* ERC1155_RECEIVED */,
3914
+ block_number: 18615206,
3915
+ block_timestamp: "1700510003",
3916
+ chain_id: 1,
3917
+ created_at: "2023-11-20T20:44:10.110706Z",
3918
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3919
+ data: {
3920
+ to: "0x15bd77ccacf2da39b84f0c31fee2e451225bb190",
3921
+ nft: {
3922
+ name: "IlluminatiNFT DAO",
3923
+ image: "https://i.seadn.io/gcs/files/79a77cb37c7b2f1069f752645d29fea7.jpg?w=500&auto=format",
3924
+ token_id: "1",
3925
+ collection: {
3926
+ name: "IlluminatiNFT DAO",
3927
+ image: "https://i.seadn.io/gae/LTKz3om2eCQfn3M6PkqEmY7KhLtdMCOm0QVch2318KJq7-KyToCH7NBTMo4UuJ0AZI-oaBh1HcgrAEIEWYbXY3uMcYpuGXunaXEh?w=500&auto=format",
3928
+ symbol: "TRUTH",
3929
+ address: "0xe25f0fe686477f9df3c2876c4902d3b85f75f33a"
3930
+ }
3931
+ },
3932
+ from: "0x0000000000000000000000000000000000000000",
3933
+ kind: "erc1155_received",
3934
+ network_fee: {
3935
+ gas_price: "33571446596",
3936
+ native_token_price_in_usd: "2038.88"
3937
+ }
3938
+ },
3939
+ id: "b6b93c84-e8dc-54ed-9396-7ea50474843a",
3940
+ trigger_id: "710c8abb-43a9-42a5-9d86-9dd258726c82",
3941
+ tx_hash: "0x03381aba290facbaf71c123e263c8dc3dd550aac00ef589cce395182eaeff76f",
3942
+ unread: true
5087
3943
  };
5088
- };
5089
- var encryption = new EncryptorDecryptor();
5090
- var encryption_default = encryption;
5091
- function createSHA256Hash(data) {
5092
- const hashedData = sha256(data);
5093
- return bytesToHex(hashedData);
3944
+ return mockNotification;
5094
3945
  }
5095
-
5096
- // ../profile-sync-controller/src/controllers/user-storage/encryption/index.ts
5097
- var encryption_default2 = encryption_default;
5098
-
5099
- // ../profile-sync-controller/src/controllers/user-storage/services.ts
5100
- import log from "loglevel";
5101
-
5102
- // ../profile-sync-controller/src/controllers/user-storage/schema.ts
5103
- var USER_STORAGE_ENTRIES = {
5104
- notificationSettings: {
5105
- path: "notifications",
5106
- entryName: "notificationSettings"
5107
- }
5108
- };
5109
- function createEntryPath(entryKey, storageKey) {
5110
- const entry = USER_STORAGE_ENTRIES[entryKey];
5111
- if (!entry) {
5112
- throw new Error(`user-storage - invalid entry provided: ${entryKey}`);
5113
- }
5114
- const hashedKey = createSHA256Hash(entry.entryName + storageKey);
5115
- return `/${entry.path}/${hashedKey}`;
3946
+ function createMockNotificationMetaMaskSwapsCompleted() {
3947
+ const mockNotification = {
3948
+ type: "metamask_swap_completed" /* METAMASK_SWAP_COMPLETED */,
3949
+ block_number: 18377666,
3950
+ block_timestamp: "1697637275",
3951
+ chain_id: 1,
3952
+ created_at: "2023-10-18T13:58:49.854596Z",
3953
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3954
+ data: {
3955
+ kind: "metamask_swap_completed",
3956
+ rate: "1558.27",
3957
+ token_in: {
3958
+ usd: "1576.73",
3959
+ image: "https://token.api.cx.metamask.io/assets/nativeCurrencyLogos/ethereum.svg",
3960
+ amount: "9000000000000000",
3961
+ symbol: "ETH",
3962
+ address: "0x0000000000000000000000000000000000000000",
3963
+ decimals: "18",
3964
+ name: "Ethereum"
3965
+ },
3966
+ token_out: {
3967
+ usd: "1.00",
3968
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/usdt.svg",
3969
+ amount: "14024419",
3970
+ symbol: "USDT",
3971
+ address: "0xdac17f958d2ee523a2206206994597c13d831ec7",
3972
+ decimals: "6",
3973
+ name: "USDT"
3974
+ },
3975
+ network_fee: {
3976
+ gas_price: "15406129273",
3977
+ native_token_price_in_usd: "1576.73"
3978
+ }
3979
+ },
3980
+ id: "7ddfe6a1-ac52-5ffe-aa40-f04242db4b8b",
3981
+ trigger_id: "d2eaa2eb-2e6e-4fd5-8763-b70ea571b46c",
3982
+ tx_hash: "0xf69074290f3aa11bce567aabc9ca0df7a12559dfae1b80ba1a124e9dfe19ecc5",
3983
+ unread: true
3984
+ };
3985
+ return mockNotification;
5116
3986
  }
5117
-
5118
- // ../profile-sync-controller/src/controllers/user-storage/services.ts
5119
- var ENV_URLS2 = getEnvUrls("prd" /* PRD */);
5120
- var USER_STORAGE_API = ENV_URLS2.userStorageApiUrl;
5121
- var USER_STORAGE_ENDPOINT = `${USER_STORAGE_API}/api/v1/userstorage`;
5122
- async function getUserStorage(opts) {
5123
- try {
5124
- const path = createEntryPath(opts.entryKey, opts.storageKey);
5125
- const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
5126
- const userStorageResponse = await fetch(url.toString(), {
5127
- headers: {
5128
- "Content-Type": "application/json",
5129
- Authorization: `Bearer ${opts.bearerToken}`
3987
+ function createMockNotificationRocketPoolStakeCompleted() {
3988
+ const mockNotification = {
3989
+ type: "rocketpool_stake_completed" /* ROCKETPOOL_STAKE_COMPLETED */,
3990
+ block_number: 18585057,
3991
+ block_timestamp: "1700145059",
3992
+ chain_id: 1,
3993
+ created_at: "2023-11-20T12:02:48.796824Z",
3994
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
3995
+ data: {
3996
+ kind: "rocketpool_stake_completed",
3997
+ stake_in: {
3998
+ usd: "2031.86",
3999
+ name: "Ethereum",
4000
+ image: "https://token.api.cx.metamask.io/assets/nativeCurrencyLogos/ethereum.svg",
4001
+ amount: "190690478063438272",
4002
+ symbol: "ETH",
4003
+ address: "0x0000000000000000000000000000000000000000",
4004
+ decimals: "18"
4005
+ },
4006
+ stake_out: {
4007
+ usd: "2226.49",
4008
+ name: "Rocket Pool ETH",
4009
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/rETH.svg",
4010
+ amount: "175024360778165879",
4011
+ symbol: "RETH",
4012
+ address: "0xae78736Cd615f374D3085123A210448E74Fc6393",
4013
+ decimals: "18"
4014
+ },
4015
+ network_fee: {
4016
+ gas_price: "36000000000",
4017
+ native_token_price_in_usd: "2031.86"
5130
4018
  }
5131
- });
5132
- if (userStorageResponse.status === 404) {
5133
- return null;
5134
- }
5135
- if (userStorageResponse.status !== 200) {
5136
- throw new Error("Unable to get User Storage");
5137
- }
5138
- const userStorage = await userStorageResponse.json();
5139
- const encryptedData = userStorage?.Data ?? null;
5140
- if (!encryptedData) {
5141
- return null;
5142
- }
5143
- const decryptedData = encryption_default2.decryptString(
5144
- encryptedData,
5145
- opts.storageKey
5146
- );
5147
- return decryptedData;
5148
- } catch (e) {
5149
- log.error("Failed to get user storage", e);
5150
- return null;
5151
- }
4019
+ },
4020
+ id: "c2a2f225-b2fb-5d6c-ba56-e27a5c71ffb9",
4021
+ trigger_id: "5110ff97-acff-40c0-83b4-11d487b8c7b0",
4022
+ tx_hash: "0xcfc0693bf47995907b0f46ef0644cf16dd9a0de797099b2e00fd481e1b2117d3",
4023
+ unread: true
4024
+ };
4025
+ return mockNotification;
5152
4026
  }
5153
- async function upsertUserStorage(data, opts) {
5154
- const encryptedData = encryption_default2.encryptString(data, opts.storageKey);
5155
- const path = createEntryPath(opts.entryKey, opts.storageKey);
5156
- const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
5157
- const res = await fetch(url.toString(), {
5158
- method: "PUT",
5159
- headers: {
5160
- "Content-Type": "application/json",
5161
- Authorization: `Bearer ${opts.bearerToken}`
4027
+ function createMockNotificationRocketPoolUnStakeCompleted() {
4028
+ const mockNotification = {
4029
+ type: "rocketpool_unstake_completed" /* ROCKETPOOL_UNSTAKE_COMPLETED */,
4030
+ block_number: 18384336,
4031
+ block_timestamp: "1697718011",
4032
+ chain_id: 1,
4033
+ created_at: "2023-10-19T13:11:10.623042Z",
4034
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
4035
+ data: {
4036
+ kind: "rocketpool_unstake_completed",
4037
+ stake_in: {
4038
+ usd: "1686.34",
4039
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/rETH.svg",
4040
+ amount: "66608041413696770",
4041
+ symbol: "RETH",
4042
+ address: "0xae78736Cd615f374D3085123A210448E74Fc6393",
4043
+ decimals: "18",
4044
+ name: "Rocketpool Eth"
4045
+ },
4046
+ stake_out: {
4047
+ usd: "1553.75",
4048
+ image: "https://token.api.cx.metamask.io/assets/nativeCurrencyLogos/ethereum.svg",
4049
+ amount: "72387843427700824",
4050
+ symbol: "ETH",
4051
+ address: "0x0000000000000000000000000000000000000000",
4052
+ decimals: "18",
4053
+ name: "Ethereum"
4054
+ },
4055
+ network_fee: {
4056
+ gas_price: "5656322987",
4057
+ native_token_price_in_usd: "1553.75"
4058
+ }
5162
4059
  },
5163
- body: JSON.stringify({ data: encryptedData })
5164
- });
5165
- if (!res.ok) {
5166
- throw new Error("user-storage - unable to upsert data");
5167
- }
4060
+ id: "d8c246e7-a0a4-5f1d-b079-2b1707665fbc",
4061
+ trigger_id: "291ec897-f569-4837-b6c0-21001b198dff",
4062
+ tx_hash: "0xc7972a7e409abfc62590ec90e633acd70b9b74e76ad02305be8bf133a0e22d5f",
4063
+ unread: true
4064
+ };
4065
+ return mockNotification;
5168
4066
  }
5169
-
5170
- // ../profile-sync-controller/src/controllers/user-storage/UserStorageController.ts
5171
- var controllerName = "UserStorageController";
5172
- var defaultState = {
5173
- isProfileSyncingEnabled: true,
5174
- isProfileSyncingUpdateLoading: false
5175
- };
5176
- var metadata = {
5177
- isProfileSyncingEnabled: {
5178
- persist: true,
5179
- anonymous: true
5180
- },
5181
- isProfileSyncingUpdateLoading: {
5182
- persist: false,
5183
- anonymous: false
5184
- }
5185
- };
5186
- var _auth, _notificationServices, _registerMessageHandlers, registerMessageHandlers_fn, _assertProfileSyncingEnabled, assertProfileSyncingEnabled_fn, _getStorageKeyAndBearerToken, getStorageKeyAndBearerToken_fn, _createStorageKey, createStorageKey_fn, _snapSignMessage, snapSignMessage_fn, _setIsProfileSyncingUpdateLoading, setIsProfileSyncingUpdateLoading_fn;
5187
- var UserStorageController = class extends BaseController {
5188
- constructor(params) {
5189
- super({
5190
- messenger: params.messenger,
5191
- metadata,
5192
- name: controllerName,
5193
- state: { ...defaultState, ...params.state }
5194
- });
5195
- /**
5196
- * Constructor helper for registering this controller's messaging system
5197
- * actions.
5198
- */
5199
- __privateAdd(this, _registerMessageHandlers);
5200
- __privateAdd(this, _assertProfileSyncingEnabled);
5201
- /**
5202
- * Utility to get the bearer token and storage key
5203
- */
5204
- __privateAdd(this, _getStorageKeyAndBearerToken);
5205
- /**
5206
- * Rather than storing the storage key, we can compute the storage key when needed.
5207
- *
5208
- * @returns the storage key
5209
- */
5210
- __privateAdd(this, _createStorageKey);
5211
- /**
5212
- * Signs a specific message using an underlying auth snap.
5213
- *
5214
- * @param message - A specific tagged message to sign.
5215
- * @returns A Signature created by the snap.
5216
- */
5217
- __privateAdd(this, _snapSignMessage);
5218
- __privateAdd(this, _setIsProfileSyncingUpdateLoading);
5219
- __privateAdd(this, _auth, {
5220
- getBearerToken: async () => {
5221
- return await this.messagingSystem.call(
5222
- "AuthenticationController:getBearerToken"
5223
- );
4067
+ function createMockNotificationLidoStakeCompleted() {
4068
+ const mockNotification = {
4069
+ type: "lido_stake_completed" /* LIDO_STAKE_COMPLETED */,
4070
+ block_number: 18487118,
4071
+ block_timestamp: "1698961091",
4072
+ chain_id: 1,
4073
+ created_at: "2023-11-02T22:28:49.970865Z",
4074
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
4075
+ data: {
4076
+ kind: "lido_stake_completed",
4077
+ stake_in: {
4078
+ usd: "1806.33",
4079
+ name: "Ethereum",
4080
+ image: "https://token.api.cx.metamask.io/assets/nativeCurrencyLogos/ethereum.svg",
4081
+ amount: "330303634023928032",
4082
+ symbol: "ETH",
4083
+ address: "0x0000000000000000000000000000000000000000",
4084
+ decimals: "18"
5224
4085
  },
5225
- getProfileId: async () => {
5226
- const sessionProfile = await this.messagingSystem.call(
5227
- "AuthenticationController:getSessionProfile"
5228
- );
5229
- return sessionProfile?.profileId;
4086
+ stake_out: {
4087
+ usd: "1801.30",
4088
+ name: "Liquid staked Ether 2.0",
4089
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/stETH.svg",
4090
+ amount: "330303634023928032",
4091
+ symbol: "STETH",
4092
+ address: "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84",
4093
+ decimals: "18"
5230
4094
  },
5231
- isAuthEnabled: () => {
5232
- return this.messagingSystem.call("AuthenticationController:isSignedIn");
4095
+ network_fee: {
4096
+ gas_price: "26536359866",
4097
+ native_token_price_in_usd: "1806.33"
4098
+ }
4099
+ },
4100
+ id: "9d9b1467-b3ee-5492-8ca2-22382657b690",
4101
+ trigger_id: "ec10d66a-f78f-461f-83c9-609aada8cc50",
4102
+ tx_hash: "0x8cc0fa805f7c3b1743b14f3b91c6b824113b094f26d4ccaf6a71ad8547ce6a0f",
4103
+ unread: true
4104
+ };
4105
+ return mockNotification;
4106
+ }
4107
+ function createMockNotificationLidoWithdrawalRequested() {
4108
+ const mockNotification = {
4109
+ type: "lido_withdrawal_requested" /* LIDO_WITHDRAWAL_REQUESTED */,
4110
+ block_number: 18377760,
4111
+ block_timestamp: "1697638415",
4112
+ chain_id: 1,
4113
+ created_at: "2023-10-18T15:04:02.482526Z",
4114
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
4115
+ data: {
4116
+ kind: "lido_withdrawal_requested",
4117
+ stake_in: {
4118
+ usd: "1568.54",
4119
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/stETH.svg",
4120
+ amount: "97180668792218669859",
4121
+ symbol: "STETH",
4122
+ address: "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84",
4123
+ decimals: "18",
4124
+ name: "Staked Eth"
5233
4125
  },
5234
- signIn: async () => {
5235
- return await this.messagingSystem.call(
5236
- "AuthenticationController:performSignIn"
5237
- );
4126
+ stake_out: {
4127
+ usd: "1576.73",
4128
+ image: "https://token.api.cx.metamask.io/assets/nativeCurrencyLogos/ethereum.svg",
4129
+ amount: "97180668792218669859",
4130
+ symbol: "ETH",
4131
+ address: "0x0000000000000000000000000000000000000000",
4132
+ decimals: "18",
4133
+ name: "Ethereum"
5238
4134
  },
5239
- signOut: async () => {
5240
- return this.messagingSystem.call(
5241
- "AuthenticationController:performSignOut"
5242
- );
4135
+ network_fee: {
4136
+ gas_price: "11658906980",
4137
+ native_token_price_in_usd: "1576.73"
5243
4138
  }
5244
- });
5245
- __privateAdd(this, _notificationServices, {
5246
- disableNotificationServices: async () => {
5247
- return await this.messagingSystem.call(
5248
- "NotificationServicesController:disableNotificationServices"
5249
- );
4139
+ },
4140
+ id: "29ddc718-78c6-5f91-936f-2bef13a605f0",
4141
+ trigger_id: "ef003925-3379-4ba7-9e2d-8218690cadc8",
4142
+ tx_hash: "0x58b5f82e084cb750ea174e02b20fbdfd2ba8d78053deac787f34fc38e5d427aa",
4143
+ unread: true
4144
+ };
4145
+ return mockNotification;
4146
+ }
4147
+ function createMockNotificationLidoWithdrawalCompleted() {
4148
+ const mockNotification = {
4149
+ type: "lido_withdrawal_completed" /* LIDO_WITHDRAWAL_COMPLETED */,
4150
+ block_number: 18378208,
4151
+ block_timestamp: "1697643851",
4152
+ chain_id: 1,
4153
+ created_at: "2023-10-18T16:35:03.147606Z",
4154
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
4155
+ data: {
4156
+ kind: "lido_withdrawal_completed",
4157
+ stake_in: {
4158
+ usd: "1570.23",
4159
+ image: "https://raw.githubusercontent.com/MetaMask/contract-metadata/master/images/stETH.svg",
4160
+ amount: "35081997661451346",
4161
+ symbol: "STETH",
4162
+ address: "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84",
4163
+ decimals: "18",
4164
+ name: "Staked Eth"
5250
4165
  },
5251
- selectIsNotificationServicesEnabled: async () => {
5252
- return this.messagingSystem.call(
5253
- "NotificationServicesController:selectIsNotificationServicesEnabled"
5254
- );
4166
+ stake_out: {
4167
+ usd: "1571.74",
4168
+ image: "https://token.api.cx.metamask.io/assets/nativeCurrencyLogos/ethereum.svg",
4169
+ amount: "35081997661451346",
4170
+ symbol: "ETH",
4171
+ address: "0x0000000000000000000000000000000000000000",
4172
+ decimals: "18",
4173
+ name: "Ethereum"
4174
+ },
4175
+ network_fee: {
4176
+ gas_price: "12699495150",
4177
+ native_token_price_in_usd: "1571.74"
5255
4178
  }
5256
- });
5257
- this.getMetaMetricsState = params.getMetaMetricsState;
5258
- __privateMethod(this, _registerMessageHandlers, registerMessageHandlers_fn).call(this);
5259
- }
5260
- async enableProfileSyncing() {
5261
- try {
5262
- __privateMethod(this, _setIsProfileSyncingUpdateLoading, setIsProfileSyncingUpdateLoading_fn).call(this, true);
5263
- const authEnabled = __privateGet(this, _auth).isAuthEnabled();
5264
- if (!authEnabled) {
5265
- await __privateGet(this, _auth).signIn();
4179
+ },
4180
+ id: "f4ef0b7f-5612-537f-9144-0b5c63ae5391",
4181
+ trigger_id: "d73df14d-ce73-4f38-bad3-ab028154042c",
4182
+ tx_hash: "0xe6d210d2e601ef3dd1075c48e71452cf35f2daae3886911e964e3babad8ac657",
4183
+ unread: true
4184
+ };
4185
+ return mockNotification;
4186
+ }
4187
+ function createMockNotificationLidoReadyToBeWithdrawn() {
4188
+ const mockNotification = {
4189
+ type: "lido_stake_ready_to_be_withdrawn" /* LIDO_STAKE_READY_TO_BE_WITHDRAWN */,
4190
+ block_number: 18378208,
4191
+ block_timestamp: "1697643851",
4192
+ chain_id: 1,
4193
+ created_at: "2023-10-18T16:35:03.147606Z",
4194
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300C",
4195
+ data: {
4196
+ kind: "lido_stake_ready_to_be_withdrawn",
4197
+ request_id: "123456789",
4198
+ staked_eth: {
4199
+ address: "0x881D40237659C251811CEC9c364ef91dC08D300F",
4200
+ symbol: "ETH",
4201
+ name: "Ethereum",
4202
+ amount: "2.5",
4203
+ decimals: "18",
4204
+ image: "https://token.api.cx.metamask.io/assets/nativeCurrencyLogos/ethereum.svg",
4205
+ usd: "10000.00"
5266
4206
  }
5267
- this.update((state) => {
5268
- state.isProfileSyncingEnabled = true;
5269
- });
5270
- __privateMethod(this, _setIsProfileSyncingUpdateLoading, setIsProfileSyncingUpdateLoading_fn).call(this, false);
5271
- } catch (e) {
5272
- __privateMethod(this, _setIsProfileSyncingUpdateLoading, setIsProfileSyncingUpdateLoading_fn).call(this, false);
5273
- const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
5274
- throw new Error(
5275
- `${controllerName} - failed to enable profile syncing - ${errorMessage}`
5276
- );
5277
- }
5278
- }
5279
- async setIsProfileSyncingEnabled(isProfileSyncingEnabled) {
5280
- this.update((state) => {
5281
- state.isProfileSyncingEnabled = isProfileSyncingEnabled;
5282
- });
5283
- }
5284
- async disableProfileSyncing() {
5285
- const isAlreadyDisabled = !this.state.isProfileSyncingEnabled;
5286
- if (isAlreadyDisabled) {
5287
- return;
5288
- }
5289
- try {
5290
- __privateMethod(this, _setIsProfileSyncingUpdateLoading, setIsProfileSyncingUpdateLoading_fn).call(this, true);
5291
- const isNotificationServicesEnabled = await __privateGet(this, _notificationServices).selectIsNotificationServicesEnabled();
5292
- if (isNotificationServicesEnabled) {
5293
- await __privateGet(this, _notificationServices).disableNotificationServices();
5294
- }
5295
- const isMetaMetricsParticipation = this.getMetaMetricsState();
5296
- if (!isMetaMetricsParticipation) {
5297
- this.messagingSystem.call("AuthenticationController:performSignOut");
5298
- }
5299
- __privateMethod(this, _setIsProfileSyncingUpdateLoading, setIsProfileSyncingUpdateLoading_fn).call(this, false);
5300
- this.update((state) => {
5301
- state.isProfileSyncingEnabled = false;
5302
- });
5303
- } catch (e) {
5304
- __privateMethod(this, _setIsProfileSyncingUpdateLoading, setIsProfileSyncingUpdateLoading_fn).call(this, false);
5305
- const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
5306
- throw new Error(
5307
- `${controllerName} - failed to disable profile syncing - ${errorMessage}`
5308
- );
5309
- }
5310
- }
5311
- /**
5312
- * Allows retrieval of stored data. Data stored is string formatted.
5313
- * Developers can extend the entry path and entry name through the `schema.ts` file.
5314
- *
5315
- * @param entryKey - entry key that matches schema
5316
- * @returns the decrypted string contents found from user storage (or null if not found)
5317
- */
5318
- async performGetStorage(entryKey) {
5319
- __privateMethod(this, _assertProfileSyncingEnabled, assertProfileSyncingEnabled_fn).call(this);
5320
- const { bearerToken, storageKey } = await __privateMethod(this, _getStorageKeyAndBearerToken, getStorageKeyAndBearerToken_fn).call(this);
5321
- const result = await getUserStorage({
5322
- entryKey,
5323
- bearerToken,
5324
- storageKey
5325
- });
5326
- return result;
5327
- }
5328
- /**
5329
- * Allows storage of user data. Data stored must be string formatted.
5330
- * Developers can extend the entry path and entry name through the `schema.ts` file.
5331
- *
5332
- * @param entryKey - entry key that matches schema
5333
- * @param value - The string data you want to store.
5334
- * @returns nothing. NOTE that an error is thrown if fails to store data.
5335
- */
5336
- async performSetStorage(entryKey, value) {
5337
- __privateMethod(this, _assertProfileSyncingEnabled, assertProfileSyncingEnabled_fn).call(this);
5338
- const { bearerToken, storageKey } = await __privateMethod(this, _getStorageKeyAndBearerToken, getStorageKeyAndBearerToken_fn).call(this);
5339
- await upsertUserStorage(value, {
5340
- entryKey,
5341
- bearerToken,
5342
- storageKey
5343
- });
5344
- }
5345
- /**
5346
- * Retrieves the storage key, for internal use only!
5347
- *
5348
- * @returns the storage key
5349
- */
5350
- async getStorageKey() {
5351
- __privateMethod(this, _assertProfileSyncingEnabled, assertProfileSyncingEnabled_fn).call(this);
5352
- const storageKey = await __privateMethod(this, _createStorageKey, createStorageKey_fn).call(this);
5353
- return storageKey;
5354
- }
5355
- };
5356
- _auth = new WeakMap();
5357
- _notificationServices = new WeakMap();
5358
- _registerMessageHandlers = new WeakSet();
5359
- registerMessageHandlers_fn = function() {
5360
- this.messagingSystem.registerActionHandler(
5361
- "UserStorageController:performGetStorage",
5362
- this.performGetStorage.bind(this)
5363
- );
5364
- this.messagingSystem.registerActionHandler(
5365
- "UserStorageController:performSetStorage",
5366
- this.performSetStorage.bind(this)
5367
- );
5368
- this.messagingSystem.registerActionHandler(
5369
- "UserStorageController:getStorageKey",
5370
- this.getStorageKey.bind(this)
5371
- );
5372
- this.messagingSystem.registerActionHandler(
5373
- "UserStorageController:enableProfileSyncing",
5374
- this.enableProfileSyncing.bind(this)
5375
- );
5376
- this.messagingSystem.registerActionHandler(
5377
- "UserStorageController:disableProfileSyncing",
5378
- this.disableProfileSyncing.bind(this)
5379
- );
5380
- };
5381
- _assertProfileSyncingEnabled = new WeakSet();
5382
- assertProfileSyncingEnabled_fn = function() {
5383
- if (!this.state.isProfileSyncingEnabled) {
5384
- throw new Error(
5385
- `${controllerName}: Unable to call method, user is not authenticated`
5386
- );
5387
- }
5388
- };
5389
- _getStorageKeyAndBearerToken = new WeakSet();
5390
- getStorageKeyAndBearerToken_fn = async function() {
5391
- const bearerToken = await __privateGet(this, _auth).getBearerToken();
5392
- if (!bearerToken) {
5393
- throw new Error("UserStorageController - unable to get bearer token");
5394
- }
5395
- const storageKey = await __privateMethod(this, _createStorageKey, createStorageKey_fn).call(this);
5396
- return { bearerToken, storageKey };
5397
- };
5398
- _createStorageKey = new WeakSet();
5399
- createStorageKey_fn = async function() {
5400
- const id = await __privateGet(this, _auth).getProfileId();
5401
- if (!id) {
5402
- throw new Error("UserStorageController - unable to create storage key");
5403
- }
5404
- const storageKeySignature = await __privateMethod(this, _snapSignMessage, snapSignMessage_fn).call(this, `metamask:${id}`);
5405
- const storageKey = createSHA256Hash(storageKeySignature);
5406
- return storageKey;
5407
- };
5408
- _snapSignMessage = new WeakSet();
5409
- snapSignMessage_fn = function(message) {
5410
- return this.messagingSystem.call(
5411
- "SnapController:handleRequest",
5412
- createSnapSignMessageRequest(message)
5413
- );
5414
- };
5415
- _setIsProfileSyncingUpdateLoading = new WeakSet();
5416
- setIsProfileSyncingUpdateLoading_fn = function(isProfileSyncingUpdateLoading) {
5417
- this.update((state) => {
5418
- state.isProfileSyncingUpdateLoading = isProfileSyncingUpdateLoading;
4207
+ },
4208
+ id: "f4ef0b7f-5612-537f-9144-0b5c63ae5391",
4209
+ trigger_id: "d73df14d-ce73-4f38-bad3-ab028154042c",
4210
+ tx_hash: "0xe6d210d2e601ef3dd1075c48e71452cf35f2daae3886911e964e3babad8ac657",
4211
+ unread: true
4212
+ };
4213
+ return mockNotification;
4214
+ }
4215
+ function createMockRawOnChainNotifications() {
4216
+ return [1, 2, 3].map((id) => {
4217
+ const notification = createMockNotificationEthSent();
4218
+ notification.id += `-${id}`;
4219
+ return notification;
5419
4220
  });
5420
- };
5421
-
5422
- // ../profile-sync-controller/src/controllers/user-storage/__fixtures__/index.ts
5423
- var fixtures_exports = {};
5424
- __export(fixtures_exports, {
5425
- MOCK_ENCRYPTED_STORAGE_DATA: () => MOCK_ENCRYPTED_STORAGE_DATA,
5426
- MOCK_STORAGE_DATA: () => MOCK_STORAGE_DATA,
5427
- MOCK_STORAGE_KEY: () => MOCK_STORAGE_KEY,
5428
- MOCK_STORAGE_KEY_SIGNATURE: () => MOCK_STORAGE_KEY_SIGNATURE,
5429
- MOCK_USER_STORAGE_NOTIFICATIONS_ENDPOINT: () => MOCK_USER_STORAGE_NOTIFICATIONS_ENDPOINT,
5430
- getMockUserStorageGetResponse: () => getMockUserStorageGetResponse,
5431
- getMockUserStoragePutResponse: () => getMockUserStoragePutResponse,
5432
- mockEndpointGetUserStorage: () => mockEndpointGetUserStorage,
5433
- mockEndpointUpsertUserStorage: () => mockEndpointUpsertUserStorage
5434
- });
5435
-
5436
- // ../profile-sync-controller/src/controllers/user-storage/__fixtures__/mockStorage.ts
5437
- var MOCK_STORAGE_KEY_SIGNATURE = "mockStorageKey";
5438
- var MOCK_STORAGE_KEY = createSHA256Hash(MOCK_STORAGE_KEY_SIGNATURE);
5439
- var MOCK_STORAGE_DATA = JSON.stringify({ hello: "world" });
5440
- var MOCK_ENCRYPTED_STORAGE_DATA = encryption_default2.encryptString(
5441
- MOCK_STORAGE_DATA,
5442
- MOCK_STORAGE_KEY
5443
- );
4221
+ }
5444
4222
 
5445
- // ../profile-sync-controller/src/controllers/user-storage/__fixtures__/mockResponses.ts
5446
- var MOCK_USER_STORAGE_NOTIFICATIONS_ENDPOINT = `${USER_STORAGE_ENDPOINT}${createEntryPath(
5447
- "notificationSettings",
5448
- MOCK_STORAGE_KEY
5449
- )}`;
5450
- var MOCK_GET_USER_STORAGE_RESPONSE = {
5451
- HashedKey: "HASHED_KEY",
5452
- Data: MOCK_ENCRYPTED_STORAGE_DATA
5453
- };
5454
- var getMockUserStorageGetResponse = () => {
4223
+ // src/NotificationServicesController/__fixtures__/mockResponses.ts
4224
+ var CONTENTFUL_RESPONSE = createMockFeatureAnnouncementAPIResult();
4225
+ var getMockFeatureAnnouncementResponse = () => {
5455
4226
  return {
5456
- url: MOCK_USER_STORAGE_NOTIFICATIONS_ENDPOINT,
4227
+ url: FEATURE_ANNOUNCEMENT_API,
5457
4228
  requestMethod: "GET",
5458
- response: MOCK_GET_USER_STORAGE_RESPONSE
4229
+ response: CONTENTFUL_RESPONSE
4230
+ };
4231
+ };
4232
+ var getMockBatchCreateTriggersResponse = () => {
4233
+ return {
4234
+ url: TRIGGER_API_BATCH_ENDPOINT,
4235
+ requestMethod: "POST",
4236
+ response: null
5459
4237
  };
5460
4238
  };
5461
- var getMockUserStoragePutResponse = () => {
4239
+ var getMockBatchDeleteTriggersResponse = () => {
5462
4240
  return {
5463
- url: MOCK_USER_STORAGE_NOTIFICATIONS_ENDPOINT,
5464
- requestMethod: "PUT",
4241
+ url: TRIGGER_API_BATCH_ENDPOINT,
4242
+ requestMethod: "DELETE",
4243
+ response: null
4244
+ };
4245
+ };
4246
+ var MOCK_RAW_ON_CHAIN_NOTIFICATIONS = createMockRawOnChainNotifications();
4247
+ var getMockListNotificationsResponse = () => {
4248
+ return {
4249
+ url: NOTIFICATION_API_LIST_ENDPOINT,
4250
+ requestMethod: "POST",
4251
+ response: MOCK_RAW_ON_CHAIN_NOTIFICATIONS
4252
+ };
4253
+ };
4254
+ var getMockMarkNotificationsAsReadResponse = () => {
4255
+ return {
4256
+ url: NOTIFICATION_API_MARK_ALL_AS_READ_ENDPOINT,
4257
+ requestMethod: "POST",
5465
4258
  response: null
5466
4259
  };
5467
4260
  };
5468
4261
 
5469
- // ../profile-sync-controller/src/controllers/user-storage/__fixtures__/mockServices.ts
4262
+ // src/NotificationServicesController/__fixtures__/mockServices.ts
5470
4263
  var import_nock = __toESM(require_nock());
5471
- var mockEndpointGetUserStorage = (mockReply) => {
5472
- const mockResponse = getMockUserStorageGetResponse();
5473
- const reply = mockReply ?? {
5474
- status: 200,
5475
- body: mockResponse.response
5476
- };
5477
- const mockEndpoint = (0, import_nock.default)(mockResponse.url).get("").reply(reply.status, reply.body);
4264
+ var mockFetchFeatureAnnouncementNotifications = (mockReply) => {
4265
+ const mockResponse = getMockFeatureAnnouncementResponse();
4266
+ const reply = mockReply ?? { status: 200, body: mockResponse.response };
4267
+ const mockEndpoint = (0, import_nock.default)(mockResponse.url).get("").query(true).reply(reply.status, reply.body);
5478
4268
  return mockEndpoint;
5479
4269
  };
5480
- var mockEndpointUpsertUserStorage = (mockReply) => {
5481
- const mockResponse = getMockUserStoragePutResponse();
5482
- const mockEndpoint = (0, import_nock.default)(mockResponse.url).put("").reply(mockReply?.status ?? 204);
4270
+ var mockBatchCreateTriggers = (mockReply) => {
4271
+ const mockResponse = getMockBatchCreateTriggersResponse();
4272
+ const reply = mockReply ?? { status: 204 };
4273
+ const mockEndpoint = (0, import_nock.default)(mockResponse.url).post("").reply(reply.status, reply.body);
4274
+ return mockEndpoint;
4275
+ };
4276
+ var mockBatchDeleteTriggers = (mockReply) => {
4277
+ const mockResponse = getMockBatchDeleteTriggersResponse();
4278
+ const reply = mockReply ?? { status: 204 };
4279
+ const mockEndpoint = (0, import_nock.default)(mockResponse.url).delete("").reply(reply.status, reply.body);
4280
+ return mockEndpoint;
4281
+ };
4282
+ var mockListNotifications = (mockReply) => {
4283
+ const mockResponse = getMockListNotificationsResponse();
4284
+ const reply = mockReply ?? { status: 200, body: mockResponse.response };
4285
+ const mockEndpoint = (0, import_nock.default)(mockResponse.url).post("").query(true).reply(reply.status, reply.body);
4286
+ return mockEndpoint;
4287
+ };
4288
+ var mockMarkNotificationsAsRead = (mockReply) => {
4289
+ const mockResponse = getMockMarkNotificationsAsReadResponse();
4290
+ const reply = mockReply ?? { status: 200 };
4291
+ const mockEndpoint = (0, import_nock.default)(mockResponse.url).post("").reply(reply.status, reply.body);
5483
4292
  return mockEndpoint;
5484
4293
  };
5485
-
5486
- // src/NotificationServicesController/services/onchain-notifications.ts
5487
- import log2 from "loglevel";
5488
- var TRIGGER_API = "https://trigger.api.cx.metamask.io";
5489
- var NOTIFICATION_API = "https://notification.api.cx.metamask.io";
5490
- var TRIGGER_API_BATCH_ENDPOINT = `${TRIGGER_API}/api/v1/triggers/batch`;
5491
- var NOTIFICATION_API_LIST_ENDPOINT = `${NOTIFICATION_API}/api/v1/notifications`;
5492
- var NOTIFICATION_API_LIST_ENDPOINT_PAGE_QUERY = (page) => `${NOTIFICATION_API_LIST_ENDPOINT}?page=${page}&per_page=100`;
5493
- var NOTIFICATION_API_MARK_ALL_AS_READ_ENDPOINT = `${NOTIFICATION_API}/api/v1/notifications/mark-as-read`;
5494
- async function createOnChainTriggers(userStorage, storageKey, bearerToken, triggers) {
5495
- const triggersToCreate = triggers.map((t) => ({
5496
- id: t.id,
5497
- token: user_storage_exports.createSHA256Hash(t.id + storageKey),
5498
- config: {
5499
- kind: t.kind,
5500
- // eslint-disable-next-line @typescript-eslint/naming-convention
5501
- chain_id: Number(t.chainId),
5502
- address: t.address
5503
- }
5504
- }));
5505
- if (triggersToCreate.length === 0) {
5506
- return;
5507
- }
5508
- const response = await makeApiCall(
5509
- bearerToken,
5510
- TRIGGER_API_BATCH_ENDPOINT,
5511
- "POST",
5512
- triggersToCreate
5513
- );
5514
- if (!response.ok) {
5515
- const errorData = await response.json().catch(() => void 0);
5516
- log2.error("Error creating triggers:", errorData);
5517
- throw new Error("OnChain Notifications - unable to create triggers");
5518
- }
5519
- for (const trigger of triggersToCreate) {
5520
- toggleUserStorageTriggerStatus(
5521
- userStorage,
5522
- trigger.config.address,
5523
- String(trigger.config.chain_id),
5524
- trigger.id,
5525
- true
5526
- );
5527
- }
5528
- }
5529
- async function deleteOnChainTriggers(userStorage, storageKey, bearerToken, uuids) {
5530
- const triggersToDelete = uuids.map((uuid) => ({
5531
- id: uuid,
5532
- token: user_storage_exports.createSHA256Hash(uuid + storageKey)
5533
- }));
5534
- try {
5535
- const response = await makeApiCall(
5536
- bearerToken,
5537
- TRIGGER_API_BATCH_ENDPOINT,
5538
- "DELETE",
5539
- triggersToDelete
5540
- );
5541
- if (!response.ok) {
5542
- throw new Error(
5543
- `Failed to delete on-chain notifications for uuids ${uuids.join(", ")}`
5544
- );
5545
- }
5546
- for (const uuid of uuids) {
5547
- for (const address in userStorage) {
5548
- if (address in userStorage) {
5549
- for (const chainId in userStorage[address]) {
5550
- if (userStorage?.[address]?.[chainId]?.[uuid]) {
5551
- delete userStorage[address][chainId][uuid];
5552
- }
5553
- }
5554
- }
5555
- }
5556
- }
5557
- const isEmpty = (obj = {}) => Object.keys(obj).length === 0;
5558
- for (const address in userStorage) {
5559
- if (address in userStorage) {
5560
- for (const chainId in userStorage[address]) {
5561
- if (isEmpty(userStorage?.[address]?.[chainId])) {
5562
- delete userStorage[address][chainId];
5563
- }
5564
- }
5565
- if (isEmpty(userStorage?.[address])) {
5566
- delete userStorage[address];
5567
- }
5568
- }
5569
- }
5570
- } catch (err) {
5571
- log2.error(
5572
- `Error deleting on-chain notifications for uuids ${uuids.join(", ")}:`,
5573
- err
5574
- );
5575
- throw err;
5576
- }
5577
- return userStorage;
5578
- }
5579
- async function getOnChainNotifications(userStorage, bearerToken) {
5580
- const triggerIds = traverseUserStorageTriggers(userStorage, {
5581
- mapTrigger: (t) => {
5582
- if (!t.enabled) {
5583
- return void 0;
5584
- }
5585
- return t.id;
5586
- }
5587
- });
5588
- if (triggerIds.length === 0) {
5589
- return [];
5590
- }
5591
- const onChainNotifications = [];
5592
- const PAGE_LIMIT = 2;
5593
- for (let page = 1; page <= PAGE_LIMIT; page++) {
5594
- try {
5595
- const response = await makeApiCall(
5596
- bearerToken,
5597
- NOTIFICATION_API_LIST_ENDPOINT_PAGE_QUERY(page),
5598
- "POST",
5599
- // eslint-disable-next-line @typescript-eslint/naming-convention
5600
- { trigger_ids: triggerIds }
5601
- );
5602
- const notifications = await response.json();
5603
- const transformedNotifications = notifications.map(
5604
- (n) => {
5605
- if (!n.data?.kind) {
5606
- return void 0;
5607
- }
5608
- return {
5609
- ...n,
5610
- type: n.data.kind
5611
- };
5612
- }
5613
- ).filter((n) => Boolean(n));
5614
- onChainNotifications.push(...transformedNotifications);
5615
- if (notifications.length < 100) {
5616
- page = PAGE_LIMIT + 1;
5617
- break;
5618
- }
5619
- } catch (err) {
5620
- log2.error(
5621
- `Error fetching on-chain notifications for trigger IDs ${triggerIds.join(
5622
- ", "
5623
- )}:`,
5624
- err
5625
- );
5626
- }
5627
- }
5628
- return onChainNotifications;
5629
- }
5630
- async function markNotificationsAsRead(bearerToken, notificationIds) {
5631
- if (notificationIds.length === 0) {
5632
- return;
5633
- }
5634
- try {
5635
- const response = await makeApiCall(
5636
- bearerToken,
5637
- NOTIFICATION_API_MARK_ALL_AS_READ_ENDPOINT,
5638
- "POST",
5639
- { ids: notificationIds }
5640
- );
5641
- if (response.status !== 200) {
5642
- const errorData = await response.json().catch(() => void 0);
5643
- throw new Error(
5644
- `Error marking notifications as read: ${errorData?.message}`
5645
- );
5646
- }
5647
- } catch (err) {
5648
- log2.error("Error marking notifications as read:", err);
5649
- throw err;
5650
- }
5651
- }
5652
4294
 
5653
4295
  export {
5654
4296
  require_nock,
5655
- TRIGGER_API,
5656
- NOTIFICATION_API,
5657
- TRIGGER_API_BATCH_ENDPOINT,
5658
- NOTIFICATION_API_LIST_ENDPOINT,
5659
- NOTIFICATION_API_LIST_ENDPOINT_PAGE_QUERY,
5660
- NOTIFICATION_API_MARK_ALL_AS_READ_ENDPOINT,
5661
- createOnChainTriggers,
5662
- deleteOnChainTriggers,
5663
- getOnChainNotifications,
5664
- markNotificationsAsRead
4297
+ fixtures_exports,
4298
+ NotificationServicesController_exports
5665
4299
  };
5666
- /*! Bundled license information:
5667
-
5668
- @noble/ciphers/esm/utils.js:
5669
- (*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) *)
5670
-
5671
- @noble/hashes/esm/utils.js:
5672
- (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
5673
- */
5674
- //# sourceMappingURL=chunk-IG3CMJBW.mjs.map
4300
+ //# sourceMappingURL=chunk-KTQP5UDT.mjs.map