@metamask/profile-sync-controller 29.0.0 → 30.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/dist/controllers/authentication/AuthenticationController.cjs +185 -90
  3. package/dist/controllers/authentication/AuthenticationController.cjs.map +1 -1
  4. package/dist/controllers/authentication/AuthenticationController.d.cts +22 -4
  5. package/dist/controllers/authentication/AuthenticationController.d.cts.map +1 -1
  6. package/dist/controllers/authentication/AuthenticationController.d.mts +22 -4
  7. package/dist/controllers/authentication/AuthenticationController.d.mts.map +1 -1
  8. package/dist/controllers/authentication/AuthenticationController.mjs +186 -91
  9. package/dist/controllers/authentication/AuthenticationController.mjs.map +1 -1
  10. package/dist/controllers/authentication/mocks/mockResponses.cjs +10 -1
  11. package/dist/controllers/authentication/mocks/mockResponses.cjs.map +1 -1
  12. package/dist/controllers/authentication/mocks/mockResponses.d.cts +11 -0
  13. package/dist/controllers/authentication/mocks/mockResponses.d.cts.map +1 -1
  14. package/dist/controllers/authentication/mocks/mockResponses.d.mts +11 -0
  15. package/dist/controllers/authentication/mocks/mockResponses.d.mts.map +1 -1
  16. package/dist/controllers/authentication/mocks/mockResponses.mjs +9 -1
  17. package/dist/controllers/authentication/mocks/mockResponses.mjs.map +1 -1
  18. package/dist/controllers/user-storage/UserStorageController.cjs +22 -23
  19. package/dist/controllers/user-storage/UserStorageController.cjs.map +1 -1
  20. package/dist/controllers/user-storage/UserStorageController.d.cts +2 -3
  21. package/dist/controllers/user-storage/UserStorageController.d.cts.map +1 -1
  22. package/dist/controllers/user-storage/UserStorageController.d.mts +2 -3
  23. package/dist/controllers/user-storage/UserStorageController.d.mts.map +1 -1
  24. package/dist/controllers/user-storage/UserStorageController.mjs +22 -23
  25. package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -1
  26. package/dist/sdk/authentication-jwt-bearer/flow-srp.cjs +3 -0
  27. package/dist/sdk/authentication-jwt-bearer/flow-srp.cjs.map +1 -1
  28. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.cts +2 -1
  29. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.cts.map +1 -1
  30. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.mts +2 -1
  31. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.mts.map +1 -1
  32. package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs +4 -1
  33. package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs.map +1 -1
  34. package/dist/sdk/authentication-jwt-bearer/services.cjs +44 -1
  35. package/dist/sdk/authentication-jwt-bearer/services.cjs.map +1 -1
  36. package/dist/sdk/authentication-jwt-bearer/services.d.cts +16 -1
  37. package/dist/sdk/authentication-jwt-bearer/services.d.cts.map +1 -1
  38. package/dist/sdk/authentication-jwt-bearer/services.d.mts +16 -1
  39. package/dist/sdk/authentication-jwt-bearer/services.d.mts.map +1 -1
  40. package/dist/sdk/authentication-jwt-bearer/services.mjs +42 -1
  41. package/dist/sdk/authentication-jwt-bearer/services.mjs.map +1 -1
  42. package/dist/sdk/authentication-jwt-bearer/types.cjs.map +1 -1
  43. package/dist/sdk/authentication-jwt-bearer/types.d.cts +20 -1
  44. package/dist/sdk/authentication-jwt-bearer/types.d.cts.map +1 -1
  45. package/dist/sdk/authentication-jwt-bearer/types.d.mts +20 -1
  46. package/dist/sdk/authentication-jwt-bearer/types.d.mts.map +1 -1
  47. package/dist/sdk/authentication-jwt-bearer/types.mjs.map +1 -1
  48. package/dist/sdk/authentication.cjs +4 -0
  49. package/dist/sdk/authentication.cjs.map +1 -1
  50. package/dist/sdk/authentication.d.cts +2 -1
  51. package/dist/sdk/authentication.d.cts.map +1 -1
  52. package/dist/sdk/authentication.d.mts +2 -1
  53. package/dist/sdk/authentication.d.mts.map +1 -1
  54. package/dist/sdk/authentication.mjs +4 -0
  55. package/dist/sdk/authentication.mjs.map +1 -1
  56. package/dist/sdk/constants.cjs +1 -0
  57. package/dist/sdk/constants.cjs.map +1 -1
  58. package/dist/sdk/constants.d.cts +1 -0
  59. package/dist/sdk/constants.d.cts.map +1 -1
  60. package/dist/sdk/constants.d.mts +1 -0
  61. package/dist/sdk/constants.d.mts.map +1 -1
  62. package/dist/sdk/constants.mjs +1 -0
  63. package/dist/sdk/constants.mjs.map +1 -1
  64. package/dist/sdk/errors.cjs +14 -1
  65. package/dist/sdk/errors.cjs.map +1 -1
  66. package/dist/sdk/errors.d.cts +9 -0
  67. package/dist/sdk/errors.d.cts.map +1 -1
  68. package/dist/sdk/errors.d.mts +9 -0
  69. package/dist/sdk/errors.d.mts.map +1 -1
  70. package/dist/sdk/errors.mjs +12 -0
  71. package/dist/sdk/errors.mjs.map +1 -1
  72. package/dist/sdk/mocks/auth.cjs +12 -1
  73. package/dist/sdk/mocks/auth.cjs.map +1 -1
  74. package/dist/sdk/mocks/auth.d.cts +11 -0
  75. package/dist/sdk/mocks/auth.d.cts.map +1 -1
  76. package/dist/sdk/mocks/auth.d.mts +11 -0
  77. package/dist/sdk/mocks/auth.d.mts.map +1 -1
  78. package/dist/sdk/mocks/auth.mjs +12 -1
  79. package/dist/sdk/mocks/auth.mjs.map +1 -1
  80. package/dist/shared/utils/entropy-source.cjs +37 -0
  81. package/dist/shared/utils/entropy-source.cjs.map +1 -0
  82. package/dist/shared/utils/entropy-source.d.cts +22 -0
  83. package/dist/shared/utils/entropy-source.d.cts.map +1 -0
  84. package/dist/shared/utils/entropy-source.d.mts +22 -0
  85. package/dist/shared/utils/entropy-source.d.mts.map +1 -0
  86. package/dist/shared/utils/entropy-source.mjs +32 -0
  87. package/dist/shared/utils/entropy-source.mjs.map +1 -0
  88. package/dist/shared/utils/hd-keyring-seed.cjs +49 -0
  89. package/dist/shared/utils/hd-keyring-seed.cjs.map +1 -0
  90. package/dist/shared/utils/hd-keyring-seed.d.cts +27 -0
  91. package/dist/shared/utils/hd-keyring-seed.d.cts.map +1 -0
  92. package/dist/shared/utils/hd-keyring-seed.d.mts +27 -0
  93. package/dist/shared/utils/hd-keyring-seed.d.mts.map +1 -0
  94. package/dist/shared/utils/hd-keyring-seed.mjs +45 -0
  95. package/dist/shared/utils/hd-keyring-seed.mjs.map +1 -0
  96. package/dist/shared/utils/message-signing.cjs +147 -0
  97. package/dist/shared/utils/message-signing.cjs.map +1 -0
  98. package/dist/shared/utils/message-signing.d.cts +73 -0
  99. package/dist/shared/utils/message-signing.d.cts.map +1 -0
  100. package/dist/shared/utils/message-signing.d.mts +73 -0
  101. package/dist/shared/utils/message-signing.d.mts.map +1 -0
  102. package/dist/shared/utils/message-signing.mjs +140 -0
  103. package/dist/shared/utils/message-signing.mjs.map +1 -0
  104. package/package.json +8 -8
  105. package/dist/controllers/authentication/auth-snap-requests.cjs +0 -60
  106. package/dist/controllers/authentication/auth-snap-requests.cjs.map +0 -1
  107. package/dist/controllers/authentication/auth-snap-requests.d.cts +0 -27
  108. package/dist/controllers/authentication/auth-snap-requests.d.cts.map +0 -1
  109. package/dist/controllers/authentication/auth-snap-requests.d.mts +0 -27
  110. package/dist/controllers/authentication/auth-snap-requests.d.mts.map +0 -1
  111. package/dist/controllers/authentication/auth-snap-requests.mjs +0 -54
  112. package/dist/controllers/authentication/auth-snap-requests.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [30.0.0]
