@metamask-previews/kyc-controller 0.0.0-preview-8bfa290fb → 0.0.0-preview-ec24abb79

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 (52) hide show
  1. package/CHANGELOG.md +0 -6
  2. package/dist/KycController.cjs +17 -31
  3. package/dist/KycController.cjs.map +1 -1
  4. package/dist/KycController.d.cts +3 -3
  5. package/dist/KycController.d.cts.map +1 -1
  6. package/dist/KycController.d.mts +3 -3
  7. package/dist/KycController.d.mts.map +1 -1
  8. package/dist/KycController.mjs +17 -31
  9. package/dist/KycController.mjs.map +1 -1
  10. package/dist/KycService-method-action-types.cjs.map +1 -1
  11. package/dist/KycService-method-action-types.d.cts +6 -23
  12. package/dist/KycService-method-action-types.d.cts.map +1 -1
  13. package/dist/KycService-method-action-types.d.mts +6 -23
  14. package/dist/KycService-method-action-types.d.mts.map +1 -1
  15. package/dist/KycService-method-action-types.mjs.map +1 -1
  16. package/dist/KycService.cjs +118 -91
  17. package/dist/KycService.cjs.map +1 -1
  18. package/dist/KycService.d.cts +12 -38
  19. package/dist/KycService.d.cts.map +1 -1
  20. package/dist/KycService.d.mts +12 -38
  21. package/dist/KycService.d.mts.map +1 -1
  22. package/dist/KycService.mjs +118 -91
  23. package/dist/KycService.mjs.map +1 -1
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +3 -3
  26. package/dist/index.d.cts.map +1 -1
  27. package/dist/index.d.mts +3 -3
  28. package/dist/index.d.mts.map +1 -1
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/types.cjs.map +1 -1
  31. package/dist/types.d.cts +6 -15
  32. package/dist/types.d.cts.map +1 -1
  33. package/dist/types.d.mts +6 -15
  34. package/dist/types.d.mts.map +1 -1
  35. package/dist/types.mjs.map +1 -1
  36. package/dist/ukyc/wrapEncryptionKey.cjs +9 -4
  37. package/dist/ukyc/wrapEncryptionKey.cjs.map +1 -1
  38. package/dist/ukyc/wrapEncryptionKey.d.cts +10 -8
  39. package/dist/ukyc/wrapEncryptionKey.d.cts.map +1 -1
  40. package/dist/ukyc/wrapEncryptionKey.d.mts +10 -8
  41. package/dist/ukyc/wrapEncryptionKey.d.mts.map +1 -1
  42. package/dist/ukyc/wrapEncryptionKey.mjs +9 -4
  43. package/dist/ukyc/wrapEncryptionKey.mjs.map +1 -1
  44. package/package.json +2 -2
  45. package/dist/logger.cjs +0 -9
  46. package/dist/logger.cjs.map +0 -1
  47. package/dist/logger.d.cts +0 -6
  48. package/dist/logger.d.cts.map +0 -1
  49. package/dist/logger.d.mts +0 -6
  50. package/dist/logger.d.mts.map +0 -1
  51. package/dist/logger.mjs +0 -6
  52. package/dist/logger.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -30,8 +30,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
30
30
 
31
31
  ### Changed
32
32
 
33
- - Add `KycService.fetchDisclaimersCatalog` / `KycService:fetchDisclaimersCatalog` (`GET /disclaimers?country=`, ISO 3166-1 alpha-3) for the pre-session idOS + KYC-provider catalog, plus the `KycDisclaimersCatalog` type (no `credentialReusabilityConsentGiven`). `fetchSessionDisclaimers` remains session-scoped (`GET /sessions/{sessionId}/disclaimers` → `KycSessionDisclaimers`). ([#10011](https://github.com/MetaMask/core/pull/10011))
34
- - **BREAKING:** Rename `KycService.fetchDisclaimers` / `KycService:fetchDisclaimers` / `KycServiceFetchDisclaimersAction` to `fetchVendorDisclaimers` / `KycService:fetchVendorDisclaimers` / `KycServiceFetchVendorDisclaimersAction`. ([#10011](https://github.com/MetaMask/core/pull/10011))
35
33
  - **BREAKING:** Rename `fractalEncryptionBaseUrl` to `idosEnclaveBaseUrl`, `KycService.fetchJwks` / `KycService:fetchJwks` / `KycServiceFetchJwksAction` to `fetchIdosEnclaveJwks` / `KycService:fetchIdosEnclaveJwks` / `KycServiceFetchIdosEnclaveJwksAction`, and related Fractal encryption naming to idOS enclave. ([#10008](https://github.com/MetaMask/core/pull/10008))
36
34
  - **BREAKING:** Verify `encryptionDataKey` against idOS enclave JWKS (`KycService:fetchIdosEnclaveJwks` / `idosEnclaveBaseUrl`) and `ukycCapabilityToken` against idOS relay JWKS (`KycService:fetchIdosRelayJwks` / `idosRelayBaseUrl`) when wrapping UKYC authorizations, instead of validating both schemas against Fractal. Hosts must supply `idosRelayBaseUrl` on `KycService` construction (same class of requirement as `idosEnclaveBaseUrl`). ([#10008](https://github.com/MetaMask/core/pull/10008))
37
35
  - **BREAKING:** Require `sessionClientPublicKey` (unpadded base64url X25519 public key) and `residenceCountry` (ISO 3166-1 alpha-3) on `KycService.createUkycSession` (`POST /sessions`). The controller generates the per-session keypair before creating the session and uses the private half to wrap authorizations; residence country is taken from the resolved geo country. ([#9993](https://github.com/MetaMask/core/pull/9993))
@@ -42,13 +40,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
42
40
  - **BREAKING:** Require `sumsubTncSigned` and `idosTncSigned` on `acceptTermsAndStartSession` for every vendor, so callers explicitly declare T&C2 acceptance. Zero-argument calls and omitted flags fail instead of defaulting to `true`. ([#9908](https://github.com/MetaMask/core/pull/9908))
43
41
  - Rename `CreateUkycSessionParams.vendorId` to `vendor` for consistency with other service methods. ([#9908](https://github.com/MetaMask/core/pull/9908))
44
42
  - Bump `@metamask/base-data-service` from `^0.1.3` to `^1.0.0` ([#9972](https://github.com/MetaMask/core/pull/9972))
45
- - Replace `KycController` `console.error` tracing with the `@metamask/utils` debug logger (`createProjectLogger` / `createModuleLogger`), so flow diagnostics are opt-in via `DEBUG=kyc-controller*` instead of always printing to the console. ([#10054](https://github.com/MetaMask/core/pull/10054))
46
- - Bump `@metamask/utils` from `^11.11.0` to `^11.12.0` ([#10076](https://github.com/MetaMask/core/pull/10076))
47
43
 
48
44
  ### Fixed
49
45
 
50
- - Stop routing `KycService` write endpoints through the query cache. Every `POST` (`createSession`, `checkKycRequired`, `createVendorCustomer`, `submitVendorDisclaimers`, `submitSessionDisclaimers`, `createUkycSession`, `setAuthorizations`, `createJourney`) now issues its request directly instead of via `fetchQuery`. Previously these were modelled as queries, so two overlapping calls sharing a `queryKey` were deduplicated into a single request — a second `createVendorCustomer` while the first was in flight never reached the API — and their responses were retained in the cache and published on the messenger as `cacheUpdated` payloads, which for these endpoints include session tokens and applicant access tokens. Writes are also no longer retried by the service policy, so a failed non-idempotent request cannot create duplicate records server-side. ([#10007](https://github.com/MetaMask/core/pull/10007))
51
- - Stop incorrectly prefixing the session client public key onto wrapped `encryptionDataKey` and `ukycCapabilityToken` values from `wrapEncryptionKey`. `data` is now ciphertext+tag only; the server already has the client public key from session creation. ([#10036](https://github.com/MetaMask/core/pull/10036))
52
46
  - Clear leftover MoonPay `sessionToken`, `accessToken`, and Check/Auth frame credentials when `initialize` or `createVendorCustomer` switches to another vendor, so `buildCheckFrameUrl` cannot return a MoonPay URL for a consents-path session. ([#9908](https://github.com/MetaMask/core/pull/9908))
53
47
  - Rewind the consents path when SumSub fails before completion (thrown step or SDK close without `Completed`), instead of refreshing user status and forcing `phase` to `done`. A terminal UKYC rejection after the SDK completed still finishes as `done` so the decision can be reflected in user status. ([#9908](https://github.com/MetaMask/core/pull/9908))
54
48
  - Make `createVendorCustomer` a no-op during in-progress phases (matching `initialize`), so a vendor switch cannot leave Check/Auth frames attached to the wrong vendor. ([#9908](https://github.com/MetaMask/core/pull/9908))
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _KycController_instances, _KycController_sumsubLauncher, _KycController_moonpayFrameKeypair, _KycController_authClientToken, _KycController_generation, _KycController_sessionStatusPollIntervalMs, _KycController_pollTimer, _KycController_pollToken, _KycController_userStatusPollIntervalMs, _KycController_userStatusPollTimer, _KycController_userStatusPolling, _KycController_userStatusPollToken, _KycController_localUserSecretStore, _KycController_startConsentsSession, _KycController_recordSessionDisclaimers, _KycController_createSession, _KycController_clearAcceptedTerms, _KycController_clearMoonPaySession, _KycController_dropTermsUnlessForVendor, _KycController_hasTermsForVendor, _KycController_handleCheckOutcome, _KycController_handleAuthOutcome, _KycController_continueAfterAuthentication, _KycController_requireTermsReacceptance, _KycController_buildUkycSessionVendorFields, _KycController_createUkycSession, _KycController_fetchAndApplyUserStatus, _KycController_applyUserStatus, _KycController_ensureUserStatusPolling, _KycController_stopUserStatusPolling, _KycController_startSessionStatusPolling, _KycController_pollSessionStatusOnce, _KycController_stopPolling, _KycController_cancelPendingSession, _KycController_updateIfCurrent, _KycController_applyUpdate, _KycController_assertAttestedServerPublicKey, _KycController_fail;
13
+ var _KycController_instances, _KycController_sumsubLauncher, _KycController_keypair, _KycController_authClientToken, _KycController_generation, _KycController_sessionStatusPollIntervalMs, _KycController_pollTimer, _KycController_pollToken, _KycController_userStatusPollIntervalMs, _KycController_userStatusPollTimer, _KycController_userStatusPolling, _KycController_userStatusPollToken, _KycController_localUserSecretStore, _KycController_startConsentsSession, _KycController_recordSessionDisclaimers, _KycController_createSession, _KycController_clearAcceptedTerms, _KycController_clearMoonPaySession, _KycController_dropTermsUnlessForVendor, _KycController_hasTermsForVendor, _KycController_handleCheckOutcome, _KycController_handleAuthOutcome, _KycController_continueAfterAuthentication, _KycController_requireTermsReacceptance, _KycController_buildUkycSessionVendorFields, _KycController_createUkycSession, _KycController_fetchAndApplyUserStatus, _KycController_applyUserStatus, _KycController_ensureUserStatusPolling, _KycController_stopUserStatusPolling, _KycController_startSessionStatusPolling, _KycController_pollSessionStatusOnce, _KycController_stopPolling, _KycController_cancelPendingSession, _KycController_updateIfCurrent, _KycController_applyUpdate, _KycController_assertAttestedServerPublicKey, _KycController_fail;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.KycController = exports.getDefaultKycControllerState = exports.controllerName = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
@@ -18,7 +18,6 @@ const utils_1 = require("@metamask/utils");
18
18
  const ed25519_1 = require("@noble/curves/ed25519");
19
19
  const crypto_js_1 = require("./crypto.cjs");
20
20
  const encoding_js_1 = require("./encoding.cjs");
21
- const logger_js_1 = require("./logger.cjs");
22
21
  const deriveClientMaterial_js_1 = require("./ukyc/deriveClientMaterial.cjs");
23
22
  const jwtChain_js_1 = require("./ukyc/jwtChain.cjs");
24
23
  const localUserSecret_js_1 = require("./ukyc/localUserSecret.cjs");
@@ -414,8 +413,8 @@ class KycController extends base_controller_1.BaseController {
414
413
  });
415
414
  _KycController_instances.add(this);
416
415
  _KycController_sumsubLauncher.set(this, void 0);
417
- /** MoonPay Check/Auth frame X25519 keypair (never persisted). */
418
- _KycController_moonpayFrameKeypair.set(this, null);
416
+ /** Ephemeral X25519 keypair for the frame key exchange (never persisted). */
417
+ _KycController_keypair.set(this, void 0);
419
418
  /** Auth-frame client token, kept out of state. */
420
419
  _KycController_authClientToken.set(this, null);
421
420
  /**
@@ -454,6 +453,7 @@ class KycController extends base_controller_1.BaseController {
454
453
  __classPrivateFieldSet(this, _KycController_sumsubLauncher, sumsubLauncher, "f");
455
454
  __classPrivateFieldSet(this, _KycController_sessionStatusPollIntervalMs, sessionStatusPollIntervalMs, "f");
456
455
  __classPrivateFieldSet(this, _KycController_userStatusPollIntervalMs, userStatusPollIntervalMs, "f");
456
+ __classPrivateFieldSet(this, _KycController_keypair, (0, crypto_js_1.generateKeyPair)(), "f");
457
457
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
458
458
  }
459
459
  /**
@@ -476,19 +476,10 @@ class KycController extends base_controller_1.BaseController {
476
476
  // forces `phase` back through `session`/`check`, breaking an in-flight
477
477
  // Check/Auth frame flow. Leave the active flow untouched and let the
478
478
  // consumer drive it (or call `reset` first to start over).
479
- const vendor = params?.vendor ?? 'moonpay';
480
479
  if (IN_PROGRESS_PHASES.includes(this.state.phase)) {
481
- if (vendor === 'moonpay' && !__classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f")) {
482
- __classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, (0, crypto_js_1.generateKeyPair)(), "f");
483
- }
484
480
  return;
485
481
  }
486
- if (vendor === 'moonpay') {
487
- __classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, (0, crypto_js_1.generateKeyPair)(), "f");
488
- }
489
- else {
490
- __classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, null, "f");
491
- }
482
+ const vendor = params?.vendor ?? 'moonpay';
492
483
  // `initialize` starts a fresh flow, so `activeProduct` is always reset to
493
484
  // this call's product (or `null`). Otherwise a prior run's product could
494
485
  // linger and cause `#continueAfterAuthentication` to auto-run the check /
@@ -611,7 +602,6 @@ class KycController extends base_controller_1.BaseController {
611
602
  state.activeVendor = params.vendor;
612
603
  if (params.vendor !== 'moonpay') {
613
604
  __classPrivateFieldSet(this, _KycController_authClientToken, null, "f");
614
- __classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, null, "f");
615
605
  __classPrivateFieldGet(this, _KycController_instances, "m", _KycController_clearMoonPaySession).call(this, state);
616
606
  }
617
607
  });
@@ -653,7 +643,7 @@ class KycController extends base_controller_1.BaseController {
653
643
  state.geoCountry = country;
654
644
  });
655
645
  }
656
- const disclaimers = await this.messenger.call('KycService:fetchVendorDisclaimers', {
646
+ const disclaimers = await this.messenger.call('KycService:fetchDisclaimers', {
657
647
  vendor: this.state.activeVendor,
658
648
  country,
659
649
  });
@@ -784,9 +774,9 @@ class KycController extends base_controller_1.BaseController {
784
774
  }
785
775
  let accessToken;
786
776
  let clientToken;
787
- if (credsEnvelope && __classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f")) {
777
+ if (credsEnvelope) {
788
778
  try {
789
- const { credentials } = (0, crypto_js_1.decryptCredentials)(credsEnvelope, __classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f").privateKey);
779
+ const { credentials } = (0, crypto_js_1.decryptCredentials)(credsEnvelope, __classPrivateFieldGet(this, _KycController_keypair, "f").privateKey);
790
780
  accessToken = credentials.accessToken;
791
781
  clientToken = credentials.clientToken;
792
782
  }
@@ -809,14 +799,12 @@ class KycController extends base_controller_1.BaseController {
809
799
  * @returns The Check-frame URL or `null`.
810
800
  */
811
801
  buildCheckFrameUrl() {
812
- if (this.state.activeVendor !== 'moonpay' ||
813
- !this.state.sessionToken ||
814
- !__classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f")) {
802
+ if (this.state.activeVendor !== 'moonpay' || !this.state.sessionToken) {
815
803
  return null;
816
804
  }
817
805
  const url = new URL(`${FRAMES_BASE_URL}/check-connection`);
818
806
  url.searchParams.set('sessionToken', this.state.sessionToken);
819
- url.searchParams.set('publicKey', __classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f").publicKeyHex);
807
+ url.searchParams.set('publicKey', __classPrivateFieldGet(this, _KycController_keypair, "f").publicKeyHex);
820
808
  url.searchParams.set('channelId', CHANNEL_CHECK);
821
809
  url.searchParams.set('skipKyc', 'true');
822
810
  return url.toString();
@@ -827,14 +815,12 @@ class KycController extends base_controller_1.BaseController {
827
815
  * @returns The Auth-frame URL or `null`.
828
816
  */
829
817
  buildAuthFrameUrl() {
830
- if (this.state.activeVendor !== 'moonpay' ||
831
- !__classPrivateFieldGet(this, _KycController_authClientToken, "f") ||
832
- !__classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f")) {
818
+ if (this.state.activeVendor !== 'moonpay' || !__classPrivateFieldGet(this, _KycController_authClientToken, "f")) {
833
819
  return null;
834
820
  }
835
821
  const url = new URL(`${FRAMES_BASE_URL}/auth`);
836
822
  url.searchParams.set('clientToken', __classPrivateFieldGet(this, _KycController_authClientToken, "f"));
837
- url.searchParams.set('publicKey', __classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f").publicKeyHex);
823
+ url.searchParams.set('publicKey', __classPrivateFieldGet(this, _KycController_keypair, "f").publicKeyHex);
838
824
  url.searchParams.set('channelId', CHANNEL_AUTH);
839
825
  return url.toString();
840
826
  }
@@ -1194,7 +1180,7 @@ class KycController extends base_controller_1.BaseController {
1194
1180
  }
1195
1181
  }
1196
1182
  exports.KycController = KycController;
1197
- _KycController_sumsubLauncher = new WeakMap(), _KycController_moonpayFrameKeypair = new WeakMap(), _KycController_authClientToken = new WeakMap(), _KycController_generation = new WeakMap(), _KycController_sessionStatusPollIntervalMs = new WeakMap(), _KycController_pollTimer = new WeakMap(), _KycController_pollToken = new WeakMap(), _KycController_userStatusPollIntervalMs = new WeakMap(), _KycController_userStatusPollTimer = new WeakMap(), _KycController_userStatusPolling = new WeakMap(), _KycController_userStatusPollToken = new WeakMap(), _KycController_instances = new WeakSet(), _KycController_localUserSecretStore = function _KycController_localUserSecretStore() {
1183
+ _KycController_sumsubLauncher = new WeakMap(), _KycController_keypair = new WeakMap(), _KycController_authClientToken = new WeakMap(), _KycController_generation = new WeakMap(), _KycController_sessionStatusPollIntervalMs = new WeakMap(), _KycController_pollTimer = new WeakMap(), _KycController_pollToken = new WeakMap(), _KycController_userStatusPollIntervalMs = new WeakMap(), _KycController_userStatusPollTimer = new WeakMap(), _KycController_userStatusPolling = new WeakMap(), _KycController_userStatusPollToken = new WeakMap(), _KycController_instances = new WeakSet(), _KycController_localUserSecretStore = function _KycController_localUserSecretStore() {
1198
1184
  return {
1199
1185
  get: async (path, entropySourceId) => this.messenger.call('UserStorageController:performGetStorage', path, entropySourceId),
1200
1186
  set: async (path, value, entropySourceId) => this.messenger.call('UserStorageController:performSetStorage', path, value, entropySourceId),
@@ -1256,7 +1242,7 @@ async function _KycController_startConsentsSession(consents) {
1256
1242
  await this.refreshKycStatus();
1257
1243
  }
1258
1244
  catch (statusError) {
1259
- (0, logger_js_1.controllerLog)('KYC status refresh failed:', statusError);
1245
+ console.error('KYC status refresh failed:', statusError);
1260
1246
  }
1261
1247
  __classPrivateFieldGet(this, _KycController_instances, "m", _KycController_updateIfCurrent).call(this, generation, (state) => {
1262
1248
  state.phase = 'done';
@@ -1292,7 +1278,7 @@ async function _KycController_startConsentsSession(consents) {
1292
1278
  await this.refreshKycStatus();
1293
1279
  }
1294
1280
  catch (statusError) {
1295
- (0, logger_js_1.controllerLog)('KYC status refresh failed:', statusError);
1281
+ console.error('KYC status refresh failed:', statusError);
1296
1282
  }
1297
1283
  __classPrivateFieldGet(this, _KycController_instances, "m", _KycController_updateIfCurrent).call(this, generation, (state) => {
1298
1284
  if (state.phase !== 'error' && state.phase !== 'done') {
@@ -1320,7 +1306,7 @@ async function _KycController_startConsentsSession(consents) {
1320
1306
  });
1321
1307
  return;
1322
1308
  }
1323
- (0, logger_js_1.controllerLog)('Consents session failed:', error);
1309
+ console.error('Consents session failed:', error);
1324
1310
  if (__classPrivateFieldGet(this, _KycController_generation, "f") !== generation) {
1325
1311
  return;
1326
1312
  }
@@ -1451,7 +1437,7 @@ async function _KycController_createSession() {
1451
1437
  });
1452
1438
  }
1453
1439
  catch (error) {
1454
- (0, logger_js_1.controllerLog)('Session creation failed:', error);
1440
+ console.error('Session creation failed:', error);
1455
1441
  // A reset() superseded this flow while the request was in flight; leave
1456
1442
  // the idle controller alone rather than forcing it back to `terms`.
1457
1443
  if (__classPrivateFieldGet(this, _KycController_generation, "f") !== generation) {