11
+
12
+ ### Added
13
+
14
+ - **BREAKING:** Add social identifier pairing after SRP sign-in (`POST /api/v2/profile/pair/identifier`) ([#10128](https://github.com/MetaMask/core/pull/10128))
15
+ - Add `needsSocialPairing?: boolean` to state (defaults `true`; cleared on success or 409 Conflict; left `true` on other failures so the next `performSignIn` retries; cleared without an API call when the user never logged in with a social provider). If `authConnection` is set but the seedless vault is not written yet, the flag stays `true` so onboarding-in-flight sign-ins can retry. Optional in the type so partial-state selectors stay assignable; treat `undefined` as `true`.
16
+ - Add optional `isSocialPairingEnabled` config callback (defaults to `() => false`). When it returns `true`, Google/Apple/Telegram seedless users are paired after SRP login and profile pairing. Telegram never sends `email` (clients store a display name there).
17
+ - Use `SeedlessOnboardingController:getAccessToken` to fetch the social JWT (refreshed when expired).
18
+ - Add `pairSocialIdentifier` to `JwtBearerAuth` / `SRPJwtBearerAuth` and `PairConflictError` for 409 Conflict.
19
+
20
+ ### Changed
21
+
22
+ - **BREAKING:** Derive auth and user-storage message-signing keys natively via SIP-6 from HD keyring seeds instead of calling `@metamask/message-signing-snap` through `SnapController`. `AuthenticationController` and `UserStorageController` now require `KeyringController:withKeyringV2Unsafe` and no longer call `SnapController:handleRequest`. The message-signing snap remains for Portfolio / external origins ([#9824](https://github.com/MetaMask/core/pull/9824))
23
+ - Derive native SIP-6 keys with `@noble/hashes` HMAC-SHA-512 instead of Web Crypto, so auth works on React Native, whose SubtleCrypto cannot HMAC.
24
+ - Resolve HD entropy source IDs from `KeyringController` instead of the message-signing snap (`getBearerToken` primary ID, `performSignIn` SRP enumeration) ([#9794](https://github.com/MetaMask/core/pull/9794))
25
+ - Bump `@metamask/keyring-controller` from `^27.1.0` to `^27.1.1` ([#9791](https://github.com/MetaMask/core/pull/9791))
26
+ - Add `@metamask/key-tree` and `@noble/curves`; remove unused `@metamask/snaps-controllers`, `@metamask/snaps-sdk`, and `@metamask/snaps-utils` dependencies ([#9824](https://github.com/MetaMask/core/pull/9824))
27
+ - Bump `@metamask/utils` from `^11.11.0` to `^11.12.0` ([#10076](https://github.com/MetaMask/core/pull/10076))
28
+
10
29
  ## [29.0.0]
11
30
 
12
31
  ### Changed
@@ -905,7 +924,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
905
924
 
906
925
  - Initial release
907
926
 
908
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@29.0.0...HEAD
927
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@30.0.0...HEAD
928
+ [30.0.0]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@29.0.0...@metamask/profile-sync-controller@30.0.0
909
929
  [29.0.0]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@28.3.0...@metamask/profile-sync-controller@29.0.0
910
930
  [28.3.0]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@28.2.0...@metamask/profile-sync-controller@28.3.0
911
931
  [28.2.0]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@28.1.1...@metamask/profile-sync-controller@28.2.0
@@ -10,16 +10,19 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
11
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
12
  };
13
- var _AuthenticationController_instances, _AuthenticationController_metametrics, _AuthenticationController_auth, _AuthenticationController_config, _AuthenticationController_isUnlocked, _AuthenticationController_cachedPrimaryEntropySourceId, _AuthenticationController_profilePairingRequestEpoch, _AuthenticationController_keyringController, _AuthenticationController_getLoginResponseFromState, _AuthenticationController_setLoginResponseToState, _AuthenticationController_assertIsUnlocked, _AuthenticationController_getPrimaryEntropySourceId, _AuthenticationController_getLoginTag, _AuthenticationController_getLoginIdentifierType, _AuthenticationController_resolveSocialIdentifierType, _AuthenticationController_tryClearNeedsProfilePairing, _AuthenticationController_doPair, _AuthenticationController_pairSrpProfiles, _AuthenticationController_propagateCanonical, _AuthenticationController_getCanonicalProfileId, _AuthenticationController_invalidateSrpSession, _AuthenticationController_snapGetPublicKey, _AuthenticationController_snapGetAllPublicKeys, _AuthenticationController__snapSignMessageCache, _AuthenticationController_snapSignMessage;
13
+ var _AuthenticationController_instances, _AuthenticationController_metametrics, _AuthenticationController_auth, _AuthenticationController_config, _AuthenticationController_isUnlocked, _AuthenticationController_profilePairingRequestEpoch, _AuthenticationController_keyringController, _AuthenticationController_getLoginResponseFromState, _AuthenticationController_setLoginResponseToState, _AuthenticationController_assertIsUnlocked, _AuthenticationController_getHdKeyringEntropySourceIds, _AuthenticationController_getPrimaryEntropySourceId, _AuthenticationController_getLoginTag, _AuthenticationController_getLoginIdentifierType, _AuthenticationController_resolveSocialIdentifierType, _AuthenticationController_identifierTypeFromSeedlessState, _AuthenticationController_trySocialPairing, _AuthenticationController_clearNeedsSocialPairing, _AuthenticationController_tryClearNeedsProfilePairing, _AuthenticationController_doPair, _AuthenticationController_pairSrpProfiles, _AuthenticationController_propagateCanonical, _AuthenticationController_getCanonicalProfileId, _AuthenticationController_invalidateSrpSession, _AuthenticationController_getHdKeyringSeed, _AuthenticationController_getPublicKey, _AuthenticationController__signMessageCache, _AuthenticationController_scopedCacheKey, _AuthenticationController_signMessage;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.AuthenticationController = exports.defaultState = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
17
17
  const index_js_1 = require("../../sdk/index.cjs");
18
- const auth_snap_requests_js_1 = require("./auth-snap-requests.cjs");
18
+ const entropy_source_js_1 = require("../../shared/utils/entropy-source.cjs");
19
+ const hd_keyring_seed_js_1 = require("../../shared/utils/hd-keyring-seed.cjs");
20
+ const message_signing_js_1 = require("../../shared/utils/message-signing.cjs");
19
21
  const controllerName = 'AuthenticationController';
20
22
  exports.defaultState = {
21
23
  isSignedIn: false,
22
24
  needsProfilePairing: true,
25
+ needsSocialPairing: true,
23
26
  };
24
27
  const metadata = {
25
28
  isSignedIn: {
@@ -34,6 +37,12 @@ const metadata = {
34
37
  includeInDebugSnapshot: true,
35
38
  usedInUi: true,
36
39
  },
40
+ needsSocialPairing: {
41
+ includeInStateLogs: true,
42
+ persist: true,
43
+ includeInDebugSnapshot: true,
44
+ usedInUi: true,
45
+ },
37
46
  srpSessionData: {
38
47
  // Remove access token from state logs
39
48
  includeInStateLogs: (srpSessionData) => {
@@ -87,9 +96,9 @@ class AuthenticationController extends base_controller_1.BaseController {
87
96
  _AuthenticationController_auth.set(this, void 0);
88
97
  _AuthenticationController_config.set(this, {
89
98
  env: index_js_1.Env.PRD,
99
+ isSocialPairingEnabled: () => false,
90
100
  });
91
101
  _AuthenticationController_isUnlocked.set(this, false);
92
- _AuthenticationController_cachedPrimaryEntropySourceId.set(this, void 0);
93
102
  // Bumped by `requestProfilePairing`. `performSignIn` snapshots this
94
103
  // before its first await; if it changes mid-flight we must NOT clear
95
104
  // `needsProfilePairing` (the rearm signal wins).
@@ -106,13 +115,14 @@ class AuthenticationController extends base_controller_1.BaseController {
106
115
  });
107
116
  },
108
117
  });
109
- _AuthenticationController__snapSignMessageCache.set(this, {});
118
+ _AuthenticationController__signMessageCache.set(this, {});
110
119
  if (!metametrics) {
111
120
  throw new Error('`metametrics` field is required');
112
121
  }
113
122
  __classPrivateFieldSet(this, _AuthenticationController_config, {
114
123
  ...__classPrivateFieldGet(this, _AuthenticationController_config, "f"),
115
124
  ...config,
125
+ isSocialPairingEnabled: config?.isSocialPairingEnabled ?? __classPrivateFieldGet(this, _AuthenticationController_config, "f").isSocialPairingEnabled,
116
126
  }, "f");
117
127
  __classPrivateFieldSet(this, _AuthenticationController_metametrics, metametrics, "f");
118
128
  __classPrivateFieldSet(this, _AuthenticationController_auth, new index_js_1.JwtBearerAuth({
@@ -125,8 +135,8 @@ class AuthenticationController extends base_controller_1.BaseController {
125
135
  setLoginResponse: __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_setLoginResponseToState).bind(this),
126
136
  },
127
137
  signing: {
128
- getIdentifier: __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_snapGetPublicKey).bind(this),
129
- signMessage: __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_snapSignMessage).bind(this),
138
+ getIdentifier: __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPublicKey).bind(this),
139
+ signMessage: __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_signMessage).bind(this),
130
140
  },
131
141
  getLoginTag: __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getLoginTag).bind(this),
132
142
  getLoginIdentifierType: __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getLoginIdentifierType).bind(this),
@@ -138,15 +148,15 @@ class AuthenticationController extends base_controller_1.BaseController {
138
148
  async performSignIn() {
139
149
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, 'performSignIn');
140
150
  const epochAtStart = __classPrivateFieldGet(this, _AuthenticationController_profilePairingRequestEpoch, "f");
141
- const allPublicKeys = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_snapGetAllPublicKeys).call(this);
151
+ const entropySourceIds = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getHdKeyringEntropySourceIds).call(this);
142
152
  const accessTokens = [];
143
153
  // We iterate sequentially in order to be sure that the first entry
144
154
  // is the primary SRP LoginResponse.
145
- for (const [entropySourceId] of allPublicKeys) {
155
+ for (const entropySourceId of entropySourceIds) {
146
156
  const accessToken = await __classPrivateFieldGet(this, _AuthenticationController_auth, "f").getAccessToken(entropySourceId);
147
157
  accessTokens.push(accessToken);
148
158
  }
149
- if (allPublicKeys.length < 2) {
159
+ if (entropySourceIds.length < 2) {
150
160
  // Single-SRP wallet: nothing to pair.
151
161
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_tryClearNeedsProfilePairing).call(this, epochAtStart);
152
162
  }
@@ -159,6 +169,12 @@ class AuthenticationController extends base_controller_1.BaseController {
159
169
  // noop
160
170
  }
161
171
  }
172
+ try {
173
+ await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_trySocialPairing).call(this, accessTokens[0]);
174
+ }
175
+ catch {
176
+ // noop
177
+ }
162
178
  return accessTokens;
163
179
  }
164
180
  /**
@@ -175,7 +191,6 @@ class AuthenticationController extends base_controller_1.BaseController {
175
191
  }
176
192
  }
177
193
  performSignOut() {
178
- __classPrivateFieldSet(this, _AuthenticationController_cachedPrimaryEntropySourceId, undefined, "f");
179
194
  this.update((state) => {
180
195
  state.isSignedIn = false;
181
196
  state.srpSessionData = undefined;
@@ -194,7 +209,7 @@ class AuthenticationController extends base_controller_1.BaseController {
194
209
  */
195
210
  async getBearerToken(entropySourceId) {
196
211
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, 'getBearerToken');
197
- const resolvedId = entropySourceId ?? (await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this));
212
+ const resolvedId = entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
198
213
  return await __classPrivateFieldGet(this, _AuthenticationController_auth, "f").getAccessToken(resolvedId);
199
214
  }
200
215
  /**
@@ -212,7 +227,7 @@ class AuthenticationController extends base_controller_1.BaseController {
212
227
  */
213
228
  async getSessionProfile(entropySourceId) {
214
229
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, 'getSessionProfile');
215
- const resolvedId = entropySourceId ?? (await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this));
230
+ const resolvedId = entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
216
231
  return await __classPrivateFieldGet(this, _AuthenticationController_auth, "f").getUserProfile(resolvedId);
217
232
  }
218
233
  /**
@@ -233,10 +248,10 @@ class AuthenticationController extends base_controller_1.BaseController {
233
248
  */
234
249
  async refreshCanonicalProfileId() {
235
250
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, 'refreshCanonicalProfileId');
236
- const primaryEntropySourceId = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
251
+ const primaryEntropySourceId = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
237
252
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_invalidateSrpSession).call(this, primaryEntropySourceId);
238
253
  await __classPrivateFieldGet(this, _AuthenticationController_auth, "f").getAccessToken(primaryEntropySourceId);
239
- const canonical = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getCanonicalProfileId).call(this);
254
+ const canonical = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getCanonicalProfileId).call(this);
240
255
  if (!canonical) {
241
256
  throw new Error('refreshCanonicalProfileId - Unable to resolve canonical profile ID');
242
257
  }
@@ -245,7 +260,7 @@ class AuthenticationController extends base_controller_1.BaseController {
245
260
  }
246
261
  async getUserProfileLineage(entropySourceId) {
247
262
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, 'getUserProfileLineage');
248
- const resolvedId = entropySourceId ?? (await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this));
263
+ const resolvedId = entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
249
264
  return await __classPrivateFieldGet(this, _AuthenticationController_auth, "f").getUserProfileLineage(resolvedId);
250
265
  }
251
266
  /**
@@ -261,7 +276,7 @@ class AuthenticationController extends base_controller_1.BaseController {
261
276
  */
262
277
  async getCustomerServiceToken(entropySourceId) {
263
278
  __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, 'getCustomerServiceToken');
264
- const resolvedId = entropySourceId ?? (await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this));
279
+ const resolvedId = entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
265
280
  return await __classPrivateFieldGet(this, _AuthenticationController_auth, "f").getCustomerServiceToken(resolvedId);
266
281
  }
267
282
  isSignedIn() {
@@ -269,14 +284,14 @@ class AuthenticationController extends base_controller_1.BaseController {
269
284
  }
270
285
  }
271
286
  exports.AuthenticationController = AuthenticationController;
272
- _AuthenticationController_metametrics = new WeakMap(), _AuthenticationController_auth = new WeakMap(), _AuthenticationController_config = new WeakMap(), _AuthenticationController_isUnlocked = new WeakMap(), _AuthenticationController_cachedPrimaryEntropySourceId = new WeakMap(), _AuthenticationController_profilePairingRequestEpoch = new WeakMap(), _AuthenticationController_keyringController = new WeakMap(), _AuthenticationController__snapSignMessageCache = new WeakMap(), _AuthenticationController_instances = new WeakSet(), _AuthenticationController_getLoginResponseFromState = async function _AuthenticationController_getLoginResponseFromState(entropySourceId) {
273
- const resolvedId = entropySourceId ?? (await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this));
287
+ _AuthenticationController_metametrics = new WeakMap(), _AuthenticationController_auth = new WeakMap(), _AuthenticationController_config = new WeakMap(), _AuthenticationController_isUnlocked = new WeakMap(), _AuthenticationController_profilePairingRequestEpoch = new WeakMap(), _AuthenticationController_keyringController = new WeakMap(), _AuthenticationController__signMessageCache = new WeakMap(), _AuthenticationController_instances = new WeakSet(), _AuthenticationController_getLoginResponseFromState = async function _AuthenticationController_getLoginResponseFromState(entropySourceId) {
288
+ const resolvedId = entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
274
289
  if (!this.state.srpSessionData?.[resolvedId]) {
275
290
  return null;
276
291
  }
277
292
  return this.state.srpSessionData[resolvedId];
278
293
  }, _AuthenticationController_setLoginResponseToState = async function _AuthenticationController_setLoginResponseToState(loginResponse, entropySourceId) {
279
- const resolvedId = entropySourceId ?? (await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this));
294
+ const resolvedId = entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
280
295
  const metaMetricsId = await __classPrivateFieldGet(this, _AuthenticationController_metametrics, "f").getMetaMetricsId();
281
296
  this.update((state) => {
282
297
  state.isSignedIn = true;
@@ -295,20 +310,12 @@ _AuthenticationController_metametrics = new WeakMap(), _AuthenticationController
295
310
  if (!__classPrivateFieldGet(this, _AuthenticationController_isUnlocked, "f")) {
296
311
  throw new Error(`${methodName} - unable to proceed, wallet is locked`);
297
312
  }
298
- }, _AuthenticationController_getPrimaryEntropySourceId = async function _AuthenticationController_getPrimaryEntropySourceId() {
299
- if (__classPrivateFieldGet(this, _AuthenticationController_cachedPrimaryEntropySourceId, "f")) {
300
- return __classPrivateFieldGet(this, _AuthenticationController_cachedPrimaryEntropySourceId, "f");
301
- }
302
- const allPublicKeys = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_snapGetAllPublicKeys).call(this);
303
- if (allPublicKeys.length === 0) {
304
- throw new Error('#getPrimaryEntropySourceId - No entropy sources found from snap');
305
- }
306
- const primaryId = allPublicKeys[0][0];
307
- if (!primaryId) {
308
- throw new Error('#getPrimaryEntropySourceId - Primary entropy source ID is undefined');
309
- }
310
- __classPrivateFieldSet(this, _AuthenticationController_cachedPrimaryEntropySourceId, primaryId, "f");
311
- return __classPrivateFieldGet(this, _AuthenticationController_cachedPrimaryEntropySourceId, "f");
313
+ }, _AuthenticationController_getHdKeyringEntropySourceIds = function _AuthenticationController_getHdKeyringEntropySourceIds() {
314
+ const { keyrings } = this.messenger.call('KeyringController:getState');
315
+ return (0, entropy_source_js_1.getHdKeyringEntropySourceIds)(keyrings);
316
+ }, _AuthenticationController_getPrimaryEntropySourceId = function _AuthenticationController_getPrimaryEntropySourceId() {
317
+ const { keyrings } = this.messenger.call('KeyringController:getState');
318
+ return (0, entropy_source_js_1.getPrimaryHdKeyringEntropySourceId)(keyrings);
312
319
  }, _AuthenticationController_getLoginTag =
313
320
  /**
314
321
  * Resolves the SRP login tag for `raw_message`.
@@ -320,7 +327,7 @@ _AuthenticationController_metametrics = new WeakMap(), _AuthenticationController
320
327
  * @returns The login tag to append to the signed message.
321
328
  */
322
329
  async function _AuthenticationController_getLoginTag(entropySourceId) {
323
- const primaryEntropySourceId = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
330
+ const primaryEntropySourceId = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
324
331
  const resolvedId = entropySourceId ?? primaryEntropySourceId;
325
332
  return resolvedId === primaryEntropySourceId ? 'primary' : 'secondary';
326
333
  }, _AuthenticationController_getLoginIdentifierType =
@@ -343,7 +350,7 @@ async function _AuthenticationController_getLoginTag(entropySourceId) {
343
350
  * @returns The login identifier type.
344
351
  */
345
352
  async function _AuthenticationController_getLoginIdentifierType(entropySourceId) {
346
- const primaryEntropySourceId = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
353
+ const primaryEntropySourceId = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
347
354
  const resolvedId = entropySourceId ?? primaryEntropySourceId;
348
355
  // Social vault authConnection is only associated with the primary source.
349
356
  if (resolvedId !== primaryEntropySourceId) {
@@ -352,26 +359,118 @@ async function _AuthenticationController_getLoginIdentifierType(entropySourceId)
352
359
  return __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_resolveSocialIdentifierType).call(this);
353
360
  }, _AuthenticationController_resolveSocialIdentifierType = function _AuthenticationController_resolveSocialIdentifierType() {
354
361
  try {
355
- const { vault, authConnection } = this.messenger.call('SeedlessOnboardingController:getState');
356
- if (vault === null || vault === undefined) {
362
+ return __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_identifierTypeFromSeedlessState).call(this, this.messenger.call('SeedlessOnboardingController:getState'));
363
+ }
364
+ catch {
365
+ return 'SRP';
366
+ }
367
+ }, _AuthenticationController_identifierTypeFromSeedlessState = function _AuthenticationController_identifierTypeFromSeedlessState(state) {
368
+ if (state.vault === null || state.vault === undefined) {
369
+ return 'SRP';
370
+ }
371
+ // Match provider strings from SeedlessOnboarding state rather than
372
+ // importing AuthConnection — a value import would load that package
373
+ // (and its heavy deps) whenever this controller is imported.
374
+ switch (state.authConnection) {
375
+ case 'google':
376
+ return 'GOOGLE';
377
+ case 'apple':
378
+ return 'APPLE';
379
+ case 'telegram':
380
+ return 'TELEGRAM';
381
+ default:
357
382
  return 'SRP';
383
+ }
384
+ }, _AuthenticationController_trySocialPairing =
385
+ /**
386
+ * Attaches a Google/Apple/Telegram social identifier to the primary SRP
387
+ * profile via `POST /api/v2/profile/pair/identifier`.
388
+ *
389
+ * Runs only when `isSocialPairingEnabled()` is true and
390
+ * `needsSocialPairing` is not `false` (`undefined` is treated as true).
391
+ * No social provider (`authConnection` unset) → clear the flag (nothing
392
+ * to pair). Social provider set but vault missing → skip (onboarding
393
+ * still in flight). Google without email → skip (API requires it).
394
+ * Telegram never sends `email` (the field holds a display name, not an
395
+ * address). Missing social JWT → skip. 409 Conflict → clear the flag
396
+ * (identifier already owned; retry is pointless). Other errors
397
+ * propagate so the caller can swallow them and leave the flag set for
398
+ * retry.
399
+ *
400
+ * @param primaryAccessToken - Primary SRP OIDC access token used as the
401
+ * Bearer credential. The profile associated with this JWT becomes the
402
+ * canonical owner of the social identifier.
403
+ */
404
+ async function _AuthenticationController_trySocialPairing(primaryAccessToken) {
405
+ if (!__classPrivateFieldGet(this, _AuthenticationController_config, "f").isSocialPairingEnabled() ||
406
+ this.state.needsSocialPairing === false ||
407
+ !primaryAccessToken) {
408
+ return;
409
+ }
410
+ let seedlessState;
411
+ try {
412
+ seedlessState = this.messenger.call('SeedlessOnboardingController:getState');
413
+ }
414
+ catch {
415
+ // Controller missing or getState failed — retry next performSignIn.
416
+ return;
417
+ }
418
+ // `SRP` here does not describe the vault: it is the mapping's "no social
419
+ // identity" result, returned when there is no seedless vault or the
420
+ // provider is unrecognised. In both cases there is nothing to pair.
421
+ const identifierType = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_identifierTypeFromSeedlessState).call(this, seedlessState);
422
+ if (identifierType === 'SRP') {
423
+ const { vault, authConnection } = seedlessState;
424
+ // Vault not written yet but a social provider is already known —
425
+ // onboarding is still in flight. Do not clear; retry next sign-in.
426
+ if ((vault === null || vault === undefined) && Boolean(authConnection)) {
427
+ return;
358
428
  }
359
- // Match provider strings from SeedlessOnboarding state rather than
360
- // importing AuthConnection — a value import would load that package
361
- // (and its heavy deps) whenever this controller is imported.
362
- switch (authConnection) {
363
- case 'google':
364
- return 'GOOGLE';
365
- case 'apple':
366
- return 'APPLE';
367
- case 'telegram':
368
- return 'TELEGRAM';
369
- default:
370
- return 'SRP';
429
+ __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_clearNeedsSocialPairing).call(this);
430
+ return;
431
+ }
432
+ // Email policy follows the API contract: GOOGLE requires `email` (400
433
+ // without it), APPLE accepts it optionally, TELEGRAM must not send it
434
+ // (clients store a display name in `socialLoginEmail` for Telegram).
435
+ // Clients request the `email` scope for Google, so a missing value is a
436
+ // defensive case rather than an expected one; returning here leaves
437
+ // `needsSocialPairing` set so the next sign-in retries instead of
438
+ // sending a request that would fail.
439
+ const { socialLoginEmail } = seedlessState;
440
+ let email;
441
+ if (identifierType === 'GOOGLE') {
442
+ if (!socialLoginEmail) {
443
+ return;
371
444
  }
445
+ email = socialLoginEmail;
372
446
  }
373
- catch {
374
- return 'SRP';
447
+ else if (identifierType === 'APPLE') {
448
+ email = socialLoginEmail;
449
+ }
450
+ const socialJwt = await this.messenger.call('SeedlessOnboardingController:getAccessToken');
451
+ if (socialJwt === undefined || socialJwt === '') {
452
+ return;
453
+ }
454
+ try {
455
+ await __classPrivateFieldGet(this, _AuthenticationController_auth, "f").pairSocialIdentifier({
456
+ identifierType,
457
+ socialJwt,
458
+ ...(email ? { email } : {}),
459
+ }, primaryAccessToken);
460
+ __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_clearNeedsSocialPairing).call(this);
461
+ }
462
+ catch (error) {
463
+ if (error instanceof index_js_1.PairConflictError) {
464
+ __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_clearNeedsSocialPairing).call(this);
465
+ return;
466
+ }
467
+ throw error;
468
+ }
469
+ }, _AuthenticationController_clearNeedsSocialPairing = function _AuthenticationController_clearNeedsSocialPairing() {
470
+ if (this.state.needsSocialPairing !== false) {
471
+ this.update((state) => {
472
+ state.needsSocialPairing = false;
473
+ });
375
474
  }
376
475
  }, _AuthenticationController_tryClearNeedsProfilePairing = function _AuthenticationController_tryClearNeedsProfilePairing(epochAtStart) {
377
476
  if (__classPrivateFieldGet(this, _AuthenticationController_profilePairingRequestEpoch, "f") !== epochAtStart) {
@@ -395,9 +494,9 @@ async function _AuthenticationController_getLoginIdentifierType(entropySourceId)
395
494
  * pair API call was in-flight.
396
495
  */
397
496
  async function _AuthenticationController_doPair(accessTokens, epochAtStart) {
398
- const previousCanonical = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getCanonicalProfileId).call(this);
497
+ const previousCanonical = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getCanonicalProfileId).call(this);
399
498
  const profileAliases = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_pairSrpProfiles).call(this, accessTokens);
400
- const newCanonical = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getCanonicalProfileId).call(this);
499
+ const newCanonical = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getCanonicalProfileId).call(this);
401
500
  // If somehow we cannot compute the new canonical profile ID after pairing,
402
501
  // we just return now and do not update the `needsProfilePairing` flag.
403
502
  if (!newCanonical) {
@@ -433,18 +532,8 @@ async function _AuthenticationController_doPair(accessTokens, epochAtStart) {
433
532
  }
434
533
  }
435
534
  });
436
- }, _AuthenticationController_getCanonicalProfileId =
437
- /**
438
- * Returns the canonical profile id from the primary SRP's cached session.
439
- * Returns `null` when no session exists yet for the primary SRP.
440
- *
441
- * Always reads from the primary SRP because the canonical is shared across
442
- * all paired SRPs after `#propagateCanonical`.
443
- *
444
- * @returns The canonical profile id, or `null` if unavailable.
445
- */
446
- async function _AuthenticationController_getCanonicalProfileId() {
447
- const primaryEntropySourceId = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
535
+ }, _AuthenticationController_getCanonicalProfileId = function _AuthenticationController_getCanonicalProfileId() {
536
+ const primaryEntropySourceId = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
448
537
  return (this.state.srpSessionData?.[primaryEntropySourceId]?.profile
449
538
  ?.canonicalProfileId ?? null);
450
539
  }, _AuthenticationController_invalidateSrpSession = function _AuthenticationController_invalidateSrpSession(entropySourceId) {
@@ -457,45 +546,51 @@ async function _AuthenticationController_getCanonicalProfileId() {
457
546
  entry.profile.canonicalProfileId = '';
458
547
  }
459
548
  });
460
- }, _AuthenticationController_snapGetPublicKey =
549
+ }, _AuthenticationController_getHdKeyringSeed =
461
550
  /**
462
- * Returns the auth snap public key.
551
+ * Reads the BIP-39 seed for an HD entropy source from KeyringController.
463
552
  *
464
- * @param entropySourceId - The entropy source ID used to derive the key,
465
- * when multiple sources are available (Multi-SRP).
466
- * @returns The snap public key.
553
+ * @param entropySourceId - Entropy source ID. Defaults to the primary HD
554
+ * keyring.
555
+ * @returns The HD keyring seed.
467
556
  */
468
- async function _AuthenticationController_snapGetPublicKey(entropySourceId) {
469
- __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, '#snapGetPublicKey');
470
- const result = (await this.messenger.call('SnapController:handleRequest', (0, auth_snap_requests_js_1.createSnapPublicKeyRequest)(entropySourceId)));
471
- return result;
472
- }, _AuthenticationController_snapGetAllPublicKeys =
557
+ async function _AuthenticationController_getHdKeyringSeed(entropySourceId) {
558
+ const resolvedId = entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this);
559
+ return (0, hd_keyring_seed_js_1.getHdKeyringSeed)(this.messenger, resolvedId);
560
+ }, _AuthenticationController_getPublicKey =
473
561
  /**
474
- * Returns a mapping of entropy source IDs to auth snap public keys.
562
+ * Returns the message-signing public key via native SIP-6 derivation
563
+ * (same key as `@metamask/message-signing-snap` with empty salt).
475
564
  *
476
- * @returns A mapping of entropy source IDs to public keys.
565
+ * @param entropySourceId - The entropy source ID used to derive the key,
566
+ * when multiple sources are available (Multi-SRP).
567
+ * @returns The public key hex.
477
568
  */
478
- async function _AuthenticationController_snapGetAllPublicKeys() {
479
- __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, '#snapGetAllPublicKeys');
480
- const result = (await this.messenger.call('SnapController:handleRequest', (0, auth_snap_requests_js_1.createSnapAllPublicKeysRequest)()));
481
- return result;
482
- }, _AuthenticationController_snapSignMessage =
569
+ async function _AuthenticationController_getPublicKey(entropySourceId) {
570
+ __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, '#getPublicKey');
571
+ const seed = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getHdKeyringSeed).call(this, entropySourceId);
572
+ return (0, message_signing_js_1.getMessageSigningPublicKey)(seed);
573
+ }, _AuthenticationController_scopedCacheKey = function _AuthenticationController_scopedCacheKey(message, entropySourceId) {
574
+ return `${entropySourceId ?? __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getPrimaryEntropySourceId).call(this)}:${message}`;
575
+ }, _AuthenticationController_signMessage =
483
576
  /**
484
- * Signs a specific message using an underlying auth snap.
577
+ * Signs a `metamask:…` message with the native SIP-6 message-signing key.
485
578
  *
486
579
  * @param message - A specific tagged message to sign.
487
580
  * @param entropySourceId - The entropy source ID used to derive the key,
488
581
  * when multiple sources are available (Multi-SRP).
489
- * @returns A Signature created by the snap.
582
+ * @returns Compact secp256k1 signature hex.
490
583
  */
491
- async function _AuthenticationController_snapSignMessage(message, entropySourceId) {
584
+ async function _AuthenticationController_signMessage(message, entropySourceId) {
492
585
  (0, index_js_1.assertMessageStartsWithMetamask)(message);
493
- if (__classPrivateFieldGet(this, _AuthenticationController__snapSignMessageCache, "f")[message]) {
494
- return __classPrivateFieldGet(this, _AuthenticationController__snapSignMessageCache, "f")[message];
586
+ __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, '#signMessage');
587
+ const cacheKey = __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_scopedCacheKey).call(this, message, entropySourceId);
588
+ if (__classPrivateFieldGet(this, _AuthenticationController__signMessageCache, "f")[cacheKey]) {
589
+ return __classPrivateFieldGet(this, _AuthenticationController__signMessageCache, "f")[cacheKey];
495
590
  }
496
- __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_assertIsUnlocked).call(this, '#snapSignMessage');
497
- const result = (await this.messenger.call('SnapController:handleRequest', (0, auth_snap_requests_js_1.createSnapSignMessageRequest)(message, entropySourceId)));
498
- __classPrivateFieldGet(this, _AuthenticationController__snapSignMessageCache, "f")[message] = result;
591
+ const seed = await __classPrivateFieldGet(this, _AuthenticationController_instances, "m", _AuthenticationController_getHdKeyringSeed).call(this, entropySourceId);
592
+ const result = await (0, message_signing_js_1.signMessageWithMessageSigningKey)(message, seed);
593
+ __classPrivateFieldGet(this, _AuthenticationController__signMessageCache, "f")[cacheKey] = result;
499
594
  return result;
500
595
  };
501
596
  //# sourceMappingURL=AuthenticationController.cjs.map